技术交流QQ群:①185473046   ②190706903   ③203744115   网站地图
登录

下次自动登录
现在的位置: 首页Kubernetes>正文
k8s-1.31.1版本多master多node高可用集群在线安装部署
2024年10月21日 Kubernetes 暂无评论 ⁄ 被围观 32次+

知识储备:

1、Kubernetes集群要保证高可用,至少需要三个master节点和多个node节点,master节点建议为奇数,一般集群3个master节点就足够了,node节点2个以上都可以。

2、在3个master的Kubernetes集群中,当1个master节点坏掉,剩余的2个节点master可以选举出新的Leader,这是因为在Raft协议中,需要超过一半的节点在线才能进行选举。

3、在3个master节点的集群中,坏掉了1个节点,此时还有2个节点在线,超过了一半,所以可以选举和运行,集群不受影响。

4、在3个master节点的集群中,1个节点坏掉:集群可继续运行;2个节点坏掉:无法选举,集群不可用。

操作系统:AnolisOS-8.8-x86_64

containerd:1.7.23

kubernetes:v1.31.1

calico:v3.28.2

Dashboard:v-7.8.0

kube-vip:v0.8.3

k8s集群说明:

3个master节点,并且做高可用和负载均衡设置,2个node节点。

vip地址:192.168.21.200

一、主机环境配置(5台都需要操作)

1、修改主机名和字符集

192.168.21.201 k8s-master01

192.168.21.202 k8s-master02

192.168.21.203 k8s-master03

192.168.21.204 k8s-node01

192.168.21.205 k8s-node02

hostnamectl set-hostname k8s-master01 #设置主机名为k8s-master01

hostnamectl set-hostname k8s-master02 #设置主机名为k8s-master02

hostnamectl set-hostname k8s-master03 #设置主机名为k8s-master03

hostnamectl set-hostname k8s-node01 #设置主机名为k8s-node01

hostnamectl set-hostname k8s-node02 #设置主机名为k8s-node02

locale #查看默认字符集

echo "export LANG=en_US.UTF-8" >> /etc/profile #设置字符集

cat /etc/profile | grep -i lang #查看字符集

export LANG=en_US.UTF-8

2、添加hosts解析

vi /etc/hosts

192.168.21.201 k8s-master01

192.168.21.202 k8s-master02

192.168.21.203 k8s-master03

192.168.21.204 k8s-node01

192.168.21.205 k8s-node02

:wq! #保存退出

3、保存yum下载的安装包

vi /etc/yum.conf #保存路径为/var/cache/yum/

keepcache=1 #添加这一行

:wq! #保存退出

4、防火墙设置

系统默认使用的是firewall作为防火墙,这里改为iptables防火墙,并清空规则。

systemctl stop firewalld.service #停止 firewalld 服务

systemctl disable firewalld.service #禁用 firewalld 服务

systemctl mask firewalld #屏蔽 firewalld 服务

systemctl stop firewalld #再次停止 firewalld 服务

yum remove firewalld -y #将 firewalld 软件包从系统中移除

yum install iptables-services -y #安装iptables

systemctl enable iptables.service #设置防火墙开机启动

iptables -F #清空规则

service iptables save #保存配置规则

systemctl restart iptables.service #重启防火墙使配置生效

cat /etc/sysconfig/iptables #查看防火墙配置文件

5、关闭selinux

sestatus #查看状态,显示disabled表示已经禁用

sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config #禁用selinux

setenforce 0 #临时禁用

/usr/sbin/sestatus -v #查看selinux状态,disabled表示关闭

6、关闭swap分区

如果系统设置了swap交换分区,需要关闭

#显示 Swap 分区的详细信息,如果没有任何输出,表示当前系统没有配置 Swap 分区

swapon --show

swapoff -a #关闭

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #修改配置,禁用 Swap 分区配置

free -m #查看Swap 分区信息

7、同步系统时间

把k8s-master01设置为时间服务器,让其他四台机器与它同步

也可以部署专门的时间服务器,让k8s集群内的所有机器与它同步

#设置服务器时区

rm -rf /etc/localtime #先删除默认的时区设置

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #替换上海/北京作为默认

vi /etc/sysconfig/clock #添加时区

Zone=Asia/Shanghai

:wq! #保存退出

yum install chrony -y #安装时间同步工具

systemctl start chronyd

systemctl enable chronyd

vi /etc/chrony.conf #编辑(在k8s-master01操作)

#pool ntp.aliyun.com iburst #注释掉

local stratum 10 #时间层级设置,配置为本地时间服务器

allow 192.168.21.0/24 #允许的ip段

:wq! #保存退出

vi /etc/chrony.conf #编辑(在另外4台上面操作)

#pool ntp.aliyun.com iburst #注释掉

server 192.168.21.201 iburst #添加此行,填上k8s-master01的ip地址

maxdistance 600.0

:wq! #保存退出

systemctl restart chronyd

chronyc sources #查看当前时间源,配置文件/etc/chrony.conf里面可以设置时间服务器地址

chronyc makestep #手动同步时间

chronyc tracking #检查 Chrony 的状态和时间同步情况

hwclock -w

hwclock --systohc #系统时钟和硬件时钟同步

date #显示系统时间

#可以自己修改时间

timedatectl set-ntp false #先关闭NTP同步

timedatectl set-time "2024-10-06 15:15:15"

date #可以看到时间已经修改

timedatectl set-ntp true # 打开NTP同步,时间会从服务端自动同步

watch -n 1 date #显示实时时间

8、升级系统内核

默认已经是高版本的内核了5.10.134-13.an8.x86_64,不需要升级,安装k8s的系统至少使用3.10及以上内核

grubby --default-kernel

grub2-editenv list

uname -r

#如果需要升级内核可以参考

CentOS 升级系统内核到最新版

https://www.osyunwei.com/archives/11582.html

9、调整系统内核参数

9.1

#执行以下命令

modprobe br_netfilter

modprobe ip_vs

modprobe ip_conntrack

modprobe ip_vs_rr

modprobe ip_vs_wrr

modprobe ip_vs_sh

modprobe nf_conntrack

cat >> /etc/rc.d/rc.local << EOF

modprobe br_netfilter

modprobe ip_vs

modprobe ip_conntrack

modprobe ip_vs_rr

modprobe ip_vs_wrr

modprobe ip_vs_sh

modprobe nf_conntrack

EOF

chmod +x /etc/rc.d/rc.local

#高版本的内核nf_conntrack_ipv4被nf_conntrack替换了

9.2

vi /etc/security/limits.conf #在最后一行添加以下代码,这个值要小于fs.nr_open的值

* soft nproc unlimited

* hard nproc unlimited

* soft nofile 1000000

* hard nofile 1000000

:wq! #保存退出

9.3

vi /etc/sysctl.conf #在最后一行添加以下代码

fs.file-max = 65535000

fs.nr_open = 65535000

kernel.pid_max= 4194303

vm.swappiness = 0

:wq! #保存退出

/sbin/sysctl -p

#查看hard和soft限制数

ulimit -Hn

ulimit -Sn

9.4

vi /etc/sysctl.d/kubernetes.conf

net.bridge.bridge-nf-call-iptables = 1 #将桥接的IPv4流量传递到iptables

net.bridge.bridge-nf-call-ip6tables = 1 #将桥接的IPv6流量传递到iptables

net.bridge.bridge-nf-call-arptables=1

net.ipv4.ip_forward = 1

net.ipv4.ip_nonlocal_bind = 1 #允许服务绑定一个本机不存在的IP地址,haproxy部署高可用使用vip时会用到

vm.swappiness = 0

vm.overcommit_memory = 1

vm.panic_on_oom = 0

fs.inotify.max_user_instances = 8192

fs.inotify.max_user_watches = 1048576

fs.file-max = 52706963

fs.nr_open = 52706963

net.ipv6.conf.all.disable_ipv6 = 1

net.netfilter.nf_conntrack_max = 2310720

:wq! #保存退出

sysctl -p /etc/sysctl.d/kubernetes.conf

sysctl --system

9.5开启IPVS支持

vi /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

ipvs_modules="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 nf_conntrack"

for kernel_module in ${ipvs_modules}; do

/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1

if [ $? -eq 0 ]; then

/sbin/modprobe ${kernel_module}

fi

done

:wq! #保存退出

#执行以下命令使配置生效

chmod 755 /etc/sysconfig/modules/ipvs.modules

sh /etc/sysconfig/modules/ipvs.modules

lsmod | grep ip_vs

10、安装系统依赖包

yum install -y ipset ipvsadm

yum install -y openssl-devel openssl

yum install -y gcc gcc-c++

yum install -y telnet iproute iproute-tc jq bzip2 tar conntrack conntrack-tools sysstat curl iptables libseccomp lrzsz git unzip vim net-tools epel-release nfs-utils wget make yum-utils device-mapper-persistent-data lvm2

11、配置免密码登录

只在在k8s-master01上操作就行

ssh-keygen #输入命令,按三次回车,会生成私钥和公钥

cd /root/.ssh #进入目录,会看到生成的私钥和公钥

#拷贝公钥

ssh-copy-id root@192.168.21.202 #输入192.168.21.202的root密码

ssh-copy-id root@192.168.21.203 #输入192.168.21.203的root密码

ssh-copy-id root@192.168.21.204 #输入192.168.21.204的root密码

ssh-copy-id root@192.168.21.205 #输入192.168.21.205的root密码

后面在master01节点直接输入ssh root@192.168.21.202/203/204/205登录服务器不用再输密码

二、安装containerd(5台都需要操作)

从 Kubernetes 1.24 开始,官方强烈推荐使用 containerd 作为 Kubernetes 的容器运行时

2.1使用二进制方式安装containerd

下载安装包

wget https://github.com/containerd/containerd/releases/download/v1.7.23/cri-containerd-1.7.23-linux-amd64.tar.gz

解压到根目录

tar -C / -zxf cri-containerd-1.7.23-linux-amd64.tar.gz

#生成配置文件并修改

mkdir -p /etc/containerd #创建配置文件目录

containerd config default > /etc/containerd/config.toml

vi /etc/containerd/config.toml

disabled_plugins = [] #修改

sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8" #修改为阿里云的地址

SystemdCgroup = true #修改

:wq! #保存退出

systemctl daemon-reload

systemctl enable containerd

systemctl start containerd

systemctl restart containerd

systemctl status containerd

#查看版本信息

ctr version

#拉取pause镜像

ctr -n k8s.io images pull --platform=amd64 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8

#查看默认命名空间的镜像

ctr -n k8s.io images ls

2.2、安装runC

由于二进制包中的runC默认需要系统中安装seccomp支持,不同版本runC对seccomp版本要求不一样

建议单独下载runC 二进制包进行安装,里面包含了seccomp模块支持

wget https://github.com/opencontainers/runc/releases/download/v1.1.15/runc.amd64

mv runc.amd64 /usr/sbin/runc

chmod +x /usr/sbin/runc

runc -v #查看版本

2.3、安装containerd的命令行工具nerdctl

nerdctl是一个与docker cli风格兼容的containerd的cli工具

nerdctl 官方发布包含两个安装版本:

最小(nerdctl-1.7.7-linux-amd64.tar.gz):仅限 nerdctl

完整(nerdctl-full-1.7.7-linux-amd64.tar.gz):包括 containerd、runc 和 CNI 等依赖项

我们已经安装了 containerd ,所以选择nerdctl-1.7.7-linux-amd64.tar.gz

wget https://github.com/containerd/nerdctl/releases/download/v1.7.7/nerdctl-1.7.7-linux-amd64.tar.gz

tar -C /usr/local/bin -zxf nerdctl-1.7.7-linux-amd64.tar.gz

nerdctl version #查看版本

#配置nerdctl 命令自动补全

yum install bash-completion -y

nerdctl completion bash > /etc/bash_completion.d/nerdctl

source /etc/bash_completion.d/nerdctl

#添加nerdctl别名为 docker

vi /usr/local/bin/docker

#!/bin/bash

/usr/local/bin/nerdctl $@

:wq! #保存退出

chmod +x /usr/local/bin/docker

#测试

nerdctl image

docker image

三、安装kubectl、kubelet、kubeadm(5台机器都需要执行)

由于目前阿里云镜像中还没有AnolisOS-8的kubernetes安装包,也没有CentOS-8的kubernetes安装包,但是可以使用CentOS-7的安装包,

#配置yum源

由于 Kubernetes 官方变更了仓库的存储路径以及使用方式,1.28 及以上版本,需要使用新版配置方法进行配置

比如需要安装1.30版本,则需要将如下配置中的v1.31替换成v1.30

vi /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/

enabled=1

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key

:wq! #保存退出

#如果之前安装了k8s,先卸载旧版本

yum -y remove kubelet kubeadm kubectl

#列出可用的k8s组件版本

yum -y list kubectl kubelet kubeadm --showduplicates

yum -y list --showduplicates kubectl kubelet kubeadm| sort -r

#安装指定版本,三个组件版本要一致

yum install -y kubectl-1.31.1-150500.1.1.x86_64 kubelet-1.31.1-150500.1.1.x86_64 kubeadm-1.31.1-150500.1.1.x86_64

#先设置开机启动,初始化后再启动服务

systemctl enable kubelet

#查看当前使用的k8s镜像版本

kubeadm config images list #显示了Kubernetes v1.31.1所需的所有镜像

registry.k8s.io/kube-apiserver:v1.31.1

registry.k8s.io/kube-controller-manager:v1.31.1

registry.k8s.io/kube-scheduler:v1.31.1

registry.k8s.io/kube-proxy:v1.31.1

registry.k8s.io/coredns/coredns:v1.11.3

registry.k8s.io/pause:3.10

registry.k8s.io/etcd:3.5.15-0

#使用阿里云的镜像仓库,拉取镜像到本地(5台机器都需要执行)

#k8s的master节点部署需要上面7个镜像

#k8s的nod节点部署实际上只需要registry.k8s.io/kube-proxy:v1.31.1和registry.k8s.io/pause:3.10这个2个镜像

#我们这里为了方便,给5台机器把这7个镜像都提前下载

#拉取镜像

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.31.1

#或者直接使用下面的命令也可以拉取镜像

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/kube-apiserver:v1.31.1

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/kube-scheduler:v1.31.1

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.31.1

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/kube-proxy:v1.31.1

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/etcd:3.5.15-0

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/coredns:v1.11.3

ctr -n k8s.io images pull --platform=amd64 registry.aliyuncs.com/google_containers/pause:3.10

#k8s.io命名空间是Kubernetes在使用containerd时默认的命名空间

#k8s.io命名空间用于存放和管理Kubernetes组件拉取的镜像

#查看默认命名空间的镜像

ctr -n k8s.io images ls

#设置k8s命令自动补全,需要重新连接ssh才能生效

yum install -y bash-completion

source /usr/share/bash-completion/bash_completion

#设置当前用户拥有命令自动补全功能

source <(kubectl completion bash)

echo "source <(kubectl completion bash)" >> ~/.bashrc

source ~/.bashrc

#设置所有用户都能拥有命令补全的功能

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null

k8s组件说明:

1、kubectl

是与 Kubernetes 集群交互的命令行工具。

一般在管理节点上运行(通常不需要在每个节点上都安装)。

负责发送 API 请求来启动 Pod 和容器、查看资源状态、创建、删除和更新各种组件。

2、kubelet

是在每个工作节点上运行的代理。

负责管理容器和 Pods,确保它们按照预期运行。

通过与 Kubernetes API 服务器通信,报告节点和 Pod 的状态。

3、kubeadm

用于集群的初始化和管理。

帮助简化集群的安装过程,包括控制平面的设置和节点的加入。

不是一个持续运行的服务,而是一个命令行工具,用于执行集群的生命周期管理操作。

4、总结

kubectl 用于管理和交互。

kubelet 管理节点上的容器和 Pods。

kubeadm 用于集群的初始化和管理。

这一步只是安装了k8s需要的三个基本组件,要让k8s真正运行起来还需要初始化部署与这三个组件版本对应的一系列镜像

四、配置Kube-Vip(在3台master机器上执行)

Kubernetes高可用方案有HAProxy+Keepalived、nginx+Keepalived等

我们使用Kube-Vip来实现Kubernetes高可用集群部署

Kube-Vip简介:

kube-vip是一个开源项目,旨在简化为Kubernetes集群提供负载均衡服务

kube-vip为Kubernetes集群提供虚拟IP和负载均衡器,用于构建高可用集群而无需依赖LoadBalancer任何外部硬件或软件

官方网站:

https://kube-vip.io/

https://github.com/kube-vip/kube-vip

4.1下载kube-vip镜像文件

#国内可以拉取的镜像的网站:https://docker.aityp.com/

#拉取镜像

ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/chainguard/kube-vip:latest

#修改镜像标签

ctr -n k8s.io images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/chainguard/kube-vip:latest ghcr.io/kube-vip/kube-vip:latest

#查看默认命名空间的镜像

ctr -n k8s.io images ls

4.2生成kube-vip静态yaml配置文件

export VIP=192.168.21.200

export INTERFACE=ens160

ctr -n k8s.io images ls | grep "ghcr.io/kube-vip/kube-vip:latest"

ctr -n k8s.io run --rm --net-host ghcr.io/kube-vip/kube-vip:latest vip \

/kube-vip manifest pod \

--interface $INTERFACE \

--vip $VIP \

--controlplane \

--services \

--arp \

--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml

参数说明:

vip地址是:192.168.21.200/24

网卡名称是:ens160

本地镜像是:ghcr.io/kube-vip/kube-vip:latest

#查看使用的镜像版本和优先级

cat /etc/kubernetes/manifests/kube-vip.yaml |grep image

image: ghcr.io/kube-vip/kube-vip:0.8.3

imagePullPolicy: IfNotPresent

#修改只使用本地镜像

sed -i "s#imagePullPolicy: IfNotPresent#imagePullPolicy: Never#g" \

/etc/kubernetes/manifests/kube-vip.yaml

#修改镜像版本配置文件里面的版本相同

ctr -n k8s.io images tag ghcr.io/kube-vip/kube-vip:latest ghcr.io/kube-vip/kube-vip:0.8.3

五、初始化k8s(只在k8s-master01这一台执行)

#先临时绑定vip到k8s-master01

/usr/bin/sudo /sbin/ip addr add 192.168.21.200/24 dev ens160 label bond1:0

#在执行初始化的时候会自动运行/etc/kubernetes/manifests/kube-vip.yaml这个文件

#在k8s-master01上执行初始化(在绑定vip的机器上执行初始化操作)

kubeadm init \

--apiserver-advertise-address=0.0.0.0 \

--control-plane-endpoint=192.168.21.200:6443 \

--pod-network-cidr=10.144.0.0/16 \

--service-cidr=10.96.0.0/16 \

--kubernetes-version=v1.31.1 \

--image-repository=registry.aliyuncs.com/google_containers \

--upload-certs

#特别注意:一定要提前做好网络规划,各个组件的ip地址段不能重叠和相同,否则会导致网络冲突安装部署失败

#参数说明

1、--apiserver-advertise-address=0.0.0.0

在3个节点中,--apiserver-advertise-address每个master节点不同,设置为本机的实际IP地址

表示的是当前节点上Kubernetes API Server所绑定的网络接口IP,用于节点之间的内部通信

如果只有1个网络接口,可以设置为0.0.0.0表示使用默认的网络接口地址

如果有多个网络接口,建议设置为本机固定ip地址:192.168.21.201

2、--control-plane-endpoint=192.168.21.200:6443

这个参数应该设置为集群的VIP地址或负载均衡器的地址,它是外部组件或工作节点与API Server交互的统一入口

所有的主节点会通过vip共享这个统一入口,因此vip或负载均衡器会将流量负载均衡到各个master节点上

192.168.21.200是vip地址,目前绑定在k8s-master01上面

其他工作节点会通过此vip地址与Kubernetes控制平面通信,这样可以实现高可用

3、--pod-network-cidr=10.144.0.0/16

指定 Pod 网络的 CIDR 范围,这是为 Kubernetes 集群中的 Pods 分配 IP 地址使用的范围

这个地址可以自定义修改,但是必须保证要和你使用的网络插件(如 Calico、Flannel)里面CIDR地址一致

不能和当前节点的内网IP地址192.168.21.200网段192.168.21.0/24网段重叠,否则会出现网络冲突

在安装kubernetes-dashboard组件的时候node工作节点和master主节点之间无法互访,导致安装失败

Calico默认的地址是192.168.0.0/16,建议修改默认地址段为10.144.0.0/16

Flanne默认的地址是10.244.0.0/16

4、--service-cidr=10.96.0.0/16

指定服务网络的 CIDR 范围,这是为 Kubernetes 服务分配 IP 地址使用的范围。在集群内部,服务会通过这个 CIDR 范围内的地址来访问

不能和当前节点的内网IP地址192.168.21.201网段192.168.21.0/24网段重叠,否则会出现网络冲突

5、--kubernetes-version=v1.23.17

指定要安装的 Kubernetes 版本,这里是 v1.23.17

6、--image-repository=registry.aliyuncs.com/google_containers

由于默认拉取镜像地址k8s.gcr.io国内无法访问,需要指定镜像仓库的地址来拉取k8s需要的镜像,这里使用的是阿里云的镜像仓库

7、--upload-certs

这个选项会自动将控制平面节点的证书上传到集群中,方便后续其他控制平面节点加入时直接从集群获取证书,而无需手动传输。

非常适合在高可用环境下使用,确保所有控制平面节点使用相同的证书

#############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.21.200:6443 --token glwaop.ueehbg0n36nd384v \

--discovery-token-ca-cert-hash sha256:55da2558df38b8b634c8f1bbee2ce94642156c477424261da246075c68298252 \

--control-plane --certificate-key 28226fbdb5bd0149024bff9be3a918e376cdf490e80cd639e31d1a8903c552ad

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.21.200:6443 --token glwaop.ueehbg0n36nd384v \

--discovery-token-ca-cert-hash sha256:55da2558df38b8b634c8f1bbee2ce94642156c477424261da246075c68298252

#############

#接着继续在k8s-master01上执行,配置Kubernetes的访问权限

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

export KUBECONFIG=/etc/kubernetes/admin.conf

#初始化成功后删掉临时绑定的vip

/usr/bin/sudo /sbin/ip addr del 192.168.21.200/24 dev ens160 label bond1:0

systemctl restart kubelet #重启服务

kubectl get node

kubectl get pod --all-namespaces

#这时查看节点状态为NotReady、coredns状态为Pending,是因为没有安装网络组件,我们还需要安装好网络组件才能显示为Ready和Running

#重新初始化安装的相关命令

#重新初始化主节点

kubeadm reset -f

rm -rf $HOME/.kube

#重新初始化从节点

kubeadm reset -f

rm -rf /etc/cni/

六、添加另外两台master节点到集群(在k8s-master02、k8s-master03这2台执行)

6.1如果token和certificate-key过期,可以k8s-master01上执行下面的命令在重新生成

#重新生成token

kubeadm token create --print-join-command

#重新生成certificate-key

kubeadm init phase upload-certs --upload-certs

6.2在k8s-master01上执行,查看token和sha256的值

kubeadm token list

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der | openssl dgst -sha256 | awk '{print $2}'

writing RSA key

6.3在两个节点k8s-master02和k8s-master03上分别执行

kubeadm join 192.168.21.200:6443 --token glwaop.ueehbg0n36nd384v \

--discovery-token-ca-cert-hash sha256:55da2558df38b8b634c8f1bbee2ce94642156c477424261da246075c68298252 \

--control-plane --certificate-key 28226fbdb5bd0149024bff9be3a918e376cdf490e80cd639e31d1a8903c552ad

#看到下面的提示说明添加成功了

#######################

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.

#######################

6.4接着继续在k8s-master02和k8s-master03上执行,配置Kubernetes的访问权限

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

6.5查看节点状态

kubectl get node

kubectl get pod --all-namespaces

#这时查看节点状态任然为NotReady、coredns状态为Pending,是因为还没有安装网络组件,我们还需要安装好网络组件才能显示为Ready和Running

七、安装网络组件

k8s的网络组件可以选择flannel或者calico,由于calico性能比flannel高,所以我们一般使用calico

calico的版本要和k8s的版本匹配才可以,calico-v3.28.2可以适配kubernetes-v1.31.1

#只在k8s-master01下载calico-v3.28.2版本的calico.yaml文件(需要科学上网)

官方网站:

在发布说明中可能没有直接给出安装的yaml文件链接,但这些文件通常位于源代码仓库中的manifests

https://github.com/projectcalico/calico

再打开:

https://github.com/projectcalico/calico/tree/release-3.28/manifests

https://github.com/projectcalico/calico/blob/release-v3.28/manifests/calico.yaml

https://raw.githubusercontent.com/projectcalico/calico/refs/heads/release-v3.28/manifests/calico.yaml

也可以通过以下链接直接访问:(修改3.28.2版本号可以下载相应的版本)

wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico.yaml --no-check-certificate

cat calico.yaml |grep image #查看安装calico-v3.28.2所需要的镜像

[root@k8s-master01 ~]# cat calico.yaml |grep image

image: docker.io/calico/cni:v3.28.2

imagePullPolicy: IfNotPresent

image: docker.io/calico/cni:v3.28.2

imagePullPolicy: IfNotPresent

image: docker.io/calico/node:v3.28.2

imagePullPolicy: IfNotPresent

image: docker.io/calico/node:v3.28.2

imagePullPolicy: IfNotPresent

image: docker.io/calico/kube-controllers:v3.28.2

imagePullPolicy: IfNotPresent

7.1手动拉取calico-v3.28.2需要的cni、kube-controllers、node镜像版本(5台机器都需要执行)

ctr -n k8s.io images pull --platform=amd64 docker.io/calico/cni:v3.28.2

ctr -n k8s.io images pull --platform=amd64 docker.io/calico/kube-controllers:v3.28.2

ctr -n k8s.io images pull --platform=amd64 docker.io/calico/node:v3.28.2

#如果无法拉取可以用下面的方法,先拉取镜像再修改标签

ctr -n k8s.io images pull --platform=amd64 docker.rainbond.cc/calico/cni:v3.28.2

ctr -n k8s.io images pull --platform=amd64 docker.rainbond.cc/calico/kube-controllers:v3.28.2

ctr -n k8s.io images pull --platform=amd64 docker.rainbond.cc/calico/node:v3.28.2

ctr -n k8s.io images tag docker.rainbond.cc/calico/cni:v3.28.2 docker.io/calico/cni:v3.28.2

ctr -n k8s.io images tag docker.rainbond.cc/calico/kube-controllers:v3.28.2 docker.io/calico/kube-controllers:v3.28.2

ctr -n k8s.io images tag docker.rainbond.cc/calico/node:v3.28.2 docker.io/calico/node:v3.28.2

#查看默认命名空间的镜像

ctr -n k8s.io images ls

7.2安装网络插件calico(只在k8s-master01上安装)

vi calico.yaml #取消注释

- name: CALICO_IPV4POOL_CIDR

value: "10.144.0.0/16"

- name: IP_AUTODETECTION_METHOD #添加此行

value: interface=ens160 #添加此行,指定网卡

:wq! #保存退出,注意格式保证- name 项与前后项对齐,ip地址段和--pod-network-cidr=10.144.0.0/16必须相同

#如果服务器有多个网卡需要指定正确的网卡,我这里是ens160(ip addr命令查看),否则会自动使用第一个网卡,可能会导致网络冲突部署失败

#安装calico网络组件只需要在Kubernetes主节点(k8s-master01)上执行该命令,Calico会自动在集群中的其他节点上进行配置和分发

#所有节点必须要能够拉取cni、kube-controllers、node这些镜像或者是提前离线导入镜像

#后面有任何新的节点加入集群,这些新节点也必须要有这些镜像才可以部署成功

kubectl apply -f calico.yaml #部署calico,只在k8s-master01上安装

kubectl get nodes #部署完成后在k8s-master01上查看节点以及POD资源状态已经显示正常了

kubectl get pod -A

kubectl get pod -n kube-system

八、添加node工作节点到集群

8.1在k8s-master01上执行,查看token和sha256的值

kubeadm token list

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der | openssl dgst -sha256 | awk '{print $2}'

8.2在两个节点k8s-node01和k8s-node02上分别执行

systemctl restart kubelet #重启服务

#加入集群,192.168.21.200:6443

kubeadm join 192.168.21.200:6443 --token glwaop.ueehbg0n36nd384v \

--discovery-token-ca-cert-hash sha256:55da2558df38b8b634c8f1bbee2ce94642156c477424261da246075c68298252

#看到下面的提示说明添加成功了

##################

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.

##################

8.3重启所有集群节点(5台机器都需要执行)

systemctl daemon-reload

systemctl enable kubelet

systemctl restart kubelet

kubeadm version

kubectl version --client

kubelet --version

#在k8s-master01上查看节点以及POD资源状态

kubectl get nodes

kubectl get pod -A

kubectl get pod -n kube-system

九、安装安装Helm(5台机器都需要执行)

Helm 是 K8S的包管理器,我们需要使用Helm来部署Dashboard

官方网站:

https://helm.sh/zh/

https://github.com/helm/helm

下载地址:

https://get.helm.sh/helm-v3.16.2-linux-amd64.tar.gz

#安装heml

tar zxvf helm-v3.16.2-linux-amd64.tar.gz #解压

mv linux-amd64/helm /usr/local/bin/helm

helm version #查看版本

十、部署Dashboard(5台机器都需要执行)

Dashboard是官方提供的一个UI,可用于基本管理K8s资源,Kubernetes和Dashboard的版本要对应才可以

Kubernetes version dashboard version

1.18 v2.0.0 完全支持

1.19 v2.0.4 完全支持

1.20 v2.4.0 完全支持

1.21 v2.4.0 完全支持

1.23 v2.5.0 完全支持

1.24 v2.6.0 完全支持

1.25 v2.7.0 完全支持

1.27 v3.0.0-alpha0 完全支持

1.29 kubernetes-dashboard-7.5.0 完全支持

1.31 kubernetes-dashboard-7.8.0 完全支持

10.1我们使用的k8s版本为1.31.1,所以要下载kubernetes-dashboard-7.8.0版本部署(需要科学上网)

https://github.com/kubernetes/dashboard/releases/tag/kubernetes-dashboard-7.8.0

从官方网站可以看到安装部署kubernetes-dashboard-7.8.0需要用到下面的镜像

docker.io/kubernetesui/dashboard-api:1.9.0

docker.io/kubernetesui/dashboard-auth:1.2.0

docker.io/kubernetesui/dashboard-metrics-scraper:1.2.0

docker.io/kubernetesui/dashboard-web:1.5.0

#下载文件

wget https://github.com/kubernetes/dashboard/releases/download/kubernetes-dashboard-7.8.0/kubernetes-dashboard-7.8.0.tgz

从上面的文件中可以查询到还需要一个镜像

docker.io/library/kong:3.6

10.2下载镜像文件

#可以从这里下载

ctr -n k8s.io images pull docker.rainbond.cc/kubernetesui/dashboard-api:1.9.0

ctr -n k8s.io images pull docker.rainbond.cc/kubernetesui/dashboard-auth:1.2.0

ctr -n k8s.io images pull docker.rainbond.cc/kubernetesui/dashboard-metrics-scraper:1.2.0

ctr -n k8s.io images pull docker.rainbond.cc/kubernetesui/dashboard-web:1.5.0

ctr -n k8s.io images pull docker.rainbond.cc/library/kong:3.6

#修改镜像标签

ctr -n k8s.io i tag docker.rainbond.cc/kubernetesui/dashboard-api:1.9.0 docker.io/kubernetesui/dashboard-api:1.9.0

ctr -n k8s.io i tag docker.rainbond.cc/kubernetesui/dashboard-auth:1.2.0 docker.io/kubernetesui/dashboard-auth:1.2.0

ctr -n k8s.io i tag docker.rainbond.cc/kubernetesui/dashboard-metrics-scraper:1.2.0 docker.io/kubernetesui/dashboard-metrics-scraper:1.2.0

ctr -n k8s.io i tag docker.rainbond.cc/kubernetesui/dashboard-web:1.5.0 docker.io/kubernetesui/dashboard-web:1.5.0

ctr -n k8s.io i tag docker.rainbond.cc/library/kong:3.6 docker.io/library/kong:3.6

10.3安装kubernetes-dashboard(只在k8s-master01这台执行)

#安装部署

helm upgrade --install kubernetes-dashboard ./kubernetes-dashboard-7.8.0.tgz --create-namespace --namespace kubernetes-dashboard

#查看信息

kubectl -n kubernetes-dashboard get svc

kubectl get pod --all-namespaces

10.4编辑配置文件

kubectl edit svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard

#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部

ports:

- name: kong-proxy-tls

nodePort: 31900

port: 443

protocol: TCP

targetPort: 8443

nodePort: 30001 #添加此行

selector:

app.kubernetes.io/component: app

app.kubernetes.io/instance: kubernetes-dashboard

app.kubernetes.io/name: kong

sessionAffinity: None

type: NodePort #添加此行

:wq! #保存退出

#查看容器运行状态

kubectl get serviceAccount,svc,deploy,pod -n kubernetes-dashboard

#访问Dashboard

输入集群的任何一个ip都可以访问

打开页面https://192.168.21.201:30001

提示需要 bearer tokens才能登录

10.5创建bearer tokens

在Kubernetes创建Dashboard超级管理员账户(只在k8s-master01上安装)

#创建用户

kubectl create serviceaccount admin-user -n kube-system

#创建token

cat > dashboard-user-token.yaml << EOF

apiVersion: v1

kind: ServiceAccount

metadata:

name: admin-user

namespace: kube-system

---

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

name: admin-user

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: ClusterRole

name: cluster-admin

subjects:

- kind: ServiceAccount

name: admin-user

namespace: kube-system

EOF

#执行

kubectl apply -f dashboard-user-token.yaml

#创建token

kubectl -n kube-system create token admin-user

10.6登录Dashboard页面

#在任意一台机器上面都能访问

#这里我们在k8s-master01节点访问https://192.168.21.201:30001

在页面上粘贴Token,登录成功

十一、测试使用k8s集群部署服务

创建一个Nginx服务,副本数为2,并且使用镜像加速站docker.rainbond.cc来拉取镜像

#只在k8s-master01上执行

ctr -n k8s.io images pull docker.rainbond.cc/nginx:latest

kubectl create deployment app-nginx --image=docker.rainbond.cc/nginx:latest --replicas=2 -n default

#暴露端口从外部访问

kubectl expose deployment app-nginx --type=NodePort --name=nginx-service --port=80 --target-port=80

#查看端口映射

kubectl get services

nginx-service NodePort 10.96.234.170 <none> 80:30737/TCP 55s

#在任意一台机器上面都能访问

#打开下面的页面就能访问nginx服务了

http://192.168.21.201:30737/

注意:

1.在NodePort类型的服务中,外部访问通常是通过某个特定的NodePort端口,而不是直接通过80端口

2.Kubernetes会为服务分配一个在30000到32767范围内的随机端口(不支持命令行自定义端口)

3.外部用户需要通过Node的IP地址和这个NodePort端口进行访问

4.直接通过80端口访问nginx-service是不可行的

5.如果您希望通过80端口访问,建议使用LoadBalancer或者Ingress

#查看节点信息的命令

#默认情况下master节点不参与工作调到

kubectl describe nodes k8s-master01

curl -k https://192.168.21.200:6443/version

十二、测试kube-vip高可用

关闭k8s-master01节点,观察集群运行状态,一切正常

此刻,vip自动绑定到k8s-master02节点上了

#查看节点状态

curl -k https://192.168.21.200:6443/version

curl -k https://192.168.21.202:6443/version

curl -k https://192.168.21.203:6443/version

至此,k8s-1.31.1版本多master多node高可用集群在线安装部署完成。

     

  系统运维技术交流QQ群:①185473046 系统运维技术交流□Ⅰ ②190706903 系统运维技术交流™Ⅱ ③203744115 系统运维技术交流™Ⅲ

给我留言

您必须 [ 登录 ] 才能发表留言!



Copyright© 2011-2024 系统运维 All rights reserved
版权声明:本站所有文章均为作者原创内容,如需转载,请注明出处及原文链接
陕ICP备11001040号-3