- 准备三台机器
主机名 | 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 |
- 需要在K8S集群各节点上面安装docker,如未安装则参考 二进制部署 docker_docker 二进制包-CSDN博客
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 分区
#临时关闭
swapoff -a && sysctl -w vm.swappiness=0
#基于配置文件永久关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
1.2 确保各个节点MAC地址或Product_uuid唯一
ifconfig eth0 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
温馨提示:
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。
Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
1.3 检查网络节点是否互通
检查K8S集群各个节点是否互通,可以使用 ping 命令来测试
1.4 所有节点修改Linux内核参数调优
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 加载文件
sysctl --system
1.6 配置主机解析
cat >> /etc/hosts <<EOF
192.168.99.250 linux250
192.168.99.251 linux251
192.168.99.252 linux252
EOF
1.7 禁用防火墙,网络管理,邮箱
systemctl disable --now firewalld NetworkManager postfix
1.8 禁用SELinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
1.9 修改cgroup的管理进程systemd
阿里云镜像加速
harbor私有仓库解析
修改cgroup的管理进程systemd
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: systemdCgroup 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 配置软件源
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 的版本
yum -y list kubeadm --showduplicates | sort -r
2.4 安装 kubeadm,kubelet,kubectl软件包(可联网直接安装)
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 包
[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
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0
2.4.3 打包保存的rpm包
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 发送到其他节点
scp bihuang-kubeadm--kubelet-kubectl.tar.gz root@linux251:~
scp bihuang-kubeadm--kubelet-kubectl.tar.gz root@linux252:~
2.4.5 各个节点解压并安装
tar xf bihuang-kubeadm--kubelet-kubectl.tar.gz
yum -y localinstall kubeadm--kubelet-kubectl/*.rpm
2.5 启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!)
systemctl enable --now kubelet
systemctl status kubelet
3. 初始化 Master 节点
3.1 使用kubeadm 初始化 master
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 如果集群初始化失败可以重置
kubeadm reset –f
3.3 拷贝授权文件用于管理 K8S 集群
这个命令看你初始化完成之后反馈的内容如图,不要复制我的
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
3.4 查看集群节点
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 节点
kubectl get nodes
4.2 查看添加后当前集群 nodes 节点
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 文件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
5.4 修改 kube-flannel.yaml 文件
1.#查看 当前使用的网段
grep "\"Network\"" kube-flannel.yml2.#将默认网段修改为 master 初始化指定的网段 172.100
[root@k8s231 ~]# sed -ri '/\"Network\"/s#10.244#172.100#' kube-flannel.yml3.#查看是否修改成功
[root@k8s231 ~]# grep "\"Network\"" kube-flannel.yml "Network": "172.100.0.0/16",
5.5 部署 flannel 组件
#在配置文件目录运行
kubectl apply -f kube-flannel.yml
5.6 查看 flannel 组件是否正常运行
kubectl get pods -A -o wide | grep flannel
5.7 查看各节点是否正常
[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