目前生产部署 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-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集群部署成功。
创建成功,查看拉取的镜像
(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-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
- 输入初始用户名和密码,并登录
用户名: admin
密码: Kuboard123
集群信息
点击default集群,选择访问集群使用的角色 这里直接使用admin
集群导入信息
概要
查看节点
查看master节点