我想更改我的 Amazon Elastic Kubernetes Service (Amazon EKS) 托管节点组中的属性。
简短描述
更新托管节点组属性的过程取决于您要更改的属性类型。
您可以使用 UpdateNodegroupConfig 或 UpdateNodegroupVersion 更新以下属性:
- labels
- taints
- scalingConfig
- nodeRepairConfig
- updateConfig
- launchTemplate
**注意:**要编辑 launchTemplate 属性,必须在创建托管节点组时指定该属性。
您可以使用自定义启动模板更新以下属性:
- diskSize
- remoteAccess
- tags
**注意:**您也可以使用 TagResource API 来更新标签。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
要更改 instanceType 属性,请在创建托管节点组时在启动模板中指定实例类型。然后,您可以在启动模板中对其进行更新。
要更改 amiType 属性,请在创建节点组时在启动模板中指定 ImageId。然后,您可以将其更新为在启动模板中使用不同的亚马逊机器映像 (AMI) ID。
要更新无法直接修改的属性,必须先创建托管节点组。然后,可以选择设置容器组中断预算 (PDB),耗尽现有节点,并删除旧的托管节点组。
创建新的托管节点组
完成以下步骤:
- 创建新的托管节点组。
- 检查从您创建的托管节点组启动的节点是否成功加入集群。运行以下命令:
kubectl get node -l 'eks.amazonaws.com/nodegroup=my-new-node-group-name'
**注意:**将 my-new-node-group-name 替换为所需的新节点组名称。
如果节点成功加入集群,则您将看到类似于以下内容的输出:
NAME STATUS ROLES AGE VERSION
ip-192-168-95-10.ec2.internal Ready <none> 3m33s v1.33.3-eks-3abbec1
ip-192-168-96-53.ec2.internal Ready <none> 3m32s v1.33.3-eks-3abbec1
可选: 设置 PDB
为了安全地将容器组迁移到新创建的托管节点组并保持其可用性,最佳做法是为工作负载设置 PDB。
如果您已经使用 PDB,请检查配置。运行以下命令:
kubectl get pdb -n your_namespace
**注意:**将 your-namespace 替换为您的命名空间的名称。
输出示例:
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
my-pdb 2 N/A 2 95d
如果您尚未配置 PDB,则可以使用以下模板为每个工作负载创建一个。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: mypdb
namespace: your_namespace
spec:
minAvailable: 2
selector:
matchLabels:
app: myapp
**注意:**将 your_namespace 替换为您的命名空间的名称。
有关详细信息,请参阅使用容器组中断预算保护关键工作负载。
耗尽现有节点
将现有节点标记为不可调度,然后驱逐在其上运行的容器组。
**注意:**如果您使用 Kubernetes Cluster Autoscaler,请将部署缩减为零副本,以避免扩缩操作发生冲突。运行以下命令:
kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
完成以下步骤:
- 防止新的容器组被调度。运行以下命令:
kubectl cordon -l 'eks.amazonaws.com/nodegroup=my-old-node-group-name'
**注意:**将 my-old-node-group-name 替换为现有节点组名称。
- 逐一移除每个不可调度节点的工作负载。运行以下命令:
kubectl drain --ignore-daemonsets --delete-emptydir-data your_node
**注意:**将 your-node 替换为您的节点名称。
- 验证被驱逐的容器组是否在新节点上运行。运行以下命令:
kubectl get deploy -n your_namespace
**注意:**将 your_namespace 替换为您的命名空间的名称。
输出示例:
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/test 4/4 4 4 5d3h
删除旧的托管节点组
除了 DaemonSet 之外的所有容器组都被逐出现有节点后,删除旧的托管节点组。
相关信息
Kubernetes 数据面板