1.項目遷移到K8S平台是怎樣的流程
制作鏡像:
使用dockerfile制作docker 鏡像
鏡像分為
基礎鏡像:centos,ubuntu
服務鏡像:openjdk,nginx,mysql
項目鏡像:項目代碼打包在服務鏡像里,最終交付物
java或者go的應用需要編譯,php的可以不用編譯。
控制器管理pod
- Deployment:無狀態部署,例如Web,微服務,API
- StatefulSet:有狀態部署,例如數據庫,ZK,ETCD
- DaemonSet:守護進程部署,例如監控Agent、日志Agent
- Job & CronJob:批處理,例如數據庫備份,郵件通知
pod數據持久化:
容器部署過程中一般有以下三種數據:
- 啟動時需要的初始數據,可以是配置文件
- 啟動過程中產生的臨時數據,該臨時數據需要多個容器間共享
- 啟動過程中產生的業務數據
暴露應用:
使用Service ClusterIP類型暴露集群內部應用訪問。
- Service定義了Pod的邏輯集合和訪問這個集合的策略
- Service引入為了解決Pod的動態變化,提供服務發現和負載均衡
- 使用CoreDNS解析Service名稱
對外發布應用:
使用Ingress對外暴露你的應用。
- 通過Service關聯Pod
- 基於域名訪問
- 通過Ingress Controller實現Pod的負載均衡
- 支持TCP/UDP 4層和HTTP 7層(Nginx)
日志與監控
使用Prometheus監控集群中資源的狀態
使用ELK來收集應用的日志
2.傳統部署和k8s部署的區別
區別:
- 原先的應用包變成了存放在鏡像倉庫中的鏡像
- 部署從原先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
安裝maven
yum install maven -y
編譯代碼
- 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 表示忽略測試
編寫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倉庫是個公共的倉庫所以不需要登錄
2.刪除鏡像中原本的war包
3.將本地構建好的war包復制到鏡像的war包目錄,並命名為ROOT.war
執行構建
docker build -t java-demo:v1 .
本地運行鏡像
docker run -d java-demo:v1
驗證應用是否發布成功
docker inspect -f='{{.NetworkSettings.IPAddress}}' f07c85826426 #獲取容器的ip
創建一個 demo的私有倉庫
推送鏡像到私有倉庫
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
創建私有倉庫的認證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
創建service暴露服務
apiVersion
可以通過 任意節點的ip:30018 訪問應用
使用ingress對外發布服務
apiVersion
編輯hosts文件
然后訪問java.ctnrs.com
模擬更新應用
在harbor節點 安裝mysql數據庫
yum install -y mariadb-server systemctl start mariadb mysqladmin -uroot password "123456" 設置密碼123456
編輯 java-demo/src/main/resources/application.yml
將連接數據庫的地址換成 harbor節點的地址
創建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
再次訪問應用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 #查看發布情況
4.手工模擬k8s發布php應用
測試php-demo 📎php-demo.zip
unzip php-demo.zip && cd php-demo
構建推送鏡像
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
由於是在 test 名稱空間下操作 所以需要在創建test 名稱空間,並且在該名稱空間下創建 secret
namespace.yaml
apiVersion
kubectl apply -f deployment.yaml
通過service暴露服務
service.yaml
apiVersion
通過ingress來對外發布服務
ingress.yaml
apiVersion
驗證訪問
編輯 hosts文件
訪問域名提示 數據庫連接出錯,由於配置文件中的數據庫連接信息是錯的
模擬應用更新
數據庫添加用戶並授權
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
更新當前鏡像 打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