aws eks创建节点组的不同方式逻辑和相关错误

该问题来源于,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

img

–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 additional kubelet 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创建托管节点组

By design, nodegroups are immutable. This means that if you need to change something (other than scaling) like the AMI or the instance type of a nodegroup, you would need to create a new nodegroup with the desired changes

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......

控制台创建托管节点组

控制台创建节点组并不适用启动模板,是创建节点组的最简单方式

在这里插入图片描述

此时启动模板的内容为空。创建节点组的逻辑仍旧是通过autosaling group创建节点组,并且也使用了启动模板。

在这里插入图片描述
直接修改asg的启动模板,控制台并不会显示更新按钮

和通过eksctl创建托管节点组的逻辑一致,无法通过修改启动模板完成节点类型的转换,但是可以直接修改asg的实例类型
在这里插入图片描述
此时尽管节点组的类型为t3,但是实际的实例类型为m5,很诡异
在这里插入图片描述

控制台创建托管节点组——指定启动模板

注意:托管节点组的更新操作只能修改节点组的大小,无法修改实例类型等参数

指定模板更新,节点组更新中,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.

创建和修改节点组配置的相关错误

托管节点组相关错误

修改启动模板的版本,并修改asg对应的模板版本,扩容实例后节点组降级,出现以下报错

The Amazon EC2 Launch Template : lt-09daxxxxxd3d94 has a new version (2) associated with your Autoscaling group, which is not managed by Amazon EKS. Expected Launch Template version : (1)

直接修改asg的子网配置为asg原本设置之外的子网,节点组降级并报错

The Amazon AutoScalingGroup eks-test124-ng1-44c2b1e5-8407-b246-3f35-3ff1efb4fcb9 has subnets ([subnet-069xxxxxxccd1]) which is not expected by Amazon EKS. Expected subnets : ([subnet-042e85xxxxxxd815, subnet-0d4xxxxxe127190])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值