Kubernetes权威指南:从Docker到Kubernetes实践全接触(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 静态Pod

静态Pod是由kubelet进行管理的仅存在于特定Node上的Pod。它们不能通过API Server进行管理,无法与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet无法对它们进行健康检查。静态Pod总是由kubelet创建的,并且总在kubelet所在的Node上运行。

创建静态Pod有两种方式:配置文件方式和HTTP方式。

1.配置文件方式

首先,需要设置kubelet的启动参数“--config”,指定kubelet需要监控的配置文件所在的目录,kubelet会定期扫描该目录,并根据该目录下的.yaml或.json文件进行创建操作。

假设配置目录为/etc/kubelet.d/,配置启动参数为--config=/etc/kubelet.d/,然后重启kubelet服务。

在目录/etc/kubelet.d中放入static-web.yaml文件,内容如下:

        apiVersion: v1
        kind: Pod
        metadata:
          name: static-web
          labels:
            name: static-web
        spec:
          containers:
          - name: static-web
            image: nginx
            ports:
            - name: web
              containerPort: 80

等待一会儿,查看本机中已经启动的容器:

        # docker ps
        CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS      PORTS       NAMES
        2292ea231ab1    nginx    "nginx -g 'daemon off"   1 minute ago     1m
    k8s_static-web.68ee0075_static-web-k8s-node-1_default_78c7efddebf191c949cbb7aa22
    a927c8_401b96d0

可以看到一个Nginx容器已经被kubelet成功创建了出来。

到Master上查看Pod列表,可以看到这个static pod:

        # kubectl get pods
        NAME                 READY       STATUS        RESTARTS   AGE
        static-web-node1   1/1         Running       0           5m

由于静态Pod无法通过API Server直接管理,所以在Master上尝试删除这个Pod时,会使其变成Pending状态,且不会被删除。

        # kubectl delete pod static-web-node1
        pod "static-web-node1" deleted

        # kubectl get pods
        NAME                 READY     STATUS        RESTARTS   AGE
        static-web-node1   0/1       Pending       0           1s

删除该Pod的操作只能是到其所在Node上将其定义文件static-web.yaml从/etc/kubelet.d目录下删除。

        # rm /etc/kubelet.d/static-web.yaml
        # docker ps
        // 无容器运行

2.HTTP方式

通过设置kubelet的启动参数“--manifest-url”,kubelet将会定期从该URL地址下载Pod的定义文件,并以.yaml或.json文件的格式进行解析,然后创建Pod。其实现方式与配置文件方式是一致的。