1、K8S能作什麼?爲何須要學習K8S?html
一、服務發現和負載均衡前端
k8s的pod是有生命週期的,當pod重啓其ip頗有可能發生變化;若是把服務的ip寫死,pod重啓時後端服務將不可用;爲避免這種狀況,k8s使用service概念和服務自發現確保服務的可用性node
Kubernetes 可使用 DNS 名稱或本身的 IP 地址公開容器,若是到容器的流量很大,Kubernetes 能夠負載均衡並分配網絡流量,從而使部署穩定。nginx
二、存儲編排web
Kubernetes 容許自動掛載你選擇的存儲系統,如本地存儲、雲存儲docker
三、自動部署和回滾數據庫
使用yaml文件自動部署,或根據容器版本刪除、從新部署容器以回滾json
四、自動二進制打包後端
Kubernetes 容許指定每一個容器所需 CPU 和內存(RAM)api
五、自我修復
Kubernetes可經過各類控制器重啓失敗的容器、替換容器、殺死不響應用戶定義的運行情況檢查的容器以達到用戶指望的狀態
六、密鑰與配置管理
Kubernetes 容許您存儲和管理密碼、令牌和 ssh 密鑰等。您能夠在不重建容器鏡像的狀況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰
2、K8S組件
控制平面組件
需部署在 master 節點上;是 Kubernetes 控制面的前端。kube-apiserver 在設計上考慮了水平擴展的須要,若是咱們須要搭建集羣,能夠安裝基數節點的kube-apiserver,而後可經過負載均衡器作集羣
etcd 是兼具一致性和高可用性的鍵值數據庫,官方建議做爲 Kubernetes 全部集羣數據的後臺數據庫
需部署在 master 節點上,該組件監視那些新建立的未指定運行節點的 Pod,並選擇節點讓 Pod 在上面運行。
調度決策考慮的因素包括單個 Pod 和 Pod 集合的資源需求、硬件/軟件/策略約束、親和性和反親和性規範、數據位置、工做負載間的干擾和最後時限。
需部署在 master 節點上。從邏輯上講,每一個控制器都是一個單獨的進程,可是爲了下降複雜性,它們都被編譯到同一個可執行文件,並在一個進程中運行。
這些控制器包括:
節點控制器(Node Controller): 負責在節點出現故障時進行通知和響應
副本控制器(Replication Controller): 負責爲系統中的每一個副本控制器對象維護正確數量的 Pod
端點控制器(Endpoints Controller): 填充端點(Endpoints)對象(即加入 Service 與 Pod)
服務賬戶和令牌控制器(Service Account & Token Controllers): 爲新的命名空間建立默認賬戶和 API 訪問令牌
運行與基礎雲提供商交互的控制器,從k8s1.6以後出現的新功能
也包括了多個控制器:節點控制器、路由控制器、服務控制器、數據卷控制器
Node節點組件
kubelet負責管理節點的pod,能夠理解爲當在master上執行建立、刪除對象時,kubelet負責執行從kube-apiserver下達的指令
kube-proxy運行在每一個node節點上,管理維護node上的網絡規則
簡而言之,就是容器。咱們須要在node節點安裝runtime做爲k8s部署容器的運行環境,目前主流固然是docker
集羣插件
域名解析服務:如CoreDNS、Cluster DNS
資源監控服務:Prometheus、Metrics-Server
用戶的ui管理界面:Dashboard、Kubesphere
集羣日誌:ELK
鏡像倉庫:Harbor
3、K8S概念補充
一、pod
pod是K8S的最小管理單元,一個pod中可運行一個或者一組容器。pod內的容器共享使用pod的惟一ip地址和一組存儲卷。同一pod內的容器使用localhost進行通訊;而與pod外的容器通訊時,須要pod內的容器協調使用pod的端口進行通訊
pod有生命週期,當一個pod生命週期結束後,該pod將不復存在,k8s會從新部署一個新的pod提供和該pod同樣的服務。這樣就用到service概念用於標記k8s集羣提供一組服務的pod。
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-http spec: containers: - args: - /server image: k8s.gcr.io/liveness livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: X-Custom-Header value: Awesome initialDelaySeconds: 15 timeoutSeconds: 1 name: liveness
二、service
假定有一組 Pod,它們對外暴露了 9376 端口,同時還被打上 app=MyApp 標籤,咱們就能夠部署一個service,將TCP:9376的請求代理到這組pod上,上述就是service的做用。因此能夠大體理解爲service是pod的代理層,根據用戶請求的端口和服務,service找到對應標籤的pod,將請求代理到這些pod去處理。若是您想要在應用程序中使用 Kubernetes 接口進行服務發現,則能夠查詢 API Server 的 endpoint 資源,只要服務中的Pod集合發生更改,endpoint 就會更新。
官方說:邏輯上的一組 Pod,一種能夠訪問它們的策略 —— 一般稱爲微服務。 這一組 Pod 可以被 Service 訪問到,一般是經過selector實現的
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376
三、volume
Kubernetes 卷具備明確的生命週期——與包裹它的 Pod 相同,可是卷比 Pod 中運行的任何容器的存活期都長,在容器從新啓動時數據也會獲得保留。Kubernetes支持多種類型的卷,如nfs、iscsi、cinder、azureDisk等
如下是cinder volume示例配置:
apiVersion: v1 kind: Pod metadata: name: test-cinder spec: containers: - image: k8s.gcr.io/test-webserver name: test-cinder-container volumeMounts: - mountPath: /test-cinder name: test-volume volumes: - name: test-volume # This OpenStack volume must already exist. cinder: volumeID: <volume-id> fsType: ext4
四、Deployment
顧名思義,Deployment是一個部署,做用主要是建立、更新、回滾ReplicaSet以控制pod
以下是k8s官方的Deployment示例:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
五、namespace(命名空間)
命名空間爲名稱提供了一個範圍。資源的名稱須要在命名空間內是惟一的,但不能跨命名空間。命名空間不能相互嵌套,每一個 Kubernetes 資源只能在一個命名空間中。
kubernetes存在三個初始的命名空間:
default/沒有指定命名空間的容器默認的
kube-system/kubernetes系統建立的
kube-public/公共的,對於全部用戶均可讀
kubectl get namespace
NAME STATUS AGE default Active 1d kube-public Active 1d kube-system Active 1d
六、Job
可建立一個或者多個pod,job在指定次數、指定個數的pod建立後job的工做就完成了
刪除一個job,會將其建立的pod一併清除
七、endpoint
endpoint是kubernetes的一個資源對象,存儲於etcd數據庫中,用以記錄service的全部pod的訪問地址
八、object(對象)
object是持久化的實體,用以表示整個集羣的狀態:
哪些容器化應用在運行
能夠被應用使用的資源
應用運行時重啓策略、升級策略,以及容錯策略
一個object一旦建立,kubernetes會持續工做以保證對象存在;也就是經過對象棵設置kubernetes集羣的指望狀態
object的操做依賴於Kubernetes API,若是使用kubectl也是經過調用Kubernetes API完成的操做(使用yaml文件操做會將文件的內容從yaml轉換爲json格式)
九、Object Name 和 UID(對象名和UID)
集羣中的每個對象都一個名稱 來標識在同類資源中的惟一性。
每一個 Kubernetes 對象也有一個UID 來標識在整個集羣中的惟一性。
十、label(標籤)
label是附加到對象的鍵/值對;label能夠在建立時附加到對象,而後能夠隨時添加和修改。每一個對象能夠定義一組鍵/值標籤。每一個鍵對於給定的對象必須是惟一的。label不是惟一的,也就是說多個對象能夠擁有同一個label,如咱們能夠建立多個label爲nginx的pod用於統一管理。
十一、label selector(標籤選擇器)
與名稱和UID不一樣,標籤不提供惟一性。一般,咱們但願許多對象攜帶相同的標籤。經過標籤選擇器,客戶端/用戶就能夠識別一組同標籤的對象。
十二、ReplicaSet
ReplicaSet 是Replication Controller(RC)的下一代,區別在於支持基於集合的選擇器。
官方說:ReplicaSet 確保任什麼時候間都有指定數量的Pod副本在運行。 然而,Deployment 是一個更高級的概念,它管理 ReplicaSet,並向 Pod 提供聲明式的更新以及許多其餘有用的功能, 所以,咱們建議使用 Deployment 而不是直接使用 ReplicaSet。
1三、ReplicationController(RC)
是kubernetes的pod數量控制器,RC同時跨多個節點(node)控制多個pod的數量而不是僅限於單機。工做的內容主要是當pod數量跟預期不同了,RC會將該數量維持爲預期的數量
如下是配置運行 nginx web 服務器的三個副本的RC的示例(會控制pod數量始終爲3個):
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
1四、StatefulSets
StatefulSets用來管理 Deployment 和擴展一組 Pod
StatefulSet 和 Deployment 相同的是管理了基於相同容器定義的一組 Pod;可是StatefulSet 爲它的每一個 Pod 維護了一個固定的 ID,而且該ID是基於聲明建立的,不管pod如何調度,ID永久不變
StatefulSet多用於知足如下一個或多個條件的應用程序:
穩定的、惟一的網絡標識符。
穩定的、持久的存儲。
有序的、優雅的部署和縮放。
有序的、自動的滾動更新。
--- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx # has to match .spec.template.metadata.labels serviceName: "nginx" replicas: 3 # by default is 1 template: metadata: labels: app: nginx # has to match .spec.selector.matchLabels spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "my-storage-class" resources: requests: storage: 1Gi
1五、DaemonSet
DaemonSet管理節點上的各個守護的pod,例如集存儲羣、日誌收集器、監控客戶端,通俗來說就是K8S集羣狀態的控制器
插一腳:本文章是做者對k8s官網文擋拜讀後的總結,做爲筆記分享和使用