kubernetes 集群搭建(kubeadm 方式)

目前生产部署 Kubernetes 集群主要有两种方式:

(1) kubeadm

Kubeadm 是一个 Kubernetes 官方提供的命令行工具,可以用来部署和管理 Kubernetes 集群。它主要用于在新的 Kubernetes 环境中初始化集群、添加或删除节点等操作。

Kubeadm 提供了一种简单、可靠和可重复的方法来设置 Kubernetes 集群。使用 kubeadm 部署集群不需要任何特殊的配置,只需提供一组 IP 地址,即可按需创建 Master 节点和 Worker 节点,并自动安装所有必需的 Kubernetes 组件。

Kubeadm 支持各种 Kubernetes 部署方案,包括单节点、多节点以及高可用性 HA 部署。它还支持多种操作系统和容器运行时,如 Docker 和 CRI-O 等。

官方地址: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

(2) 二进制包

从 github 下载发行版的二进制包, 手动部署每个组件, 组成 Kubernetes 集群。

Kubeadm 降低部署门槛, 但屏蔽了很多细节, 遇到问题很难排查。 如果想更容易可控, 推荐使用二进制包部署 Kubernetes 集群, 虽然手动部署麻烦点, 期间可以学习很多工作原理, 也利于后期维护。

kubeadm 部署方式介绍

kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具, 这个工具能通过两条指令完成一个 kubernetes 集群的部署:

第一、 创建一个 Master 节点 kubeadm init

第二, 将 Node 节点加入到当前集群中: kubeadm join

安装要求

部署 Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器, 操作系统 CentOS7.x-86_x64
  • 硬件配置: 2GB 或更多 RAM, 2 个 CPU 或更多 CPU, 硬盘 30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网, 需要拉取镜像
  • 禁止 swap 分区

最终实现

  1. 在所有节点上安装 Docker 和 kubeadm
  2. 部署 Kubernetes Master
  3. 部署容器网络插件(flannel)
  4. 部署 Kubernetes Node, 将节点加入 Kubernetes 集群中
  5. 部署 Kuboard页面, 可视化查看 Kubernetes 资源

准备环境

实现单master节点集群搭建

image-20230731205910840

安装三个linux系统

image-20230731205921215

角色 IP
k8s-master 192.168.122.140
k8s-node1 192.168.122.141
k8s-node2 192.168.122.142

系统准备操作

该部分是针对三个linux系统的操作

一次操纵多个会话连接同时执行某命令的方法

“查看”——>“撰写”——>“撰写栏”(条框形式)或者“撰写窗格”。

image-20230731210509811

撰写栏”默认是将我们输入的命令仅发送到当前的选项卡中,如需一次性同时在多个会话中执行,点击空白框左侧的蓝色小图标,然后如下图所示选中第三个“全部会话”即可。

image-20230731210522114

image-20230731210530547

image-20230731210541506

1.关闭防火墙:

防火墙会对网络数据包进行过滤和屏蔽,可能会影响 Kubernetes 集群节点之间的通信。同时,Kubernetes 本身有较为完善的网络策略机制,可以保证集群的网络安全,因此关闭防火墙并不会对 Kubernetes 集群的安全造成影响。

停止并禁用防火墙服务

systemctl stop firewalld

systemctl disable firewalld

image-20230731210610267

2.关闭 selinux:

在 Kubernetes 集群中,SELinux 是一个可选的安全模块,它提供了强制访问控制和访问审计功能。但是在搭建 Kubernetes 集群时,为了简化配置和避免可能的问题,很多管理员选择将 SELinux 关闭。这主要是因为:

  1. SELinux 对于容器的访问控制较为严格,可能会导致一些应用程序无法正常工作或无法访问必要的资源。
  2. 在某些情况下,SELinux 的规则并不能很好地适应 Kubernetes 集群的安装配置,这可能会导致一些问题和错误。
  3. 关闭 SELinux 可以简化配置和管理工作,使得集群的部署和维护更加便捷。但是关闭 SELinux 也会降低集群的安全性和可靠性,必须在必要的时候重新启用 SELinux。

因此,关闭 SELinux 可以使 Kubernetes 集群的部署更加简单和可靠,但也会降低集群的安全性和可靠性。在实际应用中,需要根据具体情况来确定是否需要开启或关闭 SELinux。

sed -i ‘s/enforcing/disabled/’ /etc/selinux/config # 永久

setenforce 0 # 临时

image-20230731210636761

3.关闭 swap:

Kubernetes 使用了 cgroup 管理容器资源。而 swap 分区可能会阻止容器使用预期的内存资源,并且可能导致应用程序在容器内部崩溃或出现其他问题。

Kubernetes 本身不会使用 swap,同时,因为容器的使用和交换内存的机制不同,如果应用程序需要使用大量内存时,容器会自动申请更多的内存,而不是使用 swap,避免了性能的损失和不可预测的行为。关闭 swap 分区可以更好地保护 Kubernetes 集群的稳定性和性能,确保容器的内存使用与性能表现的一致性。

swapoff -a # 临时

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

image-20230731210701999

4.根据规划设置主机名:

在kubernetes集群中,节点的主机名是一个很重要的标识,它被用来唯一标识集群中的每个节点。设置正确的主机名可以方便管理和诊断集群中的问题。

hostnamectl set-hostname

image-20230731210726680

image-20230731210732553

image-20230731210738904

5.在 master节点中 添加 hosts:

在 Master 节点中添加 hosts 项,可以将每个节点的 IP 地址和主机名映射到 /etc/hosts 文件中,以便各个节点之间能够相互识别和访问。这样做可以使 Kubernetes 集群中的各个节点之间更加稳定和可靠,并且能够更快地发现新加入的节点。

cat >> /etc/hosts << EOF

192.168.122.140 master

192.168.122.141 node1

192.168.122.142 node2

EOF

在这里插入图片描述

6将桥接的 IPv4 流量传递到 iptables 的链:

在 Kubernetes 集群中,每个 Pod 都会被分配一个 IP 地址,Pod 内的容器也会被分配一个虚拟网卡和 IP 地址。当两个 Pod 之间需要通信时,它们使用这些 IP 地址进行通信。

然而,当 Pod 内的容器尝试与另一个 Pod 进行通信时,它们不会使用其 IP 地址直接发送数据包,而是会使用桥接的方式进行通信。这意味着数据包将通过 Linux 内核中的桥接设备进行传输,而不是通过网络接口发送。

为了确保这些桥接的数据包能够被正确地路由和转发,需要将它们传递到 iptables 的链中进行处理。Iptables 可以用于定义网络规则,使数据包能够正确路由到目的地。通过将桥接的 IPv4 流量传递到 iptables 的链中,可以确保 Kubernetes 集群中的 Pod 能够正确地通信,并且可以实现一些高级的网络功能,如网络策略和负载均衡等。

cat > /etc/sysctl.d/k8s.conf << EOF

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

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

EOF

image-20230731210838770

sysctl --system # 生效

image-20230731210850788

7.时间同步:

Kubernetes 集群中的各个节点需要相互通信进行协作,因此需要保证它们的时间是同步的,以确保它们在进行计划和调度时能够准确地协调工作。如果节点的时间不同步,则可能会出现以下问题:

  1. 容器运行情况出现不可预测的错误。
  2. 调度器无法准确计算任务的完成时间,导致任务超时或者在不合适的节点上进行调度。
  3. 监控和日志收集系统可能会出现时间不对齐的情况,导致数据分析的结果不准确。

因此,为了保证集群的正常运行,需要在集群中的各个节点上同步时间。

yum install ntpdate -y

ntpdate time.windows.com

image-20230731210918895

注配置完以上命令最好重启linux,确保配置生效

所有节点安装 Docker/kubeadm/kubelet

Kubernetes 默认 CRI( 容器运行时) 为 Docker, 因此节点上安装 Docker。

( 1) 安装 Docker

安装wget命令

yum install wget

将Docker的yum源配置文件从阿里云镜像站下载到本地,并替换掉原来的配置文件。其中/etc/yum.repos.d/docker-ce.repo是Docker的yum源配置文件的默认位置。

-O参数表示将下载的文件重命名为指定文件名,这里为docker-ce.repo。

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo

安装 Docker CE -y 表示自动回答 yes。

yum -y install docker-ce

设置默认启动并启动docker

systemctl enable docker && systemctl start docker

查看docker版本

docker --version

image-20230731211131936

tips:Kubernetes集群中Kubernetes的版本指定为1.18.0,。

Kubernetes 1.18.0版本兼容的Docker版本范围为Docker 1.13.1至Docker 19.03.x。建议使用Docker 18.09.x或19.03.x版本的最新修订版,以获得最佳性能和安全性。

当前使用的Docker版本为18.06.1-ce,Docker 18.06.1-ce作为长期支持版本,也是可以作为选择的。

( 2) 添加阿里云 YUM 软件源

设置镜像加速器地址

指定了一个用于加速Docker镜像下载的阿里云镜像站点的地址,这样当 Docker 镜像下载时就会优先从镜像站点下载,并且下载速度会更快。

image-20230731211208054

cat > /etc/docker/daemon.json << EOF

{

“registry-mirrors”: [“https://vpmkvcwz.mirror.aliyuncs.com”]

}

EOF

image-20230731211226208

重启docker

systemctl restart docker

添加 yum 源

将 Kubernetes 的 YUM 仓库添加到 CentOS 7 的 YUM 仓库列表中,以便在 CentOS 7 上可以使用 YUM 命令安装 Kubernetes 相关软件包。

其中,baseurl 指定了阿里云提供的 Kubernetes 仓库地址,gpgcheck 为 0 表示不进行 GPG 检查,可以省略 GPG 密钥的导入。

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

image-20230731211320811

( 3) 安装 kubeadm, kubelet 和 kubectl

通常情况下,Kubeadm,Kubelet和Kubectl版本需要和Kubernetes Master和Node节点上的Kubernetes版本保持一致。为了避免版本兼容问题,我们建议在安装Kubernetes之前,先查看官方文档中所列的版本兼容关系,并根据官方推荐的Docker版本进行设置。

这里指定版本1.18.0

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

设置开机启动

systemctl enable kubelet

image-20230731211407584

部署 Kubernetes Master

( 1) 在 192.168.122.140( Master) 执行

创建一个Kubernetes集群,并配置网络相关的参数。

kubeadm init \

–apiserver-advertise-address=192.168.122.140 \

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

–kubernetes-version v1.18.0 \

–service-cidr=10.96.0.0/12 \

–pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问, 这里指定阿里云镜像仓库地址。

  • –apiserver-advertise-address:指定Kubernetes API服务器的地址,这里是192.168.122.140。
  • –image-repository:指定要使用的容器镜像仓库,这里是阿里云的镜像仓库。
  • –kubernetes-version:指定要安装的Kubernetes版本号,这里是v1.18.0。
  • –service-cidr:指定服务的IP地址段,这里是10.96.0.0/12。
  • –pod-network-cidr:指定Pod网络的IP地址段,这里是10.244.0.0/16。

相关错误

1.内存或处理器设置:

master内存或处理器达不到最低配置会报错。

ERROR: [preflight] Some fatal errors occurred: 
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR Mem]: the system RAM (996637696) is less than the minimum 1700 MB

image-20230731211526803

2.如提示版本不对

ERROR KubeletVersion]: the kubelet version is higher than the control plane version. This is not a supported version skew and may lead to a malfunctional cluster. Kubelet version: "1.18.0" Control plane version: "1.17.0"

请使用对应版本即可

3.如果在执行的过程中出现以下错误:

[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=... To see the stack trace of this error execute with --v=5 or higher

执行

echo “1” >/proc/sys/net/bridge/bridge-nf-call-iptables

4.其它问题参考

https://blog.csdn.net/weixin_46560589/article/details/127459973

执行结果:

[root@master system]# kubeadm init \
>  --apiserver-advertise-address=192.168.122.140 \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.18.0 \
> --service-cidr=10.96.0.0/12 \
> --pod-network-cidr=10.244.0.0/16
W0715 23:30:23.712998   17728 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.0
[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
    [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 24.0.4. Latest validated version: 19.03
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.122.140]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [master localhost] and IPs [192.168.122.140 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [master localhost] and IPs [192.168.122.140 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W0715 23:30:25.930910   17728 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0715 23:30:25.932568   17728 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 15.002498 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.18" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: l87fc4.tcsjfloxy25678lz
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

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.122.140:6443 --token l87fc4.tcsjfloxy25678lz \
    --discovery-token-ca-cert-hash sha256:7690705ab1c2242036b0bd25c025d597fda79f509a036f68abee2991ef212173 

Your Kubernetes control-plane has initialized successfully! Kubernetes集群部署成功。

创建成功,查看拉取的镜像

image-20230731214312002

(2) 使用 kubectl 工具

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

mkdir -p $HOME/.kube创建一个名为 .kube 的目录,该目录用于存储 Kubernetes 集群配置文件。

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config:将 Kubernetes 集群管理员配置文件复制到 $HOME/.kube/config 文件中。这个文件是 Kubernetes 命令行工具 kubectl 使用的配置文件。

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

:将 $HOME/.kube/config 文件的所有权分配给当前用户和用户组,以确保用户可以修改该文件。

获取当前Kubernetes集群中的所有节点。它将返回每个节点的名称、状态、IP地址和版本信息等。

kubectl get nodes

image-20230731214356365

NotReady:Kubernetes集群节点状态为未就绪或不可用。因为此时集群中还未加入节点

若提示:

Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

rm -rf $HOME/.kube命令 重新执行之前的命令

加入 Kubernetes Node

1) 在 192.168.122.141( Node) 执行向集群添加新节点, 执行 kubeadm join 命令:

在Master 执行kubeadm init命令行最后部分已经给出该命令需要的token,复制即可:

将node节点加入到 Kubernetes 集群中

kubeadm join 192.168.122.140:6443 --token l87fc4.tcsjfloxy25678lz \
    --discovery-token-ca-cert-hash sha256:7690705ab1c2242036b0bd25c025d597fda79f509a036f68abee2991ef212173

image-20230731214503750

~~版本不对应报错重装版本~~

Docker版本不小心升级至24.0.4,将Docker卸载重新安装即可

image-20230731214527420

再次查看节点 两个worker node节点已经加入集群,但是状态还是NotReady,是因为还没有安装网络组件

image-20230731214538229

安装 Pod 网络插件( CNI)

常用的pod网络插件:

  • Flannel: 使用 Linux 内核中的 VXLAN 模块为每个 Pod 创建一个虚拟网络。
  • Calico: 可以提供高级网络策略和安全性。
  • Weave Net: 轻量级网络插件,可以轻松管理网络。
  • Cilium: 支持多种网络通信模型和高级网络策略。

这里选择flannel,部署flannel网络插件能让pod网络直接通信,不需要经过转发

image-20230731214559540

这个命令会应用一个YAML文件,该文件包含了flannel网络插件的部署和配置。该插件可以用于在Kubernetes集群中创建 overlay 网络,,它可以在不同的计算机、容器或虚拟机之间创建一个逻辑网络,使它们可以像在同一个物理网络中一样相互通信。这使得不同节点上的Pod可以通过内部IP地址相互通信。使用这个命令来部署flannel,你需要确保你已经安装了kubectl和一个运行着Kubernetes的集群。

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

确保能够访问到 flannel.io 这个 registery。 因为该命令会从 flannel.io registry 中下载 kube-flannel.yml 文件,并在 Kubernetes 集群中部署 flannel 网络插件。如果无法访问 flannel.io registry,该命令将执行失败。

如果 Pod 镜像下载失败, 可以修改镜像地址

报错:

The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?

查到网站对应的ip raw.githubusercontent.com 185.199.109.133

vim /etc/hosts

加入到hosts中,再次执行kubectl apply命令

image-20230731214659541

节点已经启动

image-20230731214709308

pod网络插件安装完后,hosts的配置可以删除。

测试 kubernetes 集群

在 Kubernetes 集群中创建一个 pod, 验证是否正常运行:

测试下载一个nginx

使用指定的nginx镜像创建一个名为“nginx”的部署(Deployment)

kubectl create deployment nginx --image=nginx

是将名为"nginx"的Deployment暴露在集群的NodePort上,使得可以通过节点的IP地址和指定的NodePort访问到该Deployment服务。

kubectl expose deployment nginx --port=80 --type=NodePort

–port=80 指定 Service 监听端口为 80,这是服务的公开端口。

–type=NodePort 指定 Service 类型为 NodePort,这意味着 Service 将在每个节点上公开一个随机端口来公开服务。

kubectl get pod,svc

列出集群中所有的Pod并显示它们的状态。

列出所有的Service并显示它们的状态

image-20230731214809164

上半部分是Pod的状态

下半部分是Service的状态

访问地址: http://NodeIP:Port,可以看到对外暴露端口port:31132

在集群中任意节点都能访问成功该地址

比如使用192.168.122.140进行访问

image-20230731214827824

使用192.168.122.141进行访问

image-20230731214837033

使用192.168.122.142进行访问

image-20230731214845725

部署Kuboard可视化模块

​ 官网:https://kuboard.cn/

  • 开源地址:https://github.com/eip-work/kuboard-press
  • Kuboard 可以使用内建用户库、gitlab / github 单点登录或者 LDAP 用户库进行认证,避免管理员将 ServiceAccount 的 Token 分发给普通用户而造成的麻烦。使用内建用户库时,管理员可以配置用户的密码策略、密码过期时间等安全设置。
  • 管理员可以将多个 Kubernetes 集群导入到 Kuboard 中,并且通过权限控制,将不同集群/名称空间的权限分配给指定的用户或用户组。
  • 在 Kuboard 的名称空间概要页中,以经典的微服务分层方式将工作负载划分到不同的分层,更加直观地展示微服务架构的结构,并且可以为每一个名称空间自定义名称空间布局。
  • Kuboard 中将 Deployment 的历史版本、所属的 Pod 列表、Pod 的关联事件、容器信息合理地组织在同一个页面中,可以帮助用户最快速的诊断问题和执行各种相关操作。
  • Kuboard 提供了图形化的工作负载编辑界面,用户无需陷入繁琐的 YAML 文件细节中,即可轻松完成对容器的编排任务。支持的 Kubernetes 对象类型包括:Node、Namespace、Deployment、StatefulSet、DaemonSet、Secret、ConfigMap、Service、Ingress、StorageClass、PersistentVolumeClaim、LimitRange、ResourceQuota、ServiceAccount、Role、RoleBinding、ClusterRole、ClusterRoleBinding、CustomResourceDefinition、CustomResource 等各类常用 Kubernetes 对象。
  • 在 Kuboard 中,可以方便地对接 NFS、CephFS 等常用存储类型,并且支持对 CephFS 类型的存储卷声明执行扩容和快照操作。

1.检查Kuboard是否已安装。如果未安装,请使用以下命令将其安装:

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

image-20230731214939803

2.等待kuboard启动并运行。可以使用以下命令检查

kubectl get pods,svc -n kuboard

image-20230731214954102

kuboard-v3.yaml

---
apiVersion: v1
kind: Namespace
metadata:
  name: kuboard

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kuboard-v3-config
  namespace: kuboard
data:
  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-built-in.html
  # [common]
  KUBOARD_SERVER_NODE_PORT: '30080'
  KUBOARD_AGENT_SERVER_UDP_PORT: '30081'
  KUBOARD_AGENT_SERVER_TCP_PORT: '30081'
  KUBOARD_SERVER_LOGRUS_LEVEL: info  # error / debug / trace
  # KUBOARD_AGENT_KEY 是 Agent 与 Kuboard 通信时的密钥,请修改为一个任意的包含字母、数字的32位字符串,此密钥变更后,需要删除 Kuboard Agent 重新导入。
  KUBOARD_AGENT_KEY: 32b7d6572c6255211b4eec9009e4a816
  KUBOARD_AGENT_IMAG: eipwork/kuboard-agent
  KUBOARD_QUESTDB_IMAGE: questdb/questdb:6.0.5
  KUBOARD_DISABLE_AUDIT: 'false' # 如果要禁用 Kuboard 审计功能,将此参数的值设置为 'true',必须带引号。

  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-gitlab.html
  # [gitlab login]
  # KUBOARD_LOGIN_TYPE: "gitlab"
  # KUBOARD_ROOT_USER: "your-user-name-in-gitlab"
  # GITLAB_BASE_URL: "http://gitlab.mycompany.com"
  # GITLAB_APPLICATION_ID: "7c10882aa46810a0402d17c66103894ac5e43d6130b81c17f7f2d8ae182040b5"
  # GITLAB_CLIENT_SECRET: "77c149bd3a4b6870bffa1a1afaf37cba28a1817f4cf518699065f5a8fe958889"
  
  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-github.html
  # [github login]
  # KUBOARD_LOGIN_TYPE: "github"
  # KUBOARD_ROOT_USER: "your-user-name-in-github"
  # GITHUB_CLIENT_ID: "17577d45e4de7dad88e0"
  # GITHUB_CLIENT_SECRET: "ff738553a8c7e9ad39569c8d02c1d85ec19115a7"

  # 关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-ldap.html
  # [ldap login]
  # KUBOARD_LOGIN_TYPE: "ldap"
  # KUBOARD_ROOT_USER: "your-user-name-in-ldap"
  # LDAP_HOST: "ldap-ip-address:389"
  # LDAP_BIND_DN: "cn=admin,dc=example,dc=org"
  # LDAP_BIND_PASSWORD: "admin"
  # LDAP_BASE_DN: "dc=example,dc=org"
  # LDAP_FILTER: "(objectClass=posixAccount)"
  # LDAP_ID_ATTRIBUTE: "uid"
  # LDAP_USER_NAME_ATTRIBUTE: "uid"
  # LDAP_EMAIL_ATTRIBUTE: "mail"
  # LDAP_DISPLAY_NAME_ATTRIBUTE: "cn"
  # LDAP_GROUP_SEARCH_BASE_DN: "dc=example,dc=org"
  # LDAP_GROUP_SEARCH_FILTER: "(objectClass=posixGroup)"
  # LDAP_USER_MACHER_USER_ATTRIBUTE: "gidNumber"
  # LDAP_USER_MACHER_GROUP_ATTRIBUTE: "gidNumber"
  # LDAP_GROUP_NAME_ATTRIBUTE: "cn"

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kuboard-boostrap
  namespace: kuboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kuboard-boostrap-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kuboard-boostrap
  namespace: kuboard

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    k8s.kuboard.cn/name: kuboard-etcd
  name: kuboard-etcd
  namespace: kuboard
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s.kuboard.cn/name: kuboard-etcd
  template:
    metadata:
      labels:
        k8s.kuboard.cn/name: kuboard-etcd
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: node-role.kubernetes.io/master
                    operator: Exists
              - matchExpressions:
                  - key: node-role.kubernetes.io/control-plane
                    operator: Exists
              - matchExpressions:
                  - key: k8s.kuboard.cn/role
                    operator: In
                    values:
                      - etcd
      containers:
        - env:
            - name: HOSTNAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
            - name: HOSTIP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
          image: 'eipwork/etcd-host:3.4.16-2'
          imagePullPolicy: Always
          name: etcd
          ports:
            - containerPort: 2381
              hostPort: 2381
              name: server
              protocol: TCP
            - containerPort: 2382
              hostPort: 2382
              name: peer
              protocol: TCP
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /health
              port: 2381
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          volumeMounts:
            - mountPath: /data
              name: data
      dnsPolicy: ClusterFirst
      hostNetwork: true
      restartPolicy: Always
      serviceAccount: kuboard-boostrap
      serviceAccountName: kuboard-boostrap
      tolerations:
        - key: node-role.kubernetes.io/master
          operator: Exists
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
      volumes:
        - hostPath:
            path: /usr/share/kuboard/etcd
          name: data
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 1
    type: RollingUpdate


---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {
    
    }
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s.kuboard.cn/name: kuboard-v3
  template:
    metadata:
      labels:
        k8s.kuboard.cn/name: kuboard-v3
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - preference:
                matchExpressions:
                  - key: node-role.kubernetes.io/master
                    operator: Exists
              weight: 100
            - preference:
                matchExpressions:
                  - key: node-role.kubernetes.io/control-plane
                    operator: Exists
              weight: 100
      containers:
        - env:
            - name: HOSTIP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
            - name: HOSTNAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
          envFrom:
            - configMapRef:
                name: kuboard-v3-config
          image: 'eipwork/kuboard:v3'
          imagePullPolicy: Always
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /kuboard-resources/version.json
              port: 80
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          name: kuboard
          ports:
            - containerPort: 80
              name: web
              protocol: TCP
            - containerPort: 443
              name: https
              protocol: TCP
            - containerPort: 10081
              name: peer
              protocol: TCP
            - containerPort: 10081
              name: peer-u
              protocol: UDP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /kuboard-resources/version.json
              port: 80
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          resources: {
    
    }
          # startupProbe:
          #   failureThreshold: 20
          #   httpGet:
          #     path: /kuboard-resources/version.json
          #     port: 80
          #     scheme: HTTP
          #   initialDelaySeconds: 5
          #   periodSeconds: 10
          #   successThreshold: 1
          #   timeoutSeconds: 1
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      serviceAccount: kuboard-boostrap
      serviceAccountName: kuboard-boostrap
      tolerations:
        - key: node-role.kubernetes.io/master
          operator: Exists

---
apiVersion: v1
kind: Service
metadata:
  annotations: {
    
    }
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
spec:
  ports:
    - name: web
      nodePort: 30080
      port: 80
      protocol: TCP
      targetPort: 80
    - name: tcp
      nodePort: 30081
      port: 10081
      protocol: TCP
      targetPort: 10081
    - name: udp
      nodePort: 30081
      port: 10081
      protocol: UDP
      targetPort: 10081
  selector:
    k8s.kuboard.cn/name: kuboard-v3
  sessionAffinity: None
  type: NodePort

显示web对外暴露30080

访问 Kuboard

image-20230731215035349

  • 输入初始用户名和密码,并登录

用户名: admin

密码: Kuboard123

image-20230731215050294

集群信息

image-20230731215059156

点击default集群,选择访问集群使用的角色 这里直接使用admin

image-20230731215108955

集群导入信息

image-20230731215118097

概要

image-20230731215126837

查看节点

image-20230731215135221

查看master节点

image-20230731215143943

猜你喜欢

转载自blog.csdn.net/m0_37450089/article/details/132031373