1、在kubernetes中部署應用程序流程
准備項目源碼-->編譯構建-->產出war包,打包到鏡像中-->推送到鏡像倉庫
獲取源代碼是開發人員提交代碼的代碼托管地址,有Git、SVN、Gitlab等
鏡像分類
1、基礎鏡像:如centos、Ubuntu等 2、環境鏡像:如JDK、Python、go 3、項目鏡像:是將項目打包到里面,基於環境鏡像去打包
為什么自己構建鏡像?
1、特殊環境配置 2、容易排查故障 3、標准化 4、更安全一些
制作Java鏡像
1、安裝編譯基礎環境
yum install -y java-1.8.0-openjdk maven
修改加速下載位置(更換下載源)添加如下內容
vim /etc/maven/settings.xml
152 <mirror> 153 <id>mirrorId</id> 154 <mirrorOf>repositoryId</mirrorOf> 155 <name>Human Readable Name for this Mirror.</name> 156 <url>http://my.repository.com/repo/path</url> 157 </mirror> 158 --> 159 <mirror> 160 <id>aliyun</id> 161 <name>aliyun</name> 162 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 163 <mirrorOf>central</mirrorOf> 164 </mirror>165 </mirrors>
2、編譯構建
首先在其他機器上安裝數據庫,
yum install -y mariadb-server systemctl start mariadb.service && systemctl enable mariadb.service mysql_secure_installation 初始化數據庫信息
在創建鏡像這台機器上拷貝數據庫文件到數據庫機器上
scp /root/tomcat-java-demo-master/db/tables_ly_tomcat.sql root@192.168.10.112:/
登錄數據庫創建數據庫、導入數據、創建用戶授權可以連接的用戶
mysql -uroot -p123456 create database test; use test; source /tables_ly_tomcat.sql; create user `test`@'%' identified by '123456'; grant all privileges on test.* to 'test'@'%'; flush privileges; select host,user from mysql.user;
開始構建產出war包
yum install -y git git clone https://github.com/lizhenliang/tomcat-java-demo.git cd tomcat-java-demo-master/ #進入項目目錄 vim /root/tomcat-java-demo-master/src/main/resources/application.yml #編輯數據庫連接地址 mvn clean package -D maven.skip.test=true #開始構建 ls /root/tomcat-java-demo-master/target/ly-simple-tomcat-0.0.1-SNAPSHOT.war #查看構建好的鏡像
編寫Dockerfile
vim /root/tomcat-java-demo-master/Dockerfile
FROM tomcat:8 LABEL maintainer fage #RUN rm -rf /usr/local/tomcat/webapps/* ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
注意修改實際環境的數據庫地址,否則無法連接到數據庫
構建項目鏡像
docker build -t java-demo:v1 .

docker images|grep java

推送到鏡像倉庫,可以搭建私有倉庫和公有倉庫harbor、registry、hub公有倉庫等
搭建完成登錄上傳
docker login #輸入賬號、密碼 docker tag java-demo:v1 xxxx/java-demo:v1 docker push xxxx/java-demo:v1
使用deployment部署Java應用
deployment功能
1、部署無狀態應用 2、管理pod和replicaset 3、具有上部署、副本設定、滾動升級、回滾等功能 4、提供聲明式更新,例如只更新一個image 應用場景:web服務、微服務
命令行部署方式(直接部署到集群)
1、部署過程
kubectl delete deploy web && kubectl delete svc web kubectl create deployment web --image=lizhenliang/java-demo kubectl get pods,svc kubectl describe pod web-6b9c78c94f-smcdr #可以查看到詳細過程和信息
2、發布訪問端口(等於創建service)
kubectl expose deployment web --port=80 --target-port=8080 --type=NodePort --name=web #發布控制器接口,暴露應用服務端口 kubectl get pods,svc -o wide #查看詳細信息 kubectl get ep #查看負載均衡


測試訪問


Pod與container的關系
container在集群上管理和運行容器的對象 通過label-selector(標簽)相關聯 Pod通過控制器實現營業的運維、伸縮、滾動升級等

編輯控制器以及控制器中的資源
kubectl create deployment deployment web2 --image=lizhenliang/java-demo --dry-run=client -o yaml > deployment.yaml #生成yaml文件
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web2
spec:
replicas: 1
selector:
matchLabels:
project: demo #這里的標簽必須跟service標簽對應上
app: java #這里的標簽必須跟service標簽對應上
template:
metadata:
labels:
project: demo #這里的標簽必須跟service標簽對應上
app: java #這里的標簽必須跟service標簽對應上
spec:
containers:
- name: web
image: lizhenliang/java-demo
ports:
- containerPort: 8080
編輯配置service文件
kubectl expose deployment web2 --port=80 --target-port=8080 --dry-run=client -o yaml > servive.yaml #生成service的yaml
vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: web2
spec:
selector:
project: demo #這里的標簽必須跟deployment標簽對應上
app: java #這里的標簽必須跟deployment標簽對應上
ports:
- name: default
protocol: TCP
port: 80 #提供給外部訪問的接口
targetPort: 8080 #容器內部管控
type: NodePort
生效配置
kubectl apply -f deployment.yaml kubectl apply -f service.yaml kubectl get pods,svc
應用升級、彈性伸縮、回滾、刪除
應用升級
kubectl set image deployment web nginx=nginx:1.16 kubectl set image deployment web java-demo=tomcat:8 --record=true #記錄版本號歷史命令(方便回滾) 查看升級狀態 kubectl rollout status deployment web
彈性伸縮
kubectl scale deployment web --replicas=10 #設定副本數量為10
kubectl autoscale deployment web --min=10 --max=15 --cpu-percent=80 #當podCPU使用率達到80%自動添加副本數量
kubectl get hpa #查看到pod資源使用情況
查看hpa前提:
1、部署metrics-server
2、部署pod要設置requests,如下配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: web2
spec:
replicas: 1
selector:
matchLabels:
project: demo
app: java
template:
metadata:
labels:
project: demo
app: java
spec:
containers:
- name: web
image: lizhenliang/java-demo
ports:
- containerPort: 8080
resources:
requests:
cpu: 500m
limits:
cpu: 1
回滾
kubectl rollout history deployment web #查看升級歷史版本 kubectl rollout undo deployment web #直接回滾到上個版本 kubectl rollout undo deployment web --to-revision=2 #指定版本進行回滾
刪除
kubectl delete deploy web kubectl delete svc web
應用程序生命周期管理
Pod對象:pod設計思想、應用自修復、init container、靜態pod
Pod對象存在的意義: Pod為親密性應用而存在
親密性應用場景:
兩個應用之間發生文件交互 兩個應用需要通過127.0.0.1或者socket通信(典型組合:nginx+php) 兩個應用需要發生頻繁的調用
Pod基本概念
最小部署單元 一組容器的集合 一個pod中的容器共享網絡命名空間 Pod是短暫的
Pod對象:容器分類
Infrastructure Container:基礎容器,維護整個pod網絡空間 Initcontainers:初始化同期,先於業務容器開始執行 Containers:與業務容器並行啟動
Pod對象:應用自修復(重啟策略+健康檢查)
重啟策略:
Always:當容器終止退出后,總是重啟容器,默認策略。 適用場景:nginx、mysql等長期運行的程序 配置位置為container同級 OnFailure:當容器異常退出(退出狀態碼0)時才重啟容器。 適用場景:定時任務 Never:當容器終止退出,從不重啟容器 適用場景:臨時任務
健康檢查兩種類型
LivenessProbe(存活檢查) 如果檢測失敗,將殺死容器,根據pod的restartPolicy來操作 ReadinessProbe(就緒檢查) 如果檢查失敗,kubernetes會把pod從server endpoints(負載均衡)中剔除 與鏡像位置同級
支持以下三種檢測方法
httpGet:發送HTTP請求,返回200-400范圍狀態碼為成功 exec: 執行shell命令返回狀態碼是0為成功 tcpsocket:發起TCP Socket建立成功
httpGet方式
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
labels:
app: web
spec:
restartPolicy: Always #重啟策略,默認Always
containers:
- image: nginx
name: nginx
resources: {}
livenessProbe: #可以同時使用,不同維度的檢查
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5 #第一次啟動pod多少秒后執行健康檢查
periodSeconds: 5 #健康檢查周期(5秒)
readinessProbe: #可以同時使用,不同維度的檢查
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5 #啟動pod多少秒后執行健康檢查
periodSeconds: 5 #健康檢查周期(5秒)
應用生效
kubectl apply -f pods.yaml
演示重啟pod過程
kubectl exec -it web4-547f8789f5-vgh4l bash rm -f /usr/share/nginx/html/index.html

查看pod狀態,過10秒左右就會自動重啟
kubectl get pods

再次進入到容器中查看

exec方式
apiVersion: apps/v1
。。。跟上面的一樣忽略部分
spec:
restartPolicy: Always
containers:
- image: nginx
name: nginx
resources: {}
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
tcpSocket 方式
apiVersion: v1
。。。。忽略部分
spec:
restartPolicy: Always
continers:
- Images: lizhenliang/java-demo
name: java-demo
livenessProbe:
tcpSocket:
port: 8080
initiaIDelaySeconds: 30
periodSeconds: 20
Pod對象:init container
Init container:
1、基本支持所有普通容器特征 2、優先於普通容器執行 不支持健康檢查,只用於初始化
應用場景
1、 控制普通容器啟動,初始化容器后才會啟動業務容器
2、 初始化配置,例如下載應用配置文件(鏡像等)、注冊信息等
初始化容器讓配置文件放到容器中:使用數據卷共享
cat init-conttainers.yaml
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
initContainers: #優先執行
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: workdir
mountPath: "/work-dir"
dnsPolicy: Default #數據共享配置
volumes:
- name: workdir
emptyDir: {}
生效文件
kubectl apply -f init-container.yaml kubectl get pods

查看分配到那個節點
kubectl get pods -o wide

Pod對象:靜態Pod
靜態pod:固定在某個node上面,由kubelet管理生成一種pod,無法使用控制器
在kubelet配置文件啟用靜態pod
vim /var/lib/kubelet/config.yaml ... staticPodPath: /etc/kunernetes/manifests #指定靜態pod位置 ...
將部署的pod yaml放到該目錄會由kubelet自動創建,默認是啟用的
靜態Pod特點:
1、yaml只能是pod,不能使用控制器 2、pod是由kubelet拉起的,只管理當前節點上yaml 3、kubelet會定期掃描靜態pod目錄 /etc/kubernetes/manifests/ 根據目錄下的yaml啟動或刪除pod,刪除yaml就等於刪除pod
在節點上寫好yaml文件即可,在master節點會自動創建pod,由kubelet自動拉起

在master上查看

kubelet會定時掃描/etc/kubernetes/mamfests/目錄下的文件
