k8s編排最佳實踐

編排文件技巧

  • 使用資源時指定最新穩定版的API version
  • 編排文件應該歸入版本控制,這樣能夠在必要的時候快速回滾,一樣也有利於資源恢復和重建
  • 使用YAML格式而不是JSON格式,儘管兩種格式的文件能夠相互轉換,可是YAML格式更易讀
  • 使用單一的文件組織相關資源,單文件比多文件更好組織管理,能夠參考guestbook-all-in-one.yaml
  • 不少kubectl命令能夠做用於整個文件夾,好比kubectl create somedir,能夠對somedir目錄中全部的配置文件執行create指令
  • 對資源的描述能夠寫到annotations中,便於自省

裸Pod

不受任何控制器(Deployment,ReplicaSets,Jobs)控制的Pod稱之爲裸Podgit

  • 儘可能避免使用裸Pod,由於在發生節點錯誤的時候沒有任何策略保證Pod的重調度,死掉就完全死掉了。
  • 相反,Deployment會啓動相應的ReplicaSet來保證Pod的可用數量,同時有更新策略提供對Pod的更新好比Rolling Update。
  • 有些特殊只須要執行一次的場景可用Job替代

Service

  • service優先建立,理解爲2點:service在它所依賴的資源建立出來以前建立;service在訪問它的資源建立以前建立。k8s建立容器的時候會在容器中寫入當前存在的service地址的環境變量,好比有個名稱爲foo的service,全部k8s建立出來的容器中都會有以下的環境變量
FOO_SERVICE_HOST=<the host the Service is running on>
FOO_SERVICE_PORT=<the port the Service is running on>

若是代碼中要訪問Service,不要使用上述環境變量,最好使用Service的dns名稱,上述環境變量只是爲了解決有些老的系統沒法使用DNS查找問題的臨時方案github

  • 如非必要,不要給Pod指定hostPort,由於會限制Pod被調度的可能

若是隻是想訪問某個端口進行debug,可使用apiserver proxykubectl port-forwardjson

若是確實須要暴露某個Pod的端口到主機端口,建議使用Service中的NodePortapi

使用標籤(labels)

  • 定義和使用語義明確的標籤。好比{ app: myapp, tier: frontend, phase: test, deployment: v3 }

Service能夠經過Selector實現跨Deployment組織資源;Deployment能夠經過標籤實現無中斷更新app

  • 巧用標籤進行調試。由於k8s資源控制器和Service都是經過標籤來組織和管理資源的。移除Pod上的標籤會致使控制器和Service再也不將該Pod列爲本身的資源,再也不會有流量分配到該Pod。此時控制器會建立新的Pod來代替被移除的Pod,這是一種「隔離調試」技術。

容器鏡像

  • 默認的 imagePullPolicy是IfNotPresent,kubelet只有在本地不存在的狀況下才會去拉取鏡像。若是想每次執行都拉取鏡像能夠指定策略:imagePullPolicy: Always

還有一種方法是指定:latesttag,也會每次都拉取鏡像frontend

生產環境避免使用這種方式url

使用kubectl

相關文章
相關標籤/搜索