kubuadm 方式部署 k8s 集群

  • 准备三台机器

|--------|----------------|--------|--------|---------|----------|
| 主机名 | IP地址 | CPU/内存 | 角色 | K8S版本 | Docker版本 |
| k8s231 | 192.168.99.231 | 2C4G | master | 1.23.17 | 20.10.24 |
| k8s232 | 192.168.99.232 | 2C4G | woker | 1.23.17 | 20.10.24 |
| k8s233 | 192.168.99.233 | 2C4G | woker | 1.23.17 | 20.10.24 |

yum 方式部署 docker_配置docker的yum源-CSDN博客

  • Harbor仓库如果不需要可以不装,如果需要则参考**(可选安装)**

基于 HTTP 协议部署 harbor 仓库-CSDN博客

基于 HTTPS 方式部署 harbor 仓库-CSDN博客

  • 由于K8S与docker的爱恨情仇,1.23版本与1.24版本之后发生了巨大变化,就是1.24版本之后就不需要单独安装docker,而是需要安装containerd,但我又习惯使用docker,这次我就部署 1.23.17 版本

1. 各节点环境准备

1. 1 关闭 swap 分区

bash 复制代码
#临时关闭
swapoff -a && sysctl -w vm.swappiness=0
#基于配置文件永久关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

1.2 确保各个节点MAC地址或Product_uuid唯一

bash 复制代码
ifconfig  eth0  | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid 

温馨提示:

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。

Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。

1.3 检查网络节点是否互通

检查K8S集群各个节点是否互通,可以使用 ping 命令来测试

1.4 所有节点修改Linux内核参数调优

bash 复制代码
cat > /etc/sysctl.d/k8s.conf <<'EOF'
#允许 Linux 系统作为路由器转发 IPv4 数据包。当设置为 1 时,表示启用 IP 数据包转发功能。
net.ipv4.ip_forward = 1

#启用桥接设备在通过 iptables 进行网络过滤时的调用。
net.bridge.bridge-nf-call-iptables = 1

#启用桥接设备在通过 ip6tables 进行 IPv6 网络过滤时的调用。
net.bridge.bridge-nf-call-ip6tables = 1

#允许 Linux 在不重新引起操作的情况下卸载正在使用的挂载点。
fs.may_detach_mounts = 1

#设置内存过量分配策略。当设置为 1 时,Linux 将允许分配超过物理内存总量的虚拟内存。
vm.overcommit_memory=1

#当内存耗尽(OOM,Out-Of-Memory)时,是否触发内核崩溃。设置为 0 表示禁用这个行为。
vm.panic_on_oom=0

#设置用户可以监视的文件数量的最大值,对于文件系统监视服务很重要,比如 inotify。
fs.inotify.max_user_watches=89100

#设置系统中打开的文件描述符的最大数量。
fs.file-max=52706963

#设置系统中打开文件描述符的最大数量,和 fs.file-max 有类似的作用。
fs.nr_open=52706963

#设置连接跟踪表的最大条目数量,用于管理网络连接状态。
net.netfilter.nf_conntrack_max=2310720

#设置 TCP keepalive 超时时间(单位:秒),用于检测空闲连接是否仍然可用。
net.ipv4.tcp_keepalive_time = 600

#在认定连接失效之前,发送多少个 TCP keepalive 探测包。
net.ipv4.tcp_keepalive_probes = 3

#两次 TCP keepalive 探测之间的时间间隔(单位:秒)。
net.ipv4.tcp_keepalive_intvl =15

#设置 TIME-WAIT 状态的最大连接数。
net.ipv4.tcp_max_tw_buckets = 36000

#允许重新使用 TIME-WAIT 状态的 TCP 连接。
net.ipv4.tcp_tw_reuse = 1

#允许系统保持的最大无主 TCP 连接数。
net.ipv4.tcp_max_orphans = 327680

#设置在关闭套接字时内核应该进行多少次重试。
net.ipv4.tcp_orphan_retries = 3

#启用 TCP SYN cookies,用于防范 SYN 攻击。
net.ipv4.tcp_syncookies = 1

#设置 TCP SYN 队列的最大长度。
net.ipv4.tcp_max_syn_backlog = 16384

#设置 IPv4 连接跟踪表的最大条目数量。
net.ipv4.ip_conntrack_max = 65536

#控制着系统允许的未完成的 TCP 握手队列的最大长度
net.ipv4.tcp_max_syn_backlog = 16384

#禁用 TCP 时间戳,可能用于防范某些攻击。
net.ipv4.tcp_timestamps = 0

#设置系统级别的最大并发连接数,影响 TCP 和 UDP 套接字的 listen 函数的 backlog 参数的默认值。
net.core.somaxconn = 16384
EOF

1.5 加载文件

bash 复制代码
sysctl --system

1.6 配置主机解析

bash 复制代码
cat >> /etc/hosts <<EOF
192.168.99.250 linux250
192.168.99.251 linux251
192.168.99.252 linux252
EOF

1.7 禁用防火墙,网络管理,邮箱

bash 复制代码
systemctl disable  --now firewalld NetworkManager postfix

1.8 禁用SELinux

bash 复制代码
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config 
grep ^SELINUX= /etc/selinux/config

1.9 修改cgroup的管理进程systemd

阿里云镜像加速

harbor私有仓库解析

修改cgroup的管理进程systemd

bash 复制代码
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://0pcinxc2.mirror.aliyuncs.com"],
"insecure-registries": ["harbor253.bihuang.com","192.168.99.253"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

#重启docker
systemctl restart docker

#查看是否修改
[root@linux250 ~]# docker info | grep "Cgroup"
 Cgroup Driver: systemd
 Cgroup Version: 1

温馨提示:

如果不修改cgroup的管理驱动为systemd,则默认值为cgroupfs,在初始化 master 节点时会失败

2. 所有节点安装 kubeadm,kubelet,kubectl

2.1 安装包概述

你需要在每台机器上安装以下的软件包:

kubeadm:

用来初始化集群的指令。

kubelet:

在集群中的每个节点上用来启动Pod和容器等。

kubectl:

用来与集群通信的命令行工具。

kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要确保它们与通过kubeadm安装的控制平面(master)的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。

然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但kubelet的版本不可以超过"API SERVER"的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的"API SERVER",反之则不可以。

2.2 配置软件源

bash 复制代码
cat  > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

2.3 查看 kubeadm 的版本

bash 复制代码
yum -y list kubeadm --showduplicates | sort -r

2.4 安装 kubeadm,kubelet,kubectl软件包(可联网直接安装)

bash 复制代码
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

如果没有办法联网的话,可以找一台能联网的机器,将 yum 安装保存rpm包功能打开,然后安装好之后,将rpm打包,再发送到各个节点,如下:

2.4.1 打开 yum 保存 rpm 包

bash 复制代码
[root@k8s233 ~]# cat /etc/yum.conf 
[main]
#rpm包存储目录
cachedir=/var/cache/yum/$basearch/$releasever
#值为1为开启rpm包保存,为0则关闭
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release

2.4.2 安装 kubeadm,kubelet,kubectl

bash 复制代码
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

2.4.3 打包保存的rpm包

bash 复制代码
mkdir kubeadm--kubelet-kubectl/
find /var/cache/yum -name "*.rpm" | xargs mv -t kubeadm--kubelet-kubectl/
tar zcf bihuang-kubeadm--kubelet-kubectl.tar.gz

2.4.4 发送到其他节点

bash 复制代码
scp bihuang-kubeadm--kubelet-kubectl.tar.gz root@linux251:~
scp bihuang-kubeadm--kubelet-kubectl.tar.gz root@linux252:~

2.4.5 各个节点解压并安装

bash 复制代码
tar xf bihuang-kubeadm--kubelet-kubectl.tar.gz
yum -y localinstall kubeadm--kubelet-kubectl/*.rpm

2.5 启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!)

bash 复制代码
systemctl enable --now kubelet
systemctl status kubelet

3. 初始化 Master 节点

3.1 使用kubeadm 初始化 master

bash 复制代码
kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=172.100.0.0/16 --service-cidr=172.200.0.0/16 --service-dns-domain=bihuang.com

#相关参数说明
​    --kubernetes-version:

​       指定K8S master组件的版本号。

​       

​    --image-repository:

​       指定下载k8s master组件的镜像仓库地址。

​       

​    --pod-network-cidr:

​       指定Pod的网段地址。

​       

​    --service-cidr:

​       指定SVC的网段

 

​    --service-dns-domain:

​       指定service的域名。若不指定,默认为"cluster.local"。

3.2 如果集群初始化失败可以重置

bash 复制代码
kubeadm reset --f

3.3 拷贝授权文件用于管理 K8S 集群

这个命令看你初始化完成之后反馈的内容如图,不要复制我的

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

3.4 查看集群节点

bash 复制代码
kubectl get cs


#scheduler 状态OK
#controller-manager 状态 OK
#etcd-0 状态OK

#APIserver 状态OK
		因为kubectl get cs 命令是发送给 API server 的能够查询出来说明API server 正常

4. 添加worker nodes 节点到集群

master 初始化完成之后会有返回信息,如图:

将这个命令在其他 worker node 节点上执行一下即可

注意:每次部署的时候这个命令都不一样

4.1 查看添加前集群 nodes 节点

bash 复制代码
kubectl get nodes

4.2 查看添加后当前集群 nodes 节点

bash 复制代码
kubectl get nodes

5. 部署 Flannel 组件

5.1 查看现有的网络插件

一般常用的两种网络插件:

Calico:可实现网络策略,适用于需要网络策略的特殊场景

Flannel:支持更多的网络协议

需要哪个组件直接点击哪个组件即可,这里下载的是 Flannel

安装扩展(Addon) | Kubernetes

5.2 下载 Flannel 资源清单文件

如图:

使用master 节点在初始化的时候,使用的是默认的网段(10.244.0.0/16)则直接执行图中的命令即可。

如果没有使用默认的,而是单独指定了网段则需要将 kube-flannel.yml 下载下来稍作修改。也就是 --pod-network-cidr=172.100.0.0/16 这个参数

5.3 下载 kube-flannel.yaml 文件

bash 复制代码
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

5.4 修改 kube-flannel.yaml 文件

bash 复制代码
1.#查看 当前使用的网段
grep "\"Network\"" kube-flannel.yml

2.#将默认网段修改为 master 初始化指定的网段 172.100
[root@k8s231 ~]# sed -ri '/\"Network\"/s#10.244#172.100#' kube-flannel.yml

3.#查看是否修改成功
[root@k8s231 ~]# grep "\"Network\"" kube-flannel.yml 
      "Network": "172.100.0.0/16",

5.5 部署 flannel 组件

bash 复制代码
#在配置文件目录运行
kubectl apply -f kube-flannel.yml

5.6 查看 flannel 组件是否正常运行

bash 复制代码
kubectl get pods -A -o wide | grep flannel

5.7 查看各节点是否正常

bash 复制代码
[root@k8s231 ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE    VERSION
k8s231   Ready    control-plane,master   106m   v1.23.17
k8s232   Ready    <none>                 98m    v1.23.17
k8s233   Ready    <none>                 98m    v1.23.17

都为 Ready 状态则为正常

部署 flannel 之前的状态,都为 NotReady

相关推荐
亲爱的非洲野猪25 分钟前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm27 分钟前
spring事件使用
java·后端·spring
微风粼粼1 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄1 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel1 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温2 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven
张人玉3 小时前
C# 常量与变量
java·算法·c#
Java技术小馆3 小时前
GitDiagram如何让你的GitHub项目可视化
java·后端·面试