linux cpu占用率如何看
265
2022-10-27
容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
什么是CI/CD
持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都需要通过自动化的编译、发布、自动化回归测试来验证,从而尽快地发现集成错误。而这些自动化的操作则由CI软件进行执行。
持续部署(Continous Delivery,CD)在持续集成的基础上,将集成后的代码部署到真实运行环境中(本文指部署到kubernetes集群)。交付团队 ->版本控制 ->构建和单元测试 ->自动验收测试 -> 发布
什么是Drone
Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。
使用drone实现CD/CD
简单梳理流程:
1、开发人员向git(gitlab/github/gogs)提交代码,代码中必须包含Dockerfile和.drone.yml文件。2、将代码commit到远程仓库;发布应用时需要填写服务类型、服务名称、资源数量、实例个数等信息3、gogs触发drone自动构建4、Drone的CI流水线中包括了自定义脚本,根据准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项生成应用的kubernetes YAML配置文件5、Drone的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库6、更新DNS,插入一条DNS记录,IP地址是ingress节点的IP地址。7、Drone的CI流水线中自定义脚本调用kubernetes的API,部署应用;更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息接下来,开始实战
部署代码仓库gogs
本文使用gogs,当然你可以选择gitlab,github等代码仓库1、创建gogs.yaml
--- apiVersion: apps/v1 kind: StatefulSet metadata: name: gogs labels: app: gogs spec: serviceName: gogs replicas: 1 selector: matchLabels: app: gogs template: metadata: labels: app: gogs spec: terminationGracePeriodSeconds: 180 containers: - name: gogs image: gogs/gogs imagePullPolicy: Always ports: - containerPort: 3000 name: port - containerPort: 22 name: ssh-port volumeMounts: - name: volume mountPath: /data volumes: - name: volume emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: gogs labels: app: gogs spec: type: NodePort ports: - port: 3000 targetPort: 3000 selector: app: gogs
2、执行部署并查看结果
[root@k8s-node001 gogs]# kubectl apply -f gogs.yaml
statefulset.apps/gogs created
service/gogs created
[root@k8s-node001 gogs]# kubectl get po,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/gogs-0 1/1 Running 0 2m2s 100.68.150.197 k8s-node001
部署CI工具Drone
1、编写drone.yaml文件
--- apiVersion: apps/v1 kind: StatefulSet metadata: name: drone labels: app: drone spec: serviceName: drone replicas: 1 selector: matchLabels: app: drone template: metadata: labels: app: drone spec: terminationGracePeriodSeconds: 180 containers: - name: drone image: drone/drone:1 imagePullPolicy: Always env: - name: DRONE_AGENTS_ENABLED value: "true" - name: DRONE_GOGS_SERVER value: # 注意这里填的是gogs的地址 - name: DRONE_RPC_SECRET value: qawsedrftg - name: DRONE_SERVER_HOST value: drone.company.com - name: DRONE_SERVER_PROTO value: http ports: - containerPort: 80 name: port - containerPort: 443 name: ssl-port volumeMounts: - name: volume mountPath: /data volumes: - name: volume emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: drone labels: app: drone spec: type: NodePort ports: - port: 80 targetPort: 80 selector: app: drone
2、执行部署并查看结果
[root@k8s-node001 drone]# kubectl apply -f drone.yaml
[root@k8s-node001 drone]# kubectl get po,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/drone-0 1/1 Running 0 4m40s 100.68.150.198 k8s-node001
部署Drone Runner
Runner的作用是询问Drone Server,然后执行pipeline,更多信息请查看官网1、编写drone-runner.yaml
--- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: drone rules: - apiGroups: - "" resources: - secrets verbs: - create - delete - apiGroups: - "" resources: - pods - pods/log verbs: - get - create - delete - list - watch - update --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: drone namespace: default subjects: - kind: ServiceAccount name: default namespace: default roleRef: kind: Role name: drone apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata: name: drone-runner labels: app.kubernetes.io/name: drone-runner spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: drone-runner template: metadata: labels: app.kubernetes.io/name: drone-runner spec: containers: - name: drone-runner image: drone/drone-runner-kube:latest ports: - containerPort: 3000 env: - name: DRONE_RPC_HOST value: 192.168.100.181:31681 # Drone Server地址 - name: DRONE_RPC_PROTO value: http - name: DRONE_RPC_SECRET value: qawsedrftg # Drone Server部署时候填写的secret
2、执行部署并查看结果
[root@k8s-node001 drone]# kubectl apply -f drone-runner.yaml [root@k8s-node001 drone]# kubectl get po NAME READY STATUS RESTARTS AGE drone-runner-7c64bffb45-dh2dn 1/1 Running 0 11m
至此,实现CI/CD的环境都准备好了,现在来跑一个demo
CI/CD示例
Initialized empty Git repository in /drone/src/.git/ + git fetch origin +refs/heads/master: fatal: unable to access 'Failed to connect to 192.168.100.181 port 3000: Connection refused
首先看下这个pipeline,很简单,使用镜像alpine执行两条输出语句
kind: pipeline type: kubernetes name: default steps: - name: greeting image: alpine commands: - echo hello - echo world
总结
PS:后续文章会同步到dev.kubeops.net
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~