通过 kubeadm 基于 cri-dockerd 部署 Kubernetes 高可用集群

首页 / ☁️Cloud / 正文

1、集群环境

1.1 集群地址分配

主机名IP 地址描述
k8s-master-01192.168.6.161master 节点 1
k8s-master-02192.168.6.162master 节点 2
k8s-node-01192.168.6.163node 节点 1
k8s-node-02192.168.6.164node 节点 2
192.168.6.165高可用浮动地址

1.2 操作系统

centos 7

1.3 Kubernetes 版本

Kubernetes 1.25.1

2、Kubernetes 集群初始化

2.1 主机名配置

分别在四台节点上配置对应的主机名。

hostnamectl set-hostname k8s-master-01
hostnamectl set-hostname k8s-master-02
hostnamectl set-hostname k8s-node-01
hostnamectl set-hostname k8s-node-02

2.2 配置主机名解析

在四台节点上配置 /etc/hosts 文件。

cat >> /etc/hosts << EOF
192.168.6.161 k8s-master-01
192.168.6.162 k8s-master-02
192.168.6.163 k8s-node-01
192.168.6.164 k8s-node-02
192.168.6.165 k8s-floating
EOF

2.3 配置 ssh key 验证(可选)

k8s-master-01 节点配置 ssh key 验证,方便后续同步文件。

# 生成rsa密钥
ssh-keygen -t rsa

# 复制公钥 id_rsa.pub 到每台设备
for i in k8s-master-01 k8s-master-02 k8s-node-01 k8s-node-02; do ssh-copy-id -i .ssh/id_rsa.pub $i ;done

2.4 禁用 swap

分别在四台节点上关闭 swap 分区。

# 关闭 swap 分区
swapoff -a && sysctl -w vm.swappiness=0

# 注释掉 swap 分区配置文件
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

2.5 关闭 selinux

分别在四台节点上关闭 selinux

setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2.6 配置时间同步

分别在四台节点上配置时间同步。

# 安装ntp服务器
yum install -y ntp ntpdate

# 配置时间同步
ntpdate -u time2.aliyun.com

#配置定时任务,每20分钟同步一次。
echo "*/20 * * * * /usr/sbin/ntpdate -u time2.aliyun.com >/dev/null &" >> /var/spool/cron/root

2.7 修改linux 最大文件限制数(可选)

分别在四台节点上修改 linux 最大文件限制数。

echo ulimit -SHn 65535 >>/etc/profile
source /etc/profile

2.8 关闭 firewalld 和 NetworkManager

分别在四台节点上关闭 firewalldNetworkManager

systemctl stop firewalld
systemctl disable --now firewalld
systemctl disable --now NetworkManager

2.9 常用工具安装

分别在四台节点上安装常用工具。

yum install -y jq net-tools telnet yum-utils vim wget psmisc nfs-utils device-mapper-persistent-data lvm2 git network-scripts tar curl epel-release ipvsadm ipset

2.10 配置 yum 源

分别在四台节点上配置 CentOS 7 yum 源。

mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache

分别在四台节点上配置 k8s yum 源。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
enabled=1 
gpgcheck=0 
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache fast

2.11 更新系统与内核

分别在四台节点上更新最新稳定版内核。

# 更新系统
yum update -y

# 更新内核
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-lt -y

# 配置以新内核启动
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"

2.12 修改内核参数

分别在4台节点上修改内核参数。

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=10
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0 
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
net.ipv4.ip_local_port_range= 45001 65000
net.ipv4.ip_forward=1
net.ipv4.tcp_max_tw_buckets=6000
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_synack_retries=2
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.netfilter.nf_conntrack_max=2310720
net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=32768
net.ipv6.neigh.default.gc_thresh3=65536
net.core.netdev_max_backlog=16384
net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216
net.ipv4.tcp_max_syn_backlog = 8096 
net.core.somaxconn = 32768 
fs.inotify.max_user_instances=8192 
fs.inotify.max_user_watches=524288 
fs.file-max=52706963
fs.nr_open=52706963
kernel.pid_max = 4194303
net.bridge.bridge-nf-call-arptables=1
vm.swappiness=0 
vm.overcommit_memory=1 
vm.panic_on_oom=0 
vm.max_map_count = 262144
EOF

内核参数说明:

net.ipv4.tcp_keepalive_time=600 #此参数表示TCP发送keepalive探测消息的间隔时间(秒)
net.ipv4.tcp_keepalive_intvl=30 #tcp检查间隔时间(keepalive探测包的发送间隔)
net.ipv4.tcp_keepalive_probes=10  #tcp检查次数(如果对方不予应答,探测包的发送次数)
net.ipv6.conf.all.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv6.conf.default.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv6.conf.lo.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv4.neigh.default.gc_stale_time=120 #ARP缓存条目超时
net.ipv4.conf.all.rp_filter=0  #默认为1,系统会严格校验数据包的反向路径,可能导致丢包
net.ipv4.conf.default.rp_filter=0 #不开启源地址校验
net.ipv4.conf.default.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.conf.lo.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.conf.all.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.ip_local_port_range= 45001 65000 # 定义网络连接可用作其源(本地)端口的最小和最大端口的限制,同时适用于TCP和UDP连接。
net.ipv4.ip_forward=1 # 其值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
net.ipv4.tcp_max_tw_buckets=6000 #配置服务器 TIME_WAIT 数量
net.ipv4.tcp_syncookies=1 #此参数应该设置为1,防止SYN Flood
net.ipv4.tcp_synack_retries=2 #表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包),进行重试的次数(默认为5)
net.bridge.bridge-nf-call-ip6tables=1 # 是否在ip6tables链中过滤IPv6包
net.bridge.bridge-nf-call-iptables=1 # 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样有时会出现L3层的iptables rules去过滤L2的帧的问题
net.netfilter.nf_conntrack_max=2310720 #连接跟踪表的大小,建议根据内存计算该值CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32),并满足nf_conntrack_max=4*nf_conntrack_buckets,默认262144

net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=32768
net.ipv6.neigh.default.gc_thresh3=65536

#gc_thresh3 是表大小的绝对限制
#gc_thresh2 设置为等于系统的最大预期邻居条目数的值
#在这种情况下,gc_thresh3 应该设置为一个比 gc_thresh2 值高的值,例如,比 gc_thresh2 高 25%-50%,将其视为浪涌容量。
#gc_thresh1 提高到较大的值;此设置的作用是,如果表包含的条目少于 gc_thresh1,内核将永远不会删除(超时)过时的条目。

net.core.netdev_max_backlog=16384 # 每CPU网络设备积压队列长度
net.core.rmem_max = 16777216 # 所有协议类型读写的缓存区大小
net.core.wmem_max = 16777216 # 最大的TCP数据发送窗口大小
net.ipv4.tcp_max_syn_backlog = 8096 # 第一个积压队列长度
net.core.somaxconn = 32768 # 第二个积压队列长度
fs.inotify.max_user_instances=8192 # 表示每一个real user ID可创建的inotify instatnces的数量上限,默认128.
fs.inotify.max_user_watches=524288 # 同一用户同时可以添加的watch数目,默认8192。
fs.file-max=52706963 # 文件描述符的最大值
fs.nr_open=52706963 #设置最大微博号打开数
kernel.pid_max = 4194303 #最大进程数
net.bridge.bridge-nf-call-arptables=1 #是否在arptables的FORWARD中过滤网桥的ARP包
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
vm.max_map_count = 262144
# 应用 sysctl 参数而不重新启动
sysctl --system

2.13 启用 ipvs 模块

分别在四台节点上启用 ipvs 模块。

# 创建 ipvs 加载配置文件
cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

# 加载 ipvs 模块
systemctl enable --now systemd-modules-load.service

3、Kubernetes 集群 Master 节点高可用

通过 Nginx + Keepalived 实现 Master 节点高可用。

3.1 安装 Nginx

在两台 Master 节点利用 Nginx 实现 Kubeapi 服务的负载均衡。

# 安装配置 nginx
yum -y install nginx nginx-all-modules.noarch

# 配置 HAProxy 配置文件
cat >> /etc/nginx/nginx.conf << EOF
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.6.161:6443; # Master1 APISERVER IP:PORT
server 192.168.6.162:6443; # Master2 APISERVER IP:PORT
}
server {
listen 16443; 
proxy_pass k8s-apiserver;
}
}
EOF 

# 重启 nginx
systemctl restart nginx

3.2 安装 Keepalived

在两台 Master 节点安装 keepalived 实现 HAProxy 的高可用。注意两台 Master 节点配置文件不同,需要更改。

# 安装 keepalived
yum -y install keepalived 

# 修改 keepalived 配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id k8s-master-01 #指定router_id,#在ha2上为k8s-master-02
}
vrrp_script check_haproxy { #定义脚本
   script "/etc/keepalived/check_nginx.sh"

   timeout 2
   interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
   state MASTER #在ha2上为BACKUP
   interface ens192 #网卡名称
   garp_master_delay 10
   smtp_alert
   virtual_router_id 66   #指定虚拟路由器ID,ha1和ha2此值必须相同
   priority 100           #在ha2上为80
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 123456   #指定验证密码,ha1和ha2此值必须相同
   }
   virtual_ipaddress {
        192.168.6.165  #指定VIP,ha1和ha2此值必须相同
   }
   track_script {
       check_nginx #调用上面定义的脚本
 }
}

# 创建检测 nginx 脚本
cat > /etc/keepalived/check_nginx.sh <<EOF
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
    systemctl stop keepalived
fi
EOF

# 授予脚本权限
chmod a+x /etc/keepalived/check_nginx.sh 

# 重启 keepalived
systemctl restart keepalived

3.3 检测高可用是否正常

查看 Master 节点 IP 地址,通过下图发现,k8s-master-01 节点,已经获取到了高可用浮动地址。

image-20221020142509967

4、Kubernetes 安装部署

4.1 Docker 安装

(1)分别在各个节点安装 docker-ce ,查看可用 docker-ce 版本:

yum list docker-ce.x86_64 --showduplicates | sort -r

(2)安装 Docker

# 安装最新版
yum -y install docker-ce

# 安装指定版本
yum -y install docker-ce-20.10.18-3.el7

(3)配置开机自启动 Docker

systemctl start docker
systemctl enable --now docker

4.2 Docker 配置修改

配置 cgroup 驱动程序,容器运行时和 kubelet 都具有名字为 "cgroup driver" 的属性,该属性对于在 Linux 机器上管理 CGroups 而言非常重要。 警告:你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。

# 自 Kubernetes v1.22 版本开始,未明确设置 kubelet 的 cgroup driver 时,则默认即会将其设置为 systemd 。所有主机修改加速和 cgroupdriver 。
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"] 
}
EOF

#重启 Docker
systemctl restart docker.service

#验证修改是否成功
docker info |grep "Cgroup Driver"
# 输出如下驱动为 systemd 为修改成功。
 Cgroup Driver: systemd

4.3 安装 kubeadm、kubelet 和 kubectl

(1)分别在各个节点安装 kubeadm、kubelet 和 kubectl ,查看可用 kubeadm 版本:

yum list kubeadm --showduplicates | sort -r

(2)安装kubeadm、kubelet 和 kubectl

# 安装最新版
yum -y install kubeadm kubelet kubectl

# 安装指定 1.25.1 版本
yum -y install kubeadm-1.25.1  kubelet-1.25.1 kubectl-1.25.1

4.4 安装 cri-dockerd

Kubernetes 自 v1.24 移除了对 docker-shim 的支持,而 Docker Engine 默认又不支持 CRI 规范,因而二者将无法直接完成整合。为此,Mirantis 和 Docker 联合创建了 cri-dockerd 项目,用于为 Docker Engine 提供一个能够支持到 CRI 规范的垫片,从而能够让 Kubernetes 基于 CRI 控制 Docker 。

项目地址:https://github.com/Mirantis/cri-dockerd

接下来分别在各个节点安装 cri-dockerd 。

# 下载 cri-dockerd rpm 包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6-3.el7.x86_64.rpm

# 安装 cri-dockerd
rpm -ivh cri-dockerd-0.2.6-3.el7.x86_64.rpm

# 修改配置文件,众所周知的原因,从国内 cri-dockerd 服务无法下载 k8s.gcr.io上面相关镜像,导致无法启动,所以需要修改 cri-dockerd 使用国内镜像源

sed -i 's#ExecStart=.*#& --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7#g' /usr/lib/systemd/system/cri-docker.service 

# 重启 cri-dockerd
systemctl daemon-reload && systemctl restart cri-docker.service

4.5 下载 kubernetes 镜像

(1)查看 Kubernetes 集群所需国内镜像。

kubeadm config images list --image-repository registry.aliyuncs.com/google_containers

(2)下载 kubernetes 所需镜像

kubeadm config images pull --kubernetes-version=v1.25.1 --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///run/cri-dockerd.sockA

(3)查看下载的镜像

docker images

4.6 初始化集群

(1)在 k8s-master-01 节点进行 kubernetes 集群初始化操作。

kubeadm init --control-plane-endpoint=192.168.6.165 --kubernetes-version=v1.25.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0   --cri-socket unix:///run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers --upload-certs

参数详解:

--kubernetes-version:#kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同。
--control-plane-endpoint:#多主节点必选项,用于指定控制平面的固定访问地址,可是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址,如果是单主节点的控制平面部署时不使用该选项,注意:kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。
--pod-network-cidr:#Pod网络的地址范围,其值为CIDR格式的网络地址,通常情况下Flannel网络插件的默认为10.244.0.0/16,Calico网络插件的默认值为192.168.0.0/16。
--service-cidr:#Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址。
--service-dns-domain string #指定k8s集群域名,默认为cluster.local,会自动通过相应的DNS服务实现解析。
--apiserver-advertise-address:#API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示此节点上所有可用地址,非必选项。
--image-repository string #设置镜像仓库地址,默认为 k8s.gcr.io,此地址国内可能无法访问,可以指向国内的镜像地址。
--token-ttl #共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。kubeadm token create --print-join-command 。
--ignore-preflight-errors=Swap” #若各节点未禁用Swap设备,还需附加选项“从而让kubeadm忽略该错误。
--upload-certs #将控制平面证书上传到 kubeadm-certs Secret 。
范例: 初始化集群
如果想重新初始化,可以执行下面
--cri-socket  #v1.24版之后指定连接cri的socket文件路径,注意;不同的CRI连接文件不同
#如果是cRI是containerd,则使用--cri-socket unix:///run/containerd/containerd.sock
#如果是cRI是docker,则使用--cri-socket unix:///var/run/cri-dockerd.sock
#如果是CRI是CRI-o,则使用--cri-socket unix:///var/run/crio/crio.sock
#注意:CRI-o与containerd的容器管理机制不一样,所以镜像文件不能通用。

kubernetes 集群创建成功,输出如下:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join 192.168.6.165:6443 --token 6kwr73.dcz9pe8tgzsalg6x \
        --discovery-token-ca-cert-hash sha256:458d32e58524c2c965c55f945882f8209c581792846643a11a4810c7dae4c291 \
        --control-plane --certificate-key 44e9dd820b8f5d701b8966cfb8cddee9aa23b37c1fee509d5f8e26b688a2840f

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.6.165:6443 --token 6kwr73.dcz9pe8tgzsalg6x \
        --discovery-token-ca-cert-hash sha256:458d32e58524c2c965c55f945882f8209c581792846643a11a4810c7dae4c291

(2)master 节点加入 kubernetes 集群

将其余的 master 节点加入到 kubernetes 集群。

kubeadm join 192.168.6.165:6443 --token 6kwr73.dcz9pe8tgzsalg6x \
        --discovery-token-ca-cert-hash sha256:458d32e58524c2c965c55f945882f8209c581792846643a11a4810c7dae4c291 \
        --control-plane --certificate-key 44e9dd820b8f5d701b8966cfb8cddee9aa23b37c1fee509d5f8e26b688a2840f \
        --cri-socket=unix:///var/run/cri-dockerd.sock

master 节点加入集群后输出示例,如下:

This node has joined the cluster and a new control plane instance was created:

* Certificate signing request was sent to apiserver and approval was received.
* The Kubelet was informed of the new secure connection details.
* Control plane label and taint were applied to the new node.
* The Kubernetes control plane instances scaled up.
* A new etcd member was added to the local/stacked etcd cluster.

To start administering your cluster from this node, you need to run the following as a regular user:

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

Run 'kubectl get nodes' to see this node join the cluster.

补充部分:重置集群

如果配置错误,想重新初始化集群,可以执行下面命令(如果有 node 节点,先在 node 节点执行,再在 master 节点执行)。

kubeadm reset -f --cri-socket unix:///run/cri-dockerd.sock
rm -rf /etc/cni/net.d/  $HOME/.kube/config
reboot

(3)配置环境变量

在两台 master节点上,配置环境变量。

kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是 kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操 作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文 件/etc/kubernetes/admin.conf,它可由kubectl通过默认的“$HOME/.kube/config”的路径进行加载。 当然,用户也可在kubectl命令上使用--kubeconfig选项指定一个别的位置。 下面复制认证为Kubernetes系统管理员的配置文件至目标用户(例如当前用户root)的家目录下:

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

(4)node 节点加入 kubernetes 集群

将两台 node 节点加入到 kubernetes 集群,分别执行以下命令。

kubeadm join 192.168.6.165:6443 --token 6kwr73.dcz9pe8tgzsalg6x \
        --discovery-token-ca-cert-hash sha256:458d32e58524c2c965c55f945882f8209c581792846643a11a4810c7dae4c291 \
        --cri-socket=unix:///var/run/cri-dockerd.sock

node 节点成功加入集群,输出如下:

[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

(5)配置 kubectl tab 命令补全(可选)

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)

(6)配置网络插件

Kubernetes 系统上 Pod 网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为著名的有 flannel、calico、canal 和 kube-router 等,简单易用的实现是为CoreOS提供的 flannel 项目。

提示:下载flanneld的地址为 https://github.com/flannel-io/flannel/releases

在初始化的第一个 master 节点 k8s-master-01上运行如下命令,向 Kubernetes 部署 kube-flannel 。

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

(7)查看集群节点状态

通过以下命令查看 Kubernetes 集群节点状态,状态 Ready 表示集群初始化完成。

[root@k8s-master-01 ~]# kubectl get nodes
NAME            STATUS   ROLES           AGE   VERSION
k8s-master-01   Ready    control-plane   62m   v1.25.1
k8s-master-02   Ready    control-plane   50m   v1.25.1
k8s-node-01     Ready    <none>          38m   v1.25.1
k8s-node-02     Ready    <none>          45m   v1.25.1

4.7 Kubernetes 当中启用IPVS模式

Kubernetes 默认使用 iptables 模式,变更为启用 ipvs 而不使用 iptables 的原因如下:

  • ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更
  • 多选项,例如:

    • rr :轮询调度
    • lc :最小连接数
    • dh :目标哈希
    • sh :源哈希
    • sed :最短期望延迟
    • nq : 不排队调度

(1)修改配置文件

kubectl edit configmap -n kube-system kube-proxy

    mode: "ipvs"
    

如果要修改调度算法使用
    scheduler: ""    

查看 ipvsadm 列表,默认为空。

[root@k8s-master-01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

(2)依次重启/删除 kube-proxy 的pod

[root@k8s-master-01 ~]# kubectl get pod -n kube-system -o wide
NAME                                    READY   STATUS    RESTARTS        AGE     IP              NODE            NOMINATED NODE   READINESS GATES
kube-proxy-bkx7h                        1/1     Running   0               3h37m   192.168.6.162   k8s-master-02   <none>           <none>
kube-proxy-khr77                        1/1     Running   0               3h34m   192.168.6.163   k8s-node-01     <none>           <none>
kube-proxy-qb2gf                        1/1     Running   0               3h41m   192.168.6.164   k8s-node-02     <none>           <none>
kube-proxy-z2xbk                        1/1     Running   0               3h40m   192.168.6.161   k8s-master-01   <none>           <none>

删除pod之后 会新起一个新的pod

[root@k8s-master-01 ~]# kubectl delete pod kube-proxy-bkx7h -n kube-system
pod "kube-proxy-bkx7h" deleted
[root@k8s-master-01 ~]# kubectl delete pod kube-proxy-khr77 -n kube-system
pod "kube-proxy-bkx7h" deleted
[root@k8s-master-01 ~]# kubectl delete pod kube-proxy-qb2gf -n kube-system
pod "kube-proxy-bkx7h" deleted
[root@k8s-master-01 ~]# kubectl delete pod kube-proxy-z2xbk -n kube-system
pod "kube-proxy-bkx7h" deleted

等容器重启完毕再去查看 ipvsadm 列表

[root@k8s-master-01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.0.1:30080 rr
  -> 10.244.3.2:80                Masq    1      0          0
TCP  172.17.0.1:30081 rr
  -> 10.244.3.2:10081             Masq    1      0          0
TCP  192.168.6.161:30080 rr
  -> 10.244.3.2:80                Masq    1      0          0
TCP  192.168.6.161:30081 rr
  -> 10.244.3.2:10081             Masq    1      0          0
TCP  192.168.6.165:30080 rr
  -> 10.244.3.2:80                Masq    1      0          0
TCP  192.168.6.165:30081 rr
  -> 10.244.3.2:10081             Masq    1      0          0
TCP  10.96.0.1:443 rr
  -> 192.168.6.161:6443           Masq    1      0          0
  -> 192.168.6.162:6443           Masq    1      0          0
...

4.8 Kuboard - Kubernetes 多集群管理界面部署(可选)

官方网站:Kuboard_Kubernetes教程_K8S安装_管理界面

准备工作

检查集群节点是否存在 Master Role,如果缺失 Master Role 则需要以下方式进行添加。首先查看节点名称:

[root@k8s-master-01 ~]# kubectl get nodes
NAME            STATUS   ROLES           AGE    VERSION
k8s-master-01   Ready    control-plane   3d5h   v1.25.1
k8s-master-02   Ready    control-plane   3d4h   v1.25.1
k8s-node-01     Ready    <none>          3d4h   v1.25.1
k8s-node-02     Ready    <none>          3d4h   v1.25.1

在集群中缺少 Master Role 节点时,您也可以为一个或者多个 worker 节点添加 k8s.kuboard.cn/role=etcd 的标签,来增加 kuboard-etcd 的实例数量;

  • 执行如下指令,可以为 your-node-name 节点添加所需要的标签.
kubectl label nodes your-node-name k8s.kuboard.cn/role=etcd

(1)在线安装

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

定制参数:如果您想要定制 Kuboard 的启动参数,请将该 YAML 文件下载到本地,并修改其中的 ConfigMap

(2)访问 Kuboard

在浏览器中打开链接 http://your-node-ip-address:30080

image-20221024162710732

输入初始用户名和密码,并登录。

  • 用户名: admin
  • 密码: Kuboard123

image-20221024162830505

无标签
打赏
文章目录