centos-stream9/7如何安装kubenetes1.28版本?如何添加集群节点与token过期如何重新生成?

Kubernetes集群部署

零、版本信息

操作系统:CentosStream9、Centos7
通过k8s版本:1.26.1 1.28.2
本文档未使用docker,使用containerd

从版本 1.24 开始已经去掉默认对docker的支持,需要使用go编译安装cri-dockerd,通信变得复杂,新版本不推荐使用docker运行时

一、Kubernetes集群部署方式

方式1. minikube

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。

官方地址:https://kubernetes.io/docs/setup/minikube/

方式2. kubeadm

Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

方式3. 二进制包

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

二、kubeadm部署k8s集群

官方文档

​ 安装 kubeadm | Kubernetes

kubeadm部署k8s高可用集群的官方文档

​ https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

1、集群环境初始化

机器数量: 3台、操作系统: CentosStream9 、分别设置主机名称为:master node1 node2

每台机器必须设置域名解析

192.168.209.131 master

192.168.209.132 node1

192.168.209.133 node2

禁用开机启动防火墙和Selinux

# systemctl disable firewalld
# sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
SELINUX=disabled

关闭Swap分区

Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。

​ 修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。

[root@master /]# sed -i 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap  swap   defaults     0 0

注意改完fstab先重启,再做下面的操作

检查各个节点MAC地址和product_uuid是否冲突

  • You can get the MAC address of the network interfaces using the command

    # ip link
    
  • The product_uuid can be checked by using the command

    注意这一步一定要检查,因为克隆的虚拟机会出现这个问题,删除网卡配置文件内的uuid重启系统可解决

    # cat /sys/class/dmi/id/product_uuid
    

It is very likely that hardware devices will have unique addresses, although some virtual machines may have identical values. Kubernetes uses these values to uniquely identify the nodes in the cluster. If these values are not unique to each node, the installation process may fail.

重启系统

2、安装和配置先决条件

在所有节点操作

2.1、转发 IPv4 并让 iptables 看到桥接流量

验证 br_netfilter 模块是否已加载

# lsmod | grep br_netfilter 

为了让 Linux 节点的 iptables 能够正确查看桥接流量,确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。

# cat <
overlay
br_netfilter
EOF

# modprobe overlay
# modprobe br_netfilter

设置所需的 sysctl 参数,参数在重新启动后保持不变
# cat <
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

应用 sysctl 参数而不重新启动
# sysctl --system

2.2、关于cgroup 驱动
在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。
kubelet和底层容器运行时都需要对接控制组来强制执行为 Pod 和容器管理资源并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。

可用的 cgroup 驱动有两个:

  • cgroupfs
  • systemd

cgroupfs 驱动

cgroupfs 驱动是 kubelet 中默认的 cgroup 驱动。当使用 cgroupfs 驱动时, kubelet 和容器运行时将直接对接 cgroup 文件系统来配置 cgroup。

当 systemd 是初始化系统时, 推荐使用 cgroupfs 驱动,因为 systemd 期望系统上只有一个 cgroup 管理器。 此外,如果你使用 cgroup v2, 则应用 systemd cgroup 驱动取代 cgroupfs

systemd cgroup 驱动

当某个 Linux 系统发行版使用 systemd 作为其初始化系统时,初始化进程会生成并使用一个 root 控制组(cgroup),并充当 cgroup 管理器。

systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup。 因此,如果你 systemd 用作初始化系统,同时使用 cgroupfs 驱动,则系统中会存在两个不同的 cgroup 管理器。

同时存在两个 cgroup 管理器将造成系统中针对可用的资源和使用中的资源出现两个视图。某些情况下, 将 kubelet 和容器运行时配置为使用 cgroupfs、但为剩余的进程使用 systemd 的那些节点将在资源压力增大时变得不稳定。

当 systemd 是选定的初始化系统时,缓解这个不稳定问题的方法是针对 kubelet 和容器运行时将 systemd 用作 cgroup 驱动。

要将 systemd 设置为 cgroup 驱动,需编辑 KubeletConfigurationcgroupDriver 选项,并将其设置为 systemd。例如:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd

如果你将 systemd 配置为 kubelet 的 cgroup 驱动,你也必须将 systemd 配置为容器运行时的 cgroup 驱动。

3、容器运行时

为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。

默认,k8s使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。

如果不指定运行时,kubeadm 会自动尝试通过扫描已知的端点列表来检测已安装的容器运行时。

如果检测到有多个或者没有容器运行时,kubeadm 将抛出一个错误并要求你指定一个想要使用的运行时。

参阅容器运行时 以了解更多信息。

说明:

Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除。

下面的表格包括被支持的Linux操作系统的已知端点。

运行时 Unix 域套接字
containerd unix:///var/run/containerd/containerd.sock
CRI-O unix:///var/run/crio/crio.sock
Docker Engine(使用 cri-dockerd) unix:///var/run/cri-dockerd.sock
安装 containerd

在所有节点操作
本文采用yum方式安装

获取阿里云docker yum源
# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看YUM源中Containerd软件
# yum list | grep containerd
containerd.io.x86_64    1.6.15-3.1.el9          docker-ce-stable

安装Containerd.io软件,即可安装Containerd
# yum -y install containerd.io

设置containerd服务启动及开机自启动
# systemctl enable containerd
# systemctl start containerd

验证可用性

安装Containerd后ctr命令即可使用,ctr命令主要用于管理容器及容器镜像等。
使用ctr命令查看Containerd客户端及服务端相关信息。
# ctr version
配置containerd

生成containerd配置文件

# 生成默认配置,config.toml这个文件二进制安装方式默认不存在,如果是Yum安装则直接覆盖
containerd config default > /etc/containerd/config.toml

修改sandbox_image 镜像源

修改sandbox_image 镜像源,1.24以下k8s.gcr.io 、1.25 改成了registry.k8s.io
# sed -i "s#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml

配置containerd cgroup 驱动程序systemd

把SystemdCgroup = false修改为:SystemdCgroup = true,
# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

Containerd配置镜像加速
endpoint位置添加阿里云的镜像源,https://yafixjtd.mirror.aliyuncs.com 这个地址是我自己阿里加速器地址,每个人都不一样

# vim /etc/containerd/config.toml
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors] #下面两行是新加的
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://yafixjtd.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]

配置crictl

因为ctr命令查看镜像非常混乱,可以用这个命令查看镜像

# cat <
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

查看镜像
# crictl image list

需要稍等一下十分钟

重启containerd

# systemctl restart containerd

4、安装k8s套件

在所有节点操作

配置aliyun的yum源

# cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubeadm、kubelet 和 kubectl

# yum makecache
# yum install -y kubelet kubeadm kubectl ipvsadm ipset --disableexcludes=kubernetes
默认为最新版,对应最新版k8s
--disableexcludes=kubernetes 禁掉除了这个kubernetes之外的别的仓库

说明:如果想安装指定版本的kubeadmin
# yum install kubelet-1.28.2-0.x86_64 kubeadm-1.28.2-0.x86_64 kubectl-1.28.2-0.x86_64 ipvsadm ipset --disableexcludes=kubernetes -y 

查看版本
# kubectl version
# yum info kubeadm

启动kubelet
# systemctl enable --now kubelet
注意官方提示:kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。 在 crashloop 状态中等待 kubeadm 发布指令。crashloop 状态是正常现象。 初始化控制平面后,kubelet 将正常运行。

5、获取镜像

特别说明:

三个节点都要下载

注意下载时把版本号修改到官方最新版,即使下载了最新版也可能版本不对应,需要按报错提示下载

每次部署都会有版本更新,具体版本要求,运行初始化过程失败会有版本提示

kubeadm的版本和镜像的版本最好是对应的

用命令查看版本当前kubeadm对应的k8s镜像版本

查看镜像
# kubeadm config images list --kubernetes-version v1.28.2
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1

查看国内镜像
# kubeadm config images list --kubernetes-version v1.28.2 --image-repository registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1

coredns如果下载不了可以通过docker pull coredns/coredns:v1.10.1从docker官方下载

下载镜像
# ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
注意:必须用-n指定namespace,否则k8s和crictr都看不到镜像
下载下来的镜像名称不用重新修改,直接使用aliyun的镜像

[root@master ~]# cat pull.sh 
#!/bin/bash
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.9
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

6、初始化集群

在master节点进行初始化操作

特别说明:

初始化完成必须要记录下初始化过程最后的命令,如下图所示
在这里插入图片描述
生成配置文件

# kubeadm config print init-defaults > kubeadm.yml

修改刚生成的配置文件
advertiseAddress:为控制平面地址( Master 主机 IP )
criSocket:为 containerd 的 socket 文件地址
imageRepository:阿里云镜像代理地址,否则拉取镜像会失败
kubernetesVersion:为 k8s 版本

podSubnet: 10.244.0.0/16 : 同步网络插件flannal默认的pod网段地址

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.209.131  					 # 修改为自己apiserver的ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock  # 修改为containerd的socket
  imagePullPolicy: IfNotPresent
  name: master  #修改节点的名字
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  # 修改为阿里云镜像
kind: ClusterConfiguration
kubernetesVersion: 1.28.2                                 # 要安装的版本号
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16                                # 新添加的行,和即将要安装的网络插件有关
scheduler: {}
---                                                       # 此处所有内容为追加
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

使用上面的配置文件进行初始化

# kubeadm init --config=kubeadm.yml

正确初始化结果如下

[root@master ~]# kubeadm init --config=kubeadm.yml
[init] Using Kubernetes version: v1.26.1
[preflight] Running pre-flight checks
        [WARNING Hostname]: hostname "node" could not be reached
        [WARNING Hostname]: hostname "node": lookup node on 192.168.26.2:53: no such host
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local node] and IPs [10.96.0.1 192.168.26.150]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost node] and IPs [192.168.26.150 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost node] and IPs [192.168.26.150 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 5.004875 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node node as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node node as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: abcdef.0123456789abcdef
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.26.150:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:43622f39eea8e8f8f3fa7a5afa6ce7d4867f86b3f63a7a11f86e48ee61fd0dfe 

上面记录了完成的初始化输出的内容,根据输出的内容基本上可以看出手动初始化安装一个Kubernetes集群所需要的关键步骤。

其中有以下关键内容:

[kubelet] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”

[certificates]生成相关的各种证书

[kubeconfig]生成相关的kubeconfig文件

[bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到

按照初始化结果运行以下指令

# export KUBECONFIG=/etc/kubernetes/admin.conf
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

查看node节点

[root@master ~]# kubectl get nodes
NAME   STATUS     ROLES           AGE   VERSION
node   NotReady   control-plane   4m    v1.28.2

此处NotReady状态属于正常情况,配置好下面的步骤即可正常

7、配置网络插件

master节点下载yaml配置文件

特别说明:版本会经常更新,flannel官方存储与github上

修改下载下来的配置文件kube-flannel.yml

新版flanneld yaml文件内镜像源可直接使用,不再需要修改镜像源地址,只需要修改下面的指定启动网卡即可

flanneld启动参数加上- --iface=

      containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.20.2
       #image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=ens33  #0.20.2版本在167行左右,是你当前的网卡,或者再加一条可以指定多网卡
       #- --iface=eth0   

启动

# kubectl apply -f kube-flannel.yml

过一会儿之后查看节点状态如下,下载镜像需要时间
[root@master ~]# kubectl get nodes
NAME   STATUS   ROLES           AGE   VERSION
node   Ready    control-plane   39m   v1.28.2

查看pods状态

[root@master ~]# kubectl get pods --namespace kube-system
NAME                           READY   STATUS    RESTARTS   AGE
coredns-66f779496c-548km       1/1     Running   0          39m
coredns-66f779496c-s42w8       1/1     Running   0          39m
etcd-node                      1/1     Running   0          39m
kube-apiserver-node            1/1     Running   0          39m
kube-controller-manager-node   1/1     Running   0          39m
kube-proxy-cznj6               1/1     Running   0          39m
kube-scheduler-node            1/1     Running   0          39m
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   40m

# kubectl get svc --namespace kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   15m

8、node节点加入集群

在所有node节点操作,此命令为初始化master成功后返回的结果

# kubeadm join 192.168.209.131:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:f9d9a1d2f7ac029ee67f26d1d58719b89469f4271326b4350b826c4dd46df146

9、集群检测

查看pods

说明:节点加入到集群之后需要等待几分钟再查看

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
node     Ready    control-plane   41m   v1.28.2
node-1   Ready    <none>          19s   v1.28.2
node-2   Ready    <none>          26s   v1.28.2


[root@master ~]# kubectl get pods -n kube-system
NAME                           READY   STATUS    RESTARTS   AGE
coredns-66f779496c-548km       1/1     Running   0          42m
coredns-66f779496c-s42w8       1/1     Running   0          42m
etcd-node                      1/1     Running   0          42m
kube-apiserver-node            1/1     Running   0          42m
kube-controller-manager-node   1/1     Running   0          42m
kube-proxy-cpjv5               1/1     Running   0          85s
kube-proxy-cznj6               1/1     Running   0          42m
kube-proxy-vfzfn               1/1     Running   0          91s
kube-scheduler-node            1/1     Running   0          42m

遇到异常状态0/1的pod长时间启动不了可删除它等待集群创建新的pod资源

# kubectl delete pod kube-flannel-ds-sr6tq -n kube-system
pod "kube-flannel-ds-sr6tq" deleted

删除后再次查看,发现状态为正常

[root@master flannel]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-6955765f44-g767b         1/1     Running   0          18m
coredns-6955765f44-l8zzs         1/1     Running   0          18m
etcd-master                      1/1     Running   0          18m
kube-apiserver-master            1/1     Running   0          18m
kube-controller-manager-master   1/1     Running   0          18m
kube-flannel-ds-amd64-bsdcr      1/1     Running   0          60s
kube-flannel-ds-amd64-g8d7x      1/1     Running   0          2m33s
kube-flannel-ds-amd64-qjpzg      1/1     Running   0          5m9s
kube-proxy-5pmgv                 1/1     Running   0          2m33s
kube-proxy-r962v                 1/1     Running   0          60s
kube-proxy-zklq2                 1/1     Running   0          18m
kube-scheduler-master            1/1     Running   0          18m

再次查看节点状态

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
node     Ready    control-plane   41m   v1.28.2
node-1   Ready    <none>          19s   v1.28.2
node-2   Ready    <none>          26s   v1.28.2

到此集群配置完成

9、集群重置

重置kubeadm环境

整个集群所有节点(包括master)重置/移除节点
驱离k8s-node-1节点上的pod(master上)
[root@k8s-master ~]# kubectl drain k8s-node-1 --delete-local-data --force --ignore-daemonsets

删除节点(master上)
[root@k8s-master ~]# kubectl delete node k8s-node-1

重置节点(node上-也就是在被删除的节点上)
[root@k8s-node-1 ~]# kubeadm reset

注1:需要把master也驱离、删除、重置,这里给我坑死了,第一次没有驱离和删除master,最后的结果是查看结果一切正常,但coredns死活不能用,搞了整整1天,wing亲历,切勿尝试

注2:master上在reset之后需要删除如下文件
# rm -rf /var/lib/cni/ $HOME/.kube/config

集群重新初始化之后注意需要把flannel重新应用一次,因为重置时可能已经把flannel的namespace删除了。

10、重新生成token

kubeadm 生成的token过期后,集群增加节点

通过kubeadm初始化后,都会提供node加入的token:
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 18.16.202.35:6443 --token zr8n5j.yfkanjio0lfsupc0 --discovery-token-ca-cert-hash sha256:380b775b7f9ea362d45e4400be92adc4f71d86793ba6aae091ddb53c489d218c
默认token的有效期为24小时,当过期之后,该token就不可用了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决方法:
1. 重新生成新的token:
[root@node1 flannel]# kubeadm  token create
kiyfhw.xiacqbch8o8fa8qj
[root@node1 flannel]# kubeadm  token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION   EXTRA GROUPS
gvvqwk.hn56nlsgsv11mik6   <invalid>   2018-10-25T14:16:06+08:00   authentication,signing   <none>        system:bootstrappers:kubeadm:default-node-token
kiyfhw.xiacqbch8o8fa8qj   23h         2018-10-27T06:39:24+08:00   authentication,signing   <none>        system:bootstrappers:kubeadm:default-node-token

2. 获取ca证书sha256编码hash值:
[root@node1 flannel]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
5417eb1b68bd4e7a4c82aded83abc55ec91bd601e45734d6aba85de8b1ebb057

3. 节点加入集群:
  kubeadm join 18.16.202.35:6443 --token kiyfhw.xiacqbch8o8fa8qj --discovery-token-ca-cert-hash sha256:5417eb1b68bd4e7a4c82aded83abc55ec91bd601e45734d6aba85de8b1ebb057
几秒钟后,您应该注意到kubectl get nodes在主服务器上运行时输出中的此节点。

上面的方法比较繁琐,一步到位:
kubeadm token create --print-join-command

第二种方法:
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

你可能感兴趣的:(Kubernetes,centos,kubernetes)