05.08 寫給開發人員的Kubernetes實用介紹

隨著docker容器虛擬技術的廣泛使用,對於docker容器集群的管理、自動部署、擴容成了迫切的需要。由谷歌2014年推出的docker容器管理平臺Kubernetes(簡稱k8s,下文同)順應需求,被大家廣泛地採納,可以說k8s目前的成了容器管理平臺的代名詞。越來越多的碼農和開發人員開始嘗試使用k8s kubectl CLI工具。

本文的目的是為開發人員提供k8s常用工具介紹和最佳實踐,學會熟練地與 K8s群集交互和操作。

K8s架構簡介

儘管做為一個碼農與開發人員,你不需要去學會從零開始自己搭建K8s群集。你只需學會熟練的使用已有的環境即可,同樣你也不必瞭解K8s的的底層實現。但是,蟲蟲還是建議對k8s的架構做下總體的瞭解,k8s的基礎知識也有助於我們解決使用和調試過程中遇到一些問題,所以在此首先簡單介紹下k8s架構和相關的基礎知識。

K8s是一個管理主節點和若干工作節點組成的體系架構,整個體系由一個主節點(master)和多個計算節點構成,計算節點又叫工人節點(worker)。

寫給開發人員的Kubernetes實用介紹

主節點為集群提供管理和控制接口(API)。我們可以使用kubectl(CLI)時,輸入群集或應用程序的的各種配置參數值。然後由主節點負責解析參數,並把其應用到集群中,生成符合需求的各個容器。

寫給開發人員的Kubernetes實用介紹

工作節點負責提供K8s運行時,進行具體的鏡像註冊,容器生成,並對各個容器進行監控。所有的應用容器都跑在工作節點。

寫給開發人員的Kubernetes實用介紹

關於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。

寫給開發人員的Kubernetes實用介紹

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

寫給開發人員的Kubernetes實用介紹

一旦查到需要回滾的到部署,可以運行以下命令(比如你現在想要回滾到第100個部署):

kubectl rollout undo deployment/DEPLOYMENT_NAME --to-revision=100

如果你想回滾上一個部署,你可以簡單地運行:

kubectl rollout undo deployment/DEPLOYMENT_NAME


分享到:


相關文章: