【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或者環境變數的方式使用。有如下三種類型:
- Service Account:用來訪問Kubernetes API,由Kubernetes自動創建,並且會自動掛載到Pod的 /run/secrets/http://kubernetes.io/serviceaccount 目錄中;
- Opaque:base64編碼格式的Secret,用來存儲密碼、密鑰等;
- http://kubernetes.io/dockerconfigjson:用來存儲私有docker registry的認證資訊。
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的總量
- requests.storage:存儲資源總量,如500Gi
- persistentvolumeclaims:pvc的個數
- .http://storageclass.storage.k8s.io/requests.storage
- .http://storageclass.storage.k8s.io/persistentvolumeclaims
- 對象數,即可創建的對象的個數
- pods, replicationcontrollers, configmaps, secrets
- resourcequotas, persistentvolumeclaims
- services, services.loadbalancers, services.nodeports
它的工作原理為:
- 資源配額應用在Namespace上,並且每個Namespace最多只能有一個 ResourceQuota 對象
- 開啟計算資源配額後,創建容器時必須配置計算資源請求或限制(也可以 用LimitRange設置默認值)
- 用戶超額後禁止創建新的資源