1.因為我的k8s叢集是使用glusterfs+heketi作為pvc的存儲,是以需提前準備好
2.準備pvc的yaml檔案
jenkins-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: heketi-storage
resources:
requests:
storage: 10Gi
建立PVC,kubectl apply -f jenkins-pvc.yaml -n jenkins (pv由heketi管理的storageclass自動建立)
-n 是屬于你jenkins的命名空間,也可以使用預設的default
如果提示沒有命名空間則建立一個
jenkins-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: jenkins
3.建立ServiceAccount & ClusterRoleBinding
此 kubernetes 叢集用的是 RBAC 安全插件,必須建立權限給一個 ServiceAccount,然後将此 ServiceAccount 綁定到 Jenkins 服務,這樣賦予 Jenkins 服務一定權限執行一些操作,為了友善,這裡将 cluster-admin 綁定到 ServiceAccount 以保證 Jenkins 能擁有一定的權限。
jenkins-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin #ServiceAccount名
namespace: jenkins
labels:
name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: jenkins-admin
labels:
name: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: jenkins
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
kubectl apply -f jenkins-rabc.yaml
4.建立 Service & Deployment
這裡開始部署 Jenkins 服務,建立 Service 與 Deployment,其中 Service 暴露兩個接口 80880 與 50000。而 Deployment 裡面要注意的是要設定上面建立的 ServiceAccount ,并且設定容器安全政策為“runAsUser: 0”以 Root 權限運作容器,而且暴露8080、50000兩個端口。
jenkins-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
labels:
app: jenkins
spec:
selector:
matchLabels:
app: jenkins
replicas: 1
template:
metadata:
labels:
app: jenkins
spec:
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: harbor.aift.ftwhale.com/library/jenkins/jenkins:2.250
securityContext:
runAsUser: #設定以ROOT使用者運作容器
privileged: true #擁有特權
ports:
- name: http
containerPort: 8080
- name: jnlp
containerPort: 50000
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "1Gi"
cpu: "500m"
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 #設定PVC
jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080 #服務端口
targetPort: 8080
nodePort: 28080 #NodePort方式暴露 Jenkins 端口
- name: jnlp
port: 50000 #代理端口
targetPort: 50000
nodePort: 30000
selector:
app: jenkins
參數說明:
- 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
5.部署jenkins
kubectl apply -f jenkins-deployments
kubectl apply -f jenkins-service -n jenkins
6.從日志中檢視密碼并登入jenkins
kubectl log $(kubectl get pod -n jenkins|grep jenkin|awk '{print $1}') -n jenkins
7.插件安裝(可選)
選擇你想要的插件或者預設推薦,第一次可能需要較長的時間,請保持網絡通暢