kubernetes在线部署基于Linux CentoS 7.6系统(一)

kubernetes简介

1 Kubernetes是什么

1)kubernetes是一个全新的基于容器技术的分布式架构容器编排平台,主要功能就是在一组服务器(物理服务器或者虚拟机)上部署和管理大量基于容器的工作负载。还提供了将容器部署到集群的方法,确保在遵守各种调度约束下,可以将容器有效地打包到集群节点中,并自动监控容器,如果发现容器出现故障,则会重新启动它们。kubernetes还会把工作负载从有问题的节点转移到其他健康节点上,这就是kubernetes的自愈能力。

2)Kubernetes是一个开放的开发平台,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用Java、Go、C++还是用Python编写的服务,都可以被映射为Kubernetes的Service(服务),并通过标准的TCP通信协议进行交互。此外,Kubernetes平台对现有的编程语言、编程框架、中间件没有任何侵入性,因此现有的系统也很容易改造升级并迁移到Kubernetes平台上。

3)Kubernetes是一个完备的分布式系统。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。

2 kubernetes架构

2.1 控制平面介绍

控制平面由以下几个组件组成:
API服务器、etcd元数据存储、调度器、控制器管理器、云控制器管理器。
其中的角色扮演和作用如下:

2.1.1 API服务器

API服务器是一个庞大的REST服务器,不仅对外公开了kubernetes API,还可以在控制平面中部署多个API服务器实例以实现高可用环境保障。

2.1.2 etcd存储

kubernetes API的集群状态数据信息都存储在etcd中,一个具有一致性和可靠性的分布式键值存储且开源,一般由三个或五个etcd实例组成一个集群。如果你丢失了etcd存储中的数据,那么你会失去整个集群。

2.1.3 调度器

kube调度器负责将Pod调度到工作节点,实现了一种复杂的多维度的信息调度算法,例如可以通过每个节点上的资源可用性、用户指定的各种约束、可用节点的类型、资源限制和配额以及其他因素,例如亲和性、反亲和性、容忍和污点等等。

2.1.4 控制器管理器

kube控制器管理器是包含了多个控制器的单个进程,通过控制器监控集群事件和对集群的更改并做出响应。
例如以下几个控制器的功能:
1)节点控制器(node controller):负责在节点出现故障时进行通知和响应。
2)副本控制器(replication controller):确保每个副本集(replica set)或副本控制器(replication controller)对象中有正确数量的Pod。
3)端点控制器(endpoints controller):为每个服务分配一个列出该服务的Pod的端点对象。
4)服务账户(service account)和令牌控制器(token controller):它们使用默认服务账户和相应的API访问令牌对新的命名空间进行初始化。

2.1.5 云控制器管理器

指在云环境中部署kubernetes集群时,云控制器管理器是云平台API和kubernetes集群之间的桥梁,此时kubernetes核心组件可以独立工作,还可以通过插件方式与云提供商进行集成。
其中云控制器管理器还包含一组云平台控制器,用于保证cloud组件例如:nodes、Loadbalancers、storage的状态符合预期。
具体组件介绍如下:
1)节点控制器(node controller):节点控制器通过与云提供商API通信,管理更新节点相关信息。
2)路由控制器(route controller):负责在云平台上配置网络路由,这样不同节点上的pod就可以互相通信了。
3)服务控制器(service controller):负责为kubernetes服务部署负载均衡器,分配IP地址等。

2.2 数据平面介绍

数据平面式集群中将容器化工作负载转为Pod运行的节点的集合,数据平面和控制平面可以同时共享服务器的所以资源,其中所包含的组件有以下几个部分组成:

2.2.1 kubelet

kubelet是kubernetes的代理,主要负责与API服务器进行通信,并运行和管理在节点上的Pod。
以下是kubelet的作用:
1)挂载存储卷。
2)从API服务器下载Pod秘钥。
3)通过容器运行时接口(Container Runtime Interface,CRI)运行Pod容器。
4)报告节点和Pod的状态。
5)探测容器的状态。

2.2.2 kube proxy

kube proxy负责节点的网络连接,它从当服务的本地前端,并且可以转发TCP和UDP数据包,还可以通过DNS或环境变量来发现服务的IP地址。

2.2.3 容器运行时

kubernetes最终还是运行容器,即使它们是按Pod进行组织的。kubernetes支持不同的容器运行时,最初kubernetes仅支持Docker,现在可以通过基于gRPC的CRI接口运行容器。
具体架构如下图:

2.2.4 kubectl

kubectl是管理kubernetes过程中最重要的命令行界面(CLI)工具。
它可以实现的部分功能有以下几点:
1)部署。
2)集群管理。
3)配置和元数据。
4)故障排查核调试。
5)资源管理(kubernetes对象)。
只需要键入kubectl即可获取命令完整的列表,然后键入kubectl <command> --help 可获取有关特定命令的更多详细使用信息。

3 环境搭建

本次部署一个主节点两个工作节点的分布式集群架构测试平台。

3.1 主机环境

序号 主机名 主机IP 虚拟机配置 角色说明
1 k8s-master01 192.168.1.6 CPU:1核,内存:2G,硬盘:40GB 主节点:控制平面中心,负责管理和协调工作节点上的容器等
2 k8s-slave01 192.168.1.7 CPU:1核,内存:2G,硬盘:40GB 工作节点:发布应用服务,管理容器化应用程序等
3 k8s-slave02 192.168.1.8 CPU:1核,内存:2G,硬盘:40GB

3.2 主机名解析

设置/etc/hosts保证主机名能够解析,需要在三个节点上都执行以下命令,完成配置。

cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.6 k8s-master01
192.168.1.7 k8s-slave01
192.168.1.8 k8s-slave02
EOF

3.3 主机初始化

3.3.1 配置CentOS主机yum仓库

下载并安装阿里云yum源。

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
或
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

3.3.2 配置kubernetes的yum仓库

配置阿里云的镜像kubernetes的yum仓库。

cat << END > /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
END

 运行以下命令生成缓存

yum clean all
yum makecache

3.3.3 验证yum仓库功能

[root@k8s-master01 ~]# yum list |grep kube*
cockpit-kubernetes.x86_64                   195.12-1.el7.centos        extras   
cri-tools.x86_64                            1.26.0-0                   kubernetes
kubeadm.x86_64                              1.28.2-0                   kubernetes
kubectl.x86_64                              1.28.2-0                   kubernetes
kubelet.x86_64                              1.28.2-0                   kubernetes
kubernetes.x86_64                           1.5.2-0.7.git269f928.el7   extras   
kubernetes-client.x86_64                    1.5.2-0.7.git269f928.el7   extras   
kubernetes-cni.x86_64                       1.2.0-0                    kubernetes
kubernetes-master.x86_64                    1.5.2-0.7.git269f928.el7   extras   
kubernetes-node.x86_64                      1.5.2-0.7.git269f928.el7   extras   
rkt.x86_64                                  1.27.0-1                   kubernetes
rsyslog-mmkubernetes.x86_64                 8.24.0-57.el7_9.3          updates  
[root@k8s-master01 ~]# 

3.4 设置防火墙

3.4.1 关闭防火墙

systemctl disable firewalld.service
systemctl stop firewalld.service
systemctl disable NetworkManager

#关闭selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
setenforce 0

3.5 禁用swap分区

swap是虚拟内存分区,作用是物理内存用完时,将磁盘空间虚拟成内存来用,但无疑会影响性能,故kubernetes要求关闭swap功能,如果必须开启,则需要在安装集群时通过明确的参数进行配置说明
编辑分区配置文件 vi /etc/fstab 在配置行前加#,注释掉swap分区所在行,保存。

# 临时关闭

swapoff -a

#永久关闭,将以下这行注释掉,永久生效。

/dev/mapper/rhel-swap   swap    swap    defaults        0 0

3.6 同步服务器时间

kubernetes要求集群中的节点时间必须精确一致,启动时间同步服务,有些机器没有这个服务,需要自己在本地服务器下载并安装更新 。

yum -y update
yum -y install chrony
systemctl start chronyd
#设置开机自启
systemctl enable chronyd

3.6.1 验证效果

执行命令:date -R
#以下三个节点的时间同步情况一致
[root@k8s-master01 ~]# date -R
Sun, 28 Apr 2024 23:38:06 +0800
[root@k8s-master01 ~]# 

[root@k8s-slave01 ~]# date -R
Sun, 28 Apr 2024 23:38:06 +0800
[root@k8s-slave01 ~]# 

[root@k8s-slave02 ~]# date -R
Sun, 28 Apr 2024 23:38:06 +0800
[root@k8s-slave02 ~]# 

3.7 配置ipvs功能

3.7.1 安装依赖包

yum -y install openssl-devel popt popt-devel libnl-devel ipset ipvsadm

3.7.2 ipvs模块写入

将需要加载的模块写入脚本文件(脚本名字可以自定义,但是后缀必须是modules)
所有节点执行命令:

cat << EOF > /etc/sysconfig/modules/ipvs.modules
#! /bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

 为脚本文件添加执行权限

chmod +x /etc/sysconfig/modules/ipvs.modules

执行脚本文件

/usr/bin/sh /etc/sysconfig/modules/ipvs.modules

执行命令

lsmod | grep -e ip_vs -e nf_conntrack_ipv4

检查更新后的模块功能

[root@k8s-master01 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145497  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4      15053  2 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          133095  6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
[root@k8s-master01 ~]# 

3.8 Linux内核优化

三个节点都执行以下配置

cat > /etc/sysctl.conf <<EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.ip_forward = 1
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.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
EOF

执行命令使得内核参数生效:
注意:执行命令之前,需要执行以下命令,否则该版本的系统会报一些加载错误。

modprobe br_netfilter
ls /proc/sys/net/bridge/

[root@k8s-master01 ~]# ls /proc/sys/net/bridge/
bridge-nf-call-arptables  bridge-nf-call-ip6tables  bridge-nf-call-iptables  bridge-nf-filter-pppoe-tagged  bridge-nf-filter-vlan-tagged  bridge-nf-pass-vlan-input-dev
[root@k8s-master01 ~]# 

执行完上述操作,检测环境无误在执行以下命令:

sysctl -p

配置kubernetes的网桥过滤模块
kubernetes强制要求修改内核参数,添加网桥过滤和地址转发功能。

cat << EOF > /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

配置生效,加载网桥过滤模块

modprobe br_netfilter
modprobe overlay

重新加载配置

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

3.9 配置docker yum源

添加阿里的 docker镜像源,使用其中的 containerd 软件.

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 安装基本的软件

yum -y install psmisc net-tools telnet yum-utils device-mapper-persistent-data lvm2 git

3.10 配置主机免密登陆

配置所有k8s集群的主机免密登陆方式,以便拷贝安装包和配置文件。
在部署主节点 k8s-master01 执行:

ssh-keygen -t rsa #一路回车即可

拷贝认证秘钥到其它节点,(注意:第一次远程的时候,需要输入各个节点的主机密码,成功之后,第二次就不用输入密码进行交互了)。

ssh-copy-id -i .ssh/id_rsa.pub root@k8s-slave01
ssh-copy-id -i .ssh/id_rsa.pub root@k8s-slave02

免密登陆功能验证

直接跳转过去工作节点1,不用输入密码哦。

[root@k8s-master01 ~]# ssh k8s-slave01
Last login: Sat Apr 20 06:01:48 2024 from 192.168.1.1
[root@k8s-slave01 ~]#

4 容器部署

4.1 安装 docker

这里不指定版本,安装的是最新版docker。

yum install -y docker-ce

4.2 验证docker

验证docker包是否安装,有则安装成功,反之没有。

[root@k8s-master01 ~]# rpm -qa docker-ce
docker-ce-26.1.0-1.el7.x86_64

4.3 查看docker版本

检查安装的docker版本是否是自己指定安装的版本。

[root@k8s-master01 ~]# docker -v
Docker version 26.1.0, build 9714adc
[root@k8s-master01 ~]# 

4.4 添加配置文件

4.4.1 创建文件夹

给docker指定一个配置文件目录。

mkdir -p /etc/docker

4.4.2 创建配置文件(非常重要)

1)Docker在默认情况下,使用的 Cgroup Driver为 cgroupfs,而kubernetes推荐使用 systemd 来代替 cgroupfs。

2)设置阿里云镜像提高基础镜像的下载速度。

3)如果使用私有镜像仓库Harbor,则还需要设置Docker的白名单,不然Docker会禁止拉取、推送镜像(可设置多个,以逗号分隔)。

4.4.3 配置加速器模板

所有节点都要执行。

cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"],
"insecure-registries": ["{私有镜像仓库地址1(服务地址),私有镜像仓库地址2(服务地址)}"]
}
EOF

4.4.4 本地镜像加速地址配置

所有节点都要执行。

cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.1.100"]
}
EOF

这里先配置本地地址,后续会更新镜像仓库 Harbor 的部署介绍, 注意一定不能打错字或有格式错误,否则docker会无法启动。

4.4.5 加载配置

执行命令使配置文件生效。

systemctl daemon-reload

4.5 设置docker启动机制

4.5.1 启动docker

systemctl start docker

注意:在启动docker时,如果有配置文件的更新,需要先执行配置文件的加载过程命令,否则启动会报错。

 4.5.2 查看启动状态

systemctl status docker

4.5.3 设置开机启动

systemctl enable docker

 

其他节点同理配置,到此docker容器部署完成。

注意事项:
如果使用私有镜像仓库,则需要在docker的http请求白名单中,添加私有镜像仓库地址后才能上传和拉取镜像,如果之前部署docker的时候没加过私有镜像仓库的白名单,则在添加后需要重启Docker才能生效。

4.6 搭建 CRI 环境

软件下载地址:https://github.com/Mirantis/cri-dockerd/releases 这里下载的是 CRI 最新版本。
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz

4.6.1 部署 CRI

解压下载文件

tar -xf cri-dockerd-0.3.10.amd64.tgz -C /usr/local
mv /usr/local/cri-dockerd/cri-dockerd /usr/local/bin
cri-dockerd --version

[root@k8s-master01 ~]# cri-dockerd --version
cri-dockerd 0.3.10 (178ed78)
[root@k8s-master01 ~]# 

4.6.2 添加启动文件

将 cri-dockerd 服务交给systemd管理

cat << END > /etc/systemd/system/cri-dockerd.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
 
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.k8s.io/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
END
 
cat << END > /etc/systemd/system/cri-dockerd.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
END

4.6.3 加载配置

设置开启自启并启动服务

systemctl daemon-reload
systemctl enable cri-dockerd
systemctl start cri-dockerd
systemctl status cri-dockerd

5 部署kubernetes

这里前面已将kubernetes的yum仓库配置好了的,详见3.3.2章节。

5.1 安装各组件

安装kubeadm kubelet kubectl,所有节点都要执行。

yum -y install kubeadm kubelet kubectl

5.1.1 配置kubelet的cgroup

注意:只导入ipvs模块是不会自动生效的,还得手动指定使用ipvs模块,不然会自动用默认模块(所有节点部署)。

#vi /etc/sysconfig/kubelet 删掉原内容,改为如下配置:
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

cat << EOF > /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

5.1.2 设置kubelet开机自启

systemctl enable kubelet && systemctl restart kubelet
systemctl status kubelet

5.1.3 在所有节点上获取镜像信息

kubeadm config images list

5.1.4 修改镜像地址

在所有点上获取镜像,拉取阿里的镜像源、将阿里的镜像源打标签,标记为k8s的镜像,再删除阿里的镜像源(下载大概需要1-2分钟).

cat << END > pull_images.sh
#!/usr/bin/bash  
images=$(kubeadm config images list --kubernetes-version=1.28.9 | awk -F'/' '{print $NF}')
for imageName in ${images[@]};do
	docker pull registry.aliyuncs.com/google_containers/$imageName
	docker tag registry.aliyuncs.com/google_containers/$imageName registry.k8s.io/$imageName
	docker rmi registry.aliyuncs.com/google_containers/$imageName 
done
END

所有节点执行脚本 /usr/bin/sh -x pull_images.sh

执行完脚本,在处理这个组件,因其路径比较特殊,通过脚本是pull取不到正确路径的,需要单独处理,所有节点执行以下命令即可。

docker tag registry.k8s.io/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1
docker rmi registry.k8s.io/coredns:v1.10.1
[root@k8s-master01 ~]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
registry.k8s.io/kube-apiserver            v1.28.2   cdcab12b2dd1   7 months ago    126MB
registry.k8s.io/kube-controller-manager   v1.28.2   55f13c92defb   7 months ago    122MB
registry.k8s.io/kube-scheduler            v1.28.2   7a5d9d67a13f   7 months ago    60.1MB
registry.k8s.io/kube-proxy                v1.28.2   c120fed2beb8   7 months ago    73.1MB
registry.k8s.io/etcd                      3.5.9-0   73deb9a3f702   11 months ago   294MB
registry.k8s.io/coredns/coredns           v1.10.1   ead0a4a53df8   15 months ago   53.6MB
registry.k8s.io/pause                     3.9       e6f181688397   19 months ago   744kB
[root@k8s-master01 ~]#

[root@k8s-slave01 ~]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
calico/cni                                v3.27.3   6527a3558140   5 weeks ago     196MB
registry.k8s.io/kube-apiserver            v1.28.2   cdcab12b2dd1   7 months ago    126MB
registry.k8s.io/kube-controller-manager   v1.28.2   55f13c92defb   7 months ago    122MB
registry.k8s.io/kube-scheduler            v1.28.2   7a5d9d67a13f   7 months ago    60.1MB
registry.k8s.io/kube-proxy                v1.28.2   c120fed2beb8   7 months ago    73.1MB
registry.k8s.io/etcd                      3.5.9-0   73deb9a3f702   11 months ago   294MB
registry.k8s.io/coredns/coredns           v1.10.1   ead0a4a53df8   15 months ago   53.6MB
registry.k8s.io/pause                     3.9       e6f181688397   19 months ago   744kB
[root@k8s-slave01 ~]# 

[root@k8s-slave02 ~]# docker images
REPOSITORY                                TAG       IMAGE ID       CREATED         SIZE
registry.k8s.io/kube-apiserver            v1.28.2   cdcab12b2dd1   7 months ago    126MB
registry.k8s.io/kube-controller-manager   v1.28.2   55f13c92defb   7 months ago    122MB
registry.k8s.io/kube-scheduler            v1.28.2   7a5d9d67a13f   7 months ago    60.1MB
registry.k8s.io/kube-proxy                v1.28.2   c120fed2beb8   7 months ago    73.1MB
registry.k8s.io/etcd                      3.5.9-0   73deb9a3f702   11 months ago   294MB
registry.k8s.io/coredns/coredns           v1.10.1   ead0a4a53df8   15 months ago   53.6MB
registry.k8s.io/pause                     3.9       e6f181688397   19 months ago   744kB
[root@k8s-slave02 ~]# 

这样 docker镜像地址修改成功,所有节点通过 docker images 查询结果就和 kubeadm config images list 查询保持一致啦。

5.1.5 修改kubelet的环境配置文件

原文件内容如下:

cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9"

修改成:

cat << EOF > /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --pod-infra-container-image=registry.k8s.io/pause:3.9"
EOF

重启服务:

systemctl restart docker
systemctl restart cri-dockerd
systemctl restart kubelet

服务重启完,就可以执行下一步骤,初始化kubernetes集群。

5.2 初始化master主节点

5.2.1 直接初始化

kubeadm init --kubernetes-version=1.28.2 \
--node-name=k8s-master01 \
--apiserver-advertise-address=192.168.1.6 \
--image-repository registry.k8s.io \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock --v=5

5.2.2 重置并初始化

如果第一次初始化报错了,或是节点迁移异常,需要重新初始化节点,可以使用该命令。

kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock && kubeadm init --kubernetes-version=1.28.2 \
--node-name=k8s-master01 \
--apiserver-advertise-address=192.168.1.6 \
--image-repository registry.k8s.io \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock --v=5

初始化注意事项:博友们初始化的时候,请注意自己pull的镜像路径哈,这里我的镜像路径拉取之后修改的路径是:registry.k8s.io 哦。

 初始化信息如下:

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/

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

kubeadm join 192.168.1.6:6443 --token lkh5a8.c7m3ikmzaptfkkvt \
--discovery-token-ca-cert-hash sha256:aea5c457ff23e691b4f22bc153ce2280a828c82b820846360a0854bb8638015a 
[root@k8s-master01 ~]# 

5.2.3 执行初始化后的命名

在主节点master01执行以下命令,设置配置文件并授权,让节点可以正常运行。

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

5.2.4 加入工作节点slave

在所有工作节点上执行以下命令。

#直接加入node
kubeadm join 192.168.1.6:6443 --token lkh5a8.c7m3ikmzaptfkkvt \
--discovery-token-ca-cert-hash sha256:aea5c457ff23e691b4f22bc153ce2280a828c82b820846360a0854bb8638015a \
--cri-socket=unix:///var/run/cri-dockerd.sock --v=5

#重置加入node
kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock && kubeadm join 192.168.1.6:6443 --token lkh5a8.c7m3ikmzaptfkkvt \
--discovery-token-ca-cert-hash sha256:aea5c457ff23e691b4f22bc153ce2280a828c82b820846360a0854bb8638015a \
--cri-socket=unix:///var/run/cri-dockerd.sock --v=5

5.2.5 查看工作节点加入情况

在主节点上执行以下命令。

[root@k8s-master01 ~]# kubectl get node
NAME           STATUS     ROLES           AGE     VERSION
k8s-master01   NotReady   control-plane   2m48s   v1.28.2
k8s-slave01    NotReady   <none>          23s     v1.28.2
k8s-slave02    NotReady   <none>          10s     v1.28.2
[root@k8s-master01 ~]# 

 设置kubectl命令可以在工作节点操作

scp -r $HOME/.kube 192.168.1.7:$HOME/
scp -r $HOME/.kube 192.168.1.8:$HOME/

至此kubeadm命令工作完成,kubectl命令开始工作。

5.3 安装calico网络插件

5.3.1 修改配置

只在master节点操作即可。

# 下载calico.yaml
wget --no-check-certificat https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml

官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-nodemesh。

解决方法
vim calico.yaml
:/CLUSTER_TYPE

CLUSTER_TYPE下面添加:interface=ens32 主节点的网卡名称。

- name: IP_AUTODETECTION_METHOD
  value: "interface=ens32" 

5.3.2 下载calico镜像

查看镜像依赖情况

[root@k8s-master01 ~]# cat calico-v3.27.3.yaml|grep image|uniq
          image: docker.io/calico/cni:v3.27.3
          imagePullPolicy: IfNotPresent
          image: docker.io/calico/node:v3.27.3
          imagePullPolicy: IfNotPresent
          image: docker.io/calico/kube-controllers:v3.27.3
          imagePullPolicy: IfNotPresent
[root@k8s-master01 ~]#

根据配置文件中所需,需要下载上面这三个镜像

下载命令如下:

docker pull docker.io/calico/cni:v3.27.3
docker pull docker.io/calico/node:v3.27.3
docker pull docker.io/calico/kube-controllers:v3.27.3

检查镜像下载完成情况

镜像下载完成。

5.3.3 执行安装命令

kubectl apply -f calico-v3.27.3.yaml

5.3.4 查看执行过程

[root@k8s-master01 ~]# kubectl apply -f calico-v3.27.3.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
serviceaccount/calico-cni-plugin created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
[root@k8s-master01 ~]# 

5.3.5 验证 calico网络插件

kubectl get nodes
kubectl get pod -n kube-system

[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS   ROLES           AGE    VERSION
k8s-master01   Ready    control-plane   131m   v1.28.2
k8s-slave01    Ready    <none>          130m   v1.28.2
k8s-slave02    Ready    <none>          129m   v1.28.2
#STATUS 状态显示为Ready,说明所有节点的calico网络已经覆盖成功,pod之间互相通信。
[root@k8s-master01 ~]# 
[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-787f445f84-vzqfz   1/1     Running   0          2m2s
calico-node-cf72t                          1/1     Running   0          2m2s
calico-node-pmx6j                          1/1     Running   0          2m2s
calico-node-r4b2c                          1/1     Running   0          2m2s
coredns-5dd5756b68-qjrfj                   1/1     Running   0          132m
coredns-5dd5756b68-sdhg8                   1/1     Running   0          132m
etcd-k8s-master01                          1/1     Running   0          132m
kube-apiserver-k8s-master01                1/1     Running   0          132m
kube-controller-manager-k8s-master01       1/1     Running   0          132m
kube-proxy-dbmtl                           1/1     Running   0          49m
kube-proxy-hhw9p                           1/1     Running   0          132m
kube-proxy-jbs8w                           1/1     Running   0          48m
kube-scheduler-k8s-master01                1/1     Running   0          132m
[root@k8s-master01 ~]# 

 

5.3.6 部署总结

到此kubernetes分布式集群在线部署圆满成功,其中遇到一些报错,只要大家注意文章中的(注意事项)部分参考部署即可跳雷,后续更新发布的文档是功能验证、镜像仓库管理等等部分案例测试分享,不足之处,还望博友们赐教,感谢博友们的指导和支持。

posted @ 2024-05-11 03:30  易知乐  阅读(90)  评论(0编辑  收藏  举报