10 | Kubernetes一鍵部署利器:kubeadm

你好蕊程,我是張磊矛缨。今天我和你分享的主題是: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,有很多問題亟待解決膝迎。證書在升級的時候會更新的粥帚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市限次,隨后出現(xiàn)的幾起案子匈棘,更是在濱河造成了極大的恐慌九秀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吟税,居然都是意外死亡泼各,警方通過查閱死者的電腦和手機(jī)谱俭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門笙纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人突委,你說我怎么就攤上這事柏卤。” “怎么了匀油?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵缘缚,是天一觀的道長。 經(jīng)常有香客問我敌蚜,道長桥滨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮该园,結(jié)果婚禮上酸舍,老公的妹妹穿的比我還像新娘。我一直安慰自己里初,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布忽舟。 她就那樣靜靜地躺著双妨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叮阅。 梳的紋絲不亂的頭發(fā)上刁品,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音浩姥,去河邊找鬼挑随。 笑死,一個胖子當(dāng)著我的面吹牛勒叠,可吹牛的內(nèi)容都是我干的兜挨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眯分,長吁一口氣:“原來是場噩夢啊……” “哼拌汇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弊决,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤噪舀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后飘诗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體与倡,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年昆稿,在試婚紗的時候發(fā)現(xiàn)自己被綠了纺座。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡貌嫡,死狀恐怖比驻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岛抄,我是刑警寧澤别惦,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站夫椭,受9級特大地震影響掸掸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一扰付、第九天 我趴在偏房一處隱蔽的房頂上張望堤撵。 院中可真熱鬧,春花似錦羽莺、人聲如沸实昨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荒给。三九已至,卻和暖如春刁卜,著一層夾襖步出監(jiān)牢的瞬間志电,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工蛔趴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留挑辆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓孝情,卻偏偏與公主長得像鱼蝉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咧叭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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