Kubernetes 10 大技巧和技巧

Kubernetes 10 大技巧和技巧

互聯網上有很多參考文獻,但有時最簡單的技巧才是最有價值的。 團隊 Mail.ru 的 Kubernetes aaS 翻譯的 精選的十個技巧和技巧,本文作者在使用 Kubernetes 一年後收集的。 提示不按重要性排序,但我們認為每個人都會找到對自己有用的東西。

與 Kubernetes 一起使用的最簡單命令

首先,這也許是使用 Kubernetes 時最簡單、最有用的操作。 以下命令啟用命令完成 kubectl 在 bash shell 中:

echo "source <(kubectl completion bash)" >> ~/.bashrc

自動填充 kubectl 將被寫入 .bashrc 文件,並在每次啟動 shell 時自動激活。 這可以加快輸入長命令和選項的速度,例如 all-namespaces。 閱讀更多內容 Kubernetes bash 幫助.

命名空間中的默認內存和 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,這會給worker帶來問題。

在 kubelet 1.4 到 1.6 的舊版本中,您必須添加以下標誌:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

在 1.7 及更高版本中,默認設置此標誌。 但是,以前的版本不強制執行 inode 限制。

Minikube……小而強大的本地 Kubernetes

Minikube 是運行本地 Kubernetes 集群的最簡單方法。 它可以通過一個簡單的命令啟動:

minikube start

此命令將導致在您的計算機上運行真正的 Kubernetes 集群。

Kubernetes 10 大技巧和技巧
插圖來源

訣竅在於如何構建應用程序並在此集群上本地運行它。 除非另有指定,否則 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 中的基本概念之一。 它們允許對象之間自由通信,以及基於標籤創建請求。 在 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 新手用戶的最重要的建議。

在 Mail.ru 雲解決方案的支持下進行翻譯

還有什麼可讀的:

  1. Kubernetes 中的三個級別的自動縮放以及如何有效地使用它們.
  2. Kubernetes工作節點:許多小節點或幾個大節點?
  3. 25 個用於部署和管理 Kubernetes 的有用工具.

來源: www.habr.com

添加評論