文章目录
Pod介绍
一、Pod简介
- Pod,一个微服务
1.简单举例理解Pod
比如你运行一个操作系统发行版的软件仓库,一个 Nginx 容器用来发布软件,另 一个容器专门用来从源仓库做同步;这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务,这就是 K8S 中的 Pod!
2.Pod的设计理念
Pod支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间的通信、以及文件共享这种简单高效的方式组合完成服务,整个k8s都是围绕着Pod展开的,所以说Pod 对多容器的支持是 K8s 最基础的设计理念!
3.Pod的功能作用
- pod相当于逻辑主机,每个pod都有自己的ip地址
- pod内的容器共享相同的ip和端口空间
- 默认情况下,每个容器的文件系统与其他容器完全隔离
- 可以理解为:容器组,同时pod相当于逻辑主机,进入pod后仿佛进入一个linux主机,命令都可用(linux系统下),该“主机”内又有很多容器,进入后又仿佛是又进了一个linux主机。
- Pod的生命周期图
Pod的状态
状态值 | 描述 |
---|---|
Pending | 挂起,创建中,即还未创建完成 |
Running | 运行中 |
Succeeded | 被成功终止,且不会再重启 |
Compland | 被成功终止,且不会再重启 |
Failed | 启动失败 |
Unknown | 未知状态,某个节点宕机了 |
4.Pod的三种重启策略
Pod 重启策略( RestartPolicy )应用于 Pod 内的所有容器,井且仅在 Pod 所处的 Node 上由 kubelet 进行判断和重启操作。当某个容器异常退出或者健康检查失败时, kubelet 将根据 RestartPolicy 设置来进行相应的操作,Pod 的重启策略包括如下三种:
策略 | 描述 |
---|---|
Always | 默认值,当容器失效时,kubelet 会自动重启该容器 |
OnFailure | 非正常退出时,kubelet 会自动重启该容器 |
Nerver | 无论容器运行状态如何,kubelet 都不会重启该容器 |
- kubelet 重启失效容器的时间间隔以同步频率(sync-frequency)乘以 2n 来计算;例如 1、2、4、8 倍等,最长延时 5min ,并且在成功重启后的 10 min 后重置该时间。
- Pod 的重启策略与控制方式息息相关,当前可用于管理 Pod 的控制器包括 ReplicationController、Job、 DaemonSet 及直接通过 kubelet 管理(静态 Pod),每种控制器对 Pod 的重启策略要求如下:
- RC、DaemonSet必须设置为 Always,需要保证该容器持续运行。
- Job 和 CronJob:OnFailure 或 Never,确保容器执行完成后不再重启。
- kubelet:在 Pod 失效时自动重启它,不论将 RestartPolicy 设置为什么值,也不会对 Pod 进行健康检查。
5.Pod 的资源清单详解
apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx # 必选,符合RFC 1035规范的Pod名称
namespace: web-testing # 可选,不指定默认为default,Pod所在的命名空间
labels: # 可选,标签选择器,一般用于Selector
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
- name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置
- name: TZ # 变量名
value: Asia/Shanghai
- name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为2次表示就绪
failureThreshold: 1 # 检测失败1次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: # 可选,指定Node节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的secret
- name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
- name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420
Pod常用基本命令
kubectl create -f xxx.yaml # 无则创建,有则不建
kubectl apply -f xxx.yaml # 无则创建,有则更新
kubectl get pod Pod_Name # 指定查询运行中的Pod(kubectl get pod为查询所有)
kubectl describe pod Pod_Name # 查询所有运行中的Pod
kubectl delete pod Pod_Name # 删除(--all为删除所有)
二、案例
1.简单编写nginx资源清单
cat > nginx.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
- name: tomcat
image: tomcat:v1
EOF
# 可用 - name 连续部署多个containers(容器)
# image名后可跟版本号(如v1),不加默认为最新版本
2.创建nginx-Pod
[root@k8s-master1 yaml] kubectl create -f nginx.yaml
pod/nginx-pod created
# 查看
[root@k8s-master1 yaml] kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 2/2 Running 0 4s
# 查看更多信息
[root@k8s-master1 yaml] kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 2/2 Running 0 35m 10.244.2.24 k8s-node2 <none> <none>
3.删除nginx-Pod
[root@k8s-master1 yaml] kubectl delete pod nginx-pod
pod "nginx-pod" deleted
[root@k8s-master1 yaml] kubectl get pod
4.管理Pod资源
# 查看重启策略(可更改)
[root@k8s-master1 yaml] kubectl edit pod nginx-pod
···
priority: 0
restartPolicy: Always # 可更改重启策略
schedulerName: default-scheduler
···
# 查看重启策略(不可更改)
[root@k8s-master1 ~] kubectl get pod -o json | grep restartPolicy
"f:restartPolicy": {},
"restartPolicy": "Always",
"f:restartPolicy": {},
"restartPolicy": "Always",
"f:restartPolicy": {},
"restartPolicy": "Always",
三、练习题默写
1、kubernetes的组件有哪些
2、kubernetes组件之间是通过什么认证的
3、使用kubernetes的时候遇到过哪些问题
- etcd数据不一致
- 集群网络不通
- 存储
4、docker的四种网络模式
5、dockerfile指令
6、监控一个docker容器
7、在kubernetes上部署一个应用的流程