隨著docker容器虛擬技術的廣泛使用,對於docker容器集群的管理、自動部署、擴容成了迫切的需要。由谷歌2014年推出的docker容器管理平臺Kubernetes(簡稱k8s,下文同)順應需求,被大家廣泛地採納,可以說k8s目前的成了容器管理平臺的代名詞。越來越多的碼農和開發人員開始嘗試使用k8s kubectl CLI工具。
本文的目的是為開發人員提供k8s常用工具介紹和最佳實踐,學會熟練地與 K8s群集交互和操作。
K8s架構簡介
儘管做為一個碼農與開發人員,你不需要去學會從零開始自己搭建K8s群集。你只需學會熟練的使用已有的環境即可,同樣你也不必瞭解K8s的的底層實現。但是,蟲蟲還是建議對k8s的架構做下總體的瞭解,k8s的基礎知識也有助於我們解決使用和調試過程中遇到一些問題,所以在此首先簡單介紹下k8s架構和相關的基礎知識。
K8s是一個管理主節點和若干工作節點組成的體系架構,整個體系由一個主節點(master)和多個計算節點構成,計算節點又叫工人節點(worker)。
主節點為集群提供管理和控制接口(API)。我們可以使用kubectl(CLI)時,輸入群集或應用程序的的各種配置參數值。然後由主節點負責解析參數,並把其應用到集群中,生成符合需求的各個容器。
工作節點負責提供K8s運行時,進行具體的鏡像註冊,容器生成,並對各個容器進行監控。所有的應用容器都跑在工作節點。
關於k8s更詳細的體系架構,請參考官方問題,不在詳述。
k8s架構中的概念介紹
Pod
Pod運行在工作節點上,由容器和卷構成,同一個Pod裡的容器共享網絡命名空間,可以使用localhost互相通信。Pod是短暫的,不是持續性實體。
Lable
一個Label命名到到Pod的鍵/值對,用來傳遞用戶定義的屬性。比如,你可能創建了一個"tier"和"app"標籤,通過Label(tier=frontend, app=myapp)來標記前端Pod容器,使用Label(tier=backend, app=myapp)標記後臺Pod。
Service
因為Pod都是暫時的,重啟時IP地址會改變,為了更方便對後臺容器定位,k8s利用Service來對其標定。通過對Pod的策略及其訪問策略進行抽象打包,並將其稱為Service。Service通過Label找到Pod組,實現對最終對pod的連接。
Node
是我們常說的工作節點或者計算節點,是具體的一臺物理服務器或者虛擬VPS,在k8s中也叫Minion。每個節點有如下功能組件:
Kubelet:是主節點代理。
Kube-proxy:Service使用其將鏈接路由到Pod。
Docker或Rocket:具體的應用容器。
應用程序生命週期
在k8s集群中,所有應用程序都運行在K8s中Pod上。pod是k8s中的基本的功能單元,每個pod代表一個或多個正在運行的容器組。
pod由以下幾種狀態:
Pending
Running
Succeeded
Failed
Unknown
K8s通過這些狀態來確定容器所處的階段,並根據狀態做進一步的行為(如重啟)。狀態的信息,需要部署探測器來獲得,活性探測器(liveness probe)可用於確定何時應用程序必須由K8s重新啟動,而準備就緒探測器(readiness probe)可用於確定容器何時可以提供訪問。
使用K8s進行本地開發—skaffold
為了方便k8s的持續開發,谷歌開源了工具skaffold,使得K8s集群的開發更加便捷。Skaffold由一些列工具棧構成,可以實現一鍵創建、推送並部署應用程序到K8s集群。需要提及的是其他公司也都推出了類似的工具,比如微軟的Draft,IBM的 Cloud Container Service。
Skaffold詳細功能包括:
檢測源代碼中的更改並自動構建,推送和部署。
自動更新圖像標籤,無需手動更改在K8s manifest文件。
一鍵構建/部署/推送不同的應用程序,非常適合微服務架構。
支持開發和生產環境,只需運行一次manifests,或持續監控其變化。
要詳細的Skaffold設置和使用的文檔,請查閱其官方文檔。
kubectl使用
kubectl是一個k8s的命令行用戶管理界面,通過其實現對K8s群集的管理操作。
kubectl使用格式如下所示:
kubectl [command] [TYPE] [NAME] [flags]
其中:
command表示你要執行的操作,例如create創建或delete刪除;
TYPE用來指定資源類型,如
pod,NAME用來指定資源的名稱, 用戶-可以忽略名稱,將顯示給定類型的所有資源信息。
flags用來指定可選項,比如namespace,如果不使用默認標誌。
設定日誌
對線上系統故障排查來說,日誌必不可少。雖然一般都建議通過集中式日誌收集,比如通過ELK棧做日誌收集處理。通過kubectl也可以設定日誌收集。通過下面步驟可以設定pod的日誌:
kubectl logs my-pod-name
如果你想通過滾動方式,持續的查看日誌,可以通過以下命令(類似大家都熟悉的tail -f 也是-f選項):
kubectl -f logs my-pod-name
或者,如果你在同一個pod中跑多個容器,執行下面命令:
kubectl -f logs my-pod-name internal-container-name
在運行中的Pod交互式執行命令
在故障排除時候,交互式即時命令執行很有用,可以在啟動時候追加-it的選項(和docker容器啟動選項一樣)。
kubectl exec -it my-pod-name -- /bin/sh
一旦你運行了它,容器會獲得控制終端,通過終端就可以執行命令。
回滾部署
異常難免,為了避免業務中斷,最快的回覆方式就是回滾到上一次部署。在kubectl中,我們使用rollout命令實現回滾。
為了實現Pod和複製集的申明式更新更新。實踐中,應用程序部署到K8s集群時,都是通過創建部署而不是pod來實現。實際上,一個簡單的部署manifest(XML格式)實例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
運行kubectl apply -f manifest.yml後,會基於nginx 1.7.9的docker鏡像創建三個正在運行的pod。
要列出所有的部署,可以使用下面的命令:
kubectl rollout history deployment/DEPLOYMENT-NAME
一旦查到需要回滾的到部署,可以運行以下命令(比如你現在想要回滾到第100個部署):
kubectl rollout undo deployment/DEPLOYMENT_NAME --to-revision=100
如果你想回滾上一個部署,你可以簡單地運行:
kubectl rollout undo deployment/DEPLOYMENT_NAME
閱讀更多 蟲蟲安全 的文章