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

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

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

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

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

查看证书时间

kubeadm alpha certs check-expiration

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Aug 14, 2022 03:15 UTC   364d                                     no
apiserver                  Aug 14, 2022 03:15 UTC   364d             ca                      no
apiserver-etcd-client      Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
apiserver-kubelet-client   Aug 14, 2022 03:15 UTC   364d             ca                      no
controller-manager.conf    Aug 14, 2022 03:15 UTC   364d                                     no
etcd-healthcheck-client    Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
etcd-peer                  Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
etcd-server                Aug 14, 2022 03:15 UTC   364d             etcd-ca                 no
front-proxy-client         Aug 14, 2022 03:15 UTC   364d             front-proxy-ca          no
scheduler.conf             Aug 14, 2022 03:15 UTC   364d                                     no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Aug 14, 2031 03:15 UTC   9y             no
etcd-ca                 Aug 14, 2031 03:15 UTC   9y             no
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 环境

## 下载 golang 1.15.15
$ wget https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz

## 解压并放置在一个目录中
$ tar zxvf go1.15.15.linux-amd64.tar.gz  -C /usr/local

## 编辑 /etc/profile 文件,添加 Go 环境配置内容
$ vi /etc/profile

export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin

## 使配置生效
$ source /etc/profile

## 测试 Go 命令是否配置成功,成功则显示如下
$ go version

go version go1.15.15 linux/amd64

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

## 下的 kubernetes 源码
$ git clone https://github.com/kubernetes/kubernetes.git

## 进入 Kubernetes 目录
$ cd kubernetes

## 切换 Kubernetes 版本
$ git checkout v1.20.9

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

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

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

 vim cmd/kubeadm/app/constants/constants.go


########### 后面追加个 * 100 (注掉部分为源代码,后面跟着的是修改后的代码)
#const duration365d = time.Hour * 24 * 365
const duration365d = time.Hour * 24 * 365 * 100

// Config contains the basic fields required for creating a certificate
type Config struct {
        CommonName   string
        Organization []string
        AltNames     AltNames
        Usages       []x509.ExtKeyUsage
}

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

vim staging/src/k8s.io/client-go/util/cert/cert.go


########### 修改10年为100年(注掉部分为源代码,后面跟着的是修改后的代码)
#NotAfter:             now.Add(duration365d * 10).UTC(),
NotAfter:              now.Add(duration365d * 100).UTC(),
KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
BasicConstraintsValid: true,
IsCA:                  true,

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

 make all WHAT=cmd/kubeadm GOFLAGS=-v

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

## 进入
$ cd ./_output/local/bin/linux/amd64/

## 查看文件列表
$ ls -l

-rwxr-xr-x 10:03 conversion-gen
-rwxr-xr-x 10:03 deepcopy-gen
-rwxr-xr-x 10:03 defaulter-gen
-rwxr-xr-x 10:03 go2make
-rwxr-xr-x 10:04 go-bindata
-rwxr-xr-x 10:04 kubeadm
-rwxr-xr-x 10:47 kubectl
-rwxr-xr-x 10:34 kubelet
-rwxr-xr-x 10:04 openapi-gen
-rwxr-xr-x 10:03 prerelease-lifecycle-gen

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

安装 kubeadm 工具

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

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

 cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

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

yum install -y kubeadm-1.20.9

 替换安装的 kubeadm 工具

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

## 备份已有的 kubeadm 工具
$ mv /usr/bin/kubeadm  /usr/bin/kubeadm_backup

## 使用自己编译的 kubeadm 替换现有的 kubeadm 工具
$ cp ./_output/local/bin/linux/amd64/kubeadm  /usr/bin/kubeadm

## 修改文件的执行权限
$ 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 的服务器地址。
    kubeadm init \
    --image-repository registry.aliyuncs.com/google_containers  \
    --apiserver-advertise-address=192.168.2.31  \
    --service-cidr=10.96.0.0/12   \
    --pod-network-cidr=10.96.0.0/12  \
    --kubernetes-version=1.20.9

    查看证书过期时间

  • $ kubeadm alpha certs check-expiration
    

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: K8s (Kubernetes) 的产生时间是2014,由 Google 公司开发K8s 是一个开源容器编排系统,可以管理和部署容器化的应用。它的名称来源于容器数量的缩写,"K" 代表第 11 个字符,而 "8" 代表 "s",意思就是 "Kubernetes" 的第 11 个字符和最后一个字符。 在过去的10中,K8s 取得了巨大的成功,并成为了容器编排领域的标准。它被广泛应用于云计算、DevOps 以及微服务架构等领域。 2015K8s 成为了 Cloud Native Computing Foundation (CNCF) 的第一个项目。 2016K8s 成为了 CNCF 的第一个稳定项目。 2018K8s 版本 1.11 发布,提供了更加稳定的部署和管理能力。 2019K8s 版本 1.14 发布,提供了更加高效的资源管理和自动化部署能力。 2020K8s 版本 1.18 发布,新增了一系列的新特性,如 Pod Readiness Gates, Pod Priority and Preemption。 2021K8s 版本 1.21 发布,新增了一系列的新特性,如 Device Plugins, Pod Disruption Budget v2。 2022K8s 版本 1.24 发布,新增了一系列的新特性,如 Pod Topology Spread Constraints, Kubernetes Audit Logging。 ### 回答2: Kubernetes(简称K8s)是一个用于自动化容器化应用程序部署、扩展和管理的开源平台。它是Google在2014首次公开发布的,并成为了云原生应用开发领域的标准解决方案。 Kubernetes起源于Google内部的Borg系统,Borg系统是Google早期用于管理大规模容器工作负载的解决方案。Google将Borg系统的部分概念和概述开源,并将之称为Kubernetes。Kubernetes的开源版本获得了行业的广泛关注和认可。 由于其强大的容器管理能力和弹性扩展特性,Kubernetes迅速在全球范围内流行起来。在Kubernetes的早期发展中,Google起初是该项目的最大的贡献者和推动者,但随着时间的推移,很多公司加入并成立了云原生计算基金会(CNCF)来共同管理Kubernetes项目。 在过去的10里,Kubernetes发展迅速,并经历了许多重要的里程碑事件。以下是其中几个重要事件的简要介绍: 1. 2014Kubernetes首次公开发布,引起广泛关注和认可。 2. 2015,云原生计算基金会(CNCF)成立,Kubernetes成为其最重要的项目之一。 3. 2016Kubernetes 1.0版本发布,标志着它的正式商业化。 4. 2017,微软、亚马逊、IBM等公司纷纷推出Kubernetes相关的产品和服务。 5. 2018Kubernetes 1.11版本发布,引入了一些重要的功能和改进。 6. 2019Kubernetes 1.14版本发布,集成了Istio服务网格,进一步加强了微服务架构的支持。 7. 2020Kubernetes 1.18版本发布,引入了Windows容器的稳定支持和多租户集群功能。 8. 2021Kubernetes 1.21版本发布,引入了更多的增强功能和安全性改进。 在过去的10里,Kubernetes从一个初始的Google项目成长为了一个全球范围内广泛应用的开源平台,它在云原生应用开发和容器化部署领域发挥了重要作用。 ### 回答3: K8s(全称Kubernetes)是一个用于容器编排和管理的开源平台。它由谷歌公司在2014发布,但实际上,K8s的起源可以追溯到几之前。 K8s的前身可以追溯到谷歌内部的一个项目,叫做“Borg”。Borg项目是谷歌用于管理其庞大的数据中心和处理海量工作负载的内部系统。Borg在提供高可用性、可伸缩性和自动化方面取得了很大成功。在Borg系统的基础上,谷歌于2014对外宣布了K8s项目,并将其开源,以促进更广泛的应用和发展。 在过去的10中,K8s经历了一系列的重大事件和里程碑。以下是其中一些重要的事件: 1. 20146月,谷歌首次对外发布了K8s项目,将其开源并提交给了Linux基金会。 2. 20157月,K8s发布了其第一个正式版本,标志着其正式进入市场。 3. 20163月,K8s成为了第一个支持Windows容器的容器编排平台,在容器市场的竞争中占据了重要地位。 4. 201710月,第一个K8s的稳定版本(v1.8)发布,这个版本引入了许多新功能和改进,极大地增强了其可用性和灵活性。 5. 20186月,微软宣布收购Deis,这是一个在K8s生态系统中非常重要的公司,加强了其在K8s领域的地位和竞争力。 6. 20195月,谷歌在其开发者大会上宣布了Anthos,这是一个跨多云和混合云环境的扩展和运营解决方案,这表明K8s已经逐渐成为多云环境的标准平台。 7. 20206月,K8s发布了其最新的稳定版本(v1.19),这个版本进一步完善了其功能和性能,并引入了许多新特性。 8. 20218月,K8s社区发布了v1.22版本的第一个候选版本,该版本包含了许多改进和增强功能。 通过这些事件可以看出,自从K8s在2014首次发布后,它在容器编排和管理领域取得了巨大的成功并不断发展壮大。越来越多的公司和组织开始采用K8s来构建和管理其应用程序,并且K8s生态系统也在迅速发展,不断涌现出新的工具和解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值