首頁>技術>

在安裝 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 部署 Jenkins
apiVersion: 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

26
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 徹底弄懂IO複用:深入瞭解select,poll,epoll