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 分区
最终实现
- 在所有节点上安装 Docker 和 kubeadm
- 部署 Kubernetes Master
- 部署容器网络插件(flannel)
- 部署 Kubernetes Node, 将节点加入 Kubernetes 集群中
- 部署 Kuboard页面, 可视化查看 Kubernetes 资源
准备环境
实现单master节点集群搭建
安装三个linux系统
角色 | IP |
---|---|
k8s-master | 192.168.122.140 |
k8s-node1 | 192.168.122.141 |
k8s-node2 | 192.168.122.142 |
系统准备操作
该部分是针对三个linux系统的操作
一次操纵多个会话连接同时执行某命令的方法
“查看”——>“撰写”——>“撰写栏”(条框形式)或者“撰写窗格”。
撰写栏”默认是将我们输入的命令仅发送到当前的选项卡中,如需一次性同时在多个会话中执行,点击空白框左侧的蓝色小图标,然后如下图所示选中第三个“全部会话”即可。
或
1.关闭防火墙:
防火墙会对网络数据包进行过滤和屏蔽,可能会影响 Kubernetes 集群节点之间的通信。同时,Kubernetes 本身有较为完善的网络策略机制,可以保证集群的网络安全,因此关闭防火墙并不会对 Kubernetes 集群的安全造成影响。
停止并禁用防火墙服务
systemctl stop firewalld
systemctl disable firewalld
2.关闭 selinux:
在 Kubernetes 集群中,SELinux 是一个可选的安全模块,它提供了强制访问控制和访问审计功能。但是在搭建 Kubernetes 集群时,为了简化配置和避免可能的问题,很多管理员选择将 SELinux 关闭。这主要是因为:
- SELinux 对于容器的访问控制较为严格,可能会导致一些应用程序无法正常工作或无法访问必要的资源。
- 在某些情况下,SELinux 的规则并不能很好地适应 Kubernetes 集群的安装配置,这可能会导致一些问题和错误。
- 关闭 SELinux 可以简化配置和管理工作,使得集群的部署和维护更加便捷。但是关闭 SELinux 也会降低集群的安全性和可靠性,必须在必要的时候重新启用 SELinux。
因此,关闭 SELinux 可以使 Kubernetes 集群的部署更加简单和可靠,但也会降低集群的安全性和可靠性。在实际应用中,需要根据具体情况来确定是否需要开启或关闭 SELinux。
sed -i ‘s/enforcing/disabled/’ /etc/selinux/config # 永久
setenforce 0 # 临时
3.关闭 swap:
Kubernetes 使用了 cgroup 管理容器资源。而 swap 分区可能会阻止容器使用预期的内存资源,并且可能导致应用程序在容器内部崩溃或出现其他问题。
Kubernetes 本身不会使用 swap,同时,因为容器的使用和交换内存的机制不同,如果应用程序需要使用大量内存时,容器会自动申请更多的内存,而不是使用 swap,避免了性能的损失和不可预测的行为。关闭 swap 分区可以更好地保护 Kubernetes 集群的稳定性和性能,确保容器的内存使用与性能表现的一致性。
swapoff -a # 临时sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
4.根据规划设置主机名:
在kubernetes集群中,节点的主机名是一个很重要的标识,它被用来唯一标识集群中的每个节点。设置正确的主机名可以方便管理和诊断集群中的问题。
hostnamectl set-hostname
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
sysctl --system # 生效
7.时间同步:
Kubernetes 集群中的各个节点需要相互通信进行协作,因此需要保证它们的时间是同步的,以确保它们在进行计划和调度时能够准确地协调工作。如果节点的时间不同步,则可能会出现以下问题:
- 容器运行情况出现不可预测的错误。
- 调度器无法准确计算任务的完成时间,导致任务超时或者在不合适的节点上进行调度。
- 监控和日志收集系统可能会出现时间不对齐的情况,导致数据分析的结果不准确。
因此,为了保证集群的正常运行,需要在集群中的各个节点上同步时间。
yum install ntpdate -y
ntpdate time.windows.com
注配置完以上命令最好重启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
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 镜像下载时就会优先从镜像站点下载,并且下载速度会更快。
cat > /etc/docker/daemon.json << EOF
{
“registry-mirrors”: [“https://vpmkvcwz.mirror.aliyuncs.com”]
}
EOF
重启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
( 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
部署 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
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-proxyYour Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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集群部署成功。
创建成功,查看拉取的镜像
(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
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
~~版本不对应报错重装版本~~
Docker版本不小心升级至24.0.4,将Docker卸载重新安装即可
再次查看节点 两个worker node节点已经加入集群,但是状态还是NotReady,是因为还没有安装网络组件
安装 Pod 网络插件( CNI)
常用的pod网络插件:
- Flannel: 使用 Linux 内核中的 VXLAN 模块为每个 Pod 创建一个虚拟网络。
- Calico: 可以提供高级网络策略和安全性。
- Weave Net: 轻量级网络插件,可以轻松管理网络。
- Cilium: 支持多种网络通信模型和高级网络策略。
这里选择flannel,部署flannel网络插件能让pod网络直接通信,不需要经过转发
这个命令会应用一个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命令
节点已经启动
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并显示它们的状态
上半部分是Pod的状态
下半部分是Service的状态
访问地址: http://NodeIP:Port,可以看到对外暴露端口port:31132
在集群中任意节点都能访问成功该地址
比如使用192.168.122.140进行访问
使用192.168.122.141进行访问
使用192.168.122.142进行访问
部署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
2.等待kuboard启动并运行。可以使用以下命令检查
kubectl get pods,svc -n kuboard
kuboard-v3.yaml
---
apiVersion: v1
kind: Namespace
metadata:name: kuboard---
apiVersion: v1
kind: ConfigMap
metadata:name: kuboard-v3-confignamespace: 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: 32b7d6572c6255211b4eec9009e4a816KUBOARD_AGENT_IMAG: eipwork/kuboard-agentKUBOARD_QUESTDB_IMAGE: questdb/questdb:6.0.5KUBOARD_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-boostrapnamespace: kuboard---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kuboard-boostrap-crb
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: kuboard-boostrapnamespace: kuboard---
apiVersion: apps/v1
kind: DaemonSet
metadata:labels:k8s.kuboard.cn/name: kuboard-etcdname: kuboard-etcdnamespace: kuboard
spec:revisionHistoryLimit: 10selector:matchLabels:k8s.kuboard.cn/name: kuboard-etcdtemplate:metadata:labels:k8s.kuboard.cn/name: kuboard-etcdspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: node-role.kubernetes.io/masteroperator: Exists- matchExpressions:- key: node-role.kubernetes.io/control-planeoperator: Exists- matchExpressions:- key: k8s.kuboard.cn/roleoperator: Invalues:- etcdcontainers:- env:- name: HOSTNAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: spec.nodeName- name: HOSTIPvalueFrom:fieldRef:apiVersion: v1fieldPath: status.hostIPimage: 'eipwork/etcd-host:3.4.16-2'imagePullPolicy: Alwaysname: etcdports:- containerPort: 2381hostPort: 2381name: serverprotocol: TCP- containerPort: 2382hostPort: 2382name: peerprotocol: TCPlivenessProbe:failureThreshold: 3httpGet:path: /healthport: 2381scheme: HTTPinitialDelaySeconds: 30periodSeconds: 10successThreshold: 1timeoutSeconds: 1volumeMounts:- mountPath: /dataname: datadnsPolicy: ClusterFirsthostNetwork: truerestartPolicy: AlwaysserviceAccount: kuboard-boostrapserviceAccountName: kuboard-boostraptolerations:- key: node-role.kubernetes.io/masteroperator: Exists- key: node-role.kubernetes.io/control-planeoperator: Existsvolumes:- hostPath:path: /usr/share/kuboard/etcdname: dataupdateStrategy:rollingUpdate:maxUnavailable: 1type: RollingUpdate---
apiVersion: apps/v1
kind: Deployment
metadata:annotations: {}labels:k8s.kuboard.cn/name: kuboard-v3name: kuboard-v3namespace: kuboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s.kuboard.cn/name: kuboard-v3template:metadata:labels:k8s.kuboard.cn/name: kuboard-v3spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- preference:matchExpressions:- key: node-role.kubernetes.io/masteroperator: Existsweight: 100- preference:matchExpressions:- key: node-role.kubernetes.io/control-planeoperator: Existsweight: 100containers:- env:- name: HOSTIPvalueFrom:fieldRef:apiVersion: v1fieldPath: status.hostIP- name: HOSTNAMEvalueFrom:fieldRef:apiVersion: v1fieldPath: spec.nodeNameenvFrom:- configMapRef:name: kuboard-v3-configimage: 'eipwork/kuboard:v3'imagePullPolicy: AlwayslivenessProbe:failureThreshold: 3httpGet:path: /kuboard-resources/version.jsonport: 80scheme: HTTPinitialDelaySeconds: 30periodSeconds: 10successThreshold: 1timeoutSeconds: 1name: kuboardports:- containerPort: 80name: webprotocol: TCP- containerPort: 443name: httpsprotocol: TCP- containerPort: 10081name: peerprotocol: TCP- containerPort: 10081name: peer-uprotocol: UDPreadinessProbe:failureThreshold: 3httpGet:path: /kuboard-resources/version.jsonport: 80scheme: HTTPinitialDelaySeconds: 30periodSeconds: 10successThreshold: 1timeoutSeconds: 1resources: {}# startupProbe:# failureThreshold: 20# httpGet:# path: /kuboard-resources/version.json# port: 80# scheme: HTTP# initialDelaySeconds: 5# periodSeconds: 10# successThreshold: 1# timeoutSeconds: 1dnsPolicy: ClusterFirstrestartPolicy: AlwaysserviceAccount: kuboard-boostrapserviceAccountName: kuboard-boostraptolerations:- key: node-role.kubernetes.io/masteroperator: Exists---
apiVersion: v1
kind: Service
metadata:annotations: {}labels:k8s.kuboard.cn/name: kuboard-v3name: kuboard-v3namespace: kuboard
spec:ports:- name: webnodePort: 30080port: 80protocol: TCPtargetPort: 80- name: tcpnodePort: 30081port: 10081protocol: TCPtargetPort: 10081- name: udpnodePort: 30081port: 10081protocol: UDPtargetPort: 10081selector:k8s.kuboard.cn/name: kuboard-v3sessionAffinity: Nonetype: NodePort
显示web对外暴露30080
访问 Kuboard
- 输入初始用户名和密码,并登录
用户名: admin
密码: Kuboard123
集群信息
点击default集群,选择访问集群使用的角色 这里直接使用admin
集群导入信息
概要
查看节点
查看master节点
相关文章:

kubernetes 集群搭建(kubeadm 方式)
目前生产部署 Kubernetes 集群主要有两种方式: (1) kubeadm Kubeadm 是一个 Kubernetes 官方提供的命令行工具,可以用来部署和管理 Kubernetes 集群。它主要用于在新的 Kubernetes 环境中初始化集群、添加或删除节点等操作。 K…...

基于ARM+FPGA的驱控一体机器人控制器设计
目前市场上工业机器人,数控机床等多轴运动控制系统普遍采用运动控制器加 伺服驱动器的分布式控制方式。在这种控制方式中,控制器一方面完成人机交互,另 一方面进行 NC 代码的解释执行,插补运算,继而将计算出来的位…...

docker 安装 字体文件
先说一下我当前的 场景 及 环境,这样同学们可以先评估本篇文章是否有帮助。 环境: dockerphp8.1-fpmwindows 场景: 来了个需求,有一个默认背景图,可以理解为背景图是一个 "相框",相框里面就会放…...
Vue.js与ASP.NET的结合,实现企业级应用的开发和部署
在当今快速发展的互联网技术领域,企业级应用的开发和部署变得越来越重要。Vue.js和ASP.NET是两个在前端和后端开发中广泛使用的技术,将它们结合起来可以为企业级应用的开发和部署带来诸多优势。本文将通过代码示例介绍如何使用Vue.js和ASP.NET进行企业级…...

Uncaught SyntaxError: ‘‘ string literal contains an unescaped line break
今天在修改前端页面的时候,页面报错了,提示了这个信息 Uncaught SyntaxError: string literal contains an unescaped line break 问题指向这行代码,这就是通过JS渲染一个easyui的搜索框,仔细确认之后,发现没有任何问…...

Vue3+Vite+TypeScript常用项目模块详解
目录 1.Vue3ViteTypeScript 概述 1.1 vue3 1.1.1 Vue3 概述 1.1.2 vue3的现状与发展趋势 1.2 Vite 1.2.1 现实问题 1.2 搭建vite项目 1.3 TypeScript 1.3.1 TypeScript 定义 1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍 2. 项目配置简单概述 2.…...

数字电路(一)
1、例题 1、进行DA数模转换器选型时,一般要选择主要参数有( A)、转换精度和转换速度。 A、分辨率 B、输出电流 C、输出电阻 D、模拟开关 2、下图所示电路的逻辑功能为( B) A、与门 B、或门 C、与非门 D、或非门 分析该…...
Oracle也有回收站
在数据库管理中,数据的删除是一个常见的操作。然而,有时候我们可能会意外地删除了一些重要的数据。幸运的是,Oracle数据库提供了一个类似于回收站的功能,可以帮助我们恢复被删除的数据。本文将介绍Oracle数据库中的回收站功能以及…...

投稿注意!APA格式超全示例详解,原本28天能录用,可能要拖延2个月
为什么同一本期刊有论文28天录用,有论文10个月才录用?结合近期征稿的这本经管类SSCI期刊,小编(Unionpub学术)整理了部分影响录用的几个因素,准备提交此期刊的作者可自查参考下: (参…...

【Python】Web学习笔记_flask(1)——模拟登录
安装flask pip3 install flask 第一部分内容: 1、主页面输出hello world 2、根据不同用户名参数输出用户信息 3、模拟登录 from flask import Flask,url_for,redirectappFlask(__name__)app.route(/) def index():return hello worldapp.route(/user/<uname…...
css单行文本省略号多行文本省略号
设置单行文本省略号的写法 : 先设置宽固定的宽度 :width: 300px; 设置不换行 :white-space:nowrap; 设置省略号:text-overflow: ellipsis; 裁剪多余的内容/溢出的内容:overflow: hidden; width: 200px; white-space:…...

信号槽中的函数重载
信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数: 槽函数: mainwondow: cpp文件: #include "mainwindow.h"…...

计算机视觉(五)深度学习基础
文章目录 深度学习基础卷积神经网络与传统神经网络区别深度学习与神经网络的区别 目标函数选择合适的目标函数Softmax层 改进的梯度下降梯度消失的直观解释激活函数学习步长SGD的问题Momentum动量Nesterov MomentumAdagradRMSpropAdam 各种梯度下降算法比较关于算法选择的建议B…...
ES6学习-Generator
Generator 种异步编程解决方案 函数会返回一个遍历器对象语法上:Generator 函数是一个状态机,封装了多个内部状态。形式上:Generator 函数是一个普通函数;有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部…...

Flowable-服务-微服务任务
目录 定义图形标记XML内容界面操作 定义 Sc 任务不是 BPMN 2.0 规范定义的官方任务,在 Flowable 中,Sc 任务是作为一种特殊的服务 任务来实现的,主要调用springcloud的微服务使用。 图形标记 由于 Sc 任务不是 BPMN 2.0 规范的“官方”任务…...
opencv03-补充-vector的操作
opencv03-补充-vector的操作 参考:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html 构造方法(具体介绍看API文档) class Student {public:private:string name;};int main() {vector<int>();vector<int> v1;vector<Student&g…...

二叉树(C语言)
文章目录 1.树1.1概念1.2相关定义1.3 表示(左孩子右兄弟) 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树:2. 完全二叉树: 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…...
介绍下Django中的表单(forms)模块中的类forms.CharField
在Django中,forms.CharField() 是用于定义表单字段的类,它属于 Django 的表单(forms)模块。CharField 是用于处理字符型数据的表单字段类。它允许用户在表单中输入文本数据,并对该数据进行验证和处理。 forms.CharFie…...

元宇宙与数字孪生的异同?
随着数字孪生和元宇宙两个概念的爆火,人们对这两个“异物”也越来越好奇,这都是什么意思?听起来都差不多,是一样的嘛?本文就用最简单的话语带大家了解一下二者之间的异同。 首先来说数字孪生和元宇宙的概念 数字孪生是…...

智慧农业:科技赋能农村发展
智慧农业发展前景灿烂多彩,正为农业带来新的转型升级。随着科技的不断发展,数字化、自动化和智能化技术逐渐渗透进农业领域,为农民提供了更多高效便捷的农业管理方式。智慧农业通过物联网、大数据、人工智能等先进技术,实现对农田…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...