摘要:上一章中,我們用去搭建單機(jī)集群,并且創(chuàng)建在三章中講解,本篇將介紹利用部署多節(jié)點(diǎn)集群,并學(xué)會(huì)安裝以及使用的命令行工具,快速創(chuàng)建集群實(shí)例,完成部署應(yīng)用的實(shí)踐。
上一章中,我們用 minikube 去搭建單機(jī)集群,并且創(chuàng)建 Deployment、Service(在三章中講解),本篇將介紹利用 kubeadm 部署多節(jié)點(diǎn)集群,并學(xué)會(huì) 安裝以及使用 kubernetes 的命令行工具,快速創(chuàng)建集群實(shí)例,完成部署 hello world 應(yīng)用的實(shí)踐。
Kubeadm 是 CKAD 認(rèn)證中要求掌握的部署方式,但是鏡像需要國(guó)外網(wǎng)絡(luò)才能下載,讀者如果是國(guó)內(nèi)服務(wù)器,可以參考 2.4 章的內(nèi)容,使用國(guó)內(nèi)服務(wù)器進(jìn)行代理。
本章內(nèi)容主要介紹如何安裝 kubeadm 以及部署集群、添加節(jié)點(diǎn)。
需要提前在服務(wù)器安裝好 Docker。
本文為作者的 Kubernetes 系列電子書(shū)的一部分,電子書(shū)已經(jīng)開(kāi)源,歡迎關(guān)注,電子書(shū)瀏覽地址:
https://k8s.whuanle.cn【適合國(guó)內(nèi)訪(fǎng)問(wèn)】
https://ek8s.whuanle.cn 【gitbook】
在 kubernetes 中,主要有三個(gè)日常使用的工具,這些工具使用 kube 前綴命名,這三個(gè)工具如下:
kubeadm
:用來(lái)初始化集群的指令,能夠創(chuàng)建集群已經(jīng)添加新的節(jié)點(diǎn)??捎闷渌渴鸸ぞ咛娲?。kubelet
:在集群中的每個(gè)節(jié)點(diǎn)上用來(lái)啟動(dòng) Pod 和容器等,每個(gè)節(jié)點(diǎn)必須有,相對(duì)于節(jié)點(diǎn)與集群的網(wǎng)絡(luò)代理。kubectl
:用來(lái)與集群通信/交互的命令行工具,與 kubernetes API-Server 通訊,是我們操作集群的客戶(hù)端。在 1.5 章中介紹過(guò) kubelet、kubectl,kubelet 負(fù)責(zé)集群中節(jié)點(diǎn)間的通訊,kubectl 供用戶(hù)輸入命令控制集群,而且 kubeadm 則是創(chuàng)建集群、添加減少節(jié)點(diǎn)的工具。
命令行工具是每個(gè)節(jié)點(diǎn)都需要安裝的, kubectl、kubelet 兩個(gè)是必需的組件,而 kubeadm 則可以被代替。kubeadm 是 Kubenetes 官方推薦的部署工具,但由于網(wǎng)絡(luò)等各方面原因,中文社區(qū)中也開(kāi)發(fā)了一些替代項(xiàng)目,例如 Kubesphere(https://kubesphere.com.cn/),可在國(guó)內(nèi)部署 Kubernetes,省去網(wǎng)絡(luò)問(wèn)題。
下面介紹如何 通過(guò) Google 的源下載安裝工具包。
更新 apt
包索引并安裝使用 Kubernetes apt
倉(cāng)庫(kù)所需要的包:
sudo apt-get updatesudo apt-get install -y apt-transport-https ca-certificates curl
下載 Google Cloud 公開(kāi)簽名秘鑰:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
添加 Kubernetes apt
倉(cāng)庫(kù):
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
注:如果是國(guó)內(nèi)服務(wù)器,請(qǐng)忽略以上兩步,使用以下命令解決:
apt-get update && apt-get install -y apt-transport-httpscurl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat </etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial mainEOF
更新 apt
包索引,安裝 kubelet、kubeadm 和 kubectl,并鎖定其版本:
sudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectl
執(zhí)行命令檢查是否正常:
kubeadm --help
只是這里介紹一下 ubuntu 和 centos 不同的安裝方法,已經(jīng)通過(guò)前面的安裝方法安裝好,則不需要理會(huì)這一小節(jié)。
Ubuntu 和 Debain 等系統(tǒng)可以使用以下命令通過(guò)軟件倉(cāng)庫(kù)安裝:
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curlcurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.listsudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectl
Centos、RHEL 等系統(tǒng)可以使用以下命令通過(guò)軟件倉(cāng)庫(kù)安裝:
cat < /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpgEOFyum install -y kubelet kubeadm kubectl
Kubeadm 是一個(gè)創(chuàng)建管理工具,主要提供了 kubeadm init
和 kubeadm join
兩個(gè)命令,作為創(chuàng)建 Kubernetes 集群的 “快捷途徑” 的最佳實(shí)踐。
Kubernetes 集群由 Master 和 Worker 兩種節(jié)點(diǎn)組成,Master 節(jié)點(diǎn)負(fù)責(zé)控制集群所有的節(jié)點(diǎn)。
注意,本教程集群中的節(jié)點(diǎn)應(yīng)當(dāng)都是內(nèi)網(wǎng)可互通的服務(wù)器,這些服務(wù)器之間可以通過(guò)內(nèi)網(wǎng)相互訪(fǎng)問(wèn)。如果是服務(wù)器之間通過(guò)公網(wǎng)相互通訊的,操作方法請(qǐng)查詢(xún)其它教程。
1,創(chuàng)建 Master
執(zhí)行 hostname -i
查看此 node 的 ip。
我們初始化一個(gè) API Server 服務(wù),綁定地址為 192.168.0.8(按照你的ip改)。此步驟創(chuàng)建了一個(gè) master 節(jié)點(diǎn)。
注:可以直接使用 kubeadm init
,它會(huì)自動(dòng)使用默認(rèn)網(wǎng)絡(luò)ip。
kubeadm init# 或 kubeadm init --apiserver-advertise-address 192.168.0.8# 或 kubeadm init --apiserver-advertise-address $(hostname -i)
部署失敗,可以參考下面兩個(gè)命令,查看失敗原因。
systemctl status kubeletjournalctl -xeu kubelet
常見(jiàn)與 Docker 有關(guān)的錯(cuò)誤可參考: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
完成后,會(huì)提示一些信息,在提示的內(nèi)容中找到:
kubeadm join 192.168.0.8:6443 --token q25z3f.v5uo5bphvgxkjnmz / --discovery-token-ca-cert-hash sha256:0496adc212112b5485d0ff12796f66b29237d066fbc1d4d2c5e45e6add501f64
保存這段信息下來(lái)備用,后面加入節(jié)點(diǎn)時(shí)需要使用到。
如果有提示 Alternatively, if you are the root user, you can run:
則你還需要執(zhí)行下面的命令。
export KUBECONFIG=/etc/kubernetes/admin.conf
[Info] 提示
admin.conf 是連接 Kubernetes 的認(rèn)證文件,通過(guò)此文件才能連接到 kubernetes,kubectl 也需要這個(gè)文件;在 Linux 中,使用 KUBECONFIG 環(huán)境變量知道認(rèn)證文件的所在。
Linux 中每個(gè)用戶(hù)的環(huán)境變量是不同的,如果切換了用戶(hù),則也需要設(shè)置 KUBECONFIG 環(huán)境變量;如果要在別的節(jié)點(diǎn)上連接集群,則可以把這個(gè)文件復(fù)制過(guò)去。
后面的操作都需要 admin.conf 文件,否則會(huì)報(bào) The connection to the server localhost:8080 was refused - did you specify the right host or port?
。
由于 export
的環(huán)境變量不能持久化,請(qǐng)打開(kāi) ~/.bashrc
文件,把這個(gè)命令加到文件最后面。
[Info] 提示
為了保護(hù) /etc/kubernetes/admin.conf,避免直接指向,建議每個(gè)用戶(hù)復(fù)制一次此文件到用戶(hù)目錄下,其命令如下:
mkdir -p $HOME/.kubecp -f /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config
2,初始化網(wǎng)絡(luò)
這一步不是必需的,不過(guò)一般來(lái)說(shuō),部署 Kubernetes 會(huì)配置網(wǎng)絡(luò),否則會(huì)節(jié)點(diǎn)之間不能相互訪(fǎng)問(wèn),讀者可以跟著做一次,在后面的章節(jié)中我們?cè)谝惶骄烤埂?/p>
通過(guò)遠(yuǎn)程配置文件初始化網(wǎng)絡(luò),需要從第三方拉取一個(gè) yaml 文件。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d /n)" --namespace=kube-system# --namespace=kube-system 表示插件放到 kube-system 命名空間中運(yùn)行
成功的話(huà)會(huì)提示:
serviceaccount/weave-net createdclusterrole.rbac.authorization.k8s.io/weave-net createdclusterrolebinding.rbac.authorization.k8s.io/weave-net createdrole.rbac.authorization.k8s.io/weave-net createdrolebinding.rbac.authorization.k8s.io/weave-net createddaemonset.apps/weave-net created
我們也可以手動(dòng)配置,執(zhí)行 kubectl version
查看版本號(hào),找到 GitVersion:v1.21.1
,替換 yaml 文件的地址 https://cloud.weave.works/k8s/net?k8s-version=v1.21.1
,然后執(zhí)行 kubectl apply -n kube-system -f net.yaml
即可。
3,加入集群
前面已經(jīng)創(chuàng)建了 Master 節(jié)點(diǎn),接下來(lái)將另一個(gè)服務(wù)器以 Worker 節(jié)點(diǎn)的方式加入集群中。如果讀者只有一臺(tái)服務(wù)器,則可以跳過(guò)這個(gè)步驟。
當(dāng)節(jié)點(diǎn)加入 kubeadm 初始化的集群時(shí),雙方需要建立雙向信任,分為發(fā)現(xiàn)(Worker信任Master) 和 TLS 引導(dǎo)(Master信任待加入Worker)兩部分。目前有兩種加入方式,一種是通過(guò)令牌加入,一種是通過(guò) kubeconfig 文件加入。
格式:
kubeadm join --discovery-token abcdef.xxx {IP}:6443 --discovery-token-ca-cert-hash sha256:xxxkubeadm join--discovery-file file.conf
在第二個(gè)節(jié)點(diǎn)中,使用之前備份好的命令,直接執(zhí)行,加入集群,格式如下命令所示。
kubeadm join 192.168.0.8:6443 --token q25z3f.v5uo5bphvgxkjnmz / --discovery-token-ca-cert-hash sha256:0496adc212112b5485d0ff12796f66b29237d066fbc1d4d2c5e45e6add501f64
復(fù)制粘貼時(shí),要注意,可能會(huì)由于 /
換行符,導(dǎo)致粘貼時(shí),多了一個(gè)小數(shù)點(diǎn),導(dǎo)致報(bào)錯(cuò)。
查看 docker 版本:yum list installed | grep docker
和 docker version
。
如果部署過(guò)程中出現(xiàn) failed to parse kernel config: unable to load kernel module
,也說(shuō)明了 docker 版本太高,需要降級(jí)。
如果服務(wù)器裝了 dnf,那么降級(jí) docker 版本的命令:
dnf remove docker / docker-client / docker-client-latest / docker-common / docker-latest / docker-latest-logrotate / docker-logrotate / docker-selinux / docker-engine-selinux / docker-engine
dnf -y install dnf-plugins-core
dnf install docker-ce-18.06.3.ce-3.el7 docker-ce-cli containerd.io
不行的話(huà)就按照 https://docs.docker.com/engine/install/centos/ 降級(jí),或者自行按照其它方法處理。
注意,docker version
會(huì)看到 client 和 server 版本,兩者的版本號(hào)可能不一致。
在生產(chǎn)環(huán)境中,由于節(jié)點(diǎn)上已經(jīng)部署著服務(wù),因此直接刪除節(jié)點(diǎn),可能會(huì)導(dǎo)致嚴(yán)重的故障問(wèn)題。因此需要移除一個(gè)節(jié)點(diǎn)時(shí),首先要在此節(jié)點(diǎn)上驅(qū)逐所有 Pods,Kubernetes 會(huì)自動(dòng)將此節(jié)點(diǎn)上的 Pod 轉(zhuǎn)移到其它節(jié)點(diǎn)上部署(第三章會(huì)講)。
獲取集群中的所有節(jié)點(diǎn),找到需要驅(qū)逐的節(jié)點(diǎn)名稱(chēng)。
kubectl get nodes
驅(qū)逐此節(jié)點(diǎn)上所有的 Pod:
kubectl drain {node名稱(chēng)}
雖然驅(qū)逐了節(jié)點(diǎn)上所有的服務(wù),但是節(jié)點(diǎn)依然在集群中,只是 Kubernetes 不會(huì)再部署 Pod 到此節(jié)點(diǎn)上。如果需要恢復(fù)此節(jié)點(diǎn),允許繼續(xù)部署 Pod,可使用:
kubectl uncordon {節(jié)點(diǎn)名稱(chēng)}
關(guān)于驅(qū)逐,后面的章節(jié)會(huì)學(xué)習(xí)到。
注:驅(qū)逐 Pod,并一定能夠驅(qū)逐所有 Pod,有些 Pod 可能不會(huì)被清除。
最終刪除此節(jié)點(diǎn):
kubectl delete node {節(jié)點(diǎn)名稱(chēng)}
集群刪除了此節(jié)點(diǎn)后,節(jié)點(diǎn)上還保留著一些數(shù)據(jù),可以繼續(xù)清除環(huán)境。
如果步驟做錯(cuò)了想重來(lái),或者移除節(jié)點(diǎn)需要清除環(huán)境,可以執(zhí)行 kubeadm reset [flags]
命令。
注:只執(zhí)行 kubeadm reset
命令無(wú)效。
[flags]
有四種類(lèi)型:
preflight Run reset pre-flight checksupdate-cluster-status Remove this node from the ClusterStatus object.remove-etcd-member Remove a local etcd member.cleanup-node Run cleanup node.
我們需要執(zhí)行:
kubeadm reset cleanup-node kubeadm reset
即可在當(dāng)前服務(wù)器上清除 Kubernetes 殘留的 容器或者其它數(shù)據(jù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124540.html
摘要:所以,選擇把運(yùn)行直接運(yùn)行在宿主機(jī)中,使用容器部署其他組件。獨(dú)立部署方式所需機(jī)器資源多按照集群的奇數(shù)原則,這種拓?fù)涞募宏P(guān)控制平面最少就要臺(tái)宿主機(jī)了。 在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,這篇文章來(lái)詳細(xì)說(shuō)明下Kubeadm原理及部署步驟。寫(xiě)這篇文章的時(shí)候,Kubernetes1.14剛剛發(fā)布,所以部署步驟以1.14版為...
摘要:所以,選擇把運(yùn)行直接運(yùn)行在宿主機(jī)中,使用容器部署其他組件。獨(dú)立部署方式所需機(jī)器資源多按照集群的奇數(shù)原則,這種拓?fù)涞募宏P(guān)控制平面最少就要臺(tái)宿主機(jī)了。 在上篇文章minikube部署中,有提到Minikube部署Kubernetes的核心就是Kubeadm,這篇文章來(lái)詳細(xì)說(shuō)明下Kubeadm原理及部署步驟。寫(xiě)這篇文章的時(shí)候,Kubernetes1.14剛剛發(fā)布,所以部署步驟以1.14版為...
kubeadm介紹kubeadm概述Kubeadm 是一個(gè)工具,它提供了 kubeadm init 以及 kubeadm join 這兩個(gè)命令作為快速創(chuàng)建 kubernetes 集群的最佳實(shí)踐。 kubeadm 通過(guò)執(zhí)行必要的操作來(lái)啟動(dòng)和運(yùn)行一個(gè)最小可用的集群。kubeadm 只關(guān)心啟動(dòng)集群,而不關(guān)心其他工作,如部署前的節(jié)點(diǎn)準(zhǔn)備工作、安裝各種Kubernetes Dashboard、監(jiān)控解決方案...
摘要:以上便是官方的部署方法。如果使用表示讀者可參考本章內(nèi)容主要介紹了認(rèn)證中要求掌握的部署配置啟動(dòng)網(wǎng)絡(luò)插件,跟上一篇的內(nèi)容比較,主要是通過(guò)文件去控制創(chuàng)建集群,兩章的部署過(guò)程一致,只是網(wǎng)絡(luò)插件有所不同。在上一章中,我們已經(jīng)學(xué)會(huì)了使用 kubeadm 創(chuàng)建集群和加入新的節(jié)點(diǎn),在本章中,將按照 CKAD 課程的方法重新部署一遍,實(shí)際上官方教程的內(nèi)容不多,筆者寫(xiě)了兩篇類(lèi)似的部署方式,如果已經(jīng)部署了 kub...
摘要:代表的解決方案為。雖然官網(wǎng)列出的部署方式很多,但也不用被這么多種部署方式搞糊涂了。雖然只是一條命令,但其實(shí)執(zhí)行了很多步驟命令執(zhí)行后輸出如下可以看到,主要做了這些事創(chuàng)建了名為的虛擬機(jī),并在虛擬機(jī)中安裝了容器運(yùn)行時(shí)。 綜述 Kubernetes集群的組件眾多,要部署一套符合生產(chǎn)環(huán)境的集群不是一件容易的事。好在隨著社區(qū)的快速發(fā)展,特別是在它成為事實(shí)上的容器編排標(biāo)準(zhǔn)以后,基本所有的主流云平臺(tái)都...
閱讀 844·2023-04-25 19:43
閱讀 4109·2021-11-30 14:52
閱讀 3919·2021-11-30 14:52
閱讀 4024·2021-11-29 11:00
閱讀 3917·2021-11-29 11:00
閱讀 4035·2021-11-29 11:00
閱讀 3752·2021-11-29 11:00
閱讀 6597·2021-11-29 11:00