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