kubernetes pod
1、pod 基本用法
- pod要求其主程序一直在前台运行,如该无法改造为前台执行程序,可以使用开源工具supervisor辅助进行前台运行的功能。
- pod中可以包含多个容器,在spec的containers下定义多个容器。
- 静态pod是由kubelet管理,进存在与特定node上的pod,他们不能通过apd、rcdaemonset等进行管理。通过node节点上的yaml文件定义,如果想删除该pod必须删除yaml文件。
2、pod共享volume
- 同一个pod中的容器共享pod界别的存储卷volume。
- spec.volumes:定义volmes:
volumes:
- name: postgresql-dev
persistentVolumeClaim:
claimName: postgres-dev-2
- emptyDir: {}
- spec.containers.volumeNounts定义挂载点:
volumeMounts:
- mountPath: /var/lib/pgsql/data
name: postgresql-dev
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-28szx
readOnly: true
3、pod中使用configmap
configmap 概述:
- 生成为容器内的环境变量
- 设置容器启动命令的启动参数,需设置环境变量
- 以volume的形式挂载为容器内部的文件和目录
configmap创建:
- 通过yaml文件创建key:value键值对形式的configmap,key:value为典型字符串
- 通过yaml文件创建key:value键值对,key为文件别名,value为文件内容
- kubectl命令创建,指定配置文件目录,目录中的文件名为key,文件内容为value
pod中使用configmap
- 通过环境变量使用pod:
containers:
- env:
- name: DB_PASSWORD
valueFrom:
configMapKeyRef:
key: database-password
name: postgres-svc
- 通过volumeMount使用configmap
containers:
volumes:
- configMap:
defaultMode: 420
name: console-configmap
name: volume-iris
使用configmap的限制条件
- configmap必须在pod之前创建
- configmap受namespace的限制,相同namespace下可以使用。
- configmap中的配额管理未实现。
- 静态pod无法使用configmap
- pod挂载configmap只能挂载为目录,不能挂载为文件。
4、pod生命周期和重启策略
pod状态如下:
- Pending
- Running
- Succeeded
- Failed
-
Unknow
pod 重启策略 RestartPolicy
Always:容器失效是,kubelet自动重启容器
OnFailure :容器终止运行,退出代码不为0时,kubelet自动重启
Never :不管什么状态,都不会重启
5、Pod健康检查
- LivenessProbe:用于判断容器是否running。如该容器不包含此探针,LivenessProbe永远返回success。
-
ReadinessProbe:用于判断容器是否启动完成ready,如该该探针检测到失败,将在service的endpoint中删除该pod。
LivenessProbe三种实现方式:
1.ExecAction:执行一个命令来检测。
"readinessProbe": {
"exec": {
"command": [
"/bin/sh",
"-i",
"-c",
"psql -h 127.0.0.1 -U $POSTGRESQL_USER -q -d $POSTGRESQL_DATABASE -c 'SELECT 1'"
]
},
2.TCPSocketAction:通过IP地址和端口号检查
"livenessProbe": {
"failureThreshold": 3,
"initialDelaySeconds": 30,
"periodSeconds": 10,
"successThreshold": 1,
"tcpSocket": {
"port": 5432
},
"timeoutSeconds": 1
},
3.HTTPGetAction:通过IP地址、端口号、路径来调用http get方法检查
"livenessProbe": {
"httpGet": {
"path": "/health",
"port": 8000,
"scheme": "HTTP"
},
6、pod 调度
全自动调度 RC、Depolyment
自动部署一个容器的多个副本,并维持副本数量,经过master上的scheduler调度到合适的node上面。定向调度 nodeselector
通过node的标签和pod的nodeselector属性匹配,指定pod运行在特定的node上
在spec下,添加nodeselectornode亲和性调度:nodeAffinity
用于替换nodeselector的全新调度策略,目前有两种亲和性表达:
RequiredDuringSchedulingIgnoredDuringExecution:功能与nodeselector相似,相当于硬限制。
PreferredDuringSchedulingIgnoredDuringExecution:强制优先满足指定规则。pod亲和性与互斥调度策略
根据节点上正在运行的pod的标签而不是节点上的标签来调度。污点和容忍 Taints,Tolerations
Taints:在node上设置taints,效果是noschedule,除非pod明确声明可以容忍这个taints,否则不会调度到该node。
Tolerations:pod中的Tolerations声明key和value需要与taints保持一致,可以容忍并调度到node。DaemonSet,每个node上调度一个pod
适用于存储、日志采集、监控等需求job 批处理调度
Cronjob 定时任务
自定义调度器
初始化容器 init container
pod 升级和回滚
pod扩容和缩容