分享會大綱

  1. kubelet 與 kube-proxy
  2. Stateless 與 Stateful
  3. Auto Scaling
  4. Replication controller
  5. Deployment
  6. Replica sets
  7. Ingress controller
  8. Resource Quotas
  9. Health check
  10. Cronjob

什麼是 kubelet?

相當於 node agent,用於管理該 Node 上的所有 pods 狀態以及與 master node 即時溝通

什麼是 kube-proxy?

將目前該 Node 上所有 Pods 的資訊傳給 iptables,讓 iptables 即時獲得在該 Node 上所有 Pod 的最新狀態,確保每個 Pod 都可以順利的互相溝通。

什麼是 Auto Scaling

  • 水平擴展(Horizontal Scaling)
  • 垂直擴展(Vertical Scaling)

Horizontal Scaling 就是新增更多的節點,獲取更多資源來分擔原有的工作內容

在 k8s 中通常都是作 Pod 的 Horizontal Scaling

Vertical Scaling 則是新增更多的 CPU 、 RAM 等等來獲得更多運作資源

通常都要利用 gcp 、 aws 等等雲端服務才能實現

什麼是 stateless?

使用者透過瀏覽器向網站伺服提出的每一次請求(request)都是獨立的,彼此沒有相關的

這樣的好處就是可以很輕易的擴充使用規模

什麼是 stateful?

跟 stateless 相反, stateful 會紀錄每筆資料的狀態,像是資料庫等等都是 stateful application

什麼是 Replication controller?

k8s 用來管理 Pod 數量以及狀態的 controller

Replication controller 基本須知

  • 每個 controller 都會有一個 yaml 檔
  • controller 可以指定同時有多少個相同的Pods 要運行在 k8s cluster 上
  • 一旦 Pod crash 或 failed 的時候,controller 會自動創建 Pod 以確保 Pod 運行數量與設定檔的相同
  • 當機器重新啟動時,controller 也會自動被建立以確保 Pod 都順利運行

由於要控制 Pod 因此會有一個 selector 的設定來決定要控制哪個 Pod,至於要如何媒合就需要寫 Label

              
                selector:
                  app: frontend
              
            

什麼是 Deployment?

在官網上是這樣說明的:

a Deployment is a higher-level concept that manages ReplicaSets and provides declarative updates to Pods along with a lot of other useful features.

使用 Deployment 有什麼好處?

  • 部署一個應用服務
  • 在服務升級的過程中可以達到無停機服務遷移(zero downtime deployment)
  • 可以 Rollback 到先前版本

什麼是 Replica Set?

其實在官網中 Replication controller 後面有這段文字

NOTE: A Deployment that configures a ReplicaSet is now the recommended way to set up replication.

Replica Set 提供了比 Replication controller 更彈性的部屬方法

  • matchLabels: Pod 的 Label 需與 matchLabels 完全相同
  • matchExpressions: 更彈性的條件,每一筆條件主要由 key、 operator、value 組成

整體寫法就會像這樣

              
                selector
                  matchLabels:
                    app: frontend
                  matchExpressions:
                    - {key: env, operator: In, values: [dev]}
              
            

為什麼要用 ReplicaSet 而不是 Replication controller?

  • Deployment 特性
  • 彈性部署問題

什麼是 Ingress controller?

為了方便控管該機器上所有 Ingress

除了管理 Ingress 外,還有一個更重要的功能就是做 Load Balancer

其實 Ingress 本身是沒辦法做 Load Balancer 的,只能依靠像是 GCP 、 AWS 等雲端服務進行 Load Balancer

為了解決這種問題於是創造了 Ingress controller 來進行 Load Balancer

Ingress controller 常用 GCE 或 Nginx 來實作

什麼是 Resource Quotas?

每一個 container 都可以有屬於它自己的 resource request 與 resource limit ,可以限制這個 Pod 的使用資源,避免單一 Pod 佔用 Node 太多資源

  • resources.requests.cpu

    此 Pod 最小需要多少 Node 的 cpu 資源

  • resources.limits.cpu

    此 Pod 最多只能用到多少 Node 的 cpu 資源

在 k8s 的 Resource Quotas 中會用 m(millicore) 這個單位來表示,舉例來說:cpu: 400m 代表存取 0.4cpu 的資源

假如今天存取配置超過機器自身可提供,k8s 會回傳 403 FORBIDDEN 代表超出可使用的配置範圍

什麼是 Health check?

為了要確認 Pod 是否有順利運作

  • 定期的透過指令去訪問 container
  • 定期發送一個 HTTP request 給 container (livenessProbe)
  • livenessProbe(存活探針)
  • readinessProbe(就緒探針)

livenessProbe

用於判斷 Pod 是否為 running 狀態,如果 livenessProbe 探測到容器不健康,則 kubelet 將砍掉 Pod 並重啟,如果該 Pod 不包含 livenessProbe,則 kubelet 認為該 Pod 的 livenessProbe 返回值永遠成功。

readinessProbe

用於判斷 Pod 是否啟動完成可以接收請求,如果 readinessProbe 失敗,則會將此 Pod 的 Endpoint 從對應的 service 的 Endpoint 列表中移除,從此不再將任何請求調度此Pod上,直到下次探測成功。

什麼是 Cronjob?

k8s 用來進行任務排程,作用類似 linux 的 crontab

cron 格式

通常 cron 格式會長這樣:

              
                * * * * *
              
            
  1. 第一個星號代表分鐘(0 ~ 59)
  2. 第二個星號代表小時(0 ~ 23)
  3. 第三個星號代表日(1 ~ 31)
  4. 第四個星號代表月(1 ~ 12)
  5. 第五個星號代表星期(0 ~ 7,其中星期日可用 0 或 7 表示)

假如今天要每三個小時做一次排程動作也可以這樣寫

              
                * */3 * * * 

                # */3 代表 0, 3, 6, 9, 12, 15, 18, 21
              
            

下次分享會的主題是 k8s 實作,會教大家如何撰寫 yaml 檔以及架設網站

謝謝大家!