1h玩轉(zhuǎn)kubernetes
1 kubernetes
1 什么是kubernetes
Kubernetes 是一個(gè)可移植、可擴(kuò)展的開源平臺(tái),一個(gè)分布式資源調(diào)度進(jìn)行容器編排云原生的操作系統(tǒng),用于管理容器化的工作負(fù)載和服務(wù),可促進(jìn)聲明式配置和自動(dòng)化。 Kubernetes 擁有一個(gè)龐大且快速增長(zhǎng)的生態(tài),其服務(wù)、支持和工具的使用范圍相當(dāng)廣泛。
Kubernetes 這個(gè)名字源于希臘語(yǔ),意為“舵手”或“飛行員”。k8s 這個(gè)縮寫是因?yàn)?k 和 s 之間有八個(gè)字符的關(guān)系。 Google 在 2014 年開源了 Kubernetes 項(xiàng)目。 Kubernetes 建立在 的基礎(chǔ)上, 結(jié)合了社區(qū)中最優(yōu)秀的想法和實(shí)踐。
2 kubernetes能做什么
服務(wù)發(fā)現(xiàn)和負(fù)載均衡
Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來(lái)暴露容器。 如果進(jìn)入容器的流量很大, Kubernetes 可以負(fù)載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定。
存儲(chǔ)編排
Kubernetes 允許你自動(dòng)掛載你選擇的存儲(chǔ)系統(tǒng),例如本地存儲(chǔ)、公共云提供商等。
自動(dòng)部署和回滾
你可以使用 Kubernetes 描述已部署容器的所需狀態(tài), 它可以以受控的速率將實(shí)際狀態(tài)更改為期望狀態(tài)。 例如,你可以自動(dòng)化 Kubernetes 來(lái)為你的部署創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。
自動(dòng)完成裝箱計(jì)算
你為 Kubernetes 提供許多節(jié)點(diǎn)組成的集群,在這個(gè)集群上運(yùn)行容器化的任務(wù)。 你告訴 Kubernetes 每個(gè)容器需要多少 CPU 和內(nèi)存 (RAM)。 Kubernetes 可以將這些容器按實(shí)際情況調(diào)度到你的節(jié)點(diǎn)上,以最佳方式利用你的資源。
自我修復(fù)
Kubernetes 將重新啟動(dòng)失敗的容器、替換容器、殺死不響應(yīng)用戶定義的運(yùn)行狀況檢查的容器, 并且在準(zhǔn)備好服務(wù)之前不將其通告給客戶端。
密鑰與配置管理
Kubernetes 允許你存儲(chǔ)和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應(yīng)用程序配置,也無(wú)需在堆棧配置中暴露密鑰。
3 如何操作kubernetes
一切皆為資源”的設(shè)計(jì)是 Kubernetes 能夠順利施行聲明式 API 的必要前提,對(duì)k8s集群管理就是管理k8的資源 ? ?K8S中所有的內(nèi)容都抽象為資源,對(duì)資源進(jìn)行增刪查改
我們通過(guò) kubernetes 的 API 來(lái)操作整個(gè)集群。 可以通過(guò) kubectl、ui、curl 最終發(fā)送 http+json/yaml 方式的請(qǐng)求給 API Server,然后控制 k8s 集群。k8s 里的所有的資源對(duì)象都可以采用 yaml 或 JSON 格式的文件定義或描述
管理K8S核心資源的三種基本方式
1 陳述式管理方式- 主要依賴命令行CLI工具進(jìn)行管理 ?Kubectl
2 聲明式管理方式 -主要依賴統(tǒng)一資源配置清單(manifest)進(jìn)行管理
3 GUI管理方式圖形界面
操作kubernetes實(shí)際上就是增刪改查
2 kubernetes名詞解釋
1 基本概念
集群Cluster
節(jié)點(diǎn)Node 容器Container 鏡像Image 命名空間Namespace 工作負(fù)載Workload 容器組Pod 無(wú)狀態(tài)工作負(fù)載Deployment 有狀態(tài)工作負(fù)載StatefulSet 守護(hù)進(jìn)程集工作負(fù)載DaemonSet 任務(wù)Job 定時(shí)任務(wù)CronJob 自定義資源CustomResourceDefinition 服務(wù)Service 虛擬集群IPCluster IP 節(jié)點(diǎn)端口NodePort 路由Ingress 標(biāo)簽Label 配置項(xiàng)Configmap 保密字典Secret 存儲(chǔ)卷PersistentVolume 存儲(chǔ)聲明PersistentVolumeClaim 水平彈性伸縮HPA 負(fù)載均衡LoadBalancer 節(jié)點(diǎn)親和性NodeAffinity 應(yīng)用親和性PodAffinity 應(yīng)用非親和性PodAntiAffinity 選擇器LabelSelector 注解Annotation 觸發(fā)器Webhook 端點(diǎn)Endpoint 資源配額Resource Quota 資源限制Limit Range 模板Template2 組件
Kubernetes cluster consists of 一組工作機(jī)器,稱為
, 會(huì)運(yùn)行容器化應(yīng)用程序。每個(gè)集群至少有一個(gè)工作節(jié)點(diǎn)。工作節(jié)點(diǎn)會(huì)托管
,而 Pod 就是作為應(yīng)用負(fù)載的組件。管理集群中的工作節(jié)點(diǎn)和 Pod。 在生產(chǎn)環(huán)境中,控制平面通??缍嗯_(tái)計(jì)算機(jī)運(yùn)行, 一個(gè)集群通常運(yùn)行多個(gè)節(jié)點(diǎn),提供容錯(cuò)性和高可用性。
我們看下 k8s 集群的架構(gòu),從左到右,分為兩部分,第一部分是 Master 節(jié)點(diǎn)(也就是圖中的 Control Plane),第二部分是 Node 節(jié)點(diǎn)。
Master 節(jié)點(diǎn)一般包括四個(gè)組件,apiserver、scheduler、controller-manager、etcd,他們分別的作用是什么:
控制平面組件(Control Plane Components)
? ? ? 控制平面組件會(huì)為集群做出全局決策,比如資源的調(diào)度。 以及檢測(cè)和響應(yīng)集群事件
kube-apiserver提供了資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問(wèn)控制、API注冊(cè)和發(fā)現(xiàn)等機(jī)制; 該組件負(fù)責(zé)公開了 Kubernetes API,負(fù)責(zé)處理接受請(qǐng)求的工作你可以運(yùn)行
kube-apiserver
的多個(gè)實(shí)例,來(lái)平衡之間的流量controller manager負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測(cè)、自動(dòng)擴(kuò)展、滾動(dòng)更新等 是
的組件, 負(fù)責(zé)運(yùn)行 進(jìn)程。致力于將當(dāng)前狀態(tài)轉(zhuǎn)變?yōu)槠谕臓顟B(tài)節(jié)點(diǎn)控制器(Node Controller):用于在節(jié)點(diǎn)終止響應(yīng)后檢查云提供商以確定節(jié)點(diǎn)是否已被刪除
路由控制器(Route Controller):用于在底層云基礎(chǔ)架構(gòu)中設(shè)置路由
服務(wù)控制器(Service Controller):用于創(chuàng)建、更新和刪除云提供商負(fù)載均衡器
kuube- scheduler負(fù)責(zé)資源的調(diào)度,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的機(jī)器上 進(jìn)行算法的調(diào)度 很重要
etcd ?高可用的鍵值對(duì)數(shù)據(jù)庫(kù) ? ?用作 Kubernetes 的所有集群數(shù)據(jù)的后臺(tái)數(shù)據(jù)庫(kù)
Node組件
? ? ? ? ? ? ?節(jié)點(diǎn)組件會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行,負(fù)責(zé)維護(hù)運(yùn)行的 Pod 并提供 Kubernetes 運(yùn)行環(huán)境
kubelet負(fù)責(zé)維護(hù)容器的生命周期,同時(shí)也負(fù)責(zé)Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理 ,就是干活的 ?獲取某個(gè)pod的運(yùn)行狀態(tài) ? ?定時(shí)匯報(bào)當(dāng)前節(jié)點(diǎn)的狀態(tài) ? 鏡像和容器清理
Container runtime負(fù)責(zé)鏡像管理以及Pod和容器的真正運(yùn)行(CRI),具體跑應(yīng)用的載體
kube-proxy負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡,在每個(gè)節(jié)點(diǎn)上運(yùn)行網(wǎng)絡(luò)的代理 ?,serice資源的載體 建立了pod 網(wǎng)絡(luò)和集群網(wǎng)絡(luò)的關(guān)系 常用的流量調(diào)度模式 ?Ipvs 推薦 更高效 ?
插件Add-ons:
DNS 一個(gè)可選的DNS服務(wù),用于為每個(gè)Service對(duì)象創(chuàng)建DNS記錄,這樣所有的Pod就可以通過(guò)DNS訪問(wèn)服務(wù)了。
Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用戶界面。GUI管理,它使用戶可以管理集群中運(yùn)行的應(yīng)用程序以及集群本身, 并進(jìn)行故障排除。
CNI網(wǎng)絡(luò)插件 ? ?flannel/calico
服務(wù)發(fā)現(xiàn)用插件 ? coredns
服務(wù)暴露用插件 ? ? treefik
其他插件
Ingress Controller為服務(wù)提供外網(wǎng)入口
Heapster提供資源監(jiān)控
Federation提供跨可用區(qū)的集群
Fluentd-elasticsearch提供集群日志采集、存儲(chǔ)與查
coredns:可以為集群中的SVC創(chuàng)建一個(gè)域名IP的對(duì)應(yīng)關(guān)系解析
ingress controller:官方只能實(shí)現(xiàn)四層代理,INGRESS 可以實(shí)現(xiàn)七層代理
federation:提供一個(gè)可以跨集群中心多K8S統(tǒng)一管理功能
prometheus :提供K8S集群的監(jiān)控能力
elk:提供 K8S 集群日志統(tǒng)一分析介入平臺(tái) ?
3 核心概念
1 pod/Pod 控制器
pod
pod 是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計(jì)算單元,其中包含一個(gè)或多個(gè)應(yīng)用容器。 這些容器相對(duì)緊密地耦合在一起。同一個(gè)Pod里的容器之間僅需通過(guò)localhost就能互相通信。
一個(gè)Pod中的應(yīng)用容器共享五種資源:
PID命名空間:Pod中的不同應(yīng)用程序可以看到其他應(yīng)用程序的進(jìn)程ID。
網(wǎng)絡(luò)命名空間:Pod中的多個(gè)容器能夠訪問(wèn)同一個(gè)IP和端口范圍。
IPC命名空間:Pod中的多個(gè)容器能夠使用SystemV IPC或POSIX消息隊(duì)列進(jìn)行通信。
UTS命名空間:Pod中的多個(gè)容器共享一個(gè)主機(jī)名。
Volumes(共享存儲(chǔ)卷):Pod中的各個(gè)容器可以訪問(wèn)在Pod級(jí)別定義的Volumes。
pod網(wǎng)絡(luò)
一個(gè)pod都會(huì)有一個(gè)ip,集群中任意一個(gè)pod都可以通過(guò)pod分配的ip進(jìn)行訪問(wèn),但這只是在集群內(nèi)部,集群外部是訪問(wèn)不同的
pod存儲(chǔ)
一個(gè) Pod 可以設(shè)置一組共享的存儲(chǔ)
。 Pod 中的所有容器都可以訪問(wèn)該共享卷,從而允許這些容器共享數(shù)據(jù)。 卷還允許 Pod 中的持久數(shù)據(jù)保留下來(lái),即使其中的容器需要重新啟動(dòng)。pod狀態(tài)
pod生命周期
Pod 在其生命周期中只會(huì)被
一次。 一旦 Pod 被調(diào)度(分派)到某個(gè)節(jié)點(diǎn),Pod 會(huì)一直在該節(jié)點(diǎn)運(yùn)行,直到 Pod 停止或者被終止init容器
Init 容器是一種特殊容器,在
內(nèi)的應(yīng)用容器啟動(dòng)之前運(yùn)行。Init 容器可以包括一些應(yīng)用鏡像中不存在的實(shí)用工具和安裝腳本。Init 容器與普通的容器非常像,除了如下兩點(diǎn):
它們總是運(yùn)行到完成。
每個(gè)都必須在下一個(gè)啟動(dòng)之前成功完成。
如果 Pod 的 Init 容器失敗,kubelet 會(huì)不斷地重啟該 Init 容器直到該容器成功為止
pod工作流程
pod工作流程
用戶提交創(chuàng)建Pod的請(qǐng)求,可以通過(guò)API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml兩種格式;
API Server 處理用戶請(qǐng)求,存儲(chǔ)Pod數(shù)據(jù)到Etcd;
Schedule通過(guò)和 API Server的watch機(jī)制,查看到新的pod,嘗試為Pod綁定Node。調(diào)度器用一組規(guī)則過(guò)濾掉不符合要求的主機(jī),比如Pod指定了所需要的資源,那么就要過(guò)濾掉資源不夠的主機(jī),對(duì)上一步篩選出的符合要求的主機(jī)進(jìn)行打分,在主機(jī)打分階段,調(diào)度器會(huì)考慮一些整體優(yōu)化策略進(jìn)行調(diào)度;選擇打分最高的主機(jī),進(jìn)行binding操作,結(jié)果存儲(chǔ)到Etcd中;
kubelet根據(jù)調(diào)度結(jié)果執(zhí)行Pod創(chuàng)建操作。綁定成功后,會(huì)啟動(dòng)container。scheduler會(huì)調(diào)用API Server的API在etcd中創(chuàng)建一個(gè)bound pod對(duì)象,描述在一個(gè)工作節(jié)點(diǎn)上綁定運(yùn)行的所有pod信息。運(yùn)行在每個(gè)工作節(jié)點(diǎn)上的kubelet也會(huì)定期與etcd同步bound pod信息。
pod控制器
Kubernetes 通過(guò)引入 Controller(控制器)的概念來(lái)管理 Pod 實(shí)例。在 Kubernetes 中,您應(yīng)該始終通過(guò)創(chuàng)建 Controller 控制器來(lái)創(chuàng)建 Pod,而不是直接創(chuàng)建 Pod。
pod控制器 是pod啟動(dòng)的一種模板 ?用來(lái)保證k8s里啟動(dòng)的pod ?按照預(yù)期的運(yùn)行狀態(tài)
當(dāng)你創(chuàng)建一個(gè)pod你就是在告知 Kubernetes 系統(tǒng),你想要的集群工作負(fù)載狀態(tài)看起來(lái)應(yīng)是什么樣子的, 這就是 Kubernetes 集群所謂的 期望狀態(tài)(Desired State)會(huì)朝著這個(gè)方向而且努力工作的
你可以使用工作負(fù)載資源來(lái)創(chuàng)建和管理多個(gè) Pod。 資源的控制器能夠處理副本的管理、上線,
Pod 模板(Pod Template) 來(lái)替你創(chuàng)建 Pod 并管理它們。
資源的控制器通常使用修改 Pod 模板或者切換到新的 Pod 模板都不會(huì)對(duì)已經(jīng)存在的 Pod 直接起作用。 如果改變工作負(fù)載資源的 Pod 模板,工作負(fù)載資源需要使用更新后的模板來(lái)創(chuàng)建 Pod, 并使用新創(chuàng)建的 Pod 替換舊的 Pod。
最常用的工作負(fù)載類型是Deployment
Namespace
Namespace ? ? 一種能隔離k8s內(nèi)部各種資源的方法 ?這就是名稱空間 ?也可以被稱為分組 ?組內(nèi)不能有重名
default 默認(rèn)的 ? ?kube-system ?kube-public ? ?也可以自定義 ? 查詢k8s里特定資源要帶上想應(yīng)的名稱空間
Labl ?/labl
標(biāo)簽選擇器
Labl
標(biāo)簽是k8s特色的管理方式 ?,便于分類管理資源對(duì)象
一個(gè)標(biāo)簽可以對(duì)應(yīng)多個(gè)資源,多個(gè)資源也可以有多個(gè)標(biāo)簽
標(biāo)簽的組成 ?key=value ?
與標(biāo)簽差不多的是注解 ? ?不過(guò)標(biāo)簽名稱跟嚴(yán)格
Labl選擇器 過(guò)濾標(biāo)簽 ?
基于等值關(guān)系 ? 集合關(guān)系
Service /Ingress
Servic 簡(jiǎn)稱svc ? pod 服務(wù)發(fā)現(xiàn)與負(fù)載均衡 ? k8s把一組pod 公開為網(wǎng)絡(luò)服務(wù)的 ?通過(guò)標(biāo)簽來(lái)選擇的
在集群內(nèi)部任意訪問(wèn) ? ? 也可以通過(guò)域名來(lái)進(jìn)行訪問(wèn) ?
如果服務(wù)下線或者重啟 都會(huì)重新加入到service中去 ?
這導(dǎo)致了一個(gè)問(wèn)題: 如果一組 Pod(稱為“后端”)為集群內(nèi)的其他 Pod(稱為“前端”)提供功能, 那么前端如何找出并跟蹤要連接的 IP 地址,以便前端可以使用提供工作負(fù)載的后端部分?
進(jìn)入 Services。
如何在暴露公網(wǎng)ip
入主要是解決pod的動(dòng)態(tài)變化,提供統(tǒng)一的訪問(wèn)入口:
1、防止pod失聯(lián),準(zhǔn)備找到提供同一服務(wù)的pod(服務(wù)發(fā)現(xiàn))
2、定義一組Pod的訪問(wèn)策略(負(fù)載均衡)
Kubernetes 中 Service 是一個(gè) API 對(duì)象,通過(guò) kubectl + YAML 定義一個(gè) Service,可以將符合 Service 指定條件的 Pod 作為可通過(guò)網(wǎng)絡(luò)訪問(wèn)的服務(wù)提供給服務(wù)調(diào)用者。Service 是 Kubernetes 中的一種服務(wù)發(fā)現(xiàn)機(jī)制:
Pod 有自己的 IP 地址
Service 被賦予一個(gè)唯一的 dns name
Service 通過(guò) label selector 選定一組 Pod
Service 實(shí)現(xiàn)負(fù)載均衡,可將請(qǐng)求均衡分發(fā)到選定這一組 Pod
Service 每個(gè)pod都會(huì)分配一個(gè)單獨(dú)的ip地址 ,pod銷毀id也就銷毀
如何進(jìn)行流量調(diào)度
一個(gè)Service可以看作一組提供相同服務(wù)的pod的對(duì)外訪問(wèn)接口 ? ? ?
service作用于那些pod是通過(guò)標(biāo)簽選擇器來(lái)定義的
Ingress
Ingress Service的統(tǒng)一網(wǎng)關(guān)入口
這些pod可以在同一的節(jié)點(diǎn)上 也可以不在同一個(gè)節(jié)點(diǎn)上
Service引
k8s集群對(duì)外 暴露的接口 ? ? ?第七層 對(duì)外暴露的接口
Servie ?只能進(jìn)行 第四層網(wǎng)絡(luò)流量調(diào)度 ? ip+port
Ingress 可以調(diào)度不同業(yè)務(wù)領(lǐng)域,不同url訪問(wèn)路徑的業(yè)務(wù)流量
Ingress 是 Kubernetes 的一種 API 對(duì)象,將集群內(nèi)部的 Service 通過(guò) HTP/HTPS 方式暴露到集群外部,并通過(guò)規(guī)則定義 HTP/HTPS 的路由。Ingress 具備如下特性:集群外部可訪問(wèn)的 URL、負(fù)載均衡、SSL Termination、按域名路由(name-based virtual hosting)。Ingress 的例子如下所示:
節(jié)點(diǎn)管理
kube-poxy
服務(wù)代理
Kubernetes 集群中的每個(gè)節(jié)點(diǎn)都運(yùn)行了一個(gè) kube-proxy
,負(fù)責(zé)為 Service(ExternalName 類型的除外)提供虛擬 IP 訪問(wèn)。 Kubernetes 支持三種 proxy
網(wǎng)絡(luò)模型
存儲(chǔ)卷
Gllusterfs ? ? NFS ? k8s進(jìn)行抽取一一組進(jìn)行存儲(chǔ)
一個(gè)容器組可以包含多個(gè)數(shù)據(jù)卷、多個(gè)容器
一個(gè)容器通過(guò)掛載點(diǎn)(volumnMount)決定某一個(gè)數(shù)據(jù)卷(Volumn)被掛載到容器中的什么路徑 不同類型的數(shù)據(jù)卷對(duì)應(yīng)不同的存儲(chǔ)介質(zhì)(圖中僅列出了 nfs、PVC、ConfigMap 三種存儲(chǔ)介質(zhì))
IP地址
0.0.0.0
嚴(yán)格來(lái)說(shuō),0.0.0.0已經(jīng)不是一個(gè)真正意義上的IP地址了。它表示的是這樣一個(gè)集合:所有不清楚的主機(jī)和目的網(wǎng)絡(luò)。這里的不清楚是指在本機(jī)的路由表里沒有特定條目指明如何到達(dá)。作為缺省路由。
127.0.0.1
本機(jī)地址。
224.0.0.1
組播地址。如果你的主機(jī)開啟了IRDP(Internet路由發(fā)現(xiàn),使用組播功能),那么你的主機(jī)路由表中應(yīng)該有這樣一條路由。
169.254.x.x
使用了DHCP功能自動(dòng)獲取了IP的主機(jī),DHCP服務(wù)器發(fā)生故障,或響應(yīng)時(shí)間太長(zhǎng)而超出了一個(gè)系統(tǒng)規(guī)定的時(shí)間,系統(tǒng)會(huì)為你分配這樣一個(gè)IP,代表網(wǎng)絡(luò)不能正常運(yùn)行。
10.xxx、172.16.x.x~172.31.x.x、192.168.x.x
私有地址,大量用于企業(yè)內(nèi)部。保留這樣的地址是為了避免亦或是哪個(gè)接入公網(wǎng)時(shí)引起地址混亂。
3 kubernetes邏輯架構(gòu)
生成環(huán)境下 master 一般是幾數(shù)個(gè) ? ? node也有多個(gè) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1、通過(guò) Kubectl 提交一個(gè)創(chuàng)建 RC(Replication Controller)的請(qǐng)求,該請(qǐng)求通過(guò) APIServer 被寫入 etcd 中 ? ? ? ? ? ? ? ?
2、此時(shí) Controller Manager 通過(guò) API Server 的監(jiān)聽資源變化的接口監(jiān)聽到此 RC 事件
4、于是根據(jù) RC 里的 Pod 模板定義生成一個(gè) Pod 對(duì)象,通過(guò) APIServer 寫入 etcd
5、此事件被 Scheduler 發(fā)現(xiàn),它立即執(zhí)行一個(gè)復(fù)雜的調(diào)度流程,為這個(gè)新 Pod 選定一 個(gè)落戶的 Node,然后通過(guò) API Server 講這一結(jié)果寫入到 etcd 中,
6、目標(biāo) Node 上運(yùn)行的 Kubelet 進(jìn)程通過(guò) APIServer 監(jiān)測(cè)到這個(gè)“新生的”Pod,并按照它 的定義,啟動(dòng)該 Pod 并任勞任怨地負(fù)責(zé)它的下半生,直到 Pod 的生命結(jié)束。
7、隨后,我們通過(guò) Kubectl 提交一個(gè)新的映射到該 Pod 的 Service 的創(chuàng)建請(qǐng)求
8、ControllerManager 通過(guò) Label 標(biāo)簽查詢到關(guān)聯(lián)的 Pod 實(shí)例,然后生成 Service 的 Endpoints 信息,并通過(guò) APIServer 寫入到 etcd 中,
9、接下來(lái),所有 Node 上運(yùn)行的 Proxy 進(jìn)程通過(guò) APIServer 查詢并監(jiān)聽 Service 對(duì)象與 其對(duì)應(yīng)的 Endpoints 信息,建立一個(gè)軟件方式的負(fù)載均衡器來(lái)實(shí)現(xiàn) Service 訪問(wèn)到后端 Pod 的流量轉(zhuǎn)發(fā)功能。 k8s 里的所有的資源對(duì)象都可以采用 yaml 或 JSON
4 安裝
1 免費(fèi)體驗(yàn)
或者是在k8s官網(wǎng)上學(xué)習(xí)
https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/
阿里云體驗(yàn)快速入門
https://developer.aliyun.com/adc/scenarioSeries/c14b6e6d2df2454dadc4263f166fa16b?spm=a2c6h.13788135.J_2488678810.10.35402444FW6HjH
2 使用阿里云的ACK
3 minikube
https://minikube.sigs.k8s.io/docs/start/
是一個(gè)工具, 能讓你在本地運(yùn)行 Kubernetes。 minikube
在你的個(gè)人計(jì)算機(jī)(包括 Windows、macOS 和 Linux PC)上運(yùn)行一個(gè)一體化(all-in-one) 或多節(jié)點(diǎn)的本地 Kubernetes 集群,以便你來(lái)嘗試 Kubernetes 或者開展每天的開發(fā)工作。
4 kubeadman
kubeadm 是官方社區(qū)推出的一個(gè)用于快速部署 kubernetes 集群的工具。 這個(gè)工具能通過(guò)兩條指令完成一個(gè) kubernetes 集群的部署:
5 kubeke
kubershere安裝 ?
https://kubesphere.io/zh/docs/v3.3/quick-start/minimal-kubesphere-on-k8s/
一鍵安裝kubernetes ?
6 Kuboard-Spray
圖形化安裝
https://kuboard.cn/install/install-k8s.html
https://docs.rancher.cn/docs/rancher2.5/cluster-provisioning/node-requirements/_index
7 二進(jìn)制安裝
難 ?一個(gè)知名講師 ?對(duì)于一個(gè)熟練的講師來(lái)說(shuō) ?是需要一整天 ? ? ?
必須要這樣 不然 你出現(xiàn)問(wèn)題你該怎么辦 ? ?
https://www.kubernetes.org.cn/3096.html
https://blog.stanley.wang/2019/01/18/%E5%AE%9E%E9%AA%8C%E6%96%87%E6%A1%A31%EF%BC%9A%E8%B7%9F%E6%88%91%E4%B8%80%E6%AD%A5%E6%AD%A5%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2kubernetes%E9%9B%86%E7%BE%A4/
8 一鍵安裝
運(yùn)行這個(gè)腳本文件 ? vim kubernetes.sh
?#!/bin/bash
?# Author:
?
?RED="\033[31m" ? ? ?# Error message
?GREEN="\033[32m" ? ?# Success message
?YELLOW="\033[33m" ? # Warning message
?BLUE="\033[36m" ? ? # Info message
?PLAIN='\033[0m'
?
?colorEcho() {echo -e "${1}${@:2}${PLAIN}"
?}
?
?checkSystem() {result=$(id | awk '{print $1}')
? ? ?if [[ $result != "uid=0(root)" ]]; then
? ? ? ? ?colorEcho $RED "請(qǐng)以 root 身份執(zhí)行該腳本"
? ? ? ? ?exit 1
? ? ?fi
?
? ? ?res=`which yum 2>/dev/null`
? ? ?if [[ "$?" != "0" ]]; then
? ? ? ? ?res=`which apt 2>/dev/null`
? ? ? ? ?if [[ "$?" != "0" ]]; then
? ? ? ? ? ? ?colorEcho $RED "不受支持的 Linux 系統(tǒng)"
? ? ? ? ? ? ?exit 1
? ? ? ? ?fi
? ? ? ? ?PMT="apt"
? ? ? ? ?CMD_INSTALL="apt install -y"
? ? ? ? ?CMD_REMOVE="apt remove -y"
? ? ? ? ?CMD_UPGRADE="apt update && apt upgrade -y; apt autoremove -y"
? ? ?else
? ? ? ? ?PMT="yum"
? ? ? ? ?CMD_INSTALL="yum install -y"
? ? ? ? ?CMD_REMOVE="yum remove -y"
? ? ? ? ?CMD_UPGRADE="yum update -y"
? ? ?fi
? if [[ $PMT == "apt" ? ]];then
? ?? ? ? ?colorEcho $RED "不受支持的 Linux 系統(tǒng)"
? ? ? ? ? ? ?exit 1
? fi
? ? ?res=`which systemctl 2>/dev/null`
? ? ?if [[ "$?" != "0" ]]; then
? ? ? ? ?colorEcho $RED "系統(tǒng)版本過(guò)低,請(qǐng)升級(jí)到最新版本"
? ? ? ? ?exit 1
? ? ?fi
?}
?
?
?preinstall() {
? hostnamectl set-hostname $ROLE-$HOSTNAME
? ? ?#$PMT clean all
? ? ?[[ "$PMT" = "apt" ]] && $PMT update
? ? ?#echo $CMD_UPGRADE | bash
? ? ?echo ""colorEcho $BLUE" 安裝必要軟件 "if [["$PMT"="yum" ]]; then
? ? ? ? ?$CMD_INSTALL epel-release
? ? ?fi
? ? ?$CMD_INSTALL curl vim docker
? res=`which curl 2>/dev/null`
? ? ?[[ "$?" != "0" ]] && $CMD_INSTALL curl
? res=`which docker 2>/dev/null`
? ? ?[[ "$?" != "0" ]] && $CMD_INSTALL docker
? systemctl enable --now docker
?
? colorEcho $BLUE "配置服務(wù)器環(huán)境"
? ? ?if [[ -s /etc/selinux/config ]] && grep 'SELINUX=enforcing' /etc/selinux/config; then
? ? ? ? ?sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
? ? ? ? ?setenforce 0
? ? ?fi
? echo 1 > /proc/sys/net/ipv4/ip_forward
? echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
? echo 'net.ipv4.ip_forward = 1' >> ?/etc/sysctl.conf
? sysctl -p
? swapoff -a
?}
?
?installk8s(){
?cat <<EOF > /etc/yum.repos.d/kubernetes.repo
?[kubernetes]
?name=Kubernetes
?baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
?enabled=1
?gpgcheck=0
?repo_gpgcheck=0
?gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
?EOF
? colorEcho $BLUE '安裝 k8s 組件'
? $CMD_INSTALL --nogpgcheck kubelet-1.23.5-0 kubeadm-1.23.5-0 kubectl-1.23.5-0
? systemctl enable --now kubelet
?
?}
?
?getip(){
? colorEcho $BLUE "請(qǐng)選擇獲取本機(jī) ip/vip 的方式:"
? ? ?echo "1) 網(wǎng)絡(luò)獲取"
? ? ?echo "2) 手動(dòng)輸入"
? ? ?read -p "請(qǐng)選擇獲取本機(jī) ip/vip 的方式 (默認(rèn)聯(lián)網(wǎng)獲取):" answer
? if [[ -z "$answer" ]]; then
? ? ? ? ?METHOD="network"
? ? ?else
? ? ? ? ?case $answer in
? ? ? ? ?1)
? ? ? ? ? ? ?METHOD="network"
? ? ? ? ? ? ?;;
? ?2)
? ? ? ? ? ? ?METHOD="matual"
? ? ? ? ? ? ?;;
? ? ? ? ?*)
? ? ? ? ? ? ?colorEcho $RED "無(wú)效的選擇,使用默認(rèn)角色"
? ? ? ? ? ? ?METHOD="network"
? ? ? ? ?esac
? ? ?fi
? ? ?echo ""colorEcho $BLUE" 獲取本機(jī) ip/vip 的方式:$METHOD"if [[ $METHOD =='network' ]];then
? ?ip=`curl -s icanhazip.com`
? else
? ?read -p "請(qǐng)輸入本機(jī) ip/vip:" ip
? fi
? colorEcho $YELLOW "本機(jī) ip/vip 地址為: $ip"
? read -p '確認(rèn)安裝請(qǐng)按回車鍵 (CTRL+ C 退出腳本)' a
?}
?
?
?init(){
?cat <<-EOF >/root/kubeadm_init.yaml
?apiVersion: kubeadm.k8s.io/v1beta3
?kind: ClusterConfiguration
?kubernetesVersion: v1.23.5
?apiServer:
? ?certSANs:
? ?- "$ip"
?controlPlaneEndpoint: "$ip:6443"
?networking:
? ?podSubnet: 10.244.0.0/16
?imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
?EOF
? kubeadm init --config=/root/kubeadm_init.yaml|tee /root/kubeinit.log
? mkdir -p $HOME/.kube
? cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
? chown $(id -u):$(id -g) $HOME/.kube/config
? kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
? colorEcho $GREEN 'k8s 安裝完成'
?}
?
?greplog(){
? ? ? ? ?colorEcho $RED "關(guān)鍵命令,請(qǐng)注意保存"
? ? ? ? ?colorEcho $BLUE "如需部署集群"
? ? ? ? ?colorEcho $BLUE "請(qǐng)?jiān)谄渌?master 節(jié)點(diǎn)中執(zhí)行下面命令"
? ? ? ? ?echo ` grep -E ?-B 2 '\\-\\-control\-plane' /root/kubeinit.log|sed 's/\\\\//g'`
? ? ? ? ?colorEcho $BLUE "請(qǐng)?jiān)谄渌?node 節(jié)點(diǎn)執(zhí)行完腳本后執(zhí)行下面命令"
? ? ? ? ?echo `grep -E ?-B 2 '\\-\\-control\-plane' /root/kubeinit.log |grep -v control|sed 's/\\\\//g'`
?}
?
?
?menu(){
? checkSystem
? colorEcho $BLUE "請(qǐng)選擇本機(jī)的角色:"
? ? ?echo "1)master"
? ? ?echo "2)node"
? ? ?read -p "請(qǐng)選擇 k8s 角色(默認(rèn) master)" answer
? if [[ -z "$answer" ]]; then
? ? ? ? ?ROLE="master"
? ? ?else
? ? ? ? ?case $answer in
? ? ? ? ?1)
? ? ? ? ? ? ?ROLE="master"
? ? ? ? ? ? ?;;
? ?2)
? ? ? ? ? ? ?ROLE="node"
? ? ? ? ? ? ?;;
? ? ? ? ?*)
? ? ? ? ? ? ?colorEcho $RED "無(wú)效的選擇,使用默認(rèn)角色"
? ? ? ? ? ? ?ROLE="master"
? ? ? ? ?esac
? ? ?fi
? ? ?echo ""colorEcho $BLUE" 當(dāng)前 k8s 角色:$ROLE"if [[ $ROLE =='master' ]];then
? ?colorEcho $BLUE "檢測(cè)到您設(shè)置的角色為 master,請(qǐng)選擇行為:"
? ?echo "1) 建立新集群"
? ?echo "2) 加入舊集群"
? ?read -p "請(qǐng)選擇 master 節(jié)點(diǎn)行為(默認(rèn)建立新集群)" answer
? ?if [[ -z "$answer" ]]; then
? ? ACTION="new"
? ?else
? ? case $answer in
? ? 1)
? ? ?ACTION="new"
? ? ?;;
? ? 2)
? ? ?ACTION="old"
? ? ?;;
? ? *)
? ? ?colorEcho $RED "無(wú)效的選擇,使用默認(rèn)行為"
? ? ?ACTION="new"
? ? esac
? ?fi
? ?echo ""colorEcho $BLUE" 當(dāng)前 k8s 節(jié)點(diǎn)行為:$ACTION"if [[ $ACTION =="new" ]];then
? ? getip
? ? preinstall
? ? installk8s
? ? init
? ? greplog
? ?else
? ? preinstall
? ? installk8s
? ? colorEcho $BLUE "master 節(jié)點(diǎn)安裝完成,請(qǐng)?jiān)谥?master 節(jié)點(diǎn)日志中拿取命令加入主節(jié)點(diǎn)"
? ?
? ?fi
?
? else
? ?preinstall
? ?installk8s
? ?colorEcho $BLUE "node 節(jié)點(diǎn)安裝完成,請(qǐng)?jiān)谥?master 節(jié)點(diǎn)日志中拿取命令加入主節(jié)點(diǎn)"
? fi
?}
?
?main(){menu}
?main
?
chmod +x kubernetes.sh && ?./kubernetessh
5 參考
阿里巴巴和CNCF https://developer.aliyun.com/learning/course/572/detail/7781
阿里巴巴云原生實(shí)踐課 ?https://developer.aliyun.com/learning/course/698?spm=a2c6h.21258778.0.0.4ab01a5fG46DGs&scm=20140722.ID_community@@course@@698.R_SeoRelatedItem2.ID_community@@course@@698-OR_rec-V_1
中文官網(wǎng):https://kubernetes.io/zh/
中文社區(qū):https://www.kubernetes.org.cn/
官方文檔:https://kubernetes.io/zh/docs/home/
githup https://github.com/kubernetes
社區(qū)文檔:http://docs.kubernetes.org.cn
KubeShere:https://kubesphere.com.cn/docs/v3.3/introduction/what-is-kubesphere/
minkube: ?https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/
K8S 原理 ? https://baijiahao.baidu.com/s?id=1721040222341192801
kubord教程 https://kuboard.cn/learning/k8s-practice/micro-service/kuboard-view-of-k8s.html#devops%E5%B9%B3%E5%8F%B0
尚硅谷 ? ? ?https://www.yuque.com/leifengyang/oncloud/ghnb83
尚硅谷和云原生 ?https://www.bilibili.com/video/BV15g411F7pj/?spm_id_from=333.999.0.0&vd_source=8e232ecca082f1beea092de8718f15c6
https://www.bilibili.com/video/BV1rD4y1c7r1/?spm_id_from=333.999.0.0&vd_source=8e232ecca082f1beea092de8718f15c6
老男孩 ?