Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例。
Pod可以包含了一个或多个容器,还包括了存储、网络等各个容器共享的资源。Pod支持多种容器环境,Docker则是最流行的容器环境。
pod基本操作 pod相关命令
创建pod
1 2 kubectl create -f pod模板文件 kubectl apply -f pod模板文件
查看pod
1 2 3 4 kubectl get pod kubectl get pod -o wide kubectl get pod -o pod模板文件 kubectl get pod --show-labels
删除pod
1 2 3 kubectl delete pod pod名称 kubectl delete -f pod模板文件 kubectl delete -f .
创建pod流程
创建单容器Pod
单容器Pod是最常见的部署方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [root@master kubernetes]$ vim /pod/nginx.yaml kind: Pod apiVersion: v1 metadata: name: nginx labels: disk: ssd spec: containers: - name: nginx01 image: registry:80/nginx:v1 ports: - containerPort: 80 [root@master kubernetes]$ kubectl create -f /pod/nginx.yaml [root@master kubernetes]$ kubectl get pod [root@master kubernetes]$ kubectl describe pod nginx [root@master kubernetes]$ kubectl exec -n 命名空间名称 -it pod名称 -c 容器名称 -- command
创建多容器pod
多容器Pod是相对高阶的使用方式,一个Pod内的容器共享IP地址和端口范围,容器之间可以通过 localhost 互相访问。除非应用耦合特别严重,一般不推荐使用这种方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@master kubernetes]$ vim /pod/nginx.yaml kind: Pod apiVersion: v1 metadata: name: nginx labels: disk: ssd spec: containers: - name: alpine01 image: registry:80/alpine:v1 command : ["sleep" ,"9999" ] - name: nginx01 image: registry:80/nginx:v1 ports: - containerPort: 80
pod模板行为
指定namespace
命名空间是实现环境隔离的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 kubectl get ns etcdctl ls /registry/namespaces kubectl describe ns kubectl create ns 命名空间名称 kubectl create -f yaml文件 kubectl delete ns 命名空间名称 namespace: <string>
指定node
指定将该pod调度在某个节点运行
资源限制
1 2 3 4 5 6 7 8 9 reousrces: <object> resources下级可以指定limits对象和requests对象,前者表示最大资源限制,后者表示最少资源需求 resources: limits: cpu: 500m memory: 500M requests: cpu: 100m memory: 100M
指定暴露的端口
1 2 3 4 5 6 7 8 ports: <[]Object> ports下级可以指定五个对象,示例: ports: - containerPort: 80 protocol: TCP name: nginx-01 hostPort: 8888 hostIP: 0.0.0.0
使用主机网络
指定主机名
重启策略
1 2 restartPolicy: <string>
镜像拉取策略
1 2 imagePullPolicy: <string>
可能遇到的问题 问题1:创建pod时报错:Error from server (ServerTimeout): error when creating “busybox.yaml”: No API token found for service account “default”, retry after the token is automatically created and added to the service account
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 这是由于apiserver的service account没有设置API token引起的,解决办法: [root@master kubernetes]$ openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048 [root@master kubernetes]$ vim /etc/kubenetes/apiserver KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key" [root@master kubernetes]$ vim /etc/kubernetes/controller-manager KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key" [root@master kubernetes]$ systemctl restart etcd kube-apiserver kube-controller-manager kube-schedule
问题2:容器状态一直是ContainerCreating
,查看容器详细信息发现有错误:Error syncing pod, skipping: failed to “StartContainer” for “POD” with ImagePullBackOff: “Back-off pulling image "registry.access.redhat.com/rhel7/pod-infrastructure:latest"“
1 2 3 4 5 6 7 8 9 10 11 12 13 14 这是由于创建pod所需的基础镜像拉取失败,需要修改基础镜像的拉取地址 [root@node1 kubernetes]$ vim kubelet KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry:80/pod-infrastructure:latest" [root@node1 kubernetes]$ systemctl restart kubelet |root@aliyun ~|$ docker search pod-infrastructure |root@aliyun ~|$ docker pull tianyebj/pod-infrastructure |root@aliyun ~|$ docker tag tianyebj/pod-infrastructure:latest registry:80/pod-infrastructure |root@aliyun ~|$ docker push registry:80/pod-infrastructure
pod生命周期 1 2 3 4 5 6 7 8 9 10 11 Pending:创建了pod资源并存入etcd中,但尚未完成调度。 ContainerCreating:Pod 的调度完成,被分配到指定 Node 上。处于容器创建的过程中。通常是在拉取镜像的过程中。 Running:Pod 包含的所有容器都已经成功创建,并且成功运行起来。 Succeeded:Pod中的所有容器都已经成功终止并且不会被重启 Failed:所有容器都已经终止,但至少有一个容器终止失败,也就是说容器返回了非0值的退出状态或已经被系统终止。 Unknown:因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。