该问题来源于,eks节点组能否修改实例类型,不同创建方式修改节点参数的方式是否有区别。结论如下:
- eksctl创建托管节点组,无法通过修改启动模板修改节点类型(在eks控制台update会报错),但是可以直接修改asg的实例类型
- eksctl创建自管节点组,自由度最大,可以通过修改启动模板定制
- 控制台创建指定ami,需要手动添加userdata,可以修改启动模板并在控制台update,节点更新可以选择滚动更新策略
- 控制台创建不指定ami,自动添加userdata,可以修改启动模板并在控制台update,节点更新可以选择滚动更新策略
bootstrap.sh 启动脚本
需要在节点启动时执行 bootstrap.sh 加入eks集群,
节点需要通过以下命令获取实例类型
INSTANCE_TYPE=$(imds 'latest/meta-data/instance-type')
之后根据 eni-max-pods.txt 中的记录查找对应实例类型的最大pod数量,写入到kubelet service中
bootstrap启动脚本完成初始化操作后,最终会启动kubelet
,通过额外参数--cloud-provider string
指定cloud-provider
为aws
–cloud-provider string
The provider for cloud services. Set to empty string for running with no cloud provider. If set, the cloud provider determines the name of the node (consult cloud provider documentation to determine if and how the hostname is used). (DEPRECATED: will be removed in 1.24 or later, in favor of removing cloud provider code from Kubelet.)
如果不构建ami,也可以通过 KUBELET_EXTRA_ARGS
指定kubelet启动的额外参数
Set the “–kubelet-extra-args” flag when invoking bootstrap.sh
bootstrap.sh
, the script that bootstraps nodes when using the EKS Optimized AMI, supports a flag called--kubelet-extra-args
that allows you to pass in additionalkubelet
configuration./etc/eks/bootstrap.sh my-cluster --kubelet-extra-args '--registry-qps=20 --registry-burst=40'
注意:如果更新
kubelet
配置文件(bootstrap.sh
执行之后),需要重启kubelet
写入的service文件如下
if [[ -n "$KUBELET_EXTRA_ARGS" ]]; then
cat << EOF > /etc/systemd/system/kubelet.service.d/30-kubelet-extra-args.conf
[Service]
Environment='KUBELET_EXTRA_ARGS=$KUBELET_EXTRA_ARGS'
EOF
fi
$ cat /etc/systemd/system/kubelet.service
[Service]
ExecStartPre=/sbin/iptables -P FORWARD ACCEPT -w 5
ExecStart=/usr/bin/kubelet --cloud-provider aws \
--config /etc/kubernetes/kubelet/kubelet-config.json \
--kubeconfig /var/lib/kubelet/kubeconfig \
--container-runtime docker \
--network-plugin cni $KUBELET_ARGS $KUBELET_EXTRA_ARGS
支持的实例类型必然需要从 eni-max-pods.txt
寻找匹配项,因此如果某种实例类型不支持,只能自行创建ami,将max-pods的item添加到 eni-max-pods.txt 中
To add support for new instance types, at a minimum, we need to update
files/eni-max-pods.txt
using the amazon-vpc-cni-k8s package. to set the number of max pods available for those instance types. If the instance type is not on the list,bootstrap.sh
will fail when the node is started.
eksctl创建托管节点组
eksctl创建了启动模板,但是没有直接使用该启动模板,而是将该启动模板作为source,并调用eks api创建新的启动模板和相应的节点组,但是实例类型仍旧是在auto scaling 组中指定的(启动模板中没有指定实例类型,将启动模板中的类型覆盖)。因此只修改auto scaling组会发现,eks console和启动模板中尽管都没有该类型,但是节点仍旧能够启动。
使用eksctl
创建的节点组,额外参数中存在 eks.amazonaws.com/sourceLaunchTemplateId=lt-0b34caeab43941df3
$ cat /etc/systemd/system/kubelet.service.d/30-kubelet-extra-args.conf
[Service]
Environment='KUBELET_EXTRA_ARGS=--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/nodegroup-name=xxxxxxx,alpha.eksctl.io/cluster-name=worklearn,eks.amazonaws.com/nodegroup-image=ami-0b67ce88915e3b7fd,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=testtemp,eks.amazonaws.com/sourceLaunchTemplateId=lt-0b34caeab43941df3 --max-pods=110'
实例的启动模板为如下
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="//"
--//
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
set -ex
B64_CLUSTER_CA=xxxxxxxx
API_SERVER_URL=https://xxxxxxxxxxxx.sk1.cn-north-1.eks.amazonaws.com.cn
K8S_CLUSTER_DNS_IP=10.100.0.10
/etc/eks/bootstrap.sh xxxxxx --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/nodegroup-name=testtemp,alpha.eksctl.io/cluster-name=worklearn,eks.amazonaws.com/nodegroup-image=ami-0b67ce88915e3b7fd,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=testtemp,eks.amazonaws.com/sourceLaunchTemplateId=lt-0b34caeab43941df3 --max-pods=110' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
--//--
eksctl创建自管节点组
自管节点和托管节点组有所区别,自管节点组创建的资源更多
启动模板中此时已经加入了编码后的userdata,说明该auto scaling组并非调用eks api创建的,而是直接创建auto scaling组并加入集群
H4sIAAAAAAAA/7xYbXPiOnT+nl+hspmbu+0a/ALZJTN0GoPNu8GyJYO3OxlhKbGxLfvaIpBs8987hpANu9yd3k6nX0gsPc/R0dHReY79IUiyDZWCjN9HDxc5CWLywMobwDdJclFseJDSmwsJSKDxSIpGEq0ae0KjDIooF2WDxWUgksYqy0QpCpLXSaLWy/AfUUKW5KyoWNsiEuzuPkpYWa0aZFwwLm7A1feXqwsAsi1nxQ0oskzcVD8XAOREhDegwURwtBtvVixhQmI7UZD6usx4BWNFGpVllPHyBtTk62az9t7+f0kXAADQnVnu7dAy4B1EljucGh2aBTEr6GF2ghzXgHfW7dTobLMiThgp+H7qdj68cwyIDXiH4KQTCpGXN42G2TWbnw1FMb/02r0viqZ8Npo97bNxrbZbavdLr17GSj3gEs8KEUpKncVlnaTkOeNkW9aDLK0HB/v6dfPuuHz3tjNxZDFxlC5EdORGeg/iEXKQP7JlE8H9nCy6sTJy0PSRxFbP9nDoy6bmoJHuy0nXRlB3......
控制台创建托管节点组
注意:托管节点组的更新操作只能修改节点组的大小,无法修改实例类型等参数
指定模板更新,节点组更新中,eks会修改asg参数(min,desired,max)完成滚动更新
使用启动模板并指定ami
如果在启动模板中指定了ami,则需要编写userdata
控制台创建节点组选择多种实例类型,但际上创建的启动模板会选择默认的类型t3.medium
实例类型实际上是在auto scaling组中指定的
使用启动模板但不指定ami
在启动模板中不指定ami,会使用默认的ami并自动在userdata中填充内容
/etc/eks/bootstrap.sh xxxxx --kubelet-extra-args '--node-labels=eks.amazonaws.com/nodegroup-image=ami-0b67ce88915e3b7fd,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=xxxxxx --max-pods=110' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false
不指定ami,eks中现实的ami是日期编号
可以通过滚动更新的方式修改节点类型
开启pdb可能会影响滚动更新的结果
This option respects pod disruption budgets for your cluster. The update fails if Amazon EKS is unable to gracefully drain the pods that are running on this node group due to a pod disruption budget issue.