日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

今天分享一下【Kube.NETes】 DaemonSet 詳解,豐富個(gè)人簡(jiǎn)歷,提高面試level,給自己增加一點(diǎn)談資,秒變面試小達(dá)人,BAT不是夢(mèng)。

三分鐘你將學(xué)會(huì):

  1. DaemonSet是什么?
  2. DaemonSet的應(yīng)用場(chǎng)景
  3. DaemonSet 對(duì)象詳解
  4. DaemonSet的常見(jiàn)問(wèn)題及解決方案

一、介紹DaemonSet

1、為什么需要DaemonSet

在 Kubernetes 集群中,通常需要在每個(gè)節(jié)點(diǎn)上運(yùn)行守護(hù)進(jìn)程來(lái)監(jiān)視節(jié)點(diǎn)健康狀態(tài)、收集日志等,這些守護(hù)進(jìn)程通常稱為系統(tǒng)級(jí)守護(hù)進(jìn)程,如 Kubernetes Cluster Autoscaler 和 Kubernetes DNS。使用 Deployment 或 StatefulSet 可以創(chuàng)建 Pod,這些 Pod 可以被調(diào)度到任何節(jié)點(diǎn)上運(yùn)行,但是在某些情況下,需要確保每個(gè)節(jié)點(diǎn)上都運(yùn)行著一個(gè) Pod 副本 版本,即需要使用 DaemonSet。

2、DaemonSet 簡(jiǎn)介

圖片

DaemonSet 是 Kubernetes 中一種類型的控制器對(duì)象,用于在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 副本版本,確保每個(gè)節(jié)點(diǎn)上都有一個(gè)或多個(gè) Pod 副本。DaemonSet 控制器可以保證在新增節(jié)點(diǎn)時(shí)自動(dòng)在新增的節(jié)點(diǎn)上創(chuàng)建 Pod 副本,同時(shí)在節(jié)點(diǎn)刪除時(shí),自動(dòng)刪除該節(jié)點(diǎn)上的 Pod 副本。

3、DaemonSet 與其他 Kubernetes 對(duì)象的區(qū)別

DaemonSet 在運(yùn)行時(shí),會(huì)在集群中的每個(gè)節(jié)點(diǎn)上創(chuàng)建一個(gè) Pod 副本,而其他的控制器如 Deployment 和 StatefulSet 創(chuàng)建的 Pod,會(huì)盡可能地讓它們?cè)诩旱牟煌?jié)點(diǎn)上運(yùn)行。另外,DaemonSet 在節(jié)點(diǎn)加入和退出時(shí),會(huì)自動(dòng)處理 Pod 的創(chuàng)建和刪除,因此可以保證在整個(gè)集群中的每個(gè)節(jié)點(diǎn)上都運(yùn)行著一個(gè) Pod 副本,適合用于運(yùn)行集群服務(wù)的 daemon 容器或一些常駐內(nèi)存的服務(wù)。而 Deployment 和 StatefulSet 更適用于部署需要?jiǎng)討B(tài)擴(kuò)縮容的應(yīng)用程序。

圖片

對(duì)象類型

說(shuō)明

控制器

Pods數(shù)量

Deployment

管理多個(gè) ReplicaSets,用于應(yīng)用程序的版本控制和滾動(dòng)升級(jí)

控制器

可以控制多個(gè)Pods數(shù)量

StatefulSet

用于有狀態(tài)應(yīng)用程序,例如數(shù)據(jù)庫(kù),確保每個(gè)實(shí)例具有唯一的網(wǎng)絡(luò)標(biāo)識(shí)符和穩(wěn)定的存儲(chǔ)

控制器

可以控制多個(gè)Pods數(shù)量

DaemonSet

用于運(yùn)行守護(hù)進(jìn)程(如日志收集器),它會(huì)在每個(gè)工作節(jié)點(diǎn)上運(yùn)行一個(gè)副本

控制器

等于節(jié)點(diǎn)數(shù)量

Job

用于批處理任務(wù),例如數(shù)據(jù)轉(zhuǎn)換或任務(wù)調(diào)度

無(wú)

一次性

CronJob

用于定期執(zhí)行具有固定時(shí)間間隔的任務(wù)

無(wú)

可以控制多個(gè)Pods數(shù)量

二、創(chuàng)建DaemonSet

1、使用 kubectl 命令創(chuàng)建 DaemonSet

使用 kubectl 命令創(chuàng)建 DaemonSet 的步驟如下:

(1)使用以下命令創(chuàng)建 YAML 文件:

apiVersion: Apps/v1
kind: DaemonSet
metadata:
  name: example-daemonset
  labels:
    app: example
spec:
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: Nginx

在此示例中,我們創(chuàng)建了一個(gè)名為 "example-daemonset" 的 DaemonSet,并使用 Nginx 容器作為模板。請(qǐng)注意,標(biāo)簽 "app: example" 在這里起到關(guān)鍵作用,因?yàn)樗鼘⒂糜谶x擇要運(yùn)行此 DaemonSet 的節(jié)點(diǎn)。

(2)使用以下命令創(chuàng)建 DaemonSet:

kubectl create -f example-daemonset.yaml

這將使用先前創(chuàng)建的 YAML 文件創(chuàng)建 DaemonSet。您可以通過(guò)使用以下命令來(lái)驗(yàn)證是否已創(chuàng)建 DaemonSet:

kubectl get daemonsets

如果您看到 "example-daemonset",則表示 DaemonSet 已成功創(chuàng)建。

2、使用 YAML 文件創(chuàng)建DaemonSet

要使用 YAML 文件創(chuàng)建 DaemonSet,請(qǐng)執(zhí)行以下步驟:

(1)創(chuàng)建一個(gè) YAML 文件并使用以下內(nèi)容:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: example-daemonset
  labels:
    app: example
spec:
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: nginx

在此示例中,我們創(chuàng)建了一個(gè)名為 "example-daemonset" 的 DaemonSet,并使用 Nginx 容器作為模板。請(qǐng)注意,標(biāo)簽 "app: example" 在這里起到關(guān)鍵作用,因?yàn)樗鼘⒂糜谶x擇要運(yùn)行此 DaemonSet 的節(jié)點(diǎn)。

(2)使用以下命令創(chuàng)建 DaemonSet:

kubectl apply -f example-daemonset.yaml

這將使用先前創(chuàng)建的 YAML 文件創(chuàng)建 DaemonSet。您可以通過(guò)使用以下命令來(lái)驗(yàn)證是否已創(chuàng)建 DaemonSet:

kubectl get daemonsets

如果您看到 "example-daemonset",則表示 DaemonSet 已成功創(chuàng)建。

3、使用 Terraform 創(chuàng)建 DaemonSet

使用 Terraform 創(chuàng)建 DaemonSet 是一種自動(dòng)化部署和管理 Kubernetes 應(yīng)用程序的方法。Terraform 是一種基礎(chǔ)設(shè)施即代碼工具,允許您編寫代碼來(lái)定義和管理基礎(chǔ)設(shè)施。

要使用 Terraform 創(chuàng)建 DaemonSet,您需要做以下幾步:

  1. 安裝 Terraform 工具:請(qǐng)根據(jù)您的操作系統(tǒng)在 Terraform 官方網(wǎng)站(https://www.terraform.io/downloads.html)上查找相應(yīng)的安裝指南。
  2. 創(chuàng)建一個(gè) Terraform 項(xiàng)目:在一個(gè)新的目錄中,創(chuàng)建一個(gè) main.tf 文件,并添加以下內(nèi)容。
provider "kubernetes" {
  config_context_cluster = "my-k8s-cluster"
}

resource "kubernetes_daemonset" "my-daemonset" {
  metadata {
    name = "my-daemonset"
  }

  spec {
    selector {
      match_labels = {
        app = "my-daemonset"
      }
    }

    template {
      metadata {
        labels = {
          app = "my-daemonset"
        }
      }

      spec {
        containers {
          name = "my-container"
          image = "nginx:1.19.0-alpine"
          ports {
            name = "http"
            container_port = 80
          }
          volume_mounts {
            name = "html"
            mount_path = "/usr/share/nginx/html"
          }
        }

        volumes {
          name = "html"
          config_map {
            name = "my-daemonset-configmap"
            items {
              key = "index.html"
              path = "index.html"
            }
          }
        }
      }
    }
  }
}

此代碼將創(chuàng)建一個(gè)名為 my-daemonset 的 DaemonSet,該 DaemonSet 包含一個(gè)名為 my-container 的容器,并使用 Nginx 映像。

(3)初始化 Terraform 項(xiàng)目:使用以下命令初始化 Terraform 項(xiàng)目。

$ terraform init

(4)配置 Terraform 項(xiàng)目:使用以下命令配置 Terraform 項(xiàng)目。

$ terraform apply

此命令將使用 Terraform 創(chuàng)建 DaemonSet。

三、DaemonSet的應(yīng)用場(chǎng)景

1、在節(jié)點(diǎn)上部署系統(tǒng)級(jí)守護(hù)進(jìn)程

DaemonSet 最常見(jiàn)的應(yīng)用場(chǎng)景之一是在節(jié)點(diǎn)上部署系統(tǒng)級(jí)守護(hù)進(jìn)程。例如,Kubernetes 官方提供的 kube-proxy 和 kube-dns 組件都是以 DaemonSet 的形式運(yùn)行在每個(gè)節(jié)點(diǎn)上的。這些組件是 Kubernetes 集群中非常重要的系統(tǒng)級(jí)進(jìn)程,需要在每個(gè)節(jié)點(diǎn)上運(yùn)行,以確保 Kubernetes 集群的正常運(yùn)行。

圖片

以下是部署 kube-proxy DaemonSet 的示例 YAML 文件:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-proxy
  namespace: kube-system
  labels:
    k8s-app: kube-proxy
spec:
  selector:
    matchLabels:
      k8s-app: kube-proxy
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: kube-proxy
    spec:
      containers:
      - name: kube-proxy
        image: k8s.gcr.io/kube-proxy:v1.22.0
        securityContext:
          privileged: true
        command:
        - /usr/local/bin/kube-proxy
        args:
        - --cnotallow=/var/lib/kube-proxy/config.conf
        volumeMounts:
        - name: kube-proxy-config
          mountPath: /var/lib/kube-proxy
      volumes:
      - name: kube-proxy-config
        configMap:
          name: kube-proxy

在這個(gè) YAML 文件中,我們使用 apps/v1 API 版本創(chuàng)建了一個(gè)名為 kube-proxy 的 DaemonSet。它的 selector 字段指定了需要運(yùn)行這個(gè) DaemonSet 的 Pod 的標(biāo)簽,updateStrategy 指定了更新策略,這里使用的是滾動(dòng)更新。template 字段定義了 Pod 的模板,包括容器、掛載的卷和命令參數(shù)等。

2、在節(jié)點(diǎn)上運(yùn)行普通容器

在 Kubernetes 集群中,通常有許多需要在每個(gè)節(jié)點(diǎn)上運(yùn)行的容器,例如日志收集代理、監(jiān)控代理、安全代理等。使用 DaemonSet 控制器,可以方便地在每個(gè)節(jié)點(diǎn)上運(yùn)行這些容器。

圖片

下面是一個(gè)運(yùn)行 fluentd 日志收集代理的 DaemonSet 的示例 YAML 文件:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
    matchLabels:
      name: fluentd
  template:
    metadata:
      labels:
        name: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd:v1.7-1
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

在上面的 YAML 文件中,我們定義了一個(gè)名為 fluentd 的 DaemonSet。該 DaemonSet 會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)名為 fluentd 的容器。

該容器使用 fluent/fluentd:v1.7-1 鏡像,并將主機(jī)節(jié)點(diǎn)上的 /var/log 目錄掛載到容器中的 /var/log 目錄下。這樣,該容器就可以從節(jié)點(diǎn)上的日志文件中收集日志。

3、維護(hù)集群狀態(tài)

另一個(gè)常見(jiàn)的 DaemonSet 應(yīng)用場(chǎng)景是維護(hù)集群狀態(tài)。在 Kubernetes 集群中,有許多需要在每個(gè)節(jié)點(diǎn)上運(yùn)行的控制器,例如網(wǎng)絡(luò)插件、存儲(chǔ)插件、DNS 插件等。這些控制器通常需要在每個(gè)節(jié)點(diǎn)上運(yùn)行,以維護(hù)集群狀態(tài)。

圖片

例如,CNI(Container Network Interface)插件負(fù)責(zé)為 Kubernetes 集群中的容器分配 IP 地址和路由信息,因此需要在每個(gè)節(jié)點(diǎn)上運(yùn)行。Kubernetes 官方提供的 CNI 插件就是以 DaemonSet 的形式運(yùn)行在每個(gè)節(jié)點(diǎn)上的。

下面是部署 CNI 插件的示例 YAML 文件:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds-amd64
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: flannel
    spec:
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.14.0
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=enp0s8  # 這里需要根據(jù)實(shí)際網(wǎng)絡(luò)接口修改
        securityContext:
          privileged: true
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      hostNetwork: true
      volumes:
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

在這個(gè) YAML 文件中,我們使用 apps/v1 API 版本創(chuàng)建了一個(gè)名為 kube-flannel-ds-amd64 的 DaemonSet。它的 selector 字段指定了需要運(yùn)行這個(gè) DaemonSet 的 Pod 的標(biāo)簽,updateStrategy 指定了更新策略,這里使用的是滾動(dòng)更新。template 字段定義了 Pod 的模板,包括容器、掛載的卷和命令參數(shù)等。

這個(gè) YAML 文件中定義了一個(gè)名為 kube-flannel 的容器,使用 quay.io/coreos/flannel:v0.14.0 鏡像,并將容器的網(wǎng)絡(luò)接口設(shè)置為 enp0s8。該容器還從 configMap 掛載了配置文件,并開(kāi)啟了特權(quán)模式。

4、在節(jié)點(diǎn)上運(yùn)行工具

除了守護(hù)進(jìn)程、普通容器和控制器之外,還可以使用 DaemonSet 在每個(gè)節(jié)點(diǎn)上運(yùn)行工具。這些工具通常用于調(diào)試、監(jiān)控和診斷集群狀態(tài)。

圖片

例如,使用 DaemonSet在每個(gè)節(jié)點(diǎn)上運(yùn)行診斷工具的示例 YAML 文件如下所示:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: diagnostic-tool
spec:
  selector:
    matchLabels:
      app: diagnostic-tool
  template:
    metadata:
      labels:
        app: diagnostic-tool
    spec:
      containers:
      - name: diagnostic-tool
        image: your-Docker-image
        command:
        - sh
        - -c
        - |
          while true; do
            # do some diagnostic tasks
            sleep 60
          done
        volumeMounts:
        - name: host-var-run
          mountPath: /host/var/run
          readOnly: true
      volumes:
      - name: host-var-run
        hostPath:
          path: /var/run

在這個(gè) YAML 文件中,我們定義了一個(gè)名為 diagnostic-tool 的 DaemonSet。該 DaemonSet 會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)名為 diagnostic-tool 的容器。

該容器使用一個(gè)自定義的 Docker 鏡像,并執(zhí)行一個(gè) while 循環(huán),在其中執(zhí)行一些診斷任務(wù)。此外,容器還將節(jié)點(diǎn)上的 /var/run 目錄掛載到容器中的 /host/var/run 目錄下,以便讀取節(jié)點(diǎn)上的運(yùn)行時(shí)信息。

使用 DaemonSet 運(yùn)行診斷工具可以快速定位節(jié)點(diǎn)和集群級(jí)別的問(wèn)題,例如網(wǎng)絡(luò)問(wèn)題、存儲(chǔ)問(wèn)題和性能問(wèn)題等。

四、DaemonSet 對(duì)象詳解

1、DaemonSet的結(jié)構(gòu)及其各個(gè)部分的作用

DaemonSet 是 Kubernetes 中一種類型的控制器對(duì)象,用于在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 副本版本,確保每個(gè)節(jié)點(diǎn)上都有一個(gè)或多個(gè) Pod 副本。DaemonSet 控制器可以保證在新增節(jié)點(diǎn)時(shí)自動(dòng)在新增的節(jié)點(diǎn)上創(chuàng)建 Pod 副本,同時(shí)在節(jié)點(diǎn)刪除時(shí),自動(dòng)刪除該節(jié)點(diǎn)上的 Pod 副本。

圖片

在 DaemonSet 對(duì)象中,有以下幾個(gè)部分:

  • metadata:元數(shù)據(jù)部分包含了對(duì)象的名稱、命名空間、標(biāo)簽等信息。
  • spec:規(guī)格部分包含了 DaemonSet 對(duì)象的規(guī)格,如選擇器、Pod 模板等。
  • status:狀態(tài)部分包含了 DaemonSet 對(duì)象的當(dāng)前狀態(tài)信息,如運(yùn)行中的 Pod 數(shù)量等。

其中,spec 部分是 DaemonSet 對(duì)象中最重要的部分,它包含了以下幾個(gè)字段:

  • selector:指定了哪些節(jié)點(diǎn)需要運(yùn)行 Pod 副本。可以使用節(jié)點(diǎn)標(biāo)簽選擇器指定節(jié)點(diǎn)的標(biāo)簽,也可以使用節(jié)點(diǎn)名稱選擇器指定節(jié)點(diǎn)的名稱。
  • template:指定了要運(yùn)行在節(jié)點(diǎn)上的 Pod 模板。模板中可以指定容器鏡像、啟動(dòng)命令等信息。
  • updateStrategy:指定了 DaemonSet 的更新策略。默認(rèn)情況下,DaemonSet 會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 副本,如果需要更新 Pod 版本,則會(huì)逐個(gè)節(jié)點(diǎn)進(jìn)行更新。可以使用 RollingUpdate 策略實(shí)現(xiàn)平滑的更新過(guò)程,也可以使用 OnDelete 策略實(shí)現(xiàn)在節(jié)點(diǎn)刪除時(shí)更新 Pod 版本。

2、DaemonSet 的生命周期

圖片

DaemonSet 的生命周期包括以下幾個(gè)階段:

  1. 創(chuàng)建 DaemonSet:使用 kubectl apply 或 kubectl create 命令創(chuàng)建一個(gè) DaemonSet 對(duì)象。
  2. DaemonSet 控制器創(chuàng)建 Pod:當(dāng) DaemonSet 被創(chuàng)建時(shí),DaemonSet 控制器會(huì)根據(jù) Pod 模板創(chuàng)建 Pod 副本,并在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 副本。
  3. 新節(jié)點(diǎn)加入集群:當(dāng)新的節(jié)點(diǎn)加入集群時(shí),DaemonSet 控制器會(huì)自動(dòng)在新節(jié)點(diǎn)上創(chuàng)建一個(gè) Pod 副本,確保每個(gè)節(jié)點(diǎn)上都有一個(gè) Pod 副本。
  4. 節(jié)點(diǎn)被刪除:當(dāng)一個(gè)節(jié)點(diǎn)被刪除時(shí),DaemonSet 控制器會(huì)自動(dòng)刪除該節(jié)點(diǎn)上的 Pod 副本,以確保每個(gè)節(jié)點(diǎn)上都有一個(gè) Pod 副本。
  5. 更新 DaemonSet:當(dāng)需要更新 DaemonSet 時(shí),可以使用 kubectl apply 或 kubectl edit 命令修改 DaemonSet 對(duì)象的配置。這會(huì)導(dǎo)致 DaemonSet 控制器創(chuàng)建新的 Pod 副本,并逐步替換舊的 Pod 副本,以確保每個(gè)節(jié)點(diǎn)上都有一個(gè)新的 Pod 副本。
  6. 刪除 DaemonSet:當(dāng)不再需要 DaemonSet 時(shí),可以使用 kubectl delete 命令刪除 DaemonSet 對(duì)象。此時(shí),DaemonSet 控制器會(huì)刪除所有的 Pod 副本。

3、DaemonSet 的選擇器

選擇器是 DaemonSet 對(duì)象的一部分,用于確定在哪些節(jié)點(diǎn)上運(yùn)行該 DaemonSet 的 Pod 副本。我們可以使用 Pod 模板中的標(biāo)簽或注釋,或者在 DaemonSet 對(duì)象的選擇器中指定標(biāo)簽或注釋,來(lái)確定選擇器。

以下是一個(gè)示例 DaemonSet YAML 文件,其中使用標(biāo)簽選擇器來(lái)確定在哪些節(jié)點(diǎn)上運(yùn)行該 DaemonSet 的 Pod 副本:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
          command: [ "sh", "-c", "echo Hello from the DaemonSet pod && sleep 3600" ]
      nodeSelector:
        disktype: ssd

在這個(gè)示例中,我們使用 nodeSelector 來(lái)指定只在磁盤類型為 ssd 的節(jié)點(diǎn)上運(yùn)行該 DaemonSet 的 Pod 副本。

4、DaemonSet 的更新策略

更新策略用于確定如何更新 DaemonSet 對(duì)象的 Pod 副本。在 Kubernetes 中,有以下三種更新策略可供選擇:

  1. RollingUpdate:滾動(dòng)更新。這是默認(rèn)的更新策略。它允許您將 DaemonSet 的 Pod 副本版本逐個(gè)更新。即首先更新一個(gè)節(jié)點(diǎn)上的 Pod,然后等待它的更新成功后再更新下一個(gè)節(jié)點(diǎn)上的 Pod,以此類推。這種策略確保了在更新期間至少有一個(gè) Pod 副本可用,從而最小化了服務(wù)的中斷時(shí)間。
  2. OnDelete:當(dāng) DaemonSet 對(duì)象的 Pod 副本有更新時(shí),不會(huì)自動(dòng)對(duì)舊的 Pod 副本進(jìn)行更新。相反,舊的 Pod 副本將在刪除后自動(dòng)被新的 Pod 副本替換。這種策略適用于不需要連續(xù)更新的應(yīng)用程序。
  3. Pause:暫停更新。這種策略將停止 DaemonSet 的自動(dòng)更新,直到您手動(dòng)恢復(fù)更新。這種策略適用于需要手動(dòng)控制更新過(guò)程的應(yīng)用程序。

更新策略可以在 DaemonSet 對(duì)象的 spec 字段中進(jìn)行配置。以下是一個(gè)使用 RollingUpdate 策略的 DaemonSet 示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
      terminationGracePeriodSeconds: 30
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1

在這個(gè) YAML 文件中,我們定義了一個(gè)名為 nginx-daemonset 的 DaemonSet。該 DaemonSet 會(huì)在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)名為 nginx 的容器。

該容器使用了最新版本的 Nginx 鏡像。容器在終止時(shí)有 30 秒的 grace period,以確保正在進(jìn)行的請(qǐng)求可以完成。

該 DaemonSet 對(duì)象使用 RollingUpdate 策略,并指定了 maxUnavailable 選項(xiàng),該選項(xiàng)指定了在更新期間最多允許一個(gè) Pod 副本不可用。這確保了在更新期間始終有至少一個(gè) Pod 副本可用。

五、DaemonSet 的常見(jiàn)問(wèn)題及解決方案

1、容器無(wú)法在節(jié)點(diǎn)上創(chuàng)建

(1)問(wèn)題描述

當(dāng)您創(chuàng)建 DaemonSet 時(shí),您可能會(huì)遇到以下錯(cuò)誤:

Error creating: pods "XXX" is forbidden: node "YYY" cannot be used because it is unschedulable

這個(gè)錯(cuò)誤消息表示,調(diào)度程序無(wú)法在某個(gè)節(jié)點(diǎn)上安排 DaemonSet Pod 的運(yùn)行。通常,這是因?yàn)楣?jié)點(diǎn)處于不可調(diào)度的狀態(tài),例如它被標(biāo)記為“已維護(hù)”或“故障”。

(2)解決方案

圖片

要解決這個(gè)問(wèn)題,您需要檢查節(jié)點(diǎn)的狀態(tài)。您可以使用以下命令來(lái)檢查節(jié)點(diǎn)的狀態(tài):

kubectl get nodes

如果節(jié)點(diǎn)的狀態(tài)是“維護(hù)”或“故障”,您需要將其恢復(fù)為可用狀態(tài)。您可以使用以下命令來(lái)將節(jié)點(diǎn)重新調(diào)度:

kubectl uncordon <node-name>

2、更新失敗

(1)問(wèn)題描述

當(dāng)您更新 DaemonSet 時(shí),您可能會(huì)遇到以下錯(cuò)誤:

Update failed. First seen error: error updating status for daemonset

這個(gè)錯(cuò)誤消息表示,DaemonSet 更新失敗。通常,這是因?yàn)槟硞€(gè)節(jié)點(diǎn)上的 Pod 處于不可用狀態(tài),例如節(jié)點(diǎn)故障或容器崩潰。

(2)解決方案

圖片

要解決這個(gè)問(wèn)題,您需要檢查節(jié)點(diǎn)和 Pod 的狀態(tài)。您可以使用以下命令來(lái)檢查節(jié)點(diǎn)和 Pod 的狀態(tài):

kubectl get nodes
kubectl get pods -n <namespace>

如果您發(fā)現(xiàn)節(jié)點(diǎn)或 Pod 處于不可用狀態(tài),您需要將其恢復(fù)為可用狀態(tài)。您可以使用以下命令來(lái)重新啟動(dòng)節(jié)點(diǎn)或 Pod:

kubectl delete pod <pod-name> -n <namespace>

3、網(wǎng)絡(luò)配置問(wèn)題

(1)問(wèn)題描述

當(dāng)您創(chuàng)建 DaemonSet 時(shí),您可能會(huì)遇到以下錯(cuò)誤:

Failed to create pod: <pod-name>
Error syncing pod

這個(gè)錯(cuò)誤消息表示,Pod 同步失敗。通常,這是因?yàn)榫W(wǎng)絡(luò)配置不正確。

(2)解決方案

要解決這個(gè)問(wèn)題,您需要檢查網(wǎng)絡(luò)配置。您可以使用以下命令來(lái)檢查網(wǎng)絡(luò)配置:

kubectl describe pod <pod-name> -n <namespace>

如果您發(fā)現(xiàn)網(wǎng)絡(luò)配置不正確,您需要更新它。您可以使用以下命令來(lái)更新網(wǎng)絡(luò)配置:

kubectl edit pod <pod-name> -n <namespace>
 

4、如何監(jiān)視 DaemonSet 運(yùn)行狀態(tài)

在 Kubernetes 中,監(jiān)視 DaemonSet 的運(yùn)行狀態(tài)可以通過(guò)以下幾種方式實(shí)現(xiàn):

(1)使用 kubectl 命令行工具

kubectl 命令行工具提供了多種監(jiān)視 DaemonSet 運(yùn)行狀態(tài)的命令,如下所示:

  • kubectl get daemonset:列出當(dāng)前集群中所有的 DaemonSet。
  • kubectl describe daemonset <daemonset-name>:查看指定 DaemonSet 的詳細(xì)信息,包括 Pod 的狀態(tài)、事件和控制器的狀態(tài)等。
  • kubectl rollout status daemonset <daemonset-name>:查看 DaemonSet 的升級(jí)進(jìn)度和狀態(tài)。
  • kubectl logs <pod-name>:查看 Pod 的日志輸出。

(2)使用 Kubernetes Dashboard

Kubernetes Dashboard 提供了一個(gè)用戶友好的 Web 界面,可用于監(jiān)視 DaemonSet 的運(yùn)行狀態(tài)。在 Kubernetes Dashboard 中,可以查看所有 DaemonSet 和它們的 Pod,還可以查看各個(gè) Pod 的詳細(xì)信息,包括 Pod 的日志輸出。

(3)使用 Prometheus 和 Grafana

Prometheus 和 Grafana 是流行的監(jiān)視和指標(biāo)收集工具,可以用于監(jiān)視 DaemonSet 的運(yùn)行狀態(tài)。通過(guò) Prometheus 收集集群中的指標(biāo),使用 Grafana 可視化這些指標(biāo)。可視化的指標(biāo)包括 DaemonSet 的 Pod 數(shù)量、節(jié)點(diǎn)上的 CPU 使用情況和內(nèi)存使用情況等。

5、如何排除問(wèn)題和調(diào)試

在使用 DaemonSet 過(guò)程中,可能會(huì)遇到各種問(wèn)題。以下是一些常見(jiàn)的問(wèn)題及其解決方案。

(1)Pod 處于 Pending 狀態(tài)

當(dāng) DaemonSet 中的 Pod 處于 Pending 狀態(tài)時(shí),有以下幾種可能的原因:

  • 節(jié)點(diǎn)資源不足:Pod 需要的資源(例如 CPU、內(nèi)存等)超出了節(jié)點(diǎn)可用資源。解決方法是添加更多的節(jié)點(diǎn)或調(diào)整 Pod 的資源請(qǐng)求。
  • 節(jié)點(diǎn)標(biāo)簽不匹配:如果 DaemonSet 指定了節(jié)點(diǎn)選擇器,但節(jié)點(diǎn)沒(méi)有匹配的標(biāo)簽,則 Pod 將處于 Pending 狀態(tài)。解決方法是為節(jié)點(diǎn)添加匹配的標(biāo)簽。
  • Pod 調(diào)度失敗:如果沒(méi)有足夠的節(jié)點(diǎn)滿足 Pod 的調(diào)度要求,則 Pod 將處于 Pending 狀態(tài)。解決方法是添加更多的節(jié)點(diǎn)或調(diào)整 Pod 的調(diào)度要求。

(2)Pod 啟動(dòng)失敗

當(dāng) DaemonSet 中的 Pod 啟動(dòng)失敗時(shí),有以下幾種可能的原因:

  • 容器鏡像拉取失敗:Pod 配置中指定的容器鏡像不存在或拉取失敗。解決方法是確認(rèn)容器鏡像的可用性,并檢查 Pod 配置中的容器鏡像名稱和版本是否正確。
  • 容器啟動(dòng)命令或參數(shù)不正確:如果容器的啟動(dòng)命令或參數(shù)不正確,則容器將無(wú)法啟動(dòng)。
  • 解決方法是檢查 Pod 配置中的容器的啟動(dòng)命令和參數(shù)是否正確。
  • 容器配置錯(cuò)誤:如果容器的配置文件存在錯(cuò)誤,則容器可能無(wú)法啟動(dòng)或啟動(dòng)后立即崩潰。解決方法是檢查容器的配置文件是否正確,并重新啟動(dòng) Pod。

(3)Pod 運(yùn)行時(shí)錯(cuò)誤

當(dāng) DaemonSet 中的 Pod 運(yùn)行時(shí)出現(xiàn)錯(cuò)誤時(shí),有以下幾種可能的原因:

  • 容器內(nèi)部錯(cuò)誤:容器內(nèi)部可能會(huì)發(fā)生錯(cuò)誤,例如進(jìn)程崩潰或配置文件錯(cuò)誤。
  • 解決方法是檢查容器日志,確定錯(cuò)誤原因,并修復(fù)容器內(nèi)部問(wèn)題。
  • 節(jié)點(diǎn)故障:如果節(jié)點(diǎn)出現(xiàn)故障,則節(jié)點(diǎn)上運(yùn)行的所有 Pod 可能會(huì)受到影響。
  • 解決方法是檢查節(jié)點(diǎn)的健康狀況,并在必要時(shí)重啟節(jié)點(diǎn)。
  • 網(wǎng)絡(luò)問(wèn)題:如果 Pod 無(wú)法與其他服務(wù)或資源通信,則可能存在網(wǎng)絡(luò)問(wèn)題。解決方法是檢查網(wǎng)絡(luò)配置,確保 Pod 能夠訪問(wèn)所需的服務(wù)或資源。

(4)如何排除問(wèn)題和調(diào)試

在排除問(wèn)題和調(diào)試時(shí),可以使用以下方法:

  • 查看日志:使用 kubectl logs 命令查看容器的日志,以了解容器內(nèi)部發(fā)生的錯(cuò)誤和故障。
  • 使用 kubectl describe 命令:使用 kubectl describe 命令查看 Pod 和其他相關(guān)對(duì)象的詳細(xì)信息,以確定問(wèn)題所在。
  • 使用 kubectl exec 命令:使用 kubectl exec 命令在容器內(nèi)部運(yùn)行命令,以檢查容器的狀態(tài)和配置文件。
  • 使用 kubectl get 命令:使用 kubectl get 命令查看集群中的對(duì)象,以確定節(jié)點(diǎn)和 Pod 的狀態(tài)。
  • 使用 kubectl events 命令:使用 kubectl events 命令查看 Kubernetes 事件,以了解 Pod 和其他對(duì)象的狀態(tài)變化。

本文轉(zhuǎn)載自微信公眾號(hào)「哪吒編程」

分享到:
標(biāo)簽:K8S
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定