一颂鸿、 核心組件
· etcd 保存了整個集群的狀態(tài)
· apiserver 提供了資源操作的唯一入口吗冤,并提供了認(rèn)證授權(quán)便贵、訪問控制问顷、API注冊和發(fā)現(xiàn)機(jī)制昂秃;
· controller manager 負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測杜窄、自動擴(kuò)展肠骆、滾動更新等;
·?scheduler 負(fù)責(zé)資源的調(diào)度塞耕,按照預(yù)定的調(diào)度策略將 Pod 調(diào)度到相應(yīng)的機(jī)器上蚀腿;
·?kubelet 負(fù)責(zé)維護(hù)容器的生命周期,同時也負(fù)責(zé) Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理扫外;
· Container runtime 負(fù)責(zé)鏡像管理以及 Pod 和容器的真正運(yùn)行(CRI)莉钙;
· kube-proxy 負(fù)責(zé)為 Service 提供 cluster 內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡
除了核心組件,還有一些推薦的 Add-ons:
·?kube-dns 負(fù)責(zé)為整個集群提供 DNS 服務(wù)
·?Ingress Controller 為服務(wù)提供外網(wǎng)入口
·?Heapster 提供資源監(jiān)控
·?Dashboard 提供 GUI
·?Federation 提供跨可用區(qū)的集群
·?Fluentd-elasticsearch 提供集群日志采集筛谚、存儲與查詢
參考文檔:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
二磁玉、kubernetes 基本概念
1.Container(容器)是一種便攜式、輕量級的操作系統(tǒng)級虛擬化技術(shù)驾讲。它使用 namespace 隔離不同的軟件運(yùn)行環(huán)境蚊伞,并通過鏡像自包含軟件的運(yùn)行環(huán)境,從而使得容器可以很方便的在任何地方運(yùn)行吮铭。
由于容器體積小且啟動快时迫,因此可以在每個容器鏡像中打包一個應(yīng)用程序。這種一對一的應(yīng)用鏡像關(guān)系擁有很多好處谓晌。使用容器掠拳,不需要與外部的基礎(chǔ)架構(gòu)環(huán)境綁定, 因為每一個應(yīng)用程序都不需要外部依賴,更不需要與外部的基礎(chǔ)架構(gòu)環(huán)境依賴扎谎。完美解決了從開發(fā)到生產(chǎn)環(huán)境的一致性問題碳想。
容器同樣比虛擬機(jī)更加透明烧董,這有助于監(jiān)測和管理。尤其是容器進(jìn)程的生命周期由基礎(chǔ)設(shè)施管理胧奔,而不是被進(jìn)程管理器隱藏在容器內(nèi)部逊移。最后,每個應(yīng)用程序用容器封裝龙填,管理容器部署就等同于管理應(yīng)用程序部署胳泉。
2.?Pod 是一組緊密關(guān)聯(lián)的容器集合,它們共享 IPC 和 Network namespace岩遗,是 Kubernetes 調(diào)度的基本單位扇商。Pod 內(nèi)的多個容器共享網(wǎng)絡(luò)和文件系統(tǒng),可以通過進(jìn)程間通信和文件共享這種簡單高效的方式組合完成服務(wù)宿礁。
Kubernetes 使用 Pod 來管理容器案铺,每個 Pod 可以包含一個或多個緊密關(guān)聯(lián)的容器。
3.?Node 是 Pod 真正運(yùn)行的主機(jī)梆靖,可以是物理機(jī)控汉,也可以是虛擬機(jī)。為了管理 Pod返吻,每個 Node 節(jié)點上至少要運(yùn)行 container runtime(比如 docker 或者 rkt)姑子、kubelet 和 kube-proxy 服務(wù)。
4.?Namespace 是對一組資源和對象的抽象集合测僵,比如可以用來將系統(tǒng)內(nèi)部的對象劃分為不同的項目組或用戶組街佑。常見的 pods, services, replication controllers 和 deployments 等都是屬于某一個 namespace 的(默認(rèn)是 default),而 node, persistentVolumes 等則不屬于任何 namespace捍靠。
5.?Service 是應(yīng)用服務(wù)的抽象沐旨,通過 labels 為應(yīng)用提供負(fù)載均衡和服務(wù)發(fā)現(xiàn)。匹配 labels 的 Pod IP 和端口列表組成 endpoints剂公,由 kube-proxy 負(fù)責(zé)將服務(wù) IP 負(fù)載均衡到這些 endpoints 上希俩。
每個 Service 都會自動分配一個 cluster IP(僅在集群內(nèi)部可訪問的虛擬地址)和 DNS 名,其他容器可以通過該地址
或 DNS 來訪問服務(wù)纲辽,而不需要了解后端容器的運(yùn)行颜武。
6.?Label 是識別 Kubernetes 對象的標(biāo)簽,以 key/value 的方式附加到對象上(key 最長不能超過 63 字節(jié)拖吼,value 可以為空鳞上,也可以是不超過 253 字節(jié)的字符串)。
Label 不提供唯一性吊档,并且實際上經(jīng)常是很多對象(如 Pods)都使用相同的 label 來標(biāo)志具體的應(yīng)用篙议。
Label 定義好后其他對象可以使用 Label Selector 來選擇一組相同 label 的對象(比如 ReplicaSet 和 Service 用 label 來選擇一組 Pod)。Label Selector 支持以下幾種方式:
· 等式,如 app=nginx 和 env!=production
· 集合鬼贱,如 env in (production, qa)
· 多個 label(它們之間是 AND 關(guān)系)移怯,如 app=nginx,env=test
7.?Annotations 是 key/value 形式附加于對象的注解。不同于 Labels 用于標(biāo)志和選擇對象这难,Annotations 則是用來記錄一些附加信息舟误,用來輔助應(yīng)用部署、安全策略以及調(diào)度策略等姻乓。比如 deployment 使用 annotations 來記錄 rolling update 的狀態(tài)嵌溢。
三、基礎(chǔ)命令
1.
$ kubectl run --image=nginx:alpine nginx-app --port=80
deployment "nginx-app" created
$ kubectl get pods
NAME? ? ? ? ? ? ? ? ? ? ? ? READY? ? STATUS? ? RESTARTS? AGE
nginx-app-4028413181-cnt1i? 1/1? ? ? Running? 0? ? ? ? ? 52s
· kubectl get - 類似于 docker ps蹋岩,查詢資源列表
· kubectl describe - 類似于 docker inspect赖草,獲取資源的詳細(xì)信息
· kubectl logs - 類似于 docker logs,獲取容器的日志
· kubectl exec - 類似于 docker exec剪个,在容器內(nèi)執(zhí)行一個命令
2.?使用 yaml 定義 Pod
上面是通過 kubectl run 來啟動了第一個 Pod秧骑,但是 kubectl run 并不支持所有的功能。在 Kubernetes 中禁偎,更經(jīng)常使用 yaml 文件來定義資源腿堤,并通過 kubectl create -f file.yaml 來創(chuàng)建資源。比如如暖,一個簡單的 nginx Pod 可以定義為:
apiVersion: v1
kind: Pod
metadata:
? name: nginx
? labels:
? ? app: nginx
spec:
? containers:
? - name: nginx
? ? image: nginx
? ? ports:
? ? - containerPort: 80
3.?使用 Volume
Pod 的生命周期通常比較短,只要出現(xiàn)了異常忌堂,就會創(chuàng)建一個新的 Pod 來代替它盒至。那容器產(chǎn)生的數(shù)據(jù)呢?容器內(nèi)的數(shù)據(jù)會隨著 Pod 消亡而自動消失士修。Volume 就是為了持久化容器數(shù)據(jù)而生枷遂,比如可以為 redis 容器指定一個 hostPath 來存儲 redis 數(shù)據(jù)
apiVersion: v1
kind: Pod
metadata:
? name: redis
spec:
? containers:
? - name: redis
? ? image: redis
? ? volumeMounts:
? ? - name: redis-persistent-storage
? ? ? mountPath: /data/redis
? volumes:
? - name: redis-persistent-storage
? ? hostPath:
? ? ? path: /data/
Kubernetes volume 支持非常多的插件,可以根據(jù)實際需要來選擇
·?emptyDir
· hostPath
·?gcePersistentDisk
·?awsElasticBlockStore
·?nfs
·?iscsi
·?flocker
·?glusterfs
·?rbd
·?cephfs
·?gitRepo
·?secret
·?persistentVolumeClaim
·?downwardAPI
·?azureFileVolume
·?vsphereVolume
4.使用 Service
前面雖然創(chuàng)建了 Pod棋嘲,但是在 kubernetes 中酒唉,Pod 的 IP 地址會隨著 Pod 的重啟而變化,并不建議直接拿 Pod 的 IP 來交互沸移。那如何來訪問這些 Pod 提供的服務(wù)呢痪伦?使用 Service。Service 為一組 Pod(通過 labels 來選擇)提供一個統(tǒng)一的入口雹锣,并為它們提供負(fù)載均衡和自動服務(wù)發(fā)現(xiàn)网沾。比如,可以為前面的 nginx-app 創(chuàng)建一個 service
$ kubectl expose deployment nginx-app --port=80 --target-port=80 --type=NodePort
service "nginx-app" exposed
$ kubectl describe service nginx-app
Name:? ? ? ? ? ? ? nginx-app
Namespace:? ? ? ? ? ? default
Labels:? ? ? ? ? ? run=nginx-app
Selector:? ? ? ? ? ? ? run=nginx-app
Type:? ? ? ? ? ? ? ClusterIP
IP:? ? ? ? ? ? ? ? 10.0.0.66
Port:? ? ? ? ? ? ? <unset>? ? 80/TCP
NodePort:? ? ? ? ? ? ? <unset>? ? 30772/TCP
Endpoints:? ? ? ? ? ? 172.17.0.3:80
Session Affinity:? ? ? ? ? None
No events.
這樣蕊爵,在 cluster 內(nèi)部就可以通過 http://10.0.0.66 和 http://node-ip:30772 來訪問 nginx-app辉哥。而在 cluster 外面,則只能通過 http://node-ip:30772 來訪問。