開發人員Kubernetes的實用指南

2021-01-10 蟲蟲搜奇

隨著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

相關焦點

  • CVE-2020-8554:MiTM漏洞影響所有Kubernetes版本
    CVE-2020-8554:MiTM漏洞影響所有Kubernetes版本 ​研究人員發現一個影響所有Kubernetes版本的未修復的MiTM漏洞。
  • Kubernetes持續部署指南
    :latest || true - docker build --cache-from "${DOCKER_USERNAME}"/semaphore-demo-ruby-kubernetes:latest -t "${DOCKER_USERNAME}"/semaphore-demo-ruby-kubernetes:$SEMAPHORE_WORKFLOW_ID
  • Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版
    此外,這些Kubernetes快照作為基本的構建塊,可釋放為Kubernetes開發高級企業級存儲管理功能的能力:包括應用程式或集群級備份解決方案。Beta版有什麼新功能?隨著卷快照升級到beta版,該功能現在在標準Kubernetes部署上默認啟用,而不是選擇性啟用。
  • 基於 Kubernetes 的 GPU 類型調度實現
    beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/hostname=node-a accelerator=nvidia-tesla-k80Annotations:
  • SkyForm ECP基於Kubernetes構建AIaaS平臺
    社區中也出現了很多tensorflow on kubernetes的方案,比如最早使用jinja模板的方案(https://github.com/tensorflow/ecosystem/tree/master/kubernetes),以及後來的kubeflow(https://github.com/google/kubeflow)和Tensorflow/k8s(https://github.com
  • Kubernetes 1.17特性:存儲卷從 In-Tree向CSI的遷移已到達Beta
    該過程使Kubernetes開發人員可以獲得反饋,發現,並修復問題,迭代設計,並交付高質量的生產級特性。為什麼將in-tree插件遷移到CSI?在CSI之前,Kubernetes提供了功能強大的卷(volume)插件系統。
  • Kubernetes ELK 日誌收集
    直接在宿主機上安裝,和在kubernetes效果一樣的。**> # 匹配tag為raw.kubernetes.**> @type record_transformer remove_keys $.docker.container_id,$.kubernetes.container_image_id,$.kubernetes.pod_id,$.kubernetes.namespace_id,$.kubernetes.master_url
  • 五個關鍵點,讓 kubernetes 跑起來
    我們已經知道kubernetes的常用術語和一些思想,要想進行二次開發
  • 20個對前端開發人員有用的文檔和指南
    請欣賞我們的文檔和指南系列的第五部,別忘了讓我們知道任何其他我們尚未列入該系列的其他文檔或指南。1、SitePoint Sass Reference(SASS參考)SitePoint自己的一個項目,由SitePoint的常駐編輯Hugo Giraudel 和 Stu Robson建立的一個基於SASS的參考網站。
  • Kubernetes 1.14 二進位集群安裝
    <<EOF{"CN":"kubernetes","hosts":["127.0.0.1","192.168.0.50","192.168.0.51","192.168.0.52","192.168.0.54","10.254.0.1","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster
  • kubernetes面試題匯總
    微信公眾號搜索  DevOps和k8s全棧技術 ,關注之後,在後臺回復 k8s面試題,可獲取最新完整的kubernetes面試題pdf文檔
  • 一篇讀懂Kubernetes Scheduler擴展功能
    :註冊預選函數(k8s.io/kubernetes/pkg/scheduler/algorithmprovider/defaults/register_predicates.go);註冊優選函數(k8s.io/kubernetes/pkg/scheduler/algorithmprovider/defaults/register_priorities.go)編寫預選和優選處理函數:編寫預選函數(k8s.io
  • vSphere with Kubernetes實戰之:用戶訪問控制 - 文章精選 - CTI...
    通過使用kubernetes的RBAC,「Namespace管理員」可以將集群管理員角色或更加細粒度的權限分配給其他用戶和組,這些用戶稱為「Tanzu集群開發者」,他們負責在Tanzu Kubernetes集群上開發和部署應用程式。
  • 深入解析Kubernetes service 概念
    在Kubernetes中,每個節點都安裝了kube-proxy,kube-proxy通過kubernetes中固有的watch請求方法持續監聽apiserver。5f8fc8545f-kwc7x 1/1Running079spod/myapp-svc-5f8fc8545f-rp8vg 1/1Running079sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes
  • Kubernetes 將棄用 Docker
    官方聲明地址:https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/延伸閱讀從虛擬化到雲原生——容器技術的發展史
  • Kubernetes RBAC角色權限控制
    這裡我們需要明確三個RBAC最基本的概念Role: 角色,它定義了一組規則,定義了一組對Kubernetes API對象的操作權限Subject: 被作用者,既可以是」人」,也可以是機器,當然也可以是我們Kubernetes中定義的用戶(ServiceAccount主要負責kubernetes
  • 不好,WireGuard 與 Kubernetes CNI 摩擦生火了..
    Kilo 默認會嘗試使用節點標籤 topology.kubernetes.io/region[6] 來判斷節點所在的邏輯區域,你也可以通過 Kilo 的啟動參數 --topology-label=<label> 來指定邏輯區域的標籤,還可以為 node 添加 annotation kilo.squat.ai/location[7] 來指定邏輯區域的標籤。
  • Kubernetes決定棄用Docker,到底會影響到誰?
    從 DevOps 人員的角度,一面用 kubctl 命令、k8s API 來操作集群,一面在單機用 Docker 命令來管理鏡像、運行鏡像。單獨用 Docker 的情況,在一些公司的場景裡面也是有的。一種場景是「只分不合」,把一臺機器用 Docker 做資源隔離,但是不需要將多容器「編排」。
  • Kubernetes-應用部署問題定位和處理
    /kubernetes/issues/6842pods/mypod接下來,要檢查的是apiserver上的Pod是否與要創建的Pod相匹配。《Debug Services》地址:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#does-the-service-work-by-ip2.
  • Kubernetes scheduler學習筆記
    apiVersion: extensions/v1beta1kind: Deploymentmetadata: annotations: deployment.kubernetes.io/revision: "1" labels: k8s-app: testpod name