本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用節點相似性、污點和容許,將 Kubernetes 網繭放置在 Amazon EKS 上
由希特斯·帕里赫(AWS)和拉格·比米迪馬里(AWS)創建
環境:PoC 或試點 | 技術:容器與微服務 | 工作負載:開源 |
AWS 服務:Amazon EKS |
Summary
此模式示範如何使用 Kubernetes 節點相似性、節點污點和網繭容許,在 Amazon Web 服務 (AWS) 雲端上的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中有意排程應用程式 Amazon Web Services 繭上的特定工作者節點。
污染是一種節點屬性,可讓節點拒絕一組網繭。容許是一種網繭內容,可讓 Kubernetes 排程器在具有相符污染的節點上排程網繭。
不過,單獨的容許無法防止排程器將 Pod 放置在沒有任何污染的背景工作節點上。例如,具有容許功能的運算密集型 Pod 可能會無意中排程在一般用途未受污染的節點上。在該案例中,網繭的節點相似性內容會指示排程器將網繭置於符合節點相似性中指定之節點選取準則的節點上。
污染、容許和節點相似性一起指示排程器在具有相符污點的節點上一致地排程網繭,以及符合在網繭上指定的節點相似性節點選取準則的節點標籤。
此模式提供 Kubernetes 部署資訊清單檔案範例,以及建立 EKS 叢集、部署應用程式和驗證網繭放置的步驟。
先決條件和限制
先決條件
已設定登入資料的 AWS 帳戶,可在您的 AWS 帳戶上建立資源
AWS 命令列界面 (AWS CLI)
eksctl
kubectl
Docker
已安裝 (針對正在使用的作業系統),並啟動引擎 (如需 Docker 授權需求的相關資訊,請參閱 Docker 網站) Java
版本 11 或更新版本 在您最喜歡的集成開發環境(IDE)上運行的 Java 微服務; 例如,AWS Cloud9
,IntelliJ 理想社區版 或 E clipse (如果您沒有 Java 微服務,請參閱在 Amazon EKS 模式和微服務與春季部署示例 Java 微服務以獲取有關創建微服務的 幫助)
限制
此模式不提供 Java 代碼,並假定您已經熟悉 Java。若要建立基本的 Java 微服務,請參閱在 Amazon EKS 上部署範例 Java 微服務。
本文中的步驟建立可累積成本的 AWS 資源。請務必在完成實作和驗證模式的步驟之後清理 AWS 資源。
架構
目標技術堆疊
Amazon EKS
Java
Docker
Amazon Elastic Container Registry (Amazon ECR)
目標架構
解決方案架構圖顯示具有兩個網繭 (部署 1 和部署 2) 的 Amazon EKS,以及兩個節點群組 (ng1 和 ng2),每個節點各有兩個節點。網繭和節點具有下列屬性。
| 部署 1 個網繭 | 部署 2 網繭 | 節點群組 1 | 節點群組 2 |
---|---|---|---|---|
寬容 | 鍵:分類工作負載, 值:真, 效果: NoSchedule 關鍵:機器學習工作負載,值:真,效果: NoSchedule | 無 |
|
|
節點相似性 | 鍵:阿爾法 .eksctl.io /節點組名稱 = ng1; | 無 | 節點群組. 名稱 = ng1 |
|
污點 |
|
| 鍵:分類工作負載, 值:真, 效果: NoSchedule 關鍵:機器學習工作負載,值:真,效果: NoSchedule | 無 |
![具有兩個網繭和兩個節點群組的 Amazon EKS 組態。](images/pattern-img/48cdff1d-8ee3-43ac-9351-88c52227ba4c/images/07979be0-1268-49e5-ac0c-11a64479c194.png)
部署 1 網繭已定義容許和節點相似性,這會指示 Kubernetes 排程器將部署網繭放在節點群組 1 (ng1) 節點上。
節點群組 2 (ng2) 沒有符合部署 1 的節點相似性節點選取器運算式的節點標籤,因此 Pod 不會排程在 ng2 節點上。
部署 2 Pod 沒有在部署資訊清單中定義任何容許或節點相似性。由於節點上的污點,排程器將拒絕排程節點群組 1 上的部署 2 Pod。
部署 2 Pod 將改為放置在節點群組 2 上,因為節點沒有任何污點。
此模式示範,透過使用污點和容許結合節點相似性,您可以控制 Pod 在特定工作節點集上的放置。
工具
AWS 服務
AWS Command Line Interface (AWS CLI) (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列殼層中的命令與 AWS 服務互動。
Amazon Elastic Container Registry (Amazon ECR) 是一種安全、可擴展且可靠的受管容器映像登錄服務。
Amazon Elastic Kubernetes Service (Amazon EKS) 可協助您在 AWS 上執行 Kubernetes,而無需安裝或維護自己的 Kubernetes 控制平面或節點。
eksctl 是 AWS 相當於庫貝克特爾,並有助於創建 EKS。
其他工具
史诗
任務 | 描述 | 所需技能 |
---|---|---|
建立叢集 .yaml 檔案。 |
| 應用程式擁有者、AWS DevOps、雲端管理員、 DevOps 工程師 |
使用 eksctl 建立叢集。 | 執行
| AWS DevOps、AWS 系統管理員、應用程式開發人員 |
任務 | 描述 | 所需技能 |
---|---|---|
建立 Amazon ECR 私有儲存庫。 | 若要建立 Amazon ECR 儲存庫,請參閱建立私有存放庫。請注意回購的 URI。 | AWS DevOps、 DevOps 工程師、應用程式開發者 |
創建碼頭文件。 | 如果您有要用來測試模式的現有 Docker 容器映像檔,則可以略過此步驟。 要創建一個 Dockerfile,請使用以下代碼片段作為參考。如果您遇到錯誤,請參閱疑難排解一節。
| AWS DevOps、 DevOps 工程師 |
創建 pom.xml 和源文件,並構建和推送碼頭映像。 | 若要建立 使用該模式中的說明來構建和推送 Docker 映像。 | AWS DevOps、 DevOps 工程師、應用程式開發者 |
任務 | 描述 | 所需技能 |
---|---|---|
建立部署的 .yaml 檔案。 | 若要建立 在程式碼中,節點相似性的索引鍵是您在建立節點群組時建立的任何標籤。此模式使用 eksctl 創建的默認標籤。如需自訂標籤的相關資訊,請參閱 Kubernetes 文件中的將網繭指派給節點 節點相似性索引鍵的值是由建立的節點群組名稱 若要取得污點的索引鍵和值,請執行下列命令。
映像檔是您在先前步驟中建立的 Amazon ECR 儲存庫的 URI。 | AWS DevOps、 DevOps 工程師、應用程式開發者 |
部署檔案。 | 若要部署到 Amazon EKS,請執行下列命令。
| AWS 應用程式開發人員、 DevOps 工程師 DevOps |
檢查部署。 |
| AWS 應用程式開發人員、 DevOps 工程師 DevOps |
建立沒有容許和節點相似性的第二個部署 .yaml 檔案。 | 此額外步驟是驗證在部署資訊清單檔案中未指定任何節點相似性或容許時,產生的 Pod 不會在具有污染物的節點上排程。(它應該安排在沒有任何污點的節點上)。使用下列程式碼建立名為的新部署檔案
| 應用開發人員、AWS DevOps、 DevOps 工程師 |
部署第二個部署 .yaml 檔案,並驗證網繭放置 |
| 應用開發人員、AWS DevOps、 DevOps 工程師 |
任務 | 描述 | 所需技能 |
---|---|---|
清除資源。 | 若要避免對仍在執行的資源產生 AWS 費用,請使用下列命令。
| AWS 應用程 DevOps式開發人員 |
故障診斷
問題 | 解決方案 |
---|---|
如果您的系統使用 arm64 架構(特別是在 M1 Mac 上運行此體系結構
| 如果您在運行 Docker 文件時出現錯誤,請用以下
|
相關資源
其他資訊
部署. 羊
apiVersion: apps/v1 kind: Deployment metadata: name: microservice-deployment spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: java-microservice template: metadata: labels: app.kubernetes.io/name: java-microservice spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: alpha.eksctl.io/nodegroup-name operator: In values: - <node-group-name-from-cluster.yaml> tolerations: #only this pod has toleration and is viable to go to ng with taint - key: "<Taint key>" #classified_workload in our case operator: Equal value: "<Taint value>" #true effect: "NoSchedule" - key: "<Taint key>" #machine_learning_workload in our case operator: Equal value: "<Taint value>" #true effect: "NoSchedule" containers: - name: java-microservice-container image: <account_number>.dkr.ecr<region>.amazonaws.com/<repository_name>:latest ports: - containerPort: 4567
描述 pod 示例輸出
Name: microservice-deployment-in-tainted-nodes-5684cc495b-vpcfx Namespace: default Priority: 0 Node: ip-192-168-29-181.us-west-1.compute.internal/192.168.29.181 Start Time: Wed, 14 Sep 2022 11:06:47 -0400 Labels: app.kubernetes.io/name=java-microservice-taint pod-template-hash=5684cc495b Annotations: kubernetes.io/psp: eks.privileged Status: Running IP: 192.168.13.44 IPs: IP: 192.168.13.44 Controlled By: ReplicaSet/microservice-deployment-in-tainted-nodes-5684cc495b Containers: java-microservice-container-1: Container ID: docker://5c158df8cc160de8f57f62f3ee16b12725a87510a809d90a1fb9e5d873c320a4 Image: 934188034500.dkr.ecr.us-east-1.amazonaws.com/java-eks-apg Image ID: docker-pullable://934188034500.dkr.ecr.us-east-1.amazonaws.com/java-eks-apg@sha256:d223924aca8315aab20d54eddf3443929eba511b6433017474d01b63a4114835 Port: 4567/TCP Host Port: 0/TCP State: Running Started: Wed, 14 Sep 2022 11:07:02 -0400 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ddvvw (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-ddvvw: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: classifled_workload=true:NoSchedule machine_learning_workload=true:NoSchedule node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: <none>