K8S學習筆錄 - DaemonSet: 在每一個Node上都調度一個Pod

原文連接git

在一些場景下,好比但願對節點進行性能監控、日誌手機等,須要在每一個節點上部署一個相關服務,咱們能夠經過親和性相關功能或者DaemonSet來實現它github

DaemonSet

type DaemonSet struct {
    metav1.TypeMeta `json:",inline"`

    metav1.ObjectMeta `json:"metadata,omitempty"`

    // DaemonSet的具體定義
    Spec DaemonSetSpec `json:"spec,omitempty"`

    // DaemonSet的當前狀態,只讀
    Status DaemonSetStatus `json:"status,omitempty"`
}

type DaemonSetSpec struct {
    // Label選擇器,用於查找被這個DaemonSet管理的Pod
    // 必須與Template中配置Pod的Label一致
    Selector *metav1.LabelSelector `json:"selector"`

    // Pod的具體定義
    Template v1.PodTemplateSpec `json:"template"`

    // Pod更新的策略配置
    UpdateStrategy DaemonSetUpdateStrategy `json:"updateStrategy,omitempty"`

    // Pod就緒前的最小等待時間,默認爲0,即一切準備好以後當即可用
    MinReadySeconds int32 `json:"minReadySeconds,omitempty"`

    // 保留的Pod的歷史版本數量,默認是10
    RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"`
}

type DaemonSetUpdateStrategy struct {
    // DaemonSet中Pod的升級策略,包括RollingUpdate和OnDelete,默認是RollingUpdate
    Type DaemonSetUpdateStrategyType `json:"type,omitempty"`

    // 滾動升級配置
    RollingUpdate *RollingUpdateDaemonSet `json:"rollingUpdate,omitempty"`
}

type RollingUpdateDaemonSet struct {
    // 最大不可用數,能夠是具體數字,能夠是百分比,默認是1,不能是0
    // 配置以後,更新升級時會先中止掉指定數量的Pod,而後啓動新的Pod,成功以後刪除掉舊的Pod,繼續更新剩餘的其餘Pod
    MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"`
}
複製代碼

簡單示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
 name: ab
 labels:
 app: ab
spec:
 selector:
 matchLabels:
 app: ab
 template:
 metadata:
 labels:
 app: ab
 spec:
 containers:
 - name: ab
 image: jordi/ab
 args:
 - -n100
 - -c10
 - -k
 - -r
 - URL
複製代碼

這個配置使用了docker-apache-benchmark這個Docker,實現一個簡單的壓力測試的功能。docker

因爲這個容器中在前臺運行的命令就是ab,因此當命令執行完以後,容器就會自動結束,此時Pod也會報異常,而後被DaemonSet幹掉從新建立一個新的出來。apache

實際上這種場景更偏向於定時任務,然而這裏也能用吧,畢竟什麼都不用配置就能夠達到每臺機器分配一個Pod的效果。json

跑起來以後的狀況以下api

$ kubectl get ds/ab -o wide
NAME   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES     SELECTOR
ab     2         2         2       2            2           <none>          59s   ab           jordi/ab   app=ab

$ kubectl get pods -l app=ab -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
ab-5gsbr   1/1     Running   0          85s   172.40.0.2   tx     <none>           <none>
ab-g9rzd   1/1     Running   0          85s   172.32.0.3   ks     <none>           <none>

$ kubectl logs ds/ab
Found 2 pods, using pod/ab-5gsbr
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.mi0ffice.cn (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
...
複製代碼
相關文章
相關標籤/搜索