轉載至我的博客https://www.infrastack.cn ,公眾號:架構成長指南 大家好,我是蝸牛哥,好多開發人員,尤其是沒接觸過 k8s 的人員對如何在k8s中部署一個 前後端應用很模糊,不知如何下手,所以本篇講一下如何快速在 k8s 部署一個前後端應用,讓大家對k8s有個快速認識 前置依 ...
轉載至我的博客https://www.infrastack.cn ,公眾號:架構成長指南
大家好,我是蝸牛哥,好多開發人員,尤其是沒接觸過 k8s 的人員對如何在k8s中部署一個 前後端應用很模糊,不知如何下手,所以本篇講一下如何快速在 k8s 部署一個前後端應用,讓大家對k8s有個快速認識
前置依賴
- k8s集群,如果沒有安裝,請參考k8s 部署手冊
- kubectl ,客戶端部署需要依賴
應用鏡像構建
應用鏡像構建不用自己去執行,相關鏡像已經推送到 docker hub倉庫,如果要瞭解過程和細節,可以看一下,否則直接跳到k8s yaml 文件配置章節
Java應用鏡像構建
代碼地址:https://github.com/dongweizhao/backend
Java應用打包
調用sh package.sh
會執行mvn的package命令,進行打包
編寫Dockerfile
從target目錄複製可執行jar
FROM openjdk:8-jre
COPY target/backend-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT java -jar ${JAVA_OPTS} /app.jar
鏡像打包推送
執行sh push.sh
推送至dockerhub倉庫,鏡像地址:dweizhao/backend:latest
前端應用鏡像構建
代碼地址:https://github.com/dongweizhao/frontend
前端項目結構如下
採用百度低代碼平臺amis進行開發
編寫Dockerfile
拷貝前端工程dist目錄至/frontend
,併進行目錄授權
from nginx
copy ./dist /frontend
run chown nginx.nginx /frontend -R
copy nginx.conf /etc/nginx/conf.d/default.conf
編寫nginx.conf文件
server{
listen 80;
server_name localhost;
root /frontend;
index index.html index.htm;
location /login {
try_files $uri $uri/ /login.html;
}
}
推送鏡像
執行sh push.sh
推送dockerhub倉庫,鏡像地址:dweizhao/frontend:latest
k8s yaml文件配置
以下是我們部署的服務在k8s 中路由示意圖
後端服務配置
backend-dp.yaml
由於我們服務是無狀態服務,使用Deployment進行部署,Deployment擁有更加靈活強大的升級、回滾功能,並且支持滾動更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
selector:
matchLabels:
app: backend
replicas: 1
template:
metadata:
labels:
# service 會根據此標簽來查找此pod
app: backend
version: latest
spec:
containers:
- name: backend
image: "dweizhao/backend:latest"
imagePullPolicy: Always
backend-svc.yaml
Service相當於Spring cloud中Ribbon的作用,提供了服務發現和負載均衡的功能,而不用關心具體服務實例有多少個,在 k8s 的服務實例就是Pod,這裡我們使用ClusterIP
類型,因為是通過Ingress在集群內訪問,通過 app:backend
標簽,來查找對應 pod,所以 pod 的label 必須包含app:backend
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
type: ClusterIP
ports:
- name: backend-http
port: 8080
targetPort: 8080
protocol: TCP
selector:
# 根據標簽查找 pod
app: backend
前端服務配置
frontend-dp.yaml
前端鏡像是一個 nginx的,
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
selector:
matchLabels:
app: frontend
replicas: 1
template:
metadata:
labels:
# service 會根據此標簽來查找此pod
app: frontend
version: latest
spec:
containers:
- name: frontend
image: "dweizhao/frontend:latest"
imagePullPolicy: Always
frontend-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
type: ClusterIP
ports:
- name: frontend-http
port: 80
targetPort: 80
protocol: TCP
selector:
# 根據標簽查找 pod
app: frontend
Ingress配置
Ingress相當於nginx 的作用,匹配url轉發請求至Service
註意:k8s不同的版本,對應的Ingress apiVerson 有點細微差別,所以要找到對應k8s版本的Ingress,我們的 k8s 版本為
v1.25.13
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
ingressClassName: nginx
rules:
- host: k8sdemo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
#backend開頭的 url,轉發到後端服務 ,否則都轉發到前端服務
- path: /backend
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080
k8s部署
部署使用 kubectl 進行部署,如果沒有請先安裝,安裝完成以後,把以上yaml文件保存至本地
創建命名空間
kubectl create namespace k8sdemo
部署
部署系統至k8sdemo
空間下
kubectl create namespace k8sdemo && kubectl apply -f backend-dp.yaml -f backend-svc.yaml -f frontend-dp.yaml -f frontend-svc.yaml -f ingress.yaml -n k8sdemo
查看系統狀態
#查看pod 啟動狀態
kubectl get pods -n k8sdemo
# 查看服務狀態
kubectl get svc -n k8sdemo
# 查看Ingress狀態
kubectl get ingress -n k8sdemo
host 解析
在 hosts 文件中,對k8sdemo.com
功能變數名稱映射,映射到k8s 的任意 node 節點上即可,假設IP為172.18.2.53
,配置如下
172.18.2.53 k8sdemo.com
測試
在瀏覽器訪問k8sdemo.com
,如果出現以下結果則部署成功,可以看到正確請求到數據,這個數據為backend
提供
總結
以上我們只是簡單演示了下,如何在 k8s 中快速部署一個前後端應用,讓你對在 k8s 操作有一個快速認識,但是此應用如果要在生產使用還要在做些配置,比如探針配置,因為後端服務的啟動,可能是個假啟動,必須要配置探針探活之後,才能讓 service訪問,否則導致請求異常,同時應用有些文件如果需要持久化,還需要配置存儲捲等操作
掃描下麵的二維碼關註我們的微信公眾帳號,在微信公眾帳號中回覆◉加群◉即可加入到我們的技術討論群裡面共同學習。