Kubernetes入門

Kubernetes 也稱為 K8s,是用于自動部署、擴縮和管理容器化應(yīng)用程序的開源系統(tǒng)。

Kubernetes 核心能力:

  • 服務(wù)發(fā)現(xiàn)和負載均衡
    Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果進入容器的流量很大彭沼, Kubernetes 可以負載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定备埃。

  • 存儲編排
    Kubernetes 允許你自動掛載你選擇的存儲系統(tǒng)姓惑,比如本地存儲,類似Docker的數(shù)據(jù)卷按脚。

  • 自動部署和回滾
    你可以使用 Kubernetes 描述已部署容器的所需狀態(tài)于毙,它可以以受控的速率將實際狀態(tài) 更改為期望狀態(tài)。Kubernetes 會自動幫你根據(jù)情況部署創(chuàng)建新容器辅搬,并刪除現(xiàn)有容器給新容器提供資源望众。

  • 自動完成裝箱計算
    Kubernetes 允許你設(shè)置每個容器的資源,比如CPU和內(nèi)存伞辛。

  • 自我修復(fù)
    Kubernetes 重新啟動失敗的容器、替換容器夯缺、殺死不響應(yīng)用戶定義的容器蚤氏,并運行狀況檢查的容器。

  • 秘鑰與配置管理
    Kubernetes 允許你存儲和管理敏感信息踊兜,例如密碼竿滨、OAuth 令牌和 ssh 密鑰。你可以在不重建容器鏡像的情況下部署和更新密鑰和應(yīng)用程序配置捏境,也無需在堆棧配置中暴露密鑰于游。

Kubernetes架構(gòu)

Kubernetes 搭建需要至少兩個節(jié)點,一個Master負責管理worker節(jié)點垫言,一個Slave搭建在工作服務(wù)器上負責分配贰剥,Kubernetes 官網(wǎng)組件說明

image.png

控制平面組件 (Control Plane Components)

控制平面組件 (Master組件) 會為集群做出全局決策筷频,比如資源的調(diào)度蚌成。 以及檢測和響應(yīng)集群事件,例如當不滿足部署的 replicas 字段時凛捏, 要啟動新的 pod)担忧。

控制平面組件可以在集群中的任何節(jié)點上運行。 然而坯癣,為了簡單起見瓶盛,設(shè)置腳本通常會在同一個計算機上啟動所有控制平面組件, 并且不會在此計算機上運行用戶容器。 請參閱使用 kubeadm 構(gòu)建高可用性集群 中關(guān)于跨多機器控制平面設(shè)置的示例惩猫。

kube-apiserver

該組件負責公開 Kubernetes API芝硬,負責處理接受請求的工作,比如kubectl xx命令帆锋。 API 服務(wù)器是 Kubernetes 控制平面的前端吵取。

Kubernetes API 服務(wù)器的主要實現(xiàn)是 kube-apiserverkube-apiserver 設(shè)計上考慮了水平擴縮锯厢,也就是說皮官,它可通過部署多個實例來進行擴縮。 你可以運行 kube-apiserver 的多個實例实辑,并在這些實例之間平衡流量捺氢。

etcd

一致且高可用的鍵值存儲,用作 Kubernetes 所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫剪撬。

如果你的 Kubernetes 集群使用 etcd 作為其后臺數(shù)據(jù)庫摄乒, 請確保你針對這些數(shù)據(jù)有一份 備份計劃。

你可以在官方文檔中找到有關(guān) etcd 的深入知識残黑。

kube-scheduler

負責調(diào)度每個工作節(jié)點馍佑,并選擇節(jié)點來讓 Pod 在上面運行。

調(diào)度決策考慮的因素包括單個 Pod 及 Pods 集合的資源需求梨水、軟硬件及策略約束拭荤、 親和性及反親和性規(guī)范、數(shù)據(jù)位置疫诽、工作負載間的干擾及最后時限舅世。

kube-controller-manager

kube-controller-manager控制平面的組件, 負責運行控制器進程奇徒。

從邏輯上講雏亚, 每個控制器都是一個單獨的進程, 但是為了降低復(fù)雜性摩钙,它們都被編譯到同一個可執(zhí)行文件罢低,并在同一個進程中運行。

這些控制器包括:

  • 節(jié)點控制器(Node Controller):負責在節(jié)點出現(xiàn)故障時進行通知和響應(yīng)
  • 任務(wù)控制器(Job Controller):監(jiān)測代表一次性任務(wù)的 Job 對象腺律,然后創(chuàng)建 Pods 來運行這些任務(wù)直至完成
  • 端點分片控制器(EndpointSlice controller):填充端點分片(EndpointSlice)對象(以提供 Service 和 Pod 之間的鏈接)奕短。
  • 服務(wù)賬號控制器(ServiceAccount controller):為新的命名空間創(chuàng)建默認的服務(wù)賬號(ServiceAccount)。

cloud-controller-manager

一個 Kubernetes 控制平面組件匀钧, 嵌入了特定于云平臺的控制邏輯翎碑。 云控制器管理器(Cloud Controller Manager)允許你將你的集群連接到云提供商的 API 之上, 并將與該云平臺交互的組件同與你的集群交互的組件分離開來之斯。

cloud-controller-manager 僅運行特定于云平臺的控制器日杈。 因此如果你在自己的環(huán)境中運行 Kubernetes,或者在本地計算機中運行學習環(huán)境, 所部署的集群不需要有云控制器管理器莉擒。

kube-controller-manager 類似酿炸,cloud-controller-manager 將若干邏輯上獨立的控制回路組合到同一個可執(zhí)行文件中, 供你以同一進程的方式運行涨冀。 你可以對其執(zhí)行水平擴容(運行不止一個副本)以提升性能或者增強容錯能力填硕。

下面的控制器都包含對云平臺驅(qū)動的依賴:

  • 節(jié)點控制器(Node Controller):用于在節(jié)點終止響應(yīng)后檢查云提供商以確定節(jié)點是否已被刪除
  • 路由控制器(Route Controller):用于在底層云基礎(chǔ)架構(gòu)中設(shè)置路由
  • 服務(wù)控制器(Service Controller):用于創(chuàng)建、更新和刪除云提供商負載均衡器

Node 組件

節(jié)點組件(Worker 組件)會在每個節(jié)點上運行鹿鳖,負責維護運行的 Pod 并提供 Kubernetes 運行環(huán)境扁眯。

kubelet

kubelet 會在集群中每個節(jié)點(node)上運行。 它負責向 Master 匯報自身節(jié)點的運行情況翅帜,如 Node 節(jié)點的注冊姻檀、終止、定時上報健康狀況等涝滴,以及接收 Master 發(fā)出的命令绣版,創(chuàng)建相應(yīng) Pod。

kube-proxy

kube-proxy 是集群中每個節(jié)點(node)上所運行的網(wǎng)絡(luò)代理歼疮, 實現(xiàn) Kubernetes 服務(wù)(Service) 概念的一部分杂抽。

kube-proxy 維護節(jié)點上的一些網(wǎng)絡(luò)規(guī)則, 這些網(wǎng)絡(luò)規(guī)則會允許從集群內(nèi)部或外部的網(wǎng)絡(luò)會話與 Pod 進行網(wǎng)絡(luò)通信韩脏。

如果操作系統(tǒng)提供了可用的數(shù)據(jù)包過濾層默怨,則 kube-proxy 會通過它來實現(xiàn)網(wǎng)絡(luò)規(guī)則。 否則骤素,kube-proxy 僅做流量轉(zhuǎn)發(fā)。

容器運行時(Container Runtime)

容器運行環(huán)境是負責運行容器的軟件愚屁。

Kubernetes 支持許多容器運行環(huán)境济竹,例如 containerdCRI-O 以及 Kubernetes CRI (容器運行環(huán)境接口) 的其他任何實現(xiàn)霎槐。

安裝

這里會采用 https://kuboard.cn/ 提供的方式安裝K8s送浊。

image.png

配置要求

檢查 centos / hostname

檢查系統(tǒng)版本、hostname丘跌、系統(tǒng)配置信息袭景。

# 在 master 節(jié)點和 worker 節(jié)點都要執(zhí)行
cat /etc/redhat-release

# 此處 hostname 的輸出將會是該機器在 Kubernetes 集群中的節(jié)點名字
# 不能使用 localhost 作為節(jié)點的名字
hostname

# 請使用 lscpu 命令,核對 CPU 信息
# Architecture: x86_64    本安裝文檔不支持 arm 架構(gòu)
# CPU(s):       2         CPU 內(nèi)核數(shù)量不能低于 2
lscpu

修改 hostname
如果您需要修改 hostname闭树,可執(zhí)行如下指令:

# 修改 hostname
hostnamectl set-hostname your-new-host-name
# 查看修改結(jié)果
hostnamectl status
# 設(shè)置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

檢查網(wǎng)絡(luò)

在所有服務(wù)器執(zhí)行如下命令耸棒,必須使用靜態(tài)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 命令中,可以知道機器的默認網(wǎng)卡报辱,通常是 ens33与殃,如 ***default via 192.168.232.1 dev ens33 proto static metric 100 ***
  • ip address 命令中,可顯示默認網(wǎng)卡的 IP 地址,Kubernetes 將使用此 IP 地址與集群內(nèi)的其他節(jié)點通信幅疼,如 192.168.232.3
  • 所有節(jié)點上 Kubernetes 所使用的 IP 地址必須可以互通(無需 NAT 映射米奸、無安全組或防火墻隔離)

安裝docker及kubelet

安裝前置軟件如docker、kubelet爽篷、kubeadm悴晰、kubectl等,\color{Red}{在 master 節(jié)點和 worker 節(jié)點都要執(zhí)行}逐工。

# 在 master 節(jié)點和 worker 節(jié)點都要執(zhí)行
# 最后一個參數(shù) 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

安裝前一定要保證系統(tǒng)非常干凈,刪除docker https://blog.csdn.net/wangerrong/article/details/126750198

初始化 master 節(jié)點

關(guān)于初始化時用到的環(huán)境變量

  • APISERVER_NAME 不能是 master 的 hostname
  • APISERVER_NAME 必須全為小寫字母钻弄、數(shù)字佃却、小數(shù)點,不能包含減號
  • POD_SUBNET 所使用的網(wǎng)段不能與 master節(jié)點/worker節(jié)點 所在的網(wǎng)段重疊窘俺。該字段的取值為一個 CIDR 值饲帅,如果您對 CIDR 這個概念還不熟悉,請仍然執(zhí)行 export POD_SUBNET=10.100.0.1/16 命令瘤泪,不做修改
# 只在 master 節(jié)點執(zhí)行
# 替換 x.x.x.x 為 master 節(jié)點實際 IP(請使用內(nèi)網(wǎng) IP)
# export 命令只在當前 shell 會話中有效灶泵,開啟新的 shell 窗口后,如果要繼續(xù)安裝過程对途,請重新執(zhí)行此處的 export 命令
export MASTER_IP=x.x.x.x
# 替換 apiserver.demo 為 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器組所在的網(wǎng)段赦邻,該網(wǎng)段安裝完成后,由 kubernetes 創(chuàng)建实檀,事先并不存在于您的物理網(wǎng)絡(luò)中
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

輸出結(jié)果如下所示:

[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... 已連接惶洲。
已發(fā)出 HTTP 請求,正在等待回應(yīng)... 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 初始化結(jié)果

# 只在 master 節(jié)點執(zhí)行

# 執(zhí)行如下命令膳犹,等待 3-10 分鐘恬吕,直到所有的容器組處于 Running 狀態(tài)
watch kubectl get pod -n kube-system -o wide

# 查看 master 節(jié)點初始化結(jié)果
kubectl get nodes -o wide

輸出結(jié)果如下所示:

[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節(jié)點

獲得 join命令參數(shù)

在 master 節(jié)點上執(zhí)行

# 只在 master 節(jié)點執(zhí)行
kubeadm token create --print-join-command

可獲取kubeadm join 命令及參數(shù),如下所示

# 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小時內(nèi)铐料,您可以使用此 token 初始化任意數(shù)量的 worker 節(jié)點。

初始化worker

針對所有的 worker 節(jié)點執(zhí)行

# 只在 worker 節(jié)點執(zhí)行
# 替換 x.x.x.x 為 master 節(jié)點的內(nèi)網(wǎng) IP
export MASTER_IP=x.x.x.x
# 替換 apiserver.demo 為初始化 master 節(jié)點時所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替換為 master 節(jié)點上 kubeadm token create 命令的輸出
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt     --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303

輸出結(jié)果如下所示:

[root@k8s-worker ~]# # 只在 worker 節(jié)點執(zhí)行
[root@k8s-worker ~]# # 替換 x.x.x.x 為 master 節(jié)點的內(nèi)網(wǎng) IP
[root@k8s-worker ~]# export MASTER_IP=192.168.232.9
[root@k8s-worker ~]# # 替換 apiserver.demo 為初始化 master 節(jié)點時所使用的 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.

檢查初始化結(jié)果

在 master 節(jié)點上執(zhí)行

# 只在 master 節(jié)點執(zhí)行
kubectl get nodes -o wide

輸出結(jié)果如下所示:

[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 節(jié)點上執(zhí)行

# 只在 master 節(jié)點執(zhí)行
kubectl apply -f https://kuboard.cn/install-script/v1.19.x/nginx-ingress.yaml

輸出結(jié)果如下所示:

[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 - 微服務(wù)管理界面

安裝 Kuboard v3 - kubernetes

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令钠惩,唯一的區(qū)別是,該指令使用華為云的鏡像倉庫替代 docker hub 分發(fā) Kuboard 所需要的鏡像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

等待 Kuboard v3 就緒

執(zhí)行指令 watch kubectl get pods -n kuboard族阅,等待 kuboard 名稱空間中所有的 Pod 就緒篓跛,如下所示,
如果結(jié)果中沒有出現(xiàn) kuboard-etcd-xxxxx 的容器坦刀,請查看 中關(guān)于 缺少 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

卸載

  • 執(zhí)行 Kuboard v3 的卸載
kubectl delete -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
  • 清理遺留數(shù)據(jù)
    在 master 節(jié)點以及帶有 k8s.kuboard.cn/role=etcd 標簽的節(jié)點上執(zhí)行
rm -rf /usr/share/kuboard
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市央渣,隨后出現(xiàn)的幾起案子计盒,更是在濱河造成了極大的恐慌,老刑警劉巖芽丹,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件北启,死亡現(xiàn)場離奇詭異,居然都是意外死亡拔第,警方通過查閱死者的電腦和手機咕村,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚊俺,“玉大人懈涛,你說我怎么就攤上這事∮锯” “怎么了批钠?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長得封。 經(jīng)常有香客問我埋心,道長,這世上最難降的妖魔是什么忙上? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任拷呆,我火速辦了婚禮,結(jié)果婚禮上疫粥,老公的妹妹穿的比我還像新娘茬斧。我一直安慰自己,他們只是感情好梗逮,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布啥供。 她就那樣靜靜地躺著,像睡著了一般库糠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涮毫,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天瞬欧,我揣著相機與錄音,去河邊找鬼罢防。 笑死艘虎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的咒吐。 我是一名探鬼主播野建,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼属划,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了候生?” 一聲冷哼從身側(cè)響起同眯,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唯鸭,沒想到半個月后须蜗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡目溉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年明肮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缭付。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡柿估,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陷猫,到底是詐尸還是另有隱情秫舌,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布烙丛,位于F島的核電站舅巷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏河咽。R本人自食惡果不足惜钠右,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忘蟹。 院中可真熱鬧飒房,春花似錦、人聲如沸媚值。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥芒。三九已至嚼松,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锰扶,已是汗流浹背献酗。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坷牛,地道東北人罕偎。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像京闰,于是被迫代替她去往敵國和親颜及。 傳聞我的和親對象是個殘疾皇子甩苛,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容