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-11為1,7-12的myid為2,7-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
繼續安裝失敗的外掛即可。