目录

介绍Pod

什么是Pod

Pod的特点

Pod的用途

Pod网络

Pod存储

Pod工作方式

创建Pod

命令行创建Pod

资源清单

镜像拉取策略

Pod重启策略

部署资源

删除资源


介绍Pod

什么是Pod

        Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。

        Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。

        Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。

Pod的特点

容器共享网络命名空间: Pod中的容器共享相同的IP地址和端口范围,可以通过localhost相互通信。

存储卷共享: Pod中的容器可以访问相同的存储卷,方便数据共享和通信。

逻辑单元: Pod提供了一个逻辑上独立、紧密耦合的单元,容器在同一个Pod中可以方便地进行通信和数据共享。

生命周期: Pod有自己的生命周期,当Pod中的所有容器都终止时,Pod才会终止。

Pod的用途

应用组合: 将相互关联的应用容器组合到一个Pod中,以便它们可以直接通信。

共享存储: 多个容器可以访问相同的存储卷,实现数据共享。

单元部署: Pod作为一个单元进行部署,确保相关容器共同运行和调度。

微服务: 将微服务架构中的一组相关服务打包在一个Pod中,以简化部署和管理。

Pod网络

        Pod是有IP地址的,每个pod都被分配唯一的IP地址(IP地址是靠网络插件calico、flannel、weave等分配的),POD中的容器共享网络名称空间,包括IP地址和网络端口。 Pod内部的容器可以使用localhost相互通信。 Pod中的容器也可以通过网络插件calico与其他节点的Pod通信。

Pod存储

        创建Pod的时候可以指定挂载的存储卷。 POD中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod只要挂载持久化数据卷,Pod重启之后数据还是会存在的。

Pod工作方式

        Pod的工作方式分为两种,一种是自主式Pod,一种是控制器管理的Pod,所谓的自主式Pod就是直接定义一个Pod资源,这种Pod一旦异常就退出了,使用控制器管理的Pod可以确保Pod始终维持在指定的副本数量。常见的管理Pod的控制器有:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。

创建Pod

命令行创建Pod

# 使用nginx镜像,创建一个叫nginx-test的pod,使用--port指定端口号为80
[root@master ~]# kubectl run nginx-test --image=nginx --port=80
pod/nginx created
[root@master ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          2m8s
# 使用-o wide可以查看到更详细的信息,比如ip地址,pod所在的节点
[root@master ~]# kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          2m40s   10.244.2.2   node2   <none>           <none>
# 使用--show-labels选项可以查看pod的标签
[root@master ~]# kubectl get pod --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          4m38s   run=nginx

# 使用-l选项后面跟标签,可以查询带有指定标签的pod
[root@master ~]# kubectl get pod -l run=nginx
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          6m26s
# 查看日志
[root@master ~]# kubectl logs nginx-test
# 进入容器
[root@master ~]# kubectl exec -it nginx-test -- bash
# 删除一个叫nginx的pod
[root@master ~]# kubectl delete pod nginx
pod "nginx" deleted
# 使用-n选项可以查询指定命名空间的pod
[root@master ~]# kubectl get pod -n default
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          7m35s

# 使--all-namespaces可以查询所有命名空间的pod
# --all-namespaces可以简写为-A
[root@master ~]# kubectl get pod --all-namespaces
NAMESPACE      NAME                             READY   STATUS    RESTARTS      AGE
default        nginx                            1/1     Running   0             8m25s
kube-flannel   kube-flannel-ds-654tl            1/1     Running   1 (40m ago)   41m
kube-flannel   kube-flannel-ds-vrcgm            1/1     Running   1 (40m ago)   41m
kube-flannel   kube-flannel-ds-zbw9t            1/1     Running   1 (40m ago)   41m
kube-system    coredns-6d8c4cb4d-9f5nf          1/1     Running   1 (40m ago)   41m
kube-system    coredns-6d8c4cb4d-l565c          1/1     Running   1 (40m ago)   41m
kube-system    etcd-master                      1/1     Running   1 (40m ago)   41m
kube-system    kube-apiserver-master            1/1     Running   1 (40m ago)   41m
kube-system    kube-controller-manager-master   1/1     Running   1 (40m ago)   41m
kube-system    kube-proxy-2sxmj                 1/1     Running   1 (40m ago)   41m
kube-system    kube-proxy-2xhxd                 1/1     Running   1 (40m ago)   41m
kube-system    kube-proxy-hmg6s                 1/1     Running   1 (40m ago)   41m
kube-system    kube-scheduler-master            1/1     Running   1 (40m ago)   41m

资源清单

        在Kubernetes中大多数都是使用资源清单来进行创建,通常情况下是yaml格式的。以下是一个创建Pod的yaml示例

[root@master ~]# cat nginx_pod.yaml 
# 定义 Kubernetes API 版本
apiVersion: v1

# 指定 Kubernetes 资源类型(在本例中为 Pod)
kind: Pod

# Pod 的元数据,包括名称、命名空间和标签
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx  # 标识应用为 nginx 的标签

# Pod 的规格,包括容器及其配置
spec:
  restartPolicy: Never # 设置重启策略
  # Pod 中的容器列表
  containers:
  - name: nginx  # 容器名称
    ports:
    - containerPort: 80  # 从容器中暴露的端口
    image: nginx:1.20  # 用于容器的 Docker 镜像
    imagePullPolicy: IfNotPresent  # 容器镜像拉取策略

镜像拉取策略

        Kubernetes 中的容器镜像拉取策略(imagePullPolicy)有以下三种:

Always(总是):

表示 Kubernetes 将始终尝试从指定的镜像仓库拉取容器镜像。即使节点上已经存在相同版本的镜像,也会尝试拉取最新的版本。

IfNotPresent(如果不存在则拉取):

这是默认的策略。它表示如果节点上不存在指定的容器镜像版本,那么就拉取该镜像。如果本地已经存在,则不再拉取。

Never(从不拉取):

表示 Kubernetes 不会尝试拉取指定的容器镜像。它要求节点上必须存在所需版本的镜像,否则启动容器会失败。

        如果省略imagePullPolicy字段,镜像的名称没有带标签,或是标签是:latest则策略为Always,否则为IfNotPresent。

Pod重启策略

        Pod重启策略有以下3种,Pod 的重启策略定义了在容器退出时 Kubernetes 应该采取的操作。这对于确保应用程序的可用性和稳定性非常重要,使用restartPolicy字段进行配置。

Always:在任何情况下,只要容器不在运行状态,就自动重启容器;(默认)

OnFailure: 只在容器 异常时才自动重启容器;

Never: 从来不重启容器。

部署资源

[root@master ~]# kubectl apply -f nginx_pod.yaml 
pod/nginx created

[root@master ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          31s

删除资源

[root@master ~]# kubectl delete -f nginx_pod.yaml 
pod "nginx" deleted

[root@master ~]# kubectl get pod
No resources found in default namespace.

Logo

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

更多推荐