Kubernetes實(shí)現(xiàn)CI與CD配置教程
一、基本介紹
基于 Kubernetes 實(shí)現(xiàn) CI/CD 配置,其實(shí)和往常那些 CI/CD 配置并沒(méi)有太大區(qū)別。都是通過(guò) 提交代碼,拉取代碼,構(gòu)建代碼,發(fā)布代碼來(lái)實(shí)現(xiàn)的。 只不過(guò)要是通過(guò) K8s 來(lái)實(shí)現(xiàn)的話,則是需要將構(gòu)建好的代碼打包成鏡像,通過(guò)鏡像的方式來(lái)運(yùn)行。
CI/CD 流程圖:

開(kāi)發(fā)將代碼提交代碼倉(cāng)庫(kù)后,我們便可以通過(guò)在 Jenkins 上配置腳本或是 Pipline 的方式來(lái)實(shí)現(xiàn)代碼發(fā)布,其中發(fā)布有兩種方式,一種是通過(guò)手動(dòng)發(fā)布,另外一種可以通過(guò) WebHook 插件來(lái)實(shí)現(xiàn)提交代碼便自動(dòng)發(fā)布(生產(chǎn)環(huán)境不建議自動(dòng)發(fā)布)
腳本內(nèi)容一般分為:克隆代碼、編譯代碼、將編譯好的代碼打包成鏡像、運(yùn)行鏡像幾個(gè)步驟。
二、基于 Kubernetes 實(shí)現(xiàn) CI/CD 配置
下面我們是通過(guò)容器的方式安裝配置,物理安裝可以看我前面的文章:傳送門(mén)
1.配置 GitLab
1)安裝 Docker-Compose
[root@k8s-master01 ~]# wget "https://github.com/docker/compose/releases/download/v2.3.2/docker-compose-$(uname -s)-$(uname -m)" -O /usr/local/bin/docker-compose [root@k8s-master01 ~]# chmod +x /usr/local/bin/docker-compose [root@k8s-master01 ~]# docker-compose --version
2)安裝 GitLab
[root@k8s-master01 ~]# vim docker-compose.yml
version: '3'
services:
web:
image: 'gitlab/gitlab-ce:14.8.5-ce.0'
restart: always
hostname: 192.168.1.1
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.1.1'
ports:
- '1080:80'
- '1443:443'
- '1022:22'
volumes:
- '/app/gitlab/config:/etc/gitlab'
- '/app/gitlab/logs:/var/log/gitlab'
- '/app/gitlab/data:/var/opt/gitlab'
[root@k8s-master01 ~]# docker-compose up -d
因?yàn)椴┲鞯碾娔X配置不是很高,所以就不使用上面的方式安裝 GitLab,而是直接使用 GitHub 上面的倉(cāng)庫(kù)。
2.配置 Jenkins
1)安裝 NFS 存儲(chǔ),并配置共享目錄
[root@k8s-master01 ~]# yum -y install nfs-utils rpcbind [root@k8s-master01 ~]# echo "/app/jenkins *(rw,sync,no_root_squash)" > /etc/exports [root@k8s-master01 ~]# mkdir /app/jenkins [root@k8s-master01 ~]# systemctl start rpcbind nfs
2)創(chuàng)建 PV 和 PVC
[root@k8s-master01 ~]# vim jenkins-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.1
path: /app/jenkins
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteMany
[root@k8s-master01 ~]# kubectl create -f jenkins-pv.yaml
3)創(chuàng)建 RBAC 授權(quán)
[root@k8s-master01 ~]# vim jenkins-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-sa
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: jenkins-cr
rules:
- apiGroups: ["extensions","apps"]
resources: ["deployments"]
verbs: ["create","delete","get","list","watch","patch","update"]
- apiGroups: [""]
resources: ["services"]
verbs: ["create","delete","get","list","watch","patch","update"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create","delete","get","list","patch","update"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get","list","update"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: jenkins-crb
roleRef:
kind: ClusterRole
name: jenkins-cr
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: jenkins-sa
namespace: default
[root@k8s-master01 ~]# kubectl create -f jenkins-sa.yaml
4)創(chuàng)建 StatefulSet
[root@k8s-master01 ~]# vim jenkins-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: jenkins
spec:
serviceName: jenkins
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
name: "jenkins"
labels:
app: jenkins
spec:
serviceAccountName: jenkins-sa
containers:
- name: jenkins
image: jenkins/jenkins:lts
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
- containerPort: 50000
volumeMounts:
- name: jenkins
mountPath: /var/jenkins_home
volumes:
- name: jenkins
persistentVolumeClaim:
claimName: jenkins-pvc
[root@k8s-master01 ~]# chown -R 1000 /app/jenkins
[root@k8s-master01 ~]# kubectl create -f jenkins-statefulset.yaml
5)創(chuàng)建 Service
[root@k8s-master01 ~]# vim jenkins-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 30080
- name: agent
port: 50000
targetPort: 50000
nodePort: 30090
selector:
app: jenkins
[root@k8s-master01 ~]# kubectl create -f jenkins-svc.yaml
6)配置 Jenkins
[root@k8s-master01 ~]# cat /app/jenkins/secrets/initialAdminPassword a303d66e915e4ee5b26648a64fdff4be
http://192.168.1.1:30080/

我們這里安裝推薦的插件即可,后面有需求可以再進(jìn)行安裝


3.實(shí)現(xiàn) CI/CD 配置
1)在 Jenkins 宿主機(jī)上創(chuàng)建 SSH 密鑰
[root@k8s-master01 ~]# ssh-keygen -t rsa # 三連回車(chē) [root@k8s-master01 ~]# cat ~/.ssh/id_rsa.pub # 查看公鑰
2)將公鑰上傳到 GitLab 上

3)將倉(cāng)庫(kù)克隆到本地
[root@k8s-master01 ~]# git clone git@github.com:ChenZhuang1217/test.git
4)編寫(xiě) Go 代碼
[root@k8s-master01 ~]# cd test
[root@k8s-master01 test]# vim main.go
package main
import (
"fmt"
"net/http"
)
func HelloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
}
func main() {
http.HandleFunc("/", HelloHandler)
http.ListenAndServe(":8080", nil)
}
5)編寫(xiě) Dockerfile
[root@k8s-master01 test]# vim Dockerfile
FROM golang:1.16 as builder
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o main main.go
FROM busybox:1.28.4
WORKDIR /app
COPY --from=builder /app/ .
EXPOSE 8080
CMD ["./main"]
[root@k8s-master01 test]# docker build -t test-web-server:devops-$(date +%Y-%m-%d-%H-%M-%S) .
6)提交代碼
Git 教程可以看博主前面寫(xiě)的文章:Git
[root@k8s-master01 test]# git add . # 提交到暫存區(qū) [root@k8s-master01 test]# git config --global user.email "Zhuang_zz1217@163.com" # 配置用戶(hù)郵箱 [root@k8s-master01 test]# git commit -m "This is test CI/CD" # 提交到本地倉(cāng)庫(kù) [root@k8s-master01 test]# git push # 推送到遠(yuǎn)程倉(cāng)庫(kù)
7)創(chuàng)建 Deployment 和 Service
[root@k8s-master01 ~]# vim test-web-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-web-server
spec:
replicas: 1
selector:
matchLabels:
app: test-web-server
template:
metadata:
labels:
app: test-web-server
spec:
containers:
- name: test-web-server
image: test-web-server:devops-2022-04-25-17-16-54
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: test-web-server
spec:
type: NodePort
ports:
- name: test-web-server
port: 8080
targetPort: 8080
nodePort: 30188
selector:
app: test-web-server
[root@k8s-master01 ~]# kubectl create -f test-web-server.yaml

8)編寫(xiě) Jenkins 發(fā)版腳本
[root@k8s-master01 ~]# vim test.sh
#!/bin/bash
# 固定時(shí)間格式
Second=$(date +%Y-%m-%d-%H-%M-%S)
# 備份舊的鏡像
Image=$(kubectl -s https://192.168.1.1:6443 describe pod | grep Image: | awk '{print $2}' | grep test)
echo $Image > /opt/test-image-$Second
# 克隆代碼
cd /root
if [ -d test ];
then
mv test /opt/test-devops-$Second
git clone git@github.com:ChenZhuang1217/test.git
else
git clone git@github.com:ChenZhuang1217/test.git
fi
# 發(fā)布新的鏡像
cd /root/test && docker build -t test-web-server:devops-$Second .
# 上傳到鏡像倉(cāng)庫(kù)
if [ $? -eq 0 ];
then
docker tag test-web-server:devops-$dateImage harbor.tianya.com:5000/test-web-server:devops-$Second
docker push harbor.tianya.com:5000/test-web-server:devops-$Second
else
exit 1 # 退出 (防止運(yùn)行下面命令)
fi
# 替換鏡像
sed -i 's/image:.*/image: harbor.tianya.com:5000\/test-web-server:devops-'$Second'/g' /root/test-web-server.yaml
# 重啟應(yīng)用
kubectl delete -f /root/test-web-server.yaml
kubectl create -f /root/test-web-server.yaml
[root@k8s-master01 ~]# chmod +x test.sh
上面這個(gè)腳本有兩步需要注意:
上傳到鏡像倉(cāng)庫(kù): 如果你們沒(méi)有自己的鏡像倉(cāng)庫(kù),可以選擇調(diào)整腳本或看博主前面寫(xiě)的文章來(lái)安裝 Harbor 倉(cāng)庫(kù)。
替換鏡像: 我們上面配置的腳本是針對(duì)單個(gè)模塊的,多個(gè)模塊可以根據(jù) for 循環(huán)來(lái)實(shí)現(xiàn)。
4.驗(yàn)證
1)在 Jenkins 上安裝 SSH 插件
安裝 SSH 插件的原因是因?yàn)?,我們這個(gè) Jenkins 是容器安裝的,而腳本是在宿主機(jī)寫(xiě)的,所以通過(guò)遠(yuǎn)程到宿主機(jī)來(lái)運(yùn)行腳本。

2)配置遠(yuǎn)程主機(jī)的用戶(hù)名和密碼


3)創(chuàng)建 Jenkins 私鑰憑證(類(lèi)型選擇:SSH Username with private key)

4)配置 Jenkins 流水線




5)修改代碼

6)在 Jenkins 上發(fā)布


以上就是Kubernetes實(shí)現(xiàn)CI與CD配置教程的詳細(xì)內(nèi)容,更多關(guān)于Kubernetes CI與CD配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Kubernetes集群模擬刪除k8s重裝詳解
- Centos7 安裝部署Kubernetes(k8s)集群實(shí)現(xiàn)過(guò)程
- Go語(yǔ)言k8s?kubernetes使用leader?election實(shí)現(xiàn)選舉
- Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解
- Kubernetes k8s configmap 容器技術(shù)解析
- kubernetes k8s常用問(wèn)題排查方法
- kubernetes?k8s?CRD自定義資源學(xué)習(xí)筆記
- Kubernetes應(yīng)用服務(wù)質(zhì)量管理詳解
相關(guān)文章
一文詳解基于Kubescape進(jìn)行Kubernetes安全加固
這篇文章主要為大家介紹了基于Kubescape進(jìn)行Kubernetes安全加固詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
k8s自動(dòng)化安裝腳本(二進(jìn)制)的操作步驟
Kubernetes?k8s安裝腳本,非常好用,下面這篇文章主要給大家介紹了關(guān)于k8s自動(dòng)化安裝腳本(二進(jìn)制)的操作步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Rainbond網(wǎng)絡(luò)治理插件ServiceMesh官方文檔說(shuō)明
這篇文章主要為大家介紹了Rainbond網(wǎng)絡(luò)治理插件ServiceMesh官方文檔說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Kubernetes故障排除有效維護(hù)集群的最佳實(shí)踐工具
這篇文章主要為大家介紹了Kubernetes故障排除有效維護(hù)集群的最佳實(shí)踐工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
K8S-ConfigMap實(shí)現(xiàn)應(yīng)用和配置分離詳解
這篇文章主要為大家介紹了K8S-ConfigMap實(shí)現(xiàn)應(yīng)用和配置分離詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
IoT?邊緣集群Kubernetes?Events告警通知進(jìn)一步配置詳解
這篇文章主要為大家介紹了IoT?邊緣集群Kubernetes?Events告警通知進(jìn)一步配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
再分享6個(gè)可無(wú)限激活阿里云盤(pán)邀請(qǐng)碼,不信你不能激活阿里云盤(pán)
這篇文章主要分享6個(gè)可無(wú)限激活的阿里云盤(pán)邀請(qǐng)碼,不信你不能激活阿里云盤(pán),需要的朋友可以參考下2020-11-11

