k8s部署

一、k8s版本介绍与LTS概念

1、百度公司使用的k8s版本

2021 百度k8s版本1.18

2023 百度k8s版本1.2x

2、k8s没有LTS版本

k8s至今都没有一个长期支持版LTS。

二、k8s安装原理

2.1 kubeadm工具

分两步走,先用yum工具安装容器引擎、kubelet;其他k8s相关组件都被做成了镜像,kubeadm会用这些镜像启动相关组件(以容器的形式),kubeadm会把这些容器做成静态pod(没有控制器管理,挂掉会自动重启)。
​总结:这些静态pod+容器引擎+kubelet --> 构成了k8s环境

2.2 二进制安装

自己通过yum命令或者源码安装来安装所有组件,所有组件都是通过ssl协议通信的。

提示:我们的关注重心应该是如何使用k8s,部署二进制对自己的提示并不大,k8s的核心在与使用,并非部署。大多数小公司都会直接使用云平台上的k8s服务,也很少有自行部署的机会。

三、角色划分与机器准备

规划:系统均采用centos7(大公司倾向更换ubuntu22.04,rockyLinux还没有大规模铺开)

  • master:192.168.3.201
  • node01:192.168.3.202
  • node02:192.168.3.203

配置:每台机器内存 >= 2G,配置好静态ip地址

四、环境准备

4.1 修改主机名及解析

# 1、修改主机名
hostnamectl set-hostname k8s-master-01
hostnamectl set-hostname k8s-node-01
hostnamectl set-hostname k8s-node-02

# 2、三台机器添加host解析
cat >> /etc/hosts << "EOF"
192.168.3.201 k8s-master-01 m1
192.168.3.202 k8s-node-01   n1
192.168.3.203 k8s-node-02   n2
EOF

4.2 关闭防火墙

# 1、关闭selinux
sed -i 's#enforcing#disabled#g' /etc/selinux/config
setenforce 0
 
# 2、禁用防火墙,网络管理,邮箱
systemctl disable --now firewalld NetworkManager postfix
 
# 3、关闭swap分区
swapoff -a 

# 注释swap分区
cp /etc/fstab /etc/fstab_bak
sed -i '/swap/d' /etc/fstab

4.3 sshd服务优化

# 1、加速访问
sed -ri 's@^#UseDNS yes@UseDNS no@g' /etc/ssh/sshd_config 
sed -ri 's#^GSSAPIAuthentication yes#GSSAPIAuthentication no#g' /etc/ssh/sshd_config 
grep ^UseDNS /etc/ssh/sshd_config 
grep ^GSSAPIAuthentication /etc/ssh/sshd_config
systemctl restart sshd
 
# 2、密钥登录(主机点做):为了让后续一些远程拷贝操作更方便
ssh-keygen
ssh-copy-id -i root@k8s-master-01
ssh-copy-id -i root@k8s-node-01
ssh-copy-id -i root@k8s-node-02

4.4 增大文件句柄

退出当前会话重新进入立即生效。

cat > /etc/security/limits.d/k8s.conf <<'EOF' 
* soft nofile 65535 
* hard nofile 131070 
EOF
 
ulimit -Sn 
ulimit -Hn

4.5 模块自动加载

所有节点配置模块自动加载,此步骤不做的话(kubeadm init时会直接失败!)

modprobe br_netfilter
modprobe ip_conntrack
cat >>/etc/rc.sysinit<<EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
echo "modprobe br_netfilter" >/etc/sysconfig/modules/br_netfilter.modules
echo "modprobe ip_conntrack" >/etc/sysconfig/modules/ip_conntrack.modules
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
chmod 755 /etc/sysconfig/modules/ip_conntrack.modules
lsmod | grep br_netfilter

4.6 时间同步

# =====================》chrony服务端:服务端我们可以自己搭建,也可以直接用公网上的时间服务器,所以是否部署服务端看你自己
# 1、安装
yum -y install chrony
​
# 2、修改配置文件
mv /etc/chrony.conf /etc/chrony.conf.bak
​
cat > /etc/chrony.conf << EOF
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
server ntp7.aliyun.com iburst minpoll 4 maxpoll 10
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
allow 0.0.0.0/0
local stratum 10
keyfile /etc/chrony.keys
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF
​
# 4、启动chronyd服务
systemctl restart chronyd.service # 最好重启,这样无论原来是否启动都可以重新加载配置
systemctl enable chronyd.service
systemctl status chronyd.service
 
# =====================》chrony客户端:在需要与外部同步时间的机器上安装,启动后会自动与你指定的服务端同步时间
# 下述步骤一次性粘贴到每个客户端执行即可
# 1、安装chrony
yum -y install chrony
# 2、需改客户端配置文件
mv /etc/chrony.conf /etc/chrony.conf.bak
cat > /etc/chrony.conf << EOF
server 服务端的ip地址或可解析的主机名 iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
local stratum 10
keyfile /etc/chrony.key
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF
# 3、启动chronyd
systemctl restart chronyd.service
systemctl enable chronyd.service
systemctl status chronyd.service
 
# 4、验证
chronyc sources -v

4.7 更新yum源

# 1、清理
rm -rf /etc/yum.repos.d/*
yum remove epel-release -y
rm -rf /var/cache/yum/x86_64/6/epel/
 
# 2、安装阿里的base与epel源
curl -s -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 
curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache
 
# 或者用华为的也行
# curl -o /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo 
# yum install -y https://repo.huaweicloud.com/epel/epel-release-latest-7.noarch.rpm

4.8 更新软件

除了内核以外都更新,内核我们单独进行升级。

 yum update -y --exclud=kernel*

4.9 安装基础常用软件

yum -y install expect wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git ntpdate chrony bind-utils rsync unzip git

4.10 升级内核版本

很多课程讲得玄乎其技,晦涩难懂。实际上不用那么恐惧它。
更新内核(docker 对系统内核要求比较高,最好使用4.4+,我们这里使用5.4)主节点操作。如果使用的是ubuntu操作系统,22.04默认已经是5.+的内核。

wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.274-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.274-1.el7.elrepo.x86_64.rpm
 
for i in n1 n2 m1 ; do scp kernel-lt-* $i:/opt; done
 
 
补充:如果下载的慢就从网盘里拿吧
链接:https://pan.baidu.com/s/1gVyeBQsJPZjc336E8zGjyQ 
提取码:

每个节点都要操作

 #安装
yum localinstall -y /opt/kernel-lt*
 
#调到默认启动
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg 
 
#查看当前默认启动的内核
grubby --default-kernel
 
#重启系统
reboot

4.11 加载ipvs相关模块

每个节点都安装IPVS。kube-proxy代理可以基于ipvs/iptables,但iptables效率很低。ipvs基于内核转发效率非常高。

# 1、安装ipvsadm等相关工具
yum -y install ipvsadm ipset sysstat conntrack libseccomp 
 
# 2、配置加载
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF" 
#!/bin/bash 
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" 
 
for kernel_module in ${ipvs_modules}; 
do 
	/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 
	if [ $? -eq 0 ]; then 
		/sbin/modprobe ${kernel_module} 
	fi 
done 
EOF
 
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

4.12 修改内核参数

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF
 
# 立即生效
sysctl --system

五、安装containerd引擎

从kubernetes1.24版本以后,kubernetes就不再原生支持docker了,而是直接接入containerd。containerd本身就是docker架构的一部分,后来被开源给了云原生计算基金会;我们安装docker时,会自动带上containerd。

5.1 环境要求

centos7默认的libseccomp的版本为2.3.1,不满足containerd的需求,需要下载2.4以上的版本即可,我这里部署2.5.1版本。

# 1、如果你不升级libseccomp的话,启动容器会报错
**Failed to create pod sandbox: rpc error: code = Unknown desc = failed to create containerd task: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/k8s.io/ed17cbdc31099314dc8fd609d52b0dfbd6fdf772b78aa26fbc9149ab089c6807/log.json: no such file or directory): runc did not terminate successfully: exit status 127: unknown**

# 2、升级
rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps
#wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
wget https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm  # 官网已经gg了,不更新了,请用阿里云;centos8的包,centos7是可以用的,只要不是大版本。

rpm -qa | grep libseccomp

5.2 安装containerd

安装方式1:基于阿里源yum安装(推荐)

# 1、清空残余
yum remove docker docker-ce containerd docker-common docker-selinux docker-engine -y 
 
# 2、准备repo
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 3、安装
yum install containerd* -y

安装方式2:二进制部署(了解)
去官网找最新的包(新版containerd 1.7.18包内缺少runc容器运行时,需要单独安,旧版1.6.4是包含runc的,不需要额外安装)

# 1、下载containerd:https://github.com/containerd/containerd/releases/
wget https://github.com/containerd/containerd/releases/download/v1.7.18/containerd-1.7.18-linux-amd64.tar.gz
# 国内下载地址:https://gitee.com/egonlin/containerd-1.7.18

# 注意新版1.7.18包内缺少runc容器运行时,需要单独安装
# wget https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz
# 该版本中包含了 containerd以及cri runc等相关工具包


# 2、解压即可
tar zxvf containerd-1.7.18-linux-amd64.tar.gz -C /usr  # 命令都会解压到/usr/bin下,可以直接用都不用处理PATH变量

# 3、需要自己添加系统服务
cat > /usr/lib/systemd/system/containerd.service << "EOF"
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

EOF

# 4、systemctl daemon-reload

# 5、注意1.7.18包内缺少runc容器运行时,需要单独安装。

5.3 配置国内镜像

# 1、生成配置文件(默认containerd没有生成配置文件)
mkdir -pv /etc/containerd 
containerd config default > /etc/containerd/config.toml  # 为containerd生成配置文件

# 2、替换默认pause镜像地址
# 这一步非常非常非常非常重要,国内的镜像地址可能导致下载失败,最红kubeadm安装失败!

grep sandbox_image /etc/containerd/config.toml
sed -i 's/registry.k8s.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/' /etc/containerd/config.toml 
grep sandbox_image /etc/containerd/config.toml
# 请务必确认新地址是可用的:sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"
 
# 3、配置systemd作为容器的cgroup driver
grep SystemdCgroup /etc/containerd/config.toml
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/' /etc/containerd/config.toml
grep SystemdCgroup /etc/containerd/config.toml

# 4、配置加速器(必须配置,否则后续安装cni网络插件时无法从docker.io里下载镜像)
#参考:https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration
#添加 config_path = "/etc/containerd/certs.d"
sed -i 's/config_path\ =.*/config_path = \"\/etc\/containerd\/certs.d\"/g' /etc/containerd/config.toml

mkdir -p /etc/containerd/certs.d/docker.io
[root@k8s-master-01 ~]# cat /etc/containerd/certs.d/docker.io/hosts.toml 
server = "https://docker.io"
[host."https://docker.1ms.run"]
capabilities = ["pull", "resolve"]
[host."https://lispy.org"]
capabilities = ["pull", "resolve"]
[host."https://docker-0.unsee.tech"]
capabilities = ["pull", "resolve"]
[host."https://docker.xuanyuan.me"]
capabilities = ["pull", "resolve"]
[host."https://dockerproxy.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://docker.agsv.top"]
capabilities = ["pull", "resolve"]
[host."https://registry.docker-cn.com"]
capabilities = ["pull", "resolve"]
#该配置文件修改后不用重启,可以自动热加载。

# 5、配置containerd开机自启动
systemctl daemon-reload && systemctl restart containerd
systemctl enable --now containerd  # 启动containerd服务并配置开机自启动
systemctl status containerd # 查看containerd状态
ctr version # 查看containerd的版本

六、安装k8s

6.1 准备k8s源安装三大关键工具或组件

必须安装的三大工具

  • 1、kubelet:静态pod不由控制器管理,而是被kubelet管理。
  • 2、kubectl:客户端工具,用于我们访问、操作k8s
  • 3、kubeadm:用于部署/管理k8s集群。
[root@k8s-master-01 ~]# cat > /etc/yum.repos.d/kubernetes.repo << "EOF" 
[kubernetes] 
name=Kubernetes 
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/ 
enabled=1 
gpgcheck=1 
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key 
EOF
# 参考:https://developer.aliyun.com/mirror/kubernetes/

[root@k8s-master-01 ~]# setenforce 0
[root@k8s-master-01 ~]# yum install -y kubelet-1.30* kubeadm-1.30* kubectl-1.30*
# 当前阿里云同步的最新版本为1.36
[root@k8s-master-01 ~]# systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
image-20260623144949462

6.2 kubeadminit初始化拉起k8s集群

(1)部署方案1:指定参数部署(不推荐)

在主节点直接命令行敲命令(命令行不能指定用什么模式,只能用默认为iptables模式)

# 初始化
kubeadm init \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.30.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

# 也可以使用
--image-repository=registry.cn-hangzhou.aliyuncs.com/k8sos # 老版本的可以用, 新版本不行
# 可选项:
--apiserver-advertise-address=192.168.71.12 # 如果是高可用部署,那该地址指向vip地址即可

(2)部署方案2:指定yaml文件部署(推荐)

在主节点查看需要拉取的镜像。

# 初始化master节点(仅在master节点上执行): 可以kubeadm config images list查看
[root@k8s-master-01 ~]# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.30.0
registry.k8s.io/kube-controller-manager:v1.30.0
registry.k8s.io/kube-scheduler:v1.30.0
registry.k8s.io/kube-proxy:v1.30.0
registry.k8s.io/coredns/coredns:v1.11.1 # 解析ip地址,需要网络打通后才能正常运行。
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0

生成配置文件kubeadm.yaml,编辑修改后再部署。这种方法可以指定网络模式等。

# kubeadm config print init-defaults > kubeadm.yaml
# cat kubeadm.yaml
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.3.201 #控制节点的ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock #指定containerd容器运行时
  imagePullPolicy: IfNotPresent
  name: k8s-master-01
  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.cn-hangzhou.aliyuncs.com/google_containers # 换成阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.30.0  # 指定k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12 # 指定Service网段
  podSubnet: 10.244.0.0/16 # 增加一行,指定pod网段
scheduler: {}

#在文件最后,插入以下内容,(复制时,要带着---):
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # 表示kube-proxy代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables效率低,所以我们生产环境建议开启ipvs,阿里云和华为云托管的K8s,也提供ipvs模式
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

# ---表示分割

部署

[root@k8s-master-01 ~]# kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification --ignore-preflight-errors=Swap

看到以下提示说明初始化完成。

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.3.201:6443 --token 9hovhy.vxm1l7zs16zr53ve \
	--discovery-token-ca-cert-hash sha256:3b210d53b7f26a43ccf251cfb9f809f280048ab70bf5c1458c69586ed0eb9905

注意:一旦kubeadm init 报错

  • 修复问题:把错误的,遗漏的地方改掉
  • 清理环境:
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd

查看node: 最开始时看到加入的工作节点是NotReady状态,是正常现象,因为此时网络组件还没有部署ok。

[root@k8s-master-01 ~]# kubectl get nodes
NAME          STATUS   ROLES         AGE   VERSION
k8s-master-01 NotReady control-plane 4m26s v1.30.0
 
[root@k8s-master-01 ~]# kubectl -n kube-system get pods
NAME                                 READY STATUS RESTARTS AGE
coredns-7c445c467-mfls7               0/1 Pending 0 6m30s
coredns-7c445c467-zvkkw               0/1 Pending 0 6m30s
etcd-k8s-master-01                    1/1 Running 0 6m44s
kube-apiserver-k8s-master-01          1/1 Running 0 6m44s
kube-controller-manager-k8s-master-01 1/1 Running 0 6m44s
kube-proxy-jhxrd                      1/1 Running 0 109s
kube-proxy-nh7tj                      1/1 Running 0 33s
kube-proxy-q92mx                      1/1 Running 0 6m30s
kube-scheduler-k8s-master-01          1/1 Running 0 6m44s
 

小提示:kubeadm部署时,k8s的组件是以静态pod的形式启动起来的,网络插件(如flannel)则是以daemonSet的形式启动的,我们需要单独进行网络插件的部署,然后整个k8s集群才会启动成功。

6.3 添加workernode节点

在工作节点上执行

[root@k8s-node-01 ~]#  kubeadm join 192.168.71.12:6443 --token 9hovhy.vxm1l7zs16zr53ve \
--discovery-token-ca-cert-hash sha256:3b210d53b7f26a43ccf251cfb9f809f280048ab70bf5c1458c69586ed0eb9905

要重新生成 Kubernetes 节点加入集群的 token,请在主节点(控制平面节点)上执行以下命令

[root@k8s-master-01 ~]# kubeadm token create --print-join-command
- kubeadm token create:创建新的 bootstrap token
- print-join-command:直接输出完整的 kubeadm join命令,包含 token 和 CA 证书哈希值

kubeadm token list              # 查看当前有效的 token 列表
kubeadm token create --ttl 0    # 创建永不过期的 token
kubeadm token create --ttl 12h  # 创建 12 小时后过期的 token
kubeadm token delete <token-id> # 删除指定的 token

小知识点:token默认有效期是24h,如果之前保存的join命令已经过期,重新生成token即可。

6.4 flannel编排文件及海外构建镜像

下载海外镜像有2种办法。第一种是通过vpn软件将镜像从源站下载下来,然后上传到一个本地网络连通的仓库;第二种办法是通过阿里云代码仓库+阿里云镜像仓库,通过阿里云自身的外网能力构建镜像来使用。此处只列举第二种办法。
海外构建镜像:利用阿里云镜像仓库的构建功能。(在不具备外网条件的情况下可以使用该方案;如果具备外网条件,可以直接从github下载源镜像)
1、阿里云代码仓库CodeUp:编写构建镜像的dockerfile(源镜像可以在源kube-flannel.yml中获取)

[root@k8s-master-01 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

image-20260325193043468

2、阿里云镜像仓库:通过代码仓库构建镜像并保存。

image-20260325193112043

3、使用阿里云仓库的镜像

[root@k8s-master-01 ~]# vim kube-flannel.yml
略...
        image: registry.cn-guangzhou.aliyuncs.com/cuckooyang-test/flannel:v1.9.0-flannel1
        name: kube-flannel
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
略...

6.5 部署flannel网络插件

1、下载并修改网络插件的yaml

  • 修改1:pod子网,应与kubeadm配置一致
  • 修改2:镜像,可以指定为自己构建的阿里云镜像仓库(本处为我的阿里云仓库,已经提前构建过需要的镜像),用阿里云仓库构建镜像的方法可以参考xxxxx。
[root@k8s-master-01 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@k8s-master-01 ~]# cat kube-flannel.yml 
apiVersion: v1
kind: Namespace
metadata:
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
  name: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "EnableNFTables": false,
      "Backend": {
        "Type": "vxlan"
      }
    }
kind: ConfigMap
metadata:
  labels:
    app: flannel
    k8s-app: flannel
    tier: node
  name: kube-flannel-cfg
  namespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: flannel
    k8s-app: flannel
    tier: node
  name: kube-flannel-ds
  namespace: kube-flannel
spec:
  selector:
    matchLabels:
      app: flannel
      k8s-app: flannel
  template:
    metadata:
      labels:
        app: flannel
        k8s-app: flannel
        tier: node
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      containers:
      - args:
        - --ip-masq
        - --kube-subnet-mgr
        command:
        - /opt/bin/flanneld
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        - name: CONT_WHEN_CACHE_NOT_READY
          value: "false"
        image: registry.cn-guangzhou.aliyuncs.com/cuckooyang-test/flannel:v1.9.0-flannel1
        name: kube-flannel
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        securityContext:
          capabilities:
            add:
            - NET_ADMIN
            - NET_RAW
          privileged: false
        volumeMounts:
        - mountPath: /run/flannel
          name: run
        - mountPath: /etc/kube-flannel/
          name: flannel-cfg
        - mountPath: /run/xtables.lock
          name: xtables-lock
      hostNetwork: true
      initContainers:
      - args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        command:
        - cp
        image: registry.cn-guangzhou.aliyuncs.com/cuckooyang-test/flannel-cni-plugin:v0.28.1 
        name: install-cni-plugin
        volumeMounts:
        - mountPath: /opt/cni/bin
          name: cni-plugin
      - args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        command:
        - cp
        image: registry.cn-guangzhou.aliyuncs.com/cuckooyang-test/flannel:v1.9.0-flannel1
        name: install-cni
        volumeMounts:
        - mountPath: /etc/cni/net.d
          name: cni
        - mountPath: /etc/kube-flannel/
          name: flannel-cfg
      priorityClassName: system-node-critical
      serviceAccountName: flannel
      tolerations:
      - effect: NoSchedule
        operator: Exists
      volumes:
      - hostPath:
          path: /run/flannel
        name: run
      - hostPath:
          path: /opt/cni/bin
        name: cni-plugin
      - hostPath:
          path: /etc/cni/net.d
        name: cni
      - configMap:
          name: kube-flannel-cfg
        name: flannel-cfg
      - hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
        name: xtables-lock

2、部署
通过yaml部署网络插件flannel,待部署完成后,node节点全部ready,pod状态全部running。如遇到一直无法启动,可首先排查网络插件是否安装成功。

[root@k8s-master-01 ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master-01 ~]# kubectl get nodes # 全部ready
[root@k8s-master-01 ~]# kubectl -n kube-flannel get pods -w
[root@k8s-master-01 ~]# kubectl -n kube-system get pods # 两个coredns的pod也都ready

注意:flannel 是配合 kube-cni组件一起工作的,k8s的网络并非只有flannel等插件完成,如果安装时网络一直无法完成,可以考虑是否为cni组件下载失败。所有的cni组件会被部署到/opt/cni/bin下。

七、k8s环境清理与重置

部署遇到问题之后,铲掉环境重新部署

1、在master节点上重置k8s集群

kubeadm reset -f

2、铲除各节点上的k8s组件(在所有节点包括master节点在内上执行如下命令)

cd /tmp # 有时候在当前目录下可能与要卸载的包重名的而导致卸载报错,可以切个目录
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
rm -rf /run/flannel
rm -rf /opt/cni
rm -rf /etc/cni/net.d
rm -rf /run/xtables.lock
systemctl stop kubelet
yum remove kube* -y
# 先卸载所有kubelet挂载否则下条命令无法删除
for i in `df |grep kubelet |awk '{print $NF}'`;do umount -l $i ;done 
rm -rf /var/lib/kubelet
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
iptables -F
 # 重新启动,从头再来
reboot

3、重新安装k8s

3.1 第一步:在所有节点执行
yum install -y kubelet-1.30* kubeadm-1.30* kubectl-1.30*
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet

3.2 第二步:只在master节点上执行
[root@k8s-master-01 k8s-package]# kubeadm config print init-defaults > kubeadm.yaml # 修改配置文件
[root@k8s-master-01 k8s-package]# kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification --ignore-preflight-errors=Swap

3.3 第三步:部署网络插件(参考此前的步骤)
[root@k8s-master-01 k8s-package]# kubectl  apply -f kube-flannel.yml 

3.4 加入worker节点(每次master初始化都会生成)
[root@k8s-node-01 ~]# kubeadm join 192.168.3.201:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:e67c5f015b977d6fdeee37808026c444fec402056ddf1f2b800b01120f2b3e10

4 kubeadm.yaml 配置文件内容生成及修改如下

[root@k8s-master-01 k8s-package]# kubeadm config print init-defaults > kubeadm.yaml 
[root@k8s-master-01 k8s-package]# cat kubeadm.yaml 
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.3.201 #控制节点的ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock #指定containerd容器运行时
  imagePullPolicy: IfNotPresent
  name: k8s-master-01
  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.cn-hangzhou.aliyuncs.com/google_containers # 换成阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.30.0  # 指定k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12 # 指定Service网段
  podSubnet: 10.244.0.0/16 # 增加一行,指定pod网段
scheduler: {}

#在文件最后,插入以下内容,(复制时,要带着---):
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs 
# 表示kube-proxy代理模式是ipvs,如果不指定ipvs,会默认使用iptables,但是iptables效率低,所以我们生产环境建议开启ipvs,阿里云和华为云托管的K8s,也提供ipvs模式
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

八、kubeclt补全功能

kubectl 命令中,选项和参数默认没有补全功能,可以通过下载bash-completion工具,在命令行输入时实现tab键自动补全。(需要kubectl控制平面满足网络条件才行)

[root@k8s-master-01 k8s-package]# yum install bash-completion* -y
[root@k8s-master-01 k8s-package]# kubectl completion bash > ~/.kube/completion.bash.inc
[root@k8s-master-01 k8s-package]# echo "source '$HOME/.kube/completion.bash.inc'" >> $HOME/.bash_profile
[root@k8s-master-01 k8s-package]# source $HOME/.bash_profile

16 阿里yum源的使用

阿里云关于k8s的镜像介绍文档地址:https://developer.aliyun.com/mirror/kubernetes/

posted @ 2026-06-23 15:55  cuckooyang  阅读(23)  评论(0)    收藏  举报