代码改变世界

k8s中资源调度的最小单位--pod

2019-09-06 23:03  美丽的名字  阅读(1275)  评论(0)    收藏  举报

在k8s中,pod才是最小的编排单位,而不是容器。pod就相当于是传统意义上的虚拟机,他可以包含网络、存储等资源。也就是说,在定义一个pod的过程中,也就是在定义一个虚拟机以及在这台虚拟机上所要运行的业务。

 

我们先从一个简单的pod定义开始讲起。

定义pod配置文件: nginx_pod_v1.yaml 

apiVersion: v1  
kind: Pod  #定义资源类型,常见资源类型有pod,service等
metadata:
  name: nginx  #定义该pod名称,可以通过kubectl get pod nginx指令查看该pod状态
  labels:
    app: web
spec:
  containers:
    - name: nginx  #为该pod中启动的容器命名
      image: nginx:1.13  #指定该pod中启动的容器所使用的镜像
      ports:
        - containerPort: 80  #定义容器暴露的端口

创建pod:

kubectl create -f nginx_pod_v1.yaml

但是报了一个错误:

Error from server (ServerTimeout): error when creating "nginx_pod_v1.yaml": No API token found for service account "default", retry after the token is automatically created and added to the service account

这是因为api-server服务中启用了一个叫serviceaccount的组件,禁用之后重启api-server即可。

 

 此时可以查看pod的状态:

 

 可以发现该pod一直处于ContainerCreating状态,此时可以使用describe指令查看该pod的具体信息:

kubectl describe pod nginx

 

可以发现在创建pod的过程中拉去镜像registry.access.redhat.com/rhel7/pod-infrastructure:latest失败, 该镜像是在kubelet配置文件中指定的:

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

其中pod-infrastructure该镜像是一个基础镜像,在每一个pod中都必须默认包含的一个镜像且是第一个启动的容器。


 

为了加快速度,我们可以在本地自建镜像仓库:

获取官方注册服务器镜像:docker pull docker.io/registry

创建本地镜像仓库:docker run -d -p 5000:5000 --restart=always --name=registry -v /opt/registry:/var/lib/registry registry

 

将pod-infrastructure镜像push到本地仓库

docker pull docker.io/tianyebj/pod-infrastructure

docker tag docker.io/tianyebj/pod-infrastructure 192.168.56.201:5000/pod-infrastructure:latest

docker push 192.168.56.201:5000/pod-infrastructure:latest


 

再次查看pod状态: