部署Kubernetes最新版v 1.27.1
| CreateDate | UpdateDate | Author |
|---|---|---|
| 2023/04/27 | 2023/04/29 | LisaSummer |
前置
- 清醒的脑子
- 不要无脑复制
- 灵活的双手
- 搭配文中链接配合官网教程查阅
- 查阅本文所使用配置清单的各种组件是否符合你的期望
- 本文使用基于RPM的基于Red Hat Linux发行版的RockyLinux 8.0及9.1的amd64位版本部署
- Linux基础知识
- vi/vim基本的使用
截至
2023/04/27本文基于Kubernetes最新版v1.27.1的版本进行部署
配置清单
集群创建
使用kubeadm管理kunernets集群
容器运行时(CRI)
使用containerd, 二进制文件使用Ubuntu和RockyLinux动态生成,其它发行版不保证
容器网络接口(CNI)
使用CNI plugins
为什么需要? 在网络语境中,容器运行时(Container Runtime)是在节点上的守护进程, 被配置用来为 kubelet 提供 CRI 服务。具体而言,容器运行时必须配置为加载所需的 CNI 插件,从而实现 Kubernetes 网络模型
机器要求
- 至少2台兼容 deb/rpm 的 Linux 操作系统的计算机, 如:Ubuntu 或 CentOS, Rocky Linux
- 每台机器 2 GB 或更多的 RAM
- CPU 2 核心及以上。
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里 了解更多详细信息。
开启机器上的某些端口。请参见这里 了解更多详细信息。
- 禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。
- 例如,
sudo swapoff -a将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如/etc/fstab、systemd.swap等配置文件中禁用交换分区,具体取决于你的系统如何配置
- 例如,
- 有一个以上的网络适配器时你的 Kubernetes 组件通过默认路由不可达,添加 IP 路由规则, Kubernetes 集群就可以通过对应的适配器完成连接
搭建基础环境
配置源
仅针对RockyLinux发行版
替换默认的配置
对于 Rocky Linux 8,使用以下命令
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' \
-i.bak \
/etc/yum.repos.d/Rocky-AppStream.repo \
/etc/yum.repos.d/Rocky-BaseOS.repo \
/etc/yum.repos.d/Rocky-Extras.repo \
/etc/yum.repos.d/Rocky-PowerTools.repo
对于 Rocky Linux 9,使用以下命令
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' \
-i.bak \
/etc/yum.repos.d/rocky-extras.repo \
/etc/yum.repos.d/rocky.repo
更新缓存
dnf makecache
(可选) 删除并更新缓存
sudo yum clean all && dnf makecache
(可选)升级内核
检查Linux 内核版本
uname -a
示例: 6.3.0-1.el8为Linux内核版本
6.3.0-1.el8.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Apr 23 17:54:58 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux
添加ELRepo软件源
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
安装内核
Q & A Q: error: Failed dependencies: system-release < 9 is needed by elrepo-release-8.3-1.el8.elrepo.noarch A: yum install -y elrepo-release
sudo yum --enablerepo=elrepo-kernel install kernel-ml
重启系统
sudo shutdown -r now
查看Linux主机架构
查看Linux主机架构, 并使用你架构所对应的软件包, 本文所使用系统是x86_64架构
uname -m
设置主机名
主节点: 任意名. 推荐master作为控制平面节点名称
#master节点
hostnamectl set-hostname master
node节点, 任意名
hostnamectl set-hostname <node-name>
建立虚拟机网卡
所有节点添加修改以下网卡配置
- 将
<公网IP>替换为你当前节点的公网IP
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=<公网IP>
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
-
重启网卡
ifdown eth0 && ifup eth0 -
重启网络
systemctl restart network.service -
确认是否添加成功
ip a -
修改kubelet启动参数文件(所有节点) 修改kubeadm配置, 替换
<公网IP>为当前节点公网IP
echo >> /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网IP>
添加hosts映射
格式:
echo "<master-IP>" master >> /etc/hosts
echo "<node1-IP>" node1 >> /etc/hosts
echo "<nodeN-IP>" nodeN >> /etc/hosts
示例:
echo "192.168.1.1" master >> /etc/hosts
echo "192.168.1.2" node1 >> /etc/hosts
echo "192.168.1.3" node2 >> /etc/hosts
禁用交换分区
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
开放端口
查看并开启Kubernetes的端口使用列表
或者: 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭SELinux
将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Q: 为什么?
A: 这是允许容器访问主机文件系统所必需的,而这些操作是为了例如 Pod 网络工作正常.直到 kubelet 做出对 SELinux 的支持进行升级为止
如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置
如果由于该 Red Hat 的发行版无法解析basearch导致获取baseurl失败,请将\$basearch替换为你计算机的架构。 输入uname -m
以查看该值。 例如,x86_64的baseurlURL 可以是:https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。
tc
tc 是 Linux 下用于 Traffic Control (流量控制) 的工具,通常用于网络带宽限制。
检查是否安装:
yum install -y which
which ts
如果tc 未安装:
sudo yum install iproute-tc -y
(可选)配置时间同步
yum install ntpdate -y
ntpdate ntp1.aliyun.com
部署
转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
检查
-
通过运行以下指令确认
br_netfilter和overlay模块被加载:lsmod | grep br_netfilter
lsmod | grep overlay -
通过运行以下指令确认
net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables和net.ipv4.ip_forward系统变量在你的sysctl配置中被设置为 1:sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
安装containerd
二进制文件适用于Ubuntu和RockyLinux
因为将systemd配置为 kubelet 的 cgroup 驱动,kubeadm 把 kubelet 视为一个系统服务来管理,为了保持kubelet与
containerd使用同一个系统服务器,所以也必须修改容器运行时(本文使用containerd)的配置, 让他们保持使用同一个
cgroup
-
创建一个用于保存Kubernetes所需要的组件目录
mkdir -p /k8s -
从github 下载最新版 示例: 下载最新版1.7.0,选择一种方法即可
- 在Linux主机使用
wget安装
yum install -y wget
wget https://github.com/containerd/containerd/releases/download/v1.7.0/containerd-1.7.0-linux-amd64.tar.gz
- 在Windows或Mac下载,然后上传至Linux主机 语法:
scp <file> <username>@IP:<path>
示例: 将k8s/目录下所有的文件上传至root用户主机192.168.0.24的/k8s目录下
scp ./k8s/* root@192.168.0.24:/k8s
-
解压
tar Cxzvf /usr/local /k8s/containerd-1.7.0-linux-amd64.tar.gz -
生成配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
systemctl daemon-reload
systemctl restart containerd -
检查安装
ctr -v
使用systemd作为启动containerd的系统组件
-
新建
containerd.service文件, 复制配置文件服务单元文件内容到containerd.service中vi containerd.service -
移动至
/usr/local/lib/systemd/system/containerd.servicemkdir -p /usr/local/lib/systemd/system/
mv containerd.service /usr/local/lib/systemd/system/containerd.service
添加国内源
kubernetes v.125.0版本之后
参考发布说明 无需配置, 跳过此步骤
kubernetes v.125.0版本之后容器映像注册表已经从k8s.gcr.io到registry.k8s.io
。这个新的注册表将负载分散到多个云提供商和区域,作为Kubernetes容器映像的一种内容交付网络(CDN)
。这一变化减少了项目对单个实体的依赖,并为大量用户提供了更快的下载体验
kubernetes v.125.0版本之前配置
在/etc/containerd/config.toml的大致所在的168行处添加镜像配置:
在[plugins."io.containerd.grpc.v1.cri".registry]字段的[plugins."io.containerd.grpc.v1.cri".registry.mirrors]下添加
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["registry.aliyuncs.com/google_containers"]
如图 ![[Pasted image 20230427172338.png]]
将sandbox_image字段的值修改为registry.aliyuncs.com/google_containers/pause:3.9
大约在66行处,进行修改
#sandbox_image = "registry.k8s.io/pause:3.8"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
重启读取配置文件
systemctl daemon-reload
systemctl enable --now containerd
runc
- 访问github下载 示例: 下载最新版1.1.6,选择一种方法即可
- 在Linux主机使用
wget安装
yum install -y wget
wget https://github.com/opencontainers/runc/releases/download/v1.1.6/runc.arm64
- 在Windows或Mac下载,然后上传至Linux主机
语法:
scp <file> <username>@IP:<path>
示例: 将k8s/目录下所有的文件上传至root用户主机192.168.0.24的/k8s目录下
scp ./k8s/* root@192.168.0.24:/k8s
install -m 755 /k8s/runc.amd64 /usr/local/sbin/runc
#验证, 有输出runc,commit,spec,go,libseccomp信息即为安装成功
runc -v
CNI plugins
示例:
wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin /k8s/cni-plugins-linux-amd64-v1.2.0.tgz
所有节点操作
#参考: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 /etc/containerd/certs.d/docker.io -p
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://vh3bm52y.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
systemctl daemon-reload && systemctl restart containerd
cgroup
在 Linux 上,控制组(CGroup)用于限制分配给进程的资源.
kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置
由于 kubeadm 把 kubelet 视为一个系统服务来管理,基于 kubeadm 的安装推荐使用systemd驱动,
不推荐
cgroupfs驱动。cgroupfs也是cgroup的管理器 参考 因为某些Linux发行版,例如RockyLinux, CentOS使用systemd作为初始化系统的工具,初始化进程会生成一个root控制组(cgroup)充当cgroup管理器导致systemd与cgroupfs会存在互相竞争的一个关系. 将造成系统中针对可用的资源和使用中的资源出现两个视图。某些情况下, 将 kubelet 和容器运行时配置为使用cgroupfs、但为剩余的进程使用systemd的那些节点将在资源压力增大时变得不稳定
containerd配置cgroup的驱动
结合runc使用systemdcgroup 驱动,在/etc/containerd/config.toml中设置:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
或者: 将SystemdCgroup的false 替换为true 此方法需要自行查看, 可能会随着版本更新而变动, 谨慎使用
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
重启containerd读取配置文件
sudo systemctl restart containerd
重载沙箱(pause)镜像
在你的containerd 配置中, 你可以通过设置以下选项重载沙箱镜像:
替换源
- 将
sandbox_image字段值修改为国内源, 例如将registry.k8s.io/pause:3.2改为registry.aliyuncs.com/google_containers/pause:3.8
官网默认为3.2的版本, 最新是3.9,containerd默认使用的是官网的3.8
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
- 重启containerd
sudo systemctl restart containerd
显式声明
初始化时显式声明使用systemd管理器
需要在使用kubeadm init管理初始化时使用配置文件或yml配置文件来显式声明
在kubeadm-config.yaml末尾添加如下内容, 本操作在后续步骤已添加
---
# 配置kubelet的CGroup为systemd
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd # 指定kubelet的CGroup为systemd, 搭配containerd使用
配置Kubernetes
基于Red Hat的发行版安装kubelet, kubeadm ,kubectl:
国内服务 器
- 替换
baseurl字段为国内源,例如https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ - 替换
gpgkey字段的值为国内源,例如: `https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
替换源
国内源文件替换示例: 参考
cat <<EOF | sudo tee /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
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
源文件:
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
安装并加入到自启列表
由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用
yum install -y --nogpgcheck kubelet kubeadm kubectl安装, 参考
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet --now
systemctl start kubelet
检查安装
kubectl version --output=yaml
kubeadm version
kubelet --version
初始化
初始化的阶段
- preflight 运行安装前检查
- Certificate generation 生成证书
- Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file 生成建立控制平面所需的所有kubecconfig文件和admin kubecconfig文件
- kubelet-start Write kubelet settings and (re)start the kubelet 启动
kubelet - etcd 生成建立控制平面所需的所有静态Pod清单文件
- 更新kubeadm与kubelet的配置文件
- 上传证书到kubeadm-cert
- 将节点标记为控制平面
- 生成token,用于将节点加入到集群
- TLS引导后更新kubelet相关的设置
- 安装通过一致性测试所需的附加组件
- 显示控制与工作节点连接的指令
初始化前运行检查
仅在master主节点操作
- 生成默认的配置文件
kubeadm config print init-defaults > kubeadm-init.yml
- 根据你的熟练情况编辑
kubeadm.yaml文件, 注释处为基本需要修改的地方kubeadm.yml内容大致如下:
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.58.131 # 修改为宿主机ip
bindPort: 6443 # API 服务器绑定的端口
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
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 # v.1.25.0版本以下修改为阿里镜像
kind: ClusterConfiguration
kubernetesVersion: 1.27.1 # 你安装kubeadm时的版本
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 ## 设置pod网段
scheduler: {}
###添加内容:配置kubelet的CGroup为systemd
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
- 使用配置文件对 kubeadm init 进行启动检查。 语法:
kubeadm init phase preflight [flags]
选项:
--configstringkubeadm 配置文件的路径。--dry-run不做任何更改;只输出将要执行的操作。-h, --helppreflight操作的帮助命令--ignore-preflight-errors strings错误将显示为警告的检查列表:例如:'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误
kubeadm init phase preflight --config kubeadm-init.yml --dry-run
创建集群
- 运行
kubeadm init --config kubeadm.yaml
或者:
kubeadm init \
--apiserver-advertise-address="0.0.0.0" \ # 指定 kube-apiserver 组件对外广播的 IP 地址。这里设置为 0.0.0.0,表示监听所有网络接口
--apiserver-cert-extra-sans=127.0.0.1,139.198.165.102,139.198.172.110 \ # 用于在生成 kube-apiserver 证书时添加额外的 Subject Alternative Names (SANs)
--service-cidr="10.96.0.0/16" \ # 指定 Service 网络的地址段
--pod-network-cidr="10.244.0.0/16" \ # 指定 Pod 网络的地址段
--image-repository="registry.k8s.io" \ #镜像
--kubernetes-version="1.27.1" \ # kubernetes版本
--upload-certs --control-plane-endpoint="127.0.0.1" \ # 在初始化期间将证书和 kubeconfig 文件上传到 etcd 中
--cri-socket="unix:///var/run/containerd/containerd.sock" # 指定容器运行时的地址
- 把
containerd加入到系统环境变量
export PATH=$PATH:/usr/local/bin/containerd
- 将集群配置文件拷贝到当前用户的 .kube 目录下 ,并授权给当前用户使用
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(可选)从控制平面节点以外的计算机控制集群 参考
为了使 kubectl 在其他计算机(例如笔记本电脑)上与你的集群通信, 你需要将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示:
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes
(可选)将 API 服务器代理到本地主机 参考
如果要从集群外部连接到 API 服务器,则可以使用kubectl proxy:
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf proxy
你现在可以在本地访问 API 服务器http://localhost:8001/api/v1
网络插件
安装网络插件(master节点)
必须部署一个基于 Pod 网络插件的容器网络接口( CNI),以便你的 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
- 注意你的 Pod 网络不得与任何主机网络重叠: 如果有重叠,你很可能会遇到问题。 (如果你发现网络插件的首选 Pod 网络与某些主机网络之间存在冲突,
则应考虑使用一个合适的 CIDR 块来代替, 然后在执行
kubeadm init时使用--pod-network-cidr参数并在你的网络插件的 YAML 中替换它)。 - 默认情况下,
kubeadm将集群设置为使用和强制使用RBAC(基于角色的访问控制)。 确保你的 Pod 网络插件支持 RBAC,以及用于部署它的清单也是如此。 - 如果要为集群使用 IPv6(双协议栈或仅单协议栈 IPv6 网络), 请确保你的 Pod 网络插件支持 IPv6。 IPv6 支持已在 CNIv0.6.0版本中添加
根据自己的选择去安装网络插件。选择一种即可
calico
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
重启containerd
systemctl restart containerd
Flannel
通过此 k8s链接的README找到
Deploying Flannel with kubectl字段的值
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
其他指令
显示token列表
kubeadm token list
重新获取token:
kubeadm token create --print-join-command
获取--discovery-token-ca-cert-hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
(可选)安装crictl
所有节点安装
crict CRI-Tools是实现了CRI(容器运行时接口)的工具, 是kubernetes的kubelet管理和维护Pod所使用的默认工具
-
下载地址, 找到你对应kubernetes的版本, 例如版本为v.1.27.1的就去下载v1.27.0这个tag的软件包
-
上传到服务器
tar -vzxf /crictl-v1.27.0-linux-amd64.tar.gz -C /usr/local/bin/
cat >> /etc/crictl.yaml << EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
EOF
systemctl restart containerd
配置ipvs
所有节点配置 从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是ipvs采用的hash表,iptables采用一条条的规则列表。iptables又是为了防火墙设计的,集群数量越多iptables规则就越多,而iptables规则是从上到下匹配,所以效率就越是低下。因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能
#安装ipset和ipvsadm
yum install ipset ipvsadm -y
#由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块
mkdir -p /etc/sysconfig/modules/
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#执行加载模块脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules
#查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#配置kubelet
cat >> /etc/sysconfig/kubelet << EOF
# KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
启用 shell 自动补全功能
- yum:
yum install bash-completion -y
- apt-get
apt-get install bash-completi
检查安装
type _init_completion
不成功则使用需要手动添加内容到bashrc文件
source /usr/share/bash-completion/bash_completion
启用 kubectl 自动补全功能
当前用户:
echo 'source <(kubectl completion bash)' >>~/.bashrc
或:
系统全局
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl
如果kubectl 有关联的别名,你可以扩展 Shell 补全来适配此别名: 示例:
echo 'alias ct=kubectl' >> ~/.bashrc
echo 'complete -o default -F __start_kubectl ct' >> ~/.bashrc
source ~/.bashrc
清理集群
重新初始化集群
在删除节点之前,请重置kubeadm安装的状态:
语法:
kubeadm reset [flags]
选项:
--cert-dir string默认值:"/etc/kubernetes/pki" 存储证书的目录路径。如果已指定,则需要清空此目录。--cleanup-tmp-dir清理 "/etc/kubernetes/tmp" 目录--cri-socket string要连接的 CRI 套接字的路径。如果为空,则 kubeadm 将尝试自动检测此值;仅当安装了多个CRI 或具有非标准 CRI 插槽时,才使用此选项。--dry-run不做任何更改;只输出将要执行的操作。-f,--force在不提示确认的情况下重置节点。-h,--helpreset 操作的帮助命令--ignore-preflight-errors strings错误将显示为警告的检查列表;例如:'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误。--kubeconfig string默认值:"/etc/kubernetes/admin.conf" 与集群通信时使用的 kubeconfig 文件。如果未设置该标志,则可以在一组标准位置中搜索现有的 kubeconfig 文件。--skip-phases strings要跳过的阶段列表
示例:
kubeadm reset --cert-dir /etc/kubernetes/pki --cleanup-tmp-dir -f
rm -rf /etc/cni/net.d # 网络
rm -rf $HOME/.kube
rm -rf /etc/kufebernetes/pki/* # 证书
rm -rf /var/etcd
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
rm -rf /var/lib/kubelet/kubeadm-flags.env # kubelet environment file with flags
rm -rf /etc/kubernetes/ # kubeconfig 文件
rm -rf /var/lib/kubelet/config.yaml # kubelet configuration
rm -rf /etc/kubernetes/manifests # control plane as static Pods
重置iptables
重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
重置 IPVS 表
如果要重置 IPVS 表,则必须运行以下命令:
ipvsadm -C
删除节点
kubectl delete node <节点名称>
清除集群
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube
rm -rf /etc/kufebernetes/pki/*
rm -rf /var/etcd
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
![[II74B0FZ0AJLEX[0O3_(B.jpg]]
异常参考
Q:
networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory
A:
在每个节点创建文件/run/flannel/subnet.env写入以下内容,配置后等待一会就好了
mkdir /run/flannel/ && echo > "/run/flannel/subnet.env" \
"FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true"
Q&A
Q: [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
因为之前初 始化过
A: 修改内核
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
重启
sysctl --system
Q: E0419 17:19:24.409506 137577 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused The connection to the server localhost:8080 was refused - did you specify the right host or port?
A:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config