在集羣部署中,因爲節點數量不定,那麼若是咱們須要對每一個節點中都運行一個守護進程、日誌收集進程等狀況時,在k8s中如何實現呢?node
經過了解DaemonSet 資源能夠實現上述狀況。redis
在k8s中有不少資源對象,如下列舉的內容都是 k8s 中相關對象的對象,這些對象均可以在 yaml 文件中做爲一種 API 類型來配置。數據庫
類別 | 名稱 |
工做負載型資源對象 | Pod、Replicaset、ReplicationController、Deployments、StatefulSets、DaemonSet、Job、CronJob |
服務發現及負載均衡 | Service、Ingress |
配置與存儲 | Volume、Persistent Volume、CSl 、 configMap、Secret |
集羣資源 | Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding |
元數據資源 | HPA、PodTemplate、LimitRang |
前面已經對:Pod、Replicaset、Deployments、Service有了必定了解,接下來繼續對DaemonSet對象進行學習api
DaemonSet:用於確保所有(或者某些)節點上運行一個 Pod 的副本。 當有節點加入集羣時, 也會爲他們新增一個 Pod 。 當有節點從集羣移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它建立的全部 Pod。bash
DaemonSet 的一些典型用法:app
一種簡單的用法是爲每種類型的守護進程在全部的節點上都啓動一個 DaemonSet。 一個稍微複雜的用法是爲同一種守護進程部署多個 DaemonSet;每一個具備不一樣的標誌, 而且對不一樣硬件類型具備不一樣的內存、CPU 要求。負載均衡
總結:DaemonSet 保證每一個一個節點上都運行一個定義的Pod副本。 less
a)必填字段:學習
與其餘k8s資源定義同樣:DaemonSet 須要 apiVersion
、kind
和 metadata
字段。測試
DaemonSet 對象的名稱必須是一個合法的 DNS 子域名
DNS子域名:
b)Pod模板定義:
.spec
中惟一必需的字段是 .spec.template
。
.spec.template
是一個 Pod 模板。 除了它是嵌套的,於是不具備 apiVersion
或 kind
字段以外,它與 Pod 具備相同的 schema。
除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必須指定合理的標籤(查看 Pod 選擇算符)。
在 DaemonSet 中的 Pod 模板必須具備一個值爲 Always
的 RestartPolicy
。 當該值未指定時,默認是 Always
。
Pod 選擇算符
.spec.selector
字段表示 Pod 選擇算符,它與 Job 的 .spec.selector
的做用是相同的。
從 Kubernetes 1.8 開始,您必須指定與 .spec.template
的標籤匹配的 Pod 選擇算符。 用戶不指定 Pod 選擇算符時,該字段再也不有默認值。 選擇算符的默認值生成結果與 kubectl apply
不兼容。 此外,一旦建立了 DaemonSet,它的 .spec.selector
就不能修改。 修改 Pod 選擇算符可能致使 Pod 意外懸浮,而且這對用戶來講是費解的。
spec.selector
是一個對象,以下兩個字段組成:
matchLabels
- 與 ReplicationController 的 .spec.selector
的做用相同。matchExpressions
- 容許構建更加複雜的選擇器,能夠經過指定 key、value 列表以及將 key 和 value 列表關聯起來的 operator。當上述兩個字段都指定時,結果會按邏輯與(AND)操做處理。
若是指定了 .spec.selector
,必須與 .spec.template.metadata.labels
相匹配。 若是與後者不匹配,則 DeamonSet 會被 API 拒絕。
c)僅在某些節點上運行 Pod
若是指定了 .spec.template.spec.nodeSelector
,DaemonSet 控制器將在可以與 Node 選擇算符 匹配的節點上建立 Pod。
若是根本就沒有指定,則 DaemonSet 控制器將在全部節點上建立 Pod。
d)通訊方式
DaemonSet 中的 Pod 進行通訊的幾種可能模式以下:
推送(Push):配置 DaemonSet 中的 Pod,將更新發送到另外一個服務,例如統計數據庫。 這些服務沒有客戶端。
NodeIP 和已知端口:DaemonSet 中的 Pod 可使用 hostPort
,從而能夠經過節點 IP 訪問到 Pod。客戶端能經過某種方法獲取節點 IP 列表,而且基於此也能夠獲取到相應的端口。
DNS:建立具備相同 Pod 選擇算符的 無頭服務, 經過使用 endpoints
資源或從 DNS 中檢索到多個 A 記錄來發現 DaemonSet。
Service:建立具備相同 Pod 選擇算符的服務,並使用該服務隨機訪問到某個節點上的 守護進程(沒有辦法訪問到特定節點)。
a)調度策略
一般狀況下,經過DaemonSet建立的的Pod應該調度到那個節點是經過Kubernetes調度策略決定的,然而,當這個Pod被建立的時候,運行在那個節點上其實已經被提早決定了,因此它會忽略調度器。所以:
可是能夠經過如下方法來讓Pod運行到指定的Node上:
b)DaemonSet 有兩種更新策略:
OnDelete
更新策略時,在更新 DaemonSet 模板後,只有當你手動刪除老的 DaemonSet pods 以後,新的 DaemonSet Pod 纔會被自動建立。跟 Kubernetes 1.6 之前的版本相似。RollingUpdate
更新策略時,在更新 DaemonSet 模板後, 老的 DaemonSet pods 將被終止,而且將以受控方式自動建立新的 DaemonSet pods。 更新期間,最多隻能有 DaemonSet 的一個 Pod 運行於每一個節點上a)建立一個收集日誌的DaemonSet,使用filebeat收集日誌,經過filebeat收集日誌傳給redis。
# 建立Redis環境 apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: default spec: replicas: 1 selector: matchLabels: app: redis role: cachedb template: metadata: labels: app: redis role: cachedb spec: containers: - name: redis image: redis:5.0.5-alpine ports: - name: redis containerPort: 6379 --- # 建立服務 apiVersion: v1 kind: Service metadata: name: redis namespace: default spec: type: ClusterIP selector: app: redis role: cachedb ports: - port: 6379 --- # 建立守護進程集合:filebeat-收集日誌 apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat-ds namespace: default spec: selector: matchLabels: app: filebeat role: logstorage template: metadata: labels: app: filebeat role: logstorage spec: containers: - name: filebeat image: ikubernetes/filebeat:5.6.5-alpine env: - name: REDIS_HOST value: redis.default.svc.cluster.local
b)執行命令:
//應用yaml kubectl apply -f redis-filebeat.yaml
c)查看運行狀況
# 1. 查看Pod建立狀況 kubectl get pods NAME READY STATUS RESTARTS AGE filebeat-ds-669qx 1/1 Running 0 56m filebeat-ds-grthz 1/1 Running 0 53m redis-84d7cdf88b-v4n8q 1/1 Running 0 46m # 2. 查看服務狀態 kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis ClusterIP 10.100.160.198 <none> 6379/TCP 63m # 3. 進入filebeat中,添加日誌記錄 kubectl exec -it filebeat-ds-grthz -- /bin/bash cd /var/log/containers/ echo "測試日誌" > a.log # 4. 進入redis中查看 kubectl exec -it redis-84d7cdf88b-v4n8q -- /bin/sh /data # redis-cli -h redis.default.svc.cluster.local -p 6379 redis.default.svc.cluster.local:6379> KEYS * 1) "filebeat"
本篇簡單的學習了用於建立守護進程的DaemonSet資源對象,接下來就還將繼續對StatefulSets資源進行學習。