1. 7 第二步:将容器封装到Pod中
Pod是Kubernetes最小的管理单元,一个Pod可以代表一个运行在集群里的进程。之前是在宿主机上运行不同的进程,现在是运行不同的Pod。前面介绍过Pod是一个逻辑架构的组件,Pod里封装了一个(或者多个)应用容器,存储资源和IP地址。
为什么要造一个Pod出来? 学习Kubernetes遇到的最多的名称可能就是Pod了,其它开源的容器管理平台例如Mesos直接管理和调度的是容器,但是Kubernetes确是Pod,它在容器上面做了一层封装,方便用户将一组紧耦合的容器,放置在一个共享资源的单元中。对于很多没有此类场景的初学者,可以暂时将Pod看做是容器的一个壳,你也完全可以只在Pod中运行一个容器,随着学习的深入再慢慢理解。 Kubernetes运行Pod的两种方式:
- Pod里只运行一个单独容器,是Kubernetes最常见的使用场景;在这种情况下,可以把Pod看做是一个单独容器的连接器,Kubernetes通过Pod去管理容器,作为使用者几乎不用关心容器。
- Pod里运行多个有关系容器。例如如果使用Nginx+Tomcat运行Java应用,可以制作一个镜像里面包含了Nginx+Tomcat,也可以分别制作两个镜像Nginx镜像和Tomcat镜像,如果使用Kubernetes就需要使用Pod,如果将Nginx和Tomcat单独放在两个Pod里面来管理,就会面临很多很多问题。这个时候,就可以把这两个容器放置在一个Pod中。
1.1. Pod管理
在Kubernetes中使用YAML格式来描述一个Pod。
[root@linux-node1 ~]# vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13.12
ports:
- containerPort: 80
Pod的YAML描述内容还有很多,在使用kubeadm部署Kubernetes的时候,就是使用静态Pod的方式运行的相关服务,YAML文件存放在,当然现在很多配置还是看不懂的,带着问题继续学习。
[root@linux-node1 ~]# ls -l /etc/kubernetes/manifests/
total 16
-rw------- 1 root root 2041 Feb 11 20:33 etcd.yaml
-rw------- 1 root root 2700 Feb 11 20:33 kube-apiserver.yaml
-rw------- 1 root root 2345 Feb 11 20:33 kube-controller-manager.yaml
-rw------- 1 root root 1080 Feb 11 20:33 kube-scheduler.yaml
创建Pod
[root@linux-node1 ~]# kubectl create -f nginx-pod.yaml
pod "nginx-pod" created
查看Pod
[root@linux-node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 49s
查看Pod更多信息
[root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-pod 1/1 Running 0 1m 10.2.53.18 192.168.56.13
查看Pod详情
[root@linux-node1 ~]# kubectl describe pod nginx-pod
Name: nginx-pod
Namespace: default
Node: 192.168.56.13/192.168.56.13
Start Time: Sat, 02 Jun 2018 06:42:53 +0800
Labels: app=nginx
Annotations: <none>
Status: Running
IP: 10.2.53.18
查看Pod日志
[root@linux-node1 ~]# kubectl logs pod/nginx-pod
Pod中的镜像拉取策略 当kubelet尝试拉取指定的镜像时,[imagePullPolicy]和镜像的标签会生效。
- imagePullPolicy: IfNotPresent:仅当镜像在本地不存在时镜像才被拉取。
- imagePullPolicy: Always:每次启动 pod 的时候都会拉取镜像。
省略imagePullPolicy,镜像标签为:latest或被省略,Always被应用。 imagePullPolicy被省略,并且镜像的标签被指定且不是:latest,IfNotPresent被应用。 imagePullPolicy: Never:镜像被假设存在于本地。 没有尝试拉取镜像。