kubeadm版本:1.10.2
环境:
几个月前,按照“官方”文档https://kubernetes.io/docs/setup/independent/high-availability/ ,我使用kubeadm 1.9.3
创建了一个kubernetes 1.9.3 HA集群, etcd
HA群集使用静态Pod将其托管在主节点上
我想使用最新的kubeadm
将群集升级到k8s 1.10.2
kubeadm
; 更新kubeadm
,运行kubeadm upgrade plan
,出现以下错误:
[root@shared-cob-01 tmp]# kubeadm upgrade plan
[preflight] Running pre-flight checks.
[upgrade] Making sure the cluster is healthy:
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[upgrade/plan] computing upgrade possibilities
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.9.3
[upgrade/versions] kubeadm version: v1.10.2
[upgrade/versions] Latest stable version: v1.10.2
[upgrade/versions] FATAL: context deadline exceeded
我对此问题进行了调查,发现了两个根本原因:
kubeadm
无法将etcd
集群标识为启用TLS指南指示在etcd
静态窗格中使用以下命令
- etcd --name <name> \
- --data-dir /var/lib/etcd \
- --listen-client-urls http://localhost:2379 \
- --advertise-client-urls http://localhost:2379 \
- --listen-peer-urls http://localhost:2380 \
- --initial-advertise-peer-urls http://localhost:2380 \
- --cert-file=/certs/server.pem \
- --key-file=/certs/server-key.pem \
- --client-cert-auth \
- --trusted-ca-file=/certs/ca.pem \
- --peer-cert-file=/certs/peer.pem \
- --peer-key-file=/certs/peer-key.pem \
- --peer-client-cert-auth \
- --peer-trusted-ca-file=/certs/ca.pem \
- --initial-cluster etcd0=https://<etcd0-ip-address>:2380,etcd1=https://<etcd1-ip-address>:2380,etcd2=https://<etcd2-ip-address>:2380 \
- --initial-cluster-token my-etcd-token \
- --initial-cluster-state new
kubeadm >= 1.10
检查(这里:https://github.com/kubernetes/kubernetes/blob/release-1.10/cmd/kubeadm/app/util/etcd/etcd.go#L56)如果etcd
通过检查static pod命令中是否存在以下标志来启用TLS。
"--cert-file=",
"--key-file=",
"--trusted-ca-file=",
"--client-cert-auth=",
"--peer-cert-file=",
"--peer-key-file=",
"--peer-trusted-ca-file=",
"--peer-client-cert-auth=",
但由于指令中使用了标记--client-cert-auth
和--peer-client-cert-auth
而没有任何参数(布尔值),因此kubeadm
无法识别etcd
群集具有TLS已启用。
个人修复:
我将etcd
静态pod命令更新为使用- --client-cert-auth=true
和- --peer-client-cert-auth=true
一般修复:
更新说明以使用--client-cert-auth=true
和--peer-client-cert-auth=true
并使用"--peer-cert-file"
和"--peer-key-file"
放松kubeadm检查(不包含等号)
kubeadm
没有使用正确的证书在修复点1之后,问题仍然存在,因为kubeadm
没有使用正确的证书。
通过遵循kubeadm HA指南,实际上,创建的证书为ca.pem
ca-key.pem
peer.pem
peer-key.pem
client.pem
client-key.pem
但最新的kubeadm
期望ca.crt
ca.key``peer.crt
peer.key``healthcheck-client.crt
healthcheck-client.key
。
kubeadm-config
MasterConfiguration键etcd.caFile
, etcd.certFile
和etcd.keyFile
被忽略。
个人修复:
将.pem
证书重命名为其等效的.crt
和.key
并更新了etcd
静态pod配置以使用它们。
一般修复:
使用kubeadm-config
data.caFile
, data.certFile
和data.keyFile
值,从etcd静态pod定义(pod路径+卷hostPath)推断正确的证书和/或创建升级期间要使用的新的临时客户端证书。
升级计划应已正确执行
按照https://kubernetes.io/docs/setup/independent/high-availability/使用kubeadm 1.9.3
创建一个k8s ha集群,并尝试使用最新的kubeadm
将其更新为k8s >= 1.10
kubeadm
此问题似乎已在kubeadm 1.10.3
修复,即使它不会自动更新静态etcd
吊舱,因为它将其识别为“外部”
我正在使用kubeadm 1.10.3
并有相同的问题。 我的集群是1.10.2,带有外部安全etcd
@brokenmass您个人修正的值是否会引起您注意到的第二个原因,如下所示:
caFile: /etc/kubernetes/pki/etcd/ca.crt
certFile: /etc/kubernetes/pki/etcd/healthcheck-client.crt
keyFile: /etc/kubernetes/pki/etcd/healthcheck-client.key
@detiber可以帮忙吗?
@FloMedja
在我的情况下,值看起来像:
caFile: /etc/kubernetes/pki/etcd/ca.pem
certFile: /etc/kubernetes/pki/etcd/client.pem
keyFile: /etc/kubernetes/pki/etcd/client-key.pem
并且1.10.3正常工作
@brokenmass因此,使用kubeadm 1.10.3可以正常运行,而无需您进行个人修复。 在这种情况下,我有点困惑。 我有kubeadm 1.10.3,但与您在此错误报告中提到的错误消息相同。 我将仔细检查我的配置,可能是我在其他地方犯了一些错误
在此处添加(或加入kubernetes slack并给我发送直接消息)您的kubeadm-config,etcd静态pod yml和kubeadm upgrade plan
的完整输出
抱歉,我现在才看到这一点。 @chuckha为static-pod HA etcd文档做了原始工作,接下来的几天我将与他合作,看看我们是否可以帮助您解决HA升级问题。
@detiber谢谢。 升级计划终于生效了。 但是在尝试升级群集时,我遇到了一些竞赛条件问题。 有时它可以正常工作,有时我会遇到与
我今天遇到了一些障碍,需要为此设置测试环境,而在周末开始之前我已经没有时间了。 下周初我会再讲。
/分配@chuckha @detiber
@chuckha @detiber @stealthybox对此有任何更新吗?
因此,1.9-> 1.10 HA升级不是受支持或经过审查的路径。
我们目前正在更新维护我们的文档(1.11-> 1.12),我们计划继续维护这些文档。