kubernetes高可用安裝工具郁岩,一條命令问慎,離線安裝如叼,包含所有依賴(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)如下圖所示:

概述與設(shè)計(jì)原則


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

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

  • 支持離線安裝,工具與資源包(二進(jìn)制程序 配置文件 鏡像 yaml文件等)分離,這樣不同版本替換不同離線包即可
  • 證書(shū)延期
  • 使用簡(jiǎn)單
  • 支持自定義配置
  • 內(nèi)核負(fù)載概作,極其穩(wěn)定讯榕,因?yàn)楹?jiǎn)單所以排查問(wèn)題也極其簡(jiǎn)單

1. 為什么不使用ansible


1.0版本確實(shí)是用ansible實(shí)現(xiàn)愚屁,但是用戶(hù)還是需要先裝ansile霎槐,裝ansible有需要裝python和一些依賴(lài)等栽燕,為了不讓用戶(hù)那么麻煩把a(bǔ)nsible放到了容器里供用戶(hù)使用改淑。如果不想配置免密鑰使用用戶(hù)名密碼時(shí)又需要ssh-pass等朵夏,總之不能讓我滿(mǎn)意仰猖,不是我想的極簡(jiǎn)鸵赫。

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

2. 為什么不用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的,api掛了即使haproxy在集群也會(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占滿(mǎn)的情況。

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

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

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


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

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

如果使用envoy等需要在每個(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)核走的皆刺,不需要再把包走到用戶(hù)態(tài)中去處理。

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

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

4. 為什么要定制kubeadm


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

其次就是做本地負(fù)載時(shí)修改kubeadm代碼是最方便的,因?yàn)樵趈oin時(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了

使用教程


1. 安裝依賴(lài)


2. 安裝教程


多 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)就完事了众弓。是不是覺(jué)得一臉懵逼?就是這么簡(jiǎn)單快捷8艄俊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用戶(hù)名
--passwd   服務(wù)器ssh用戶(hù)密碼
--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)

檢查安裝是否正常:

[root@iZj6cdqfqw4o4o9tc0q44rZ ~]# 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
[root@iZj6cdqfqw4o4o9tc0q44rZ ~]# 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

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


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

kubeadm token create --print-join-command

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

cd kube/shell && init.sh
echo "10.103.97.2 apiserver.cluster.local" >> /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

4. 使用自定義kubeadm配置文件


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

首先獲取配置文件模板:

sealos config -t kubeadm >>  kubeadm-config.yaml.tmpl

修改kubeadm-config.yaml.tmpl,文件即可瀑志, 編輯增加 sealyun.com, 注意其它部分不用動(dòng)涩搓,sealos會(huì)自動(dòng)填充模板里面的內(nèi)容:

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 # this is what I added
        - 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"

最后在部署時(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 

5. 版本升級(jí)


本教程以1.14版本升級(jí)到1.15為例,其它版本原理大差不差劈猪,懂了這個(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 && sh init.sh
這里會(huì)把kubeadm kubectl kubelet bin文件都更新掉昧甘,而且會(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ì)的話基本就ok了

kubeadm upgrade apply 干了啥

  1. 檢查集群是否可升級(jí)
  2. 執(zhí)行版本升級(jí)策略 哪些版本之間可以升級(jí)
  3. 確認(rèn)鏡像可在
  4. 執(zhí)行控制組件升級(jí)常侦,如果失敗就回滾浇冰,其實(shí)就是apiserver controller manager scheduler 等這些容器
  5. 執(zhí)行kube-dns 和kube-proxy的升級(jí)
  6. 創(chuàng)建新的證書(shū)文件,備份老的如果其超過(guò)180天

6. 源碼編譯


因?yàn)槭褂昧薾etlink庫(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

7. 清理聋亡、卸載


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

Sealos實(shí)現(xiàn)原理


1. 執(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等

    有個(gè)細(xì)節(jié)是所有對(duì)apiserver進(jìn)行訪問(wèn)都是通過(guò)域名脖含,因?yàn)閙aster上連接自己就行,node需要通過(guò)虛擬ip鏈接多個(gè)master仅仆,這個(gè)每個(gè)節(jié)點(diǎn)的kubelet與kube-proxy訪問(wèn)apiserver的地址是不一樣的器赞,而kubeadm又只能在配置文件中指定一個(gè)地址,所以使用一個(gè)域名但是每個(gè)節(jié)點(diǎn)解析不同墓拜。使用域名的好處還有就是IP地址發(fā)生變化時(shí)僅需要修改解析即可港柜。

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


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

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

在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的地址解析

3. 定制kubeadm


對(duì)kubeadm改動(dòng)非常少涌韩,主要是證書(shū)時(shí)間延長(zhǎng)和join命令的擴(kuò)展,主要講講join命令的改造:

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

flagSet.StringSliceVar(
    &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了

如果不是控制節(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去守護(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" >> /etc/hosts # 解析的是master0的地址
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs  
mkdir ~/.kube && 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" >> /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" >> /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.101/g" -i /etc/hosts

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

echo "10.103.97.1 apiserver.cluster.local" >> /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

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


.
├── bin  # 指定版本的bin文件棚放,只需要這三個(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腳本中拷貝bin文件到$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)保持兼容穴店。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撕捍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泣洞,更是在濱河造成了極大的恐慌忧风,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件球凰,死亡現(xiàn)場(chǎng)離奇詭異狮腿,居然都是意外死亡腿宰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)缘厢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吃度,“玉大人,你說(shuō)我怎么就攤上這事贴硫〈幻浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵英遭,是天一觀的道長(zhǎng)间护。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挖诸,這世上最難降的妖魔是什么汁尺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮多律,結(jié)果婚禮上痴突,老公的妹妹穿的比我還像新娘。我一直安慰自己狼荞,他們只是感情好辽装,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著粘秆,像睡著了一般如迟。 火紅的嫁衣襯著肌膚如雪收毫。 梳的紋絲不亂的頭發(fā)上攻走,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音此再,去河邊找鬼昔搂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛输拇,可吹牛的內(nèi)容都是我干的摘符。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼策吠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逛裤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猴抹,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤带族,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蟀给,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝙砌,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阳堕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了择克。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恬总。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肚邢,靈堂內(nèi)的尸體忽然破棺而出壹堰,到底是詐尸還是另有隱情,我是刑警寧澤骡湖,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布缀旁,位于F島的核電站,受9級(jí)特大地震影響勺鸦,放射性物質(zhì)發(fā)生泄漏并巍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一换途、第九天 我趴在偏房一處隱蔽的房頂上張望懊渡。 院中可真熱鬧,春花似錦军拟、人聲如沸剃执。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肾档。三九已至,卻和暖如春辫继,著一層夾襖步出監(jiān)牢的瞬間怒见,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工姑宽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遣耍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓炮车,卻偏偏與公主長(zhǎng)得像舵变,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘦穆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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