1. 程式人生 > 實用技巧 >SAP ABAP和Java跨域請求問題的解決方案

SAP ABAP和Java跨域請求問題的解決方案

一、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清單

有兩個需要注意的地方:

  1. 掛載了宿主機的docker.sock
    使容器內的docker客戶端可以直接與宿主機的docker引擎進行通訊
  2. 在使用私有倉庫的時候,資源清單中,一定要宣告:

    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地址

https://x.com/x/x.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

 

# 修改nohupexec不能改,去掉改行最後的&符號

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頁面的,建立了ingressservice資源的,所以需要新增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

 

 

訪問monitorweb頁面

訪問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並推送到從庫
當然正常發版的順序是:

  1. 提交修改過的程式碼的程式碼塊
  2. 使用jenkins構建新映象
  3. 上傳到私有harbor倉庫中
  4. 更新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微服務

8.1: 專案釋出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Add_tag 就是check out 的分支,映象版本名稱

在dashboard改拉取的映象版本

 

8.2: 專案回滾

 

 

 

8.3: 小結-----------

 

左邊持續整合,右邊持續部署

 

 

8.4: 宿主機宕機測試

  1. 當一臺宿主機宕,跑在該宿主機的服務將無法訪問
  2. 此時監控軟體判斷到該宿主機宕了
  3. 監控觸發指令碼,kubectl delete node hdss7-21(相當於人為確認該主機宕了)
  4. K8s叢集會自動將宕機節點的服務轉移 .
  5. 前面的10節點上的負載均衡宕機節點也需要註釋掉.
  6. Reload nginx

#宕機的主機恢復後,supervisor會自動開啟所有系統服務,

再將標籤打上(沒什麼用)

在宕機節點,開啟擴充服務,再將之前轉移的服務刪掉

 

#為什麼必須刪除宕機節點,才能恢復?

宕機節點,k8s叢集會認為他是短暫不可達.所以沒恢復.

 

 

九、叢集3個服務小結-------------------

提供者為什麼沒有svc和ingress資源?沒用到,

Zk註冊服務相當於dns,消費者找到註冊中心,檢視有沒有helloworld服務,有的話,註冊中心會給消費者

服務提供者的pod-ip(snat規則優化用到了,給的源地址),消費者再找到提供者ip,完成服務呼叫.

如果註冊中心註冊的不是pod-ip,而是叢集ip,則服務提供者會用到svc資源.

Monitor說明問題了(snat規則優化用到了)