Skip to content


k8s_安装2_基础准备

二、k8s 集群搭建基础准备

k8s安装方式

Kubeadm,二进制包,minikube,k3s,k3d,kind,MicroK8s等等

minikube

master和worker在一起,测试用
采用生成虚拟机的方法,该虚拟机本质上是一个单节点 K8s 集群

k3s

适合单机测试脚本安装
curl -sfL https://get.k3s.io | sh –

k3d

顾名思义就是 docker 上的 k3s,轻松地在 docker 容器中运行高度可用的轻量级 k3s 集群

MicroK8s

适合离线开发、原型开发和测试,适合开发 IoT 应用,通过 MicroK8s 部署应用到小型Linux设备上。

kind

kind 即 Kubernetes In Docker,顾名思义,就是将 k8s 所需要的所有组件,全部部署在一个docker容器中,是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用,但是如果你只是想在本地简单的玩玩 k8s,不想占用太多的资源,那么使用 kind 是你不错的选择。

Kubeadm 方式

Kubeadm 是 k8s 的部署工具,它提供了 kubeadm init 和 kubeadm join,专用于快速部署 k8s 集群,它能通过两条指令完成一个 Kubenetes 集群的搭建。Kubeadm 部署方式的优点是降低了部署门槛,部署方式快捷且简单;但缺点是屏蔽了诸多细节,遇到问题难以排查是哪里出现了问题。

二进制包安装

过于繁琐
后面会单独配制

k8s测试环境规划

192.168.244.6 harbor.k8s.local #harbor 访问地址
192.168.244.6 repo.k8s.local #harbor
192.168.244.5 node01.k8s.local
192.168.244.7 node02.k8s.local
192.168.244.4 master01.k8s.local

确保每个节点上 MAC 地址和 product_uuid 的唯一性
你可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
生成uuid可以使用uuidgen命令,或者cat一下这个节点获取:/proc/sys/kernel/random/uuid

一、基础环境配置(所有主机均要配置)

第一步:关闭防火墙

#临时关闭
systemctl stop firewalld
systemctl stop iptables
/etc/init.d/iptables stop

#永久关闭
systemctl disable firewalld
systemctl disable iptables
chkconfig iptables off

machine-id修改

在master节点和node节点都需要执行,主要是为了清除克隆机器machine-id值一样的问题
rm -f /etc/machine-id && systemd-machine-id-setup

第二步:关闭 selinux

#永久关闭
setenforce 0 && sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0

第三步:关闭 swap

交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。 kubelet 自 v1.22 起已开始支持交换分区。自 v1.28 起,仅针对 cgroup v2 支持交换分区; kubelet 的 NodeSwap 特性门控处于 Beta 阶段,但默认被禁用。
如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,sudo swapoff -a 将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如 /etc/fstab、systemd.swap 等配置文件中禁用交换分区,具体取决于你的系统如何配置。

#临时关闭
swapoff -a
#永久关闭
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

第四步:配置 ssh 互信

# 直接一直回车就行
dnf install ssh-keygen ssh-copy-id

## 使用rsa加密,兼容低版本
ssh-keygen -t rsa -b 4096 -C "[email protected]"
## 使用ed25519+sha256加密,向后兼容更佳
ssh-keygen -t ed25519 -C 'support OpenSSH 6.5~'
## 默认方式,看系统
ssh-keygen

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

ssh-copy-id -i ~/.ssh/id_ed25519 [email protected]

#for i in 192.168.244.4 192.168.244.7 ; do ssh-copy-id $i; done

第五步:hosts文件和yum源

设置主机名称,使用命令 hostnamectl set-hostname 主机名

如果不支持DNS解析,在各个节点中添加 hosts,即节点 IP地址+节点名称;

cat >> /etc/hosts << EOF
192.168.244.6 repo.k8s.local
192.168.244.5 node01.k8s.local
192.168.244.7 node02.k8s.local
192.168.244.4 master01.k8s.local
EOF

cat >> /etc/hosts << EOF
192.168.68.1 yjs-prd-master01.k8s.sys.ba.sh
192.168.68.2 yjs-prd-node01.k8s.sys.ba.sh
192.168.68.3 yjs-prd-node02.k8s.sys.ba.sh
EOF

配置完后可以在各台主机上通过ping master/ping node1/ping node2 来测试是否可以ping通

批量配置集群内各主机的hosts

for i in {192.168.244.4,192.168.244.7};do scp /etc/hosts root@$i:/etc/;done

批量配置集群内各主机的静态主机名

#跳过前2行localhost
tail -n +3 /etc/hosts | while read hang;do server=`echo ${hang} | awk -F " " '{print $1}'` && name=`echo ${hang} | awk -F " " '{print $2}'` && echo  ${name} ;done
tail -n +3 /etc/hosts | while read hang;do server=`echo ${hang} | awk -F " " '{print $1}'` && name=`echo ${hang} | awk -F " " '{print $2}'` && ssh -n root@${server} "hostnamectl set-hostname ${name}";done

原文链接:https://blog.csdn.net/UsamaBinLaden6976498/article/details/132897456

酌情关闭集群内主机的 SElinux、 swap、 OS 防火墙,并检查其状态

for i in {192.168.244.5,192.168.244.6}; do ssh root@$i "echo -e ' ';echo -e 'ip: '; \
ip a | grep -E -w 'inet.*ens33';echo -e ' ';echo -e 'SELinux:';sestatus;echo -e ' \
';echo -e 'firewall:'systemctl status firewalld;echo -e ' ';echo -e \
'SWAP: ';swapon --show;echo -e ' '" ; done

替换源

#阿里云
cp -r /etc/yum.repos.d/ /etc/yum.repos.d_bak​
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-*.repo

#上海交通大学
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.sjtug.sjtu.edu.cn/rocky|g' \
    -i.bak \
    /etc/yum.repos.d/[Rr]ocky*.repo

#epel源
dnf config-manager --set-enabled crb
dnf install epel-release -y
# 安装 EPEL Repo
#dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
# 安装 EPEL Next Repo
#dnf install -y  https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm
sed -e 's|^metalink=|#metalink=|g' \
    -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|g' \
    -i.bak \
    /etc/yum.repos.d/epel*.repo
# 注意:
# Rocky Linux 中 #baseurl=https://download.example/pub
# 与 CentOS 相同,而 Alma Linux #baseurl=https://download.fedoraproject.org/pub

dnf makecache

第六步:时间同步,让各个节点(虚拟机)中的时间与本机时间保持一致。

默认集群可接受节点时间差为10s以内

yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
date

### 配制内部ntp服务器
cat > /etc/chrony.conf << EOF 
pool ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
logdir /var/log/chrony
EOF
systemctl restart chronyd

#使用客户端进行验证
chronyc sources -v

第七步:内核升级(可选)

当前版本centos7.9
uname -a

Linux node01.k8s.local 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

CentOS 7 上安装最新版本 kernel-ml 内核的过程:
不指定版本默认就是当前最新版本
关于内核种类:
kernel-ml——kernel-ml 中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本
kernel-lt——kernel-lt 中的lt是英文【 long term support 】的缩写,elrepo-kernel中罗列出来的长期支持版本。ML 与 LT 两种内核类型版本可以共存,但每种类型内核只能存在一个版本。

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#导入 elrepo 源的 GPG 公钥,用于验证软件包的签名。
yum install wget

#rhel7
wget http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
#rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

#rhel8
wget https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm

#rhel9
wget https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm

#安装 elrepo 源的 rpm 包,添加 elrepo 源。
rpm -Uvh elrepo-release-7.0-2.el7.elrepo.noarch.rpm

rpm -Uvh elrepo-release-8.el8.elrepo.noarch.rpm

rpm -Uvh elrepo-release-9.el9.elrepo.noarch.rpm

#查看现在elrepo里有什么版本的新内核可以用,运行
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

# 安装 最新版ML 版本
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
# 安装 最新版LT 版本
yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y

#如果要在本机做开发编译,还要安装内核header
yum --enablerepo=elrepo-kernel install kernel-ml-headers -y

#如果提示kernel-ml-headers与旧版本的kernel-header冲突,先把旧版本header删除
yum remove kernel-headers

卸载旧header如提示有依赖旧header的软件包,拷贝列表,先确认关联删除,在安装kernel-ml-headers后再重装这些包

#确认已安装内核版本
rpm -qa | grep kernel

设置开机从新内核启动

CentOS 6.x,比较简单:
修改grub配置文件/etc/grub.conf,改
default=1

default=0

sed -i s/saved/0/g /etc/default/grub

CentOS 7.x,复杂些:
先查看机器上安装的内核启动顺序
awk -F\’ ‘$1=="menuentry " {print i++ " : " $2}’ /etc/grub2.cfg
再把新内核的顺序号(一般是0号)设为默认启动
grub2-set-default 0

Rocky9
设置开机从新内核启动

grub2-editenv list
grub2-set-default 0
grub2-editenv list

最后使grub的新配置生效
cp /boot/grub2/grub.cfg /boot/grub2/grub.bak.cfg

grub2-mkconfig -o /boot/grub2/grub.cfg

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.5.6-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-6.5.6-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-342c8e733f0b488ca5712e22fa426d55
Found initrd image: /boot/initramfs-0-rescue-342c8e733f0b488ca5712e22fa426d55.img
done

更新 grub 配置。

reboot
重启系统,以使用新的内核启动。

总结:
该命令的作用是添加 elrepo 源、安装最新的 kernel-ml 内核包,并更新 grub 引导来使用该内核,从而升级系统的 Linux 内核。

uname -a

Linux master01.k8s.local 6.5.6-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Oct  6 16:06:35 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux

3.10版本内核 在打开net.ipv4.tcp_tw_recycle 参数时会偶有丢包,4.12 内核已经废弃此选项。

echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle

vim /etc/sysctl.conf

net.ipv4.tcp_tw_recycle = 0

https://blog.csdn.net/a8138/article/details/128939738

第八步:将桥接的 IPv4 流量传递到 iptables 的链(所有节点都设置);优化内核

优化参考:https://blog.csdn.net/ver_mouth__/article/details/126120802
https://help.aliyun.com/zh/ecs/support/common-kernel-network-parameters-of-ecs-linux-instances-and-faq
后继设置的需重启一下系统,否则已启动的进程还是老的参数

#设置

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=10
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0 
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
net.ipv4.ip_local_port_range= 32768 60999
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
net.ipv4.tcp_max_tw_buckets=6000
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_synack_retries=2
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.netfilter.nf_conntrack_max=2310720
#net.netfilter.nf_conntrack_tcp_timeout_established=300
#net.netfilter.nf_conntrack_buckets=655360
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh2=4096
net.ipv4.neigh.default.gc_thresh3=8192
net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=32768
net.ipv6.neigh.default.gc_thresh3=65536
net.core.netdev_max_backlog=16384

net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216
net.ipv4.tcp_max_syn_backlog = 8096 
net.core.somaxconn = 32768 
fs.inotify.max_user_instances=8192 
fs.inotify.max_user_watches=524288 
fs.file-max=52706963
fs.nr_open=52706963
kernel.pid_max = 4194303
net.bridge.bridge-nf-call-arptables=1
vm.swappiness=0 
vm.overcommit_memory=1 
vm.panic_on_oom=0 
vm.max_map_count = 262144
EOF

说明

net.ipv4.tcp_tw_recycle =0 #3.10版本内核 在打开net.ipv4.tcp_tw_recycle 参数时会偶有丢包,4.12 内核已经废弃此选项。
net.ipv4.tcp_tw_reuse =0 #导致Pod健康检查异常

net.ipv4.tcp_keepalive_time=600 #此参数表示TCP发送keepalive探测消息的间隔时间(秒)
net.ipv4.tcp_keepalive_intvl=30 #tcp检查间隔时间(keepalive探测包的发送间隔)
net.ipv4.tcp_keepalive_probes=10  #tcp检查次数(如果对方不予应答,探测包的发送次数)
net.ipv6.conf.all.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv6.conf.default.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv6.conf.lo.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv4.neigh.default.gc_stale_time=120 #ARP缓存条目超时
net.ipv4.conf.all.rp_filter=0  #默认为1,系统会严格校验数据包的反向路径,可能导致丢包
net.ipv4.conf.default.rp_filter=0 #不开启源地址校验
net.ipv4.conf.default.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.conf.lo.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.conf.all.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.ip_local_port_range= 45001 65000 # 定义网络连接可用作其源(本地)端口的最小和最大端口的限制,同时适用于TCP和UDP连接。阿里用 32768 60999
net.ipv4.ip_forward=1 # 其值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
net.ipv4.tcp_max_tw_buckets=6000 #配置服务器 TIME_WAIT 数量
net.ipv4.tcp_syncookies=1 #此参数应该设置为1,防止SYN Flood
net.ipv4.tcp_synack_retries=2 #表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包),进行重试的次数(默认为5)
net.bridge.bridge-nf-call-ip6tables=1 # 是否在ip6tables链中过滤IPv6包
net.bridge.bridge-nf-call-iptables=1 # 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样有时会出现L3层的iptables rules去过滤L2的帧的问题
net.netfilter.nf_conntrack_max=2310720 #连接跟踪表的大小,建议根据内存计算该值CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32),并满足nf_conntrack_max=4*nf_conntrack_buckets,默认262144
#net.netfilter.nf_conntrack_tcp_timeout_established=300
#net.netfilter.nf_conntrack_buckets=655360 # 哈希表大小(只读)(64位系统、8G内存默认 65536,16G翻倍,如此类推)

net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=32768
net.ipv6.neigh.default.gc_thresh3=65536

#gc_thresh3 是ARP回收表大小的绝对限制
#gc_thresh2 设置为等于系统的最大预期邻居条目数的值
#在这种情况下,gc_thresh3 应该设置为一个比 gc_thresh2 值高的值,例如,比 gc_thresh2 高 25%-50%,将其视为浪涌容量。
#gc_thresh1 提高到较大的值;此设置的作用是,如果表包含的条目少于 gc_thresh1,内核将永远不会删除(超时)过时的条目。

net.core.netdev_max_backlog=16384 # 每CPU网络设备积压队列长度
net.core.rmem_max = 16777216 # 所有协议类型读写的缓存区大小
net.core.wmem_max = 16777216 # 最大的TCP数据发送窗口大小
net.ipv4.tcp_max_syn_backlog = 8096 # 第一个积压队列长度
net.core.somaxconn = 32768 # 第二个积压队列长度
fs.inotify.max_user_instances=8192 # 表示每一个real user ID可创建的inotify instatnces的数量上限,默认128.
fs.inotify.max_user_watches=524288 # 同一用户同时可以添加的watch数目,默认8192。
fs.file-max=52706963 # 文件描述符的最大值
fs.nr_open=52706963 #设置最大微博号打开数
kernel.pid_max = 4194303 #最大进程数
net.bridge.bridge-nf-call-arptables=1 #是否在arptables的FORWARD中过滤网桥的ARP包
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
vm.max_map_count = 262144
#使其生效
sysctl -p
sysctl --system
sysctl -a|grep vm.max_map_count

#确保每台机器的uuid不一致,如果是克隆机器,修改网卡配置文件删除uuid那一行
cat /sys/class/dmi/id/product_uuid

#加载网桥过滤模块,没有会影响node中pod和pod通信
modprobe br_netfilter

#centos6下报错
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
modprobe bridge

# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter

#启动加载
cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
#centos6 modprobe bridge
modprobe bridge
modprobe br_netfilter
EOF
chmod 755 /etc/sysconfig/modules/br_netfilter.modules

rocky9

echo 'br_netfilter' >> /etc/modules-load.d/br_netfilter.conf
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

参考
https://imroc.cc/kubernetes/trick/deploy/set-sysctl/
https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/

# 宿主ulimit
cat /etc/security/limits.conf

cat > /etc/security/limits.d/20-nofile.conf <<EOF
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
EOF

cat > /etc/security/limits.d/20-nproc.conf <<EOF
*    -     nproc   65535
root soft  nproc  unlimited
root hard  nproc  unlimited
EOF

echo "ulimit -HSn 65535" >> /etc/rc.local

ulimit -a 
sysctl -p

systemctl show sshd

# containerd.service
安装containerd后替换
sed -i 's/LimitNOFILE=infinity/LimitNOFILE=65535/' /usr/lib/systemd/system/containerd.service
systemctl daemon-reload
systemctl restart containerd

# centos7 system.conf
## 替换
#sed -n 's/#DefaultLimitNOFILE=/DefaultLimitNOFILE=65335/p' /etc/systemd/system.conf
#sed -i 's/^#DefaultLimitNOFILE=/DefaultLimitNOFILE=65335/' /etc/systemd/system.conf
#rocky9
sed -n 's/#DefaultLimitNOFILE=1024/DefaultLimitNOFILE=65335/p' /etc/systemd/system.conf
sed -i 's/^#DefaultLimitNOFILE=1024/DefaultLimitNOFILE=65335/' /etc/systemd/system.conf

##手动编辑
vi /etc/systemd/system.conf
DefaultLimitNOFILE=65335

cat /etc/systemd/system.conf|grep DefaultLimitNOFILE

systemctl daemon-reexec

openssl升级

建议openssl升级到1.1.1或更高版本
centos6.10
openssl version

OpenSSL 1.0.1e-fips 11 Feb 2013

centos7
openssl version

OpenSSL 1.0.2k-fips  26 Jan 2017
2023-Sep-11 14:46:17    openssl-1.1.1w.tar.gz 
wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl --shared
make -j 8 && make install

echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v
ldd /usr/local/openssl/bin/openssl 

mv /usr/bin/openssl /usr/bin/openssl.old
ln -sv /usr/local/openssl/bin/openssl /usr/bin/openssl
openssl version
OpenSSL 1.1.1w  11 Sep 2023

第八步:配置ipvs功能(可选)

在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。
所有节点配置ipvs模块,在内核4.19+版本nf_conntrack_ipv4已经改为nf_conntrack, 4.18以下使用nf_conntrack_ipv4即可
在 3.10 内核版本中从iptables 改用ipvs,kube-proxy 会报如下错误

E0415 09:46:55.397466       1 proxier.go:1192] Failed to sync endpoint for service: 172.16.0.82:30080/TCP, err: parseIP Error ip=[172 16 100 7 0 0 0 0 0 0 0 0 0 0 0 0]
E0415 09:46:55.398639       1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[172 16 100 7 0 0 0 0 0 0 0 0 0 0 0 0]

可能会出现以下问题:
ipvs 指向的后端节点不对,如果重新 svc 删除重建又是对的
当副本数量变动时,ipvs 不能立马感知到
如果直接用域名访问 svc 时,会出现解析不了的情况

如使用ipvs建议先升级系统内核

Calico 在做网络策略限制的时候要求 kubec-proxy 组件不能采用 –masquerade-all 启动

所有工作节点上均执行

# 安装ipset和ipvsadm
yum install ipset ipvsadmin ipvsadm sysstat conntrack libseccomp -y
#  添加需要加载的模块写入脚本文件 
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
#modprobe -- nf_conntrack_ipv4
EOF
# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
sh /etc/sysconfig/modules/ipvs.modules

# rocky9 安装ipset和ipvsadm
dnf install ipset ipvsadm

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

cat >> /etc/modules-load.d/ipvs.conf <<EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

systemctl restart systemd-modules-load.service

# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack
lsmod | grep -e bridge

第九步: 添加指定id的用户和用户组

cat /etc/passwd
cat /etc/group

/usr/sbin/groupadd k8s -g 1000
/usr/sbin/useradd -g k8s k8s -s /sbin/nologin -u 1000
id k8s

/usr/sbin/groupadd website -g 500

/usr/sbin/useradd -g website www -s /sbin/nologin -u 500
#/usr/sbin/useradd -g website www -d /dev/null -s /sbin/nologin -u 500

mkdir /home/www
chown www:website -R /home/www
chmod 700 /home/www
usermod -d /home/www www

第十步:工具安装

修改各节点默认挂载为Soft方式,防止nfs异常后卡死
手动编辑
vi /etc/nfsmount.conf

Soft=True

替换

echo 'Soft=True' >> /etc/nfsmount.conf

yum install sysstat -y

安装常用工具

yum -y install wget vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 tar curl lrzsz rsync psmisc sysstat lsof

创建宿主共享目录,filebeat,ingress,nginx,php

mkdir -p /localdata/{es,filebeat,log}
mkdir -p /localdata/es/data
mkdir -p /localdata/filebeat/{data,socket}
mkdir -p /localdata/log/{ext-ingress,int-ingress,nginx,php}
chmod -R 777 /localdata/

第十一步:重启服务器

查看以上所有配置是否生效
三台主机上均执行

systemctl status firewalld # 查看防火墙
getenforce   # 查看selinux
lsmod | grep br_netfilter    # 查看网桥过滤模块
lsmod | grep -e ip_vs -e nf_conntrack  # 查看 ipvs 模块
sysctl net.bridge.bridge-nf-call-iptables

如果都正确,表示三台主机环境初始化均成功

最后重启一下
reboot

Posted in 安装k8s/kubernetes.

Tagged with , .


No Responses (yet)

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.



Some HTML is OK

or, reply to this post via trackback.