自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

安裝

既然要基于 Kubernetes 來(lái)做 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ù)自己的需求來(lái)定制一個(gè)鏡像,比如我們可以將一些插件打包在自定義的鏡像當(dāng)中,可以參考文檔:https://github.com/jenkinsci/docker,我們這里使用默認(rèn)的官方鏡像就行,另外一個(gè)還需要注意的數(shù)據(jù)的持久化,將容器的 /var/jenkins_home 目錄持久化即可,我們這里使用的是 Local PV 的方式。

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

另外由于 jenkens 會(huì)對(duì) update-center.json 做簽名校驗(yàn)安全檢查,這里我們需要先提前關(guān)閉,否則下面更改插件源可能會(huì)失敗,通過(guò)配置環(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)。最后就是通過(guò) Ingress 來(lái)暴露我們的服務(wù),這個(gè)比較簡(jiǎn)單。

我們直接來(lái)創(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)起來(lái)了。

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

jenkins unlock

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

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

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

ignore plugin install

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

jenkins ready

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

Jenkins Home

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

Localization: Chinese

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

Jenkins Login

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

修改密碼

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

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

pipeline plugin

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

新建作業(yè)

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

hello

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

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

架構(gòu)

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

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

  • 主 Master 發(fā)生單點(diǎn)故障時(shí),整個(gè)流程都不可用了
  • 每個(gè) Slave 的配置環(huán)境不一樣,來(lái)完成不同語(yǔ)言的編譯打包等操作,但是這些差異化的配置導(dǎo)致管理起來(lái)非常不方便,維護(hù)起來(lái)也是比較費(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),我們渴望一種更高效更可靠的方式來(lái)完成這個(gè) CI/CD 流程,而 Docker 虛擬化容器技術(shù)能很好的解決這個(gè)痛點(diǎn),又特別是在 Kubernetes 集群環(huán)境下面能夠更好來(lái)解決上面的問(wè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ì)被注銷(xiāo)并且這個(gè) Pod 也會(huì)自動(dòng)刪除,恢復(fù)到最初狀態(tài)。

那么我們使用這種方式帶來(lá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)注銷(xiāo)并刪除容器,資源自動(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ò)展。 是不是以前我們面臨的種種問(wèn)題在 Kubernetes 集群環(huán)境下面是不是都沒(méi)有了啊?看上去非常完美。

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)都是可以的。接下來(lái)我們就分別來(lái)介紹下如何在 Kubernetes 集群中為 Jenkins 提供動(dòng)靜態(tài) Agent 節(jié)點(diǎn)。

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

首先在 Jenkins 頁(yè)面 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 名稱(chēng),進(jìn)入節(jié)點(diǎn)詳情頁(yè)面,在詳情頁(yè)面我們將獲取到運(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)詳情頁(yè)面獲取到的信息,然后我們將這個(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 映射了。

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

$ 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

接下來(lái)我們?cè)賱?chuàng)建一個(gè) Pipeline 類(lèi)型的作業(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)建來(lái)執(zhí)行這個(gè)流水線,然后我們可以查看這個(gè)流水線的執(zhí)行結(jié)果:

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

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

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

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

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

kubernetes plugin

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

new kubernetes plugin config

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

kubernetes plugin config

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

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ù)名填寫(xiě),包括下面的 Jenkins 通道,默認(rèn)是 50000 端口(要注意是 TCP,所以不要填寫(xiě) http):

jenkins url

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

測(cè)試

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

在 Jenkins 首頁(yè)點(diǎn)擊 新建任務(wù),創(chuàng)建一個(gè)測(cè)試的任務(wù),同樣還是選擇 Pipeline 類(lèi)型的任務(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ù)雜了,通過(guò)一個(gè) kubernetes 屬性來(lái)指定這個(gè)流水線的運(yùn)行環(huán)境,然后通過(guò) yaml 屬性來(lái)定義這個(gè)運(yùn)行 Pod 的清單文件,這里我們定義的是一個(gè)簡(jiǎn)單的 Pod,然后我們將這個(gè) Pod 部署到 kube-ops 這個(gè)命名空間中,這樣我們就可以在這個(gè) Pod 中運(yùn)行我們的 Jenkins Slave 了,需要注意 cloud 后面的值需要和前面我們定義的 Cloud 服務(wù)名稱(chēng)一致。

最后點(diǎn)擊保存,同樣我們可以點(diǎn)擊左側(cè)的 立即構(gòu)建 來(lái)執(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í)行的過(guò)程中我們也可以觀察 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é)任編輯:姜華 來(lái)源: k8s技術(shù)圈
相關(guān)推薦

2010-03-04 10:17:57

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

2021-04-22 06:15:59

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

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)類(lèi)

2021-09-13 07:53:30

安全

2020-10-29 09:56:23

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

2019-10-17 21:14:08

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

2022-10-17 10:35:34

DevOpsCICD

2023-02-10 10:54:48

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-07 10:00:39

2021-03-04 08:14:37

Java8開(kāi)發(fā)接口

2020-04-09 15:23:19

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

2015-07-17 10:25:43

kubernetesDocker集群系統(tǒng)

2021-06-05 06:52:16

Kubernetes

2020-12-10 10:11:52

Javastatic關(guān)鍵字

2017-08-23 11:10:44

Kubernetes 調(diào)度詳解
點(diǎn)贊
收藏

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