你好蕊程,我是張磊矛缨。今天我和你分享的主題是:Kubernetes 一鍵部署利器之 kubeadm。
通過前面幾篇文章的內(nèi)容呀酸,我其實闡述了這樣一個思想:要真正發(fā)揮容器技術(shù)的實力错览,你就不能僅僅局限于對 Linux 容器本身的鉆研和使用。
這些知識更適合作為你的技術(shù)儲備煌往,以便在需要的時候可以幫你更快的定位問題倾哺,并解決問題。
而更深入的學(xué)習(xí)容器技術(shù)的關(guān)鍵在于刽脖,如何使用這些技術(shù)來“容器化”你的應(yīng)用羞海。
比如,我們的應(yīng)用既可能是 Java Web 和 MySQL 這樣的組合曲管,也可能是 Cassandra 這樣的分布式系統(tǒng)却邓。而要使用容器把后者運(yùn)行起來,你單單通過 Docker 把一個 Cassandra 鏡像跑起來是沒用的翘地。
要把 Cassandra 應(yīng)用容器化的關(guān)鍵申尤,在于如何處理好這些Cassandra 容器之間的編排關(guān)系癌幕。比如衙耕,哪些 Cassandra 容器是主昧穿,哪些是從?主從容器如何區(qū)分橙喘?它們之間又如何進(jìn)行自動發(fā)現(xiàn)和通信时鸵?Cassandra 容器的持久化數(shù)據(jù)又如何保持,等等厅瞎。
這也是為什么我們要反復(fù)強(qiáng)調(diào) Kubernetes 項目的主要原因:這個項目體現(xiàn)出來的容器化“表達(dá)能力”饰潜,具有獨(dú)有的先進(jìn)性和完備性。這就使得它不僅能運(yùn)行 Java Web 與 MySQL 這樣的常規(guī)組合和簸,還能夠處理 Cassandra 容器集群等復(fù)雜編排問題彭雾。所以,對這種編排能力的剖析锁保、解讀和最佳實踐薯酝,將是本專欄最重要的一部分內(nèi)容。
不過爽柒,萬事開頭難吴菠。
作為一個典型的分布式項目,Kubernetes 的部署一直以來都是擋在初學(xué)者前面的一只“攔路虎”浩村。尤其是在 Kubernetes 項目發(fā)布初期做葵,它的部署完全要依靠一堆由社區(qū)維護(hù)的腳本。
其實心墅,Kubernetes 作為一個 Golang 項目酿矢,已經(jīng)免去了很多類似于 Python 項目要安裝語言級別依賴的麻煩。但是怎燥,除了將各個組件編譯成二進(jìn)制文件外棠涮,用戶還要負(fù)責(zé)為這些二進(jìn)制文件編寫對應(yīng)的配置文件、配置自啟動腳本刺覆,以及為 kube-apiserver 配置授權(quán)文件等等諸多運(yùn)維工作严肪。
目前,各大云廠商最常用的部署的方法谦屑,是使用 SaltStack驳糯、Ansible等運(yùn)維工具自動化地執(zhí)行這些步驟。
但即使這樣氢橙,這個部署過程依然非常繁瑣酝枢。因為,SaltStack 這類專業(yè)運(yùn)維工具本身的學(xué)習(xí)成本悍手,就可能比 Kubernetes 項目還要高帘睦。
難道 Kubernetes 項目就沒有簡單的部署方法了嗎袍患?
這個問題,在 Kubernetes 社區(qū)里一直沒有得到足夠重視竣付。直到 2017 年诡延,在志愿者的推動下,社區(qū)才終于發(fā)起了一個獨(dú)立的部署工具古胆,名叫:kubeadm肆良。
這個項目的目的,就是要讓用戶能夠通過這樣兩條指令完成一個 Kubernetes 集群的部署:
? ? ? 1 # 創(chuàng)建一個 Master 節(jié)點
? ? ? 2 $ kubeadm init
? ? ? 3?
? ? ? 4 # 將一個 Node 節(jié)點加入到當(dāng)前集群中
? ? ? 5 $ kubeadm join <Master 節(jié)點的 IP 和端口>
是不是非常方便呢逸绎?
不過惹恃,你可能也會有所顧慮:Kubernetes 的功能那么多,這樣一鍵部署出來的集群棺牧,能用于生產(chǎn)環(huán)境嗎巫糙?
為了回答這個問題,在今天這篇文章颊乘,我就先和你介紹一下 kubeadm 的工作原理吧参淹。
kubeadm 的工作原理
在上一篇文章《從容器到容器云:談?wù)?Kubernetes 的本質(zhì)》中,我已經(jīng)詳細(xì)介紹了Kubernetes 的架構(gòu)和它的組件疲牵。在部署時承二,它的每一個組件都是一個需要被執(zhí)行的、單獨(dú)的二進(jìn)制文件纲爸。所以不難想象亥鸠,SaltStack 這樣的運(yùn)維工具或者由社區(qū)維護(hù)的腳本的功能,就是要把這些二進(jìn)制文件傳輸?shù)街付ǖ臋C(jī)器當(dāng)中识啦,然后編寫控制腳本來啟停這些組件负蚊。
不過,在理解了容器技術(shù)之后颓哮,你可能已經(jīng)萌生出了這樣一個想法家妆,為什么不用容器部署Kubernetes 呢?
這樣冕茅,我只要給每個 Kubernetes 組件做一個容器鏡像伤极,然后在每臺宿主機(jī)上用 docker run 指令啟動這些組件容器,部署不就完成了嗎姨伤?
事實上哨坪,在 Kubernetes 早期的部署腳本里,確實有一個腳本就是用 Docker 部署Kubernetes項目的乍楚,這個腳本相比于 SaltStack 等的部署方式当编,也的確簡單了不少。
但是徒溪,這樣做會帶來一個很麻煩的問題忿偷,即:如何容器化 kubelet金顿。
我在上一篇文章中,已經(jīng)提到 kubelet 是Kubernetes 項目用來操作 Docker 等容器運(yùn)行時的核心組件鲤桥∽岵穑可是,除了跟容器運(yùn)行時打交道外芜壁,kubelet 在配置容器網(wǎng)絡(luò)礁凡、管理容器數(shù)據(jù)卷時高氮,都需要直接操作宿主機(jī)慧妄。
而如果現(xiàn)在 kubelet 本身就運(yùn)行在一個容器里,那么直接操作宿主機(jī)就會變得很麻煩剪芍。對于網(wǎng)絡(luò)配置來說還好塞淹,kubelet 容器可以通過不開啟 Network Namespace(即 Docker 的host network 模式)的方式,直接共享宿主機(jī)的網(wǎng)絡(luò)棧罪裹”テ眨可是,要讓 kubelet 隔著容器的Mount Namespace 和文件系統(tǒng)状共,操作宿主機(jī)的文件系統(tǒng)套耕,就有點兒困難了。
比如峡继,如果用戶想要使用 NFS 做容器的持久化數(shù)據(jù)卷冯袍,那么kubelet 就需要在容器進(jìn)行綁定掛載前,在宿主機(jī)的指定目錄上碾牌,先掛載 NFS 的遠(yuǎn)程目錄康愤。
可是,這時候問題來了舶吗。由于現(xiàn)在 kubelet 是運(yùn)行在容器里的征冷,這就意味著它要做的這個“mount -F nfs”命令,被隔離在了一個單獨(dú)的Mount Namespace 中誓琼。即检激,kubelet 做的掛載操作,不能被“傳播”到宿主機(jī)上腹侣。
對于這個問題叔收,有人說,可以使用 setns() 系統(tǒng)調(diào)用筐带,在宿主機(jī)的 Mount Namespace 中執(zhí)行這些掛載操作今穿;也有人說,應(yīng)該讓 Docker 支持一個–mnt=host的參數(shù)伦籍。
但是蓝晒,到目前為止腮出,在容器里運(yùn)行 kubelet,依然沒有很好的解決辦法芝薇,我也不推薦你用容器去部署 Kubernetes 項目胚嘲。
正因為如此,kubeadm 選擇了一種妥協(xié)方案:
? ? ? 把 kubelet 直接運(yùn)行在宿主機(jī)上洛二,然后使用容器部署其他的Kubernetes 組件馋劈。
所以,你使用 kubeadm 的第一步晾嘶,是在機(jī)器上手動安裝kubeadm妓雾、kubelet 和 kubectl 這三個二進(jìn)制文件。當(dāng)然垒迂,kubeadm 的作者已經(jīng)為各個發(fā)行版的Linux 準(zhǔn)備好了安裝包械姻,所以你只需要執(zhí)行:
1$ apt-get install kubeadm
就可以了。
接下來机断,你就可以使用“kubeadm init”部署 Master節(jié)點了楷拳。
kubeadm init 的工作流程
當(dāng)你執(zhí)行 kubeadm init 指令后,kubeadm 首先要做的吏奸,是一系列的檢查工作欢揖,以確定這臺機(jī)器可以用來部署 Kubernetes。這一步檢查奋蔚,我們稱為“Preflight Checks”她混,它可以為你省掉很多后續(xù)的麻煩。
其實旺拉,Preflight Checks 包括了很多方面产上,比如:
* Linux 內(nèi)核的版本必須是否是 3.10 以上?
*?Linux Cgroups 模塊是否可用蛾狗?
*?機(jī)器的 hostname 是否標(biāo)準(zhǔn)晋涣?在 Kubernetes 項目里,機(jī)器的名字以及一切存儲在 Etcd 中的 API 對象沉桌,都必*須使用標(biāo)準(zhǔn)的 DNS 命名(RFC 1123)谢鹊。
*?用戶安裝的 kubeadm 和 kubelet 的版本是否匹配?
*?機(jī)器上是不是已經(jīng)安裝了 Kubernetes 的二進(jìn)制文件留凭?
*?Kubernetes 的工作端口 10250/10251/10252 端口是不是已經(jīng)被占用佃扼?
*?ip、mount 等 Linux 指令是否存在蔼夜?
*?Docker 是否已經(jīng)安裝兼耀?
……
在通過了 Preflight Checks 之后,kubeadm 要為你做的,是生成 Kubernetes 對外提供服務(wù)所需的各種證書和對應(yīng)的目錄瘤运。
Kubernetes 對外提供服務(wù)時窍霞,除非專門開啟“不安全模式”,否則都要通過 HTTPS 才能訪問kube-apiserver拯坟。這就需要為 Kubernetes 集群配置好證書文件但金。
kubeadm 為 Kubernetes 項目生成的證書文件都放在 Master 節(jié)點的 /etc/kubernetes/pki 目錄下。在這個目錄下郁季,最主要的證書文件是 ca.crt 和對應(yīng)的私鑰ca.key冷溃。
此外,用戶使用 kubectl 獲取容器日志等 streaming操作時梦裂,需要通過 kube-apiserver 向kubelet 發(fā)起請求似枕,這個連接也必須是安全的。kubeadm 為這一步生成的是apiserver-kubelet-client.crt 文件塞琼,對應(yīng)的私鑰是 apiserver-kubelet-client.key菠净。
除此之外禁舷,Kubernetes 集群中還有 Aggregate APIServer 等特性彪杉,也需要用到專門的證書,這里我就不再一一列舉了牵咙。需要指出的是派近,你可以選擇不讓 kubeadm 為你生成這些證書,而是拷貝現(xiàn)有的證書到如下證書的目錄里:
/etc/kubernetes/pki/ca.{crt,key}
這時洁桌,kubeadm 就會跳過證書生成的步驟渴丸,把它完全交給用戶處理。
證書生成后另凌,kubeadm 接下來會為其他組件生成訪問kube-apiserver 所需的配置文件谱轨。這些文件的路徑是:/etc/kubernetes/xxx.conf:
ls /etc/kubernetes/
admin.conf? controller-manager.conf? kubelet.conf? scheduler.conf
這些文件里面記錄的是,當(dāng)前這個 Master 節(jié)點的服務(wù)器地址吠谢、監(jiān)聽端口土童、證書目錄等信息。這樣工坊,對應(yīng)的客戶端(比如 scheduler献汗,kubelet 等),可以直接加載相應(yīng)的文件王污,使用里面的信息與 kube-apiserver 建立安全連接罢吃。
接下來,kubeadm 會為 Master 組件生成 Pod 配置文件昭齐。我已經(jīng)在上一篇文章中和你介紹過Kubernetes 有三個 Master 組件 kube-apiserver尿招、kube-controller-manager、kube-scheduler,而它們都會被使用 Pod 的方式部署起來就谜。
你可能會有些疑問:這時把沼,Kubernetes 集群尚不存在,難道kubeadm 會直接執(zhí)行docker run 來啟動這些容器嗎吁伺?
當(dāng)然不是饮睬。
在 Kubernetes 中,有一種特殊的容器啟動方法叫做“Static Pod”篮奄。它允許你把要部署的Pod的 YAML 文件放在一個指定的目錄里捆愁。這樣,當(dāng)這臺機(jī)器上的kubelet 啟動時窟却,它會自動檢查這個目錄昼丑,加載所有的 Pod YAML 文件,然后在這臺機(jī)器上啟動它們夸赫。
從這一點也可以看出菩帝,kubelet 在 Kubernetes 項目中的地位非常高,在設(shè)計上它就是一個完全獨(dú)立的組件茬腿,而其他 Master 組件呼奢,則更像是輔助性的系統(tǒng)容器。
在 kubeadm 中切平,Master 組件的 YAML 文件會被生成在 /etc/kubernetes/manifests 路徑下握础。比如,kube-apiserver.yaml:
apiVersion: v1
kind: Pod
metadata:
? ? ? ?annotations:
? ? ? ? ? ?scheduler.alpha.kubernetes.io/critical-pod:""
? ? ? ?creationTimestamp: null
? ? ? ?labels:
? ? ? ? ? component:kube-apiserver
? ? ? ? ? tier:control-plane
? ? ? name: kube-apiserver
? ? ? namespace: kube-system
spec:
? ? ? containers:
? ? ? - command:
? ? ? ? ?-kube-apiserver
? ? ? ? ?---authorization-mode=Node,RBAC
? ? ? ? ?---runtime-config=api/all=true
? ? ? ? ?---advertise-address=10.168.0.2
? ? ? ? ?...
? ? ? ? ?---tls-cert-file=/etc/kubernetes/pki/apiserver.crt
? ? ? ? ?---tls-private-key-file=/etc/kubernetes/pki/apiserver.key
? ? ? ? ?image:k8s.gcr.io/kube-apiserver-amd64:v1.11.1
? ? ? ? ?imagePullPolicy:IfNotPresent
? ? ? ? ?livenessProbe:
? ? ? ? ?...
? ? ? ? ?name: kube-apiserver
? ? ? ? ?resources:
? ? ? ? ?requests:
? ? ? ? ?cpu: 250m
? ? ? ? ?volumeMounts:
? ? ? ? ?- mountPath:/usr/share/ca-certificates
? ? ? ? ?name:usr-share-ca-certificates
? ? ? ? ?readOnly:true
? ? ? ? ?...
hostNetwork: true
priorityClassName:system-cluster-critical
volumes:
- hostPath:
? ? ?path:/etc/ca-certificates
? ? ?type:DirectoryOrCreate
? name:etc-ca-certificates
...
關(guān)于一個 Pod 的 YAML 文件怎么寫悴品、里面的字段如何解讀禀综,我會在后續(xù)專門的文章中為你詳細(xì)分析。在這里苔严,你只需要關(guān)注這樣幾個信息:
1. 這個 Pod 里只定義了一個容器定枷,它使用的鏡像是:k8s.gcr.io/kube-apiserver-amd64:v1.11.1 。這個鏡像是 Kubernetes 官方維護(hù)的一個組件鏡像届氢。
2. 這個容器的啟動命令(commands)是kube-apiserver --authorization-mode=Node,RBAC …欠窒,這樣一句非常長的命令。其實悼沈,它就是容器里 kube-apiserver 這個二進(jìn)制文件再加上指定的配置參數(shù)而已贱迟。
3. 如果你要修改一個已有集群的 kube-apiserver 的配置,需要修改這個 YAML 文件絮供。
4. 這些組件的參數(shù)也可以在部署時指定衣吠,我很快就會講解到。
在這一步完成后壤靶,kubeadm 還會再生成一個 Etcd 的 Pod YAML 文件缚俏,用來通過同樣的Static Pod 的方式啟動 Etcd。所以,最后 Master 組件的 Pod YAML 文件如下所示:
1$ ls /etc/kubernetes/manifests/
2 etcd.yaml? kube-apiserver.yaml? ?kube-controller-manager.yaml? ?kube-scheduler.yaml
而一旦這些 YAML 文件出現(xiàn)在被 kubelet 監(jiān)視的 /etc/kubernetes/manifests 目錄下忧换,kubelet 就會自動創(chuàng)建這些 YAML 文件中定義的 Pod恬惯,即 Master 組件的容器。
Master 容器啟動后亚茬,kubeadm 會通過檢查localhost:6443/healthz 這個 Master 組件的健康檢查 URL酪耳,等待 Master 組件完全運(yùn)行起來。
然后刹缝,kubeadm 就會為集群生成一個 bootstrap token碗暗。在后面,只要持有這個 token梢夯,任何一個安裝了 kubelet 和 kubadm 的節(jié)點言疗,都可以通過 kubeadm join 加入到這個集群當(dāng)中。
這個 token 的值和使用方法會颂砸,會在 kubeadm init結(jié)束后被打印出來噪奄。
在 token 生成之后,kubeadm 會將 ca.crt 等 Master 節(jié)點的重要信息人乓,通過 ConfigMap 的方式保存在 Etcd 當(dāng)中勤篮,供后續(xù)部署 Node 節(jié)點使用。這個 ConfigMap 的名字是cluster-info撒蟀。
kubeadm init 的最后一步叙谨,就是安裝默認(rèn)插件。Kubernetes 默認(rèn) kube-proxy 和 DNS 這兩個插件是必須安裝的保屯。它們分別用來提供整個集群的服務(wù)發(fā)現(xiàn)和 DNS 功能。其實涤垫,這兩個插件也只是兩個容器鏡像而已姑尺,所以 kubeadm 只要用Kubernetes 客戶端創(chuàng)建兩個 Pod 就可以了。
kubeadm join 的工作流程
這個流程其實非常簡單蝠猬,kubeadm init 生成bootstrap token 之后切蟋,你就可以在任意一臺安裝了 kubelet 和 kubeadm 的機(jī)器上執(zhí)行 kubeadm join 了。
可是榆芦,為什么執(zhí)行 kubeadm join 需要這樣一個token 呢柄粹?
因為,任何一臺機(jī)器想要成為 Kubernetes 集群中的一個節(jié)點匆绣,就必須在集群的kube-apiserver 上注冊驻右。可是崎淳,要想跟 apiserver 打交道堪夭,這臺機(jī)器就必須要獲取到相應(yīng)的證書文件(CA 文件)。可是森爽,為了能夠一鍵安裝恨豁,我們就不能讓用戶去Master 節(jié)點上手動拷貝這些文件。
所以爬迟,kubeadm 至少需要發(fā)起一次“不安全模式”的訪問到kube-apiserver橘蜜,從而拿到保存在 ConfigMap 中的 cluster-info(它保存了 APIServer 的授權(quán)信息)。而 bootstrap token付呕,扮演的就是這個過程中的安全驗證的角色扮匠。
只要有了 cluster-info 里的kube-apiserver 的地址、端口凡涩、證書棒搜,kubelet 就可以以“安全模式”連接到 apiserver 上,這樣一個新的節(jié)點就部署完成了活箕。
接下來力麸,你只要在其他節(jié)點上重復(fù)這個指令就可以了。
配置 kubeadm 的部署參數(shù)
我在前面講解了 kubeadm 部署 Kubernetes 集群最關(guān)鍵的兩個步驟育韩,kubeadm init 和kubeadm join克蚂。相信你一定會有這樣的疑問:kubeadm 確實簡單易用,可是我又該如何定制我的集群組件參數(shù)呢筋讨?
比如埃叭,我要指定 kube-apiserver 的啟動參數(shù),該怎么辦悉罕?
在這里赤屋,我強(qiáng)烈推薦你在使用 kubeadm init 部署Master 節(jié)點時,使用下面這條指令:
$ kubeadm init --configkubeadm.yaml
這時壁袄,你就可以給 kubeadm 提供一個 YAML 文件(比如类早,kubeadm.yaml),它的內(nèi)容如下所示(我僅列舉了主要部分):
apiVersion:kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.0
api:
? ? advertiseAddress: 192.168.0.102
? ? bindPort: 6443
? ? ...
etcd:
? ? local:
? ? ? ?dataDir:/var/lib/etcd
? ? ? ? image:""
imageRepository: k8s.gcr.io
kubeProxy:
? ? ? config:
? ? ? ? ? ?bindAddress:0.0.0.0
? ? ? ? ? ?...
kubeletConfiguration:
? ? ? ?baseConfig:
? ? ? ? ? ? address:0.0.0.0
? ? ? ? ? ? ...
networking:
? ? ? dnsDomain: cluster.local
? ? ? podSubnet: ""
? ? ? serviceSubnet: 10.96.0.0/12
nodeRegistration:
? ? ? criSocket:/var/run/dockershim.sock
? ? ? ...
通過制定這樣一個部署參數(shù)配置文件嗜逻,你就可以很方便地在這個文件里填寫各種自定義的部署參數(shù)了涩僻。比如,我現(xiàn)在要指定 kube-apiserver 的參數(shù)栈顷,那么我只要在這個文件里加上這樣一段信息:
...
apiServerExtraArgs:
? ? ?advertise-address: 192.168.0.103
? ? ?anonymous-auth: false
? ? ?enable-admission-plugins:AlwaysPullImages,DefaultStorageClass
? ? ?audit-log-path:/home/johndoe/audit.log
然后逆日,kubeadm 就會使用上面這些信息替換/etc/kubernetes/manifests/kube-apiserver.yaml 里的 command 字段里的參數(shù)了。
而這個 YAML 文件提供的可配置項遠(yuǎn)不止這些萄凤。比如室抽,你還可以修改kubelet 和kube-proxy的配置,修改 Kubernetes 使用的基礎(chǔ)鏡像的 URL(默認(rèn)的k8s.gcr.io/xxx鏡像 URL 在國內(nèi)訪問是有困難的)蛙卤,指定自己的證書文件狠半,指定特殊的容器運(yùn)行時等等噩死。這些配置項,就留給你在后續(xù)實踐中探索了神年。
總結(jié)
在今天的這次分享中已维,我重點介紹了 kubeadm 這個部署工具的工作原理和使用方法。緊接著已日,我會在下一篇文章中垛耳,使用它一步步地部署一個完整的 Kubernetes 集群。
從今天的分享中飘千,你可以看到堂鲜,kubeadm 的設(shè)計非常簡潔。并且护奈,它在實現(xiàn)每一步部署功能時缔莲,都在最大程度地重用 Kubernetes 已有的功能,這也就使得我們在使用 kubeadm 部署Kubernetes 項目時霉旗,非常有“原生”的感覺痴奏,一點都不會感到突兀。
而 kubeadm 的源代碼厌秒,直接就在kubernetes/cmd/kubeadm 目錄下读拆,是 Kubernetes 項目的一部分。其中鸵闪,app/phases 文件夾下的代碼檐晕,對應(yīng)的就是我在這篇文章中詳細(xì)介紹的每一個具體步驟。
看到這里蚌讼,你可能會猜想辟灰,kubeadm 的作者一定是 Google公司的某個“大神”吧。
實際上啦逆,kubeadm 幾乎完全是一位高中生的作品伞矩。他叫Lucas K?ldstr?m,芬蘭人夏志,今年只有18歲。kubeadm苛让,是他 17 歲時用業(yè)余時間完成的一個社區(qū)項目沟蔑。
所以說,開源社區(qū)的魅力也在于此:一個成功的開源項目狱杰,總能夠吸引到全世界最厲害的貢獻(xiàn)者參與其中瘦材。盡管參與者的總體水平參差不齊,而且頻繁的開源活動又顯得雜亂無章難以管控仿畸,但一個有足夠熱度的社區(qū)最終的收斂方向食棕,卻一定是代碼越來越完善朗和、Bug 越來越少、功能越來越強(qiáng)大簿晓。
最后眶拉,我再來回答一下我在今天這次分享開始提到的問題:kubeadm 能夠用于生產(chǎn)環(huán)境嗎?
到目前為止(2018 年 9 月)憔儿,這個問題的答案是:不能忆植。
因為 kubeadm 目前最欠缺的是,一鍵部署一個高可用的Kubernetes 集群谒臼,即:Etcd朝刊、Master 組件都應(yīng)該是多節(jié)點集群,而不是現(xiàn)在這樣的單點蜈缤。這拾氓,當(dāng)然也正是 kubeadm 接下來發(fā)展的主要方向。
另一方面底哥,Lucas 也正在積極地把 kubeadm phases開放給用戶咙鞍,即:用戶可以更加自由地定制 kubeadm 的每一個部署步驟。這些舉措叠艳,都可以讓這個項目更加完善奶陈,我對它的發(fā)展走向也充滿了信心。
當(dāng)然附较,如果你有部署規(guī)某粤#化生產(chǎn)環(huán)境的需求,我推薦使用kops或者 SaltStack 這樣更復(fù)雜的部署工具拒课。但徐勃,在本專欄接下來的講解中,我都會以 kubeadm 為依據(jù)進(jìn)行講述早像。
* 一方面僻肖,作為 Kubernetes 項目的原生部署工具,kubeadm對 Kubernetes 項目特性的使用和集成卢鹦,確實要比其他項目“技高一籌”臀脏,非常值得我們學(xué)習(xí)和借鑒;
* 另一方面冀自,kubeadm 的部署方法揉稚,不會涉及到太多的運(yùn)維工作,也不需要我們額外學(xué)習(xí)復(fù)雜的部署工具熬粗。而它部署的 Kubernetes 集群搀玖,跟一個完全使用二進(jìn)制文件搭建起來的集群幾乎沒有任何區(qū)別。
因此驻呐,使用 kubeadm 去部署一個 Kubernetes 集群灌诅,對于你理解 Kubernetes 組件的工作方式和架構(gòu)芳来,最好不過了。
思考題
1. 在 Linux 上為一個類似 kube-apiserver 的 Web Server 制作證書猜拾,你知道可以用哪些工具實現(xiàn)嗎即舌?
2. 回憶一下我在前面文章中分享的 Kubernetes 架構(gòu),你能夠說出 Kubernetes 各個功能組件之間(包含 Etcd)关带,都有哪些建立連接或者調(diào)用的方式嗎侥涵?(比如:HTTP/HTTPS,遠(yuǎn)程調(diào)用等等)
感謝你的收聽宋雏,歡迎你給我留言芜飘,也歡迎分享給更多的朋友一起閱讀。
文章回復(fù):
Antergone
有一個ansible playbook可以推薦給大家磨总。https://github.com/gjmzj/kubeasz初學(xué)者可以跟著一步步看原理嗦明,后期還可以自己定制化。主要是容易產(chǎn)生興趣蚪燕。
2018-09-14
MiracleWong
我也補(bǔ)充一個可用于部署生產(chǎn)級別的Kubernetes的開源項目:https://github.com/kubernetes-incubator/kubespray 我們公司正在使用娶牌。
2018-09-16
yandd
推薦個k8s實驗平臺https://console.magicsandbox.com,可能需要fan qiang才能訪問
2018-09-15
包治結(jié)巴
https://time.geekbang.org/column/article/39712
2018/11/17
張老師馆纳,后面能講講怎么用二進(jìn)制部署kubernetes嗎诗良?畢竟kubeadm不適用于生產(chǎn)環(huán)境,用二進(jìn)制部署還是挺復(fù)雜的鲁驶,懇請老師不吝講解一下吧鉴裹。
2018-09-14
作者回復(fù)
我不建議直接使用二進(jìn)制文件部署。而建議你花時間了解一下kubeadm的高可用部署钥弯,它現(xiàn)在已經(jīng)初具雛形了径荔。寶貴的時間應(yīng)該用在刀刃上。
2018-09-14
eden
一周更新三章脆霎,有點迫不及待了总处。不過講得確實不錯,期待后面更精彩的內(nèi)容睛蛛。想請教一個問題鹦马,你怎么看待openstack和k8s的關(guān)系,哪個技術(shù)門檻更高忆肾,為什么現(xiàn)在公司更傾向于用k8s來實現(xiàn)自己的云菠红,而openstack有被k8s取代的趨勢。
2018-09-14
作者回復(fù)
當(dāng)然是openstack門檻更高难菌。90%用戶要的是paas。
2018-09-14
Geek_700d17
第一時間閱讀更新蔑滓,有種追劇的感覺=季啤S鼋省!
2018-09-14
張應(yīng)羅
其實國內(nèi)同學(xué)們用kubeadm安裝集群最大的攔路虎在于有幾個鏡像沒法下載燎窘,我建議大家先手動把鏡像pull 下來摹闽,從阿里的鏡像源上,然后tag成安裝所需的鏡像名稱褐健,這樣你發(fā)現(xiàn)安裝過程會異常順利
2018-09-21
作者回復(fù)
沒錯付鹿。kubeadm拉取鏡像的url是可配置的。
2018-09-21
寶仔
etcd可以先部署蚜迅,然后初始化的時候通過kubeadm.yaml指定已經(jīng)部署好的etcd舵匾。高可用可以通過部署三個master節(jié)點來解決!現(xiàn)在有個問題谁不,通過kubeadm部署生成的apiserver證書默認(rèn)有效期是一年坐梯,官方是認(rèn)為需要通過kubeadm upgrade 每年升級一次kubernetes,升級的時候也會更新證書刹帕,請問老師這個有解決方法嗎吵血?
2018-09-15
作者回復(fù)
HA的etcd也是可以用kubeadm部署的,當(dāng)然偷溺,external etcd有助于你自己做運(yùn)維蹋辅。你可以直接改證書生成的步驟,但我當(dāng)然推薦你執(zhí)行upgrade挫掏,這個操作是必須的侦另。
2018-09-16
eden
有個開源項目kubespray,支持k8s高可用部署砍濒,利用ansible來實現(xiàn)淋肾,這個項目部署的集群可以用于生產(chǎn)吧
2018-09-14
zz@zz
kbueadm init 遇到問題的同學(xué),可以從報錯日志中獲得需要的 鏡像列表
- No internet connection is available so the kubelet cannot pull or findthe following control plane images:
- k8s.gcr.io/kube-apiserver-amd64:v1.11.4
- k8s.gcr.io/kube-controller-manager-amd64:v1.11.4
- k8s.gcr.io/kube-scheduler-amd64:v1.11.4
- k8s.gcr.io/etcd-amd64:3.2.18
- You can check or miligate this in beforehand with "kubeadm configimages pull" to make sure the images
或者使用如下命令
kubeadm config images list
然后使用下邊的腳本拉鏡像并tag成指定Google的鏡像
images=(
k8s.gcr.io/kube-apiserver-amd64:v1.11.4
k8s.gcr.io/kube-controller-manager-amd64:v1.11.4
k8s.gcr.io/kube-scheduler-amd64:v1.11.4
k8s.gcr.io/kube-proxy-amd64:v1.11.4
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/coredns:1.1.3
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamek8s.g
cr.io/$imageName
done
2018-11-03
alex
對墻經(jīng)驗豐富的人來了爸邢,可以用下面這個鏡像
https://github.com/anjia0532/gcr.io_mirror
作者回復(fù)
你好樊卓,樓道門開一下。
一葉
我們的生產(chǎn)環(huán)境是二進(jìn)制安裝的杠河,把安裝步驟寫成腳本就會方便很多碌尔,分享一個二進(jìn)制安裝腳本:
https://github.com/SongCF/kubesh
2018-09-23
darling
fabric8 不是Java API 操作K8s嗎? 大神不知道券敌?唾戚??待诅?
2018-09-14
作者回復(fù)
Java只有大學(xué)交作業(yè)的時候用過……
2018-09-14
廣興
kubeadm不是也支持高可用集群搭建的嗎
2018-09-14
作者回復(fù)
這個特性還沒有完全release 叹坦,也就是GA
2018-09-14
pytimer
Kubernetes文檔上現(xiàn)在有關(guān)于使用kubeadm部署高可用集群的說明,是不是說明可以使用kubeadm結(jié)合saltstack卑雁、ansible進(jìn)行生產(chǎn)上的部署募书?
2018-09-14
作者回復(fù)
是的绪囱,kubeadm的高可用部署應(yīng)該很快就能發(fā)布了。
2018-09-14
pytimer
制作證書的工具: cfssl openssl easyrsa
2018-09-14
作者回復(fù)
贊莹捡。而是這些工具的共同點就是鬼吵,難用,不夠傻瓜……
2018-09-14
asdf100
admin.conf 這個證書配置文件 是不是etcd 連接api server 時使用篮赢?
2018-09-29
北卡
額齿椅,指正式版沒有發(fā)布嗎?
2018-09-23
作者回復(fù)
對的启泣,不過大功能已經(jīng)確定了涣脚,不必?fù)?dān)心,流程不會有太多變化
2018-09-23
北卡
不能直接回復(fù)作者的回復(fù)嗎?
“kubeadm 高可用部署還沒有GA”
GA是什么意思?
2018-09-23
作者回復(fù)
生產(chǎn)可用
2018-09-24
北卡
kubeadm可以搭建高可用集群种远,實際上我們現(xiàn)在的生產(chǎn)環(huán)境就是使用kubeadm搭建的涩澡。只是kubeadm搭建高可用集群如果完全按照官方文檔來,它生成的的證書只有一年期限坠敷。所以需要自己提前做好證書妙同。
2018-09-23
作者回復(fù)
需要注意高可用部署還沒有GA,有很多問題亟待解決膝迎。證書在升級的時候會更新的粥帚。