kubernetes - 由于缺少 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 中还不够,所以这可能是我忽略的一个简单的解决方案。
提前致谢!
解决方案
在 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"
推荐阅读
- javascript - useEffect 的回调的 return 语句什么时候执行?
- c# - 有没有办法启动在 Windows 中提供的 EventStore(根本不使用 docker)?
- git - 在 git 中推送部分文件更改
- amazon-web-services - Slurm 使用什么机制在计算节点和主节点之间同步文件?是加密的吗?
- regex - 用于在字符串上搜索 3 个不同字符串中的任何一个的正则表达式
- python - 在 Python 中拦截类属性的动态分配
- javascript - Netlify 构建过程中的 Netlify,toml vs package.json
- python - 基于多对多关系在 Django 查询中进行注释
- python - Python matplotlib 仅在条件匹配时才在绘图下方添加文本
- laravel-8 - 在 api.php Laravel + Jetstream + Inertia.js 中保护 apiResource