【k8s】java 微服務部署示例


1. 環境

  • k8s:1.20

    k8s-master1 192.168.110.235
    8s-node1 192.168.110.236
    k8s-node2 192.168.110.237
    harbor,nfs 192.168.110.239
  • java:1.8

2. java 微服務部署

2.1 安裝 java jdk1.8

yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel maven

2.2 下載代碼示例:

版本介紹:

  • dev3 分支會 mysql 連接錯誤,暫時無法解決請拋棄
  • dev4 分支是加了 pinpoint APM 服務
  • dev4-skywalking 分支如所見
git clone git@github.com:ZhaoUncle/simple-microservice.git
#切換dev4-skywalking 分支
cd simple-microservice
git checkout remotes/origin/dev4-skywalking

部署須知

  1. 導入db目錄下數據庫文件到自己的MySQL服務器
    • 默認的 db 文件,沒有 use DATABASES;所以會導致報錯,參考 2.4 做法。
  2. k8s/docker_build.sh 這個是部署腳本,可以參考2.6來使用,用來推送 build 好的 images,然后啟動 deployment。
  3. 修改配置環境(xxx-service/src/main/resources/application.yml,active值決定啟用環境配置文件)
    • 默認使用 fat 文件調用 mysql 和 eureka 鏈接,無需更改。
  4. 修改連接數據庫配置(xxx-service/src/main/resources/application-fat.yml)
    • 參考 2.5 做法
  5. 修改前端頁面連接網關地址(portal-service/src/main/resources/static/js/productList.js和orderList.js)
    • 默認無需修改,不過當你訪問 portal,配置的是 ingress 暴露的域名,具體可以看 k8s/目錄下的 yaml 文件。
  6. 服務啟動順序:eureka -> mysql -> product,stock,order -> gateway -> portal
  7. 訪問辦法:
    • kubectl get pod,svc,ing -n ms可以看出是由 nginx-ingress-controller暴露的域名訪問,
    • 綁定 hosts進行訪問,192.168.110.235是我的 master IP,你也可以綁定為 node IP:192.168.110.235 eureka.ctnrs.com gateway.ctnrs.com portal.ctnrs.com

構建 java 命令介紹

mvn clean package -D maven.test.skip=true

mvn clean package:清除目錄中生成的結果,做一個清除,重新打新的包。

-D maven.test.skip: 跳過單元測試,寫的測試用例,如果寫的有問題,是編譯不過去的

2.3 helm 安裝 mysql 介紹

mkdir -p /root/helm/mysql
cd /root/helm/mysql

# vi config.yaml 
persistence: #如果你只是簡單測試,可以把 persistence 這里的所有配置都去掉,只保留 service 的配置即可。
  enabled: true
  storageClass: "managed-nfs-storage"
  accessMode: ReadWriteOnce
  size: 8Gi

service:
  type: NodePort #暴露 nodeport,可以用宿主機 ip+port 訪問
  nodePort: 32000

#helm 創建 db 
helm install db -f config.yaml  stable/mysql

#查看發布狀態,這里會顯示獲取密碼、host、port 的命令,下面那條獲取 root 密碼的命令就是在這里面看到的
helm status db 

#查看mysql 的 root 密碼:
kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo

一步登錄 mysql:這里的命令和下面的一步登錄 mysql 步驟不能與你通用,具體要由上面那條helm status得出,因為 pod name 不一定一樣,如果你創建的不是這個名字的話。

MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
MYSQL_HOST=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
MYSQL_PORT=$(kubectl get svc --namespace default db-mysql -o jsonpath='{.spec.ports[0].nodePort}')
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}

創建結果:

[root@node01 mysql]# kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
W5hcn4PvTI
[root@node01 mysql]# kubectl get pod,svc |grep db-mysql
pod/db-mysql-7f897f4d95-bc7js               1/1     Running     0          80s
service/db-mysql     NodePort    10.0.0.121   <none>        3306:32000/TCP   80s

[root@node01 mysql]# helm list|grep db
db      default         1               2021-04-06 22:04:19.545636699 +0800 CST deployed        mysql-1.6.9     5.7.30     

刪除你所創建的 db 數據庫

helm delete db #kubectl get pod 就會就看不見了

2.4 mysql 登錄然后創建 db 和 tables 數據

MySQL [(none)]> CREATE DATABASE /*!32312 IF NOT EXISTS*/`tb_order` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
MySQL [(none)]> use tb_order;
MySQL [(none)]> source /data/simple-microservice/db/order.sql

MySQL [(none)]> CREATE DATABASE /*!32312 IF NOT EXISTS*/`tb_product` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
MySQL [(none)]> use tb_product;
MySQL [(none)]> source /data/simple-microservice/db/product.sql


MySQL [(none)]> CREATE DATABASE /*!32312 IF NOT EXISTS*/`tb_stock` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
MySQL [(none)]> use tb_stock;
MySQL [(none)]> source /data/simple-microservice/db/stock.sql

雖然 sql 文件介紹說使用的mysql5.6 的版本,但是經過測試 5.7 這里是正常使用,所以你想用 helm 安裝 mysql5.6,可以參考另一篇文章K8s環境 Helm 安裝 mysql 多版本

2.5 修改配置文件密碼和 mysql ip 端口,創建 namesapce

語法介紹:sed -i 's#abc#def#g' filename,將 filename 文件里面所有的 abc 替換成 def。

cd /data/simple-microservice

### 修改 docker_build.sh 里面的 register 為我們創建的 harbor 倉庫地址
sed -i 's#docker_registry=192.168.31.90#docker_registry=192.168.110.239#g' k8s/docker_build.sh 

### 創建 namespace ms
kubectl create namespace ms

### 修改 jdbc 的 mysql 連接
for i in `find ./ -name "application-fat.yml"`;do sed -i 's#mysql:3306#192.168.110.235:32000#g' $i;done


###修改 root 密碼,2.3有告訴我們 root 密碼是多少哦,當然,你也可以進 mysql 或者修改 helm 的 config.yaml 定義自己的初始密碼,這里就不多做介紹了
for i in `find ./ -name "application-fat.yml"`;do  sed -i 's#password: 123456#password: W5hcn4PvTI#g' $i;done

### 我們還要修改 skywalking 的 ip+端口,skywalking 用的是 nodeport 的部署方式,skywalking 盡管在 java 啟動命令中被調用,但是就算不存在,java 服務也不會退出。
for i in `find ./ -name "Dockerfile"`;do  sed -i 's#192.168.31.90:11800#192.168.110.235:11800#g' $i;done


2.6 docker_build.sh 介紹

vi /data/simple-microservice/k8s/docker_build.sh

#!/bin/bash

###這里是 harbor 地址
docker_registry=192.168.110.239  

###創建 harbor 登錄secret,以后就不需要每次都手動登錄了
kubectl create secret docker-registry registry-pull-secret --docker-server=$docker_registry --docker-username=admin --docker-p
assword=Harbor12345 --docker-email=admin@ctnrs.com -n ms

### 下面是構建 mvn jar 包然后上傳到 harbor,在部署 k8s yaml
service_list="eureka-service gateway-service order-service product-service stock-service portal-service"
service_list=${1:-${service_list}}
work_dir=$(dirname $PWD)
current_dir=$PWD

cd $work_dir
mvn clean package -Dmaven.test.skip=true

for service in $service_list; do
   cd $work_dir/$service
   if ls |grep biz &>/dev/null; then
      cd ${service}-biz
   fi
   service=${service%-*}
   image_name=$docker_registry/microservice/${service}:$(date +%F-%H-%M-%S)
   docker build -t ${image_name} .
   docker push ${image_name}
   sed -i -r "s#(image: )(.*)#\1$image_name#" ${current_dir}/${service}.yaml
   kubectl apply -f ${current_dir}/${service}.yaml
done

2.7 部署 ms java 服務

部署:

cd /data/simple-microservice/k8s
sh docker_build.sh

刪除:

cd /data/simple-microservice/k8s
kubectl delete -f *.yaml

部署結果:

[root@node01 k8s]# kubectl get pod,svc,ing -n ms
NAME                           READY   STATUS    RESTARTS   AGE
pod/eureka-0                   0/1     Running   0          3s
pod/eureka-1                   1/1     Running   0          3m2s
pod/eureka-2                   1/1     Running   0          6m53s
pod/gateway-7b47c8d997-znkfx   1/1     Running   0          7m49s
pod/order-59f6d5d786-htxtg     1/1     Running   0          7m36s
pod/portal-6c79b876c9-h8vsd    1/1     Running   0          6m27s
pod/product-8c88fbf8-hm7k6     1/1     Running   0          6m51s
pod/stock-8944b6585-ccp8w      1/1     Running   0          6m51s

NAME              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/eureka    ClusterIP   None         <none>        8888/TCP   6h17m
service/gateway   ClusterIP   10.0.0.113   <none>        9999/TCP   6h17m
service/portal    ClusterIP   10.0.0.104   <none>        8080/TCP   6h15m

NAME                                CLASS    HOSTS               ADDRESS   PORTS   AGE
ingress.networking.k8s.io/eureka    <none>   eureka.ctnrs.com              80      6h17m
ingress.networking.k8s.io/gateway   <none>   gateway.ctnrs.com             80      6h17m
ingress.networking.k8s.io/portal    <none>   portal.ctnrs.com              80      6h15m

由 ing 那里得知,需要綁定的 hosts 如下;

192.168.110.235 eureka.ctnrs.com gateway.ctnrs.com portal.ctnrs.com

image-20210406234746629

image-20210406234940735

image-20210406235002238

image-20210406235023413

3. 接入 skywalking

3.1 Skywalking server 版部署,請參考

K8s環境 Helm部署skywalking

3.2 下載 skywalking 8.4.0版本

我們主要使用 agen 端,一定要與 server 端版本對應

cd /data
wget https://mirror-hk.koddos.net/apache/skywalking/8.4.0/apache-skywalking-apm-es7-8.4.0.tar.gz
tar xf apache-skywalking-apm-es7-8.4.0.tar.gz 

### 這條是刪除命令,你們可別亂來。。。。
for i in `find  /data/simple-microservice/ -name skywalking`;do rm -rf $i && cp -rp /data/apache-skywalking-apm-bin-es7/agent/ $i;done

3.3 修改 Dockerfile 中 java 的啟動命令

之前我們改成了 ip+nodeport 的形式,現在改回去直接 k8s 內部 serviceName+namespace 的訪問形式。

for i in `find ./ -name "Dockerfile"`;do  sed -i 's#192.168.31.90:11800#skywalking-oap.skywalking:11800#g' $i;done

skywalking 的 svc 狀態如下,只要 oap 的接口

[root@node01 k8s]# kubectl get svc -n skywalking
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)               AGE
skywalking-oap   ClusterIP   10.0.0.3     <none>        12800/TCP,11800/TCP   5h22m
skywalking-ui    NodePort    10.0.0.232   <none>        80:30008/TCP          5h22m

3.4 查看 skywalking 的 java 微服務

image-20210412000307837

4. 參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM