kubectl 是直接操作 APIServer 的,所以就相当于把我们的清单提交给了 APIServer,然后集群获取到清单描述的应用信息后存入到 etcd 数据库中,然后 kube-scheduler 组件发现这个时候有一个 Pod 还没有绑定到节点上,就会对这个 Pod 进行一系列的调度,把它调度到一个最合适的节点上,然后把这个节点和 Pod 绑定到一起(写回到 etcd),然后节点上的 kubelet 组件这个时候 watch 到有一个 Pod 被分配过来了,就去把这个 Pod 的信息拉取下来,然后根据描述通过容器运行时把容器创建出来,最后当然同样把 Pod 状态再写回到 etcd 中去,这样就完成了一整个的创建流程。
第一个容器化应用
创建一个资源清单,nginx-deployment.yaml:
apiVersion: apps/v1 #API版本kind: Deployment #API对象类型metadata:name: nginx-deploylabels:chapter: first-appspec:selector:matchLabels:app: nginxreolicas: 2 #Pod副本数量template: #Pod模板metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- 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部门,也就是事件。
