1. 程式人生 > 實用技巧 >如果雲是水滴,Kubernetes就是水滴管理平臺

如果雲是水滴,Kubernetes就是水滴管理平臺

摘要:雲是由很多小水滴組成的,把每一個計算機想象成小水滴,聯合起來就形成了雲。一般水滴先出現,然後出現管理水滴的平臺(如OpenStack,Kubernetes)。

一、雲端計算–獨立宇宙

1.雲是由很多小水滴組成的,把每一個計算機想象成小水滴,聯合起來就形成了雲;傳統的水滴就是VM;Docker的出現,改變了小水滴的粒度

2.水滴獨立可執行,內部完整 (如 VM,Docker容器)

3.一般水滴先出現,然後出現管理水滴的平臺(如OpenStack,Kubernetes)

二、Kubernetes簡介

1.Kubernetes是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制

2.Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平臺中的容器按照使用者的期望狀態執行著(比如使用者想讓dlcatalog一直執行,使用者不需要關心怎麼去做,Kubernetes會自動去監控,然後去重啟,新建,總之,讓dlcatalog一直提供服務)

3.在Kubenetes中,所有的容器均在Pod中執行,一個Pod可以承載一個或者多個相關的容器

三、Kubernetes典型名詞

1.Pod

在Kubernetes中,最小的管理元素不是一個個獨立的容器,而是Pod;一個Pod是一個容器環境下的“邏輯主機”,一個Pod是由多個相關的並且共享磁碟的容器組成;在同一個Pod裡,容器之間的埠不能重複,否則Pod會起不來,或者起來後無限重啟

2. Node

Node是Pod真正執行的主機,可以是物理機,也可以是虛擬機器;為了管理Pod,每個Node節點上至少要執行container runtime(比如Docker)、kubelet和kube-proxy服務;Node本質上不是Kubernetes來建立的,Kubernetes只是管理Node上的資源;雖然可以通過manifest建立一個Node物件(如下json所示),但Kubernetes也只是去檢查是否真的是有這麼一個Node,如果檢查失敗,也不會往上排程Pod

{
"kind": "Node",
"apiVersion": "v1",
"metadata": {
            
"name": "10.63.90.18", "labels": { "name": "my-first-k8s-node" } } }

3. Service

Service是一個抽象的概念,是K8s裡面的精華;每個K8s上的App,都可以申請叢集內部的“名號”,用來代表自己;K8s就會給你的App分配一個Service許可證,許可證上面帶著“假IP”,任何叢集內部只要訪問這個IP,就等於訪問你的App

假設我們擁有一些Pod,每個Pod都開放了9083埠,並且都帶有一個標籤app=MyApp;如下這段json程式碼會建立一個新的Service物件,名稱為my-dlcatalog-metastore-service,並且會連線目標埠9083;並且帶有標籤app=MyApp的Pod會被分配一個ip地址,這個ip是給kube-proxy使用的,叢集內部只要訪問這個ip,就等於訪問你的App;需要注意的是,K8s裡面的Pod實際ip一般沒什麼用

kind: Service,
apiVersion: v1,
metadata:
    name: my-dlcatalog-metastore-service
spec:
    selector:
    app: MyApp
ports:
- protocol: TCP,
  port: 20403,
  targetPort: 9083

4. ConfigMap

ConfigMap用於儲存配置資料的鍵值對,可以用來儲存單個屬性,也可以用來儲存配置檔案;ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感資訊的字串;

使用volume將ConfigMap作為檔案或目錄直接掛載

如下表示將建立的ConfigMap直接掛載至Pod的/etc/config目錄下

apiVersion: v1
kind: Pod
metadata:
    name: vol-test-pod
spec:
    containers:
        - name: test-container
          image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530
          command: [ "/bin/sh", "bin/start_server.sh" ]
          volumeMounts:
          - name: config-volume
            mountPath: /etc/config
    volumes:
        - name: config-volume
          configMap:
            name: special-config
    restartPolicy: Never

四、Kubernetes資源花式排程

指定Node節點排程

有三種方式指定 Pod 只執行在指定的 Node 節點上

方式一:

nodeSelector:只調度到匹配指定label的Node上

方式二:

nodeAffinity:功能更豐富的 Node 選擇器,比如支援集合操作

nodeAffinity 目前支援兩種:requiredDuringSchedulingIgnoredDuringExecution與preferredDuringSchedulingIgnoredDuringExecution,分別代表必須滿足條件和優選條件

比如下面的例子代表排程到包含標籤並且值為 e2e-az1 或 e2e-az2 的 Node 上,並且優選還帶有標籤 another-node-label-key=another-node-label-value 的 Node

apiVersion: v1
kind: Pod
metadata:
    name: with-node-affinity
spec:
    affinity:
        nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                    nodeSelectorTerms:
                    - matchExpressions:
                        - key: kubernetes.io/e2e-az-name
                          operator: In
                          values:
                          - e2e-az1
                          - e2e-az2
                preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 1
                  preference:
                    matchExpressions:
                    - key: another-node-label-key
                      operator: In
                      values:
                      - another-node-label-value
    containers:
    - name: with-node-affinity
      image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530

方式三:

podAffinity:排程到滿足條件的 Pod 所在的 Node 上

podAffinity 基於 Pod 的標籤來選擇 Node,僅排程到滿足條件 Pod 所在的 Node 上,支援 podAffinity 和 podAntiAffinity

這個功能比較繞,以下面的兩個例子作為講解:

第一個例子表示:

如果一個 “Node 所在 Zone 中包含至少一個帶有 security=S1 標籤且執行中的 Pod”,那麼可以排程到該 Node;不排程到 “包含至少一個帶有 security=S2 標籤且執行中 Pod” 的 Node 上

apiVersion: v1
kind: Pod
metadata:
    name: with-pod-affinity
spec:
    affinity:
        podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                - key: security
                  operator: In
                  values:
                  - S1
              topologyKey: failure-domain.beta.kubernetes.io/zone
        podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
                podAffinityTerm:
                    labelSelector:
                        matchExpressions:
                        - key: security
                          operator: In
                          values:
                          - S2
                    topologyKey: kubernetes.io/hostname
        containers:
        - name: with-node-affinity
          image: 10.63.30.148:20202/ei_cnnroth7a/jwsdlcatalog-x86_64:1.0.1.20200918144530

第二個例子表示:

如果一個 “Node 所在 Zone 中包含至少一個帶有 appVersion= jwsdlcatalog-x86_64-1.0.1.20200918144530標籤且執行中的 Pod”,那麼推薦不排程到該 Node;不排程到 “包含至少一個帶有app= jwsdlcatalog-x86_64標籤且執行中 Pod” 的 Node 上

spec:
  restartPolicy: Always         #pod重啟策略
  securityContext:
    runAsUser: 2000
    fsGroup: 2000
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - podAffinityTerm:
            labelSelector:
              matchExpressions:
                - key: appVersion
                  operator: In
                  values:
                    - concat:
                        - get_input: IMAGE_NAME
                        - '-'
                        - get_input: IMAGE_VERSION
            #numOfMatchingPods: "2"   #一定不要加此欄位,此欄位是華為自己的實現,社群沒有接納
            topologyKey: "failure-domain.beta.kubernetes.io/zone"
          weight: 100
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: app
                operator: In
                values:
                  - get_input: IMAGE_NAME
          numOfMatchingPods: "1"
          topologyKey: "kubernetes.io/hostname"
  containers:
    - image:
        concat:
          - get_input: IMAGE_ADDR           #拼接映象的地址(#用拼接函式解決數字型引數問題)
          - "/"
          - get_input: IMAGE_NAME           #拼接映象的地址(#用拼接函式解決數字型引數問題)
          - ":"
          - get_input: IMAGE_VERSION        #拼接映象的地址(#用拼接函式解決數字型引數問題)
      name: jwsdlcatalog

注:本文純屬個人觀點,部分圖片如有雷同,純屬意外

點選關注,第一時間瞭解華為雲新鮮技術~