kubernetes集群角色
k8s集群需要建⽴在多个节点上,将多个节点组建成一个集群,然后进⾏统⼀管理,但是在k8s集群内部,这些节点⼜被划分成了两类⻆⾊
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。
它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自 Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。:
- 一类⻆⾊为管理节点,叫Master/node,负责集群的所有管理工作;
- ⼀类⻆⾊为⼯作节点,叫work/node,负责运行集群中所有用户的容器应用 ;
Master管理节点组件
- API Server:作为集群的管理入口,处理外部和内部通信,接收用户请求并处理集群内部组件之间的通信;
- Scheduler:作为集群资源调度计算,根据调度策略,负责将待部署的 Pod 分配到合适的 Node 节点上;
- Controller Manager:管理集群中的各种控制器,例如 Deployment、ReplicaSet、DaemonSet等,管理集群中的各种资源;
- etcd:作为集群的数据存储,保存集群的配置信息和状态信息;
Node工作节点组件
- Kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
- 容器运行时(如 Docker、containerd 等):负责运行和管理容器,提供容器生命周期管理功能。例如:创建、更新、删除容器等;
- Kube-proxy:负责为集群内的服务实现网络代理和负载均衡,确保服务的访问性;
K8S集群插件
- DNS服务:严格意义上的必须插件,在k8s中,很多功能都需要用到DNS服务,例如:服务发现、负载均衡、有状态应用的访问等;
- Dashboard: 是k8s集群的Web管理界面(需消耗较多内存);
- 资源监控:例如metrics-server监视器,用于监控集群中资源利用率;
kubernetes集群类型
- 一主多从集群:由一台Master管理节点和多台Node工作节点组成,生产环境下Master节点存在单点故障的风险,适合学习和测试环境使用;
- 多主多从集群:由多台Master管理节点和多Node工作节点组成,安全性高,适合生产环境使用;
前期准备
kubernetes集群规划
主机名 | IP地址 | 角色 | 操作系统 | 硬件配置 |
master01 | 192.168.1.1 | 管理节点 | openEuler 24.03 | 4CPU/8G内存/100 |
node01 | 192.168.1.2 | 工作节点 | openEuler 24.03 | 4CPU/4G内存/50G |
node02 | 192.168.1.3 | 工作节点 | openEuler 24.03 | 4CPU/4G内存/50G |
关闭防火墙(每个节点都要)
systemctl stop firewalld && systemctl disable firewalld #关闭防火墙
setenforce 0 #临时关闭
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config #(永久关闭)
hostnamectl set-hostname 主机名 #(每台主机搜需要)
设置解析(每个节点都要)
echo "192.168.1.1 master
192.168.1.2 node01
192.168.1.3 node02" >> /etc/hosts #每台主机都需要
开启bridge网桥过滤(类似虚拟交换机,提供网络功能(每个节点都要))
vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
由于开启网桥功能,需要加载br_netfilter模块来允许在网桥设备上的数据包经过iptables防火墙处理(每个节点都要)
modprobe br_netfilter && lsmod | grep br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
关闭SWAP交换分区(每个节点都要)
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
配置源(可选,openEuler默认源可直接下载containerd(每个节点都要))
vi /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://mirrors.huaweicloud.com/docker-ce/linux/centos/9/\$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.huaweicloud.com/docker-ce/linux/centos/gpg
安装(每个节点都要)
dnf install -y containerd-1.6.22-16.oe2403sp1.x86_64
生成配置文件(每个节点都要)
containerd config default | tee /etc/containerd/config.toml
启用Cgroup用于限制进程的资源使用量(每个节点都要)
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
替换文件中pause镜像的下载地址为阿里云仓库(每个节点都要)
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
为Containerd配置镜像加速器,在文件中找(每个节点都要)到[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
,在下方添加镜像加速器
vim /etc/containerd/config.toml
#...
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://abde64ba3c6d4242b9d12854789018c6.mirror.swr.myhuaweicloud.com"]
启动containerd并设置随机自启(每个节点都要)
systemctl enable containerd --now
配置kubeadm仓库,本实验使用阿里云 YUM源(每个节点都要)
vi /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装以下软件包:
- kubeadm:用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;
- kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
- kubectl:用于管理k8集群的一个命令行工具;
安装软件,(每个节点都要安装)
yum -y install kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2
kubelet启用Cgroup控制组,用于限制进程的资源使用量(每个节点都要)
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置kubelet开机自启动即可,集群初始化后自动启动(每个节点都要)
systemctl enable kubelet
集群初始化
kubeadm config images list
#...以下是集群初始化所需的集群组件镜像
v1.27.1; falling back to: stable-1.23
k8s.gcr.io/kube-apiserver:v1.23.17
k8s.gcr.io/kube-controller-manager:v1.23.17
k8s.gcr.io/kube-scheduler:v1.23.17
k8s.gcr.io/kube-proxy:v1.23.17
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
在master01节点生成初始化集群的配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
配置文件需要修改如下内容
#管理节点的IP地址
advertiseAddress: 192.168.0.50
#本机注册到集群后的节点名称
name: master01
#集群镜像下载地址,修改为阿里云
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
通过配置文件初始化集群
kubeadm init --config kubeadm-config.yaml
根据集群初始化后的提示,执行如下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
根据提示将node节点加入集群,加入成功后在master节点验证,此时节点处于未就绪,因为没有网络
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane,master 3m31s v1.23.0
node01 NotReady <none> 12s v1.23.0
node02 NotReady <none> 89s v1.23.0
如果哪个节点出现问题,可以使用下列命令重置当前节点
kubeadm reset
Calico 使用 BGP (边界网关协议)进行路由,Calico 可以实现直接的 Pod 到 Pod 通信,而无需在节点之间进行额外的封装和解封装操作。这使得 Calico 在大型或高度动态的集群中具有更好的性能
部署集群网络Calico,只需在master节点部署pod网络
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
创建calico网络
kubectl apply -f calico.yaml
查看Calico Pod状态是否为Running
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-66966888c4-whdkj 1/1 Running 0 101s
calico-node-f4ghp 1/1 Running 0 101s
calico-node-sj88q 1/1 Running 0 101s
calico-node-vnj7f 1/1 Running 0 101s
calico-node-vwnw4 1/1 Running 0 101s
在master01节点查看集群信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 25m v1.23.0
node01 Ready <none> 25m v1.23.0
node02 Ready <none> 24m v1.23.0