想要把一個(gè)復(fù)雜的微服務(wù)項(xiàng)目部署到K8S上去较雕,首先我們得學(xué)會(huì)把單個(gè)
SpringBoot
應(yīng)用部署上去。今天我們來(lái)講下如何把SpringBoot
應(yīng)用部署到K8S上去挚币,和使用Docker Compose
部署非常類似亮蒋,希望對(duì)大家有所幫助!
推送鏡像到Docker Hub
之前我們都是自建的鏡像倉(cāng)庫(kù)妆毕,這次我們換種方式慎玖,把鏡像上傳到
Docker Hub
中去。
-
首先我們得注冊(cè)個(gè)
Docker Hub
的賬號(hào)笛粘,Docker Hub
地址:https://hub.docker.com/ 部署應(yīng)用使用之前的
mall-tiny-fabric
項(xiàng)目趁怔,先修改pom.xml
文件,主要是添加Docker Hub
的認(rèn)證信息和修改下鏡像前綴闰蛔,具體內(nèi)容如下痕钢;
<configuration>
<!-- Docker 遠(yuǎn)程管理地址-->
<dockerHost>http://192.168.5.94:2375</dockerHost>
<!-- 添加認(rèn)證信息-->
<authConfig>
<push>
<!--Docker Hub 用戶名-->
<username>macrodocker</username>
<!--Docker Hub 密碼-->
<password>xxx</password>
</push>
</authConfig>
<images>
<image>
<!--修改鏡像前綴為Docker Hub 用戶名-->
<name>macrodocker/${project.name}:${project.version}</name>
</image>
</images>
</configuration>
- 修改完成后使用
package
命令先把鏡像打包到Linux
服務(wù)器图柏,再使用docker:push
命令把鏡像推送到Docker Hub
中去: - 推送成功以后就可以在
Docker Hub
中看到鏡像了序六。
應(yīng)用部署
接下來(lái)我們將把應(yīng)用部署到K8S上去,包含
SpringBoot
應(yīng)用的部署和MySQL
的部署蚤吹。
部署MySQL
- 首先添加配置文件
mysql-deployment.yaml
用于創(chuàng)建Deployment
例诀,具體說明參考注釋即可;
apiVersion: apps/v1
kind: Deployment
metadata:
# 指定Deployment的名稱
name: mysql-deployment
# 指定Deployment的標(biāo)簽
labels:
app: mysql
spec:
# 指定創(chuàng)建的Pod副本數(shù)量
replicas: 1
# 定義如何查找要管理的Pod
selector:
# 管理標(biāo)簽app為mysql的Pod
matchLabels:
app: mysql
# 指定創(chuàng)建Pod的模板
template:
metadata:
# 給Pod打上app:mysql標(biāo)簽
labels:
app: mysql
# Pod的模板規(guī)約
spec:
containers:
- name: mysql
# 指定容器鏡像
image: mysql:5.7
# 指定開放的端口
ports:
- containerPort: 3306
# 設(shè)置環(huán)境變量
env:
- name: MYSQL_ROOT_PASSWORD
value: root
# 使用存儲(chǔ)卷
volumeMounts:
# 將存儲(chǔ)卷掛載到容器內(nèi)部路徑
- mountPath: /var/log/mysql
name: log-volume
- mountPath: /var/lib/mysql
name: data-volume
- mountPath: /etc/mysql
name: conf-volume
# 定義存儲(chǔ)卷
volumes:
- name: log-volume
# hostPath類型存儲(chǔ)卷在宿主機(jī)上的路徑
hostPath:
path: /home/docker/mydata/mysql/log
# 當(dāng)目錄不存在時(shí)創(chuàng)建
type: DirectoryOrCreate
- name: data-volume
hostPath:
path: /home/docker/mydata/mysql/data
type: DirectoryOrCreate
- name: conf-volume
hostPath:
path: /home/docker/mydata/mysql/conf
type: DirectoryOrCreate
- 通過應(yīng)用配置文件來(lái)創(chuàng)建
Deployment
裁着;通過應(yīng)用配置文件來(lái)創(chuàng)建Deployment
繁涂;
kubectl apply -f mysql-deployment.yaml
- 運(yùn)行成功后查詢
Deployment
,發(fā)現(xiàn)mysql-deployment
已經(jīng)就緒二驰;
[macro@linux-local k8s]$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
mysql-deployment 1/1 1 1 38s
nginx-volume-deployment 2/2 2 2 6d5h
- 想要其他
Pod
可以通過服務(wù)名稱訪問MySQL
扔罪,需要?jiǎng)?chuàng)建Service
,添加配置文件mysql-service.yaml
用于創(chuàng)建Service
桶雀;
apiVersion: v1
kind: Service
metadata:
# 定義服務(wù)名稱矿酵,其他Pod可以通過服務(wù)名稱作為域名進(jìn)行訪問
name: mysql-service
spec:
# 指定服務(wù)類型,通過Node上的靜態(tài)端口暴露服務(wù)
type: NodePort
# 管理標(biāo)簽app為mysql的Pod
selector:
app: mysql
ports:
- name: http
protocol: TCP
port: 3306
targetPort: 3306
# Node上的靜態(tài)端口
nodePort: 30306
- 通過應(yīng)用配置文件來(lái)創(chuàng)建
Service
矗积;
kubectl apply -f mysql-service.yaml
- 運(yùn)行成功后查詢
Service
全肮,發(fā)現(xiàn)mysql-service
已經(jīng)暴露在Node的30306
端口上了;
[macro@linux-local k8s]$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d23h
mysql-service NodePort 10.107.189.51 <none> 3306:30306/TCP 7s
nginx-service NodePort 10.101.171.181 <none> 80:30080/TCP 6d2h
- 部署完成后需要新建
mall
數(shù)據(jù)庫(kù)棘捣,并導(dǎo)入相關(guān)表辜腺,表地址:https://github.com/macrozheng/mall-learning/blob/master/document/sql/mall.sql - 這里有個(gè)比較簡(jiǎn)單的方法來(lái)導(dǎo)入數(shù)據(jù)庫(kù),通過
Navicat
創(chuàng)建連接,先配置一個(gè)SSH通道评疗; - 之后我們就可以像在
Linux
服務(wù)器上訪問數(shù)據(jù)庫(kù)一樣訪問Minikube
中的數(shù)據(jù)庫(kù)了测砂,直接添加Minikube
中數(shù)據(jù)庫(kù)IP和端口即可。
部署SpringBoot應(yīng)用
- 首先添加配置文件
mall-tiny-fabric-deployment.yaml
用于創(chuàng)建Deployment
百匆,這里我們可以通過環(huán)境變量來(lái)覆蓋SpringBoot
中的默認(rèn)配置邑彪;
apiVersion: apps/v1
kind: Deployment
metadata:
name: mall-tiny-fabric-deployment
labels:
app: mall-tiny-fabric
spec:
replicas: 1
selector:
matchLabels:
app: mall-tiny-fabric
template:
metadata:
labels:
app: mall-tiny-fabric
spec:
containers:
- name: mall-tiny-fabric
# 指定Docker Hub中的鏡像地址
image: macrodocker/mall-tiny-fabric:0.0.1-SNAPSHOT
ports:
- containerPort: 8080
env:
# 指定數(shù)據(jù)庫(kù)連接地址
- name: spring.datasource.url
value: jdbc:mysql://mysql-service:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
# 指定日志文件路徑
- name: logging.path
value: /var/logs
volumeMounts:
- mountPath: /var/logs
name: log-volume
volumes:
- name: log-volume
hostPath:
path: /home/docker/mydata/app/mall-tiny-fabric/logs
type: DirectoryOrCreate
- 通過應(yīng)用配置文件來(lái)創(chuàng)建
Deployment
;
kubectl apply -f mall-tiny-fabric-deployment.yaml
- 我們可以通過
kubectl logs
命令來(lái)查看應(yīng)用的啟動(dòng)日志胧华;
[macro@linux-local k8s]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mall-tiny-fabric-deployment-8684857dff-pnz2t 1/1 Running 0 47s
mysql-deployment-5dccc96ccf-sfxvg 1/1 Running 0 25m
nginx-volume-deployment-6f6c89976d-nv2rn 1/1 Running 4 6d6h
nginx-volume-deployment-6f6c89976d-tmhc5 1/1 Running 4 6d5h
[macro@linux-local k8s]$ kubectl logs -f mall-tiny-fabric-deployment-8684857dff-pnz2t
- 如果想要從外部訪問
SpringBoot
應(yīng)用寄症,需要?jiǎng)?chuàng)建Service
,添加配置文件mall-tiny-fabric-service.yaml
用于創(chuàng)建Service
矩动;
apiVersion: v1
kind: Service
metadata:
name: mall-tiny-fabric-service
spec:
type: NodePort
selector:
app: mall-tiny-fabric
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
# Node上的靜態(tài)端口
nodePort: 30180
- 通過應(yīng)用配置文件來(lái)創(chuàng)建
Service
有巧;
kubectl apply -f mall-tiny-fabric-service.yaml
- 此時(shí)服務(wù)已經(jīng)暴露到了
Node的30180
端口上了;
[macro@linux-local k8s]$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d23h
mall-tiny-fabric-service NodePort 10.100.112.84 <none> 8080:30180/TCP 5s
mysql-service NodePort 10.107.189.51 <none> 3306:30306/TCP 13m
nginx-service NodePort 10.101.171.181 <none> 80:30080/TCP 6d2h
- 在
Linux
服務(wù)器上悲没,我們可以通過curl
命令來(lái)訪問下項(xiàng)目的Swagger
頁(yè)面篮迎,不過只能查看到返回的一串HTML
代碼。
curl $(minikube ip):30180/swagger-ui.html
外部訪問應(yīng)用
由于使用
Minikube
安裝的K8S Node
處于Linux
服務(wù)器的內(nèi)網(wǎng)環(huán)境示姿,無(wú)法直接從外部訪問甜橱,所以我們需要安裝一個(gè)Nginx
反向代理下才能訪問。
- 首先我們需要安裝
Nginx
栈戳, - 安裝完成后添加一個(gè)
Nginx
的配置文件岂傲,這里我的配置路徑為/mydata/nginx/conf/conf.d/
,用于將mall-tiny.macrozheng.com
域名的訪問代理到K8S
中的SpringBoot
應(yīng)用中去子檀,proxy_pass
為上面curl
使用的路徑镊掖;
server {
listen 80;
server_name mall-tiny.macrozheng.com; #修改域名
location / {
proxy_set_header Host $host:$server_port;
proxy_pass http://192.168.49.2:30180; #修改為代理服務(wù)地址
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 重啟
Nginx
服務(wù),再修改訪問Linux
服務(wù)器的本機(jī)host
文件褂痰,添加如下記錄亩进;
192.168.5.94 mall-tiny.macrozheng.com
- 之后即可直接在本機(jī)上訪問K8S上的
SpringBoot
應(yīng)用了,訪問地址:http://mall-tiny.macrozheng.com/swagger-ui.html
總結(jié)
通過把SpringBoot
應(yīng)用部署到K8S上的一頓操作缩歪,我們可以發(fā)現(xiàn)在K8S上部署和在Docker
上部署有很多相似之處归薛。K8S上很多部署用的腳本,直接翻譯之前使用Docker Compose
的腳本即可匪蝙,非常類似主籍。如果你之前用過Docker
,那么你就可以輕松上手K8S骗污!