深入理解Pod
Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据schedul
目录
介绍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.
更多推荐
所有评论(0)