溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何安裝kubernetes

發(fā)布時(shí)間:2021-11-12 11:26:55 來(lái)源:億速云 閱讀:159 作者:小新 欄目:云計(jì)算

這篇文章給大家分享的是有關(guān)如何安裝kubernetes的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

如何用一條命令構(gòu)建 k8s 高可用集群且不依賴(lài) haproxy 和 keepalived,也無(wú)需 ansible。通過(guò)內(nèi)核 ipvs 對(duì) apiserver 進(jìn)行負(fù)載均衡,并且?guī)?apiserver 健康檢測(cè)。架構(gòu)如下圖所示:

如何安裝kubernetes

本項(xiàng)目名叫 sealos,旨在做一個(gè)簡(jiǎn)單干凈輕量級(jí)穩(wěn)定的 kubernetes 安裝工具,能很好的支持高可用安裝。 其實(shí)把一個(gè)東西做的功能強(qiáng)大并不難,但是做到極簡(jiǎn)且靈活可擴(kuò)展就比較難。 所以在實(shí)現(xiàn)時(shí)就必須要遵循這些原則。下面介紹一下 sealos 的設(shè)計(jì)原則:

1. 設(shè)計(jì)原則

sealos 特性與優(yōu)勢(shì):

  • 支持離線安裝,工具與資源包(二進(jìn)制程序 配置文件 鏡像 yaml文件等)分離,這樣不同版本替換不同離線包即可

  • 證書(shū)延期

  • 使用簡(jiǎn)單

  • 支持自定義配置

  • 內(nèi)核負(fù)載,極其穩(wěn)定,因?yàn)楹?jiǎn)單所以排查問(wèn)題也極其簡(jiǎn)單

為什么不用 ansible?

1.0 版本確實(shí)是用 ansible 實(shí)現(xiàn),但是用戶還是需要先裝 ansile,裝 ansible 又需要裝 python 和一些依賴(lài)等,為了不讓用戶那么麻煩把 ansible 放到了容器里供用戶使用。如果不想配置免密鑰使用用戶名密碼時(shí)又需要 ssh-pass 等,總之不能讓我滿意,不是我想的極簡(jiǎn)。

所以我想就來(lái)一個(gè)二進(jìn)制文件工具,沒(méi)有任何依賴(lài),文件分發(fā)與遠(yuǎn)程命令都通過(guò)調(diào)用 sdk 實(shí)現(xiàn)所以不依賴(lài)其它任何東西,總算讓我這個(gè)有潔癖的人滿意了。

為什么不用 keepalived haproxy?

haproxy 用 static pod 跑沒(méi)有太大問(wèn)題,還算好管理,keepalived 現(xiàn)在大部分開(kāi)源 ansible 腳本都用 yum 或者 apt 等裝,這樣非常的不可控,有如下劣勢(shì):

  • 源不一致可能導(dǎo)致版本不一致,版本不一直連配置文件都不一樣,我曾經(jīng)檢測(cè)腳本不生效一直找不到原因,后來(lái)才知道是版本原因。

  • 系統(tǒng)原因安裝不上,依賴(lài)庫(kù)問(wèn)題某些環(huán)境就直接裝不上了。

  • 看了網(wǎng)上很多安裝腳本,很多檢測(cè)腳本與權(quán)重調(diào)節(jié)方式都不對(duì),直接去檢測(cè) haproxy 進(jìn)程在不在,其實(shí)是應(yīng)該去檢測(cè) apiserver 是不是 healthz 的,如果 apiserver 掛了,即使 haproxy 進(jìn)程存在,集群也會(huì)不正常了,就是偽高可用了。

  • 管理不方便,通過(guò) prometheus 對(duì)集群進(jìn)行監(jiān)控,是能直接監(jiān)控到 static pod 的但是用 systemd 跑又需要單獨(dú)設(shè)置監(jiān)控,且重啟啥的還需要單獨(dú)拉起。不如 kubelet 統(tǒng)一管理來(lái)的干凈簡(jiǎn)潔。

  • 我們還出現(xiàn)過(guò) keepalived 把 CPU 占滿的情況。

所以為了解決這個(gè)問(wèn)題,我把 keepalived 跑在了容器中(社區(qū)提供的鏡像基本是不可用的) 改造中間也是發(fā)生過(guò)很多問(wèn)題,最終好在解決了。

總而言之,累覺(jué)不愛(ài),所以在想能不能甩開(kāi) haproxy 和 keepalived 做出更簡(jiǎn)單更可靠的方案出來(lái),還真找到了。。。

本地負(fù)載為什么不使用 envoy 或者 nginx?

我們通過(guò)本地負(fù)載解決高可用問(wèn)題。

> 本地負(fù)載:在每個(gè) node 節(jié)點(diǎn)上都啟動(dòng)一個(gè)負(fù)載均衡,上游就是三個(gè) master。

如果使用 envoy 之類(lèi)的負(fù)載均衡器,則需要在每個(gè)節(jié)點(diǎn)上都跑一個(gè)進(jìn)程,消耗的資源更多,這是我不希望的。ipvs 實(shí)際也多跑了一個(gè)進(jìn)程 lvscare,但是 lvscare 只是負(fù)責(zé)管理 ipvs 規(guī)則,和 kube-proxy 類(lèi)似,真正的流量還是從很穩(wěn)定的內(nèi)核走的,不需要再把包丟到用戶態(tài)中去處理。

在架構(gòu)實(shí)現(xiàn)上有個(gè)問(wèn)題會(huì)讓使用 envoy 等變得非常尷尬,就是 join 時(shí)如果負(fù)載均衡沒(méi)有建立那是會(huì)卡住的,kubelet 就不會(huì)起來(lái),所以為此你需要先啟動(dòng) envoy,意味著你又不能用 static pod 去管理它,同上面 keepalived 宿主機(jī)部署一樣的問(wèn)題,用 static pod 就會(huì)相互依賴(lài),邏輯死鎖,雞說(shuō)要先有蛋,蛋說(shuō)要先有雞,最后誰(shuí)都沒(méi)有。

使用 ipvs 就不一樣,我可以在 join 之前先把 ipvs 規(guī)則建立好,再去 join 就可以了,然后對(duì)規(guī)則進(jìn)行守護(hù)即可。一旦 apiserver 不可訪問(wèn)了,會(huì)自動(dòng)清理掉所有 node 上對(duì)應(yīng)的 ipvs 規(guī)則, 等到 master 恢復(fù)正常時(shí)添加回來(lái)。

為什么要定制 kubeadm?

首先是由于 kubeadm 把證書(shū)過(guò)期時(shí)間寫(xiě)死了,所以需要定制把它改成 99 年,雖然大部分人可以自己去簽個(gè)新證書(shū),但是我們還是不想再依賴(lài)個(gè)別的工具,就直接改源碼了。

其次就是做本地負(fù)載時(shí)修改 kubeadm 代碼是最方便的,因?yàn)樵?join 時(shí)我們需要做兩個(gè)事,第一是 join 之前先創(chuàng)建好 ipvs 規(guī)則,第二是創(chuàng)建 static pod。如果這塊不去定制 kubeadm 就把報(bào)靜態(tài) pod 目錄已存在的錯(cuò)誤,忽略這個(gè)錯(cuò)誤很不優(yōu)雅。 而且 kubeadm 中已經(jīng)提供了一些很好用的 sdk 供我們?nèi)?shí)現(xiàn)這個(gè)功能。

且這樣做之后最核心的功能都集成到 kubeadm 中了,sealos 就單單變成分發(fā)和執(zhí)行上層命令的輕量級(jí)工具了,增加節(jié)點(diǎn)時(shí)我們也就可以直接用 kubeadm 了。

2. 使用教程

安裝依賴(lài)

  • 安裝并啟動(dòng) docker

  • 下載 kubernetes 離線安裝包

  • 下載最新版本 sealos

  • 支持 kubernetes 1.14.0+

安裝

多 master HA 只需執(zhí)行以下命令:

$ sealos init --master 192.168.0.2 \
  --master 192.168.0.3 \
  --master 192.168.0.4 \
  --node 192.168.0.5 \
  --user root \
  --passwd your-server-password \
  --version v1.14.1 \
  --pkg-url /root/kube1.14.1.tar.gz

然后,就沒(méi)有然后了。。。沒(méi)錯(cuò),你的高可用集群已經(jīng)裝好了,是不是覺(jué)得一臉懵逼?就是這么簡(jiǎn)單快捷!

單 master 多 node:

$ sealos init --master 192.168.0.2 \
  --node 192.168.0.5 \ 
  --user root \
  --passwd your-server-password \
  --version v1.14.1 \
  --pkg-url /root/kube1.14.1.tar.gz

使用免密鑰或者密鑰對(duì):

$ sealos init --master 172.16.198.83 \
  --node 172.16.198.84 \
  --pkg-url https://sealyun.oss-cn-beijing.aliyuncs.com/free/kube1.15.0.tar.gz \
  --pk /root/kubernetes.pem # this is your ssh private key file \
  --version v1.15.0

參數(shù)解釋?zhuān)?/p>

--master   master服務(wù)器地址列表
--node     node服務(wù)器地址列表
--user     服務(wù)器ssh用戶名
--passwd   服務(wù)器ssh用戶密碼
--pkg-url  離線包位置,可以放在本地目錄,也可以放在一個(gè) http 服務(wù)器上,sealos 會(huì) wget 到安裝目標(biāo)機(jī)
--version  kubernetes 版本
--pk       ssh 私鑰地址,配置免密鑰默認(rèn)就是 /root/.ssh/id_rsa

其他參數(shù):

--kubeadm-config string   kubeadm-config.yaml kubeadm 配置文件,可自定義 kubeadm 配置文件
--vip string              virtual ip (default "10.103.97.2") 本地負(fù)載時(shí)虛擬 ip,不推薦修改,集群外不可訪問(wèn)

檢查安裝是否正常:

$ kubectl get node
NAME                      STATUS   ROLES    AGE     VERSION
izj6cdqfqw4o4o9tc0q44rz   Ready    master   2m25s   v1.14.1
izj6cdqfqw4o4o9tc0q44sz   Ready    master   119s    v1.14.1
izj6cdqfqw4o4o9tc0q44tz   Ready    master   63s     v1.14.1
izj6cdqfqw4o4o9tc0q44uz   Ready    <none>   38s     v1.14.1

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                              READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-5cbcccc885-9n2p8          1/1     Running   0          3m1s
kube-system   calico-node-656zn                                 1/1     Running   0          93s
kube-system   calico-node-bv5hn                                 1/1     Running   0          2m54s
kube-system   calico-node-f2vmd                                 1/1     Running   0          3m1s
kube-system   calico-node-tbd5l                                 1/1     Running   0          118s
kube-system   coredns-fb8b8dccf-8bnkv                           1/1     Running   0          3m1s
kube-system   coredns-fb8b8dccf-spq7r                           1/1     Running   0          3m1s
kube-system   etcd-izj6cdqfqw4o4o9tc0q44rz                      1/1     Running   0          2m25s
kube-system   etcd-izj6cdqfqw4o4o9tc0q44sz                      1/1     Running   0          2m53s
kube-system   etcd-izj6cdqfqw4o4o9tc0q44tz                      1/1     Running   0          118s
kube-system   kube-apiserver-izj6cdqfqw4o4o9tc0q44rz            1/1     Running   0          2m15s
kube-system   kube-apiserver-izj6cdqfqw4o4o9tc0q44sz            1/1     Running   0          2m54s
kube-system   kube-apiserver-izj6cdqfqw4o4o9tc0q44tz            1/1     Running   1          47s
kube-system   kube-controller-manager-izj6cdqfqw4o4o9tc0q44rz   1/1     Running   1          2m43s
kube-system   kube-controller-manager-izj6cdqfqw4o4o9tc0q44sz   1/1     Running   0          2m54s
kube-system   kube-controller-manager-izj6cdqfqw4o4o9tc0q44tz   1/1     Running   0          63s
kube-system   kube-proxy-b9b9z                                  1/1     Running   0          2m54s
kube-system   kube-proxy-nf66n                                  1/1     Running   0          3m1s
kube-system   kube-proxy-q2bqp                                  1/1     Running   0          118s
kube-system   kube-proxy-s5g2k                                  1/1     Running   0          93s
kube-system   kube-scheduler-izj6cdqfqw4o4o9tc0q44rz            1/1     Running   1          2m43s
kube-system   kube-scheduler-izj6cdqfqw4o4o9tc0q44sz            1/1     Running   0          2m54s
kube-system   kube-scheduler-izj6cdqfqw4o4o9tc0q44tz            1/1     Running   0          61s
kube-system   kube-sealyun-lvscare-izj6cdqfqw4o4o9tc0q44uz      1/1     Running   0          86s

增加節(jié)點(diǎn)

先獲取 join command,在 master 上執(zhí)行:

$ kubeadm token create --print-join-command

可以使用超級(jí) kubeadm,但是 join 時(shí)需要增加一個(gè) --master 參數(shù):

$ cd kube/shell &amp;&amp; init.sh
$ echo "10.103.97.2 apiserver.cluster.local" &gt;&gt; /etc/hosts   # using vip
$ kubeadm join 10.103.97.2:6443 --token 9vr73a.a8uxyaju799qwdjv \
  --master 10.103.97.100:6443 \
  --master 10.103.97.101:6443 \
  --master 10.103.97.102:6443 \
  --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866

也可以用 sealos join 命令:

$ sealos join --master 192.168.0.2 \
  --master 192.168.0.3 \
  --master 192.168.0.4 \
  --vip 10.103.97.2 \
  --node 192.168.0.5 \
  --user root \
  --passwd your-server-password \
  --pkg-url /root/kube1.15.0.tar.gz

使用自定義 kubeadm 配置文件

有時(shí)你可能需要自定義 kubeadm 的配置文件,比如要在證書(shū)里加入域名 sealyun.com。

首先需要獲取配置文件模板:

$ sealos config -t kubeadm &gt;&gt;  kubeadm-config.yaml.tmpl

然后修改 kubeadm-config.yaml.tmpl 即可,將 sealyun.com 添加到配置中:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: {{.Version}}
controlPlaneEndpoint: "apiserver.cluster.local:6443"
networking:
  podSubnet: 100.64.0.0/10
apiServer:
        certSANs:
        - sealyun.com # 這是新增的域名
        - 127.0.0.1
        - apiserver.cluster.local
        {{range .Masters -}}
        - {{.}}
        {{end -}}
        - {{.VIP}}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
        excludeCIDRs: 
        - "{{.VIP}}/32"

注意:其它部分不用修改,sealos 會(huì)自動(dòng)填充模板里面的內(nèi)容。

最后在部署時(shí)使用 --kubeadm-config 指定配置文件模板即可:

$ sealos init --kubeadm-config kubeadm-config.yaml.tmpl \
  --master 192.168.0.2 \
  --master 192.168.0.3 \
  --master 192.168.0.4 \
  --node 192.168.0.5 \
  --user root \
  --passwd your-server-password \
  --version v1.14.1 \
  --pkg-url /root/kube1.14.1.tar.gz

版本升級(jí)

本教程以 1.14 版本升級(jí)到 1.15 為例,其它版本原理類(lèi)似,懂了這個(gè)其它的參考官方教程即可。

升級(jí)過(guò)程
  1. 升級(jí) kubeadm,所有節(jié)點(diǎn)導(dǎo)入鏡像

  2. 升級(jí)控制節(jié)點(diǎn)

  3. 升級(jí) master(控制節(jié)點(diǎn))上的 kubelet

  4. 升級(jí)其它 master(控制節(jié)點(diǎn))

  5. 升級(jí) node

  6. 驗(yàn)證集群狀態(tài)

升級(jí) kubeadm

把離線包拷貝到所有節(jié)點(diǎn)執(zhí)行 cd kube/shell &amp;&amp; sh init.sh。這里會(huì)把 kubeadm、kubectl、kubelet 的二進(jìn)制文件都更新掉,而且會(huì)導(dǎo)入高版本鏡像。

升級(jí)控制節(jié)點(diǎn)
$ kubeadm upgrade plan
$ kubeadm upgrade apply v1.15.0

重啟 kubelet:

$ systemctl restart kubelet

其實(shí) kubelet 升級(jí)很簡(jiǎn)單粗暴,我們只需要把新版本的 kubelet 拷貝到 /usr/bin 下面,重啟 kubelet service 即可,如果程序正在使用不讓覆蓋那么就停一下 kubelet 再進(jìn)行拷貝,kubelet bin 文件在 conf/bin 目錄下。

升級(jí)其它控制節(jié)點(diǎn)
$ kubeadm upgrade apply
升級(jí) node

驅(qū)逐節(jié)點(diǎn)(要不要驅(qū)逐看情況, 喜歡粗暴的直接來(lái)也沒(méi)啥):

$ kubectl drain $NODE --ignore-daemonsets

更新 kubelet 配置:

$ kubeadm upgrade node config --kubelet-version v1.15.0

然后升級(jí) kubelet。同樣是替換二進(jìn)制再重啟 kubelet service。

$ systemctl restart kubelet

召回失去的愛(ài)情:

$ kubectl uncordon $NODE
驗(yàn)證
$ kubectl get nodes

如果版本信息都對(duì)的話基本就升級(jí)成功了。

kubeadm upgrade apply 干了啥?
  1. 檢查集群是否可升級(jí)

  2. 執(zhí)行版本升級(jí)策略 哪些版本之間可以升級(jí)

  3. 確認(rèn)鏡像是否存在

  4. 執(zhí)行控制組件升級(jí),如果失敗就回滾,其實(shí)就是 apiserver、controller manager、scheduler 等這些容器

  5. 升級(jí) kube-dns 和 kube-proxy

  6. 創(chuàng)建新的證書(shū)文件,備份老的如果其超過(guò) 180 天

源碼編譯

因?yàn)槭褂昧?netlink 庫(kù),所以推薦在容器內(nèi)進(jìn)行編譯,只需一條命令:

$ docker run --rm -v $GOPATH/src/github.com/fanux/sealos:/go/src/github.com/fanux/sealos -w /go/src/github.com/fanux/sealos -it golang:1.12.7  go build

如果你使用的是 go mod,則需要指定通過(guò) vendor 編譯:

$ go build -mod vendor

卸載

$ sealos clean \
  --master 192.168.0.2 \
  --master 192.168.0.3 \
  --master 192.168.0.4 \
  --node 192.168.0.5 \
  --user root \
  --passwd your-server-password

3. sealos 實(shí)現(xiàn)原理

執(zhí)行流程

  • 通過(guò) sftp或者 wget 把離線安裝包拷貝到目標(biāo)機(jī)器上(masters 和 nodes)。

  • 在 master0 上執(zhí)行 kubeadm init。

  • 在其它 master 上執(zhí)行 kubeadm join 并設(shè)置控制面,這個(gè)過(guò)程會(huì)在其它 master 上起動(dòng) etcd 并與 master0 的 etcd 組成集群,并啟動(dòng)控制平面的組件(apiserver、controller 等)。

  • join node 節(jié)點(diǎn),會(huì)在 node 上配置 ipvs 規(guī)則,配置 /etc/hosts 等。

> 所有對(duì) apiserver 的請(qǐng)求都是通過(guò)域名進(jìn)行訪問(wèn),因?yàn)?node 需要通過(guò)虛擬 ip 連接多個(gè) master,每個(gè)節(jié)點(diǎn)的 kubelet 與 kube-proxy 訪問(wèn) apiserver 的虛擬地址是不一樣的,而 kubeadm 又只能在配置文件中指定一個(gè)地址,所以使用一個(gè)域名但是每個(gè)節(jié)點(diǎn)解析的 IP 不同。當(dāng) IP 地址發(fā)生變化時(shí)僅需要修改解析地址即可。

本地內(nèi)核負(fù)載

通過(guò)這樣的方式實(shí)現(xiàn)每個(gè) node 上通過(guò)本地內(nèi)核負(fù)載均衡訪問(wèn) masters:

  +----------+                       +---------------+  virturl server: 127.0.0.1:6443
  | mater0   |&lt;----------------------| ipvs nodes    |    real servers:
  +----------+                      |+---------------+            10.103.97.200:6443
                                    |                             10.103.97.201:6443
  +----------+                      |                             10.103.97.202:6443
  | mater1   |&lt;---------------------+
  +----------+                      |
                                    |
  +----------+                      |
  | mater2   |&lt;---------------------+
  +----------+

在 node 上起了一個(gè) lvscare 的 static pod 去守護(hù)這個(gè) ipvs,一旦 apiserver 不可訪問(wèn)了,會(huì)自動(dòng)清理掉所有 node 上對(duì)應(yīng)的 ipvs 規(guī)則, master 恢復(fù)正常時(shí)添加回來(lái)。

所以在你的 node 上加了三個(gè)東西,可以直觀的看到:

$ cat /etc/kubernetes/manifests   # 這下面增加了 lvscare 的 static pod
$ ipvsadm -Ln                     # 可以看到創(chuàng)建的ipvs規(guī)則
$ cat /etc/hosts                  # 增加了虛擬IP的地址解析

定制 kubeadm

sealos 對(duì) kubeadm 改動(dòng)非常少,主要是延長(zhǎng)了證書(shū)過(guò)期時(shí)間和擴(kuò)展了 join 命令。下面主要講講對(duì) join 命令的改造。

首先 join 命令增加 --master 參數(shù)用于指定 master 地址列表:

lagSet.StringSliceVar(
	&amp;locallb.LVScare.Masters, "master", []string{},
	"A list of ha masters, --master 192.168.0.2:6443  --master 192.168.0.2:6443  --master 192.168.0.2:6443",
)

這樣就可以拿到 master 地址列表去做 ipvs 負(fù)載均衡了。

如果不是控制節(jié)點(diǎn)且不是單 master,那么就只創(chuàng)建一條 ipvs 規(guī)則,控制節(jié)點(diǎn)上不需要?jiǎng)?chuàng)建,連自己的 apiserver 即可:

if data.cfg.ControlPlane == nil {
			fmt.Println("This is not a control plan")
			if len(locallb.LVScare.Masters) != 0 {
				locallb.CreateLocalLB(args[0])
			}
		}

然后再去創(chuàng)建 lvscare static pod 來(lái)守護(hù) ipvs:

if len(locallb.LVScare.Masters) != 0 {
				locallb.LVScareStaticPodToDisk("/etc/kubernetes/manifests")
			}

**所以哪怕你不使用 sealos,也可以直接用定制過(guò)的 kubeadm 去部署集群,只是麻煩一些。**下面給出安裝步驟。

kubeadm 配置文件:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.14.0
controlPlaneEndpoint: "apiserver.cluster.local:6443" # apiserver DNS name
apiServer:
        certSANs:
        - 127.0.0.1
        - apiserver.cluster.local
        - 172.20.241.205
        - 172.20.241.206
        - 172.20.241.207
        - 172.20.241.208
        - 10.103.97.1          # virturl ip
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
        excludeCIDRs: 
        - "10.103.97.1/32" # 注意:如果不加這個(gè),kube-proxy 就會(huì)清理你的規(guī)則

master0(假設(shè) vip 地址為 10.103.97.100)上執(zhí)行以下命令:

$ echo "10.103.97.100 apiserver.cluster.local" &gt;&gt; /etc/hosts # 解析的是 master0 的地址
$ kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs  
$ mkdir ~/.kube &amp;&amp; cp /etc/kubernetes/admin.conf ~/.kube/config
$ kubectl apply -f https://docs.projectcalico.org/v3.6/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

master1(假設(shè) vip 地址為 10.103.97.101)上執(zhí)行以下命令:

$ echo "10.103.97.100 apiserver.cluster.local" &gt;&gt; /etc/hosts #解析的是 master0 的地址,為了能正常 join 進(jìn)去
$ kubeadm join 10.103.97.100:6443 --token 9vr73a.a8uxyaju799qwdjv \
    --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 \
    --experimental-control-plane \
    --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07 

$ sed "s/10.103.97.100/10.103.97.101/g" -i /etc/hosts  # 解析再換成自己的地址,否則就都依賴(lài) master0 的偽高可用了

master2(假設(shè) vip 地址為 10.103.97.102)上執(zhí)行以下命令:

$ echo "10.103.97.100 apiserver.cluster.local" &gt;&gt; /etc/hosts
$ kubeadm join 10.103.97.100:6443 --token 9vr73a.a8uxyaju799qwdjv \
    --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 \
    --experimental-control-plane \
    --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07  

$ sed "s/10.103.97.100/10.103.97.102/g" -i /etc/hosts

在 node 上 join 時(shí)加上 --master 參數(shù)指定 master 地址列表:

$ echo "10.103.97.1 apiserver.cluster.local" &gt;&gt; /etc/hosts   # 需要解析成虛擬 ip
$ kubeadm join 10.103.97.1:6443 --token 9vr73a.a8uxyaju799qwdjv \
    --master 10.103.97.100:6443 \
    --master 10.103.97.101:6443 \
    --master 10.103.97.102:6443 \
    --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866

離線包結(jié)構(gòu)分析

.
├── bin  # 指定版本的二進(jìn)制文件,只需要這三個(gè),其它組件跑在容器里
│   ├── kubeadm
│   ├── kubectl
│   └── kubelet
├── conf
│   ├── 10-kubeadm.conf  # 這個(gè)文件新版本沒(méi)用到,我在 shell 里直接生成,這樣可以檢測(cè) cgroup driver
│   ├── dashboard
│   │   ├── dashboard-admin.yaml
│   │   └── kubernetes-dashboard.yaml
│   ├── heapster
│   │   ├── grafana.yaml
│   │   ├── heapster.yaml
│   │   ├── influxdb.yaml
│   │   └── rbac
│   │       └── heapster-rbac.yaml
│   ├── kubeadm.yaml # kubeadm 的配置文件
│   ├── kubelet.service  # kubelet systemd 配置文件
│   ├── net
│   │   └── calico.yaml
│   └── promethus
├── images  # 所有鏡像包
│   └── images.tar
└── shell
    ├── init.sh  # 初始化腳本
    └── master.sh # 運(yùn)行master腳本
  • init.sh 腳本會(huì)將 bin 目錄下的二進(jìn)制文件拷貝到 $PATH 下面,并配置好 systemd,關(guān)閉 swap 和防火墻等等,然后導(dǎo)入集群所需要的鏡像。

  • master.sh 主要執(zhí)行了 kubeadm init。

  • conf 目錄下面包含了 kubeadm 的配置文件,calico yaml 文件等等。

  • sealos 會(huì)調(diào)用上面的兩個(gè)腳本,所以大部分兼容。不同版本都可以通過(guò)微調(diào)腳本來(lái)保持兼容。

感謝各位的閱讀!關(guān)于“如何安裝kubernetes”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI