kubectl 是直接操作 APIServer 的,所以就相当于把我们的清单提交给了 APIServer,然后集群获取到清单描述的应用信息后存入到 etcd 数据库中,然后 kube-scheduler 组件发现这个时候有一个 Pod 还没有绑定到节点上,就会对这个 Pod 进行一系列的调度,把它调度到一个最合适的节点上,然后把这个节点和 Pod 绑定到一起(写回到 etcd),然后节点上的 kubelet 组件这个时候 watch 到有一个 Pod 被分配过来了,就去把这个 Pod 的信息拉取下来,然后根据描述通过容器运行时把容器创建出来,最后当然同样把 Pod 状态再写回到 etcd 中去,这样就完成了一整个的创建流程。

第一个容器化应用

创建一个资源清单,nginx-deployment.yaml:

  1. apiVersion: apps/v1 #API版本
  2. kind: Deployment #API对象类型
  3. metadata:
  4. name: nginx-deploy
  5. labels:
  6. chapter: first-app
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: nginx
  11. reolicas: 2 #Pod副本数量
  12. template: #Pod模板
  13. metadata:
  14. labels:
  15. app: nginx
  16. spec:
  17. containers:
  18. - name: nginx
  19. image: nginx:1.7.9
  20. ports:
  21. - containerPort:80

然后使用kubectl来创建这个应用:

$ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deploy created
$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-54f57cf6bf-2fdjz   1/1     Running   0          7s
nginx-deploy-54f57cf6bf-57287   1/1     Running   0          7s

上面定义的是一个Deployment类型的API对象,按照这个API对象的要求填充一些属性,就会创建出对应的资源对象,通过kubectl get来获取:

$ kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           12m

Deployment这个资源对象就是用来定义多副本应用的对象,而且还支持对每个副本进行滚动更新。

而这个Deployment定义的副本Pod具体是什么样的,是通过Pod模板来定义的,就是template下面的定义,容器使用的镜像是nginx:1.7.9(spec.containers[0].image),并且容器监听的端口是80(sepc.containers[0].ports[0].containerPort),另外还为Pod添加一个app: nginx的Label标签,这里需要非常注意的是上面的selector.matchLabels区域就是用来表示我们Deployment来管理哪些Pod的,所以这个地方需要和Pod模板中的Label标签保持一致。

另外每个API对象都有一个Metadata字段,用来表示该对象的元数据的,比如定义的name,namespace等,比如上面的Deployment和Pod模板中都有这个字段,至于Pod模板中没有name这个元信息,是因为Deployment这个控制器会自动在他自己的那么基础上生成Pod名,Deployment下面定义的标签没有实际的作用,只是可以在查询该对象时带上这个标签进行过滤。

$ kubectl get deployment -l chapter=first-app
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           51m
$ kubectl get pods -l app=nginx
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-54f57cf6bf-2fdjz   1/1     Running   0          51m
nginx-deploy-54f57cf6bf-57287   1/1     Running   0          51m

在部署过程中遇到问题,可以使用kubectl describe命令来查询资源对象的详细信息:

$ kubectl describe pod nginx-deploy-54f57cf6bf-2fdjz
Name:         nginx-deploy-54f57cf6bf-2fdjz
Namespace:    default
Priority:     0
Node:         ydzs-node2/10.151.30.23
Start Time:   Sat, 09 Nov 2019 15:20:32 +0800
Labels:       app=nginx
              pod-template-hash=54f57cf6bf
Annotations:  <none>
Status:       Running
IP:           10.244.2.199
IPs:
  IP:           10.244.2.199
Controlled By:  ReplicaSet/nginx-deploy-54f57cf6bf
Containers:
  nginx:
    Container ID:   docker://e40e78eee7a431b6e7277b414967cce936ac750e2a8ba30298302cdd89e54300
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sat, 09 Nov 2019 15:20:35 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-5tsh4 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-5tsh4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-5tsh4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From                 Message
  ----    ------     ----       ----                 -------
  Normal  Scheduled  <unknown>  default-scheduler    Successfully assigned default/nginx-deploy-54f57cf6bf-2fdjz to ydzs-node2
  Normal  Pulled     52m        kubelet, ydzs-node2  Container image "nginx:1.7.9" already present on machine
  Normal  Created    52m        kubelet, ydzs-node2  Created container nginx
  Normal  Started    52m        kubelet, ydzs-node2  Started container nginx

describe可以看到很多这个Pod的详细信息,比如调度到的节点,状态、IP等,一般只要关注events部门,也就是事件。