K8s 簡介
K8s 是以 Google 的內部使用十多年的容器編排管理平台 Borg 為基礎原形所實現
萬個機器節點,以及幾千個到幾十萬個 pod (容器組),每週都會部署20多個容器
- 容器編排管理
- 部署微服務架構
- 雲平台可移植的層
容器編排管理
單一個 container 並不能提供開發者太多的好處,因為開發及生產場景往往需要複雜的交互,需要多個容器同時並行協同工作,以及跨組織的管理
因此,K8s 就作為 container 編排,可跨主機管理的最佳利器
K8s 以 Pod 為基本容器組,每個 Pod 只做一件事,可以將 Pod 進行編排調度,以及聲明他的物件配置模型(Controller, configmap, secret…)
在管理過程中,可以用 controllers 進行資源分配調度,整體健康檢查,修復,彈性伸縮及滾動升級等。
部署微服務架構
服務發現,服務編排及內部路由支持
服務快速部署
自動負載平衡
對有狀態的服務的支持
雲平台可移植的層
K8S 在 2017年戰勝了 Docker Swarm, Apache Mesos ,成為各大雲平台原生應用的支持
K8S 在現有的軟體雲服務之上,又建立一個可移植的雲平台
為用戶提供一個一致的容器部署管理模型
Demo 初體驗
外部請求 -> [ K8s 群集( Service -> 多個 Pod) ]
K8s 群集由一個 Master 節點及多個 Node 節點組成
察看 Nodes
kubectl get nodes
部署 Service
https://www.imooc.com/video/17048
K8S 在創建容器的時後,會把已經創建的所有 Service 訊息,放到 Container 的環境變數中。
雖然 K8S 不推薦透過環境變數方式,而是透過內部DNS域名來取得 Service 應用,會是較正確的方式
但是環境變數的方式在規模較大的應用中,可以支援一些較舊的應用,需要透過環境變數來運作
service.yaml 檔案可以用來定義 Service 配置
例如,我們建立一個 app-service.yaml
可以針對yaml 創建服務:
kubectl create -f app-service.yaml --record
查看創建結果
kubectl get svc|grep app-service
可以透過 describe 查看詳細訊息
kubectl describe svc/app-service
在這時 service port 還沒有生成,無法被訪問
目前只創建了內部的 service DNS 網路
可以創建內部的一個容器,並進入容器
kubectl run -i --tty busybox --image=busybox --restart=Never
可以透過容器來查看 Service 的容器 DNS 域名位置
nslookup app-service
部署 Pods
通常都不會單獨創立 Pods,而會透過Deployment控制器來進行 Pods 應用部署
Deployment 同樣是以 yaml 進行定義,在 yaml 會清楚定義會需要多少 Pods,以及 Pods 的模板訊息
例如,創建一個 app-deployment.yaml
透過以下方式建立deployment部署pods
kubectl create -f app-deployment.yaml --record=true
如果是後續有修改 deployment (升級或擴增Pods),則透過以下語法讓修改生效
kubectl apply -f app-deployment.yaml
查看 deployment 創建結果
kubectl get deployemnts
NAME - deployment
DESIRED - Pods 數量
CURRENT - 當前運行的 Pods
UP-TO-DATE - 已經升級到最新版本的 Pods 數
AVAILABLE - 已經可以運用的 Pods 數量
AGE - Pods 已部署的時間
接著查看部署的 service
kubectl descript svc/app-service
查看訊息會發現,之前在 Endpoints 原本為 none,目前應該會多出幾個 pods ip
表示 service 已經透過 level selector 配對到剛剛創建的 pods 副本
查看 pods
kubectl get pods| grep app-deployment
上面這行會輸出 pods 的位置,可以透過以下方式監聽日誌
kubectl logs -f pods_dns
透過監聽可以發現目前針對 Service 的請求都會自動負載平衡分配到 Pods
若對 Pods 進行升級,前面提到,只要修改 app-deployment.yaml 以及 apply ,就會自動開始升級
kubectl apply -f app-deployment.yaml
可以透過以下命令來監聽 pods 升級的狀況
kubectl rollout status deployment/hello-deployment
從這裡可以觀察到,流程是逐一升級 Pods ,升級完成才會逐一替換掉舊的 Pods,直到所有的 Pods 都被替換
如果升級失敗,可以透過以下方式回滾到上一個版本
kubectl rollout undo deployments/app-deployment
回滾的方式同樣是先確認回滾才會替換