K8s-1-交付dubbo微服務
目錄
5.1.4: 建立base倉庫,準備上傳構建的新基礎映象 47
5.2: dubbo-service-使用Jenkins進行持續構建交付服務的提供者 48
5.3: dubbo-service建立資源配置清單製作pod 69
叢集3個服務小結------------------- 107
一、Dubbo微服務概述
1.1: dubbo介紹
1.2: 部署內容
二、實驗環境架構
2.1: 架構
1.1 架構圖解
1.最上面一排為K8S叢集外服務
1.1 程式碼倉庫使用基於git的gitee
1.2 註冊中心使用3臺zk組成叢集
1.3 使用者通過ingress暴露出去的服務進行訪問
2.中間層是K8S叢集內服務
2.1 jenkins以容器方式執行,資料目錄通過共享磁碟做持久化
2.2 整套dubbo微服務都以POD方式交付,通過zk叢集通訊
2.3 需要提供的外部訪問的服務通過ingress方式暴露
3.最下層是運維主機層
3.1 harbor是docker私有倉庫,存放docker映象
3.2 POD相關yaml檔案建立在運維主機特定目錄
3.3 在K8S叢集內通過nginx提供的下載連線應用yaml配置
1.2 交付說明:
docker雖然可以部署有狀態服務,但如果不是有特別需要,還是建議不要部署有狀態服務
K8S同理,也不建議部署有狀態服務,如mysql,zk等。
因此手動將zookeeper建立叢集提供給dubbo使用
2.2: 有狀態服務和無狀態服務
有狀態---資料需要持久化,不能隨意擴容
有狀態軟體也可以拆分成無狀態(功能)和有狀態部分(資料持久化)
三、部署zookeeper叢集
3.1: zookeeper概述
3.2: 部署zookeeper
叢集分佈:7-11,7-12,7-21
zk是java服務,需要依賴jdk
3.2.1: Jdk下載
Zookeeper依賴於java環境
7-11,7-12,7-21
#上傳解壓
[root@hdss7-11 src]# mkdir /usr/java/ && tar xf /opt/src/jdk-8u221-linux-x64.tar.gz -C /usr/java/
#軟連結
[root@hdss7-11 src]# ln -s /usr/java/jdk1.8.0_221/ /usr/java/jdk
3.2.2: java環境變數
cat >>/etc/profile <<'EOF'
#JAVA HOME
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
EOF
# 使環境變數生效
source /etc/profile
[root@hdss7-11 ~]# java -version
3.2.3: 二進位制安裝zookeeper
#下載地址
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -zxf zookeeper-3.4.14.tar.gz -C /opt/
ln -s /opt/zookeeper-3.4.14/ /opt/zookeeper
建立zk配置檔案:
cat >/opt/zookeeper/conf/zoo.cfg <<'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
server.1=zk1.od.com:2888:3888
server.2=zk2.od.com:2888:3888
server.3=zk3.od.com:2888:3888
EOF
建立相關目錄
mkdir -p /data/zookeeper/data
mkdir -p /data/zookeeper/logs
建立叢集配置—myid
給每個zk不同的myid,以便區分主從
#7-11上
echo 1 > /data/zookeeper/data/myid
#7-12上
echo 2 > /data/zookeeper/data/myid
#7-21上
echo 3 > /data/zookeeper/data/myid
修改dns解析
到7.11上增加dns解析記錄
vi /var/named/od.com.zone
...
zk1 A 10.4.7.11
zk2 A 10.4.7.12
zk3 A 10.4.7.21
systemctl restart named
#驗證結果
~]# dig -t A zk1.od.com +short
10.4.7.11
將zk啟動放進開機自啟動
啟動zk叢集
在每臺zk機器上都執行此操作
/opt/zookeeper/bin/zkServer.sh start
檢查zk啟動情況
~]# ss -ln|grep 2181
tcp LISTEN 0 50 :::2181 :::*
檢查zk叢集情況
[root@hdss7-11 ~]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@hdss7-12 ~]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@hdss7-21 ~]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
準備java執行底包
運維主機上操作
四、部署jenkins服務配置ci流水線
4.1: 部署jenkins
準備映象的操作在7.200運維機上完成jenkins映象
下載官方映象
docker pull jenkins/jenkins:2.190.3
docker tag jenkins/jenkins:2.190.3 harbor.od.com/public/jenkins:v2.190.3
docker push harbor.od.com/public/jenkins:v2.190.3
#生成金鑰
[root@hdss7-200 ~]# ssh-keygen -t rsa -b 2048 -C "[email protected]" -N "" -f /root/.ssh/id_rsa
#生成ssh金鑰,dubbo專案使用git拉程式碼,走的ssh或者http,把私鑰封裝到jenkins映象裡,git伺服器上放著公鑰
cp /root/.ssh/id_rsa /data/dockerfile/jenkins/
自定義Dockerfile
cat >/data/dockerfile/jenkins/Dockerfile <<'EOF'
FROM harbor.od.com/public/jenkins:v2.190.3
#定義啟動jenkins的使用者
USER root
#修改時區為東八區
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo 'Asia/Shanghai' >/etc/timezone
#載入使用者金鑰,使用ssh拉取dubbo程式碼需要
ADD id_rsa /root/.ssh/id_rsa
#載入運維主機的docker配置檔案,裡面包含登入harbor倉庫的認證資訊。
ADD config.json /root/.docker/config.json
#在jenkins容器內安裝docker客戶端,docker引擎用的是宿主機的docker引擎,安裝後就可以使用docker命令了拉取上傳harbor映象
ADD get-docker.sh /get-docker.sh
# 跳過ssh時候輸入yes的互動步驟,並執行安裝docker
RUN echo " StrictHostKeyChecking no" >/etc/ssh/ssh_config &&\
/get-docker.sh –mirror Aliyun
EOF
–mirror Aliyun 可以不寫
獲取docker.sh指令碼:
curl -fsSL get.docker.com -o /data/dockerfile/jenkins/get-docker.sh
chmod u+x /data/dockerfile/jenkins/get-docker.sh
拷貝config.json檔案:
cp /root/.docker/config.json /data/dockerfile/jenkins/
harbor中建立私有倉庫infra
製作映象
cd /data/dockerfile/jenkins/
docker build . -t harbor.od.com/infra/jenkins:v2.190.3
docker push harbor.od.com/infra/jenkins:v2.190.3
容器測試登入gitee
公鑰資訊(pub)貼上進去,測試登入
[root@hdss7-200 jenkins]# docker run --rm harbor.od.com/infra/jenkins:v2.190.3 ssh -i /root/.ssh/id_rsa -T [email protected]
4.2: 準備jenkins執行環境
4.2.1: 專有名稱空間和secret資源
建立專有namespace—為jenkins
建立專有名詞空間infra的目錄是將jenkins等運維相關軟體放到同一個namespace下,便於統一管理以及和其他資源分開
[root@hdss7-21 opt]# kubectl create ns infra
#該空間將jenkins存進去
建立訪問harbor的secret規則
三種secret
三種secret
Tls ,docker-register,token使用的
Secret用來儲存敏感資訊,例如密碼、OAuth 令牌和 ssh key等,有三種類型:
1.Opaque:
base64 編碼格式的 Secret,用來儲存密碼、金鑰等,可以反解,加密能力弱
2.kubernetes.io/dockerconfigjson:
用來儲存私有docker registry的認證資訊。
3..kubernetes.io/service-account-token:
用於被serviceaccount引用,serviceaccout 建立時Kubernetes會預設建立對應的secret
前面dashborad部分以及用過了
建立
訪問docker的私有倉庫,必須要建立專有的secret型別,建立方法如下:
kubectl create secret docker-registry harbor \
--docker-server=harbor.od.com \
--docker-username=admin \
--docker-password=123456 \
-n infra
# 檢視結果
~]# kubectl -n infra get secrets
NAME TYPE DATA AGE
default-token-rkg7q kubernetes.io/service-account-token 3 19s
harbor kubernetes.io/dockerconfigjson 1 12s
dashboar的檢視
解釋命令:
建立一條secret,資源型別是docker-registry,名字是 harbor
並指定docker倉庫地址、訪問使用者、密碼、倉庫名
4.2.1: 準備nfs共享儲存
將jenkins資料存放在k8s叢集之外的共享儲存
jenkins中一些資料需要持久化的,可以使用共享儲存進行掛載:
這裡使用最簡單的NFS共享儲存,因為k8s預設支援nfs模組
如果使用其他型別的共享儲存
運維機部署NFS
#在200主機上
yum install nfs-utils -y
echo '/data/nfs-volume 10.4.7.0/24(rw,no_root_squash)' >>/etc/exports
mkdir -p /data/nfs-volume/jenkins_home
systemctl start nfs
systemctl enable nfs
# 檢視結果
~]# showmount -e
Export list for hdss7-200:
/data/nfs-volume 10.4.7.0/24
node節點安裝nfs
yum install nfs-utils -y
4.2.3: 運維機建立jenkins資源清單
mkdir /data/k8s-yaml/jenkins
建立depeloy清單
有兩個需要注意的地方:
- 掛載了宿主機的docker.sock
使容器內的docker客戶端可以直接與宿主機的docker引擎進行通訊 - 在使用私有倉庫的時候,資源清單中,一定要宣告:
imagePullSecrets:
- name: harbor
cat >/data/k8s-yaml/jenkins/dp.yaml <<EOF
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 #卷名稱,與容器的volume的名稱一樣
nfs: #nfs型別的卷
server: hdss7-200
path: /data/nfs-volume/jenkins_home
- name: docker #名字叫docker的卷
hostPath: #hostpath型別
path: /run/docker.sock #宿主機的檔案,掛載到jenkins
type: ''
containers:
- name: jenkins
image: harbor.od.com/infra/jenkins:v2.190.3
imagePullPolicy: IfNotPresent #映象拉取策略(awlays遠端拉,never本地拉,ifnotpresent本地沒有去遠端倉庫啦)
ports:
- containerPort: 8080
protocol: TCP
env: #環境變數
- name: JAVA_OPTS
value: -Xmx512m -Xms512m
volumeMounts:
- name: data
mountPath: /var/jenkins_home #data卷掛載到該容器路徑
- name: docker
mountPath: /run/docker.sock
imagePullSecrets:
- name: harbor #叫harbor的secret(該映象是私有的)
securityContext:
runAsUser: 0 #root啟動jenkins
strategy:
type: RollingUpdate #滾動升級
rollingUpdate: #滾動升級方法升級jenkins
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7 #留7份jenkins滾動版本
progressDeadlineSeconds: 600 #容器判定啟動時間
EOF
解析:
宣告拉取harbor映象的secret
將容器的jenkins目錄掛載到運維主機
將主機的/run/docker.sock掛載到容器中
選擇jenkins升級方法為滾動升級
建立service清單
cat >/data/k8s-yaml/jenkins/svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: jenkins
namespace: infra
spec:
ports:
- protocol: TCP
port: 80 #監聽在clusterip上的埠,也就是service
targetPort: 8080 #容器埠
selector:
app: jenkins
EOF
建立ingress清單
cat >/data/k8s-yaml/jenkins/ingress.yaml <<EOF
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: jenkins
namespace: infra
spec:
rules:
- host: jenkins.od.com
http:
paths:
- path: /
backend:
serviceName: jenkins
servicePort: 80
EOF
應用jenkins資源配置清單
kubectl create -f http://k8s-yaml.od.com/jenkins/dp.yaml
kubectl create -f http://k8s-yaml.od.com/jenkins/svc.yaml
kubectl create -f http://k8s-yaml.od.com/jenkins/ingress.yaml
#啟動時間很長,等待結果
kubectl get pod -n infra
檢視日誌,最終顯示完整啟動,
配置dns解析
vi /var/named/od.com.zone
jenkins A 10.4.7.10
# 重啟服務
systemctl restart named
[root@hdss7-11 src]# dig -t A jenkins.od.com @10.4.7.11 +short
10.4.7.10
驗證jenkins容器狀態—重要
docker exec -it 8ff92f08e3aa /bin/bash
# 檢視使用者
whoami
# 檢視時區
date
# 檢視是否能用宿主機的docker引擎
docker ps
# 看是否能免密訪問gitee
ssh -i /root/.ssh/id_rsa -T [email protected]
# 是否能訪問是否harbor倉庫
docker login harbor.od.com
#因為在jenkins容器中安裝了docker客戶端,掛載了與宿主機通訊額socket檔案,所以可以在容器執行容器命令
登入jenkins
檢視登入密碼
[root@hdss7-200 jenkins]# cat /data/nfs-volume/jenkins_home/secrets/initialAdminPassword
1e13eed72e2e426ab160746c3685b29a
#跳過外掛
#配置管理員使用者
admin
admin123
替換jenkins外掛源
cd /data/nfs-volume/jenkins_home/updates
sed -i 's#http:\/\/updates.jenkins-ci.org\/download#https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins#g' default.json
sed -i 's#http:\/\/www.google.com#https:\/\/www.baidu.com#g' default.json
Jenkins初始化
瀏覽器訪問http://jenkins.od.com,使用前面的密碼進入jenkins
進入後操作:
跳過安裝自動安裝外掛的步驟
在manage jenkins->Configure Global Security選單中設定
2.1 允許匿名讀:勾選allow anonymous read access
2.2 允許跨域:勾掉prevent cross site request forgery exploits
搜尋並安裝藍海外掛blue ocean
設定使用者名稱密碼為admin:admin123
安全訪問優化
安裝pipine
小結
4.3: 安裝部署maven
4.3.1: 二進位制安裝
200主機
#下載地址
https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz
#下載解壓
wget https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
mkdir /data/nfs-volume/jenkins_home/maven-3.6.1-8u232
tar -zxf apache-maven-3.6.1-bin.tar.gz -C /data/nfs-volume/jenkins_home/maven-3.6.1-8u232
cd /data/nfs-volume/jenkins_home/maven-3.6.1-8u232/apache-maven-3.6.1
mv ./* ..
檢視jenkins-jdk版本
#修改maven打包映象地址
Settings檔案是全域性生效的,pom.xml檔案是寫在編譯的目錄裡.pom檔案優先順序更高
[root@hdss7-200 conf]# vi /data/nfs-volume/jenkins_home/maven-3.6.1-8u232/conf/settings.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
更換maven的編譯環境的jdk版本
3.6版本maven預設是使用環境變數jdk版本
200中進入Jenkins掛載目錄中下載jdk1.7
Maven編譯jdk版本相關的3個檔案
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232/conf/settings.xml
/data/nfs-volume/jenkins_home/workspace/dubbo-demo/dubbo-demo-service/3/pom.xml
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232/bin/mvn
五、交付dubbo服務提供者到k8s
5.1: 製作dubbo微服務的映象
5.1.1: 準備jre底包(7版本有一個7u80)
[root@hdss7-200 jre8]# docker pull docker.io/stanleyws/jre8:8u112 #老王docker官方的映象
[root@hdss7-200 jre8]# docker images |grep jre
stanleyws/jre8 8u112 fa3a085d6ef1 2 years ago 363MB
[root@hdss7-200 jre8]# docker tag fa3a085d6ef1 harbor.od.com/public/jre:8u112
[root@hdss7-200 jre8]# docker push harbor.od.com/public/jre:8u112
5.1.2: 自定義dockerfile
root@hdss7-200 dockerfile]# mkdir jre8
[root@hdss7-200 dockerfile]# cd jre8/
[root@hdss7-200 jre8]# pwd
/data/dockerfile/jre8
自定義dockerfile,基於java環境的類似centos映象(harbor.od.com/public/jre:8u112)
[root@hdss7-200 jre8]# vi Dockfile
FROM harbor.od.com/public/jre:8u112
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo 'Asia/Shanghai' >/etc/timezone
ADD config.yml /opt/prom/config.yml
ADD jmx_javaagent-0.3.1.jar /opt/prom/
WORKDIR /opt/project_dir
ADD entrypoint.sh /entrypoint.sh
CMD ["/entrypoint.sh"]
#workdir—>要求工作目錄為/opt/project_dir
Dockerfile中的WORKDIR指令用於指定容器的一個目錄,容器啟動時執行的命令會在該目錄下執行,相當於設定了容器的工作目錄。
5.1.3: 準備dockerfile提交的檔案
1.準備java-agent的jar包(監控軟體需要用到)
[root@hdss7-200 jre8]# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar -O jmx_javaagent-0.3.1.jar
#通過這個jar包,取jvm資訊(監控資訊)
2.準備config.yml和
[root@hdss7-200 jre8]# vi config.yml
---
rules:
- pattern: '.*'
3.準備entrypoint.sh
[root@hdss7-200 jre8]# vi entrypoint.sh
#!/bin/sh
M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"
#$(hostname -i)pod的ip
#):${M_PORT:-"12346"}:/埠12346,M_PORT變數預設值為- 12346,如果給了值,就用新值
#/opt/prom/config.yml 指定監控規則配置檔案
C_OPTS=${C_OPTS}
#阿波羅監控用
JAR_BALL=${JAR_BALL}
#將當前容器環境變數中叫JAR_BALL環境變數存到變數中去(由資源配置清單提供變數)
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
#jar的包,exec把當前entrypoint程序權給java了.
[root@hdss7-200 jre8]# chmod +x entrypoint.sh #加許可權
5.1.4: 建立base倉庫,準備上傳構建的新基礎映象
構建dubbo微服務的底包並推到harbor倉庫
[root@hdss7-200 jre8]# docker build . -t harbor.od.com/base/jre8:8u112
[root@hdss7-200 jre8]# docker push harbor.od.com/base/jre8:8u112
5.2: dubbo-service-使用Jenkins進行持續構建交付服務的提供者
5.2.1: Jenkins建立流水線
5.2.2: Jenkins構建專案的10個引數
jenkins流水線配置的java專案的十個常用引數:
引數名 | 作用 | 舉例或說明 |
app_name | 專案名 | dubbo_demo_service |
image_name | docker映象名 | app/dubbo-demo-service |
git_repo | 專案的git地址 | |
git_ver | 專案的git分支或版本號 | master |
add_tag | 映象標籤8位+常用時間戳 | 191203_1830 |
mvn_dir | 執行mvn編譯的目錄 | ./ |
target_dir | 編譯產生包的目錄 | ./target |
mvn_cmd | 編譯maven專案的命令 | mvc clean package -Dmaven. |
base_image | 專案的docker底包 | 不同的專案底包不一樣,下拉選擇 |
maven | maven軟體版本 | 不同的專案可能maven環境不一樣 |
mvn clean package -Dmaven.test.skip=true
base/jre7:7u80
base/jre8:8u112
3.6.1-8u232
3.2.5-8u045
2.2.1-6u025
5.2.3: Pipeline Script
上面定義的引數,在script中使用了
pipeline {
agent any
stages {
stage('pull') { //get project code from repo
steps {
sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"
}
}
stage('build') { //exec mvn cmd
steps {
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"
}
}
stage('package') { //move jar file into project_dir
steps {
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"
}
}
stage('image') { //build image and push to registry
steps {
writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.od.com/${params.base_image}
ADD ${params.target_dir}/project_dir /opt/project_dir"""
sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
}
}
}
}
解析
Jenkins的初始目錄是在/data/nfs-volume/jenkins_home/workspace/
#注意:
引數base_image,是容器執行的基礎環境,可以有2個版本,1.7jdk,1.8jdk
docker pull harbor.od.com:180/base/jre8:8u112 ---對應這個地址
#引數:maven,針對了不同mvn打包版本--à對應不同編譯jdk(需要下載)
Pom檔案
#在程式碼目錄中
5.2.4: 宣告引數-構建
mvn clean package -Dmaven.test.skip=true
clean清除本地快取
package 不保留在本地,install 保留在本地
-e 只輸出錯誤
-q 靜默輸出
新增app倉庫(私有)
開始構建
小結:---------------------
整個jenkins構建流程
首先: 製作dubbo微服務基礎映象base
1.使用k8s叢集裡的jenkins容器,建立了一個流水線
2.流水線:拉取了gitee上的dubbo-demo-service的java原始碼包,並使用maven編譯,該maven已經在200主機掛載的jenkins目錄的maven目錄中修改了settings檔案的打包阿里地址
3.打包完原始碼包後,使用jenkins容器的docker給包打個標籤,推送到harbor倉庫
4.下一步是建立資源配置清單,使用這個映象包,安裝到k8s叢集
5.3: dubbo-service建立資源配置清單製作pod
準備資源清單
建立清單操作都在7.200上操作
建立depeloy清單
[root@hdss7-200 dubbo-server]# mkdir /data/k8s-yaml/dubbo-server
cat>/data/k8s-yaml/dubbo-server/dp.yaml <<EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-service
namespace: app
labels:
name: dubbo-demo-service
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-demo-service
template:
metadata:
labels:
app: dubbo-demo-service
name: dubbo-demo-service
spec:
containers:
- name: dubbo-demo-service
image: harbor.od.com/app/dubbo-demo-service:master_191201_1200
ports:
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL #傳遞給容器啟動時的指令碼變數-à環境變數
value: dubbo-server.jar
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor #secret名稱
restartPolicy: Always
terminationGracePeriodSeconds: 30 #啟動超時時間
securityContext:
runAsUser: 0 #0代表root方式啟動
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
應用資源配置清單
建立K8S資源的操作,在任意node節點上操作即可
建立app名稱空間
kubectl create namespace app
建立secret資源
我們的業務映象是harbor中的私有專案,所以需要建立docker-registry的secret資源:
kubectl -n app \
create secret docker-registry harbor \
--docker-server=harbor.od.com \
--docker-username=admin \
--docker-password=123456
應用資源清單
kubectl apply -f http://k8s-yaml.od.com/dubbo-server/dp.yaml
3分鐘後檢查啟動情況
# 檢查pod是否建立:
~]# kubectl -n app get pod
NAME READY STATUS RESTARTS AGE
dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 24s
# 檢查是否啟動成功:
~]# kubectl -n app logs dubbo-demo-service-79574b6879-cxkls --tail=2
Dubbo server started
Dubbo 服務端已經啟動
到zk伺服器檢查是否有服務註冊
sh /opt/zookeeper/bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[dubbo, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /dubbo
[com.od.dubbotest.api.HelloService]
#zookeeper沒有做開機自啟動
到此---dubbo-server服務交付成功(provider)
六、交付dubbo-monitor服務到k8s叢集
dobbo-monitor原始碼地址: https://github.com/Jeromefromcn/dubbo-monitor.git
dubbo-monitor是監控zookeeper狀態的一個服務,另外還有dubbo-admin,效果一樣
6.1: 製作dobbo-monitor映象
製作映象在管理機7.200上操作
下載原始碼
cd /opt/src
wget https://github.com/Jeromefromcn/dubbo-monitor/archive/master.zip
yum -y install unzip
unzip dubbo-monitor-master.zip
mv dubbo-monitor-mster /data/dockerfile/dubbo-monitor
cd /data/dockerfile/dubbo-monitor
修改配置檔案:
直接覆蓋它原始的配置
其實它原本就沒什麼內容,只是修改了addr,埠,目錄等
cat >dubbo-monitor-simple/conf/dubbo_origin.properties <<'EOF'
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=dubbo-monitor
dubbo.application.owner=OldboyEdu
dubbo.registry.address=zookeeper://zk1.od.com:2181?backup=zk2.od.com:2181,zk3.od.com:2181
dubbo.protocol.port=20880
dubbo.jetty.port=8080
dubbo.jetty.directory=/dubbo-monitor-simple/monitor
dubbo.statistics.directory=/dubbo-monitor-simple/statistics
dubbo.charts.directory=/dubbo-monitor-simple/charts
dubbo.log4j.file=logs/dubbo-monitor.log
dubbo.log4j.level=WARN
EOF
優化monitor啟動指令碼
# 修改jvm資源限制(非必須)
sed -i '/Xmx2g/ s#128m#16m#g' ./dubbo-monitor-simple/bin/start.sh
sed -i '/Xmx2g/ s#256m#32m#g' ./dubbo-monitor-simple/bin/start.sh
sed -i '/Xmx2g/ s#2g#128m#g' ./dubbo-monitor-simple/bin/start.sh
sed -i '/Xmx1g/ s#2g#128m#g' ./dubbo-monitor-simple/bin/start.sh
# 修改nohup為exec不能改,去掉改行最後的&符號
sed -ri 's#^nohup(.*) &#exec\1#g' ./dubbo-monitor-simple/bin/start.sh
# 刪除exec命令列後面所有行
sed -i '66,$d' ./dubbo-monitor-simple/bin/start.sh
#複製到/data/dockerfile資料夾
[root@hdss7-200 ~]# cp -a dubbo-monitor /data/dockerfile/
[root@hdss7-200 dubbo-consumer]# cat /data/dockerfile/dubbo-monitor/Dockerfile
FROM jeromefromcn/docker-alpine-java-bash #使用的是官方docker映象
MAINTAINER Jerome Jiang
COPY dubbo-monitor-simple/ /dubbo-monitor-simple/
CMD /dubbo-monitor-simple/bin/start.sh
構建並上傳
docker build . -t harbor.od.com/infra/dubbo-monitor:latest
docker push harbor.od.com/infra/dubbo-monitor:latest
6.2: 建立資源配置清單
準備目錄
mkdir /data/k8s-yaml/dubbo-monitor
cd /data/k8s-yaml/dubbo-monitor
建立deploy資原始檔
cat >dp.yaml <<EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-monitor
namespace: infra
labels:
name: dubbo-monitor
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-monitor
template:
metadata:
labels:
app: dubbo-monitor
name: dubbo-monitor
spec:
containers:
- name: dubbo-monitor
image: harbor.od.com/infra/dubbo-monitor:latest
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
建立service資原始檔
cat >svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: dubbo-monitor
namespace: infra
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: dubbo-monitor
EOF
建立ingress資原始檔
cat >ingress.yaml <<EOF
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: dubbo-monitor
namespace: infra
spec:
rules:
- host: dubbo-monitor.od.com
http:
paths:
- path: /
backend:
serviceName: dubbo-monitor
servicePort: 8080
EOF
6.3: 建立dubbo-miniotr服務
應用資源配置清單
在任意node節點
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/svc.yaml
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/ingress.yaml
驗證:
~]# kubectl -n infra get pod
NAME READY STATUS RESTARTS AGE
dubbo-monitor-d9675688c-sctsx 1/1 Running 0 29s
jenkins-7cd8b95d79-6vrbn 1/1 Running 0 3d2h
新增dns解析
這個服務是有web頁面的,建立了ingress和service資源的,所以需要新增dns解析
vi /var/named/od.com.zone
dubbo-monitor A 10.4.7.10
重啟並驗證
systemctl restart named
dig -t A dubbo-monitor.od.com @10.4.7.11 +short
訪問monitor的web頁面
訪問dubbo-monitor.od.com
這裡已經可以看到我們之前部署的dubbo-demo-service服務了,啟動了兩個程序來提供服務。
至此,dubbo-monitor監控服務已經部署完成。
七、交付dubbo服務消費者到k8s叢集
7.1: 構建docker映象
7.1.1: 獲取私有倉庫程式碼
之前建立的dubbo-service是微服務的提供者,現在建立一個微服務的消費者
使用[email protected]:noah-luo/dubbo-demo-web.git這個私有倉庫中的程式碼構建消費者
先從https://gitee.com/sunx66/dubbo-demo-service這裡fork到自己倉庫,在設為私有
並修改zk的配置
7.1.2: 配置流水線
之前已經在jenkins配置好了流水線,只需要填寫引數就行了。
引數名 | 引數值 |
app_name | dubbo-demo-consumer |
image_name | app/dubbo-demo-consumer |
git_repo | https://gitee.com/jinmuyan222/dubbo-demo-web.git |
git_ver | master |
add_tag | 191201_1800 |
mvn_dir | ./ |
target_dir | ./dubbo-client/target |
mvn_cmd | mvn clean package -e -q -Dmaven.test.skip=true |
base_image,harbor-base映象地址 | base/jre8:8u112 |
maven | 3.6.1 |
#Target_dir目錄為編譯完成專案後,產生的jar/war包所在的目錄,需要問寫程式碼的人
或者看下git包的目錄
https://gitee.com/jinmuyan222/dubbo-demo-web.git
可以將/root/.m2./repository掛載出來,防止pod重啟丟失了
7.1.3: 檢視構建結果
如果構建不報錯,則應該已經推送到harbor倉庫中了,這時我們直接再給映象一個新tag,以便後續模擬更新
docker tag \
harbor.od.com/app/dubbo-demo-consumer:master_200506_1430 \
harbor.od.com/app/dubbo-demo-consumer:master_200510_1430
docker push harbor.od.com/app/dubbo-demo-consumer:master_200510_1430
檢視harbor倉庫
7.2: 準備資源配置清單
先準備目錄
mkdir /data/k8s-yaml/dubbo-consumer
cd /data/k8s-yaml/dubbo-consumer
建立deploy資源清單
cat >dp.yaml <<EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumer
namespace: app
labels:
name: dubbo-demo-consumer
spec:
replicas: 1
selector:
matchLabels:
name: dubbo-demo-consumer
template:
metadata:
labels:
app: dubbo-demo-consumer
name: dubbo-demo-consumer
spec:
containers:
- name: dubbo-demo-consumer
image: harbor.od.com/app/dubbo-demo-consumer:master_191201_1800
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-client.jar
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: harbor
restartPolicy: Always
terminationGracePeriodSeconds: 30
securityContext:
runAsUser: 0
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
EOF
建立service資源清單
cat >svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: dubbo-demo-consumer
namespace: app
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: dubbo-demo-consumer
EOF
建立ingress資源清單
cat >ingress.yaml <<EOF
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: dubbo-demo-consumer
namespace: app
spec:
rules:
- host: dubbo-demo.od.com
http:
paths:
- path: /
backend:
serviceName: dubbo-demo-consumer
servicePort: 8080
EOF
建立K8S資源
應用資源配置清單:
kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/svc.yaml
kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/ingress.yaml
# 檢視容器啟動成功沒
~]# kubectl get pod -n app
NAME READY STATUS RESTARTS AGE
dubbo-demo-consumer-b8d86bd5b-wbqhs 1/1 Running 0 6s
dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h39m
驗證啟動結果
檢視log,是否啟動成功:
kubectl -n app logs --tail=2 dubbo-demo-consumer-b8d86bd5b-wbqhs
Dubbo client started
Dubbo 消費者端啟動
檢查dubbo-monitor是否已經註冊成功:
新增dns解析
vi /var/named/od.com.zone
dubbo-demo A 10.4.7.10
# 重啟服務
systemctl restart named
# 驗證
~]# dig -t A dubbo-demo.od.com @10.4.7.11 +short
10.4.7.10
訪問解析
瀏覽器訪問http://dubbo-demo.od.com/hello?name=lg
消費者端原始碼
提供者端原始碼
訪問地址:dubbo-demo.od.com/hello?name=lg
7.3: 模擬版本升級
接下來我們模擬升級發版,之前已經用同一個映象打了不同的tag並推送到從庫
當然正常發版的順序是:
- 提交修改過的程式碼的程式碼塊
- 使用jenkins構建新映象
- 上傳到私有harbor倉庫中
- 更新de檔案並apply
修改dp.yaml資源配置清單
修改harbor映象倉庫中對應的tag版本:
sed -i 's#master_200506_1430#master_200510_1430#g' dp.yaml
應用修改後的資源配置清單
當然也可以在dashboard中進行線上修改:
kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/dp.yaml
~]# kubectl -n app get pod
NAME READY STATUS RESTARTS AGE
dubbo-demo-consumer-84f75b679c-kdwd7 1/1 Running 0 54s
dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h58m
使用瀏覽器驗證
使用瀏覽器驗證:http://dubbo-demo.od.com/hello?name=lg
在短暫的超時後,即可正常訪問
至此,我們一套完成的dubbo服務就已經交付到k8s叢集當中了,並且也演示瞭如何發版。
小結:-----------------
八、實戰維護dubbo微服務
專案釋出
Add_tag 就是check out 的分支,映象版本名稱
在dashboard改拉取的映象版本
專案回滾
小結-----------
左邊持續整合,右邊持續部署
宿主機宕機測試
- 當一臺宿主機宕,跑在該宿主機的服務將無法訪問
- 此時監控軟體判斷到該宿主機宕了
- 監控觸發指令碼,kubectl delete node hdss7-21(相當於人為確認該主機宕了)
- K8s叢集會自動將宕機節點的服務轉移 .
- 前面的10節點上的負載均衡宕機節點也需要註釋掉.
- Reload nginx
#宕機的主機恢復後,supervisor會自動開啟所有系統服務,
再將標籤打上(沒什麼用)
在宕機節點,開啟擴充服務,再將之前轉移的服務刪掉
#為什麼必須刪除宕機節點,才能恢復?
宕機節點,k8s叢集會認為他是短暫不可達.所以沒恢復.
叢集3個服務小結-------------------
提供者為什麼沒有svc和ingress資源?沒用到,
Zk註冊服務相當於dns,消費者找到註冊中心,檢視有沒有helloworld服務,有的話,註冊中心會給消費者
服務提供者的pod-ip(snat規則優化用到了,給的源地址),消費者再找到提供者ip,完成服務呼叫.
如果註冊中心註冊的不是pod-ip,而是叢集ip,則服務提供者會用到svc資源.
Monitor說明問題了(snat規則優化用到了)