1-Pod概述
1.Pod概述
pod概述
1.每个Pod都有一个Pause容器,也称为“根容器”。除了Pause容器,每个Pod还包含一个或多个业务容器。
2.Pod中的容器共用pause容器的网络栈和存储卷。同一个pod中的两个容器只要localhost:端口就可以互相访问,同一个pod中端口不能重复
3.每个Pod都分配了唯一的IP地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP地址
4.K8S中,一个Pod里的容器与另外主机上的Pod容器能够直接通信。
pod的类型
静态pod和普通pod
静态pod概述
静态Pod比较特殊,它并没被存放在Kubernetes的etcd存储里,而是被存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动、运行
静态pod无需api server和其他集群组件干预,由kubelet自行创建管理,并在静态pod崩溃之后尝试重新启动
普通pod
* 普通Pod一旦被创建,就会被放入etcd中存储,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器并启动。
K8S中的三种IP
Node IP: Node节点的IP地址,即物理网卡的IP地址
Pod IP: Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址
Cluster IP:Service的IP地址,此为虚拟IP地址
静态pod
静态pod的创建
使用 --config 配置kubelet的启动参数,指定kubelet需要监控的静态pod文件所在的目录,kubelet会定期扫描该目录,并根据该目录下的.yaml或.json文件进行创建操作。
示例
1、确定kubelet的配置文件是什么
vim systemctl status kubelet.service
......
--config=/var/lib/kubelet/config.yaml
......
2、在上述配置文件中指定静态pod文件放置目录为/etc/kubelet.d/
vim /var/lib/kubelet/config.yaml
......
staticPodPath: /etc/kubelet.d/
......
3、重启服务,使配置生效
systemctl daemon-reload
systemctl restart kubelet.service
4、在在目录/etc/kubelet.d中放入static-nginx-pod.yaml文件
vim /etc/kubelet.d/static-nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-nginx-pod
labels:
app: static-nginx-pod
spec:
containers:
- name: test-nginx-container
image: nginx:latest
imagePullPolicy: Never
command: ["/usr/sbin/nginx", "-g", "daemon off;"]
ports:
- containerPor
5、删除静态pod
rm -f /etc/kubernetes/manifests/static-nginx-pod.yaml
由于静态Pod无法通过API Server直接管理,所以在Master上尝试删除这个Pod时,会使其变成Pending状态,不会被删除,然后会自动重建
要删除该Pod,只能到其所在Node上将其定义文件static-nginx-pod.yaml从/etc/kubelet.d/目录下删除
常见的静态pod
etcd
kube-apiserver
kube-controller-manager
kube-scheduler
http方式创建静态pod
* 通过设置kubelet的启动参数“--manifest-url”,kubelet将会定期从该URL地址下载Pod的定义文件,并以.yaml或.json文件的格式进行解析,然后创建Pod。其实现方式与配置文件方式是一致的。
pod容器共享volume
* 同一个Pod中的多个容器能够共享Pod级别的存储卷Volume。
* Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录
* 在下面的例子中,在Pod内包含两个容器:nginx和busybox,在Pod级别设置Volume“app-logs”,用于nginx向其中写日志文件,busybox读日志文件。配置文件pod-volume-applogs.yaml的内容如下:
* 这里设置的Volume名为app-logs,类型为emptyDir,挂载到nginx容器内的/var/log/nginx/目录,同时挂载到busybox容器内的/log/目录。
* nginx容器在启动后会向/var/log/nginx/目录写文件,busybox容器就可以读取其中的文件了。
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-nginx-deployment
namespace: default
spec:
selector:
matchLabels:
app: busybox-nginx-pod
replicas: 2
template:
metadata:
labels:
app: busybox-nginx-pod
spec:
imagePullSecrets:
- name: svharborwx
volumes:
- name: app-logs
emptyDir: {}
containers:
- name: test-busybox-container
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: ["sh", "-c", "tail -f /log/error.log"]
ports:
- containerPort: 54321
volumeMounts:
- mountPath: /log/
name: app-logs
- name: test-nginx-container
image: nginx:latest
imagePullPolicy: IfNotPresent
command: ["/usr/sbin/nginx", "-g", "daemon off;"]
ports:
- containerPort: 80
volumeMounts:
- mountPath: /var/log/nginx/
name: app-logs
pod定义的完整yaml文件
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #必选,Pod所属的命名空间
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略:Alawys表示总是下载镜像,IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] #容器的启动命令列表。如不指定,则使用镜像打包时指定的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需要使用volumes[]部分定义的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式,默认值为读写模式
ports: #需要暴露的端口号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同。设置hostPort 时,同一台宿主机将无法启动该容器的第2 份副本
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和资源请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib、Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,单位为core数,容器启动的初始可用数量
memory: string #内存请求,单位可以为Mib、Gib,容器启动的初始可用数量
livenessProbe: #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string #http服务器上的访问URI
port: number #容器上要访问端口号或名称
host: string #要连接的主机名,默认为Pod的IP,可以在http request head中设置host头部。
scheme: string #用于连接host的协议,默认为HTTP
HttpHeaders: #自定义HTTP请求headers,HTTP允许重复headers
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动后要等待多少秒后探针才开始工作(单位是秒),默认是0秒,最小值是0
timeoutSeconds: 1 #探针执行检测请求后,等待响应的超时时间(单位是秒),默认为1s,最小值是 1
periodSeconds: 10 #执行探测的时间间隔(单位是秒),默认为10s,最小值是1
successThreshold: 1 #(失败-->就绪)探针检测失败后认为成功的最小连接成功次数,默认为1s,最小值为1s。(在Liveness和startupProbe探针中必须为1s)
failureThreshold: 3 #(就绪-->失败)探测失败的重试次数,重试一定次数后将认为失败,默认为3s,最小值为1s。(在readiness探针中,Pod会被标记为未就绪)
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略。Always(默认值)表示一旦不管以何种方式终止运行,kubelet都将重启。OnFailure表示只有Pod以非0退出码退出才重启。Nerver表示Pod终止后,kubelet将退出码报告给Master,不会再重启该Pod
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主机网络模式,默认为false。如果设置为true,表示使用宿主机网络,不再使用Docker网桥,该Pod将无法在同一台宿主机上启动第2个副本。
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)。容器定义部分的containers[].volumeMounts[].name将引用该共享存储卷的名称。可以定义多个volume ,每个volume的name保持唯一。
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」