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

回滾的方式同樣是先確認回滾才會替換