最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kubernetes實(shí)現(xiàn)CI與CD配置教程

 更新時(shí)間:2022年05月26日 09:45:24   作者:愿許浪盡天涯  
這篇文章主要為大家介紹了基于Kubernetes實(shí)現(xiàn)CI與CD配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、基本介紹

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

CI/CD 流程圖:

開發(fā)將代碼提交代碼倉(cāng)庫(kù)后,我們便可以通過在 Jenkins 上配置腳本或是 Pipline 的方式來實(shí)現(xiàn)代碼發(fā)布,其中發(fā)布有兩種方式,一種是通過手動(dòng)發(fā)布,另外一種可以通過 WebHook 插件來實(shí)現(xiàn)提交代碼便自動(dòng)發(fā)布(生產(chǎn)環(huán)境不建議自動(dòng)發(fā)布)

腳本內(nèi)容一般分為:克隆代碼、編譯代碼、將編譯好的代碼打包成鏡像、運(yùn)行鏡像幾個(gè)步驟。

二、基于 Kubernetes 實(shí)現(xiàn) CI/CD 配置

下面我們是通過容器的方式安裝配置,物理安裝可以看我前面的文章:傳送門

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								# 三連回車
[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)編寫 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)編寫 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 教程可以看博主前面寫的文章:Git

[root@k8s-master01 test]# git add .														# 提交到暫存區(qū)
[root@k8s-master01 test]# git config --global user.email "Zhuang_zz1217@163.com"		# 配置用戶郵箱
[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)編寫 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ù): 如果你們沒有自己的鏡像倉(cāng)庫(kù),可以選擇調(diào)整腳本或看博主前面寫的文章來安裝 Harbor 倉(cāng)庫(kù)。

替換鏡像: 我們上面配置的腳本是針對(duì)單個(gè)模塊的,多個(gè)模塊可以根據(jù) for 循環(huán)來實(shí)現(xiàn)。

4.驗(yàn)證

1)在 Jenkins 上安裝 SSH 插件

安裝 SSH 插件的原因是因?yàn)椋覀冞@個(gè) Jenkins 是容器安裝的,而腳本是在宿主機(jī)寫的,所以通過遠(yuǎn)程到宿主機(jī)來運(yùn)行腳本。

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

3)創(chuàng)建 Jenkins 私鑰憑證(類型選擇: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)文章!

相關(guān)文章

  • kubernetes(k8s)中Yaml文件詳解

    kubernetes(k8s)中Yaml文件詳解

    這篇文章主要給大家介紹了關(guān)于kubernetes(k8s)中Yaml文件詳解的相關(guān)資料,YAML是專門用來寫配置文件的語言,非常簡(jiǎn)潔和強(qiáng)大,使用比json更方便,需要的朋友可以參考下
    2023-12-12
  • 刪除Helm使用時(shí)關(guān)于kubernetes文件的警告問題

    刪除Helm使用時(shí)關(guān)于kubernetes文件的警告問題

    這篇文章主要介紹了刪除Helm使用時(shí)關(guān)于kubernetes文件的警告問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署

    Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署

    這篇文章主要為大家介紹了Rainbond對(duì)前端項(xiàng)目Vue及React的持續(xù)部署,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 一篇文章讀懂K8S的PV和PVC以及實(shí)踐攻略

    一篇文章讀懂K8S的PV和PVC以及實(shí)踐攻略

    本文詳細(xì)介紹了Kubernetes中的存儲(chǔ)卷(Volume)機(jī)制,包括PersistentVolume(PV)、PersistentVolumeClaim(PVC)及其與后端存儲(chǔ)的關(guān)系,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解

    Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解

    這篇文章主要為大家介紹了Google?Kubernetes?Engine?集群實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • k8s如何給node添加標(biāo)簽(最新推薦)

    k8s如何給node添加標(biāo)簽(最新推薦)

    k8s集群如果由大量節(jié)點(diǎn)組成,可將節(jié)點(diǎn)打上對(duì)應(yīng)的標(biāo)簽,然后通過標(biāo)簽進(jìn)行篩選及查看,更好的進(jìn)行資源對(duì)象的相關(guān)選擇與匹配,這篇文章主要介紹了k8s如何給node添加標(biāo)簽,需要的朋友可以參考下
    2023-02-02
  • MinIO使用基礎(chǔ)教程(最新整理)

    MinIO使用基礎(chǔ)教程(最新整理)

    文章介紹了MinIO云存儲(chǔ)服務(wù)的快速安裝和使用,并通過SpringBoot實(shí)現(xiàn)文件上傳和查詢的功能,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • 阿里云ECS排查CPU數(shù)據(jù)分析

    阿里云ECS排查CPU數(shù)據(jù)分析

    這篇文章主要介紹了阿里云ECS排查CPU數(shù)據(jù)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 在K8S中使用ArgoCD做持續(xù)部署的方案

    在K8S中使用ArgoCD做持續(xù)部署的方案

    ArgoCD是一個(gè)基于Kubernetes的GitOps持續(xù)交付工具,應(yīng)用的部署和更新都可以在Git倉(cāng)庫(kù)上同步實(shí)現(xiàn),并自帶一個(gè)可視化界面,本文介紹如何使用Git+Argocd方式來實(shí)現(xiàn)在k8s中部署和更新應(yīng)用服務(wù),感興趣的朋友一起看看吧
    2025-03-03
  • RFO SIG之openEuler AWS AMI 制作詳解

    RFO SIG之openEuler AWS AMI 制作詳解

    這篇文章主要為大家介紹了RFO SIG之openEuler AWS AMI 制作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論

海城市| 怀集县| 铁力市| 咸宁市| 沂源县| 邹城市| 随州市| 大厂| 新巴尔虎左旗| 营山县| 仪陇县| 永定县| 青岛市| 文安县| 营山县| 西乌珠穆沁旗| 会宁县| 南开区| 富裕县| 会同县| 武安市| 濮阳县| 托克逊县| 临湘市| 广灵县| 龙川县| 水城县| 克拉玛依市| 安龙县| 山西省| 韶关市| 社旗县| 桂东县| 东阿县| 陆良县| 青浦区| 荣成市| 青阳县| 巴彦县| 滦南县| 西城区|