《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》

一、架构图

如下图所示:

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》_第1张图片


二、环境信息

1、部署规划

主机名 K8S版本 系统版本 内核版本 IP地址 备注
k8s-master-63 1.24.16 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.63 master节点 + etcd节点
k8s-master-64 1.24.16 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.64 master节点 + etcd节点
k8s-master-65 1.24.16 Ubuntu 20.04.5 LTS 5.15.0-69-generic 192.168.1.65 master节点 + etcd节点
k8s-worker-66 1.24.16 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.1、主机名设置

说明:分别在对应的节点IP上设置主机名。

root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-master-63
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-master-64
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-master-65
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-worker-66
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-lb-01
root@lolaage-virtual-machine:~#  hostnamectl set-hostname k8s-lb-02

3.2、配置主机hosts

说明:以下操作无论是master节点和worker节点均需要执行。

root@lolaage-virtual-machine:~# vim /etc/hosts
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

3.3、关闭防火墙

说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。

root@lolaage-virtual-machine:~# ufw disable && systemctl stop ufw && systemctl disable ufw

3.4、关闭swap分区

说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。

root@lolaage-virtual-machine:~# swapoff -a
root@lolaage-virtual-machine:~# 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  

2、使用chrony同步时间

root@k8s-master-63:~# apt install chrony -y
root@k8s-master-63:~# vim /etc/chrony/chrony.conf
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
#pool ntp.ubuntu.com        iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2

root@k8s-master-63:~# systemctl enable chronyd.service
root@k8s-master-63:~# systemctl restart chronyd.service
root@k8s-master-63:~# systemctl status chronyd.service

阿里云NTP服务器地址列表,状态检测如下所示:
在这里插入图片描述

chrony客户端上的一些常用命令:

# 1、查看可用的时间同步源
chronyc sources -v
# 2、查看时间同步源的状态
chronyc sourcestats -v
# 3、对客户端系统时间进行强制同步
chronyc -a makestep

3.6、修改内核参数

说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。

说明:有一些ipv4的流量不能走iptables链,因为linux内核是一个过滤器,所有流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:

# 1、加载br_netfilter和overlay模块
root@k8s-master-63:~# cat <
overlay
br_netfilter
EOF
root@k8s-master-63:~# modprobe overlay
root@k8s-master-63:~# modprobe br_netfilter
# 2、设置所需的sysctl参数,参数在重新启动后保持不变
root@k8s-master-63:~# cat <
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
# 3、应用sysctl参数而不重新启动
root@k8s-master-63:~# sysctl --system

3.7、启用IPVS模式

说明:以下操作无论是master节点、worker节点、kube-lb节点均需要执行。

# 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
root@k8s-master-63:~#  apt -y install ipvsadm ipset sysstat conntrack
# 2、加载内核模块脚本
root@k8s-master-63:~# cat > /etc/profile.d/ipvs.modules <
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 3、赋予权限
root@k8s-master-63:~# chmod 755 /etc/profile.d/ipvs.modules
# 4、执行加载模块脚本
root@k8s-master-63:~# bash /etc/profile.d/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

四、安装etcd集群

4.1、生成etcd集群相关证书

说明:手动创建证书比较麻烦,这里采用了etcd证书一键生成工具来创建etcd相关证书,可以在任意一节点主机上生成etcd集群相关证书。

操作步骤如下图所示:
《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多从)》_第2张图片
说明:有一些ipv4的流量不能走iptables链,因为linux内核是一个过滤器,所有流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:

1、其中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

2、其中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。

3、如果某一个节点如k8s-master-63节点,它即为master节点,也是etcd节点,则证书文件列表如下所示:
在这里插入图片描述

4、这里就默认在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 master节点 etcd集群ca根证书
peer.pem peer-key.pem /etc/kubernetes/pki/etcd master节点 etcd集群peer证书
server.pem server-key.pem /etc/kubernetes/pki/etcd master节点 etcd集群server证书
healthcheck-client.pem healthcheck-client-key.pem /etc/kubernetes/pki/etcd master节点 etcd集群client证书
apiserver-etcd-client.pem apiserver-etcd-client-key.pem /etc/kubernetes/pki master节点 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文件

1、etcd01节点etcd.service文件如下所示:
root@k8s-master-63:~# cat /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=https://192.168.1.63:2380 \
  --listen-peer-urls=https://192.168.1.63:2380 \
  --listen-client-urls=https://192.168.1.63:2379,http://127.0.0.1:2379 \
  --advertise-client-urls=https://192.168.1.63:2379 \
  --initial-cluster-token=etcd-cluster \
  --initial-cluster="etcd01=https://192.168.1.63:2380,etcd02=https://192.168.1.64:2380,etcd03=https://192.168.1.65:2380" \
  --initial-cluster-state<

你可能感兴趣的:(《企业级K8s集群运维实战》,kubernetes,etcd,java)