自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

想學(xué)會K8S,DaemonSet很重要!值得收藏

云計(jì)算 云原生
在 Kubernetes 集群中,通常需要在每個(gè)節(jié)點(diǎn)上運(yùn)行守護(hù)進(jìn)程來監(jiān)視節(jié)點(diǎn)健康狀態(tài)、收集日志等,這些守護(hù)進(jìn)程通常稱為系統(tǒng)級守護(hù)進(jìn)程,如 Kubernetes Cluster Autoscaler 和 Kubernetes DNS。

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

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

  1. DaemonSet是什么?
  2. DaemonSet的應(yīng)用場景
  3. DaemonSet 對象詳解
  4. DaemonSet的常見問題及解決方案

一、介紹DaemonSet

1、為什么需要DaemonSet

在 Kubernetes 集群中,通常需要在每個(gè)節(jié)點(diǎn)上運(yùn)行守護(hù)進(jìn)程來監(jiān)視節(jié)點(diǎn)健康狀態(tài)、收集日志等,這些守護(hù)進(jìn)程通常稱為系統(tǒng)級守護(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 簡介

圖片

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

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

DaemonSet 在運(yùn)行時(shí),會在集群中的每個(gè)節(jié)點(diǎn)上創(chuàng)建一個(gè) Pod 副本,而其他的控制器如 Deployment 和 StatefulSet 創(chuàng)建的 Pod,會盡可能地讓它們在集群的不同節(jié)點(diǎn)上運(yùn)行。另外,DaemonSet 在節(jié)點(diǎn)加入和退出時(shí),會自動處理 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)用程序。

圖片

對象類型

說明

控制器

Pods數(shù)量

Deployment

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

控制器

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

StatefulSet

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

控制器

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

DaemonSet

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

控制器

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

Job

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


一次性

CronJob

用于定期執(zhí)行具有固定時(shí)間間隔的任務(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 容器作為模板。請注意,標(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。您可以通過使用以下命令來驗(yàn)證是否已創(chuàng)建 DaemonSet:

kubectl get daemonsets

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

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

要使用 YAML 文件創(chuàng)建 DaemonSet,請執(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 容器作為模板。請注意,標(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。您可以通過使用以下命令來驗(yàn)證是否已創(chuàng)建 DaemonSet:

kubectl get daemonsets

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

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

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

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

  1. 安裝 Terraform 工具:請根據(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)用場景

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

DaemonSet 最常見的應(yīng)用場景之一是在節(jié)點(diǎn)上部署系統(tǒng)級守護(hù)進(jìn)程。例如,Kubernetes 官方提供的 kube-proxy 和 kube-dns 組件都是以 DaemonSet 的形式運(yùn)行在每個(gè)節(jié)點(diǎn)上的。這些組件是 Kubernetes 集群中非常重要的系統(tǒng)級進(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 指定了更新策略,這里使用的是滾動更新。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 會在每個(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è)常見的 DaemonSet 應(yīng)用場景是維護(hù)集群狀態(tài)。在 Kubernetes 集群中,有許多需要在每個(gè)節(jié)點(diǎn)上運(yùn)行的控制器,例如網(wǎng)絡(luò)插件、存儲插件、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 指定了更新策略,這里使用的是滾動更新。template 字段定義了 Pod 的模板,包括容器、掛載的卷和命令參數(shù)等。

這個(gè) YAML 文件中定義了一個(gè)名為 kube-flannel 的容器,使用 quay.io/coreos/flannel:v0.14.0 鏡像,并將容器的網(wǎng)絡(luò)接口設(shè)置為 enp0s8。該容器還從 configMap 掛載了配置文件,并開啟了特權(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 會在每個(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)和集群級別的問題,例如網(wǎng)絡(luò)問題、存儲問題和性能問題等。

四、DaemonSet 對象詳解

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

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

圖片

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

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

其中,spec 部分是 DaemonSet 對象中最重要的部分,它包含了以下幾個(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 模板。模板中可以指定容器鏡像、啟動命令等信息。
  • updateStrategy:指定了 DaemonSet 的更新策略。默認(rèn)情況下,DaemonSet 會在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 副本,如果需要更新 Pod 版本,則會逐個(gè)節(jié)點(diǎn)進(jìn)行更新??梢允褂?RollingUpdate 策略實(shí)現(xiàn)平滑的更新過程,也可以使用 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 對象。
  2. DaemonSet 控制器創(chuàng)建 Pod:當(dāng) DaemonSet 被創(chuàng)建時(shí),DaemonSet 控制器會根據(jù) Pod 模板創(chuàng)建 Pod 副本,并在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè) Pod 副本。
  3. 新節(jié)點(diǎn)加入集群:當(dāng)新的節(jié)點(diǎn)加入集群時(shí),DaemonSet 控制器會自動在新節(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 控制器會自動刪除該節(jié)點(diǎn)上的 Pod 副本,以確保每個(gè)節(jié)點(diǎn)上都有一個(gè) Pod 副本。
  5. 更新 DaemonSet:當(dāng)需要更新 DaemonSet 時(shí),可以使用 kubectl apply 或 kubectl edit 命令修改 DaemonSet 對象的配置。這會導(dǎo)致 DaemonSet 控制器創(chuàng)建新的 Pod 副本,并逐步替換舊的 Pod 副本,以確保每個(gè)節(jié)點(diǎn)上都有一個(gè)新的 Pod 副本。
  6. 刪除 DaemonSet:當(dāng)不再需要 DaemonSet 時(shí),可以使用 kubectl delete 命令刪除 DaemonSet 對象。此時(shí),DaemonSet 控制器會刪除所有的 Pod 副本。

3、DaemonSet 的選擇器

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

以下是一個(gè)示例 DaemonSet YAML 文件,其中使用標(biāo)簽選擇器來確定在哪些節(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 來指定只在磁盤類型為 ssd 的節(jié)點(diǎn)上運(yùn)行該 DaemonSet 的 Pod 副本。

4、DaemonSet 的更新策略

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

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

更新策略可以在 DaemonSet 對象的 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 會在每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)名為 nginx 的容器。

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

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

五、DaemonSet 的常見問題及解決方案

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

(1)問題描述

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

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

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

(2)解決方案

圖片

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

kubectl get nodes

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

kubectl uncordon <node-name>

2、更新失敗

(1)問題描述

當(dāng)您更新 DaemonSet 時(shí),您可能會遇到以下錯(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è)問題,您需要檢查節(jié)點(diǎn)和 Pod 的狀態(tà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)。您可以使用以下命令來重新啟動節(jié)點(diǎn)或 Pod:

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

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

(1)問題描述

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

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

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

(2)解決方案

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

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

如果您發(fā)現(xiàn)網(wǎng)絡(luò)配置不正確,您需要更新它。您可以使用以下命令來更新網(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)可以通過以下幾種方式實(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ì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)。通過 Prometheus 收集集群中的指標(biāo),使用 Grafana 可視化這些指標(biāo)??梢暬闹笜?biāo)包括 DaemonSet 的 Pod 數(shù)量、節(jié)點(diǎn)上的 CPU 使用情況和內(nèi)存使用情況等。

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

在使用 DaemonSet 過程中,可能會遇到各種問題。以下是一些常見的問題及其解決方案。

(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 的資源請求。
  • 節(jié)點(diǎn)標(biāo)簽不匹配:如果 DaemonSet 指定了節(jié)點(diǎn)選擇器,但節(jié)點(diǎn)沒有匹配的標(biāo)簽,則 Pod 將處于 Pending 狀態(tài)。解決方法是為節(jié)點(diǎn)添加匹配的標(biāo)簽。
  • Pod 調(diào)度失?。喝绻麤]有足夠的節(jié)點(diǎn)滿足 Pod 的調(diào)度要求,則 Pod 將處于 Pending 狀態(tài)。解決方法是添加更多的節(jié)點(diǎn)或調(diào)整 Pod 的調(diào)度要求。

(2)Pod 啟動失敗

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

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

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

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

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

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

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

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

本文轉(zhuǎn)載自微信公眾號「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系哪吒編程公眾號。

責(zé)任編輯:姜華 來源: 哪吒編程
相關(guān)推薦

2024-06-12 13:21:06

2022-04-22 13:32:01

K8s容器引擎架構(gòu)

2019-12-12 14:38:33

數(shù)據(jù)分析菜鳥工具

2024-05-10 08:00:48

K8soperatorGitHub

2023-11-06 07:16:22

WasmK8s模塊

2023-09-06 08:12:04

k8s云原生

2020-11-02 13:44:56

CentOSK8SLinux

2020-05-12 10:20:39

K8s kubernetes中間件

2022-09-05 08:26:29

Kubernetes標(biāo)簽

2023-08-03 08:36:30

Service服務(wù)架構(gòu)

2023-08-04 08:19:02

2023-05-25 21:38:30

2025-03-27 08:00:23

2022-12-07 17:33:50

K8Skubernetes

2021-04-12 20:42:50

K8S端口內(nèi)存

2021-12-03 06:29:56

K8sDubboSpring

2022-12-06 07:30:12

K8s云原生生態(tài)系統(tǒng)

2024-01-26 14:35:03

鑒權(quán)K8sNode

2023-03-05 21:50:46

K8s集群容量

2023-09-03 23:58:23

k8s集群容量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號