1. 程式人生 > 實用技巧 >k8s交付dubbo微服務之部署Jenkins

k8s交付dubbo微服務之部署Jenkins

Dubbo微服務

Dubbo是什麼?

  • 阿里巴巴開源的,SOA服務化治理方案的核心框架

架構圖

能夠動態擴容的服務放在K8S叢集裡

ZK要放在K8S外面,因為ZK是有狀態的服務,不適合放在K8S叢集裡

以無狀態為榮,以有狀態為恥

沒有狀態的意思是,可以隨便漂移

因為K8S的pod可以自動漂移,如果有狀態的話就麻煩了,因為有狀態的服務有自己的高可用機制,並且可能存在資料持久化的問題。比如etcd,zk,mysql,mq,

開始部署zk

主機名 角色 IP
hdss7-11.host.com k8s代理節點1,zk1 10.4.7.11
hdss7-12.host.com k8s代理節點2,zk2 10.4.7.12
hdss7-21.host.com k8s運算節點1,zk3 10.4.7.21
hdss7-22.host.com k8s運算節點2,Jenkins 10.4.7.21
hdss7-200.host.com k8s運維節點(docker)倉庫 10.4.7.200

部署zookeeper

下載jdk1.8到/opt/src目錄,分別在7-11,7-12,7-21上操作

[root@hdss7-11 ~]# mkdir /opt/src /usr/java
[root@hdss7-11 ~]# cd /opt/src
[root@hdss7-11 src]# tar xf jdk-8u261-linux-x64.tar.gz -C /usr/java/
[root@hdss7-11 src]# cd /usr/java/
[root@hdss7-11 java]# ln -s jdk1.8.0_261/ /usr/java/jdk
[root@hdss7-11 java]# ll
lrwxrwxrwx 1 root  root   13 Aug 26 16:47 jdk -> jdk1.8.0_261/
drwxr-xr-x 8 10143 10143 273 Jun 18 14:59 jdk1.8.0_261

配置環境變數

[root@hdss7-11 java]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

下載zookeeper到/opt/src目錄下,分別在7-11,7-12,7-21上操作

[root@hdss7-11 src]# tar xf zookeeper-3.4.14.tar.gz -C /opt/
[root@hdss7-11 src]# cd ..
[root@hdss7-11 opt]# ln -s zookeeper-3.4.14/ zookeeper

建立相應的目錄

[root@hdss7-11 opt]# mkdir -p /data/zookeeper/data /data/zookeeper/logs

建立zoo.cfg檔案

[root@hdss7-11 conf]# pwd
/opt/zookeeper/conf
[root@hdss7-11 conf]# rm -rf zoo_sample.cfg

[root@hdss7-11 conf]# vim zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
server.1=zk1.od.com:2888:3888
server.2=zk2.od.com:2888:3888
server.3=zk3.od.com:2888:3888
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

修改named配置檔案,序號前滾一個,新增zk的相關記錄(這一步只在7-11上操作一遍即可)

               2020080106; serial
zk1              A 10.4.7.11
zk2              A 10.4.7.12
zk3              A 10.4.7.21

重啟named

[root@hdss7-11 conf]# systemctl restart named
[root@hdss7-11 conf]# dig -t A zk1.od.com @10.4.7.11 +short
10.4.7.11

三臺zk主機上新增myid檔案7-1117-12的myid為27-21的為3,使之成為叢集,為什麼要這樣改?請參考官方文件。

[root@hdss7-11 conf]# cd /data/zookeeper/data/
[root@hdss7-11 data]# echo 1 >> myid
[root@hdss7-12 data]# echo 2 >> myid
[root@hdss7-21 data]# echo 3 >> myid

啟動並檢視狀態

[root@hdss7-11 data]# /opt/zookeeper/bin/zkServer.sh start
[root@hdss7-11 data]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

[root@hdss7-12 data]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader

[root@hdss7-21 data]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

可以看到7-12成為了leader,其他兩臺節點成為了follower,繼續檢視埠

[root@hdss7-11 zookeeper]# netstat -nltp | grep 2181
tcp6       0      0 :::2181                 :::*                   LISTEN      63527/java
[root@hdss7-11 zookeeper]# bin/zkCli.sh -server localhost:2181netstat -nltp | grep 2181

重頭戲——安裝Jenkins

在運維主機上

[root@hdss7-200 ~]# docker pull jenkins/jenkins:2.190.3
[root@hdss7-200 ~]# docker images | grep jenkins
jenkins/jenkins           2.190.3          22b8b9a84dbe        9 months ago        568MB
[root@hdss7-200 ~]# docker tag 22b8b9a84dbe harbor.od.com/public/jenkins:v2.190.3
[root@hdss7-200 ~]# docker push !$

官方的jenkins映象不能直接使用,需要做一定的配置

自定義Dockerfile

先生成公鑰和私鑰

[root@hdss7-200 ~]# ssh-keygen -t rsa -b 2048  -C "[email protected]" -N "" -f /root/.ssh/id_rsa

USER是指使用root這個使用者來操作

config.json是遠端倉庫的登入資訊

ADD get-docker.sh /get-docker.sh:非常重要,要在Jenkins裝一個docker的客戶端?為什麼要在Jenkins裝一個docker的客戶端,因為Jenkins要執行docker build,因為我們需要把映象拉下來打包成jar包,打包完成之後要把它變成docker映象,是需要依賴於docker引擎的,但是我們又不能在Jenkins安裝docker引擎,只能依賴於宿主機的docker引擎。

echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && get-docker.sh,這一步是優化客戶端的config,取消指紋驗證(yes/no)

[root@hdss7-200 ~]# cd /data/dockerfile
[root@hdss7-200 dockerfile]# mkdir jenkins
[root@hdss7-200 dockerfile]# cd jenkins/
[root@hdss7-200 jenkins]# vim Dockerfile

dockerfile檔案內容

FROM harbor.od.com/public/jenkins:v2.190.3
USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ 
    echo 'Asia/Shanghai' >/etc/timezone
ADD id_rsa /root/.ssh/id_rsa
ADD config.json /root/.docker/config.json
ADD get-docker.sh /get-docker.sh
RUN echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&\
    /get-docker.sh

拷貝私鑰和config.json

[root@hdss7-200 jenkins]# cp /root/.docker/config.json .
[root@hdss7-200 jenkins]# ll
total 12
-rw------- 1 root root  238 Aug 26 18:16 config.json
-rw-r--r-- 1 root root  350 Aug 26 18:12 Dockerfile
-rw------- 1 root root 1679 Aug 26 18:15 id_rsa
[root@hdss7-200 jenkins]# curl -fsSL get.docker.com -o get-docker.sh
[root@hdss7-200 jenkins]# chmod +x get-docker.sh

在harbor.od.com頁面建立infra這個私有倉庫

開始構建docker映象

[root@hdss7-200 jenkins]# docker build . -t harbor.od.com/infra/jenkins:v2.190.3
.........................................................
Successfully built d03c7e059f0d
Successfully tagged harbor.od.com/infra/jenkins:v2.190.3

這裡會比較耗時,而且不容易成功,主要是網路的原因,如果一直卡住超過20分鐘,基本可以選擇重試了。

回顧構建制作Jenkins的docker映象做了哪些事情
  • 設定了容器啟動時使用的使用者為root
  • 設定容器時區為東八區
  • 加入了ssh私鑰(拉取git程式碼的兩種方式,基於http和基於ssh)
  • 加入登入harbor的config檔案
  • 修改了ssh客戶端的配置
  • 安裝了一個docker客戶端

建立kubernetes名稱空間

因為Jenkins也是要單獨的放到k8s的名稱空間,讓它的名稱空間只執行運維相關的的基礎設施服務。

注意,現在要把Jenkins交付到infra空間,因為infra是私有倉庫,它需要從harbor的私有倉庫去拉取映象,如果只是docker login是不夠的,一定要做以下步驟。

在任意一個運算節點(7-21,7-22)

[root@hdss7-21 ~]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n infra

然後去dashboard檢視

一般來講,secret資源分為三種類型。

  • generate:通用型
  • docker-registry
  • TLS型的

準備共享儲存

體驗k8s pod資源是如何共享資料的,因為有些運算節點的服務需要持久化資料的,比如Jenkins,然後我們把持久化的資料掛在運算節點外邊,這樣不論是Jenkins在哪個運算節點啟動,它掛的資料都在外邊。

運維主機,以及所有運算節點上:

yum install nfs-utils -y

在運維主機上

[root@hdss7-200 jenkins]# vim /etc/exports

/data/nfs-volume 10.4.7.0/24(rw,no_root_squash)

[root@hdss7-200 jenkins]# mkdir /data/nfs-volume
[root@hdss7-200 jenkins]# systemctl start nfs
[root@hdss7-200 jenkins]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

怎麼能夠使用這個nfs呢?

是在Jenkins的資源配置清單裡

[root@hdss7-200 jenkins]# cd /data/k8s-yaml/
[root@hdss7-200 k8s-yaml]# mkdir jenkins

開始準備Jenkins的資源配置清單,需要deployment、service、ingress配置清單

dp.yaml

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: jenkins
  namespace: infra
  labels: 
    name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels: 
      name: jenkins
  template:
    metadata:
      labels: 
        app: jenkins 
        name: jenkins
    spec:
      volumes:
      - name: data
        nfs: 
          server: hdss7-200
          path: /data/nfs-volume/jenkins_home
      - name: docker
        hostPath: 
          path: /run/docker.sock
          type: ''
      containers:
      - name: jenkins
        image: harbor.od.com/infra/jenkins:v2.190.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          protocol: TCP
        env:
        - name: JAVA_OPTS
          value: -Xmx512m -Xms512m
        volumeMounts:
        - name: data
          mountPath: /var/jenkins_home
        - name: docker
          mountPath: /run/docker.sock
      imagePullSecrets:
      - name: harbor
      securityContext: 
        runAsUser: 0
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600

可以看到上面,用到了nfs卷,server是7-200,而且也指定了path

    spec:
      volumes:
      - name: data
        nfs: 
          server: hdss7-200
          path: /data/nfs-volume/jenkins_home

還有一個docker卷,掛載的是hostPath,也就是本機,有可能是7-21,也有可能是7-22,看schedule安排在哪個節點上。而掛載的目錄是/run/docker.sock,是Jenkins pod裡面的/run/目錄下的,這是把docker server socket掛載進來了。

這樣Jenkins的docker客戶端就能夠和宿主機的docker服務端進行socket通訊。

      - name: docker
        hostPath: 
          path: /run/docker.sock
          type: ''

而這個imagePullPolicy,有三個選項

  • always:無論如何都要去遠端倉庫拉映象
  • never:無論如何都不去拉
  • IfNotPresent:本地不存在則去遠端倉庫拉

而imagePullSecrets則是上面使用陳述式資源管理命令所建立的secret的名字

kubectl create secret docker-registry harbor ......
        imagePullPolicy: IfNotPresent
        
      imagePullSecrets:
      - name: harbor

svc.yaml

kind: Service
apiVersion: v1
metadata: 
  name: jenkins
  namespace: infra
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: jenkins

targetPort: 8080,這是容器裡跑的埠

port: 80,監聽在cluster-ip的埠,相當於是把容器的8080埠對映到了叢集網路的80埠

因此,這個80埠要和下面的ingress的埠要匹配上。

ingress.yaml

kind: Ingress
apiVersion: extensions/v1beta1
metadata: 
  name: jenkins
  namespace: infra
spec:
  rules:
  - host: jenkins.od.com
    http:
      paths:
      - path: /
        backend: 
          serviceName: jenkins
          servicePort: 80

建立jenkins目錄

[root@hdss7-200 jenkins]# mkdir /data/nfs-volume/jenkins_home

回到運算節點7-21上

[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/jenkins/dp.yaml
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/jenkins/svc.yaml
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/jenkins/ingress.yaml

檢視pod資源

[root@hdss7-21 ~]# kubectl get all -n infra
NAME                           READY   STATUS    RESTARTS   AGE
pod/jenkins-54b8469cf9-vqw62   1/1     Running   0          66s


NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/jenkins   ClusterIP   192.168.7.170   <none>        80/TCP    55s


NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins   1/1     1            1           67s

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/jenkins-54b8469cf9   1         1         1       66s

可以看到掛載目錄jenkins_home目錄已經有檔案了,包括初始化的使用者名稱和密碼

[root@hdss7-200 jenkins]# cd /data/nfs-volume/jenkins_home/
[root@hdss7-200 jenkins_home]# 
[root@hdss7-200 jenkins_home]# 
[root@hdss7-200 jenkins_home]# ll
total 36
-rw-r--r--  1 root root 1643 Aug 27 11:39 config.xml
-rw-r--r--  1 root root   50 Aug 27 11:37 copy_reference_file.log
-rw-r--r--  1 root root  156 Aug 27 11:37 hudson.model.UpdateCenter.xml
-rw-------  1 root root 1712 Aug 27 11:37 identity.key.enc
-rw-r--r--  1 root root    7 Aug 27 11:37 jenkins.install.UpgradeWizard.state
-rw-r--r--  1 root root  171 Aug 27 11:37 jenkins.telemetry.Correlator.xml
drwxr-xr-x  2 root root    6 Aug 27 11:37 jobs
drwxr-xr-x  3 root root   19 Aug 27 11:37 logs
-rw-r--r--  1 root root  907 Aug 27 11:37 nodeMonitors.xml
drwxr-xr-x  2 root root    6 Aug 27 11:37 nodes
drwxr-xr-x  2 root root    6 Aug 27 11:37 plugins
-rw-r--r--  1 root root   64 Aug 27 11:37 secret.key
-rw-r--r--  1 root root    0 Aug 27 11:37 secret.key.not-so-secret
drwx------  4 root root  265 Aug 27 11:37 secrets
drwxr-xr-x  2 root root   67 Aug 27 11:39 updates
drwxr-xr-x  2 root root   24 Aug 27 11:37 userContent
drwxr-xr-x  3 root root   56 Aug 27 11:37 users
drwxr-xr-x 11 root root 4096 Aug 27 11:37 war

通過web頁面——右邊導航欄容器組——jenkins-xxxx-xxxx——右上角日誌

修改dns記錄,修改的內容如下

[root@hdss7-11 ~]# vim /var/named/od.com.zone

               2020080107; serial
jenkins          A 10.4.7.10

檢查

[root@hdss7-11 ~]# dig -t A jenkins.od.com @10.4.7.11 +short
10.4.7.10

訪問jenkins頁面,安裝外掛可以先跳過,後續可以手動安裝。如果沒有跳出來修改密碼的介面,需要在這裡修改密碼為admin123

修改配置

勾選該選項,允許匿名使用者來訪問

下面這裡取消打勾,產生的結果是允許跨域請求。

點選save進行儲存。

安裝plugins

點選Manage Plugins

然後點選下面的download and install after restart,之後會來到這個頁面

最後,只要有success字樣,就算安裝成功。

如果沒有安裝成功,重新回到之前的頁面,重新搜尋並選擇blue ocean,然後點選下面的download and install after restart繼續安裝失敗的外掛即可。