目录
一、什么是 Pod?
Pod是Kubernetes中最小的计算单元,由一个或多个容器组成;这些容器共享存储、网络等资源,可以理解成同一主机上运行多个应用。
如何创建/运行pod
可以通过kubectl run创建,也可以通过kubectl apply yaml文件创建
# kubectl run命令创建一个Nginx pod
$ kubectl run nginx --image=nginx
pod/nginx created
# 通过yaml文件创建
$ kubectl run nginx --image=nginx --dry-run=client -o yaml > pod_nginx.yaml
$ cat pod_nginx.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
$ kubectl apply -f pod_nginx.yaml
pod/nginx created
# 查看pod
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 30s
pod在实际的环境应用中,很少在 Kubernetes 中单独创建一个个的 Pod,因为 Pod 被设计成了相对临时性的、用后即抛的一次性实体。 只由当 Pod 由控制器 创建时,它才会被调度在集群中的节点上运行,直到 Pod 结束执行、Pod 对象被删除、Pod 因资源不足而被驱逐或者节点失效为止。
二、什么是控制器?
控制器是用来创建和管理多个 Pod,比如多副本的管理、上线、更新,以及节点/pod异常时将 pod 调度到一个健康的节点上等。控制器类型有:
- Deployment 通过控制RepliaSet来控制Pod,支持滚动升级,版本回退
- StatefulSet 通过挂载共享存储,实现有状态的服务部署
- DaemonSet 用于管理在集群中每个节点上仅运行一个Pod的副本实例
- Job 用于执行一次性任务,任务完成pod就退出
- CronJob 用于执行周期性任务,Pod周期性执行
Tips: 早期的pod控制器是ReplicationController,已经弃用,由ReplicaSet替代,ReplicaSet支持多副本Pod运行,支持滚动更新,Deployment通过控制RepliaSet来控制Pod滚动升级,版本回退等,所以ReplicaSet也由Deployment替代,官方也建议用Deployment。
Deployment示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- kind:控制器类型
- name: 创建名为nginx的deployment
- replicas:3个副本
- selector:定义 Deployment 关联的 Pods,label为nginx的pod
- template:模板,是包含在工作负载对象中的规范,包括.metadata.labels,.template.spec等
Job示例
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
由于篇幅问题,仅展示deployment和Job两个例子,DaemonSet 和 Deployment类似,将Kind类型改为DaemonSet,其它基本一致,StatefulSet需要提前创建pvc,配置存储,这里就不作展开,后面看是否展开讨论
三、总结
这里总结下,Pod运行在节点环境中,是Kubernetes中最小的计算单元,在每个Pod中都运行着一个特殊的被称为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间的通信和数据交换更为高效,Pod中存在多个容器时,容器与容器间的互调通过 localhost: ip_port的方式,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中;除了业务容器,还有init容器、sidecar容器,用于业务容器初始化操作或日志采集等功能;需要注意的是,pod一般不直接对外服务,还需通过映射到Service上对外提供服务,并不是每个Pod和它里面运行的容器都能被映射到一个Service上,只有提供服务(无论是对内还是对外)的那组Pod才会被映射为一个服务。
在实际应用中,也不会直接创建或运行Pod的形式提供服务,而是通过控制器(RC)来创建管理Pod的创建、副本数、运行、滚动更新等
关于Service和RC控制器的讨论,后面有机会再进行学习分析
关于什么是pod就先写到这里~
觉得有用就收藏吧~