在安裝 Jenkins 之前,我們先裝一個 kubernetes 的視覺化管理工具,儘管 kubernetes 官方提供了 dashboard UI 介面,但是目前市面上的第三方 UI 庫提供的介面更友好,功能更強大,下面我們要介紹的 Kuboard 就是一款比較優秀的工具,這是由 Jumpserver 團隊開發的。
安裝 Kuboard在 k8s 上,很多軟體都提供了一鍵式安裝方式,前提是有網, Kuboard 也支援一鍵安裝:
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
如果沒有網的話,可以找地方下載 kuboard.yaml 這個檔案,然後再執行,當然裡面的映象也要提前下載好,匯入內網。這裡有一個不夠好的地方就是 kuboard.yaml 預設使用的是 kube-system 名稱空間,建議大家建立一個新的名稱空間,修改檔案內部使用的名稱空間。
安裝完後,預設使用 Service 對外提供服務,如果我們安裝好了 Ingress,也可以使用 Ingress 對外提供服務,預設的服務埠是32567。
執行以下命令獲取 Token:
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
注意裡面的名稱空間,如果我們自己修改了名稱空間,這條命令裡面也要修改一下
eyJhbGciOiJSUzI1NiIsImtpZCI6ImZVbXM5dkI4a0ZtZEtSeDhtcUlob2Exelh4cjNWVTgyTUpnMVFWSlk4cHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tbWN4c3MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhzZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiM2FjZWFjNDYtNTVmOS00OTExLWFkZDYtZDA3NjgyY2UzYWJmIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.ZNTlqYZ2Wp-_ZX8eV7P56tlYOB-viMwZl9g04Hn8PcBPOVVqA5Udsf5xajVjXX-v1x0Gek3hQxZc1ad0MvbFLnQdKeRpbSmbOqg1JPFjB_PybxlaIh15MVrXaEYnociM3YchCE32DpKziHFovJDN2t7mOUlgT5KuJpXydGwuyHrfwbaqRSmOM_spnEonEJrhHh0-1yl48QIARFjHqSOZ868rtm913V9xYPfjJoTZH0yhuSEwwwgsDZABOhw7Lm0lc-Y52I4kWszE1CVkdkTIjAszT_Ir7RCh9WChrz3jsRucJMs9o_RNbZkr3lRQujo4WQpOMNmliL26fSn69qRAqQ
輸入 Token 以後登入
k8s 部署 JenkinsapiVersion: v1kind: Namespacemetadata: name: jenkins---apiVersion: v1kind: ServiceAccountmetadata: name: jenkins namespace: jenkins---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: jenkins-crbroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects:- kind: ServiceAccount name: jenkins namespace: jenkins---apiVersion: apps/v1kind: StatefulSetmetadata: name: jenkins-master namespace: jenkinsspec: replicas: 1 serviceName: jenkins selector: matchLabels: devops: jenkins-master template: metadata: labels: devops: jenkins-master spec: tolerations: - operator: Exists serviceAccount: jenkins initContainers: - name: fix-permissions image: busybox command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"] securityContext: privileged: true volumeMounts: - name: jenkinshome mountPath: /var/jenkins_home containers: - name: jenkins image: jenkinsci/blueocean:latest imagePullPolicy: IfNotPresent ports: - name: http #Jenkins Master Web 服務埠 containerPort: 8080 - name: slavelistener #Jenkins Master 供未來 Slave 連線的埠 containerPort: 50000 volumeMounts: - name: jenkinshome mountPath: /var/jenkins_home volumes: - name: jenkinshome hostPath: path: /usr1/jenkins---apiVersion: v1kind: Servicemetadata: name: jenkins namespace: jenkinsspec: type: NodePort ports: - name: http port: 8080 targetPort: 8080 - name: slavelistener port: 50000 targetPort: 50000 selector: devops: jenkins-master---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: jenkins-web namespace: jenkins annotations: Kubernetes.io/ingress.class: nginxspec: rules: - host: www.jenkins.com http: paths: - path: / backend: serviceName: jenkins servicePort: 8080
簡單描述一下:
建立名稱空間,並增加賬戶管理透過 StatefulSet 建立 Jenkins 服務容器,綁定了持久化儲存卷建立 Service 和 Ingress,透過 Ingress 向外提供服務,Service 內的 NodePort 定義可以去掉安裝完成後,如果配置了 Ingress,我們在當前機器上配置好 hosts,就可以透過 www.jenkins.com 去訪問了;如果沒有配置 Ingress,可以透過節點和埠去訪問,執行以下命令查詢 NodePort 埠:
kubectl get service -n jenkins
訪問登入頁面
然後透過以下命令查詢管理員密碼:
kubectl get pod -n jenkinskubectl exec jenkins-master-0 -n jenkins -- cat /var/jenkins_home/secrets/initialAdminPassword
登入以後可以按照這篇文章進行配置:Jenkins安裝配置
Jenkins 整合 kubernetes (重點)在使用 Jenkins 的過程中,我們不可能只使用一個 master 節點,必定是要使用多個節點組成叢集,傳統的 Jenkins 叢集需要固定節點,而 kubernetes 的使用將使我們的叢集更加靈活,可以即用即走,只有 master 節點需要長期存在,其他節點使用時建立,使用完銷燬,合理的利用了資源,又不浪費資源。
安裝 kubernetes 外掛在 Jenkins 中安裝外掛 kubernetes,只安裝這一個,其他的就附帶安裝了。
安裝完以後,我們在新增節點的地方使用。
配置地址資訊kubernetes 地址:這裡的地址我們可以透過以下命令去查詢kubectl get nodes -v=7
這裡就是我們 kubernetes 的地址,叢集內部和外部都可以使用。但是因為我們的 Jenkins 是部署在叢集內部的, 所以我們可以使用 kubernetes 的服務發現機制來配置。在 kubernetes 中對外提供 API 服務的是:
kubectl get svc# kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40d
在 default 名稱空間下,有一個 kubernetes 的 Service,因此在叢集內部根據 kubernetes 的路由規則可以採用 kubernetes.default 的方式訪問 API,所以這裡的配置可以是:https://kubernetes.default 和 https://192.168.143.130:6443
Kubernetes 名稱空間:jenkins服務證書:安裝 Jenkins 的時候已經指定過 serviceaccount,所以這裡不用填Jenkins 地址:http://jenkins:8080Jenkins 通道:jenkins:5000配置 Pod Template名稱: jnlp-slave名稱空間:jenkins標籤列表:jnlp-slave,作為 agent 的label 選擇使用連線 jenkins 的超時時間(秒):300節點選擇器:agent=true,選擇指定標籤的機器排程工作空間卷:可以使用共享儲存,也可以使用臨時的這裡我們沒有選擇映象,預設會使用 jnlp-slave 的映象,當我們設定映象後,預設映象就不使用了,必須填寫
製作工具容器我們在使用 Pod 作為容器執行機,實際是就是使用 Docker 容器作為 Jenkins 的節點,因為很多時候我們在 Jenkins 的任務中是要製作映象的,所以需要製作一個工具集合的容器。
FROM alpineUSER rootRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && apk update && apk add --no-cache openrc docker git curl tar gcc g++ make bash shadow openjdk8 py-pip python3-dev openssl-dev libffi-dev libstdc++ harfbuzz nss freetype ttf-freefont && mkdir -p /root/.kube && usermod -a -G docker rootCOPY requirements.txt /COPY config /root/.kube/RUN pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r /requirements.txtRUN rm -rf /var/cache/apk/* && rm -rf ~/.cache/pip#----安裝 kubectl----COPY kubectl /usr/local/bin/RUN chmod -x /usr/local/bin/kubectl
建立一個目錄,用來存放製作檔案
mkdir toolscd tools# 複製 kubectl 檔案和配置檔案到當前目錄cp 'which kubectl' .cp ~/.kube/config .
執行映象製作命令
docker build -t 192.168.143.130:5000/jnlp-tools:latest .docker push 192.168.143.130:5000/jnlp-tools:latest
然後我們在節點配置裡,把映象配置上
在 tools 容器中我們可能要執行 docker 命令,所以要掛載本機的 /var/run/docker.sock 檔案
kubernetes 搭建 sonarqube 掃描環境apiVersion: v1kind: Servicemetadata: name: sonarqube namespace: jenkins labels: app: sonarqubespec: ports: - name: sonarqube port: 9000 targetPort: 9000 protocol: TCP selector: app: sonarqube---apiVersion: apps/v1kind: Deploymentmetadata: namespace: jenkins name: sonarqube labels: app: sonarqubespce: replicas: 1 selector: matchLabels: app: sonarqube template: metadata: labels: app: sonarqube spec: nodeSelector: sonar: true initContainers: - name: elasticsearch-logging-init image: alpine: 3.6 command: - /sbin/sysctl - -w - vm.max_map_count=262144 resources: {} securityContext: privileged: true containers: - name: sonarqube image: sonarqube: 7.9.5-community ports: - containerPort: 9000 env: - name: SONARQUBE_JDBC_USERNAME value: root - name: SONARQUBE_JDBC_PASSWORD value: 123456 - name: SONARQUBE_JDBC_URL value: "jdbc: mysql://ip:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" livenessProbe: httpGet: path: /sessions/new port: 9000 initialDelaySeconds: 60 periodSeconds: 30 readinessProbe: httpGet: path: /sessions/new port: 9000 initialDelaySeconds: 60 periodSeconds: 30 failureThreshold: 6 resources: limits: cpu: 2000m memory: 4096Mi requests: cpu: 300m memory: 512Mi volumes: - name: sonarqube-data hostPath: path: /opt/sonarqube/data - name: sonarqube-logs hostPath: path: /opt/sonarqube/logs---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: sonarqube namespace: jenkinsspec: rules: - host: www.sonar.com http: paths: - path: / backend: serviceName: sonarqube servicePort: 9000
小技巧:
匯出 Jenkins 已安裝外掛列表# 賬號:admin,密碼:123456,Jenkins-master地址:xx.xx.xx.xxcurl -sSL "http://admin:[email protected]:8080/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1:\2\n/g'|sed 's/ /:/' > plugins.txt
然後在其他安裝了 Jenkins 的機器上執行以下命令,就可以安裝好指定外掛了
/usr/local/bin/install-plugins.sh < plugins.txt