pod是kubernetes的基本操作单元,也是应用运行的载体,整个kubernetes系统都是围绕pod展开的,比如如何部署运行pod、如何保证pod的、如何访问pod等,另外pod是一个或多个机关容器的集合,这可以说是一大创新点,提供了一种容器组合的模型。
pod和容器共享一个网络地址,先来先得端口占用。
pod和nginx为什么不用单独的地址,这是因为k8s有很多功能比如自愈、自动负载均衡,单独一个容器肯定无法实现这种功能,然后pod资源就有这个功能,因此用来和容器共享网络的方式来实现k8s的高级功能
一个pod可以与4个容器共享网络
每当运行一个pod,都会有两个容器产生,一个是pod容器一个是自己服务的容器
1)准备pod的yml文件
[root@k8s-master k8s]# vim k8s_pod.yml apiVersion: v1 //定义api的版本 kind: Pod //资源类型,这里是pod metadata: //元数据,也就是属性,给pod的属性 name: nginx //pod的名称是nginx labels: //描述 app: web //键值表示时什么类型的 spec: //详细属性 containers: //容器 - name: nginx //容器的名称 image: 192.168.81.240/k8s/nginx:1.15 //容器的镜像地址,这里从harbor下载 ports: //端口 - containerPort: 80 //映射成本机80端口2)创建一个pod资源
创建一个pod [root@k8s-master k8s]# kubectl create -f k8s_pod.yml pod "nginx" created 查看pod [root@k8s-master k8s]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx 0/1 ContainerCreating 0 15s containercreating状态表示正在创建容器 查看pod的详细启动过程 [root@k8s-master k8s]# kubectl describe pod nginx3)删除一个pod
[root@k8s-master k8s]# kubectl delete pod nginx pod "nginx" deleted 在创建一个会发现这次调度到了node1上,如果配置一样每个节点都会轮着来创建容器4)查看容器的ip地址
[root@k8s-master k8s]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx 1/1 Running 0 1h 172.16.46.2 192.168.81.2205)报错排查
42s 1s 3 {kubelet 192.168.81.230} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 这个报错是指在redhat官网pull镜像的时候pull不下来导致 可以将pod这个容器放到harbor中再使用私有仓库的地址去下载 配置 1)修改kubelet配置文件 KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.81.240/k8s/pod-infrastructure:latest" 2)重启kubelet [root@k8s-node2 ~]# systemctl restart kubelet 3)再执行kubectl describe pod nginx来查看pod的启动过程 会发现pod已经起来在docker中,容器是最小的处理单元,增删改查的对象是容器,容器是一种虚拟化技术,容器之间是隔离的,隔离是基于Linux namespace实现的,而在kubernetes中,pod包含一个或多个相关的容器,pod可以认为是容器的一种延伸扩展,一个pod是一个隔离体,而pod内部包含的一组容器又是共享的(包括pid、network、ipc、uts),除此之外,pod中的容器可以访问共同的数据卷来实现文件系统的共享。
一个pod单元最多支持4个容器的共享,也就是说在yml中最多一组只能写4个容器,容器启动后就是一个pod容器4个业务容器
每当运行一个容器,k8s都会启动一个pod,pod和容器共享网络、进程,从而实现k8s的高级功能
pod资源至少由两个容器组成:pod资源容器和业务容器
证实运行一个容器就会启动一个pod
[root@k8s-master k8s]# vim k8s_pod.yml apiVersion: v1 kind: Pod metadata: name: nginx1 //将pod的名称进行更换,创建多个pod labels: app: web spec: containers: - name: nginx image: 192.168.81.240/k8s/nginx:1.15 ports: - containerPort: 80 [root@k8s-master k8s]# kubectl create -f k8s_pod.yml [root@k8s-master k8s]# kubectl describe pod nginx1 [root@k8s-master k8s]# kubectl create -f k8s_pod.yml [root@k8s-master k8s]# kubectl describe pod nginx2 [root@k8s-master k8s]# kubectl create -f k8s_pod.yml [root@k8s-master k8s]# kubectl describe pod nginx3 去node1上验证 [root@k8s-node1 ~]# docker ps -a | grep 'pod'