4-K8S 部署Java應用及應用程序生命周期管理


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/目錄下的文件


免責聲明!

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



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