K8S部署详情
kubernetes 容器平台落地
准备(所有节点)
替换阿里yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
设置主机名及关闭selinux,swap分区,时钟同步,关闭firewall。
内网IP
cat <<EOF >>/etc/hosts
10.0.8.15 l-gz-local-master-001
10.0.8.5 l-gz-local-node-001
EOF
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
swapoff -a
sed -i 's/\/dev\/mapper\/centos-swap/\#\/dev\/mapper\/centos-swap/g' /etc/fstab
yum install ntp -y
systemctl enable ntpd
systemctl start ntpd
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hostnamectl set-hostname l-gz-local-master-001
systemctl stop firewalld
systemctl disable firewalld
内核参数优化
操作系统层
cat <<EOF>/etc/sysctl.conf
#表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_syncookies=1
#一个布尔类型的标志,控制着当有很多的连接请求时内核的行为。启用的话,如果服务超载,内核将主动地发送RST包。
net.ipv4.tcp_abort_on_overflow=1
#默认为180000,改为6000。对于Apache、Nginx等服务器,此项参数可以控制TIME_WAIT的最大数量,服务器被大量的TIME_WAIT拖死
net.ipv4.tcp_max_tw_buckets=18000
#有选择的应答
net.ipv4.tcp_sack=1
#该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。
net.ipv4.tcp_window_scaling=1
#TCP接收缓冲区
net.ipv4.tcp_rmem=32768 699040 50331648
#TCP发送缓冲区
net.ipv4.tcp_wmem=32768 131072 33554432
#此参数设置为1,将大幅削减空闲连接时的CWnd,对长连接如SSL产生负面影响
net.ipv4.tcp_slow_start_after_idle=0
#syn-ack握手状态重试次数,默认5,遭受syn-flood攻击时改为1或2
net.ipv4.tcp_synack_retries=2
##Outofsocketmemory
net.ipv4.tcp_mem=94500000 915000000 927000000
#该文件表示每个套接字所允许的最大缓冲区的大小。
net.core.optmem_max=81920
#指定了接收套接字缓冲区大小的缺省值(以字节为单位)。
net.core.rmem_default=8388608
#指定了写入套接字缓冲区大小的缺省值(以字节为单位)。
net.core.wmem_default=8388608
#指定了接受套接字缓冲区大小的最大值(以字节为单位)。
net.core.rmem_max=50331648
#指定了写入套接字缓冲区大小的最大值(以字节为单位)。
net.core.wmem_max=50331648
#表示SYN队列的长度,默认为1024,加大队列长度为10200000,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog=10240000
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog=862144
#web应用中listen函数的backlog会限制到128,而nginx默认为511,所以有必要调整这个值。
net.ipv4.tcp_max_orphans=327680
#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_timestamps=0
#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
#在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_syn_retries=1
#修改系統默认的TIMEOUT时间。
net.ipv4.tcp_fin_timeout=10
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,建议改为20分钟。
net.ipv4.tcp_keepalive_time=300
#keepalive探测包的发送次数
net.ipv4.tcp_keepalive_probes=3
#keepalive探测包的发送间隔
net.ipv4.tcp_keepalive_intvl=15
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.ip_local_port_range=1024 65000
net.ipv4.ip_nonlocal_bind=1
#縮短established的超時時間
net.ipv4.neigh.default.gc_thresh1=2048
# 保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒。缺省值是 512
net.ipv4.neigh.default.gc_thresh2=4096
# 保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是 1024
net.ipv4.neigh.default.gc_thresh3=8192
# 表示同一用户同时最大可以创建的 inotify 实例 (每个实例可以有很多 watch)
fs.inotify.max_user_instances=8192
# max-file 表示系统级别的能够打开的文件句柄的数量, 一般如果遇到文件句柄达到上限时,会碰到
# Too many open files 或者 Socket/File: Can’t open so many files 等错误
fs.file-max=2097152
# 表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量) 默认值 8192 在容器场景下偏小,在某些情况下可能会导致 inotify watch 数量耗尽,使得创建 Pod 不成功或者 kubelet 无法启动成功,将其优化到 524288
fs.inotify.max_user_watches=524288
vm.max_map_count=262144
kernel.threads-max=300580
EOF
k8s层
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
ness=0
EOF
sysctl --system
modprobe br_netfilter
sysctl -p
加载IPVS模块
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
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
安装ipvs相关管理软件
yum install ipset ipvsadm -y
reboot
安装containerd
相关包
[root@localhost ~]#yum install yum-utils -y
[root@localhost ~]#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
指定版本安装
[root@localhost ~]# yum install containerd -y
[root@localhost ~]# systemctl enable containerd
[root@localhost ~]# systemctl start containerd
设置存储路径
[root@localhost ~]# containerd config default > /etc/containerd/config.toml
root = "/data/containerd"
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart containerd
配置可用的 Kubernetes 国内 yum 源
cat <
使用 yum 命令安装 kubeadm 的 1.27.3 版本
yum install -y kubeadm-1.27.3 kubelet-1.27.3 kubectl-1.27.3
systemctl enable kubelet && systemctl start kubelet
替换修改了证书时间的kubeadm
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
mv /usr/bin/kubeadm /usr/bin/kubeadm.old
mv kubeadm-new /usr/bin/kubeadm
chmod +x /usr/bin/kubeadm
集群初始化
创建初始化配置文件 可以使用如下命令生成初始化配置文件
kubeadm config print init-defaults > kubeadm-config.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.10.128
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: l-gz-local-master-001
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
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.27.3
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
配置说明:
- imageRepository:由于国内无法访问google镜像仓库k8s.gcr.io,这里指定为阿里云镜像仓库registry.aliyuncs.com/google_containers
- podSubnet:指定的IP地址段与后续部署的网络插件相匹配,这里需要部署flannel插件,所以配置为10.244.0.0/16
- mode: ipvs:最后追加的配置为开启ipvs模式。
在集群搭建完成后可以使用如下命令查看生效的配置文件:
kubeadm config images pull --config kubeadm-config.yaml # 通过阿里源预先拉镜像
初始化Master01节点
这里追加tee命令将初始化日志输出到kubeadm-init.log中以备用(可选)。
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
该命令指定了初始化时需要使用的配置文件,其中添加–experimental-upload-certs参数可以在后续执行加入节点时自动分发证书文件。
初始化证书
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u)😒(id -g) $HOME/.kube/config
资源预留
修改/var/lib/kubelet/kubeadm-flags.env文件后重启kubelet生效
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.4.1 --max-pods=130 \
--system-reserved=cpu=20m,memory=100Mi \
--eviction-hard=memory.available<1Mi,nodefs.available<1Mi,imagefs.available<1Mi \
--eviction-minimum-reclaim=memory.available=1Gi,nodefs.available=500Mi,imagefs.available=1Gi \
--node-status-update-frequency=10s --eviction-pressure-transition-period=30s"
calico
wget https://github.com/projectcalico/calico/releases/download/v3.26.1/tigera-operator-v3.26.1.tgz
wget https://get.helm.sh/helm-v3.12.1-linux-amd64.tar.gz
tar -zxvf helm-v3.12.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm install calico ./tigera-operator-v3.26.1.tgz -n kube-system
遇到坑ipvs配置更改
:https://www.cnblogs.com/zhangsi-lzq/p/14279997.html
https://kubernetes.io/zh/docs/home/)
flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
设置crictl默认containerd
root@k8s-master-62:~# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
root@k8s-master-62:~# crictl config image-endpoint unix:///run/containerd/containerd.sock
kubeadm重置
kubeadm reset
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/*
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/*
rm -rf $HOME/.kube/config
systemctl start docker
查看集群加入命令
kubeadm token create --print-join-command