K8S/Kubernetes組件介紹

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組件

Components of Kubernetes


控制平面組件

一、kube-apiserver/api接口

需部署在 master 節點上;是 Kubernetes 控制面的前端。kube-apiserver 在設計上考慮了水平擴展的須要,若是咱們須要搭建集羣,能夠安裝基數節點的kube-apiserver,而後可經過負載均衡器作集羣

二、etcd/k8s後臺數據庫

etcd 是兼具一致性和高可用性的鍵值數據庫,官方建議做爲 Kubernetes 全部集羣數據的後臺數據庫

三、kube-scheduler/k8s pod調度器

需部署在 master 節點上,該組件監視那些新建立的未指定運行節點的 Pod,並選擇節點讓 Pod 在上面運行。

調度決策考慮的因素包括單個 Pod 和 Pod 集合的資源需求、硬件/軟件/策略約束、親和性和反親和性規範、數據位置、工做負載間的干擾和最後時限。

四、kube-controller-manager/k8s管理器

需部署在 master 節點上。從邏輯上講,每一個控制器都是一個單獨的進程,可是爲了下降複雜性,它們都被編譯到同一個可執行文件,並在一個進程中運行。

這些控制器包括:

  • 節點控制器(Node Controller): 負責在節點出現故障時進行通知和響應

  • 副本控制器(Replication Controller): 負責爲系統中的每一個副本控制器對象維護正確數量的 Pod

  • 端點控制器(Endpoints Controller): 填充端點(Endpoints)對象(即加入 Service 與 Pod)

  • 服務賬戶和令牌控制器(Service Account & Token Controllers): 爲新的命名空間建立默認賬戶和 API 訪問令牌


五、cloud-controller-manager/雲控制器管理器

運行與基礎雲提供商交互的控制器,從k8s1.6以後出現的新功能

也包括了多個控制器:節點控制器、路由控制器、服務控制器、數據卷控制器


Node節點組件

kubelet/節點管理工具

kubelet負責管理節點的pod,能夠理解爲當在master上執行建立、刪除對象時,kubelet負責執行從kube-apiserver下達的指令

kube-proxy/網絡管理器

kube-proxy運行在每一個node節點上,管理維護node上的網絡規則

Container Runtime/容器運行環境

簡而言之,就是容器。咱們須要在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官網文擋拜讀後的總結,做爲筆記分享和使用

相關文章
相關標籤/搜索