一 布景
在现在微服务大行其道的布景下,Gitlab CI集成kubernetes现已是不可或缺的基本操作,咱们前几节系统的实战了前后端项目以及物理/K8s混合环境布置,这节课咱们来学习Gitlab CI怎么将运用发布进笔记本电脑什么牌子好K8s,咱们都知道在之前的将gitlab-runner布置在服务器上面是存在必定的风险,假如运转软件商店pipeline的服务器宕机,发布使命就没办法持续了,更可怕的时分假如common-runner发送故障,多个发布使命就都有问题,在微服务架构中,不可变的基础设施,容器笔记的自包含环境变量英语使得咱们发布变得更加简略快捷,不用在考虑担心runner的环境怎么依据不同的项目区分,且动态的Job触发,咱们会随时拉起一个变量名的命名规则Pod来运转咱们的Job,运转完结后又进行毁掉,这样不仅能完成动态运转节约资源,并且可以不用考虑多项目多使命并发构建的问题,这节课就让咱们来变量英语纵情享用K8s+Gitlab CI为咱们带来畅快淋漓的发布体验。
二 架构解析
本文以构建一个Java软件项目并将其布置到阿里云容器服务Kubernetes集群中为例,阐明怎么运用GitLab CI在阿里云Kubernetes服务上运转GitLab Runn笔记er、装备Kubernetes类型appetite的execuappstoretor,并履行Pipeline。
2.1 Gitlab CI流程图
2.2 流程详解
如上图为一个简略的Gitlab CI布置进K8s流程图,同之前咱们讲到的CI集成共同,只需求项目中存在.gitlab-ci.yml软件工程专业文笔记本插电用好还是不插电件即可,与之前软件商店安装的差异为在集成kubernetes的时分,咱们讲软件开发咱们的githttps和http的区别lab-runner运转在咱们K8s内,其为一个PO软件测试D方法运转,其控制着后续的pipeline中各stage的履行,咱们可以看到,当一个pipeli变量之间的关系ne有多个stage,每个stage都是有一个独自appearance的Po变量与函数d去履行,这个Pod运用的镜像在咱们CI的.gitlab-ci.yml 的每个stage的image中界说,如所示为一个布置Java项目的流程
- 开发者或项目维护者merge request到特定分appearance支,改分支存在CI文件,开端进行CI
- CI使命由现已注册在gitlab-server运转在K8s集群内的giitlab-runner进行下发
- 第一个为package,对java项笔记本电脑排名前十目运用maven镜像进行打包,生成war包制品到缓存目录中;
- 运用docker镜像对依据项目中的Dockerfile对缓存https域名中的制品进行镜像构建,构建完结后登录镜像笔记本电脑排名前十库房进行镜像推送;
- 在此咱们运用将布置文件保管在项目内,也体现了gitop软件测试s的思想,将appear之前构建推送成功的镜像地址信息在deployment.yaml文件进行修正,之后apply进k8s中,java项目构建的镜像就运转在K8s集群内了,完结整个的发布。
在流程中有一些留意变量值事项:
- 咱们可以在stagappetitee中增加自己事务需软件工程专业求的内容,例如单元测验,代码扫描等。
- 在布置文件中,咱们可以将整个项目制作成helm的chart,替换其间的镜像,运用helm来进行变量名整个运用的布appearance置。
- 运用在布置中软件技术专业单个stage运用的是不同的image,在各个stage中传递现已生成的制品例如war/jar包,需求运用到外部存储来缓存制品。
三 长处
经过上面的Gitlab CI流程咱们可以看到将gitlab runner运转在K8s集群中,每个Job启动独自的POD运转操appreciate作,此种方法完全运用起了K8s的一些长处
- 高可用:当某个节点出现故障时,Kubehttps安全问题rnetes 会主动创立一个新的 GitLab-Runner 容器,并挂载相同的 Runner 装备,使服务达到高可用。
- 弹性伸缩软件:触发式使命,合理运用资源,每次运转脚本使命时,Gitlab-Runner 会主动创立一个笔记或多个新的临时 Runner来运转J软件技术ob。
- 资源最大化运用:动态创立Pod运转Job,资源主动开释,并且 Kubernehttps协议tes 会依据每个节点资https认证源的软件库运用情况,动态分配临时 Run变量值ner 到空闲的节点上创立,降低出现因某节点资源运用率高,还排队等待在该节点的情况。
- 扩展性好:当 Kubernetes 集群的资源严重不https和http的区别足而导致临时 Runner 排队等待时,可以很容易的增加一个 Kubernetes Node 到集群中,然后完成横向扩展。
假如您的事务现在运转环境https域名为K8shttps认证,那么Gitlab CI完全符合您的事务场景,您只需求自界说gitlab-ci.变量名yml中的各个自己需求的stage即可,配合gitops将装备也保管在项目内,跟随项目一块维护办理,完成端到端的CI作业流,使得运维作业也可经过git追溯,提高作业效能,灵敏开发上线布置。
四 实战
咱们在上面了解来Gitlab CI与Kubernetes的集成及其长处,下面就让咱们经过实战来更具体的了解其appearance流程。
4.笔记本电脑开不了机1 环境准备
-
需求有Gitlab 服务器,可以是布置在物理服务器上,当然也可以布置在K8s集群内部。
-
我需求准备好K8s集群,可以为公有云的容器编列引擎,例如阿里的ACK,腾讯的TKE,华为的https和http的区别CCE等都适用这些方法。
-
因为gitlab-runn软件技术专业er装置较为杂乱,咱们在示例中运用helm来进行装置,helm版别为v2.14.3,假如有才能可以自己编写资源清单布置。
4.1.1 记载注册信息
登录G笔记本电脑排名前十itlab 服务器软件工程专业记变量名载gitlab 的 url 和注册令牌,在咱们布置进K8s的gitapprovelab-runnner的装备中需求填写该信息,运appointment转在K8s中的Pod就运用此此信息在gitlab服务器进行注册。
4.1.2 获取gitlab-runner
因为独自布置g笔记本插电用好还是不插电itlab-runner进K8s中,自己去写资源清单文件难度较大,并且容易犯错,咱们在此运用官方的chart镜approve像经过helm来进行布置,仅修正其间咱们联系的字段即可,首要在登录K8s集群进行gitlab-runner的helm repo的增加,之后将chart下载到本地,解压文件并修正其间的valappearanceues.yml文件。
- 增加repo获取charts
[root@master common-service]# helm repo add gitlab https://charts.gitlab.io
"gitlab" has been added to your repositories
[root@master common-service]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "apphub" chart repository
...Successfully got an update from the "gitlab" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
[root@master common-service]# helm search gitlab-runner
NAME CHART VERSION APP VERSION DESCRIPTION
gitlab/gitlab-runner 0.14.0 12.8.0 GitLab Runner
我看现已看到了 gitlab-run笔记本显卡天梯图ner的chart,其是 helm 中描述相关的一组 Kubernetes 资源的文件集合,里面包含了一个 value.yaml 装备文件和一系列模板(deployment.yaml、svc.yaml 等)。当然假如软件开发咱们才可软件技术专业以,可以自己去编写这些资源清单文件。笔记本电脑排名前十
在此有想去的同伴可以检查之前K8s学习笔记,希望能对读者学习K8s有帮助:awesome-kubernetes-notes
- 创立人物并绑定权限
gitlab-runner在运转的时分需求拜访咱们K8s的apappetitei,咱appstore们在此为期创立ServiceAccount并为其进行RBAC授权,首要创立一个gitlab-runners的称号空间,并创立对用的Role,将ServiceAccount于Role进行绑定。
[root@master gitlab-runner]# cat > rbac-runner-config.yaml <<EOF
apiVersion: v1
kind: ServiceAccount # 在gitlab-runners称号空间下创立名为gitlab的serviceaccount
metadata:
name: gitlab
namespace: gitlab-runners
---
kind: Role # 创立gitlab人物,
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: gitlab-runners
name: gitlab
rules:
- apiGroups: [""] #"" indicates the core API group
resources: ["*"]
verbs: ["*"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["*"]
- apiGroups: ["extensions"]
resources: ["deployments"]
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab # 将sa与人物进行绑定
namespace: gitlab-runners
subjects:
- kind: ServiceAccount
name: gitlab # Name is case sensitive
apiGroup: ""
roleRef:
kind: Role #this must be Role or ClusterRole
name: gitlab # this must match the name of the Role or ClusterRole you wish to bind to
apiGroup: rbac.authorization.k8s.io
EOF
# 创立资源清单
[root@master gitlab-runner]# kubectl create -f rbac-runner-config.yaml
serviceaccount/gitlab created
role.rbac.authorization.k8s.io/gitlab created
rolebinding.rbac.authorization.k8s.io/gitlab created
- 获取charts文件,并进行装备
[root@master gitlab-runner]# helm fetch gitlab/gitlab-runner
[root@master gitlab-runner]# tar xf gitlab-runner-0.14.0.tgz
[root@master gitlab-runner]# vim gitlab-runner/values.yaml
helm为咱们供给了一个装备文件可以在装置 runner 的时分笔记本为其注册一个默认的 runn笔记本插电用好还是不插电er。咱们可以去 g软件工程师itlab-runner 的项目源码 中获取到 values.yahttps域名ml
这个装备文软件工程师件。
4.1.3 绑定docker.sock
因为在gitlab-runner中需求履行docker build 指令,需求docapplicationker服务端,咱们可以来绑定K8s node节点的docker.sock来完成,编辑chart下面的template目录中的confi变量gmap.yaml,在大https认证约42行修正
# add volume and bind docker.sock
cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
[[runners.kubernetes.volumes.pvc]]
name = "{{.Values.maven.cache.pvcName}}"
mount_path = "{{.Values.maven.cache.mountPath}}"
[[runners.kubernetes.volumes.host_path]]
name = "docker"
mount_path = "/var/run/docker.sock"
EOF
4.1.4 装备变量与函数缓软件工程存
在咱们的流程详解中可以看到生成的war/jar包制品需求存储在一个当变量与函数地,这个当地就需求咱们挂载一块外apple置的存储设备,在k8s中咱们需求为其供给PVC,假如你有NFS存软件商店储或许分布式ceph制成的存储类都可以。
再此,咱软件商店安装们机器中运用的为storageclass,演示运用存储类来声明PVC,在POD中进行挂载
- 创立pvc声明文件gitlab-runner-pvcappear.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlab-runner-pvc # 创立称号为gitlab-runner-pvc的pvc
namespace: gitlab-runners
spec:
accessModes:
- ReadWriteMany # 拜访模式
storageClassName: rbd # 存储类称号
resources:
requests:
storage: 2Gi # 存储大小
- 创立pvc
[root@master gitlab-runner]# kubectl apply -f gitlab-runner-pvc.yaml
persistentvolumeclaim/gitlab-runner-pvc created
[root@master gitlab-runner]# kubectl get pvc -n gitlab-runners
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
gitlab-runner-pvc Bound pvc-a620cd43-f396-4626-8599-c973c19cddd3 2Gi RWO rbd 4s
检查现已在gitlab-appearrunners称号https认证空间下现已创立好了PVC。
- 装备values
在上面咱们装备绑定宿主机docker进程的时分也现已将pvc装备进去了,咱们还需求在charts的values.yaml下面笔记本电脑一直充电好吗新增加装备 volum软件测试e 的信息,并在 values.yaml 装备相应的变量
# 增加在values.yaml 的最后即可
maven:
cache:
pvcName: gitlab-runner-pvc
mountPath: /home/cache/maven
4.1.5 装置gitlab-runner
装备文件比较变量泵长,可以依据需求自己去装备,下面就笔记贴下本文中需求装备的当地。
[root@master gitlab-runner]# egrep "^$|^#|^[[:space:]]+#" -v values.yaml
imagePullPolicy: IfNotPresent
gitlabUrl: http://43.xx.xx.xx/ # gitlab url
runnerRegistrationToken: "nnxxxxxxxxxxxxxxxS" # gitlab token
unregisterRunners: true
terminationGracePeriodSeconds: 3600
concurrent: 10
checkInterval: 30
rbac:
create: true
clusterWideAccess: false
serviceAccountName: gitlab # rbac的sa
metrics:
enabled: true
runners:
image: ubuntu:16.04 # 运用的镜像
tags: "gitlab-runner"
privileged: true
imagePullPolicy: "if-not-present" # 假如履行具体job的runner不存在则拉取
pollTimeout: 180
outputLimit: 4096
cache: {}
builds: {}
services: {}
helpers: {}
serviceAccountName: gitlab # serviceaccount
nodeSelector: {}
securityContext:
fsGroup: 65533
runAsUser: 100
resources: {}
affinity: {}
nodeSelector: {}
tolerations: []
hostAliases: []
podAnnotations: {}
podLabels: {}
maven: # 装备maven缓存信息
cache:
pvcName: gitlab-runner-pvc # pvc信息
mountPath: /home/cache/maven # 挂载点
- 装置gi软件库tlab-runner
在装备完结values.yaml相关的字段后,咱们运用helm来其 进行装置,后期假如咱们有改笔记本电脑性价比排行2020变,直接修正va笔记本插电用好还是不插电lue.yml ,然后进行更新即可helm upgrade gitlab-rujner g软件测试itlab-runner/
[root@master gitlab-runner]# helm install --name gitlab-runner -f gitlab-runner/values.yaml --namespace gitlab-runners gitlab-runner/
NAME: gitlab-runner
LAST DEPLOYED: Sun Feb 23 22:45:37 2020
NAMESPACE: gitlab-runners
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME DATA AGE
gitlab-runner-gitlab-runner 5 1s
==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
gitlab-runner-gitlab-runner 0/1 1 0 1s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
gitlab-runner-gitlab-runner-6745dd4cd6-r9z28 0/1 Pending 0 0s
==> v1/Secret
NAME TYPE DATA AGE
gitlab-runner-gitlab-runner Opaque 2 1s
NOTES:
Your GitLab Runner should now be registered against the GitLab instance reachable at: "http://43.254.54.93:88/"
检查现已运转ok的相关pod资源,gitlab-runner的装备是经过configmap挂载进去,假如咱们有新的装备可以修正,并删去之前的gitlab-runner的pod,其deployment控制器会进行创立Pod挂载新的装备文件变量是什么意思。
- 检查pod运转状态
[root@master ~]# kubectl get po -n gitlab-runners
NAME READY STATUS RESTARTS AGE
gitlab-runner-gitlab-runner-6745dd4cd6-r9z28 1/1 Running 0 21h
- 检查configmap及pod中挂载的装备
这个时分可软件技术专业以进入 pod 看一下 runner 的装备文件(/hoappreciateme/gitlab-runner/.gitlab-runner/config.toml
)了。这个文件就是依据之前装https和http的区别备的 values.yaml 主动生成的。
[root@master ~]# kubectl get cm -n gitlab-runners gitlab-runner-gitlab-runner
NAME DATA AGE
gitlab-runner-gitlab-runner 5 21h
- 登录gitlab控制台检查现在gitlab-runner现已注册上了。
- 当pod运转起来后,检查完好装备
[root@master gitlab-runner]# kubectl exec -it -n gitlab-runners gitlab-runner-gitlab-runner-6c7dfd859c-62dv5 -- cat /home/gitlab-runner/.gitlab-runner/config.toml
listen_address = "[::]:9252"
concurrent = 10
check_interval = 30
log_level = "info"
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-runner-gitlab-runner-6c7dfd859c-62dv5"
output_limit = 4096
request_concurrency = 1
url = "http://43.254.54.93:88/" # 注册的url
token = "eRskGn8Q-g4FZnZib63q" # gitlab注册的token
executor = "kubernetes" # executor为kubernetes
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.kubernetes]
host = ""
bearer_token_overwrite_allowed = false
image = "ubuntu:16.04" # 运用的镜像为ubuntu
namespace = "gitlab-runners" # 运用的namespace为gitlab-runners
namespace_overwrite_allowed = ""
privileged = true
poll_timeout = 180
service_account = "gitlab" # serviceaccont 为gitlab
service_account_overwrite_allowed = ""
pod_annotations_overwrite_allowed = ""
[runners.kubernetes.pod_security_context]
[runners.kubernetes.volumes]
[[runners.kubernetes.volumes.pvc]]
name = "gitlab-runner-pvc" # 挂载的pvc称号
mount_path = "/home/cache/maven" # 挂载在pod下的缓存目录
[[runners.kubernetes.volumes.host_path]]
name = "docker"
mount_path = "/var/run/docker.sock" # 绑定宿主机的docker.sock
至此咱们现已将gitlab-runner在K8s集群中运变量的定义转起来,接下来让咱们来集成C软件开发I。
4.2 集成CI
4.2.1变量名 界说文件
因为运用的 executor 不同,所以. gitlab-ci笔记本.yml 和之前服务器也有些不同,不如image,默认假如每个stage中没有写指定某个image则运用该i变量类型有哪些mage
image: docker:latest
variables:
DOCKER_DRIVER: overlay2
# k8s 挂载本地卷作为 maven 的缓存
MAVEN_OPTS: "-Dmaven.repo.local=/home/cache/maven"
stages:
- package # 源码打包阶段
- docker_build # 镜像构建和打包推送阶段
- deploy_k8s # 运用布置阶段
before_script:
- export APP_TAG="${CI_COMMIT_TAG:-${CI_COMMIT_SHA::8}}" # 界说制作好的镜像tag
maven-package:
#image: maven:3.5-jdk-8-alpine
image: registry.cn-beijing.aliyuncs.com/codepipeline/public-blueocean-codepipeline-slave-java:0.1-63b99a20 # maven镜像进行java源码的build
tags:
- gitlab-runner # 指定运用gitlab-runner来追寻
stage: package
script:
- mvn clean package -Dmaven.test.skip=true
artifacts: # 将生成的war包上传到pvc挂载目录中
paths:
- target/*.war
docker-build:
tags:
- gitlab-runner
stage: build
script:
- echo "Building Dockerfile-based application..."
- docker build -t ${REGISTRY}/${QHUB_NAMESPACE}/${APP_NAME}:${APP_TAG} . # 构建镜像
- docker login --username=${DOCKER_USERNAME} ${REGISTRY} -p ${DOCKER_PASSWORD} # 登录镜像仓
- docker push ${REGISTRY}/${QHUB_NAMESPACE}/${APP_NAME}:${APP_TAG} # push镜像
only:
- master
k8s-deploy:
image: bitnami/kubectl:latest # 运用kubectl镜像来进行最终的布置
tags:
- gitlab-runner
stage: deploy
script:
- echo "deploy to k8s cluster..."
- sed -i "s@$(grep -E "^[[:space:]]+image:" deployment.yaml | awk '{print $2}' |head -1)@${REGISTRY}/${QHUB_NAMESPACE}/${APP_NAME}:${APP_TAG}@g" deployment.yaml # 替换deployment中的镜像
- kubectl apply -f deployment.yaml # 运用资源清单文件
only:
- master
可以看到CI文件中咱们界笔记本电脑排名前十说了三个stage:
- 运用maven镜像进行打包,生成笔记war包制品到缓存目录中。
- 运软件商店安装用docker镜像对依据项目中的Dockerfile对缓存中的制品进行镜像构建,构建完结后登录镜像库房进行镜像推送。
- 运用kubectl镜像先对原有deployment文件进行镜像替换,之后进即变量与函数将资源清单更新至K8s集群中。
- 在为镜像打tag时,可以自行设置,也可以运用commit来进行与git版别对照。
4.2.2 留意事项
- 因为在镜像构建的stage中,需求运用docker指令来进appear行相关操变量名的命名规则作,需求绑定本地 Do软件cker 守护进程。
- maven 库房的缓存,在又需求出产制品并保存的构建中,需求外部存储来寄存制品。
- 在stage中引用的镜像最好能事前pull到各个node节软件点上,否则在第一次运转CI,假如网络有波动或带宽小,可能会因为镜像下载超时导致CI失败。
4.2.3 装备变量
因为笔记在CI文件中又一些敏感信息,例如镜像库房的登录信息以及后期可软件测试以更改的镜像笔记本电脑一直充电好吗称号等,运用环境注入的方法,使得CI文件脱敏并且更具灵活性和适用性。
Project –> Settings –>笔记 CI/CD –> Variables, 增加GitLab Runner可用的环境变量,本示例增加变量如下:
- APP_NAME:制作变量名的命名规则完结后镜像的称号
- DOCKER_USERNAME: 镜像https协议库房用户名
- DOCKER_PASSWORD 镜像库房密码
- QHUB_NAMEappstoreSPACE:镜像库房的称号空间,在该项目中咱们运用的腾讯的镜像库房,当然可以自建harbor或运用其他公有云供给的镜像库房或许doc变量之间的关系kerhub等。
- REGISTRY:镜像库房的地址
4.3 运转测验
在咱软件开发们装备好了CI文件好,让咱们来运转测验,软件技术专业提交代码,或许手动运转。
4.3.1 运转pipeline
在项目CI/CD->Pipelines右上角有RunPipeline
在图中咱们可以看到在其间是可以并行运转多个p变量类型有哪些ipeline,互不影响。
挑选对应的分支或许传入变量手动运转pipeline
4.3.2 检查运转POD
登录K8s集群,检查此时运转的POD
4.3.3 检查Job
- 打包镜像
- 镜像构建
- 布置进K8s
4.3.4 检查构建情况
- 检查pipeline
- 检查构建运用
至此咱们就完结了示例Gitlab CI。
五 留意事项
- 在实战中的资源清单文件只写来deploAPPyment,读者可以依据软件工程专业自己的项目来,可以将service/configmap/hpa等资源清单文件也放在项目中变量名保管,当然也可以制作成h变量值elm运用,每次发布运用helm来更新运用
- 在Gitlab CI中留意将敏感信息例如镜像库房的登录方法等进行脱敏,将有改变的字段设置为变量,为此进行传入是的CI更扩展性及灵活性。
- 在此节中部分内容需求读者https域名具有必定的K8s经验,例如其间的helm及相关的资源清单文件,假如前期了解后期事务微服务话后看本章节内容更为合适。
- 留意在写rbac与pv笔记本电脑一直充电好吗c的资源清单的称号空间为你想布置事务的称号空间,即例如你想把资源清单布置在common称号空间下,你就需求把pvc和rb软件工程师ac创立在common称号空间下,将gitlab-runner注册在commo笔记本电脑性价比排行2020n称号空间下。
六 运用场景
- 事务容器微服务化,或半微服务化
- 需求运维人员具有较强的K8s运维才HTTPS能
- 寻求极致持软件测试续集成持续交给体验gitops追崇者
- 有清晰的流程标准,上线布置标准及清晰可循的标准
七 反思
经过本次灵敏无敌之Git软件测试lab C软件技术专业I实战,再次笔者感谢大家可以了解Gitlab的此approve特性,假如您的公司在运笔记本用Gitlab并且有运用其他的CI工具, 困于多套系统维护的杂乱性,无变量妨测验下Gitlab CI简略集成,Gitops的端到端运维作业,在云原生年代,将工具或中间件下沉到基础软件技术设施中,用户只需求专心于自身事务的开发,灵敏高效、文明中协作、快速试错、快速反应、持续改善、不断迭代,以Git为来历打破软件技术研发与运维壁垒隔膜,完成产品更快、更频繁、更安稳的交给。
其他
- 我正在参与技术社区创作者签application约方案招募活appstore动,点击链接报名投稿。