<p>kubeadm alpha阶段的证书全部续期,还应该更新KubeConfig文件中的证书</p>

创建于 2019-01-25  ·  41评论  ·  资料来源: kubernetes/kubeadm

功能要求

版本号

kubeadm版本v1.12.5

环境

  • Kubernetes版本v1.12.5
  • 硬件配置:1个主控(VM),2个节点(硬件)
  • 操作系统(例如/ etc / os-release中的版本):Ubuntu 16.04.5 LTS(Xenial Xerus)
  • 内核(例如uname -a ):Linux node1 4.4.0-141-generic#167-Ubuntu SMP Wed Dec 5 5:40:15 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux

发生了什么?

我的集群中有3个已经使用1年了。 由于某些证书的有效期为一年,因此群集无法正常工作。 在证书到期之前,我已经将群集从1.10.12升级到1.11.6和1.12.5。

我遇到了几个问题:

即使启用了证书轮换,kubelet.conf也会指向过期的证书

  • 由于在其中一项升级中启用了证书轮换(不确定何时),因此pem文件/var/lib/kubelet/pki/kubelet-client-current.pem已正确轮换,但是

    • 在节点上: client-certificateclient-key /etc/kubernetes/kubelet.conf仍指向/var/lib/kubelet/pki/kubelet-client.*

    • 在Master上: client-certificate-dataclient-key-data /etc/kubernetes/kubelet.conf仍然包含即将过期的证书。

    • 我必须在所有节点和所有群集上手动更新client-certificate-dataclient-key-data

    • 或者,可以使用sudo kubeadm alpha phase kubeconfig kubelet在主节点和所有节点上重新生成此文件!

证书轮换不更新apiserver / etcd / front-proxy-client证书

  • 证书轮换似乎没有更新Master上的其他任何证书,即

    • apiserver *

    • etcd *

    • 前代理客户

命令kubeadm alpha phase certs renew all不会更新KubeConfig文件

  • 我已经手动在主服务器上发出了sudo kubeadm alpha phase certs renew all来续订/etc/kubernetes/pki所有已过期的证书,可以,

    • 像以下这样的KubeConfig文件不会更新:



      • /etc/kubernetes/admin.conf


      • /etc/kubernetes/controller-manager.conf


      • /etc/kubernetes/scheduler.conf



  • 因此,静态Pod仍在使用旧证书,因此我不得不使用sudo kubeadm alpha phase kubeconfig all --apiserver-advertise-address=x.x.x.x

    • 另外,还必须重新启动静态Pod(或更容易的主服务器)以重新读取新证书。

    • 如果证书已经过期,情况甚至会更糟。 在这种情况下,您可以kubectl -n kube-system delete pod kube-apiserver-mater看起来确实有效,但实际上pod从未重新启动-我不得不停止并使用docker stop / start启动容器。

您预期会发生什么?

  • 我认为关于第一个问题没有什么可以做的,如果配置文件错误,群集应如何通知管理员...
  • 证书轮换负责kubelet,因此第二个问题也无济于事
  • 对于证书续订,我建议更新文档(https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/)并注明何时运行此命令(每年一次)。 乍看之下,不清楚是必须在主节点和所有节点上还是仅在主节点上执行此命令...
  • 我还建议该命令也更新KubeConfig文件,或者至少向用户提供一些提示,提示他应该手动执行此操作。 它还应该建议在更新KubeConfig文件后重新启动静态Pod。
  • kubeadm alpha phase kubeconfig应该在配置写入后重新启动静态Pod,或者通知用户这样做。

此致
安德烈亚斯(Andreas)

aresecurity kinbug kindocumentation lifecyclactive prioritimportant-soon

最有用的评论

/分配
/生命周期有效

我正在着手解决这个问题。
有待解决的不同问题(_2019年5月14日更新_)

  • 即使启用了证书轮换,kubelet.conf也会指向过期的证书(已经由https://github.com/kubernetes/kubeadm/issues/1317进行了跟踪)
  • 证书轮换不会更新apiserver / etcd / front-proxy-client证书(由https://github.com/kubernetes/kubernetes/pull/76862修复)
  • 命令kubeadm alpha阶段的证书全部更新不会更新KubeConfig文件(由https://github.com/kubernetes/kubernetes/pull/77180修复)
  • 有关证书续订的文档(包含有关在何处,何时,kubeconfig,HA运行命令的更多详细信息)

我将在单独的PR中解决所有这些问题

所有41条评论

@MalloZup
当然,但是请注意,加入阶段是高度优先的。

听起来不错! 多谢。

你好,

关于这个话题还有一件事。

如果在发出命令时已配置conf文件,则kubeadm alpha phase kubeconfig all显示此消息:

[kubeconfig] Using existing up-to-date KubeConfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing up-to-date KubeConfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing up-to-date KubeConfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing up-to-date KubeConfig file: "/etc/kubernetes/scheduler.conf"

它不会检查证书是否已过期,因此我认为up-to-date具有误导性。

要将更新的证书放入文件中,必须先删除文件,然后日志如下所示:

[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"   

就我而言,虽然我还不错,但几天后由于过期证书,静态Pod无法通信。

此致
安德烈亚斯(Andreas)

分配给@MalloZup

@MalloZup :GitHub不允许我分配以下用户:MalloZup。

请注意,只能分配kubernetes成员和回购协作者,并且问题/ PR只能同时有10个受让人。
有关更多信息,请参见贡献者指南。

针对

/分配

在此处获得使用PR注释与我互动的说明。 如果您对我的行为有任何疑问或建议,请针对kubernetes / test-infra存储库提出问题。

@adoerler thx问题。 关于误导性信息,我已经发送了PR https://github.com/kubernetes/kubernetes/pull/73798。

有时间后,我将继续讨论其余的问题。 对于问题的时间和精确度表示感谢

@adoerler我已向您发送DOC公关以供您提出建议。 随意看看tia:rocket:
(https://github.com/kubernetes/website/pull/12579)

@MalloZup

谢谢你的公关!

我错过了有关kubeconfig文件的句子,因为certs renew只是游戏的一部分。
就像是:

证书更新后,不要忘记使用kubeadm alpha phase kubeconfig ...重新创建KubeConfig文件。

谢谢。 我没有添加文档,因为我认为实际上我们可以续订kubeconfig文件。 其余重新启动的Pod,我们可以委派给用户并编写最少的文档。 @fabriziopandini @lubomir @ereslibre我在此实现上缺少某些内容吗? ia

@MalloZup我对证书续订的工作方式不甚了解。

就个人而言,我想在采取行动之前澄清一下总体历史-包括上面建议的内容-:

  • kubeadm alpha phase certs renew应该管理什么
  • kubeadm upgrade期间应自动管理什么
  • 应该记录什么(并由用户管理)
  • 这如何适用于HA群集
  • 集群变体如何影响这一点(例如外部etcd,外部CA)
  • 等等。

但我对这个领域比我更熟练的人说了最后一句话

我认为我们应该在会议上预留时间,讨论我们建议的证书续订政策应是什么。 关于证书管理的页面可能需要一些额外的细节:
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs

而且我们至少需要针对单个控制平面集群编写一个小型指南。

用户一直在做的事情就是自己解决问题:
https://github.com/kubernetes/kubeadm/issues/581#issuecomment -421477139
^此评论和上面的评论包含用户制作的指南。

这表明我们需要添加官方指南。
cc @timothysc @liztio

/分配@ereslibre

目前,拥有数百名用户的集群处于阻塞状态。 我可以快速指南如何处理过期的证书吗?

@ dimm0

用户一直在做的事情就是自己解决问题:
第581章(评论)
^此评论和上面的评论包含用户制作的指南。

这些是我们拥有ATM的唯一指南。

[root<strong i="5">@controller0</strong> ~]# kubeadm alpha phase certs apiserver --apiserver-advertise-address 1.2.3.4
Error: unknown flag: --apiserver-advertise-address
Usage:

Flags:
  -h, --help   help for phase

Global Flags:
      --log-file string   If non-empty, use this log file
      --rootfs string     [EXPERIMENTAL] The path to the 'real' host root filesystem.
      --skip-headers      If true, avoid header prefixes in the log messages
  -v, --v Level           log level for V logs

error: unknown flag: --apiserver-advertise-address
[root<strong i="6">@controller0</strong> ~]# kubeadm alpha phase certs apiserver
This command is not meant to be run on its own. See list of available subcommands.

在1.13的init阶段中,已逐步升级为上级的init命令:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd -phase-certs

在1.12中,该标志应位于:
https://v1-12.docs.kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd -phase-certs

1.11即将失去支持。

删除生命周期/活动标签。
移至1.15。

可能的文档在这里更新了一些想法:
https://github.com/kubernetes/kubeadm/issues/1361#issuecomment -463192631

@ neolit123
问题:在具有主HA的1.14中,是否足以在单个主服务器上遵循https://github.com/kubernetes/kubeadm/issues/581#issuecomment -421477139,否则我们必须重新加入辅助主服务器才能重新获取证书?

重新加入辅助控制平面节点,在1,14中似乎是一种快速可行的选择。
关于HA证书轮换,我们还没有任何文档。
(更不用说我们还没有添加适当的步骤,例如https://github.com/kubernetes/kubeadm/issues/581#issuecomment-421477139做到了)。

--experimental-upload-certs是否不是为HA中的证书轮换提供更简单解决方案的基础?

HA证书轮换的一种方法是:

  • 在单个控制平面节点上,请按照上述步骤更新其证书
  • 在同一CP节点调用上:
kubeadm init phase upload-certs --experimental-upload-certs

存储证书密钥。

kubeadm token create --print-join-command

将连接命令与令牌一起存储。

使用令牌和证书密钥重新加入其余的控制平面节点,使用--certs-key .... --experimental-control-plane-join一对一

对于工人:流失,使用新令牌重新加入,取消密码,一个接一个。

(可选)删除结果令牌。

@ neolit123
在3个主机集群中,当我们更改“主要”主机上的证书时,etcd将随着证书的更改而停止工作(仲裁必须至少为51%)? 如果是这样,也许我们必须以某种方式封锁两个二级主服务器,然后才更改证书? 是否可以使用“密码大师”?

我不是专家,但是我不认为自动证书副本会出现在这张图片中

自动复制证书可处理CA,前置代理CA,etcd-CA(具有10年的TTL)和SA密钥(无TTL)

证书更新命令触摸所有其他证书(具有TTL的1年),这些证书在主证书之间有所不同。
AFAIK,目前没有任何东西可以处理kubeconfig文件的证书续订

好的,我没有考虑“证书副本”实际上在这里做什么。
无论哪种方式,我们都需要编写适当的证书轮换文档。

/分配
/生命周期有效

我正在着手解决这个问题。
有待解决的不同问题(_2019年5月14日更新_)

  • 即使启用了证书轮换,kubelet.conf也会指向过期的证书(已经由https://github.com/kubernetes/kubeadm/issues/1317进行了跟踪)
  • 证书轮换不会更新apiserver / etcd / front-proxy-client证书(由https://github.com/kubernetes/kubernetes/pull/76862修复)
  • 命令kubeadm alpha阶段的证书全部更新不会更新KubeConfig文件(由https://github.com/kubernetes/kubernetes/pull/77180修复)
  • 有关证书续订的文档(包含有关在何处,何时,kubeconfig,HA运行命令的更多详细信息)

我将在单独的PR中解决所有这些问题

@ neolit123 @fabriziopandini
您提到的轮换CA证书的步骤是什么? 是否可以将其记录下来? 旋转包括CA的私钥怎么办?

在另一个问题中跟踪了@ tushar00jain CA证书的轮换https://github.com/kubernetes/kubeadm/issues/1350
此问题仅针对已签名的证书

@fabriziopandini,我想在今天关闭这张票,因为您可以发送续签的PR。 门票应该关闭吗?

即使启用了证书轮换,kubelet.conf也会指向过期的证书(已由#1317跟踪)

是的,这是在一个单独的问题中进行跟踪的,可能需要就我们应提供的解决方法进行讨论/文档。

证书轮换不会更新apiserver / etcd / front-proxy-client证书(已由kubernetes / kubernetes#76862修复)

命令kubeadm alpha阶段的证书全部更新不会更新KubeConfig文件(由kubernetes / kubernetes#77180修复)

有关证书续订的文档(包含有关在何处,何时,kubeconfig,HA运行命令的更多详细信息)

上面的3应该做。

/关闭
根据上面的评论,大多数工作已经完成; 在单独的/专用的问题中跟踪丢失的位

@fabriziopandini :结束本问题。

针对

/关闭
根据上面的评论,大多数工作已经完成; 在单独的/专用的问题中跟踪丢失的位

在此处获得使用PR注释与我互动的说明。 如果您对我的行为有任何疑问或建议,请针对kubernetes / test-infra存储库提出问题。

有人可以向我解释如何解决“即使启用了证书轮换,kubelet.conf也指向过期的证书”部分? 链接中提到此问题的唯一问题已明确关闭,转而支持另一个问题,该问题已用“我不确定此问题是否已解决,因此请打开新故障单”来解决。
我在1.16上,看不到kubelet.confsudo kubeadm alpha certs renew all发生任何续订。 缺少什么? @ neolit123

快速回顾很长的讨论。

  1. 除kubelet.conf外,所有证书的证书轮换现在由kubeadm alpha证书续订管理。
  2. kubelet.conf的证书轮换将由kubelet本身管理(除非用户选择退出自动证书轮换)

到目前为止,第二点已适用于所有节点,但运行kubeadm init的节点除外。 https://github.com/kubernetes/kubernetes/pull/84118将解决此问题

@fabriziopandini谢谢你,这很有意义。

对于从现在到解决上述问题之间过时的kubelte.conf中面临证书问题的其他人,我发现本文很有帮助:

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#check -certificate-expiration

在使用kubeadm init创建的节点上,kubeadm 1.17之前的版本存在一个错误,您必须手动修改kubelet.conf的内容。 kubeadm初始化完成后,您应该更新kubelet.conf以指向旋转的kubelet客户端证书,方法是将client-certificate-data和client-key-data替换为:

client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

@AndrewSav谢谢你。 我已经使用了promethes运算符来监视集群。 我最近收到一条警报:“ Kubernetes API证书将在不到7天的时间内到期”,我认为这与此问题有关。 我已经更新了主节点上kubelet.conf的内容。 但是我仍然得到警报。 你有什么建议吗? Tks。

@tannh(如果您使用kubeadm安装了集群),请使用kubeadm检查证书的到期时间。 否则,您的问题可能与您无关。

在使用kubeadm init创建的节点上,kubeadm 1.17之前的版本存在一个错误,您必须手动修改kubelet.conf的内容。 kubeadm初始化完成后,您应该更新kubelet.conf以指向旋转的kubelet客户端证书,方法是将client-certificate-data和client-key-data替换为:

这也将在1.17的发行说明中。

@adoerler我仍在运行旧版本的kubeadm,证书更新后如何更新kubelet.conf,admin.con等。

我运行了“ kubeadm alpha certs renew all”,它生成了新的证书,然后我需要在/ etc / kubernetes下编辑所有.conf,如何? 他们到底应该指向哪里?
如果是多个主节点,是否应该在所有主节点中运行该命令?

@SuleimanWA

我无法告诉您如何在多主机环境中进行操作,我的设置中只有一个主机。

这是我所做的:

首先,请确保将现有的conf文件移开,因为现有的文件不会被覆盖!

mv /etc/kubernetes/admin.conf /backup
mv /etc/kubernetes/kubelet.conf /backup
mv /etc/kubernetes/controller-manager.conf /backup
mv /etc/kubernetes/scheduler.conf /backup

然后更新这些文件:

user<strong i="13">@master</strong>:~$ sudo kubeadm alpha phase kubeconfig all --apiserver-advertise-address=<INSERT-YOUR-APISERVER-IP-HERE>
I0124 21:56:14.253641   15040 version.go:236] remote version is much newer: v1.13.2; falling back to: stable-1.12
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"    

要在静态系统Pod中应用新证书,对我而言,最简单的方法是简单地重新启动主服务器。

不要忘记将client-certificate-dataclient-key-data/etc/kubernetes/admin.conf复制到本地.kube/config

希望这可以帮助

安德烈亚斯(Andreas)

知道如何在1.14.10上运行此命令吗? 我得到的是:

kubeadm alpha phase kubeconfig all --apiserver-advertise-address=192.168.102.170 Error: unknown flag: --apiserver-advertise-address

然后文档说:
kubeadm alpha phase kubeconfig all
我得到:
This command is not meant to be run on its own. See list of available subcommands.

谢谢

@provgregoryabdo

您的kubeadm version输出是多少?

安德烈亚斯(BR Andreas)

@provgregoryabdo phase命令移出alpha并在更高版本中初始化,因此您可以使用类似

kubeadm init phase kubeconfig all --apiserver-advertise-address=<your_address>

@adoerler感谢您的帮助!

此页面是否有帮助?
0 / 5 - 0 等级