Kubernetes安装

news2025/4/5 21:11:41

Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。

Kubernetes 核心能力:

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排
    Kubernetes 允许你自动挂载你选择的存储系统,比如本地存储,类似Docker的数据卷。

  • 自动部署和回滚
    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。Kubernetes 会自动帮你根据情况部署创建新容器,并删除现有容器给新容器提供资源。

  • 自动完成装箱计算
    Kubernetes 允许你设置每个容器的资源,比如CPU和内存。

  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的容器,并运行状况检查的容器。

  • 秘钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

Kubernetes架构

Kubernetes 搭建需要至少两个节点,一个Master负责管理worker节点,一个Slave搭建在工作服务器上负责分配,Kubernetes 官网组件说明。

image.png

控制平面组件 (Control Plane Components)

控制平面组件 (Master组件) 会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。

控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器。 请参阅使用 kubeadm 构建高可用性集群 中关于跨多机器控制平面设置的示例。

kube-apiserver

该组件负责公开 Kubernetes API,负责处理接受请求的工作,比如kubectl xx命令。 API 服务器是 Kubernetes 控制平面的前端。

Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。

etcd

一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。

如果你的 Kubernetes 集群使用 etcd 作为其后台数据库, 请确保你针对这些数据有一份 备份计划。

你可以在官方文档中找到有关 etcd 的深入知识。

kube-scheduler

负责调度每个工作节点,并选择节点来让 Pod 在上面运行。

调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。

kube-controller-manager

kube-controller-manager 是控制平面的组件, 负责运行控制器进程。

从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。

这些控制器包括:

  • 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
  • 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点分片控制器(EndpointSlice controller):填充端点分片(EndpointSlice)对象(以提供 Service 和 Pod 之间的链接)。
  • 服务账号控制器(ServiceAccount controller):为新的命名空间创建默认的服务账号(ServiceAccount)。

cloud-controller-manager

一个 Kubernetes 控制平面组件, 嵌入了特定于云平台的控制逻辑。 云控制器管理器(Cloud Controller Manager)允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。

cloud-controller-manager 仅运行特定于云平台的控制器。 因此如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的集群不需要有云控制器管理器。

kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中, 供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

  • 节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除
  • 路由控制器(Route Controller):用于在底层云基础架构中设置路由
  • 服务控制器(Service Controller):用于创建、更新和删除云提供商负载均衡器

Node 组件

节点组件(Worker 组件)会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。

kubelet

kubelet 会在集群中每个节点(node)上运行。 它负责向 Master 汇报自身节点的运行情况,如 Node 节点的注册、终止、定时上报健康状况等,以及接收 Master 发出的命令,创建相应 Pod。

kube-proxy

kube-proxy 是集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。

kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。

容器运行时(Container Runtime)

容器运行环境是负责运行容器的软件。

Kubernetes 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现。

安装

这里会采用 https://kuboard.cn/ 提供的方式安装K8s。

image.png

配置要求

  • 至少2台 2核4G 的服务器
  • Cent OS 7.6 / 7.7 / 7.8 https://vault.centos.org/7.8.2003/isos/x86_64/CentOS-7-x86_64-Minimal-2003.iso

检查 centos / hostname

检查系统版本、hostname、系统配置信息。

# 在 master 节点和 worker 节点都要执行
cat /etc/redhat-release

# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
# 不能使用 localhost 作为节点的名字
hostname

# 请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64    本安装文档不支持 arm 架构
# CPU(s):       2         CPU 内核数量不能低于 2
lscpu

修改 hostname
如果您需要修改 hostname,可执行如下指令:

# 修改 hostname
hostnamectl set-hostname your-new-host-name
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

检查网络

在所有服务器执行如下命令,必须使用静态IP:

[root@localhost ~]# ip route show
default via 192.168.232.1 dev ens33 proto static metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.232.0/24 dev ens33 proto kernel scope link src 192.168.232.8 metric 100 
[root@localhost ~]# 

kubelet使用的IP地址

  • ip route show 命令中,可以知道机器的默认网卡,通常是 ens33,如 ***default via 192.168.232.1 dev ens33 proto static metric 100 ***
  • ip address 命令中,可显示默认网卡的 IP 地址,Kubernetes 将使用此 IP 地址与集群内的其他节点通信,如 192.168.232.3
  • 所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)

安装docker及kubelet

安装前置软件如docker、kubelet、kubeadm、kubectl等, 在 m a s t e r 节点和 w o r k e r 节点都要执行 \color{Red}{在 master 节点和 worker 节点都要执行} master节点和worker节点都要执行

# 在 master 节点和 worker 节点都要执行
# 最后一个参数 1.19.5 用于指定 kubenetes 版本,支持所有 1.19.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 华为云镜像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5

安装前一定要保证系统非常干净,删除docker https://blog.csdn.net/wangerrong/article/details/126750198

初始化 master 节点

关于初始化时用到的环境变量

  • APISERVER_NAME 不能是 master 的 hostname
  • APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
  • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5

输出结果如下所示:

[root@k8s-master ~]# curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
W0421 17:18:15.782676    3802 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[config/images] Pulled registry.aliyuncs.com/k8sxio/kube-apiserver:v1.19.5
[config/images] Pulled registry.aliyuncs.com/k8sxio/kube-controller-manager:v1.19.5
[config/images] Pulled registry.aliyuncs.com/k8sxio/kube-scheduler:v1.19.5
[config/images] Pulled registry.aliyuncs.com/k8sxio/kube-proxy:v1.19.5
[config/images] Pulled registry.aliyuncs.com/k8sxio/pause:3.2
[config/images] Pulled registry.aliyuncs.com/k8sxio/etcd:3.4.13-0
[config/images] Pulled registry.aliyuncs.com/k8sxio/coredns:1.7.0
W0421 17:21:12.704429   15240 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.5
[preflight] Running pre-flight checks
[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'
[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 [k8s-master k8smaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.232.9]
[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 [k8s-master localhost] and IPs [192.168.232.9 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.232.9 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
[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
[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"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[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 13.004529 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.19" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
9a50d65e6e10bac5b23c174059a61231b3e1f66ba0493010d7abeac6f0bbd256
[mark-control-plane] Marking the node k8s-master as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node k8s-master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: 6hu8hs.q4bq8eq7hiarhn9l
[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/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join k8smaster:6443 --token 6hu8hs.q4bq8eq7hiarhn9l \
    --discovery-token-ca-cert-hash sha256:d06e0e678c3a6573507f9befaeb934abbdf98a50fa658268c012fd730428f9ee \
    --control-plane --certificate-key 9a50d65e6e10bac5b23c174059a61231b3e1f66ba0493010d7abeac6f0bbd256

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8smaster:6443 --token 6hu8hs.q4bq8eq7hiarhn9l \
    --discovery-token-ca-cert-hash sha256:d06e0e678c3a6573507f9befaeb934abbdf98a50fa658268c012fd730428f9ee 
安装calico-3.13.1
--2023-04-21 17:21:31--  https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
正在解析主机 kuboard.cn (kuboard.cn)... 101.42.39.198
正在连接 kuboard.cn (kuboard.cn)|101.42.39.198|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:21077 (21K) [application/octet-stream]
正在保存至: “calico-3.13.1.yaml”

100%[=========================================================================================>] 21,077      65.9KB/s 用时 0.3s   

2023-04-21 17:21:31 (65.9 KB/s) - 已保存 “calico-3.13.1.yaml” [21077/21077])

configmap/calico-config created
Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

检查 master 初始化结果

# 只在 master 节点执行

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide

# 查看 master 节点初始化结果
kubectl get nodes -o wide

输出结果如下所示:

[root@k8s-master ~]# watch kubectl get pod -n kube-system -o wide
Every 2.0s: kubectl get pod -n kube-system -o wide                                                         Fri Apr 21 17:46:23 2023

NAME                                       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READIN
ESS GATES
calico-kube-controllers-6c89d944d5-wrrnb   1/1     Running   0          24m   10.100.235.195   k8s-master   <none>           <none>
calico-node-vbhnr                          1/1     Running   0          24m   192.168.232.9    k8s-master   <none>           <none>
coredns-59c898cd69-8mq8l                   1/1     Running   0          24m   10.100.235.193   k8s-master   <none>           <none>
coredns-59c898cd69-kvbrs                   1/1     Running   0          24m   10.100.235.194   k8s-master   <none>           <none>
etcd-k8s-master                            1/1     Running   0          24m   192.168.232.9    k8s-master   <none>           <none>
kube-apiserver-k8s-master                  1/1     Running   0          24m   192.168.232.9    k8s-master   <none>           <none>
kube-controller-manager-k8s-master         1/1     Running   0          24m   192.168.232.9    k8s-master   <none>           <none>
kube-proxy-lnzbx                           1/1     Running   0          24m   192.168.232.9    k8s-master   <none>           <none>
kube-scheduler-k8s-master                  1/1     Running   0          24m   192.168.232.9    k8s-master   <none>           <none>

[root@k8s-master ~]# kubectl get nodes -o wide
NAME         STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master   Ready    master   25m   v1.19.5   192.168.232.9   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://19.3.11
[root@k8s-master ~]# 

初始化 worker节点

获得 join命令参数

在 master 节点上执行

# 只在 master 节点执行
kubeadm token create --print-join-command

可获取kubeadm join 命令及参数,如下所示

# kubeadm token create 命令的输出
[root@k8s-master ~]# kubeadm token create --print-join-command
W0421 17:49:50.938283   67240 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join k8smaster:6443 --token r6dy31.hllljlfflk6ygjmk     --discovery-token-ca-cert-hash sha256:d06e0e678c3a6573507f9befaeb934abbdf98a50fa658268c012fd730428f9ee 

有效时间
该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点。

初始化worker

针对所有的 worker 节点执行

# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303

输出结果如下所示:

[root@k8s-worker ~]# # 只在 worker 节点执行
[root@k8s-worker ~]# # 替换 x.x.x.x 为 master 节点的内网 IP
[root@k8s-worker ~]# export MASTER_IP=192.168.232.9
[root@k8s-worker ~]# # 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
[root@k8s-worker ~]# export APISERVER_NAME=k8smaster
[root@k8s-worker ~]# echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
[root@k8s-worker ~]# 
[root@k8s-worker ~]# kubeadm join k8smaster:6443 --token r6dy31.hllljlfflk6ygjmk     --discovery-token-ca-cert-hash sha256:d06e0e678c3a6573507f9befaeb934abbdf98a50fa658268c012fd730428f9ee 
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

检查初始化结果

在 master 节点上执行

# 只在 master 节点执行
kubectl get nodes -o wide

输出结果如下所示:

[root@k8s-master ~]# kubectl get nodes -o wide
NAME         STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master   Ready    master   32m   v1.19.5   192.168.232.9   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://19.3.11
k8s-worker   Ready    <none>   85s   v1.19.5   192.168.232.8   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://19.3.11

安装 Ingress Controller

在 master 节点上执行

# 只在 master 节点执行
kubectl apply -f https://kuboard.cn/install-script/v1.19.x/nginx-ingress.yaml

输出结果如下所示:

[root@k8s-master ~]# kubectl apply -f https://kuboard.cn/install-script/v1.19.x/nginx-ingress.yaml
namespace/nginx-ingress created
serviceaccount/nginx-ingress created
secret/default-server-secret created
configmap/nginx-config created
clusterrole.rbac.authorization.k8s.io/nginx-ingress created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress created
daemonset.apps/nginx-ingress created
  • 配置域名解析
    将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)

  • 验证配置
    在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面

安装 Kuboard - 微服务管理界面

安装 Kuboard v3 - kubernetes

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

等待 Kuboard v3 就绪

执行指令 watch kubectl get pods -n kuboard,等待 kuboard 名称空间中所有的 Pod 就绪,如下所示,
如果结果中没有出现 kuboard-etcd-xxxxx 的容器,请查看 中关于 缺少 Master Role 的描述。

Every 2.0s: kubectl get pods -n kuboard                                                                    Fri Apr 21 18:06:50 2023

NAME                               READY   STATUS    RESTARTS   AGE
kuboard-agent-2-5bc447cd57-pfxh5   1/1     Running   1          21s
kuboard-agent-7764c587d7-n4fm2     1/1     Running   1          21s
kuboard-etcd-qxlzf                 1/1     Running   0          104s
kuboard-v3-79797c7b84-hg466        1/1     Running   0          104s

访问 Kuboard

在浏览器中打开链接 http://your-node-ip-address:30080

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

用户名: admin
密码: Kuboard123

image.png

卸载

  • 执行 Kuboard v3 的卸载
kubectl delete -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
  • 清理遗留数据
    在 master 节点以及带有 k8s.kuboard.cn/role=etcd标签的节点上执行
rm -rf /usr/share/kuboard

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

艾瑞报告:预计2023年家用智能照明市场规模过百亿,Yeelight易来引领行业发展

照明是家居的主要部分&#xff0c;以智能化控制技术光环境设计为核心的智能照明成为智能家居重要的子系统与子应用&#xff0c;智能照明通过精准的设计&#xff0c;将单品链接成系统&#xff0c;通过算法和云平台实现智能化&#xff0c;针对不同的空间适配不同的灯光&#xff0…

使用注解存储Bean对象

日升时奋斗&#xff0c;日落时自省 目录 1、存储Bean对象 1.1、五大类注解 1.2、添加注解存储Bean对象&#xff08;Controller&#xff09; 1.3、Bean的命名规则 1.4、其他类注解演示 1.5、为什么需要五大类注解 1.5.1、JavaEE标准分层 1.5.2、实例分层结构 1.5.3、分…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用

目前&#xff0c;Earth Engine上包含超过900个公共数据集&#xff0c;每月新增约2 PB数据&#xff0c;总容量超过80PB。与传统的处理影像工具&#xff08;例如ENVI&#xff09;相比&#xff0c;Earth Engine在处理海量遥感数据方面具有不可比拟的优势。一方面&#xff0c;它提供…

【Linux】线程同步分析:什么是条件变量?生产者消费者模型是什么?POSIX信号量怎么用?阻塞队列和环形队列模拟生产者消费者模型

上一篇文章我们分析了什么是线程互斥, 以及线程互斥的特点和使用. 说白了, 线程互斥就是多线程在争抢使用临界资源, 谁抢到了谁就用, 抢不到的就等. 这样不会因为多线程同时访问临界资源而造成错误. 虽然没有错误, 但是, 思考另外一个问题&#xff1a;这样合理吗&#xff1f…

Android Studio连接使用第三方模拟器

使用Android Studio自带的模拟器&#xff0c;第一会比较卡&#xff0c;第二配置容易出错&#xff0c;第三&#xff0c;自带的模拟器很吃电脑配置。如果电脑配置较差&#xff0c;会比较耽误事。所以为例解决上面三个问题&#xff0c;可以在电脑上按照第三方手机模拟器&#xff0…

陶泓达:4.18午间欧盘黄金原油最新精准操作建议!

黄金方面&#xff1a; 黄金消息面解析&#xff1a;周一&#xff08;4月17日&#xff09;美市盘中&#xff0c;美国公布的4月纽约联储制造业指数和4月NAHB房产市场指数均超出预期&#xff0c;提振了美联储在5月继续加息的预期。数据公布之后&#xff0c;美元指数加速上扬&#x…

【wireshark】Ubuntu 安装 wireshark 以及 wireshark 过滤器的使用

目录 1、安装wireshark 2、wireshark 过滤器比较符号 3、wireshark 过滤方式 (1) 根据 IP 地址过滤 (2) 根据端口号过滤 (3) 根据报文长度过滤 (4) HTTP协议过滤 参考文章链接&#xff1a;Wireshark 过滤器使用 1、安装wireshark 在命令行输入如下命令安装 wireshark …

Flutter与Android开发:构建跨平台移动应用的新选择

Flutter与Android开发&#xff1a;构建跨平台移动应用的新选择 本文内容提纲如下&#xff1a; 介绍Flutter技术&#xff1a;Flutter是一种由Google推出的开源UI工具包&#xff0c;用于构建高性能、跨平台的移动应用。文章将介绍Flutter的基本概念、特点和优势&#xff0c;包括其…

计算机设置定时任务及自动开关机

目录 创建定时任务 自动开关机 创建定时任务 1、右击桌面计算机&#xff0c;点击管理&#xff0c;打开计算机管理或通过控制面板打开[控制面板-管理工具-计算机管理] 2、依次选择&#xff1a;系统工具->任务计划程序->任务计划程序库->Microsoft->Windows&#…

MOD8ID 加密芯片的 AES-GCM 模式使用

一&#xff1a;什么是 AES-GCM 加密&#xff1f; AES-GCM是一种高级加密标准&#xff08;AES&#xff09;的加密模式&#xff0c;同时使用加密和身份验证&#xff08;AEAD&#xff09;功能。它使用加密算法AES和Galois Counter Mode&#xff08;GCM&#xff09;计数器模式&…

5行Python代码采集3000+上市公司信息,很爽

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 毕业季也到了找工作的季节了&#xff0c; 很多小伙伴都会一家一家的公司去看&#xff0c; 这得多浪费时间啊。 今天用Python教大家怎么采集公司的信息&#xff0c; 相信大家会很喜欢这个教程的&#xff0c;nice&#xff01; pyth…

中介者设计模式(Mediator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、适用场景]

文章目录 概念组成角色相关图示示例代码适用场景 概念 中介者设计模式是一种行为型设计模式&#xff0c;它通过引入一个中介对象来封装一组对象之间的交互&#xff0c;使得对象之间不需要显式地相互引用&#xff0c;从而降低它们之间的耦合。通过将对象间的通信封装到中介者对象…

Ubuntu20.4利用httpd(Apache2)源码搭建web服务器

Apache取自“a patchy server”的读音&#xff0c;源于NCSAhttpd服务器&#xff0c;经过多次修改&#xff0c;成为世界上最流行的Web服务器软件之一&#xff0c;Apache的特点是简单、速度快、性能稳定&#xff0c;并可做代理服务器来使用。 本来它只用于小型或试验Internet网络…

TinyOS 配置教程

文章目录 前言1. 安装1.1. 实验环境1.2. TinyOS基础工作1.3. TinyOS 的配置1.4. 安装 java1.5. 安装编译器 2. 测试仿真程序总结 前言 本文主要用于记录在 WSN 课程中&#xff0c;配置大作业所需使用的 TinyOS 仿真环境 1. 安装 1.1. 实验环境 本实验以如下版本为例&#xf…

Python面向对象详解(非常详细)

非常详细的讲解&#xff08;爆肝1w字&#xff09;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 零基础一样学得会&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; &#x1f4dd;个人主页→数据…

函数重载注意事项

C为什么支持函数重载&#xff0c;C语言不支持函数重载&#xff1f; C代码产生函数符号时&#xff0c; 是函数名参数列表类型组成的&#xff01;如_Z3sumii C代码产生函数符号时&#xff0c;只由函数名决定 什么是函数重载&#xff1f; 一组函数&#xff0c;其中函数名相同&…

读书笔记-《ON JAVA 中文版》-摘要14[第十四章 流式编程]

文章目录 第十四章 流式编程1. 流支持2. 流创建2.1 流创建2.2 随机数流2.3 int 类型的范围2.4 generate()2.5 iterate()2.6 流的建造者模式2.7 Arrays2.8 正则表达式 3. 中间操作3.1 跟踪和调试3.2 流元素排序3.3 移除元素3.4 应用函数到元素3.5 在 map() 中组合流 4. Optional…

电脑文件恢复怎么做?3个方法快速恢复文件!

案例&#xff1a;电脑文件恢复怎么操作&#xff1f; 【我的电脑已经好久没用了&#xff0c;最近因为需要查看一些相关的文件才用到电脑&#xff0c;但是我打开后发现里面很多重要的文件都不见了&#xff0c;请问电脑文件应该怎么恢复呢&#xff1f;感谢回答&#xff01;】 电…

AIGC从入门到精通

一键起飞 # 提前安装好python 3.10.9 ​git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui cd stable-diffusion-webui ./webui.sh -f --api --listen --enable-insecure-extension-access 非常详细&#xff01;6000字详解AI绘画文生图干货、技巧&#xf…

【多线程】线程的状态

1. 等待一个线程 join 有一天张三与小美在家里吃饭&#xff0c;张三早早的把饭吃完了&#xff0c;对小美说&#xff0c;等你把饭吃完了&#xff0c;我就去洗碗了&#xff01; 此时张三就要等待小美吃完饭才能去洗碗&#xff0c;就好比线程 A 要等待线程 B 执行完&#xff0c;线…