咨询下 k8 大佬一些问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jackgoudan
V2EX    Kubernetes

咨询下 k8 大佬一些问题

  •  
  •   jackgoudan 2023-04-14 15:10:44 +08:00 4378 次点击
    这是一个创建于 978 天前的主题,其中的信息可能已经有所发展或是发生改变。

    k8s 老集群的根 ca 证书即将到期,但是上面重要业务还不少,如何处理证书到期问题?

    1. 手动更新各种证书,看 k8s 文档手动更新所有证书的工作量属实也不少,在我看来和业务重建没啥区别了?
    2. 停机更新维护,可能部好推动,涉及的人可能有些多,但是是相对稳妥。
    38 条回复    2024-01-15 10:40:27 +08:00
    kindom
        1
    kindom  
       2023-04-14 15:17:58 +08:00
    cert-manager?
    jackgoudan
        2
    jackgoudan  
    OP
       2023-04-14 15:43:33 +08:00
    @kindom 没用过这个,主要问题是更新了证书后各种组件重建对现有的服务可能影响很大,同事也没搞过这个,不好评估影响范围。
    jingkong
        3
    jingkong  
       2023-04-14 15:55:26 +08:00
    把业务迁移到一个 新集群上去。。。。。。。。
    defunct9
        4
    defunct9  
       2023-04-14 15:57:05 +08:00
    续订就完事了
    asilin
        5
    asilin  
       2023-04-14 15:57:12 +08:00
    根证书默认是 10 年有效期,我猜你大概率是 CA 签发的服务证书到期了,这个是默认 1 年有效期

    如何更新 CA 签发的服务证书?在每个 master 节点执行下面的命令即可自动续期并生效:

    kubeadm certs renew all
    kubectl -n kube-system delete pod -l 'compOnent=kube-apiserver'
    kubectl -n kube-system delete pod -l 'compOnent=kube-controller-manager'
    kubectl -n kube-system delete pod -l 'compOnent=kube-scheduler'
    kubectl -n kube-system delete pod -l 'compOnent=etcd'
    YOOHUU
        6
    YOOHUU  
       2023-04-14 15:57:22 +08:00
    ca 不是 10 年有效期吗?
    jackgoudan
        7
    jackgoudan  
    OP
       2023-04-14 15:58:06 +08:00
    @asilin 不是这个,是的你没看错就是根 ca 到期了,一批相当老的集群初建是根 ca 设置了 5 年
    jackgoudan
        9
    jackgoudan  
    OP
       2023-04-14 15:58:36 +08:00
    @DAPTX4869 好老的集群了,而且初建集群时同事设置了 5 年,这会都要到了。
    dancercl
        10
    dancercl  
       2023-04-14 15:58:57 +08:00
    @kindom 我觉得他说的是 k8s server 和 agent API TLS 的证书,不是里边运行的服务的证书。
    jackgoudan
        11
    jackgoudan  
    OP
       2023-04-14 15:59:51 +08:00
    和大家澄清下,不是 apiserver.crt 等这种二级证书,是 ca.crt 这个根证书。
    asilin
        12
    asilin  
       2023-04-14 16:01:35 +08:00
    @jackgoudan 那就和 kubernetes 没关系了,相当于业务服务的跨主机迁移,让运维同学来操作后续事宜吧。
    jackgoudan
        13
    jackgoudan  
    OP
       2023-04-14 16:01:52 +08:00
    看了下文档更新 ca 的流程: https://kubernetes.io/docs/tasks/tls/manual-rotation-of-ca-certificates/ 内容也不少
    Judoon
        14
    Judoon  
       2023-04-14 16:07:56 +08:00
    你确定是根 ca 过期?
    各种集群初始化创建工具自签证书时,ca 都是 100 年起步的。倒是通过根 ca 签给 etcd 或者 kubelet 等组件的时候大概率会只有一年。看你怎么创建的集群,kubeadm 的话,一般可以通过 kubeadm certs renew 去更新

    其他的话,自己逐个替换证书,挺烦的,容易出错
    NeroKamin
        15
    NeroKamin  
       2023-04-14 16:09:55 +08:00
    @defunct9 老哥,你咋不让他开 SSH 你上去看看了
    jackgoudan
        16
    jackgoudan  
    OP
       2023-04-14 16:10:18 +08:00
    @Judoon 是呀,耳机证书过期了 renew 下就完了,没必要上论坛了。hh
    ysicing
        17
    ysicing  
       2023-04-14 16:21:17 +08:00
    @NeroKamin 估计 ssh 哥嫌麻烦哈哈哈
    feedcode
        18
    feedcode  
       2023-04-14 16:26:43 +08:00
    证书签名是公钥签的,所以你只需要更新 ca.crt 就可以了,不需要更新二级根证书和各个服务的证书

    # 更新 ca.crt
    openssl x509 -x509toreq -in ca.crt -signkey ca.key -out new-server.csr
    openssl x509 -req -days 3650 -in new-server.csr -signkey ca.key -out new-cacert.pem

    # 验证,老的 ca.crt 和新的 new-cacert.pem 都是可以通过的
    openssl verify -CAfile new-cacert.pem -verbose server.crt
    openssl verify -CAfile ca.crt -verbose server.crt

    只需要把 new-cacert.pem 替换成 ca.crt , 然后每个 node 都重启下就 ok 了
    defunct9
        19
    defunct9  
       2023-04-14 16:32:37 +08:00   2
    最烦换证书,就不登了 @NeroKamin
    YOOHUU
        20
    YOOHUU  
       2023-04-14 16:52:46 +08:00
    @feedcode #18 等 OP 测试结果
    jackgoudan
        21
    jackgoudan  
    OP
    &nbs;  2023-04-14 17:36:53 +08:00
    @feedcode 大佬实操过吗? 看着文档流程属实不少,感觉很容易出错
    defunct9
        22
    defunct9  
       2023-04-14 18:03:22 +08:00
    实在不行,可以找我,这种容易干翻服务器的事我基本天天干。 @jackgoudan
    feedcode
        23
    feedcode  
       2023-04-14 19:21:24 +08:00
    @jackgoudan 你看的文档是连私钥一起换的,只换公钥其实很简单,上面的 openssl verify 都有验证的
    idblife
        24
    idblife  
       2023-04-14 19:24:49 +08:00 via iPhone
    kubeadm 一条命令不就搞定了吗
    jackgoudan
        25
    jackgoudan  
    OP
       2023-04-14 20:21:23 +08:00
    @idblife adm 只更新 ca.crt 签发的二级证书,我们现在的情况是 根 ca 都要过期了。
    w469789747
        26
    w469789747  
       2023-04-14 20:47:48 +08:00
    @asilin 你是懂换证书的
    lixiang2017
        27
    lixiang2017  
       2023-04-14 21:05:02 +08:00 via Android
    一键更新。用过好多次,很好用,老版本也支持
    https://github.com/yuyicai/update-kube-cert
    plko345
        28
    plko345  
       2023-04-14 21:22:14 +08:00 via Android
    私钥不换继续用,openssl 用私钥生生成新的 ca.crt ,再签其它证书,重启 control plane 的组件,麻烦是挺麻烦的
    jackgoudan
        29
    jackgoudan  
    OP
       2023-04-14 22:50:54 +08:00
    @lixiang2017 这个也 kubeadm renew 效果差不多? 只能续签二级证书的吧 我今天看下下
    jackgoudan
        30
    jackgoudan  
    OP
       2023-04-18 15:16:04 +08:00
    @feedcode @plko345 两位大佬,请教下 ca.crt 被重建,那旧的 secret 如何处理呢? 旧 secret 内 ca.crt 字段还是老 ca ,难道要重建所有的 secret 吗?
    feedcode
        31
    feedcode  
       2023-04-18 21:27:13 +08:00
    是的,所有引用 ca 的都要更新,包括 kubeconfig
    jackgoudan
        32
    jackgoudan  
    OP
       2023-04-19 13:49:37 +08:00
    @feedcode 那这个方法和文档相比有点在哪呢? 我认为优点就是少了二级证书的签发,可以重新走 renew 的流程,其他的 secret 重建,kubeconfig 的重建,coredns 、kubeproxy 等系统组件等重启工作也是少不来的。
    feedcode
        33
    feedcode  
       2023-04-19 15:50:00 +08:00
    性质不一样的,你私钥没泄露只更新 ca.crt 就行了,如果私钥泄露了那只能一起换了,而且你要更新 2 遍才行。
    第一遍用 old ca +new ca 合并的 ca.crt, 否则会失败,第二遍是去掉 old ca 只保留新的。
    jackgoudan
        34
    jackgoudan  
    OP
       2023-04-19 16:57:12 +08:00
    @feedcode 了解,大佬说的不错,你说的就是文档的流程,维持了一个新老 ca 的中间态。你说的这个方法确实可行,不过完整的验证我我还要搭一个生产集群的再来测一遍。谢谢大佬,救了燃眉之急。
    jackgoudan
        35
    jackgoudan  
    OP
       2023-04-25 11:05:38 +08:00   2
    看帖子的动态,不少老哥收藏了帖子,@DAPTX4869 还期待后续,经过我的实验以后,@feedcode 的方案是可行,我简单说下步骤:
    1. 用 ca.crt 生成 csr 再生成新的 ca, 这一步 openssl 需要制定证书生成 v3 证书,v1 的证书 kubeadm 会认为不是 ca
    2. openssl 生成 csr 不包含扩展内容,需要加上选项 -x509toreq -copy_extensions copy all ,这个似乎需要 openssl v3 ,运维同事打包好的 debian 是 openssl 1.1.1n ,前面选项不可用。
    3. 在主 master 生成 ca,并且用 kubeadm renew 所有二级证书然后将 ca 复制到其他 master 节点,重启 master 节点的 kubelet ,确保 kubelet 的状态是 running 以后 再进行其他操作。
    4. 重启集群的关键组件,etcd,apiserver,kube-scheduler,controller-manager ,更新 admin.conf ,此时确认下 这些组件的状态都是 ok
    5. 更新 worker 节点的 kubelet.conf,这里需要在 master 为 worker 节点生成一份 kubelet.conf ,我不太清楚 worker 节点的 kbuelet 是否会自动拉取最新 ca ,至少从我实验来看是不会的。这部分参考[文档]( https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#kubelet-client-cert)。**注意**,生成的 kubelet.conf 确保它的 apisever 地址是正确的
    6. 更新 calico ,coredns,kube-proxy ,最后确认下所有组件的状态。整个过程中,业务影响较小,我用 nginx 模拟的,证书业务没测试,替换 ca 前后 nginx 都可以正常工作。

    **Note**: 只是大概描述下,如果大家有需要我后续写一篇 blog 贴出来
    YOOHUU
        36
    YOOHUU  
       2023-04-25 14:37:23 +08:00
    @jackgoudan #35 期待 blog, 学习下操作~
    HFX3389
        37
    HFX3389  
       2023-04-28 11:56:32 +08:00
    @jackgoudan #35 期待 blog
    Shawns
        38
    Shawns  
       2024-01-15 10:40:27 +08:00
    根据 @jackgoudan@feedcode 两位大佬的回复,最近对公司生产环境做了 ca 更新,https://www.yuque.com/noteol/kpyoe2/pc6svhqmca9rvp5g 供大家参考
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5556 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 01:39 PVG 09:39 LAX 17:39 JFK 20:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86