
網路上有很多參考文獻,但有時最有價值的提示卻是最簡單的提示。團隊 翻譯的 這是文章作者在使用 Kubernetes 一年後收集到的。這些提示沒有按重要性排序,但我們認為每個人都會找到一些對自己有用的東西。
使用 Kubernetes 最簡單的指令
首先,這可能是使用 Kubernetes 時最簡單、最有用的操作。以下命令啟用命令完成。 kubectl 在 bash shell 中:
echo "source <(kubectl completion bash)" >> ~/.bashrc
自動填充 kubectl 將會被寫入.bashrc檔案中,並在每次啟動shell時自動啟動。這可以加快輸入長命令和參數的速度,例如 all-namespaces。 閱讀更多內容 .
命名空間中的預設記憶體和 CPU 限制
如果應用程式編寫不正確,例如,它每秒打開一個新的資料庫連接但從不關閉它,那麼叢集就會洩漏記憶體。如果應用程式在部署時沒有設定記憶體限制,則可能會導致節點故障。
為了防止這種情況,Kubernetes 允許您根據每個命名空間設定預設限制。它們在特定命名空間的 yaml 檔案中指定。以下是此類文件的一個範例:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
建立這樣的 yaml 並應用於任何命名空間。例如,到命名空間 limit-example。現在,部署在此命名空間中的任何容器都將受到 512Mi 的限制,除非為該容器另外設定了另一個單獨的限制。
舊版 Kubernetes 中的垃圾收集
Kubelet 在下列情況下預設啟動垃圾收集 var/lib/docker 佔用90%的可用磁碟空間。這很好,但在 Kubernetes 1.7 之前,使用的 inode(對應於檔案系統中的檔案數量)數量沒有預設限制。
可能是你的容器 var/lib/docker 可能只使用 50% 的磁碟空間,但在這種情況下 inode 可能會耗盡,這會給工作者帶來問題。
在 1.4 到 1.6 的舊版本 kubelet 中,您必須新增此標誌:
--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%
在 1.7 及更高版本中,預設設定此標誌。但是,先前的版本並不會強制執行 inode 限制。
Minikube…小巧但功能強大的本地 Kubernetes
Minikube 是運行本地 Kubernetes 叢集最簡單的方法。它透過一個簡單的命令啟動:
minikube start
執行此命令後,您的電腦上將執行一個真正的 Kubernetes 叢集。

訣竅在於如何建立應用程式並在該叢集上本地運行它。除非您給出具體指示,否則 Docker 映像將在您的機器上構建,而不是在叢集上建置。
為了強制 Docker 將映像推送到本地 Kubernetes 集群,需要向 docker 機器發出以下命令:
eval $(minikube docker-env)
現在我們可以在本地 Kubernetes 叢集上建立應用程式。
不要向所有人授予 kubectl 存取權限
這似乎很明顯,但如果多個團隊為他們的應用程式使用同一個叢集(這就是 Kubernetes 的創建目的),你不應該將它提供給每個人。 kubectl。最好將團隊分開,為每個團隊分配自己的命名空間,並使用 RBAC 策略限制存取權限。
為每個 pod 指定存取、讀取、建立、刪除等操作權限可能會讓你感到困惑。但最主要的是限制對機密的訪問,只允許管理員訪問。這樣,我們就可以區分那些可以管理叢集的人和那些可以簡單部署到叢集的人。
管理 Pod 預算
如何確保 Kubernetes 叢集中的應用程式不會停機? PodDisruptionBudget 和 PodDisruptionBudget。
叢集會定期更新,節點會被清空。沒有什麼是靜止的,這就是現實。每個具有多個實例的部署都必須包含 PDB(PodDisruptionBudget)。它是在應用於叢集的簡單 yaml 檔案中建立的。特定PDB的覆蓋區域由標籤選擇器決定。
注: 只有在出現可逆預算違規時才會考慮 PDB 預算()。在硬體故障等情況下,PDB 將無法運作。
PDB 範例:
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: app-a-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: app-a
兩個主要參數是 matchLabels и minAvailable。第一個參數指定預算適用於哪些應用程式。例如,如果我有標籤的部署 app: app-a и app: app-b,那麼這個PDB就只適用於第一個。
參數 minAvailable 清空(清理)節點時要考慮到這一點。例如,在我們的範例中,所有實例在耗盡期間都會被驅逐。 app: app-a,除了兩個。
這使您可以控制在任何給定時間應該運行多少個應用程式實例。
監控應用程式的健康狀況
這種監控可以透過兩種方式實現:使用就緒性測試或活躍性測試。
第一個探測(就緒狀態)確定容器是否已準備好接收流量。
第二個(活躍度)顯示容器是否健康或是否需要重新啟動。
相關配置只需新增至yaml即可部署。您可以在那裡指定超時、延遲時間和重試次數。有關它們的更多詳細信息,請參閱 .
標籤無所不在
標籤是 Kubernetes 中的基本概念之一。它們允許物件彼此自由地通信,以及基於標籤建立查詢。在 Kubernetes 中,您甚至可以前往客戶端並觀察特定標籤的事件。
您幾乎可以使用標籤做任何事情,但一個很好的例子是為單一叢集中的程式建立多個運行時環境。
假設你使用同一個集群 dev и qa。這意味著你可以擁有一個應用程式 app-a,在兩種環境中同時工作 qa и dev。在這種情況下,我們可以透過指定適當的參數來單獨存取特定環境中的應用程式實例 environment。 例如, app: app-a и environment: dev 對於一個環境,以及 app: app-a и environment: qa 第二個。
這使您可以存取應用程式的兩個實例,例如同時執行測試。
讓事情井然有序
Kubernetes 是一個非常強大的系統,但任何系統最終都會因過多的進程而陷入困境。 Kubelet 運行您指定的所有進程和檢查,以及它自己的進程和檢查。
當然,一個無人值守的服務不會減慢系統速度,而且 Kubernetes 從一開始就被設計為可擴展的。但如果服務數量不只一項,而是一百萬項,kubelet 就會開始阻塞。
如果您由於某種原因刪除了部署(容器、映像等),請確保將其徹底清理。
認識 Go
我們將主要建議留到最後。學習 Go 程式語言。
Kubernetes 採用 Go 開發,所有擴充功能均使用 Go 編寫,並官方支援 client-go 用戶端程式庫。
它可以用於許多不同且有趣的事情。例如,根據自己的喜好擴展 Kubernetes 系統。因此,您可以使用自己的程式來收集資料、部署應用程式或簡單地清理容器。
學習 Go 程式語言並掌握 client-go 也許是我能給 Kubernetes 新用戶的最重要的建議。
還有什麼可讀的:
- .
- ?
- .
來源: www.habr.com
