k8s-16_Kubernetes-日常维护总结

文章目录

k8s-16_Kubernetes-日常维护总结

1.更改证书有效期

一、基础知识

  1. k8s使用https双向认证,使用kubeadm安装后证书默认有效期为1年

  2. k8s证书存放路径:/etc/kubernetes/pki/

  3. 查看证书信息:openssl x509 -in apiserver.crt -text -noout

    修改方式:修改kubeadm源码,更改证书默认有效期

    image-20220816171744672

image-20220816171643630

二、go 环境部署

下载go安装包
wget https://studygolang.com/dl/golang/go1.13.7.linux-amd64.tar.gz
2. 解压到/usr/local下
tar -zxvf go1.13.7.linux-amd64.tar.gz -C /usr/local/
3. 修改环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
4. 加载环境变量配置
source /etc/profile
5. 查看版本信息

image-20220816171903649

image-20220816172028953

三、git源码

下载源码至本地
git clone https://github.com/kubernetes/kubernetes.git
查看当前k8s版本
kubeadm version
切换git到指定版本
cd kubernetes
git checkout -b remotes/origin/release-1.17.0 v1.17.0

image-20220817134139497

四、修改源码更新证书策略

查看相关代码所在文件名称
grep -r kubeadmconstants.CertificateValidity .

image-20220817135830973

更改源代码
root@k8s-master:~/git/kubernetes# cd cmd/kubeadm/app/util/pkiutil/
root@k8s-master:~/git/kubernetes/cmd/kubeadm/app/util/pkiutil# ls
pki_helpers.go	pki_helpers_test.go  testing
root@k8s-master:~/git/kubernetes/cmd/kubeadm/app/util/pkiutil# vim pki_helpers.go

修改如下
搜索 serial字段 添加如下

637         const duration365d = time.Hour * 24 * 365

搜索 DNSNames 添加如下

667                 NotAfter:              time.Now()Add(duration365d * 10).UTC(),

最新版本
image-20220817140956722

老版本image-20220817134905411

编译代码kubeadm
root@k8s-master:~/git/kubernetes# pwd
/root/git/kubernetes
root@k8s-master:~/git/kubernetes# make WHAT=cmd/kubeadm GOFLAGS=-v
升级go到go1.17.0版本

这里go 版本不够,我们进行一下升级,我们安装go1.17.0

root@k8s-master:~/git/kubernetes# cd /usr/local/
root@k8s-master:/usr/local# ls
bin  etc  games  go  include  lib  man	sbin  share  src
root@k8s-master:/usr/local# mv go go.1.13.7.bak
root@k8s-master:/usr/local# go version
-bash: /usr/local/go/bin/go: 没有那个文件或目录   做备份即可

image-20220817141152212

安装下载最新的go

wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
root@k8s-master:~/go# tar -zxf go1.17.6.linux-amd64.tar.gz -C /usr/local/
root@k8s-master:~/go# source /etc/profile
root@k8s-master:~/go# go version
go version go1.17.6 linux/amd64

image-20220817142558259

接着编译

root@k8s-master:~/git/kubernetes# make WHAT=cmd/kubeadm GOFLAGS=-v

chmod +x _output/bin/prerelease-lifecycle-gen
将编译成功的kubeadm复制到/root下
kubernetes] #cp _output/bin/kubeadm /root/kubeadm-new

五、更新 kubeadm

备份原kubeadm文件
cp /usr/bin/kubeadm /usr/bin/kubeadm.old
替换新kubeadm文件
cp /root/kubeadm-new /usr/bin/kubeadm
赋予执行权限
chmod a+x /usr/bin/kubeadm

六、更新master节点证书

备份原证书文件
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.old
生成新证书
cd /etc/kubernetes/pki
kubeadm alpha certs renew all --config kubeadm-config.yaml
查看证书有效期
openssl x509 -in apiserver.crt -text -noout | grep Not

image-20220817145417722

重新初始化集群
kubeadm init phase kubeconfig all --config kubeadm-config.yaml
重新生成kubeconfig文件
mv $HOME/.kube/config $HOME/.kube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
更新docker容器证书
# 查看容器证书有效期
echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate

docker restart `docker ps | grep etcd | awk '{ print $1 }'`
docker restart `docker ps | grep kube-apiserver | awk '{ print $1 }'`
docker restart `docker ps | grep kube-scheduler | awk '{ print $1 }'`
docker restart `docker ps | grep kube-controller | awk '{ print $1 }'`

# 查看更新后的证书有限期
echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
更新kubelet
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
  containers:
  - command:
    - kube-controller-manager
    # 新增以下两行参数
    - --experimental-cluster-signing-duration=87600h0m0s
    - --feature-gates=RotateKubeletServerCertificate=true

七、HA其余master节点证书更新

#!/bin/bash
masterNode="192.168.66.20 192.168.66.21"
#for host in ${masterNode}; do
#    scp /etc/kubernetes/pki/{ca.crt,ca.key,sa.key,sa.pub,front-proxy-ca.crt,front-proxy-ca.key}"
${USER}"@$host:/etc/kubernetes/pki/
#    scp /etc/kubernetes/pki/etcd/{ca.crt,ca.key} "root"@$host:/etc/kubernetes/pki/etcd
#    scp /etc/kubernetes/admin.conf "root"@$host:/etc/kubernetes/
#done
for host in${CONTROL_PLANE_IPS}; do
    scp /etc/kubernetes/pki/{ca.crt,ca.key,sa.key,sa.pub,front-proxy-ca.crt,front-proxy-ca.key}"${USER}"@$host:/root/pki/
    scp /etc/kubernetes/pki/etcd/{ca.crt,ca.key} "root"@$host:/root/etcd   
    scp /etc/kubernetes/admin.conf "root"@$host:/root/kubernetes/
done

八、其他方法更改证书

kubeadm 默认证书为一年,一年过期后,会导致api service不可用,使用过程中会出现:x509: certificate has expired or is not yet valid.

Google 建议通过不停更新版本来自动更新证书,太坑_

可以在初始化群集之前重新编译kubeadm,证书有效期自动为100年

获取源码

访问:https://github.com/kubernetes/kubernetes/releases,下载特定版本源码

wget https://github.com/kubernetes/kubernetes/archive/v1.23.0.tar.gz
tar -zxvf kubernetes-1.23.0.tar.gz
mv kubernetes-1.23.0 kubernetes
cd kubernetes

或者使用 git 获取

# yum install git
git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
git checkout -b remotes/origin/release-1.23 v1.23.0
修改证书有效期

查看网上的资料主要有两个地方需要修改

修改 CA 有效期为 100 年(默认为 10 年)
vim ./staging/src/k8s.io/client-go/util/cert/cert.go
// 这个方法里面 NotAfter:              now.Add(duration365d * 10).UTC()
// 默认有效期就是 10 年,改成 100(sysin)
// 输入 /NotAfter 查找,回车定位
func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) {
        now := time.Now()
        tmpl := x509.Certificate{
                SerialNumber: new(big.Int).SetInt64(0),
                Subject: pkix.Name{
                        CommonName:   cfg.CommonName,
                        Organization: cfg.Organization,
                },
                NotBefore:             now.UTC(),
                // NotAfter:              now.Add(duration365d * 10).UTC(),
                NotAfter:              now.Add(duration365d * 100).UTC(),
                KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
                BasicConstraintsValid: true,
                IsCA:                  true,
        }

        certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &tmpl, &tmpl, key.Public(), key)
        if err != nil {
                return nil, err
        }
        return x509.ParseCertificate(certDERBytes)
}
修改证书有效期为 100 年(默认为 1 年)
vim ./cmd/kubeadm/app/constants/constants.go
// 就是这个常量定义CertificateValidity,改成*100年
const (
        // KubernetesDir is the directory Kubernetes owns for storing various configuration files
        KubernetesDir = "/etc/kubernetes"
        // ManifestsSubDirName defines directory name to store manifests
        ManifestsSubDirName = "manifests"
        // TempDirForKubeadm defines temporary directory for kubeadm
        // should be joined with KubernetesDir.
        TempDirForKubeadm = "tmp"

        // CertificateValidity defines the validity for all the signed certificates generated by kubeadm
        // CertificateValidity = time.Hour * 24 * 365
        CertificateValidity = time.Hour * 24 * 365 * 100

        // CACertAndKeyBaseName defines certificate authority base name
        CACertAndKeyBaseName = "ca"
        // CACertName defines certificate name
        CACertName = "ca.crt"
        // CAKeyName defines certificate name
        CAKeyName = "ca.key"
git验证,修改的内容如下:
git diff

diff --git a/cmd/kubeadm/app/constants/constants.go b/cmd/kubeadm/app/constants/constants.go
index 75adf43..54f25fa 100644
--- a/cmd/kubeadm/app/constants/constants.go
+++ b/cmd/kubeadm/app/constants/constants.go
@@ -44,7 +44,7 @@ const (
        TempDirForKubeadm = "tmp"

        // CertificateValidity defines the validity for all the signed certificates generated by kubeadm
-       CertificateValidity = time.Hour * 24 * 365
+       CertificateValidity = time.Hour * 24 * 365 * 100

        // CACertAndKeyBaseName defines certificate authority base name
        CACertAndKeyBaseName = "ca"
diff --git a/staging/src/k8s.io/client-go/util/cert/cert.go b/staging/src/k8s.io/client-go/util/cert/cert.go
index 9fd097a..865d6bb 100644
--- a/staging/src/k8s.io/client-go/util/cert/cert.go
+++ b/staging/src/k8s.io/client-go/util/cert/cert.go
@@ -63,7 +63,7 @@ func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, erro
                        Organization: cfg.Organization,
                },
                NotBefore:             now.UTC(),
-               NotAfter:              now.Add(duration365d * 10).UTC(),
+               NotAfter:              now.Add(duration365d * 100).UTC(),
                KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
                BasicConstraintsValid: true,
                IsCA:                  true,

源代码改好了,接下来就是编译kubeadm了

Docker镜像编译(推荐)
  • 查看 kube-cross 的 TAG 版本号
# cat ./build/build-image/cross/VERSION

v1.13.8-1

这里我们可以使用官方容器对代码进行编译:k8s.gcr.io/kube-cross:v1.13.6-1(当前只有1.13.6而不是1.13.8,未知)

  • 拉取镜像

无法翻墙可以用下面的替代镜像:

docker pull gcrcontainer/kube-cross:v1.13.6-1

或者:
docker pull registry.aliyuncs.com/google_containers/kube-cross:v1.13.6-1

image-20220817151032187

  • 编译
# docker run --rm -v <你修改后的代码目录>:/go/src/k8s.io/kubernetes -it gcrcontainer/kube-cross bash
docker run --rm -v /root/kubernetes:/go/src/k8s.io/kubernetes -it gcrcontainer/kube-cross:v1.13.6-1 bash

cd /go/src/k8s.io/kubernetes

# 编译kubeadm, 这里主要编译kubeadm 即可
make all WHAT=cmd/kubeadm GOFLAGS=-v

# 编译kubelet
# make all WHAT=cmd/kubelet GOFLAGS=-v

# 编译kubectl
# make all WHAT=cmd/kubectl GOFLAGS=-v

# 退出容器
exit

#编译完产物在 _output/bin/kubeadm 目录下,
#其中bin是使用了软连接
#真实路径是_output/local/bin/linux/amd64/kubeadm
mv /usr/bin/kubeadm /usr/bin/kubeadm_backup
cp _output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
#chmod +x /usr/bin/kubeadm

# 验证版本
kubeadm version
软件包准备

CentOS:

yum install gcc make -y
yum install rsync jq -y

Ubuntu:

sudo apt install build-essential #(Following command will install essential commands like gcc, make etc.)
sudo apt install rsync jq -y
GoLang 环境

查看 kube-cross 的 TAG 版本号

# cat ./build/build-image/cross/VERSION

v1.13.8-1
  • 安装Go环境:
wget https://dl.google.com/go/go1.13.8.linux-amd64.tar.gz
tar zxvf go1.13.8.linux-amd64.tar.gz  -C /usr/local

# 编辑/etc/profile文件添加如下:
#go setting
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin

#生效
source /etc/profile

  • 验证:
go version
go version go1.13.8 linux/amd64
  • 编译:
# 编译kubeadm, 这里主要编译kubeadm 即可
make all WHAT=cmd/kubeadm GOFLAGS=-v

# 编译kubelet
# make all WHAT=cmd/kubelet GOFLAGS=-v

# 编译kubectl
# make all WHAT=cmd/kubectl GOFLAGS=-v

#编译完产物在 _output/bin/kubeadm 目录下,
#其中bin是使用了软连接
#真实路径是_output/local/bin/linux/amd64/kubeadm
mv /usr/bin/kubeadm /usr/bin/kubeadm_backup
cp _output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
chmod +x /usr/bin/kubeadm

image-20220817155657629

执行命令更新证书

可以先备份证书,证书在/etc/kubernetes/pki

cp -r /etc/kubernetes/pki /etc/kubernetes/pki.old
  • 检查证书到期时间
新版本(1.15+):kubeadm alpha certs check-expiration
或
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
其他同理
证书备份
cp -rp /etc/kubernetes /etc/kubernetes.bak

移除过期证书
rm -f /etc/kubernetes/pki/apiserver*
rm -f /etc/kubernetes/pki/front-proxy-client.*
rm -rf /etc/kubernetes/pki/etcd/healthcheck-client.*
rm -rf /etc/kubernetes/pki/etcd/server.*
rm -rf /etc/kubernetes/pki/etcd/peer.*

备注:可以使用命令openssl x509 -in [证书全路径] -noout -text查看证书详情。

重新生成证书
老版本:kubeadm alpha phase certs all
或
新版本(1.15+):kubeadm alpha certs renew all 使用该命令不用提前删除过期证书

重新生成配置文件
# 重新生成配置
mv /etc/kubernetes/*.conf /tmp/
老版本:kubeadm alpha phase kubeconfig all
或
新版本(1.15+):kubeadm init phase kubeconfig all
# 更新kubectl配置
cp /etc/kubernetes/admin.conf ~/.kube/config
重启kubelet
systemctl restart kubelet
证书过期时间确认
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
其他同理

2.k8s版本升级

一、准备工作

在master节点上查看此时的kubernetes的版本

image-20220817162639059

查询最新版本号
yum list kubeadm --showduplicates | sort -r

二、升级操作

master和node节点执行升级命令
yum update -y kubeadm kubectl kubelet
master节点验证升级版本
kubeadm upgrade plan

image-20220817162832044

升级到指定版本
kubeadm upgrade apply v1.17.2

image-20220817162856859

master和node重启kubelet
systemctl daemon-reload
systemctl restart kubelet

三、验证

查看node信息

image-20220817163001347

3.添加work节点

work节点进行初始化操作
master节点查询join命令
kubeadm token create --print-join-command

image-20220817163109548

work节点执行kubeadm join命令
master节点查看node信息

4.控制节点启用pod调度

默认情况下,出于安全原因,您的群集不会在控制节点上调度Pod。如果您希望能够在控制平面节点上调度Pod,例如用于单机Kubernetes集群进行开发,请运行

kubectl taint nodes --all node-role.kubernetes.io/master-

5.集群以外节点控制k8s集群

为了使kubectl在其他计算机上与集群通信,需要将管理员kubeconfig文件从控制平面节点复制到计算机上
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes
注意:

上面的示例假定为root用户启用了SSH访问。如果不是这种情况,您可以复制admin.conf文件以供其他用户访问,而scp改用该其他用户

该admin.conf文件为用户提供了对集群的超级用户特权。该文件应谨慎使用。对于普通用户,建议生成一个唯一的凭据,将其特权列入白名单。您可以使用kubeadm alpha kubeconfig user --client-name 命令执行此操作。该命令会将KubeConfig文件打印到STDOUT,您应该将其保存到文件并分发给用户。之后,使用来将特权列入白名单kubectl create (cluster)rolebinding。

6.删除本地集群

使用 kubectl config delete-cluster删除对集群的本地引用。

如果要更干净地取消配置群集,则应首先排空该节点,并确保该节点为空,然后取消配置该节点。

删除节点

使用适当的凭证与控制平面节点通信,请运行:
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>

然后,在要删除的节点上,重置所有kubeadm安装状态:

kubeadm reset

重置过程不会重置或清除iptables规则或IPVS表。如果您希望重置iptables,则必须手动进行:

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

如果要重置IPVS表,则必须运行以下命令:

ipvsadm -C

如果您想重新开始,只需运行kubeadm init或kubeadm join使用适当的参数即可。

7.节点维护状态

节点驱逐

 kubectl drain NODE

恢复调度

kubectl uncordon NODE

r)rolebinding。

6.删除本地集群

使用 kubectl config delete-cluster删除对集群的本地引用。

如果要更干净地取消配置群集,则应首先排空该节点,并确保该节点为空,然后取消配置该节点。

删除节点

使用适当的凭证与控制平面节点通信,请运行:
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>

然后,在要删除的节点上,重置所有kubeadm安装状态:

kubeadm reset

重置过程不会重置或清除iptables规则或IPVS表。如果您希望重置iptables,则必须手动进行:

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

如果要重置IPVS表,则必须运行以下命令:

ipvsadm -C

如果您想重新开始,只需运行kubeadm init或kubeadm join使用适当的参数即可。

7.节点维护状态

节点驱逐

 kubectl drain NODE

恢复调度

kubectl uncordon NODE
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值