一、架构图
如下图所示:
二、环境信息
- 1、部署规划
主机名 | K8S版本 | 系统版本 | 内核版本 | IP地址 | 备注 |
---|---|---|---|---|---|
k8s-master-63 | 1.24.17 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.63 | master节点 + etcd节点 |
k8s-master-64 | 1.24.17 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.64 | master节点 + etcd节点 |
k8s-master-65 | 1.24.17 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.65 | master节点 + etcd节点 |
k8s-worker-66 | 1.24.17 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.66 | worker节点 |
- | - | - | - | 192.168.1.146 | vip |
k8s-lb-01 | - | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.185 | Nginx + keepalived |
k8s-lb-02 | - | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.205 | Nginx + keepalived |
- 2、集群网段
宿主机 | 集群Pod网段 | 集群Service网段 |
---|---|---|
192.168.1.0/24 | 10.48.0.0/16 | 10.96.0.0/16 |
说明:Kubernetes高可用集群基于kubeadm工具部署,其中etcd集群采用二进制方式部署。由于测试机器数量有限,etcd服务部署在master节点上,你可以根据自己需要,使用单独的主机部署etcd集群服务。
- 3、基础软件版本
软件 | 版本 |
---|---|
containerd | 1.7.2 |
runc | 1.1.7 |
cni | 1.2.0 |
kube-lb(nginx) | 1.22.1 |
keepalived | v2.2.7 |
三、安装和配置先决条件
3.1、主机名设置
说明:分别在对应的节点IP上设置主机名。
hostnamectl set-hostname k8s-master-63 && bash
hostnamectl set-hostname k8s-master-64 && bash
hostnamectl set-hostname k8s-master-65 && bash
hostnamectl set-hostname k8s-worker-66 && bash
hostnamectl set-hostname k8s-lb-01 && bash
hostnamectl set-hostname k8s-lb-02 && bash
3.2、配置主机hosts
说明:以下操作无论是master节点和worker节点均需要执行。
cat >> /etc/hosts <<EOF
192.168.1.63 k8s-master-63
192.168.1.64 k8s-master-64
192.168.1.65 k8s-master-65
192.168.1.66 k8s-worker-66
EOF
3.3、关闭防火墙
说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。
ufw disable && systemctl stop ufw && systemctl disable ufw
3.4、关闭swap分区
说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。
swapoff -a
sed -i '/swap/ s/^/#/' /etc/fstab
3.5、时间时区同步
说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。
1、设置时区为Asia/Shanghai,如果已经是则请忽略
root@k8s-master-65:~# timedatectl
Local time: 五 2023-03-31 14:11:36 CST
Universal time: 五 2023-03-31 06:11:36 UTC
RTC time: 五 2023-03-31 06:11:36
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
3.6、修改内核参数
说明:以下操作无论是master节点、worker节点均需要执行。
说明:有一些ipv4的流量不能走iptables链,因为linux内核是一个过滤器,所有流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:
- 1、加载br_netfilter和overlay模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
- 2、设置所需的sysctl参数
cat <<EOF | 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 --system
3.7、启用IPVS模式
说明:以下操作无论是master节点、worker节点节点均需要执行。
# kube-proxy开启ipvs的前提需要加载以下的内核模块
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
注意:如果出现modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory /lib/modules/5.15.0-69-generic错误,这是因为使用了高内核,当前内核版本为5.15.0-69-generic,在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。
- 1、安装ipvs
apt -y install ipvsadm ipset sysstat conntrack
- 2、加载内核模块脚本
cat > /etc/profile.d/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
- 3、赋予权限
chmod 755 /etc/profile.d/ipvs.modules
- 4、执行加载模块脚本
bash /etc/profile.d/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 5、设置开机自动加载模块
cat <<EOF | tee /etc/modules-load.d/nf_conntrack_ipv4.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
四、安装etcd集群
4.1、生成etcd集群相关证书
说明:手动创建证书比较麻烦,这里采用了etcd证书一键生成工具来创建etcd相关证书,可以在任意一节点主机上生成etcd集群相关证书。
操作步骤如下图所示:
1、有一些ipv4的流量不能走iptables链,因为linux内核是一个过滤器,所有流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:
2、其中ca-key.pem、ca.pem、apiserver-etcd-client.pem、apiserver-etcd-client-key.pem文件是kube-apiserver连接etcd所需证书。这4个证书文件必须要上传到 所有master节点上,需提前手动创建好证书存放目录。其中ca-key.pem、ca.pem建议目录为/etc/kubernetes/pki/etcd,apiserver-etcd-client.pem、apiserver-etcd-client-key.pem建议目录为 /etc/kubernetes/pki
3、其中ca-key.pem、ca.pem、healthcheck-client-key.pem、healthcheck-client.pem、peer-key.pem、peer.pem、server-key.pem、server.pem是etcd集群所需要证书。这8个证书文件必须要上传到 所有etcd节点上。这8个证书文件建议目录为/etc/kubernetes/pki/etcd。
4、如果某一个节点如k8s-master-63节点,它即为master节点,也是etcd节点,则证书文件列表如下所示:
5、这里就默认在k8s-master-63(即192.168.1.63)节点上生成相关证书,并将证书分别复制到etcd各个节点相应目录及master节点相关目录下,其中证书目录需提前创建好,当前K8S集群环境apiserver节点和etcd节点为同一主机,所以拷贝完之后证书文件列表如上图所示,这里就以k8s-master-63(即192.168.1.63)节点展示,其它节点也跟这个一样。
证书文件 | 秘钥文件 | 建议路径 | 节点 | 说明 |
---|---|---|---|---|
ca.pem | ca-key.pem | /etc/kubernetes/pki/etcd | etcd所在节点 | etcd集群ca根证书 |
peer.pem | peer-key.pem | /etc/kubernetes/pki/etcd | etcd所在节点 | etcd集群peer证书 |
server.pem | server-key.pem | /etc/kubernetes/pki/etcd | etcd所在节点 | etcd集群server证书 |
healthcheck-client.pem | healthcheck-client-key.pem | /etc/kubernetes/pki/etcd | etcd所在节点 | etcd集群client证书 |
apiserver-etcd-client.pem | apiserver-etcd-client-key.pem | /etc/kubernetes/pki | apiserver所在节点 | apiserver连接etcd客户端证书 |
4.2、二进制安装etcd集群
4.2.1、下载软件包
说明:以下操作须在etcd所有节点操作。
wget https://github.com/etcd-io/etcd/releases/download/v3.5.6/etcd-v3.5.6-linux-amd64.tar.gz
tar axf etcd-v3.5.6-linux-amd64.tar.gz
mv etcd-v3.5.6-linux-amd64/etcd* /usr/bin
4.2.2、创建Service文件
说明:以下操作只需在etcd01节点操作。
1、etcd01节点etcd.service文件如下所示: |
root@k8s-master-63:~# vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd
ExecStart=/usr/bin/etcd \
--name=etcd01 \
--cert-file=/etc/kubernetes/pki/etcd/server.pem \
--key-file=/etc/kubernetes/pki/etcd/server-key.pem \
--peer-cert-file=/etc/kubernetes/pki/etcd/peer.pem \
--peer-key-file=/etc/kubernetes/pki/etcd/peer-key.pem \
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.pem \
--peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.pem \
--initial-advertise-peer-urls