目录
一,资源限制
二,pod的两种使用方式
三,pod资源共享
四,底层容器pause
1,pause共享资源
1.1 网络
1.2 存储
1.3 小节
2,pause主要功能
3,pod与pause结构的设计初衷
五,pod容器的分类
1,基础容器
2,初始化容器(init container)
3,应用程序(main container)
六,操作实例
1,编写myapp.yaml
2,创建myqpp.yaml配置资源
3,查看pod创建的过程
4,查看pod日志
5,编写myservice.yaml
6、创建 myservice.yaml 配置资源
7,编写mydb.yaml
8,创建mydb.yaml配置资源
9,查看myapp-pod的创建全过程
10,小节
七,镜像拉取策略
1,官方示例
2,不指定版本,查看默认拉取策略
2.1 不指定版本号创建pod
2.2 查看默认拉取策略
2.3 查看创建过程
pod是kubernetes 中最小的资源管理组件, pod也是最小化运行容器化应用的资源对象,一个pod代表着集群中运行的一个进程,kubernetes 中其他大多数组件都是围绕着pod来进行支持和扩展pod功能的,例如用于管理pod运行的statefulset和deployment等控制器对象,用于暴露pod应用的service和ingress 对象,为pod提供存储的persistentVolume 存储资源对象等。
一个pod中运行一个容器:没有pod中一个容器的模式是最常见的用法,在这种使用方式中,你可以把pod现象成是单个容器的封装,kubernetes 管理的是pod而不是直接管理容器。
在一个pod中同时运行多个容器,一个pod中也可以同时封装几个需要紧密耦合相互协作的容器,他们之间共享资源,这些在同一个pod中的容器可以互相协作成为一个service单位,比如一个容器共享文件,另一个sidecar 容器来更新这些文件,pod将这些容器从存储资源作为一个实体来管理。
**一个 Pod 下的容器必须运行于同一节点上。**现代容器技术建议一个容器只运行一个进程,该进程在容器中 PID 命令空间中的进程号为 1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。
若想在容器内运行多个进程,需要有一个类似 Linux 操作系统 init 进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,k8s 中的 Pod 资源抽象正是解决此类问题,Pod 对象是一组容器的集合,这些容器共享 Network、UTS 及 IPC 命令空间,因此具有相同的域名、主机名和网络接口,并可通过 IPC 直接通信。
namespace | 功能说明 |
mnt | 提供磁盘挂载点和文件系统的隔离功能 |
ipc | 提供进程间通信的隔离能力 |
net | 提供网络隔离能力 |
uts | 提供主机名隔离能力 |
pid | 提供进程隔离能力 |
user | 提供用户隔离能力 |
Pod 资源中针对各容器提供网络命令空间等共享机制的是底层基础容器 pause,基础容器(也可称为父容器)pause 就是为了管理 Pod 容器间的共享操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes 中,用 pause 容器来作为一个 Pod 中所有容器的父容器。这个 pause 容器有两个核心的功能,一是它提供整个 Pod 的 Linux 命名空间的基础。二来启用 PID 命名空间,它在每个 Pod 中都作为 PID 为 1 进程(init 进程),并回收僵尸进程
每个pod都会被分配一个唯一的ip地址,pod中所有容器共享网络空间,包括ip地址和端口,pod内部的容器可以使用localhost来进行通讯,pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)
可以pod指定多个共享的volume 。pod中的所有容器都可以访问共享的volume,volume也可以用来持久化pod中的存储资源,以防容器重启后文件丢失。
每个pod都有一个特殊的的被称为“基础容器”的pause容器。pause容器对应的镜像属于kubernetes平台的一部分,除了pause容器,每个pod还包含一个或者多个紧密相关的用户应用容器。
kubernetes中的pause容器的主要为每个容器提以下功能。
Init 容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以 Init 容器能够提供了一种简单的阻塞或延迟应用容器的启动的方法。Init 容器与普通的容器非常像,除了以下两点:
应用容器会在 init 容器完成并退出后并行启动。
[root@master ~]# cat myapp.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh','-c','echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh','-c','until nslookup myservice;do echo waiting for myservice; sleep2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
这个例子是定义了一个具有2个init容器的简单pod,第一个等待myservice启动,第二个等待mydc启动,一旦这两个init容器都启动成功完成,pod将启动spec中的应用容器
kubectl apply -f myapp.yaml
kubectl get pod
kubecrl describe po myapp-pod
发现开启 init-myservice容器后,创建步骤停滞,查看init-myservice日志进一步查明原因。
kubectl logs myapp-pod -c init-myservice
[root@master ~]# vim myservice.yaml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 1111
kubectl apply -f myservice.yaml
[root@master ~]# vim mydb.yaml
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 2222
kubectl apply -f mydb.yaml
kubectl get pod,svc
kubectl describe pod myapp-pod
创建过程中第一次停滞,是init-servioce容器启动后,未能发现myservice域名,无法得到解析,因此陷入循环。
第二次停滞,是init-mydb 容器启动后,未能发现mydb域名,无法得到解析,因此再次陷入循环。
在上述的两个init容器成功并退出后,myapp-pod才开始创建,否则pod无法创建。
pod的核心是运行容器,必须指定容器引擎,比如docker启动容器时需要拉取镜像k8s的镜像拉取策略可以由用户指定:
注意:对于标签为latest的镜像文件,其默认的镜像获取策略即为Always;而对于其他标签的镜像,其默认策略则为IfNotPresent。
创建使用私有镜像的pod来验证
kubectl apply -f - <
输出类似于
如果一切顺利,那么一段时间后你可以执行
kubectl logs private
必须确保集群中所有节点的 .docker/config.json 文件内容相同。 否则 Pod会能在一些节点上正常运行而无法在另一些节点上启动。 例如,如果使用节点自动扩缩,那么每个实例模板都需要包含.docker/config.json,或者挂载一个包含该文件的驱动器。
在 .docker/config.json 中配置了私有仓库密钥后,所有 Pod 都将能读取私有仓库中的镜像。
kubectl run nginx-test1 --image=nginx
kubectl describe pod nginx-test1
由于拉取策略为Always,因此不管本地有没有对应镜像,kubectl都会前往共有仓库下载最新版本应用。