• k8s根ca证书最多10年调整为100年或任意时间


    一、为什么要修改 kubeadm 证书时间

    Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变得简单起来。

    不过该工具有点坑的就是,使用其安装的 kubernetes 集群的大部分证书有效期只有一年,需要在证书过期前,使用更新操作更新集群,使证书的有效期再续一年。如果忘记这个操作,那么在使用过程中证书到期将导致集群不可用,应用无法访问,急急忙忙解决也需要半天时间,这个问题是致命的。

    不过实际情况下,在现网环境中大部分人追求稳定,一般不会大改 Kubernetes 版本,所以解决 kubeadm 集群证书有效期只有一年的最好办法就是重新编译 kubeadm 源码,将里面的 1 年有效期修改为 10 年或者 100 年,也不会影响使用 kubeadm 后续的升级,所以修改源码能很好的规避这个证书过期风险。

    查看证书时间

    kubeadm alpha certs check-expiration
    1. CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
    2. admin.conf Aug 14, 2022 03:15 UTC 364d no
    3. apiserver Aug 14, 2022 03:15 UTC 364d ca no
    4. apiserver-etcd-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
    5. apiserver-kubelet-client Aug 14, 2022 03:15 UTC 364d ca no
    6. controller-manager.conf Aug 14, 2022 03:15 UTC 364d no
    7. etcd-healthcheck-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
    8. etcd-peer Aug 14, 2022 03:15 UTC 364d etcd-ca no
    9. etcd-server Aug 14, 2022 03:15 UTC 364d etcd-ca no
    10. front-proxy-client Aug 14, 2022 03:15 UTC 364d front-proxy-ca no
    11. scheduler.conf Aug 14, 2022 03:15 UTC 364d no
    12. CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
    13. ca Aug 14, 2031 03:15 UTC 9y no
    14. etcd-ca Aug 14, 2031 03:15 UTC 9y no
    15. front-proxy-ca Aug 14, 2031 03:15 UTC 9y no

    二、修改 kubeadm 源码并重新编译

    安装 Golang 等编译源码的环境包

    由于 Kubeadm 是 Go 语言编写的,所以我们提前安装好编译 Kubeadm 源码的工具,操作过程按下面执行即可:

    (1) 安装编译工具

    $ yum install -y gcc make rsync jq
    

    (2) 下载并配置 Golang 环境

    1. ## 下载 golang 1.15.15
    2. $ wget https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz
    3. ## 解压并放置在一个目录中
    4. $ tar zxvf go1.15.15.linux-amd64.tar.gz -C /usr/local
    5. ## 编辑 /etc/profile 文件,添加 Go 环境配置内容
    6. $ vi /etc/profile
    7. export GOROOT=/usr/local/go
    8. export GOPATH=/usr/local/gopath
    9. export PATH=$PATH:$GOROOT/bin
    10. ## 使配置生效
    11. $ source /etc/profile
    12. ## 测试 Go 命令是否配置成功,成功则显示如下
    13. $ go version
    14. go version go1.15.15 linux/amd64

    下载 Kubernetes 源码,然后切换到指定版本,操作的命令如下:

    1. ## 下的 kubernetes 源码
    2. $ git clone https://github.com/kubernetes/kubernetes.git
    3. ## 进入 Kubernetes 目录
    4. $ cd kubernetes
    5. ## 切换 Kubernetes 版本
    6. $ git checkout v1.20.9

    修改 kubeadm 源码中证书过期时间

    接下来我们修改 Kubernetes 代码中与 kubeadm 证书有效期相关的源码,操作的命令如下:

    (1) 修改 constants.go 文件,操作如下:

    1. vim cmd/kubeadm/app/constants/constants.go
    2. ########### 后面追加个 * 100 (注掉部分为源代码,后面跟着的是修改后的代码)
    3. #const duration365d = time.Hour * 24 * 365
    4. const duration365d = time.Hour * 24 * 365 * 100
    5. // Config contains the basic fields required for creating a certificate
    6. type Config struct {
    7. CommonName string
    8. Organization []string
    9. AltNames AltNames
    10. Usages []x509.ExtKeyUsage
    11. }

     修改 cert.go 文件,操作如下:

    1. vim staging/src/k8s.io/client-go/util/cert/cert.go
    2. ########### 修改10年为100年(注掉部分为源代码,后面跟着的是修改后的代码)
    3. #NotAfter: now.Add(duration365d * 10).UTC(),
    4. NotAfter: now.Add(duration365d * 100).UTC(),
    5. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
    6. BasicConstraintsValid: true,
    7. IsCA: true,

    使用 make 命令编译 kubeadm, 执行的命令如下:

     make all WHAT=cmd/kubeadm GOFLAGS=-v

    编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中,我们进入到该文件下,查看是否有对应的文件。

    1. ## 进入
    2. $ cd ./_output/local/bin/linux/amd64/
    3. ## 查看文件列表
    4. $ ls -l
    5. -rwxr-xr-x 10:03 conversion-gen
    6. -rwxr-xr-x 10:03 deepcopy-gen
    7. -rwxr-xr-x 10:03 defaulter-gen
    8. -rwxr-xr-x 10:03 go2make
    9. -rwxr-xr-x 10:04 go-bindata
    10. -rwxr-xr-x 10:04 kubeadm
    11. -rwxr-xr-x 10:47 kubectl
    12. -rwxr-xr-x 10:34 kubelet
    13. -rwxr-xr-x 10:04 openapi-gen
    14. -rwxr-xr-x 10:03 prerelease-lifecycle-gen

    使用编译后的 kubeadm 初始化 kubernetes 集群

    安装 kubeadm 工具

    在使用我们自己编译的 kubeadm 之前,有一个需要注意的点,那就是我们一定要先提前安装好官方 kubeadm,并且版本和我们编译的 kubeadm 版本要一致,否则使用 kubeadm 初始化集群会报错,这里安装 kubeadm 执行的命令如下:

    (1) 配置可用的 Kubernetes 国内 yum 源

    1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    2. [kubernetes]
    3. name=Kubernetes
    4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    5. enabled=1
    6. gpgcheck=0
    7. repo_gpgcheck=0
    8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    9. EOF

    使用 yum 命令安装 kubeadm 的 1.20.9 版本

    yum install -y kubeadm-1.20.9

     替换安装的 kubeadm 工具

    接下来我们使用自定义编译的 kubeadm 工具,将已经安装的 kubeadm 给替换掉,执行的操作命令如下:

    1. ## 备份已有的 kubeadm 工具
    2. $ mv /usr/bin/kubeadm /usr/bin/kubeadm_backup
    3. ## 使用自己编译的 kubeadm 替换现有的 kubeadm 工具
    4. $ cp ./_output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
    5. ## 修改文件的执行权限
    6. $ chmod +x /usr/bin/kubeadm

    执行集群初始化

    当将我们自己编译的 kubeadm 替换原来的 kubeadm 工具后,我们就可以使用 kubeadm init 命令初始化 Kubernetes 集群进行测试,命令如下:

    • --service-cidr: 集群内部虚拟网络,Pod统一访问入口。
    • --pod-network-cidr: Pod网络,与部署CNI网络组件yaml文件中需保持一致。
    • --image-repository: 设置下载 Kubernetes 相关镜像的镜像仓库地址。
    • --kubernetes-version: 指定 Kubernetes 版本,需要和安装的版本保持一致。
    • --apiserver-advertise-address: 配置 kube-apiserver 的服务器地址。
      1. kubeadm init \
      2. --image-repository registry.aliyuncs.com/google_containers \
      3. --apiserver-advertise-address=192.168.2.31 \
      4. --service-cidr=10.96.0.0/12 \
      5. --pod-network-cidr=10.96.0.0/12 \
      6. --kubernetes-version=1.20.9

      查看证书过期时间

    • $ kubeadm alpha certs check-expiration
      

  • 相关阅读:
    Java架构师高并发架构设计
    考公考编内心历程
    初识OpenGL (-)api(待扩展)
    一些网络的常见问题
    CC2642 OAD文件合成
    sql 查询 不满足 (一个教师编号 的角色 (role =‘2‘or(role=‘1‘and role =‘0‘)) )
    先冲了!下载量超30W的阿里「从零开始学架构」,堪称教学天花板
    Python学习笔记:Jupyter Notebook快速入门案例:学习时间与成绩的关系
    2000-2018年各省能源消费和碳排放数据
    CF120F Spiders
  • 原文地址:https://blog.csdn.net/bh451326803/article/details/125439466