如何在EKS集群中获取etcd端点、访问etcd查看数据并为Calico CNI配置该端点
在EKS集群中获取etcd端点、访问数据及配置Calico CNI的完整指南
我来一步步帮你搞定这个问题——EKS的托管etcd和自建K8s集群的etcd玩法不太一样,得注意几个关键细节:
一、获取EKS集群的etcd端点
EKS的etcd是AWS完全托管的,不会直接对外暴露,但我们可以从kube-apiserver的启动配置里拿到它的端点:
- 先找出kube-system命名空间下的kube-apiserver pod:
kubectl get pods -n kube-system -l component=kube-apiserver - 随便选一个apiserver pod,查看它的配置文件里的etcd连接参数:
kubectl exec -n kube-system <替换成你的apiserver pod名称> -- cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep -A 5 etcd
你会看到类似这样的输出:
其中--etcd-servers=https://etcd-xxxxxx.us-west-2.eks.amazonaws.com:2379,https://etcd-yyyyyy.us-west-2.eks.amazonaws.com:2379 --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key--etcd-servers后面的就是etcd的端点列表。
二、访问EKS的etcd并查看数据
因为EKS的etcd启用了严格的TLS认证,你需要拿到对应的证书才能连接:
- 从apiserver pod里把所需的TLS文件复制到本地:
# 复制CA证书 kubectl cp kube-system/<你的apiserver pod名称>:/etc/kubernetes/pki/etcd/ca.crt ./etcd-ca.crt # 复制客户端证书 kubectl cp kube-system/<你的apiserver pod名称>:/etc/kubernetes/pki/apiserver-etcd-client.crt ./etcd-client.crt # 复制客户端密钥 kubectl cp kube-system/<你的apiserver pod名称>:/etc/kubernetes/pki/apiserver-etcd-client.key ./etcd-client.key - 安装
etcdctl工具,注意要和EKS集群的etcd版本匹配(可以通过AWS控制台查看集群的etcd版本,或者从apiserver的参数里推断)。 - 配置环境变量并连接etcd:
重要提醒:AWS不建议直接操作托管的etcd,随意修改数据可能导致集群崩溃,操作前请务必确认风险!export ETCDCTL_API=3 export ETCDCTL_CACERT=./etcd-ca.crt export ETCDCTL_CERT=./etcd-client.crt export ETCDCTL_KEY=./etcd-client.key # 先测试连接是否正常 etcdctl --endpoints=<你的etcd端点列表> member list # 查看etcd里所有的key前缀 etcdctl --endpoints=<你的etcd端点列表> get / --prefix --keys-only # 查看具体数据,比如某台节点的信息 etcdctl --endpoints=<你的etcd端点列表> get /registry/nodes/<你的节点名称>
三、配置Calico CNI使用EKS的etcd端点
如果你的Calico是使用etcd作为数据存储(而非默认的Kubernetes API模式),需要做以下配置:
- 编辑Calico的ConfigMap,更新etcd端点:
kubectl edit configmap calico-config -n kube-system
在data部分找到etcd_endpoints,替换成你拿到的EKS etcd端点,同时配置TLS路径:data: etcd_endpoints: "https://etcd-xxxxxx.us-west-2.eks.amazonaws.com:2379,https://etcd-yyyyyy.us-west-2.eks.amazonaws.com:2379" etcd_ca: "/etc/calico/ssl/ca.crt" etcd_cert: "/etc/calico/ssl/client.crt" etcd_key: "/etc/calico/ssl/client.key" - 创建Secret存储etcd的TLS证书:
kubectl create secret generic calico-etcd-secrets -n kube-system \ --from-file=etcd-ca.crt=./etcd-ca.crt \ --from-file=etcd-client.crt=./etcd-client.crt \ --from-file=etcd-client.key=./etcd-client.key - 修改Calico Node的DaemonSet,挂载这个Secret:
kubectl edit daemonset calico-node -n kube-system
在volumes部分添加:
在volumes: - name: etcd-certs secret: secretName: calico-etcd-secretscontainers的volumeMounts部分添加:volumeMounts: - mountPath: /etc/calico/ssl name: etcd-certs readOnly: true - 同样修改Calico Kube Controllers的Deployment,添加相同的挂载配置(如果存在的话):
kubectl edit deployment calico-kube-controllers -n kube-system - 重启Calico相关的Pod,让配置生效:
重启后可以查看Calico pod的日志,确认是否成功连接到etcd。kubectl rollout restart daemonset calico-node -n kube-system kubectl rollout restart deployment calico-kube-controllers -n kube-system
内容的提问来源于stack exchange,提问作者Haridvpsk
相关产品推荐
相关产品推荐

