Kubernetes(简称K8s)是一个开源的容器编排平台,广泛用于构建、部署和管理容器化应用程序。在K8s中,Pod是一个核心概念,下面是对Pod的详细解释:
Pod是K8s中最小的可部署单元,也是资源对象模型中由用户创建或部署的最小资源对象模型。它实现了对容器的封装和管理,是一组运行在同一主机(节点)上、共享网络和存储空间的一组容器。Pod内的容器共享同一个网络命名空间和存储卷,可以方便地实现容器间的通信和数据共享。
Pod在K8s中扮演着至关重要的角色。它是K8s调度和管理的最小单位,也是应用程序部署和管理的基本单元。通过Pod,K8s能够实现对容器化应用程序的自动化部署、扩展和操作。Pod提供了共享资源、简化容器间通信和数据共享的机制,有助于提高应用程序的可用性和可扩展性。
综上所述,Pod是K8s中不可或缺的核心组件之一。它封装和管理容器,提供共享资源和简化通信的机制,为应用程序的部署和管理提供了强有力的支持。
[root@k8s-master pod]# kubectl run mynginx --image=nginx -n myns
pod/mynginx created
[root@k8s-master pod]# kubectl create -f tomcat.yaml
pod/tomcat created
[root@k8s-master pod]# kubectl apply -f httpd.yaml
pod/httpd created
[root@k8s-master pod]# kubectl get pods -n myns
NAME READY STATUS RESTARTS AGE
httpd 1/1 Running 0 2m20s
mynginx 1/1 Running 0 4m33s
tomcat 1/1 Running 0 8s
查看所有pod
[root@k8s-master ~]# kubectl get pods -A
查看指定的单个/多个pod
[root@k8s-master ~]# kubectl get pod nginx -n myns
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 9s
[root@k8s-master ~]# kubectl get pod nginx nginx1 -n myns
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 97s
nginx1 1/1 Running 0 15s
查看pod同时查看其他类型资源(需要具体指定资源类型和名称)
[root@k8s-master ~]# kubectl get pod/nginx -n myns node/k8s-node1
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 104s
NAME STATUS ROLES AGE VERSION
node/k8s-node1 Ready 3m6s v1.28.2
列出在某个节点上运行的pod
[root@k8s-master ~]# kubectl get pods --field-selector=spec.nodeName=k8s-node1
-w实时查看pod信息
[root@k8s-master ~]# kubectl get pod -w nginx -n myns
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 4h16m
[root@k8s-master ~]#
进入运行中的pod
[root@k8s-master ~]# kubectl exec -it nginx -n myns -- /bin/bash
root@nginx:/# ls
bin docker-entrypoint.d home lib64 mnt root srv usr
boot docker-entrypoint.sh lib libx32 opt run sys var
dev etc lib32 media proc sbin tmp
#不进入但执行命令
[root@k8s-master ~]# kubectl exec -it nginx -n myns -- ls
bin docker-entrypoint.d home lib64 mnt root srv usr
boot docker-entrypoint.sh lib libx32 opt run sys var
dev etc lib32 media proc sbin tmp
进入pod中的容器
[root@k8s-master ~]# kubectl exec -it nginx -c xxx -n myns -- /bin/bash
#-c后指定容器名称
[root@k8s-master ~]# kubectl explain pod.spec
#可以以此形式来一层一层获取可配置项
apiVersion: v1
#必选项,版本号,如V1
kind: Pod
#必选项,资源类型,pod等
metadata:
#必选项,元数据部分
name: xxx
#Pod名称
namespace: xxx
#Pod所属的命名空间,默认为"default"
labels:
#自定义标签列表
- name: xxx
#自定义标签内容
spec:
#必选项,Pod中容器的详细定义
containers:
#必选项,Pod中容器列表
- name: xxx
#必选项,容器名称
image: xxx
#必选项,容器的镜像名称
imagePullPolicy: [ Always|Never|IfNotPresent ]
#获取镜像的策略,tag为latest默认always,tag为具体版本号,默认IfNotPresent。always表示每次都尝试重新拉取镜像;ifNotPresent表示如果本地有那个镜像就使用本地的,不存在时才拉取;Nerver表示仅使用本地有的镜像,绝不拉取,本地没有时报错
command: [xxx]
#容器的启动命令列表,如不指定则使用打包时使用的启动命令
args: [xxx]
#容器的启动命令给定参数列表
workingDir: xxx
#容器的工作目录
volumeMounts:
#挂载到容器内部的存储卷配置
- name: xxx
#引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: xxx
#存储卷在容器内mount的绝对路径,应少于512字符
readOnly: xxx
#布尔值,是否为只读模式
ports:
#需要暴露的端口库号列表
- name: xxx
#端口的名称
containerPort: xxx
#容器需要监听的端口号
hostPort: xxx
#容器所在主机需要监听的端口号,默认与Container相同
protocol: xxx
#端口协议,支持TCP和UDP,默认TCP
env:
#容器运行前需设置的环境变量列表
- name: xxx
#环境变量名称
value: xxx
#环境变量的值
resources:
#资源限制和请求的设置
limits:
#资源限制的设置
cpu: xxx
#cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: xxx
#内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests:
#资源请求的设置
cpu: xxx
#cpu请求,容器启动的初始可用数量
memory: xxx
#内存请求,容器启动的初始可用数量
lifecycle:
#生命周期钩子
postStart:
#容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop:
#容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe:
#对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
exec:
#对Pod容器内检查方式设置为exec方式
command: [xxx]
#exec方式需要制定的命令或脚本
httpGet:
#对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: xxx
port: xxx
host: xxx
scheme: xxx
HttpHeaders:
- name: xxx
value: xxx
tcpSocket:
#对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0
#容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0
#对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0
#对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure]
#Pod的重启策略
nodeName:
#设置NodeName表示将该Pod调度到指定到名称的node节点上
nodeSelector: xxx
#设置NodeSelector表示将该Pod调度到包含这个label的node上
imagePullSecrets:
#Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: xxx
hostNetwork: false
#是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes:
#在该pod上定义共享存储卷列表
- name: string
#共享存储卷名称 (volumes类型有很多种)
emptyDir: {}
#类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: xxx
#类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: xxx
#Pod所在宿主机的目录,将被用于同期中mount的目录
secret:
#类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
scretname: xxx
items:
- key: xxx
path: xxx
configMap:
#类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: xxx
items:
- key: xxx
path: xxx
对单个容器的封装
apiVersion: v1
kind: Pod
metadata:
name: httpd
labels:
run: httpd
namespace: myns
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
对多个容器封装并绑定为一个Pod
apiVersion: v1
kind: Pod
metadata:
name: two-containers
namespace: myns
labels:
name: tc
spec:
containers:
- name: first-container
image: nginx
ports:
- containerPort: 80
- name: second-container
image: busybox
command: ["/bin/sh", "-c", "while true; do echo 'Hello from the second container' > /shared-data/index.html; sleep 10; done"]
volumeMounts:
- name: shared-data
mountPath: /shared-data
ports:
- containerPort: 8080
volumes:
- name: shared-data
emptyDir: {}
通过配置映射(ConfigMap),可以将配置文件挂载到Pod中,方便管理和更新。
volumes:
- name: config-volume
configMap:
name: example-config
通过定义存储卷(Volume),可以将持久化存储挂载到Pod中。
volumes:
- name: vol-data
persistentVolumeClaim:
claimName: pvc1
通过Replication Controller可以确保指定数量的Pod副本在任何时候都处于运行状态。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
Deployment是Replication Controller的升级版,支持滚动更新和回滚。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
ports:
- containerPort: 80
通过设置资源配额(Resource Quotas),可以限制命名空间中所有Pod的资源使用总量。
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
通过设置podsPerCore
参数,可以根据节点的CPU核心数来控制每个节点上可以运行的Pod数量。
podsPerCore: 2
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
tolerations:
- key: "dedicated"
operator: "Equal"
value: "special-user"
effect: "NoSchedule"