步骤
默认的kubeadm生成的证书有效期只有1年,官方推荐的是1年续签一次,但是在不通外网的集群中,这样升级不太友好。所以最好还是一次搞定。
获取源码
github地址:https://github.com/kubernetes/kubernetes/tree/v1.24.16
创建Codespace。
修改源码
修改CA有效期
NotAfter 定义了有效期是10年,改为100年。
vim ./staging/src/k8s.io/client-go/util/cert/cert.go
修改证书有效期
CertificateValidity 定义了证书有效期是10年,改为100年。
vim ./cmd/kubeadm/app/constants/constants.go
查看差异
git diff
编译源码
编译kubeadm。
make all WHAT=cmd/kubeadm GOFLAGS=-v
# make all WHAT=cmd/kubelet GOFLAGS=-v
# make all WHAT=cmd/kubectl GOFLAGS=-v
编译完成。
下载kubeadm
编译后的应用程序在_output/bin/kubeadm
下,其中_output/bin/
目录是个软链接,实际目录是_output/local/bin/linux/amd64/kubeadm
。
_output/local/bin/linux/amd64/kubeadm version
拷贝kubeadm到当前目录,在左侧文件目录中右键kubeadm,点击下载到本地。
cp _output/local/bin/linux/amd64/kubeadm .
验证
上传kubeadm,添加权限,使用原kubeadm查询证书到期时间,备份原kubeadm。(我这里ca显示98y是我原kubeadm也编译过)
kubeadm version
kubeadm certs check-expiration
拷贝新kubeadm到/usr/bin
下,renew证书,使用新kubeadm查询证书到期时间。
证书到期时间为99years。
补充
上面方法编译的kubeadm也能达到续签证书到100年的效果。但是在使用这个kubeadm初始化集群时,会无法使用。
报错:could not fetch a Kubernetes version from the internet,falling back to the local client version: v1.24.15
因为这个kubeadm的GitVersion是"v1.24.16-dirty",找不到这个版本的kubeadm,进而使用了低一个版本的kubeadm。
带这个dirty的原因是在修改源码后,没有使用git add
和git commit
。commit后GitTreeState就是clean了。
但是这个clean版本的kubeadm在初始化集群时也无法使用。
解决方法是使用第二种方法github action来编译kubeadm。
github action
先把kubernetes 源码fork到自己的仓库。然后创建action。
示例yaml如下:
name: Go
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
id: go
uses: actions/setup-go@v3
with:
go-version: 1.20.6
- name: SET GitHub ENV k8s version
env:
packageName: v1.24.16
run: echo "packageName=${{ env.packageName }}" >> $GITHUB_ENV
- name: Get github Env
run: echo '${{ env.packageName }}'
- name: Check out code into the Go module directory
uses: actions/checkout@v3
with:
ref: ${{ env.packageName }}
- name: modify cert time file
run: |
sed -i "s/365/365 * 99/" /home/runner/work/kubernetes/kubernetes/cmd/kubeadm/app/constants/constants.go
sed -i "s/10)/99)/" /home/runner/work/kubernetes/kubernetes/staging/src/k8s.io/client-go/util/cert/cert.go
- name: Get modify file
run: |
find . -name constants.go |xargs cat |grep 365
find . -name cert.go |xargs cat |grep 365d
- name: Get dependencies
run: |
go get -v -t -d ./...
if [ -f Gopkg.toml ]; then
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
dep ensure
fi
- name: Get workpath
run: pwd
- name: Build kubeadm
run: KUBE_GIT_TREE_STATE=clean make all WHAT=cmd/kubeadm GOFLAGS=-v
- name: Get paGth
run: find . -name kubeadm
- name: Kubeadm version
run: |
chmod +x ./_output/local/bin/linux/amd64/kubeadm
./_output/local/bin/linux/amd64/kubeadm version
- name: Package file dirname
run: mkdir kube && cp ./_output/local/bin/linux/amd64/kubeadm kube
- uses: actions/upload-artifact@v3
with:
name: kubeadm-${{ env.packageName }}
path: kube
yaml保存后,等待workflow完成,点击Artifacts中的kubeadm-1.24.16下载。上传压缩包,解压测试。
这样编译生成的kubeadm初始化集群使用的k8s版本还是1.24.16,而不是1.24.15。