k8s中部署發布應用


1.項目遷移到K8S平台是怎樣的流程

image.png

 

制作鏡像:

image.png

使用dockerfile制作docker 鏡像

鏡像分為

基礎鏡像:centos,ubuntu

服務鏡像:openjdk,nginx,mysql

項目鏡像:項目代碼打包在服務鏡像里,最終交付物

java或者go的應用需要編譯,php的可以不用編譯。

控制器管理pod

  • Deployment:無狀態部署,例如Web,微服務,API
  • StatefulSet:有狀態部署,例如數據庫,ZK,ETCD
  • DaemonSet:守護進程部署,例如監控Agent、日志Agent
  • Job & CronJob:批處理,例如數據庫備份,郵件通知

pod數據持久化:

容器部署過程中一般有以下三種數據:

  • 啟動時需要的初始數據,可以是配置文件
  • 啟動過程中產生的臨時數據,該臨時數據需要多個容器間共享
  • 啟動過程中產生的業務數據

image.png

暴露應用:

使用Service ClusterIP類型暴露集群內部應用訪問。

  • Service定義了Pod的邏輯集合和訪問這個集合的策略
  • Service引入為了解決Pod的動態變化,提供服務發現和負載均衡
  • 使用CoreDNS解析Service名稱

image.png

對外發布應用:

使用Ingress對外暴露你的應用。

  • 通過Service關聯Pod
  • 基於域名訪問
  • 通過Ingress Controller實現Pod的負載均衡
  • 支持TCP/UDP 4層和HTTP 7層(Nginx)

image.png

日志與監控

使用Prometheus監控集群中資源的狀態

使用ELK來收集應用的日志

 

2.傳統部署和k8s部署的區別

image.png

 

 

 

image.png

 

區別:

  • 原先的應用包變成了存放在鏡像倉庫中的鏡像
  • 部署從原先ansible部署,變成k8s使用控制器部署,部署的節點直接是由物理機變成部署在pod內
  • 暴露服務由原先的自建負載均衡nginx,haproxy等 變成通過k8s 的service,ingress來暴露服務

 

3.手工模擬k8s發布java應用

測試java-demo 📎java-demo.zip

unzip java-demo.zip    &&   cd java-demo

安裝jdk

yum install -y java-1.8.0-openjdk

image.png

安裝maven

yum install maven -y

image.png

編譯代碼

image.png

  • db目錄  ,數據庫表的初始化sql
  • pom.xml   項目依賴的jar包說明文件
  • src     源代碼目錄

由於maven默認使用的國外的maven源 所以改成國內阿里雲的源這樣下載依賴包會很快

/etc/maven/settings.xml

在159行加入  

在<mirrors> </mirros>內

<mirror>  <id>aliyunmaven</id>  <mirrorOf>central</mirrorOf>  <name>aliyun maven</name>  <url>https://maven.aliyun.com/repository/public </url>  </mirror>

構建war包

mvn clean package -Dmaven.test.skip

clean package 會刪掉之前存在構建好的文件目錄

maven.test.skip 表示忽略測試

image.png

 

編寫Dockerfile

配置對私有倉庫的可信任,並配置默認的鏡像倉庫為阿里雲倉庫

/etc/docker/daemon.json

{  "registry-mirrors": ["https://yyk0qnca.mirror.aliyuncs.com"],  "insecure-registries": ["192.168.31.70"] }

 

Dockerfile

FROM 192.168.31.70/library/tomcat:v1 RUN rm -rf /usr/local/tomcat/webapps/* COPY target/*.war /usr/local/tomcat/webapps/ROOT.war

1.從鏡像倉庫拉取舊版本的應用鏡像,其中library倉庫是個公共的倉庫所以不需要登錄

image.png

2.刪除鏡像中原本的war包

3.將本地構建好的war包復制到鏡像的war包目錄,並命名為ROOT.war

執行構建

docker build -t java-demo:v1 .

 

image.png

本地運行鏡像

docker run -d java-demo:v1

驗證應用是否發布成功

docker inspect -f='{{.NetworkSettings.IPAddress}}' f07c85826426 #獲取容器的ip

 

image.png

 

創建一個 demo的私有倉庫

image.png

image.png

推送鏡像到私有倉庫

 

docker login 192.168.31.70 --username=admin docker tag 182f52a26eb0 192.168.31.70/demo/java-demo:v1 docker push 192.168.31.70/demo/java-demo:v1

image.png

創建私有倉庫的認證secret

由於demo倉庫設置的是私有類型所以pull鏡像需要登錄認證。

kubectl create secret docker-registry docker-regsitry-auth --docker-username=admin --docker-password=Harbor1 345 --docker-server=192.168.31.70

使用deployment發布應用

apiVersion: apps/v1 kind: Deployment metadata:  name: java-demo spec:  replicas: 3  selector:  matchLabels:  project: www  app: java-demo  template:  metadata:  labels:  project: www  app: java-demo  spec:  imagePullSecrets:  - name: "docker-regsitry-auth"  containers:  - image: 192.168.31.70/demo/java-demo:v1  name: java-demo  imagePullPolicy: Always  ports:  - containerPort: 8080  name: web  protocol: TCP  resources:  requests:  cpu: 0.5  memory: 0.3Gi  limits:  cpu: 1  memory: 0.5Gi  livenessProbe:  httpGet:  path: /  port: 8080  initialDelaySeconds: 60  timeoutSeconds: 20  readinessProbe:  httpGet:  path: /  port: 8080  initialDelaySeconds: 60  timeoutSeconds: 20

image.png

 

創建service暴露服務

apiVersion: v1 kind: Service metadata:  labels:  app: java-demo  name: java-demo spec:  ports:  - port: 80  protocol: TCP  targetPort: 8080  nodePort: 30018  selector:  app: java-demo  type: NodePort

image.png

可以通過 任意節點的ip:30018    訪問應用

image.png

image.png

使用ingress對外發布服務

apiVersion: extensions/v1beta1 kind: Ingress metadata:  name: java-demo spec:  rules:  - host: java.ctnrs.com  http:  paths:  - path: /  backend:  serviceName: java-demo  servicePort: 80

image.png

編輯hosts文件

image.png

 

然后訪問java.ctnrs.com

image.png

模擬更新應用

在harbor節點 安裝mysql數據庫

yum install -y mariadb-server systemctl start mariadb mysqladmin -uroot password "123456" 設置密碼123456

編輯 java-demo/src/main/resources/application.yml

將連接數據庫的地址換成 harbor節點的地址

image.png

創建demo用戶並授權

MariaDB [test]> grant all on test.* to 'demo'@'192.168.31.%' identified by '123.com'; MariaDB [test]> grant all on test.* to 'demo'@'localhost' identified by '123.com';

將修改后的配置重新編譯成war包

mvn clean package -Dmaven.skip.test docker build -t java-demo:v2 . docker tag java-demo:v2 192.168.31.70/demo/java-demo:v2 docker push 192.168.31.70/demo/java-demo:v2 

將deployment.yaml 中鏡像版本v1改成v2

- image: 192.168.31.70/demo/java-demo:v2

重新應用配置后會觸發滾動更新

kubectl apply -f deployment.yaml

image.png

 

再次訪問應用http://java.ctnrs.com/就是升級后(更改過配置)的應用 

 

回滾應用

 

kubectl rollout history deployment/java-demo #查看應用歷史版本 kubectl rollout undo deployment/java-demo #回滾到之前的版本 kubectl rollout undo deployment/java-demo --to-revision=1 #回到指定的歷史版本 kubectl rollout status deploy/java-demo #查看發布情況

image.png

 

4.手工模擬k8s發布php應用

測試php-demo  📎php-demo.zip

unzip php-demo.zip  && cd php-demo

image.png

構建推送鏡像

FROM registry.cn-hangzhou.aliyuncs.com/benjamin-public/nginx-php:latest MAINTAINER BenjaminYang ADD . /usr/local/nginx/html 

 

docker build -t 192.168.31.70/demo/php-demo:v1 . docker push 192.168.31.70/demo/php-demo:v1 #demo是私有倉庫需要登錄

通過deployment發布應用

deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata:  name: php-demo  namespace: test spec:  replicas: 3  selector:  matchLabels:  project: www  app: php-demo  template:  metadata:  labels:  project: www  app: php-demo  spec:  imagePullSecrets:  - name: docker-regsitry-auth  containers:  - name: nginx  image: 192.168.31.70/demo/php-demo:v2  ports:  - containerPort: 80  name: web  protocol: TCP  resources:  requests:  cpu: 0.5  memory: 200Mi  limits:  cpu: 1  memory: 0.3Gi  livenessProbe:  httpGet:  path: /status.php  port: 80  initialDelaySeconds: 6  timeoutSeconds: 20  readinessProbe:  httpGet:  path: /status.php  port: 80  initialDelaySeconds: 6  timeoutSeconds: 20

 

由於是在 test 名稱空間下操作 所以需要在創建test 名稱空間,並且在該名稱空間下創建 secret

namespace.yaml

apiVersion: v1 kind: Namespace metadata:  name: test

image.png

kubectl  apply -f deployment.yaml

image.png

通過service暴露服務

service.yaml

apiVersion: v1 kind: Service metadata:  name: php-demo  namespace: test spec:  selector:  project: www  app: php-demo  ports:  - name: web  port: 80  targetPort: 80  type: NodePort

image.png

通過ingress來對外發布服務

ingress.yaml

apiVersion: extensions/v1beta1 kind: Ingress metadata:  name: php-demo  namespace: test spec:  rules:  - host: php.ctnrs.com  http:  paths:  - path: /  backend:  serviceName: php-demo  servicePort: 80

image.png

 

驗證訪問

編輯 hosts文件 

image.png

 

訪問域名提示  數據庫連接出錯,由於配置文件中的數據庫連接信息是錯的

image.png

模擬應用更新

數據庫添加用戶並授權

 

MariaDB [(none)]> grant all on wp.* to 'wp'@'192.168.31.%' identified by '123.com'; MariaDB [(none)]> grant all on wp.* to 'wp'@'localhost' identified by '123.com';

 

編輯 php-demo/wp-config.php

image.png

 

更新當前鏡像 打tag為v2

docker build -t 192.168.31.70/demo/php-demo:v2 . docker push 192.168.31.70/demo/php-demo:v2

將 deployment.yaml 中的 鏡像版本指定為 php-demo:v2

 

重新應用配置

kubectl apply -f deployment.yaml  

 

再次驗證訪問

成功訪問wp

image.png

image.png

image.png

 
 


免責聲明!

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



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