Kubernetes 生產環境最佳實踐

官方連接git

配置注意事項

  • 當定義一個配置時,指定最新穩定版本的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也可能適用。github

Services

在建立Deployment或RS以前建立與之相關的Service,而且須要在全部的Deployment被訪問以前建立,當kubernetes啓動一個容器,被啓動的容器會提供指向全部服務的環境參數。例如,若是一個Service命名爲foo退出了,全部的容器將會在他們初始化環境的時候獲取到以下參數:docker

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

若是您正在編寫與服務對話的代碼,請不要使用這些環境變量; 請改用服務的DNS名稱。 服務環境變量僅適用於沒法修改以使用DNS查找的舊軟件,而且是一種不太靈活的訪問服務的方式。json

  • 除非絕對必要,不然不要爲Pod指定hostPort。 將Pod綁定到hostPort時,它會限制Pod能夠調度的節點位置數,由於每一個<hostIP,hostPort,protocol>組合必須是惟一的。 若是未明確指定hostIP和協議,Kubernetes將使用0.0.0.0做爲默認hostIP,並使用TCP做爲默認協議。

若是隻是但願經過訪問端口用於調試目的,可使用apiserver proxy或者kubectl port-forwardapi

若是確實須要映射出Pod的端口到主機節點上,優先考慮使用NodePort而不是hostPort.緩存

  • 避免使用hostNetwork,這與使用hostPort緣由相同。
  • 當不須要使用kube-proxy做爲負載均衡的時候,使用Headless service(設置一個空的ClusterIP)能夠更利於服務發現。

使用標籤Lables

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

經過標籤選擇器(Label Selector)選擇特定的Deployment發行版本,可使服務跨越多個Deployment。使用Deployment能夠輕鬆更新正在運行的服務,而無需停機。負載均衡

Deployment描述了對象所指望的狀態,而且若是更新對應的參數,則部署控制器以受控速率(滾動更新)將實際狀態改變爲指望狀態。less

  • 您能夠經過操縱標籤進行調試。 因爲Kubernetes控制器(例如ReplicaSet)和服務使用選擇器標籤與Pod匹配,所以從Pod中刪除相關標籤將阻止其被控制器考慮或由服務提供服務流量。 若是刪除現有Pod的標籤,其控制器將建立一個新的Pod來取代它。 這是在「隔離」環境中調試先前「live」Pod的有用方法。 要以交互方式刪除或添加標籤,請使用kubectl label命令。

容器鏡像

容器的拉取鏡像參數(imagePullPolicy)決定了kubelet的拉取鏡像操做:frontend

  • 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訪問應用
相關文章
相關標籤/搜索