成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Jenkins 基于 Kubernetes 的動(dòng)態(tài)和靜態(tài)節(jié)點(diǎn)

云計(jì)算 云原生
既然要基于 Kubernetes 來做 CI/CD,我們這里最好還是將 Jenkins 安裝到 Kubernetes 集群當(dāng)中,安裝的方式也很多,我們這里仍然還是使用手動(dòng)的方式,這樣可以了解更多細(xì)節(jié)。

提到基于 Kubernetes 的 CI/CD,可以使用的工具有很多,比如 Jenkins、Gitlab CI、Drone 之類的,我們這里會(huì)使用大家最為熟悉的 Jenkins 來做 CI/CD 的工具。

安裝

既然要基于 Kubernetes 來做 CI/CD,我們這里最好還是將 Jenkins 安裝到 Kubernetes 集群當(dāng)中,安裝的方式也很多,我們這里仍然還是使用手動(dòng)的方式,這樣可以了解更多細(xì)節(jié),對(duì)應(yīng)的資源清單文件如下所示:

# jenkins.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-local
  labels:
    app: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  storageClassName: local-storage
  local:
    path: /data/k8s/jenkins
  persistentVolumeReclaimPolicy: Retain
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - node2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: kube-ops
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: kube-ops
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments", "ingresses"]
    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", "watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
  - apiGroups: [""]
    resources: ["pods/log", "events"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins
  namespace: kube-ops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: kube-ops
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins
      initContainers:
        - name: fix-permissions
          image: busybox:1.35.0
          command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts-jdk11
          imagePullPolicy: IfNotPresent
          env:
            - name: JAVA_OPTS
              value: -Dhudson.model.DownloadService.noSignatureCheck=true
          ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            - containerPort: 50000
              name: agent
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkinshome
          persistentVolumeClaim:
            claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: kube-ops
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  ports:
    - name: web
      port: 8080
      targetPort: web
    - name: agent
      port: 50000
      targetPort: agent
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins
  namespace: kube-ops
spec:
  ingressClassName: nginx
  rules:
    - host: jenkins.k8s.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: jenkins
                port:
                  name: web

我們這里使用 jenkins/jenkins:lts-jdk11 鏡像,這是 jenkins 官方的 Docker 鏡像,然后也有一些環(huán)境變量,當(dāng)然我們也可以根據(jù)自己的需求來定制一個(gè)鏡像,比如我們可以將一些插件打包在自定義的鏡像當(dāng)中,可以參考文檔:https://github.com/jenkinsci/docker,我們這里使用默認(rèn)的官方鏡像就行,另外一個(gè)還需要注意的數(shù)據(jù)的持久化,將容器的 /var/jenkins_home 目錄持久化即可,我們這里使用的是 Local PV 的方式。

由于我們這里使用的鏡像內(nèi)部運(yùn)行的用戶 uid=1000,所以我們這里掛載出來后會(huì)出現(xiàn)權(quán)限問題,為解決這個(gè)問題,我們同樣還是用一個(gè)簡(jiǎn)單的 initContainer 來修改下我們掛載的數(shù)據(jù)目錄。

另外由于 jenkens 會(huì)對(duì) update-center.json 做簽名校驗(yàn)安全檢查,這里我們需要先提前關(guān)閉,否則下面更改插件源可能會(huì)失敗,通過配置環(huán)境變量 JAVA_OPTS=-Dhudson.model.DownloadService.noSignatureCheck=true 即可。

另外我們這里還需要使用到一個(gè)擁有相關(guān)權(quán)限的 serviceAccount:jenkins,我們這里只是給 jenkins 賦予了一些必要的權(quán)限,當(dāng)然如果你對(duì) serviceAccount 的權(quán)限不是很熟悉的話,我們給這個(gè) sa 綁定一個(gè) cluster-admin 的集群角色權(quán)限也是可以的,當(dāng)然這樣具有一定的安全風(fēng)險(xiǎn)。最后就是通過 Ingress 來暴露我們的服務(wù),這個(gè)比較簡(jiǎn)單。

我們直接來創(chuàng)建 jenkins 的資源清單即可:

$ kubectl apply -f jenkins.yaml
$ kubectl get pods -n kube-ops -l app=jenkins
NAME                       READY   STATUS    RESTARTS   AGE
jenkins-55c4676f4d-fhmw2   1/1     Running   0          3m5s
$ kubectl logs -f jenkins-55c4676f4d-fhmw2 -n kube-ops
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
# ......
2023-09-07 06:56:26.123+0000 [id=33]    INFO    jenkins.install.SetupWizard#init:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

278e9dcdcab04d11ae671f7f81f517ba

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2023-09-07 06:56:38.572+0000 [id=29]    INFO    jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-09-07 06:56:38.583+0000 [id=23]    INFO    hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2023-09-07 06:57:02.555+0000 [id=49]    INFO    h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-09-07 06:57:02.556+0000 [id=49]    INFO    hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1

看到上面的 run: Jenkins is fully up and running 信息就證明我們的 Jenkins 應(yīng)用以前啟動(dòng)起來了。

然后我們可以通過 Ingress 中定義的域名 jenkins.k8s.local(需要做 DNS 解析或者在本地 /etc/hosts 中添加映射)來訪問 jenkins 服務(wù):

jenkins unlock

然后可以執(zhí)行下面的命令獲取解鎖的管理員密碼:

$ kubectl exec -it jenkins-55c4676f4d-fhmw2 -n kube-ops -- cat /var/jenkins_home/secrets/initialAdminPassword
278e9dcdcab04d11ae671f7f81f517ba   # jenkins啟動(dòng)日志里面也有

然后跳過插件安裝,選擇默認(rèn)安裝插件過程會(huì)非常慢(也可以選擇安裝推薦的插件),點(diǎn)擊右上角關(guān)閉選擇插件。

ignore plugin install

跳過后會(huì)直接進(jìn)入 Jenkins 就緒頁面,直接點(diǎn)擊開始使用即可:

jenkins ready

然后就可以進(jìn)入 Jenkins 主頁了。

Jenkins Home

首先安裝中文插件(如果想要中文界面的話),搜索 Localization: Chinese:

Localization: Chinese

安裝重啟完成后,會(huì)自動(dòng)跳轉(zhuǎn)到登錄頁面:

Jenkins Login

這里還是使用 admin 和前面的初始密碼進(jìn)行登錄。然后可以進(jìn)入用戶管理頁面 http://jenkins.k8s.local/user/admin/configure 修改用戶密碼:

修改密碼

然后就可以使用新的密碼登錄了。

接下來我們可以安裝其他需要的插件,比如 Pipeline 插件。Pipeline 是 Jenkins 的一個(gè)核心插件,它定義了一套 DSL 語言,可以用來編寫 Pipeline 腳本,這個(gè)腳本可以實(shí)現(xiàn)從代碼構(gòu)建到部署的整個(gè)流程。在使用 Pipeline 類型的項(xiàng)目時(shí),需要提前安裝 Jenkins 的 Pipeline 插件。

pipeline plugin

安裝好插件后新建一個(gè) Pipeline 類型的作業(yè):

新建作業(yè)

自由風(fēng)格項(xiàng)目和 Pipeline 類型的項(xiàng)目區(qū)別是,構(gòu)建部分的操作都是在頁面上面完成的。Pipeline 的構(gòu)建任務(wù)描述都是通過代碼的方式。

hello

保存后我們可以點(diǎn)擊立即構(gòu)建執(zhí)行這個(gè)任務(wù),也可以查看這個(gè)任務(wù)的執(zhí)行結(jié)果輸出:

執(zhí)行結(jié)果

架構(gòu)

Jenkins 安裝完成了,接下來我們不用急著就去使用,我們要了解下在 Kubernetes 環(huán)境下面使用 Jenkins 有什么好處。

我們知道持續(xù)構(gòu)建與發(fā)布是我們?nèi)粘9ぷ髦斜夭豢缮俚囊粋€(gè)步驟,目前大多公司都采用 Jenkins 集群來搭建符合需求的 CI/CD 流程,然而傳統(tǒng)的 Jenkins Slave 一主多從方式會(huì)存在一些痛點(diǎn),比如:

  • 主 Master 發(fā)生單點(diǎn)故障時(shí),整個(gè)流程都不可用了
  • 每個(gè) Slave 的配置環(huán)境不一樣,來完成不同語言的編譯打包等操作,但是這些差異化的配置導(dǎo)致管理起來非常不方便,維護(hù)起來也是比較費(fèi)勁
  • 資源分配不均衡,有的 Slave 要運(yùn)行的 job 出現(xiàn)排隊(duì)等待,而有的 Slave 處于空閑狀態(tài)
  • 資源有浪費(fèi),每臺(tái) Slave 可能是物理機(jī)或者虛擬機(jī),當(dāng) Slave 處于空閑狀態(tài)時(shí),也不會(huì)完全釋放掉資源。

正因?yàn)樯厦娴倪@些種種痛點(diǎn),我們渴望一種更高效更可靠的方式來完成這個(gè) CI/CD 流程,而 Docker 虛擬化容器技術(shù)能很好的解決這個(gè)痛點(diǎn),又特別是在 Kubernetes 集群環(huán)境下面能夠更好來解決上面的問題,下圖是基于 Kubernetes 搭建 Jenkins 集群的簡(jiǎn)單示意圖:

k8s jenkins slave

從圖上可以看到 Jenkins Master 和 Jenkins Slave 以 Pod 形式運(yùn)行在 Kubernetes 集群的 Node 上,Master 運(yùn)行在其中一個(gè)節(jié)點(diǎn),并且將其配置數(shù)據(jù)存儲(chǔ)到一個(gè) Volume 上去,Slave 運(yùn)行在各個(gè)節(jié)點(diǎn)上,并且它不是一直處于運(yùn)行狀態(tài),它會(huì)按照需求動(dòng)態(tài)的創(chuàng)建并自動(dòng)刪除。

這種方式的工作流程大致為:當(dāng) Jenkins Master 接受到 Build 請(qǐng)求時(shí),會(huì)根據(jù)配置的 Label 動(dòng)態(tài)創(chuàng)建一個(gè)運(yùn)行在 Pod 中的 Jenkins Slave 并注冊(cè)到 Master 上,當(dāng)運(yùn)行完 Job 后,這個(gè) Slave 會(huì)被注銷并且這個(gè) Pod 也會(huì)自動(dòng)刪除,恢復(fù)到最初狀態(tài)。

那么我們使用這種方式帶來了哪些好處呢?

  • 服務(wù)高可用,當(dāng) Jenkins Master 出現(xiàn)故障時(shí),Kubernetes 會(huì)自動(dòng)創(chuàng)建一個(gè)新的 Jenkins Master 容器,并且將 Volume 分配給新創(chuàng)建的容器,保證數(shù)據(jù)不丟失,從而達(dá)到集群服務(wù)高可用。
  • 動(dòng)態(tài)伸縮,合理使用資源,每次運(yùn)行 Job 時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè) Jenkins Slave,Job 完成后,Slave 自動(dòng)注銷并刪除容器,資源自動(dòng)釋放,而且 Kubernetes 會(huì)根據(jù)每個(gè)資源的使用情況,動(dòng)態(tài)分配 Slave 到空閑的節(jié)點(diǎn)上創(chuàng)建,降低出現(xiàn)因某節(jié)點(diǎn)資源利用率高,還排隊(duì)等待在該節(jié)點(diǎn)的情況。
  • 擴(kuò)展性好,當(dāng) Kubernetes 集群的資源嚴(yán)重不足而導(dǎo)致 Job 排隊(duì)等待時(shí),可以很容易的添加一個(gè) Kubernetes Node 到集群中,從而實(shí)現(xiàn)擴(kuò)展。 是不是以前我們面臨的種種問題在 Kubernetes 集群環(huán)境下面是不是都沒有了???看上去非常完美。

Agent 節(jié)點(diǎn)

雖然我們上面提到了動(dòng)態(tài)節(jié)點(diǎn)的好處,但是還是會(huì)有一部分人比較喜歡堅(jiān)持靜態(tài)節(jié)點(diǎn)的方式,選擇靜態(tài)或者動(dòng)態(tài)的 Jenkins Agent 節(jié)點(diǎn)都是可以的。接下來我們就分別來介紹下如何在 Kubernetes 集群中為 Jenkins 提供動(dòng)靜態(tài) Agent 節(jié)點(diǎn)。

靜態(tài)節(jié)點(diǎn)

首先在 Jenkins 頁面 http://jenkins.k8s.local/computer/new 新建一個(gè)節(jié)點(diǎn):

新建節(jié)點(diǎn)

點(diǎn)擊創(chuàng)建后配置節(jié)點(diǎn)信息,然后點(diǎn)擊保存:

配置節(jié)點(diǎn)

保存后我們可以看到節(jié)點(diǎn)已經(jīng)創(chuàng)建成功了:

節(jié)點(diǎn)列表

然后點(diǎn)擊列表中的 agent1 名稱,進(jìn)入節(jié)點(diǎn)詳情頁面,在詳情頁面我們將獲取到運(yùn)行該節(jié)點(diǎn)的一些密鑰信息。

密鑰信息

然后創(chuàng)建一個(gè)如下所示的資源清單文件:

# jenkins-agent.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-agent
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: jenkins-agent
  template:
    metadata:
      labels:
        app: jenkins-agent
    spec:
      containers:
        - name: agent
          image: jenkins/inbound-agent
          securityContext:
            privileged: true
          imagePullPolicy: IfNotPresent
          env:
            - name: JENKINS_URL
              value: http://jenkins.k8s.local
            - name: JENKINS_SECRET
              value: 9c4c5159b111083705eed5802ceb021cfad002a18dd59c692aa59a9616e6285a
            - name: JENKINS_AGENT_NAME
              value: agent1
            - name: JENKINS_AGENT_WORKDIR
              value: /home/jenkins/workspace

上面的清單文件中的 JENKINS_URL、JENKINS_SECRET 和 JENKINS_AGENT_WORKDIR 這些環(huán)境變量的值就是上面我們?cè)诠?jié)點(diǎn)詳情頁面獲取到的信息,然后我們將這個(gè)文件應(yīng)用到集群中:

$ kubectl apply -f jenkins-agent.yaml

創(chuàng)建后正常該 agent 的 Pod 會(huì)啟動(dòng)報(bào)錯(cuò),錯(cuò)誤日志如下所示:

INFO: Locating server among [http://jenkins.k8s.local/]
Sep 07, 2023 7:55:51 AM hudson.remoting.jnlp.Main$CuiListener error
SEVERE: Failed to connect to http://jenkins.k8s.local/tcpSlaveAgentListener/: jenkins.k8s.local
java.io.IOException: Failed to connect to http://jenkins.k8s.local/tcpSlaveAgentListener/: jenkins.k8s.local
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:216)
        at hudson.remoting.Engine.innerRun(Engine.java:760)
        at hudson.remoting.Engine.run(Engine.java:543)
Caused by: java.net.UnknownHostException: jenkins.k8s.local
        at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.base/java.net.Socket.connect(Unknown Source)
        at java.base/sun.net.NetworkClient.doConnect(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.<init>(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
        at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
        at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
        at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:213)
        ... 2 more

這其實(shí)是因?yàn)槲覀兣渲玫?nbsp;jenkins.k8s.local 域名是一個(gè)自定義的域名,需要在 K8s 集群中解析的話,我們還需要在 CoreDNS 中去添加一條 hosts 映射:

$ kubectl edit cm coredns -n kube-system

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        hosts {
          10.206.16.10 jenkins.k8s.local
          fallthrough
        }
#  ......
kind: ConfigMap

但其實(shí)還有更簡(jiǎn)單的方式,那就是直接將 JENKINS_URL 值替換為 Jenkins 的 Service 地址 http://jenkins.kube-ops.svc.cluster.local:8080 即可,這樣就不需要在 CoreDNS 中添加 hosts 映射了。

正常現(xiàn)在的 Jenkins Agent Pod 應(yīng)該是正常運(yùn)行的,我們可以通過下面的命令查看:

$ kubectl get pods -n kube-ops -l app=jenkins-agent
NAME                             READY   STATUS    RESTARTS   AGE
jenkins-agent-76884cd44c-dd9ds   1/1     Running   0          2m32s

再次查看節(jié)點(diǎn)列表,我們可以看到節(jié)點(diǎn)已經(jīng)在線了:

agent

接下來我們?cè)賱?chuàng)建一個(gè) Pipeline 類型的作業(yè),然后在 Pipeline 腳本中添加下面的內(nèi)容:

流水線

這里我們定義的流水線腳本中,我們使用到了 agent 關(guān)鍵字,這個(gè)關(guān)鍵字的作用就是指定這個(gè)流水線的運(yùn)行環(huán)境,這里我們指定的是 build 這個(gè)標(biāo)簽,也就是我們上面創(chuàng)建的 agent1 這個(gè)節(jié)點(diǎn),這樣這個(gè)流水線就會(huì)在這個(gè)節(jié)點(diǎn)上運(yùn)行。

點(diǎn)擊保存后,我們可以點(diǎn)擊立即構(gòu)建來執(zhí)行這個(gè)流水線,然后我們可以查看這個(gè)流水線的執(zhí)行結(jié)果:

執(zhí)行結(jié)果

這樣我們就可以在 Jenkins 中使用這個(gè)靜態(tài)節(jié)點(diǎn)來構(gòu)建任務(wù)了。

動(dòng)態(tài)節(jié)點(diǎn)

除了靜態(tài)節(jié)點(diǎn)之外,我們還可以使用動(dòng)態(tài)節(jié)點(diǎn)的方式來構(gòu)建任務(wù),這樣可以更好的利用資源,我們這里使用的是 Kubernetes 的方式來創(chuàng)建動(dòng)態(tài)節(jié)點(diǎn),這樣我們就可以在 Jenkins 中使用動(dòng)態(tài)節(jié)點(diǎn)來構(gòu)建任務(wù)了。

第 1 步. 首先需要安裝 Kubernetes 插件。

kubernetes plugin

第 2 步. 安裝完畢后,進(jìn)入 http://jenkins.k8s.local/manage/cloud/ 頁面:

new kubernetes plugin config

在該頁面點(diǎn)擊 New cloud 新建一個(gè) Cloud 服務(wù):

kubernetes plugin config

這里注意一定要選擇上 Kubernetes 這個(gè) Type,然后點(diǎn)擊 Create 按鈕,然后我們就可以看到下面的配置頁面了:

create cloud

首先,配置連接 Kubernetes APIServer 的地址,由于我們的 Jenkins 運(yùn)行在 Kubernetes 集群中,所以可以使用 Service 的 DNS 形式進(jìn)行連接 https://kubernetes.default.svc.cluster.local:

jenkins k8s apiserver

命名空間這里填 kube-ops,然后點(diǎn)擊 連接測(cè)試,如果出現(xiàn) Connected to Kubernetes v1.26.2 這樣的提示信息證明 Jenkins 已經(jīng)可以和 Kubernetes 系統(tǒng)正常通信了。

然后下方的 Jenkins URL 地址為 http://jenkins.kube-ops.svc.cluster.local:8080,根據(jù)上面創(chuàng)建的 jenkins 的服務(wù)名填寫,包括下面的 Jenkins 通道,默認(rèn)是 50000 端口(要注意是 TCP,所以不要填寫 http):

jenkins url

然后點(diǎn)擊最后的 save 按鈕保存配置。到這里我們的 Kubernetes 插件就算配置完成了。

測(cè)試

Kubernetes 插件的配置工作完成了,接下來我們就來添加一個(gè) Job 任務(wù),看是否能夠在 Slave Pod 中執(zhí)行,任務(wù)執(zhí)行完成后看 Pod 是否會(huì)被銷毀。

在 Jenkins 首頁點(diǎn)擊 新建任務(wù),創(chuàng)建一個(gè)測(cè)試的任務(wù),同樣還是選擇 Pipeline 類型的任務(wù),這次我們需要使用的流水線腳本就更復(fù)雜了,如下所示:

pipeline{
    agent{
        kubernetes{
            label "test01"
            cloud 'Kubernetes'
            yaml '''
---
kind: Pod
apiVersion: v1
metadata:
  labels:
    k8s-app: jenkins-agent
  name: jenkins-agent
  namespace: kube-ops
spec:
containers:
  - name: jenkinsagent
    image: jenkins/inbound-agent
    imagePullPolicy: IfNotPresent
'''
        }
    }

    stages{
        stage("Hello"){
          steps{
            script{
              echo "Hello Slave Pod on Kubernetes!"
            }
          }
        }
    }
}

這次的腳本中定義的執(zhí)行 agent 就比較復(fù)雜了,通過一個(gè) kubernetes 屬性來指定這個(gè)流水線的運(yùn)行環(huán)境,然后通過 yaml 屬性來定義這個(gè)運(yùn)行 Pod 的清單文件,這里我們定義的是一個(gè)簡(jiǎn)單的 Pod,然后我們將這個(gè) Pod 部署到 kube-ops 這個(gè)命名空間中,這樣我們就可以在這個(gè) Pod 中運(yùn)行我們的 Jenkins Slave 了,需要注意 cloud 后面的值需要和前面我們定義的 Cloud 服務(wù)名稱一致。

最后點(diǎn)擊保存,同樣我們可以點(diǎn)擊左側(cè)的 立即構(gòu)建 來執(zhí)行這個(gè)任務(wù),然后我們可以查看這個(gè)任務(wù)的執(zhí)行結(jié)果:

slave pod execute command

雖然我們?cè)谶@里的腳本中定義的 Pod 非常簡(jiǎn)單,但可以看到 Jenkins 會(huì)幫我們配置一些默認(rèn)的環(huán)境變量。當(dāng)任務(wù)執(zhí)行的過程中我們也可以觀察 Kubernetes 集群中的 Pod 變化:

$ kubectl get pods -n kube-ops -w
NAME                              READY   STATUS        RESTARTS      AGE
jenkins-55c4676f4d-fhmw2          1/1     Running       3 (12m ago)   91m
jenkins-agent-76884cd44c-dd9ds    1/1     Running       0             22m
test01-jnzmb-ht0n7                0/1     Pending       0             0s
test01-jnzmb-ht0n7                0/1     Pending       0             0s
test01-jnzmb-ht0n7                0/1     ContainerCreating   0             0s
test01-jnzmb-ht0n7                1/1     Running             0             1s
test01-jnzmb-ht0n7                1/1     Terminating         0             3s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s
test01-jnzmb-ht0n7                0/1     Terminating         0             4s

我們可以看到在我們點(diǎn)擊立刻構(gòu)建的時(shí)候可以看到一個(gè)新的 Pod:test01-jnzmb-ht0n7 被創(chuàng)建了,這就是我們的 Jenkins Slave。當(dāng)任務(wù)構(gòu)建完抽這個(gè) Slave Pod 也會(huì)自動(dòng)刪除。

到這里,我們就完成了使用 Kubernetes 動(dòng)態(tài)生成 Jenkins Slave 的方法。

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2010-03-04 10:17:57

Linux動(dòng)態(tài)庫

2021-04-22 06:15:59

Linux靜態(tài)鏈接動(dòng)態(tài)庫

2017-05-27 09:58:42

BGP動(dòng)態(tài)靜態(tài)

2021-02-26 08:37:47

KubernetesDocker

2009-08-28 14:09:19

C#靜態(tài)類

2021-09-13 07:53:30

安全

2020-10-29 09:56:23

Linux靜態(tài)庫動(dòng)態(tài)庫

2019-10-17 21:14:08

Kubernetes節(jié)點(diǎn)Python

2023-02-10 10:54:48

DevOpsCICD

2022-10-17 10:35:34

DevOpsCICD

2022-04-15 15:56:30

云原生容器

2019-10-09 09:53:10

Kubernetes服務(wù)器Linux

2022-05-02 18:21:46

JenkinsKubernetesDevOps

2015-07-17 10:25:43

kubernetesDocker集群系統(tǒng)

2020-04-09 15:23:19

Kubernetes發(fā)布系統(tǒng)集群

2015-07-07 10:00:39

2021-03-04 08:14:37

Java8開發(fā)接口

2021-06-05 06:52:16

Kubernetes

2017-08-23 11:10:44

Kubernetes 調(diào)度詳解

2020-04-27 09:38:15

Kubernetes多云混合云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 先锋资源吧 | www,黄色,com | 天天综合永久入口 | 精品福利在线 | 欧美一区二区三区四区五区无卡码 | 狠狠操网站 | 伊人网国产 | va精品 | 国产精品一区二区久久精品爱微奶 | 免费成人高清 | 色毛片| 日韩一二三区视频 | 久久在线 | 亚洲传媒在线 | 久久久亚洲一区 | 国产精品综合色区在线观看 | 东方伊人免费在线观看 | 中文字幕乱码一区二区三区 | 精品久久久久久久久久久 | 国产日韩一区二区 | 日韩国产高清在线观看 | 少妇一级淫片aaaaaaaaa | 欧美精品在欧美一区二区 | 欧美精品一区在线发布 | 欧美在线天堂 | 一区二区视频在线观看 | 国产免费一区二区 | 久久久精品视频免费 | 91 在线 | 久久久夜夜夜 | 免费观看一区二区三区毛片 | 激情综合五月 | 成人精品一区二区三区 | 亚洲精品一区在线 | 欧美久久一区 | 91视视频在线观看入口直接观看 | 欧美性网站| 亚洲精品一区在线 | 在线中文字幕亚洲 | 国产成人午夜精品影院游乐网 | 91精品在线播放 |