《Kubernetes设计与实现》
  • Introduction
  • 内容简介
  • 前言
  • [第二章:Kubernetes基础]
    • 2.3 Kubernetes API
  • [第三章:工作负载管理]
    • [3.1 Pod]
      • 3.1.1 Pod概述
      • 3.1.1 Pod初体验
    • [3.2 ReplicationController]
      • 3.2.1 ReplicationController概述
      • 3.2.2 ReplicationController初体验
    • [3.3 ReplicaSet]
      • 3.3.1 ReplicaSet概述
      • 3.3.2 ReplicaSet初体验
    • [3.4 Deployment]
      • 3.4.1 Deployment概述
      • 3.4.2 Deployment初体验
    • [3.5 DaemonSet]
      • 3.5.1 DaemonSet概述
      • 3.5.2 DaemonSet初体验
  • [第四章:服务]
    • [4.1 Service]
      • 4.1.1 Service概述
      • 4.1.1 Service上手体验
  • [第六章:配置管理]
    • [6.1 Secret--机密信息管理]
      • 6.1.1 Secret概述
  • [第七章:集群认证]
    • [7.1 证书]
      • 7.1.1 证书基础
      • 7.1.2 证书签发流程
  • [第九章:准入控制器]
    • [9.1 准入控制器概述]
      • 9.1.1 概述
      • [9.1.2 内置默认启动的插件]
        • 9.1.2.1 NamespaceLifecycle
        • 9.1.2.15 MutatingAdmissionWebhook
  • [第十章:ResourceQuota]
    • 10.1 ResourceQuota概述
  • [第十六章:API设计约定]
    • 16.1 字段可选性设计约定
    • 16.2 condition设计约定
    • 16.3 event设计约定
  • [第十九章:Kubernetes生态]
    • [19.1 Kind]
      • [19.1.1 Kind概述]
      • 19.1.2 映射端口到主机
      • 19.1.3 配置端口转发
由 GitBook 提供支持
在本页
  • 环境准备
  • 创建
  • 查看
  • 更新
  • 删除

这有帮助吗?

  1. [第三章:工作负载管理]
  2. [3.5 DaemonSet]

3.5.2 DaemonSet初体验

本节,我们通过几个简单的例子来快速体验DaemonSet控制器。

环境准备

我们使用Kind工具来创建一个包含三个节点的集群,使用的配置如下所示:

[root@ecs-d8b6 book]# cat config_kind.yaml 
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

然后,创建一 个v1.18.0版本的Kubernetes集群:

[root@ecs-d8b6 book]# kind create cluster --config config_kind.yaml --image=kindest/node:v1.18.0
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.18.0) 🖼 
 ✓ Preparing nodes 📦 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

集群创建完成后,检查各节点是否已正常工作:

[root@ecs-d8b6 book]# kubectl get nodes
NAME                 STATUS   ROLES    AGE     VERSION
kind-control-plane   Ready    master   3m6s    v1.18.0
kind-worker          Ready    <none>   2m30s   v1.18.0
kind-worker2         Ready    <none>   2m31s   v1.18.0
kind-worker3         Ready    <none>   2m30s   v1.18.0

可以看到所有节点都已处于Ready状态,接下来我们就创建一个DaemonSet对象,它可以保证在每个工作节点上创建一个Pod副本。

创建

首先我们先将以下配置保存到名为daemonset.yaml的文件中。

[root@ecs-d8b6 manifests]# cat daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.0

该份配置将创建一个DaemonSet对象,然后DaemonSet控制器会根据该对象信息分别在每个节点上创建一个Pod副本。

接下来使用kubectl create命令将该配置提次给kube-apiserver,如下所示:

[root@ecs-d8b6 manifests]# kubectl create -f daemonset.yaml 
daemonset.apps/nginx-daemonset created

查看

首先查看刚刚创建的DaemonSet对象:

[root@ecs-d8b6 manifests]# kubectl get daemonset 
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-daemonset   3         3         3       3            3           <none>          5m6s

命令行输出中各字段含义如下:

  • NAME: DaemonSet对象名称,同配置中的metadata.name;

  • DESIRED:需求副本个数,由于没有刻意筛选节点,所以副本个数等同于节点个数;

  • CURRENT:当前已创建的副本个数;

  • READY:处于Ready状态的副本个数;

  • UP-TO-DATE:已按最新Pod模版创建的Pod个数;

  • AVAILABLE:可用的副本个数;

  • NODE SELECTOR:节点选择器,本例中我们没有选择,值为空;

  • AGE:创建至今经历的时间。

上面的字段中,除了NODE SELECTOR以外,我们已在前面的章节中介绍过。其实Node Selector并不是DaemonSet对象特有的配置,它是Pod模版中用于为Pod匹配节点的配置,DaemonSet控制器使用该Node Selector来筛选需要创建副本的节点,如果没有指定,则默认选择全部节点。

接着,查看DaemonSet控制器所创建的Pod副本信息:

[root@ecs-d8b6 manifests]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE           NOMINATED NODE   READINESS GATES
nginx-daemonset-78dbc   1/1     Running   0          5m13s   10.244.3.2   kind-worker3   <none>           <none>
nginx-daemonset-gmpdg   1/1     Running   0          5m13s   10.244.1.2   kind-worker2   <none>           <none>
nginx-daemonset-l6wn4   1/1     Running   0          5m13s   10.244.2.2   kind-worker    <none>           <none>

可以看到,每个节点上均创建了一个副本,符合预期。

更新

接下来我们试图调整Pod部署策略,我们只希望Pod运行在名为kind-worker的节点上,这样我们只需要配置DaemonSet对象的spec.template.spec.nodeSelector来选择节点即可。

在kind-worker的节点中存在一个标识节点的label:

kubernetes.io/hostname: kind-worker

所以DaemonSet对象的spec.template.spec.nodeSelector配置如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  ...
spec:
  ...
  template:
    ...
    spec:
      ...
      nodeSelector:
        kubernetes.io/hostname: kind-worker

使用kubectl edit命令修改配置,然后再次观察DaemonSet对象和Pod副本:

[root@ecs-d8b6 manifests]# kubectl get daemonsets
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                        AGE
nginx-daemonset   1         1         1       1            1           kubernetes.io/hostname=kind-worker   37m
[root@ecs-d8b6 manifests]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
nginx-daemonset-66gk2   1/1     Running   0          10s   10.244.2.3   kind-worker   <none>           <none>

可以发现DaemonSet状态中,NODE SELECTOR正确地体现了我们的修改,而且需求的Pod副本数也变成了1个,符合预期。 原来运行的3个Pod副本减少到1个,而且只在我们选定的节点上运行。

删除

像其他Pod控制器一样,当删除DaemonSet对象时,其所管理的Pod默认也会被删除,操作如下所示:

[root@ecs-d8b6 ~]# kubectl delete daemonsets nginx-daemonset 
daemonset.apps "nginx-daemonset" deleted
[root@ecs-d8b6 ~]# kubectl get pods 
No resources found in default namespace.
上一页3.5.1 DaemonSet概述下一页[第四章:服务]

最后更新于4年前

这有帮助吗?