天天看點

k8s簡單部署jenkins服務

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

k8s簡單部署jenkins服務
k8s簡單部署jenkins服務

7.插件安裝(可選)

選擇你想要的插件或者預設推薦,第一次可能需要較長的時間,請保持網絡通暢