以 NFS 為存儲卷的示例,將在 NFS 存儲卷上創建 Jenkins 目錄,然后創建 NFS 類型的 PV、PVC。
1、NFS 存儲卷創建 Jenkins 目錄
進入 NFS Server 服務器,然后再其存儲目錄下創建 Jenkins 目錄,並且確保目錄對其它用戶有讀寫權限。
$ mkdir /nfs/data/jenkins
2、創建 Jenkins 用於存儲的 PV、PVC
創建 Kubernetes 的 PV、PVC 資源,其中 PV 用於與 NFS 關聯,需要設置 NFS Server 服務器地址和掛載的路徑,修改占用空間大小。而 PVC 則是與應用關聯,方便應用與 NFS 綁定掛載,下面是 PV、PVC 的資源對象 yaml 文件。
jenkins-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins
labels:
app: jenkins
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
mountOptions: #NFS掛載選項
- hard
- nfsvers=4.1
nfs: #NFS設置
path: /nfs/data/jenkins # 根據上一步的地址來定
server: 192.168.2.11 # 根據nfs server ip實際來設置
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi #存儲空間大小
selector:
matchLabels:
app: jenkins
將 PV 與 PVC 部署到 Kubernetes 中:
- -n:指定 namespace
$ kubectl apply -f jenkins-storage.yaml -n public
3、創建 ServiceAccount & ClusterRoleBinding
Kubernetes 集群一般情況下都默認開啟了 RBAC 權限,所以需要創建一個角色和服務賬戶,設置角色擁有一定權限,然后將角色與 ServiceAccount 綁定,最后將 ServiceAccount 與 Jenkins 綁定,這樣來賦予 Jenkins 一定的權限,使其能夠執行一些需要權限才能進行的操作。這里為了方便,將 cluster-admin 綁定到 ServiceAccount 來保證 Jenkins 擁有足夠的權限。
- 注意: 請修改下面的 Namespace 參數,改成部署的 Jenkins 所在的 Namespace。
jenkins-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin #ServiceAccount名
namespace: mydlqcloud #指定namespace,一定要修改成你自己的namespace
labels:
name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins-admin
labels:
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: mydlqcloud
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
將 Jenkins 的 RBAC 部署到 Kubernetes 中:
- -n:指定 namespace
$ kubectl apply -f jenkins-rbac.yaml -n public
4、創建 Service & Deployment
在 Kubernetes 中部署服務需要部署文件,這里部署 Jenkins 需要創建 Service 與 Deployment 對象,其中兩個對象需要做一些配置,如下:
- Service:Service 暴露兩個接口
8080
與50000
,其中 8080 是 Jenkins API 和 UI 的端口,而 50000 則是供代理使用的端口。 - Deployment: Deployment 中,需要設置容器安全策略為
runAsUser: 0
賦予容器以Root
權限運行,並且暴露8080
與50000
兩個端口與 Service 對應,而且還要注意的是,還要設置上之前創建的服務賬戶 “jenkins-admin”。
jenkins-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080 #服務端口
targetPort: 8080
nodePort: 32001 #NodePort方式暴露 Jenkins 端口
- name: jnlp
port: 50000 #代理端口
targetPort: 50000
nodePort: 32002
selector:
app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
labels:
app: jenkins
spec:
selector:
matchLabels:
app: jenkins
replicas: 1
template:
metadata:
labels:
app: jenkins
spec:
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: jenkins/jenkins:2.204.6
securityContext:
runAsUser: 0 #設置以ROOT用戶運行容器
privileged: true #擁有特權
ports:
- name: http
containerPort: 8080
- name: jnlp
containerPort: 50000
resources:
limits:
memory: 2Gi
cpu: "2000m"
requests:
memory: 2Gi
cpu: "2000m"
env:
- name: LIMITS_MEMORY
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Mi
- name: "JAVA_OPTS" #設置變量,指定時區和 jenkins slave 執行者設置
value: "
-Xmx$(LIMITS_MEMORY)m
-XshowSettings:vm
-Dhudson.slaves.NodeProvisioner.initialDelay=0
-Dhudson.slaves.NodeProvisioner.MARGIN=50
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
-Duser.timezone=Asia/Shanghai
"
- name: "JENKINS_OPTS"
value: "--prefix=/jenkins" #設置路徑前綴加上 Jenkins
volumeMounts: #設置要掛在的目錄
- name: data
mountPath: /var/jenkins_home
volumes:
- name: data
persistentVolumeClaim:
claimName: jenkins #設置PVC
參數說明:
- JAVA_OPTS: JVM 參數設置
- JENKINS_OPTS: Jenkins 參數設置
- 其它參數: 默認情況下,Jenkins 生成代理是保守的。例如,如果隊列中有兩個構建,它不會立即生成兩個執行器。它將生成一個執行器,並等待某個時間釋放第一個執行器,然后再決定生成第二個執行器。Jenkins 確保它生成的每個執行器都得到了最大限度的利用。如果你想覆蓋這個行為,並生成一個執行器為每個構建隊列立即不等待,所以在 Jenkins 啟動時候添加這些參數:
-Dhudson.slaves.NodeProvisioner.initialDelay=0
-Dhudson.slaves.NodeProvisioner.MARGIN=50
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
有了上面的部署文件后,再將 Jenkins 部署到 Kuberntes 中:
- -n:指定應用啟動的 namespace
$ kubectl create -f jenkins-deployment.yaml -n mydlqcloud
5、獲取 Jenkins 生成的 Token
在安裝 Jenkins 時候,它默認生成一段隨機字符串在控制台日志中,用於安裝時驗證。這里需要獲取它輸出在控制台中的日志信息,來獲取 Token 字符串。
查看 Jenkins Pod 啟動日志
- -n:指定應用啟動的 namespace
$ kubectl logs $(kubectl get pods -n mydlqcloud | awk '{print $1}' | grep jenkins) -n mydlqcloud
在日志中可以看到,默認給的token為:
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
96b19967a2aa4e7ab7d2ea5c6f55db8d
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
6、啟動 Jenkins 進行初始化
輸入 Kubernetes 集群地址和 Jenkins Service 設置的 NodePort 端口號,訪問 Jenkins UI 界面進行初始化,按以下步驟執行:
進入Jenkins
輸入 Kubernetes 集群地址和上面設置的 Nodeport
方式的端口號 32001
,然后輸入上面獲取的 Token
字符串。例如,本人 Kubernetes 集群 IP 為 192.168.2.11
,所以就可以訪問地址 http://192.168.2.11:32001/jenkins
進入 Jenkins 初始化界面。