经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理 - JN-SHao
来源:cnblogs  作者:JN-SHao  时间:2022/12/5 8:50:27  对本文有异议

1.基础环境:Centos7.9,kubernetes:v1.21.5

  1. node-1@112master):dockercontainerdharbornginx80),gitetcd
  2. node-2@109master/worker):dockercontainerdingress_nginx80),etcdglusterfs
  3. node-3@107worker):dockercontainerdharbor80),etcdglusterfs
  4. node-4@106worker):dockercontainerdharbor80),glusterfs
  5. node-6@121(单体/应用):dockercontainerdnginx80/前端),consulnacosyapi

2.公有代码仓库,gitee,配置网络钩子

3.私有镜像仓库,harbor双主复制,node-3/node-4,地址:myhub.com

参考:https://github.com/goharbor/harbor

4.持久化存储 ,gluster-kubernetes ,node-2/node-3/node-4,heketi使用Ingress四层代理

参考:https://github.com/gluster/gluster-kubernetes

? http://docs.kubernetes.org.cn/803.html#Glusterfs

5.jenkins,k8s Deployment方式部署,推荐本地部署

参考:https://www.jenkins.io/doc/book/installing/kubernetes/

(1)Local Persistent Volume 替换为 GlusterFs(基于Local Persistent Volume搭建的分布式文件系统),存储配置信息以及workspace

volume.yaml:

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: jenkins-glusterfs-storage-class
  5. provisioner: kubernetes.io/glusterfs
  6. parameters:
  7. # 这里heketi使用ingress四层代理
  8. # 192.168.0.109为ingress-nginx-controller监听地址
  9. resturl: "http://192.168.0.109:30001"
  10. restauthenabled: "true"
  11. restuser: "admin"
  12. restuserkey: "admin123"
  13. ---
  14. apiVersion: v1
  15. kind: PersistentVolumeClaim
  16. metadata:
  17. name: jenkins-pv-claim
  18. namespace: devops-tools
  19. spec:
  20. storageClassName: jenkins-glusterfs-storage-class
  21. accessModes:
  22. - ReadWriteOnce
  23. resources:
  24. requests:
  25. storage: 3Gi
  26. ---
  27. # agent workspace-volume
  28. apiVersion: v1
  29. kind: PersistentVolumeClaim
  30. metadata:
  31. name: jenkins-agent-pv-claim
  32. namespace: devops-tools
  33. spec:
  34. storageClassName: jenkins-glusterfs-storage-class
  35. accessModes:
  36. - ReadWriteOnce
  37. resources:
  38. requests:
  39. storage: 30Gi

(2)jenkins-server服务暴露方式NodePort替换为Ingress七层代理+四层代理

  1. $ kubectl patch cm tcp-services -n ingress-nginx --patch='{"data": {"32000": "devops-tools/jenkins-service:80"}}'

service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: jenkins-service
  5. namespace: devops-tools
  6. annotations:
  7. prometheus.io/scrape: 'true'
  8. prometheus.io/path: /
  9. prometheus.io/port: '8080'
  10. spec:
  11. selector:
  12. app: jenkins-server
  13. ports:
  14. - name: web
  15. port: 80
  16. targetPort: 8080
  17. - name: agent
  18. port: 50000
  19. targetPort: 50000
  20. ---
  21. apiVersion: networking.k8s.io/v1
  22. kind: Ingress
  23. metadata:
  24. name: jenkins-service
  25. namespace: devops-tools
  26. spec:
  27. rules:
  28. - host: myjenkins.com
  29. http:
  30. paths:
  31. - path: /
  32. pathType: Prefix
  33. backend:
  34. service:
  35. name: jenkins-service
  36. port:
  37. name: web

(3)sa的集群角色中增加对集群中deployment,ingress资源的所有操作权限

serviceAccount.yaml

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4. name: jenkins-admin
  5. rules:
  6. #"":core
  7. - apiGroups: [""]
  8. resources: ["*"]
  9. verbs: ["*"]
  10. - apiGroups: ["apps"]
  11. resources: ["deployments"]
  12. verbs: ["*"]
  13. - apiGroups: ["networking.k8s.io"]
  14. resources: ["ingresses"]
  15. verbs: ["*"]
  16. ---
  17. apiVersion: v1
  18. kind: ServiceAccount
  19. metadata:
  20. name: jenkins-admin
  21. namespace: devops-tools
  22. ---
  23. apiVersion: rbac.authorization.k8s.io/v1
  24. kind: ClusterRoleBinding
  25. metadata:
  26. name: jenkins-admin
  27. roleRef:
  28. apiGroup: rbac.authorization.k8s.io
  29. kind: ClusterRole
  30. name: jenkins-admin
  31. subjects:
  32. - kind: ServiceAccount
  33. name: jenkins-admin
  34. namespace: devops-tools

(4)安装插件:

? 参考: https://plugins.jenkins.io/kubernetes/

? https://plugins.jenkins.io/kubernetes-cli/

? https://gitee.com/help/articles/4193#article-header0

? (a)kubernetes:用于和k8s交互,配置创建agent pod

? (b)Kubernetes Cli:提供agent使用kubectl与k8s交互环境

? (c)Gitee:用于自动触发构建

? (d)其他:系统开始建议安装的插件都装一下

(5)工作原理:

? (a)pod中的容器挂载infra容器的Namespace,共享Mount Namespace,工作目录/home/jenkins/agent都挂载workspace-volume数据卷,git拉下来的项目文件都是可见的

? (b)agent主容器:jnlp默认自动生成,jenkins+kubernetes的cicd整个流程是定义sidecar容器,通过jenkins及其插件,手动一步步的实现sidecar容器对项目文件的具体操作

(6)编译环境准备-build项目时:

? golang与alpine镜像对应版本:https://hub.docker.com/_/golang

? (a)用的是go项目,需要go进程install项目,使用容器化方式,让k8s去管理

? (b)kubernetes 插件pod模板添加容器,编译环境镜像: golang:1.19.1-alpine,上传到harbor

? (c)容器启动进程:/bin/sh -c cat,防止容器进程关闭

? (d)其他语言项目,使用对应语言环境镜像编译即可

(7)agent pod系统用户权限处理-docker创建镜像时:

? (a)由于每个节点都装有docker,root用户登录,所以使用本地数据卷挂载方式,agent pod 的User Namespace相同才能执行即系统用户需要root执行权限才能使用当前节点docker

? (b)uid(用户id)和gid(用户组id),securityContext设置针对controller的uid和gid,agent无效,controller和agent默认是jenkins和1000

? (c)可以在kubernetes 插件pod模板中修改,使用root用户,uid=0,gid=0,或者Raw YAML for the Pod覆盖主容器

? (d)也可以在构建shell脚本中将jenkins用户添加到root用户组中

? (e)制作镜像的基础镜像:alpine:3.16,go语言在云原生优势体现,不需要虚拟机,直接编译成对应系统的二进制文件运行,镜像可以瘦身很小

? (f)写shell脚本定时查询节点创建的项目镜像并清理一定时间段的镜像,以DaemonSet部署方式亲和到每个worker节点,master节点存在NoSchedule污点,或者镜像上传后立即删除

? (g)镜像上传harbor,第一次登陆需要docker login用户注册认证,本地保存在~/.docker/config.json,每个节点不一定都存在,使用cm方式挂载到该路径

  1. $ kubectl create cm docker-hub-credential --from-file=config=config.json -n devops-tools

? (h)也可以使用docker in docker 好处是生命周期和agent pod一致,缺点是问题排查难度变大

注:使用docker的多阶段编译制作镜像,可以将(4)的go build过程放在(5)build image中构建,一个build阶段完成

(8)agent pod与k8s api server交互-项目部署到k8s集群时:

? (a)使用kubectl,当前只存在master节点中,需要在worker节点使用,为了不污染worker节点,使用容器化方式,让k8s去管理

? (b)k8s集群外kubectl与k8s api server交互,客户端证书TLS双向认证,需要useraccount配置信息,客户端保存在~/.kube/config,可以将凭证以cm/pvc方式挂载进去,api server地址一般设置为集群地址或本地代理地址进行解耦

? (c)k8s集群内pod可以通过ServiceAccount与k8s api server进行交互,ServiceAccount会创建对应secret自动挂载到pod文件系统中:/var/run/secrets/kubernetes.io/serviceaccount ,包含有token信息,为通信凭证

? (d)配置的ServiceAccount具有对集群中core所有资源,deployment,ingress的所有操作权限,获取jenkins-admin的token:

  1. $ kubectl -ndevops-tools describe secret $(kubectl -ndevops-tools get secret | grep jenkins-admin | awk '{print $1}')

? (e)可以使用Kubernetes Cli插件进行配置token与k8s api server集群内部地址,自动配置并使用上下文,实现集群内kubectl 与k8s api server交互

? (f)kubernetes 插件pod模板添加容器,镜像: registry.cn-shanghai.aliyuncs.com/mydlq/kubectl:1.15.3,上传到harbor

? (g)容器启动进程:/bin/sh -c cat,防止容器进程关闭

(9)pipline测试脚本:

  1. def label = "golang1.19.1"
  2. def credential = "global-kubernetes-credential"
  3. timeout(time: 900, unit: 'SECONDS') {
  4. podTemplate(label: label,cloud: 'kubernetes' ){
  5. node (label) {
  6. stage('Git阶段'){
  7. sh '''echo "开始拉取代码"
  8. echo "拉取代码完成"'''
  9. }
  10. stage('Build阶段'){
  11. container('golang') {
  12. sh '''echo "构建开始"
  13. id
  14. go version
  15. echo "构建完成"'''
  16. }
  17. }
  18. stage('Docker阶段'){
  19. sh '''echo "创建镜像开始"
  20. id
  21. docker images
  22. echo "创建镜像完成"'''
  23. }
  24. stage('Kubernetes 阶段'){
  25. container('kubectl') {
  26. withKubeConfig([credentialsId: credential,serverUrl: "https://kubernetes.default.svc.cluster.local"]) {
  27. sh '''echo "k8s部署开始"
  28. id
  29. kubectl get nodes
  30. kubectl get pods
  31. echo "k8s部署完成"'''
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }

注:jenkins全局变量会自动注入到容器环境变量中,每个容器都可以获取使用

原文链接:https://www.cnblogs.com/jn-shao/p/16949424.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号