首页 > 解决方案 > 由于缺少 spec.selector,Kubernetes 守护程序集无法正常工作

问题描述

我目前正在遵循本指南:https : //dzone.com/articles/export-kubernetes-logs-to-azure-log-analytics-with 在我的系统上安装 fluentbit 并将日志发送到 LogAnalytics 工作区。

该指南基于 Kubernetes 的先前版本,我目前正在运行 Kubernetes 1.18,并且大部分代码需要一些小调整才能遵守此版本(名称 secretKeyRef 必须仅包含小写字母,apiVersion 需要是 apps/v1而不是 extensions/v1beta1 等)。

现在我想部署一个基于指南的 DaemonSet,运行指南中的代码会给我以下输出:

错误:验证“fluent-bit-ds.yaml”时出错:验证数据时出错:[ValidationError(DaemonSet.spec.selector):io.k8s.apimachinery.pkg.apis.meta.v1 中的未知字段“k8s-app”。 LabelSelector, ValidationError(DaemonSet.spec.template.spec): io.k8s.api.core.v1.PodSpec 中的未知字段“selector”];如果您选择忽略这些错误,请使用 --validate=false 关闭验证

我尝试自己添加 k8s-app 并尝试添加 spec.selector 但没有奏效。

apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: fluent-bit
  namespace: logging
  labels: 
    k8s-app: fluent-bit-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: fluent-bit-logging
  template:
    metadata:
      labels:
        k8s-app: fluent-bit-logging
        version: v1
        kubernetes.io/cluster-service: "true"
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "2020"
        prometheus.io/path: /api/v1/metrics/prometheus
    spec:
      selector:
        matchLabels:
          name: fluent-bit-logging
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:1.5.0
        imagePullPolicy: Always
        ports:
          - containerPort: 2020
        env:
        - name: FLUENT_AZURE_WORKSPACE_ID
          valueFrom:
            secretKeyRef:
              name: log-analytics
              key: WorkSpaceID 
        - name: FLUENT_AZURE_WORKSPACE_KEY
          valueFrom:
            secretKeyRef:
              name: log-analytics 
              key: WorkSpaceKey
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true 
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      terminationGracePeriodSeconds: 10
      volumes:
      - name: varlog
        hostPath: 
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config
      serviceAccountName: fluent-bit
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - operator: "Exists"
        effect: "NoExecute"
      - operator: "Exists"
        effect: "NoSchedule"

谁能发现我错过了什么?我在 Kubernetes 中还不够,所以这可能是我忽略的一个简单的解决方案。

提前致谢!

标签: kubernetes

解决方案


在 DaemonSet 中,您必须指定与 ( spec.selector) 的标签匹配的pod 选择器 ( .spec.template.metadata.labels)。参考

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
spec:
  selector:  # <-------- this one
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels: # <------ matches this one
        name: fluentd-elasticsearch

修复:

  • spec.template.spec.selector不是一个有效的文件,删除它。
  • spec.selector由两个字段matchLabels和组成matchExpressions
apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: fluent-bit
  namespace: logging
  labels: 
    k8s-app: fluent-bit-logging
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels: # <------- added 
      k8s-app: fluent-bit-logging
  template:
    metadata:
      labels:
        k8s-app: fluent-bit-logging
        version: v1
        kubernetes.io/cluster-service: "true"
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "2020"
        prometheus.io/path: /api/v1/metrics/prometheus
    spec:
      # selector: <--- removed
       # matchLabels:
        #  name: fluent-bit-logging
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:1.5.0
        imagePullPolicy: Always
        ports:
          - containerPort: 2020
        env:
        - name: FLUENT_AZURE_WORKSPACE_ID
          valueFrom:
            secretKeyRef:
              name: log-analytics
              key: WorkSpaceID 
        - name: FLUENT_AZURE_WORKSPACE_KEY
          valueFrom:
            secretKeyRef:
              name: log-analytics 
              key: WorkSpaceKey
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true 
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      terminationGracePeriodSeconds: 10
      volumes:
      - name: varlog
        hostPath: 
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config
      serviceAccountName: fluent-bit
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - operator: "Exists"
        effect: "NoExecute"
      - operator: "Exists"
        effect: "NoSchedule"

推荐阅读