1. 程式人生 > >Kubernetes 生產環境最佳實踐

Kubernetes 生產環境最佳實踐

官方連結

配置注意事項

  • 當定義一個配置時,指定最新穩定版本的API
  • 在推送到叢集之前,配置檔案必須使用版本控制的方式進行管理,這樣可以在需要的時候快速回滾配置,也有助於叢集的重新建立和恢復。
  • 使用YAML而不是JSON編寫配置檔案。 雖然這些格式幾乎可以在所有場景中互換使用,但YAML往往更加使用者友好。
  • 只要有意義,就將相關物件分組到一個檔案中。 一個檔案通常比幾個檔案更容易管理。 請參閱guestbook-all-in-one.yaml檔案作為此語法的示例。
  • 注意,可以使用指定目錄的方式來呼叫kubectl命令,如使用kubectl create -f DIR_NAME
  • 不要不必要地指定預設值:簡單的最小配置會降低錯誤的可能性
  • 將物件描述放在註釋中,以便更好地進行省察。

裸Pod vs ReplicaSets,Deployments,和Jobs

  • 如果可以避免,請不要使用裸Pod(即,Pod未繫結到ReplicaSet或Deployment)。 如果節點發生故障,裸Pod將不會重新排程。

    deployment不僅可以建立ReplicaSet來確保期望Pod可用狀態的數量,同時還能指定Pod替換的策略(如RollingUpdate),這些屬性都是優於直接建立裸Pod,除了一些特殊的場景如 restartPolicy: Never

    。Job也可能適用。

Services

在建立Deployment或RS之前建立與之相關的Service,並且需要在所有的Deployment被訪問之前建立,當kubernetes啟動一個容器,被啟動的容器會提供指向所有服務的環境引數。例如,如果一個Service命名為foo退出了,所有的容器將會在他們初始化環境的時候獲取到如下引數:

 FOO_SERVICE_HOST=<the host the Service is running on>
 FOO_SERVICE_PORT=<the port the Service is running on>

如果您正在編寫與服務對話的程式碼,請不要使用這些環境變數; 請改用服務的DNS名稱。 服務環境變數僅適用於無法修改以使用DNS查詢的舊軟體,並且是一種不太靈活的訪問服務的方式。

  • 除非絕對必要,否則不要為Pod指定hostPort。 將Pod繫結到hostPort時,它會限制Pod可以排程的節點位置數,因為每個<hostIP,hostPort,protocol>組合必須是唯一的。 如果未明確指定hostIP和協議,Kubernetes將使用0.0.0.0作為預設hostIP,並使用TCP作為預設協議。

如果只是希望通過訪問埠用於除錯目的,可以使用apiserver proxy或者kubectl port-forward

如果確實需要映射出Pod的埠到主機節點上,優先考慮使用NodePort而不是hostPort.

  • 避免使用hostNetwork,這與使用hostPort原因相同。
  • 當不需要使用kube-proxy作為負載均衡的時候,使用Headless service(設定一個空的ClusterIP)可以更利於服務發現。

使用標籤Lables

定義和使用標識應用程式或部署的語義屬性的標籤,例如可以使用類似的標籤:{app:myapp,tier:frontend,phase:test,deployment:v3}。 可以使用這些標籤為其他資源選擇合適的Pod; 例如,選擇 tier: frontend 的Pod的服務等。

通過標籤選擇器(Label Selector)選擇特定的Deployment發行版本,可以使服務跨越多個Deployment。使用Deployment可以輕鬆更新正在執行的服務,而無需停機。

Deployment描述了物件所期望的狀態,並且如果更新對應的引數,則部署控制器以受控速率(滾動更新)將實際狀態改變為期望狀態。

  • 您可以通過操縱標籤進行除錯。 由於Kubernetes控制器(例如ReplicaSet)和服務使用選擇器標籤與Pod匹配,因此從Pod中刪除相關標籤將阻止其被控制器考慮或由服務提供服務流量。 如果刪除現有Pod的標籤,其控制器將建立一個新的Pod來取代它。 這是在“隔離”環境中除錯先前“live”Pod的有用方法。 要以互動方式刪除或新增標籤,請使用kubectl label命令。

容器映象

容器的拉取映象引數(imagePullPolicy)決定了kubelet的拉取映象操作:

  • imagePullPolicy: IfNotPresent: 當前本地沒有此映象的時候,才拉取映象
  • imagePullPolicy: Always: 在Pod每次啟動時都會拉取映象
  • imagePullPolicy引數省略,或者使用tag為 lastest,或者省略tag,那麼預設為imagePullPolicy: Always
  • imagePullPolicy引數省略,並且使用tag不為lastest,那麼預設為imagePullPolicy: IfNotPresent
  • imagePullPolicy: Never:將被認為映象存在本地,不會嘗試拉取映象。

在生產中部署容器時應避免使用latest標記,因為使用lastest難以跟蹤正在執行的映象版本,並且更難以正確回滾。

映象的分層快取機制使得使用imagePullPolicy: Always 引數變得高效,如,在使用docker的環境中,如果映象已經存在,拉取映象的嘗試將會非常快,因為所有的映象層都已經快取在本地,而不需要去下載映象。

使用kubectl命令

  • 使用kubectl apply -f &lt;directory&gt;kubectl create -f &lt;directory&gt;,將會執行目錄中的所有 .yaml , .yml和 .json檔案.

  • 使用標籤選擇器進行 get 和delete 操作代替指定物件名,可參考標籤選擇器如何高效使用標籤

  • 使用kubectl runkubectl expose 可以快速建立單容器 Deployment和服務,參考叢集中使用Service訪問應用