使用 kubectl 创建 Daemonset?

Create Daemonset using kubectl?

我参加了 CKA 考试,在那里我需要使用 Daemonsets 工作一段时间。由于使用 kubectl 做所有事情比为 k8s 资源创建 yaml 清单要快得多,我想知道是否可以使用 kubectl.

创建 Daemonset 资源

我知道至少目前无法使用常规 kubectl create daemonset 创建它。并且文档中没有对它的描述。但也许有办法以不同的方式做到这一点?

我现在能做的最好的事情就是像 kubectl create deployment 一样先创建 Deployment 并编辑它的输出清单。这里有什么选择吗?

没有使用 kubectl 创建 DaemonSet 的选项。但是,您仍然可以为 DaemonSet 准备一个包含基本配置的 Yaml 文件,例如daemon-set-basic.yaml,并使用 kubectl create -f daemon-set-basic.yaml

创建它

您可以使用 kubectl edit daemonset <name-of-the-daemon-set> 编辑新的 DaemonSet。或者修改 Yaml 文件并通过 kubectl apply -f daemon-set-basic.yaml 应用更改。注意,如果要更新配置修改文件并使用 apply 命令,最好在创建 DaemonSet 时使用 apply 而不是 create

这是一个简单的 DaemonSet 示例:

kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: k8s.gcr.io/fluentd-elasticsearch:1.20

CKA 允许访问 K8S documentation. So, it should be possible to get a sample YAML for different resources from there. Here 是来自 K8S 文档的 Daemonset。

另外,不确定认证环境是否可以访问 kube-system 命名空间中的资源。如果是,则使用以下命令获取 Daemonset 的示例 yaml。

kubectl get daemonsets kube-flannel-ds-amd64 -o yaml -n=kube-system > daemonset.yaml

这是不可能的。至少对于 Kubernetes 1.12。唯一的选择是获取样本 Daemonset yaml 文件并从那里开始。

最快的技巧是使用

创建部署文件
kubectl create deploy nginx --image=nginx --dry-run -o yaml > nginx-ds.yaml

现在在 nginx-ds.yaml 中将行 kind: Deployment 替换为 kind: DaemonSet 并删除行 replicas: 1

但是,考虑到 "apps/v1" 是集群中用于 DaemonSet 的 api

,以下命令将给出一个干净的 daemonset 清单
kubectl create deploy nginx --image=nginx --dry-run -o yaml | \
    sed '/null\|{}\|replicas/d;/status/,$d;s/Deployment/DaemonSet/g' > nginx-ds.yaml

你有你的 nginx DaemonSet。

您可以利用 Kubernetes 架构从现有集群中获取 DaemonSet 的定义。查看 kube-proxy,它是在集群中的每个节点上运行的网络组件。 kube-proxy 部署为 DaemonSet,因此您可以使用以下命令提取其定义。

$ kubectl get ds kube-proxy -n kube-system -o yaml > kube-proxy.ds.yaml

警告! 通过从 kube-proxy 中提取 DaemonSet 的定义,请注意:

  1. 你将不得不柔顺地清理!
  2. 您必须将 apiVersion 从 extensions/v1beta1 更改为 apps/v1

使用命令部署创建和修改它,可以非常快速地创建daemonset。 下面是创建 daemonset

的一行命令
kubectl create deployment elasticsearch --namespace=kube-system  --image=k8s.gcr.io/fluentd-elasticsearch:1.20 --dry-run -o yaml | grep -v "creationTimestamp\|status" | awk '{gsub(/Deployment/, "DaemonSet"); print }'

我通过以下命令使用它:

  1. 从 Kubernetes 命令命令创建 Replicaset 或部署

kubectl 创建部署 --image= --dry-run -o yaml > file.txt

  1. 修改种类并替换DaemonSet,移除replicas和strategy字段放入其中。

  2. kubectl apply -f file.txt

最快的创建方式

kubectl create deploy nginx --image=nginx --dry-运行 -o yaml > nginx-ds.yaml

现在将 kind: Deployment 行替换为 kind: DaemonSet in nginx-ds.yaml 并删除行 replicas: 1 , strategy {} 状态 {} 也是如此。 否则它会显示某些必填字段的错误,例如

error: error validating "nginx-ds.yaml": error validating data: [ValidationError(DaemonSet.spec): unknown field "strategy" in io.k8s.api.apps.v1.DaemonSetSpec, ValidationError(DaemonSet.status): missing required field "currentNumberScheduled" in io.k8s.api.apps.v1.DaemonSetStatus,ValidationError(DaemonSet.status): missing required field "numberMisscheduled" in io.k8s.api.apps.v1.DaemonSetStatus, ValidationError(DaemonSet.status): missing required field "desiredNumberScheduled" in io.k8s.api.apps.v1.DaemonSetStatus, ValidationError(DaemonSet.status): missing required field "numberReady" in io.k8s.api.apps.v1.DaemonSetStatus]; if you choose to ignore these errors, turn validation off with --validate=false

在 CKA 考试期间,您可以访问 Kubernetes Documentation for DaemonSets。您可以使用 link 并获取 DaemonSet yaml 文件的示例。但是,您可以使用您提到的方式,将部署规范更改为 DaemonSet 规范。您需要将 kind 更改为 Daemonset,移除 strategy、replicas 和 status 字段。这样就可以了。