什么是Pod?

Pod是k8s中的最小调度单元,通过自定义一个pod,在里面运行容器,容器需要指定镜像。就可以运行具体的服务器。同一个pod共享网络和存储。

Pod网络

pod 有具体的IP地址,每一个pod都被分配唯一的地址。pod中的容器共享一个命名空间,pod中的容器可以使用local host相互通信。

Pod存储

创建pod时可以指定存储卷,pod中的所有容器够可以访问共享卷,允许这些容器共享数据。挂载持久化存储卷后,pod重启后还会存在。

自主式Pod

自主式Pod就是直接定义一个Pod资源:

#pod属于k8s核心组v1
apiVersion: v1  
#创建的是一个Pod资源
kind: Pod 
#元数据 
metadata:  
    #pod名字
  name: demo-pod1 
#pod所属的名称空间 
  namespace: default  
  labels:
#pod具有的标签
    app: myapp 
#pod具有的标签 
    env: dev      
spec:
#定义一个容器,容器是对象列表,下面可以有多个name
  containers: 
#容器的名字     
  - name:  tomcat-pod-java  
    ports:
#容器内部的port
    - containerPort: 8080  
#容器使用的镜像
    image: tomcat:8.5-jre8-alpine  
#镜像拉取策略 
    imagePullPolicy: IfNotPresent  
  - name: busybox
    image: busybox:latest
#command是一个列表,定义的时候下面的参数加横线
    command:  
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

创建pod

kubectl apply -f dome.yaml

控制器管理的Pod

常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。

控制器管理的Pod可以确保Pod始终维持在特定的副本数量运行。

如果使用自主Pod部署的pod,当pod删除后kubectl 不能自动恢复。

使用控制器部署的pod删除后会自动创建,副本维持在设定的数量。

创建一个pod的流程

master节点: kubectl -> kube-api -> kubelet -> CRI容器初始化

1. 客户端提交pod创建请求,可以通过调用API server 的Rest API接口。也可以通过kubectl命令行工具。 kubectl apply -f dome.yaml

2. apiserver 接收到创建Pod请求后,把yaml中的属性记录到etcd数据库中。

3. apiserver 触发watch机制准备创建Pod,信息发送给调度器scheduler,调度器使用调度算法选择node调度器将node信息给apiserver,apiserver 将绑定的node信息写入etcd

调度器用一组规则过滤掉不符合要求的主机,比如pod要求的资源等。

scheduler 查看 k8s api

首先判断节点是否为空  pod.spec.Node  == null?

如果是null,代表这个pod是新的,为他调度新的节点。 pod.spec.Node == NodeA

其他依次类推

4. apiserver 又通过watch机制,调用kubelet,指定pod信息,调用docker API 创建并启动Pod内的容器。

5. 创建完成后反馈给kubelet,kubelet又将pod信息给apiserver, apiserver 把pod的状态信息写入 etcd。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐