【Kubernetes系列】第3篇 基礎概念介紹(下)

  • 2019 年 10 月 6 日
  • 筆記

9 DaemonSet 守護進程集

DaemonSet保證在特定或所有Node節點上都運行一個Pod實例,常用來部署一些集群的日誌採集、監控或者其他系統管理應用。典型的應用包括:

  • 日誌收集,比如fluentd,logstash等
  • 系統監控,比如Prometheus Node Exporter,collectd等
  • 系統程式,比如kube-proxy, kube-dns, glusterd, ceph,ingress-controller等

指定Node節點 DaemonSet會忽略Node的unschedulable狀態,有兩種方式來指定Pod只運行在指定的Node節點上:

  • nodeSelector:只調度到匹配指定label的Node上
  • nodeAffinity:功能更豐富的Node選擇器,比如支援集合操作
  • podAffinity:調度到滿足條件的Pod所在的Node上

目前支援兩種策略

  • OnDelete: 默認策略,更新模板後,只有手動刪除了舊的Pod後才會創建新的Pod
  • RollingUpdate: 更新DaemonSet模版後,自動刪除舊的Pod並創建新的Pod

10 Ingress 負載均衡

Kubernetes中的負載均衡我們主要用到了以下兩種機制:

  • Service:使用Service提供集群內部的負載均衡,Kube-proxy負責將service請求負載均衡到後端的Pod中
  • Ingress Controller:使用Ingress提供集群外部的負載均衡

Service和Pod的IP僅可在集群內部訪問。集群外部的請求需要通過負載均衡轉發到service所在節點暴露的埠上,然後再由kube-proxy通過邊緣路由器將其轉發到相關的Pod,Ingress可以給service提供集群外部訪問的URL、負載均衡、HTTP路由等,為了配置這些Ingress規則,集群管理員需要部署一個Ingress Controller,它監聽Ingress和service的變化,並根據規則配置負載均衡並提供訪問入口。 常用的ingress controller:

  • nginx
  • traefik
  • Kong
  • Openresty

11 Job & CronJob 任務和定時任務

Job負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。 CronJob即定時任務,就類似於Linux系統的crontab,在指定的時間周期運行指定的任務。

12 HPA(Horizontal Pod Autoscaling) 水平伸縮

Horizontal Pod Autoscaling可以根據CPU、記憶體使用率或應用自定義metrics自動擴展Pod數量 (支援replication controller、deployment和replica set)。

  • 控制管理器默認每隔30s查詢metrics的資源使用情況(可以通過 –horizontal-pod-autoscaler-sync-period 修改)
  • 支援三種metrics類型
    • 預定義metrics(比如Pod的CPU)以利用率的方式計算
    • 自定義的Pod metrics,以原始值(raw value)的方式計算
    • 自定義的object metrics
  • 支援兩種metrics查詢方式:Heapster和自定義的REST API
  • 支援多metrics

可以通過如下命令創建HPA:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

13 Service Account

Service account是為了方便Pod裡面的進程調用Kubernetes API或其他外部服務而設計的 授權 Service Account為服務提供了一種方便的認證機制,但它不關心授權的問題。可以配合RBAC(Role Based Access Control)來為Service Account鑒權,通過定義Role、RoleBinding、ClusterRole、ClusterRoleBinding來對sa進行授權。

14 Secret 密鑰

Sercert-密鑰解決了密碼、token、密鑰等敏感數據的配置問題,而不需要把這些敏感數據暴露到鏡像或者Pod Spec中。Secret可以以Volume或者環境變數的方式使用。有如下三種類型:

15 ConfigMap 配置中心

ConfigMap用於保存配置數據的鍵值對,可以用來保存單個屬性,也可以用來保存配置文件。ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感資訊的字元串。ConfigMap可以通過三種方式在Pod中使用,三種分別方式為:設置環境變數、設置容器命令行參數以及在Volume中直接掛載文件或目錄。 可以使用 kubectl create configmap從文件、目錄或者key-value字元串創建等創建 ConfigMap。也可以通過 kubectl create -f value.yaml 創建。

16 Resource Quotas 資源配額

資源配額(Resource Quotas)是用來限制用戶資源用量的一種機制。 資源配額有如下類型:

  • 計算資源,包括cpu和memory
    • cpu, limits.cpu, requests.cpu
    • memory, limits.memory, requests.memory
  • 存儲資源,包括存儲資源的總量以及指定storage class的總量
  • 對象數,即可創建的對象的個數
    • pods, replicationcontrollers, configmaps, secrets
    • resourcequotas, persistentvolumeclaims
    • services, services.loadbalancers, services.nodeports

它的工作原理為:

  • 資源配額應用在Namespace上,並且每個Namespace最多只能有一個 ResourceQuota 對象
  • 開啟計算資源配額後,創建容器時必須配置計算資源請求或限制(也可以 用LimitRange設置默認值)
  • 用戶超額後禁止創建新的資源