您的位置:首页 > 科技 > IT业 > Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

2024/11/16 4:53:28 来源:https://blog.csdn.net/Lzcsfg/article/details/141172806  浏览:    关键词:Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

目录

Kubernetes介绍

Kubernetes具备的功能

Kubernetes集群角色

Master管理节点组件

Node工作节点组件

非必须的集群插件

Kubernetes集群类型

Kubernetes集群规划

集群前期环境准备

开启Bridge网桥过滤

关闭SWAP交换分区

安装Containerd软件包

K8s集群部署方式

集群初始化

部署集群网络Calico

验证集群节点状态

部署Nginx测试集群

部署Kuboard v3


Kubernetes介绍

kubernetes(k8s)是2014年由Google公司基于Go语言编写的一款开源的容器集群编排系统,用于自动化容器的部署、扩缩容和管理;

kubernetes(k8s)是基于Google内部的Borg系统的特征开发的一个版本,集成了Borg系统大部分优势;

官方地址:Kubernetes

代码托管平台:https://github.com/Kubernetes

Kubernetes具备的功能

  • 自我修复:k8s可以监控容器的运行状况,并在发现容器出现异常时自动重启故障实例;
  • 弹性伸缩:k8s可以根据资源的使用情况自动地调整容器的副本数。例如,在高峰时段,k8s可以自动增加容器的副本数以应对更多的流量;而在低峰时段,k8s可以减少应用的副本数,节省资源;
  • 资源限额:k8s允许指定每个容器所需的CPU和内存资源,能够更好的管理容器的资源使用量;
  • 滚动升级:k8s可以在不中断服务的情况下滚动升级应用版本,确保在整个过程中仍有足够的实例在提供服务;
  • 负载均衡:k8s可以根据应用的负载情况自动分配流量,确保各个实例之间的负载均衡,避免某些实例过载导致的性能下降;
  • 服务发现:k8s可以自动发现应用的实例,并为它们分配一个统一的访问地址。这样,用户只需要知道这个统一的地址,就可以访问到应用的任意实例,而无需关心具体的实例信息;
  • 存储管理:k8s可以自动管理应用的存储资源,为应用提供持久化的数据存储。这样,在应用实例发生变化时,用户数据仍能保持一致,确保数据的持久性;
  • 密钥与配置管理:Kubernetes 允许你存储和管理敏感信息,例如:密码、令牌、证书、ssh密钥等信息进行统一管理,并共享给多个容器复用;

Kubernetes集群角色

k8s集群需要建⽴在多个节点上,将多个节点组建成一个集群,然后进⾏统⼀管理,但是在k8s集群内部,这些节点⼜被划分成了两类⻆⾊:

  • 一类⻆⾊为管理节点,叫Master,负责集群的所有管理工作;
  • ⼀类⻆⾊为⼯作节点,叫Node,负责运行集群中所有用户的容器应用 ;

Master管理节点组件

  • API Server:作为集群的管理入口,处理外部和内部通信,接收用户请求并处理集群内部组件之间的通信;
  • Scheduler:作为集群资源调度计算,根据调度策略,负责将待部署的 Pods 分配到合适的 Node 节点上;
  • Controller Manager:管理集群中的各种控制器,例如 Deployment、ReplicaSet、DaemonSet等,管理集群中的各种资源;
  • etcd:作为集群的数据存储,保存集群的配置信息和状态信息;

Node工作节点组件

  • Kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
  • 容器运行时(如 Docker、containerd 等):负责运行和管理容器,提供容器生命周期管理功能。例如:创建、更新、删除容器等;
  • Kube-proxy:负责为集群内的服务实现网络代理和负载均衡,确保服务的访问性;

非必须的集群插件

  • DNS服务:严格意义上的必须插件,在k8s中,很多功能都需要用到DNS服务,例如:服务发现、负载均衡、有状态应用的访问等;
  • Dashboard: 是k8s集群的Web管理界面;
  • 资源监控:例如metrics-server监视器,用于监控集群中资源利用率;

Kubernetes集群类型

  • 一主多从集群:由一台Master管理节点和多台Node工作节点组成,生产环境下Master节点存在单点故障的风险,适合学习和测试环境使用;
  • 多主多从集群:由多台Master管理节点和多Node工作节点组成,安全性高,适合生产环境使用;

Kubernetes集群规划

给这些虚拟机操作,关闭防火墙和selinux,进行时间同步。  

主机名

IP地址

角色

操作系统

硬件配置

master01

192.168.226.21

管理节点

Rocky 9.4mini

2CPU/4G内存/50G

node01

192.168.226.22

工作节点

Rocky 9.4mini

2CPU/4G内存/50G

node02

192.168.226.23

工作节点

Rocky 9.4mini

2CPU/4G内存/50G

集群前期环境准备

按照集群规划修改每个节点主机名

# 对192.168.226.21操作
hostnamectl set-hostname master01# 对192.168.226.22操作
hostnamectl set-hostname node01# 对192.168.226.23操作
hostnamectl set-hostname node02

配置本地域名解析,配置集群之间本地解析,集群在初始化时需要能够解析主机名,三台都要配

echo "192.168.226.21 master01" >> /etc/hosts
echo "192.168.226.22 node01" >> /etc/hosts
echo "192.168.226.23 node02" >> /etc/hosts

开启Bridge网桥过滤

本步骤三台主机都执行

bridge(桥接) 是 Linux 系统中的一种虚拟网络设备,它充当一个虚拟的交换机,为集群内的容器提供网络通信功能,容器就可以通过这个 bridge 与其他容器或外部网络通信了。

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

 参数解释:

net.bridge.bridge-nf-call-ip6tables = 1 //对网桥上的IPv6数据包通过iptables处理

net.bridge.bridge-nf-call-iptables = 1 //对网桥上的IPv4数据包通过iptables处理

net.ipv4.ip_forward = 1 //开启IPv4路由转发,来实现集群中的容器与外部网络的通信

由于开启bridge功能,需要加载br_netfilter模块来允许在bridge设备上的数据包经过iptables防火墙处理

modprobe br_netfilter && lsmod | grep br_netfilter

命令解释:

modprobe //命令可以加载内核模块

br_netfilter //模块模块允许在bridge设备上的数据包经过iptables防火墙处理

加载配置文件,使上述配置生效

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

关闭SWAP交换分区

本步骤三台主机都执行

为了保证 kubelet 正常工作,k8s强制要求禁用,否则集群初始化失败

临时关闭

swapoff -a

 永久关闭

sed -ri 's/.*swap.*/#&/' /etc/fstab

安装Containerd软件包

本步骤三台主机都执行

添加阿里云docker-ce仓库(containerd软件包在docker仓库)

dnf install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装containerd软件包

dnf install -y containerd.io-1.6.20-3.1.el9.x86_64

生成containerd配置文件

containerd config default | tee /etc/containerd/config.toml

启用Cgroup用于限制进程的资源使用量,如CPU、内存资源 

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
#...大约带153行左右[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://docker.rainbond.cc", "https://do.nark.eu.org", "https://dc.j8.work", "https://pilvpemn.mirror.aliyuncs.com", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn"]

指定contaienrd接口文件地址,在k8s环境中,kubelet通过 containerd.sock 文件与containerd进行通信

cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF

参数解释:

runtime-endpoint //指定了容器运行时的sock文件位置

image-endpoint //指定了容器镜像使用的sock文件位置

timeout //容器运行时或容器镜像服务之间的通信超时时间

debug //指定了crictl工具的调试模式,false表示调试模式未启用,true则会在输出中包含更多的调试日志信息,有助于故障排除和问题调试

启动containerd并设置随机自启 

systemctl enable containerd --now

K8s集群部署方式

kubernetes集群有多种部署方式,目前常用的部署方式有如下两种:

  • kubeadm部署方式:kubeadm是一个快速搭建kubernetes的集群工具;
  • 二进制包部署方式:从官网下载每个组件的二进制包,依次去安装,部署麻烦;
  • 其他方式:通过一些开源的工具搭建,例如:sealos;

配置kubeadm仓库,本实验使用阿里云YUM源

cat > /etc/yum.repos.d/k8s.repo <<EOF
[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
EOF

安装以下软件包:

  • 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控制组,用于限制进程的资源使用量,如CPU、内存

tee > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF

设置kubelet开机自启动即可,集群初始化后自动启动

systemctl enable kubelet

集群初始化

在master01节点查看集群所需镜像文件

[root@master01 ~]# kubeadm config images list
W0813 20:45:03.587714    2189 version.go:104] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://cdn.dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0813 20:45:03.587821    2189 version.go:105] falling back to the local client version: v1.28.2
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1

使用阿里云的源拉取镜像

ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.12
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1

改tag

ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.12 registry.k8s.io/kube-apiserver:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.12 registry.k8s.io/kube-controller-manager:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.12 registry.k8s.io/kube-scheduler:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.12 registry.k8s.io/kube-proxy:v1.28.12
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0
ctr image tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1

在master01节点生成初始化集群的配置文件

kubeadm config print init-defaults > kubeadm-config.yaml

其中配置文件需要修改如下内容

[root@master01 ~]# vim kubeadm-config.yaml
#本机的IP地址
advertiseAddress: 192.168.226.21#本机名称
name: master01#集群镜像下载地址,修改为阿里云
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

并通过配置文件初始化集群

kubeadm init --config kubeadm-config.yaml --upload-certs

选项说明:

init //初始化集群

--config //通过配置文件初始化

--upload-certs //初始化过程将生成证书,并将其上传到etcd存储中,以便后续节点的加入

提示:如果哪个节点出现问题,可以使用下列命令重置当前节点 

kubeadm reset --force

根据集群初始化后的提示,执行如下命令

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

根据提示将node节点加入集群,加入成功后在master节点验证

这个命令复制给node01和node02执行

# 这个密钥每次不一样,这里用你的密钥,复制本条命令给你执行无效
kubeadm join 192.168.226.21:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:966e2980933706623ab15179ff564ab39fd337dfd8524f72e404c2b6885be449 

如此就是加入成功了

[root@master01 ~]# kubectl get nodes
NAME       STATUS     ROLES           AGE     VERSION
master01   NotReady   control-plane   3m47s   v1.28.2
node01     NotReady   <none>          2m30s   v1.28.2
node02     NotReady   <none>          2m27s   v1.28.2

部署集群网络Calico

Calico 和 Flannel 是两种流行的 k8s 网络插件,它们都为集群中的 Pod 提供网络功能。然而,它们在实现方式和功能上有一些重要区别:

网络模型的区别:

  • Calico 使用 BGP(边界网关协议)作为其底层网络模型。它利用 BGP 为每个 Pod 分配一个唯一的 IP 地址,并在集群内部进行路由。Calico 支持网络策略,可以对流量进行精细控制,允许或拒绝特定的通信。
  • Flannel 则采用了一个简化的覆盖网络模型。它为每个节点分配一个 IP 地址子网,然后在这些子网之间建立覆盖网络。Flannel 将 Pod 的数据包封装到一个更大的网络数据包中,并在节点之间进行转发。Flannel 更注重简单和易用性,不提供与 Calico 类似的网络策略功能。

性能的区别:

  • 由于 Calico 使用 BGP 进行路由,其性能通常优于 Flannel。Calico 可以实现直接的 Pod 到 Pod 通信,而无需在节点之间进行额外的封装和解封装操作。这使得 Calico 在大型或高度动态的集群中具有更好的性能。
  • Flannel 的覆盖网络模型会导致额外的封装和解封装开销,从而影响网络性能。对于较小的集群或对性能要求不高的场景,这可能并不是一个严重的问题。

master01节点下载Calico文件

wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml

 注意:如果无法下载,就浏览器打开该网页直接复制网页内容粘贴到master01中即可。

创建calico网络

kubectl apply -f calico.yaml 

查看Calico Pod状态是否为Running
 需要耐心等会让其一个一个启动,系统配置够的话大概几分钟即可。

[root@master01 ~]# kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-9d57d8f49-4jg5h   1/1     Running   0          4m32s
calico-node-28lg6                         1/1     Running   0          4m32s
calico-node-4cd4d                         1/1     Running   0          4m32s
calico-node-x6rsk                         1/1     Running   0          4m32s
coredns-6554b8b87f-2828d                  1/1     Running   0          6m13s
coredns-6554b8b87f-nf2jc                  1/1     Running   0          6m13s
etcd-master01                             1/1     Running   1          6m17s
kube-apiserver-master01                   1/1     Running   1          6m18s
kube-controller-manager-master01          1/1     Running   1          6m17s
kube-proxy-8wdxg                          1/1     Running   0          5m18s
kube-proxy-hhf8n                          1/1     Running   0          6m13s
kube-proxy-krz76                          1/1     Running   0          5m14s
kube-scheduler-master01                   1/1     Running   1          6m17s

验证集群节点状态

在master01节点查看集群信息

[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
master01   Ready    control-plane   2m47s   v1.28.2
node01     Ready    <none>          104s    v1.28.2
node02     Ready    <none>          100s    v1.28.2

部署Nginx测试集群

NodePort 服务

在master01节点部署nginx程序测试

[root@master01 ~]# vim nginx-test.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.20.2ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: NodePortselector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80nodePort: 30002

nginx-test.yml 文件中定义的 Kubernetes 资源应用到集群中。 

kubectl apply -f nginx-test.yml

查看Pod状态是否为Running

[root@master01 ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          86s

查看Service代理信息

[root@master01 ~]# kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        16m
nginx-svc    NodePort    10.103.46.52   <none>        80:30002/TCP   115s

浏览器访问测试:http://192.168.226.21:30002/

部署Kuboard v3

新增一台虚拟机,关闭防火墙和selinux,进行时间同步。 

主机名

IP地址

角色

操作系统

硬件配置

localhost

192.168.226.24

web-ui

Rocky 9.4mini

2CPU/2G内存/20G

安装Docker并配置加速器

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start# Step 5:配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.rainbond.cc" ,"https://do.nark.eu.org","https://dc.j8.work","https://pilvpemn.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Kuboard v3官方文档:安装 Kuboard v3 - kubernetes | Kuboard

安装 Kuboard v3.x 版本的指令如下: 

sudo docker run -d \--restart=unless-stopped \--name=kuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT="http://192.168.226.21:80" \-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \-v /root/kuboard-data:/data \eipwork/kuboard:v3# 也可以使用镜像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,可以更快地完成镜像下载。# 请不要使用 127.0.0.1 或者 localhost 作为内网 IP \# Kuboard 不需要和 K8S 在同一个网段,Kuboard Agent 甚至可以通过代理访问 Kuboard Server \
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                COMMAND            CREATED          STATUS          PORTS                                                                                       NAMES
e2a4e5aefa79   eipwork/kuboard:v3   "/entrypoint.sh"   14 seconds ago   Up 14 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:10081->10081/tcp, :::10081->10081/tcp, 443/tcp   kuboard

 浏览器访问:http://192.168.226.24/

默认用户名:admin    初始化密码:Kuboard123

这里有个坑,如果这个IP地址和这个部署kuboard的IP不一致的话执行命令时,需要修改为当前页面的这个IP例如我这里就需要将尾号21的改为24的IP地址

并在执行后会下载一个文件kuboard-agent.yaml  将这个文件里的IP换成你部署kuboard的IP,否则是运行不成功的。

kuboard-agent.yaml

所以我需要复制这个命令如下,然后拿到master01主机执行。

然后执行成功后,查看状态

[root@master01 ~]# kubectl get pod -n kuboard
NAME                                      READY   STATUS    RESTARTS   AGE
kuboard-agent-echq2h-2-67bcfcb6f5-r5qjc   1/1     Running   0          10s
kuboard-agent-echq2h-9cc9cf87-dvmm5       1/1     Running   0          10s

这里运行后回到kuboard的页面查看

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com