一、Pod是什么?
Pod是可以在k8s中创建和管理的、最小的可部署计算单元。一个Pod(容器组)包含了一个(或多个)应用程序容器、存储资源、一个唯一的网络IP地址以及一些确定容器该如何运行的配置选项。Pod代表了k8s中一个独立的应用程序运行实例,该实例可能由一个容器或者几个紧耦合在一起的容器组成。
二、k8s为毛不直接操作容器,而是要通过Pod去操作容器?
一说到容器,我们通常就想到Docker,其实容器不仅仅有Docker,还有其他技术,比如rkt、cri-o等等,k8s面向的是这些容器的抽象,也就是CRI(容器运行时接口),这有点像JDBC的思想。
那么k8s为毛不直接操作容器,还需要在容器之上再包一层呢,其实pod里面是可以存放多个容器的,也就是多个容器共同对外服务,而实际工作中,有时我们需要多个容器协作共同形成一个有意义的服务单元,比如主流的前后端分离,我们对外的服务通常包括nginx容器和java应用容器,那么用一个pod把这两个容器包含进来,使得管理更加简单。
此外每一个pod都有一个pause容器,用来管理pod中的应用容器的状态,以pause的状态来代表pod的状态。
另外就是容器间的协作问题,比如在同一个pod的多个容器,可以通过localhost:port方式进行通信,更加高效。
三、Pod有哪些设计理念?
Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
另外Pod对容器进行统一封装和管理,使得kubernetes对于容器的操作和管理更加简单。
四、特性
1、资源共享:IP和Volume(数据卷)
一个Pod里面的多个容器可以共享存储和IP,可以看到一个逻辑的主机。
2、生命周期短暂
Pod是一个相对来说存活周期短暂,且随时会被丢弃的实体。Pod本身并不能自愈(self-healing),如果一个Pod所在的节点出现故障,或者调度程序自身出现故障,那么Pod将被删除;当节点资源不够或者节点维护而驱逐Pod时,Pod也将被删除。k8s通过控制器来管理Pod,我们不要直接手动去管理Pod。
3、平坦的网络
所有的pod都在同一个共享网络地址空间中,每个pod都可以通过其他pod的ip地址来访问。
五、简单用法
1、定义一个pod配置文件
通过yaml文件的形式定义一个pod,具体如下:
apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据
name: nginx # 必选,符合RFC 1035规范的Pod名称
labels: # 可选,标签选择器,一般用于过滤和区分Pod
app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
- name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:latest # 必选,容器所用的镜像的地址
imagePullPolicy: IfNotPresent # 可选,镜像拉取策略 IfNotPresent:如果宿主机有,就不拉取,Always:总是拉取,Never:不管是否存储都不拉取
command: # 可选,容器启动执行的命令
- nginx
- -g
- "daemon off;"
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
ports: # 可选,容器需要暴露的端口号列表
- name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
RFC 1035 命名必须满足如下规则:
(1)最多 63 个字符
(2)只能包含小写字母、数字,以及 ‘-’
(3)必须以字母开头
(4)必须以字母数字结尾
2、pod简单管理
注:实际生产环境中,我们不会直接手动去创建或者修改pod,而是通过Deployment等来管理pod,只是在开发调试的时候才会这么做。
(1)创建pod
kubectl create -f 文件名.yml
或者kubectl apply -f 文件名.yml
使用kubectl apply较多一些,因为可以用于更新pod配置信息。
(2)查看pod
kubectl get pods
查看指定namespace下的pods:kubectl get pods -n xxx
查看更多pod信息:kubectl get pods -o wide
查看label信息:–show-labels
查看pod配置信息: kubectl edit pod 名称 -n kube-system
查看pod描述信息:kubectl describe pod 名称 (如果pod不能正常启动,可以通过该命令查看具体情况)
[root@k8s-master1 pods]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 6s
[root@k8s-master1 pods]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 66s 172.16.159.159 k8s-master1 <none> <none>
[root@k8s-master1 pods]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 112s app=nginx
(3)修改pod
kubectl apply -f 文件名.yml
(4)删除pod
kubectl delete -f 文件名.yml
或者 kubectl delete pod 名称
[root@k8s-master1 pods]# kubectl delete pod nginx
pod "nginx" deleted
[root@k8s-master1 pods]# kubectl delete -f 01.create-pod.yml
pod "nginx" deleted
六、探针(健康检测)
pod探针的配置如下:
# startupProbe: # 可选,检测容器内进程是否完成启动。
# httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
# path: /api/successStart # 检查路径
# port: 80
readinessProbe: # 可选,健康检查。
httpGet: # httpGet检测方式,生产环境建议使用httpGet实现接口级健康检查,健康检查由应用程序提供。
path: / # 检查路径
port: 80 # 监控端口
livenessProbe: # 可选,健康检查
#exec: # 执行容器命令检测方式
#command:
#- cat
#- /health
#httpGet: # httpGet检测方式
# path: /_health # 检查路径
# port: 8080
# httpHeaders: # 检查的请求头
# - name: end-user
# value: Jason
tcpSocket: # 端口检测方式
port: 80
1. 三种探针
(1)startupProbe
启动探测:用于判断容器内应用程序是否已经启动成功,检测返回success后,不再进行探测。
(2)readinessProbe
就绪探测:用于探测容器内的应用程序是否健康,如果返回success,则表示应用程序已经准备就绪,可以正常接受流量请求。
(3)livenessProbe
存活探测:用于探测容器是否正常运行,如果探测失败,kubelet会根据配置的重启策略进行处理。
2. 三种探测方式
(1)exec
在容器内执行命令,如果返回值为0,则认为容器健康。
(2)tcpSocket
通过TCP连接检测容器内的端口是否是通的,如果通则认为容器健康。(类似telnet)
(3)httpGet
通过应用程序暴露的API地址来探测应用程序是否正常,如果http状态码为200-400之间,则认为容器健康。这种方式是最准确的,但是应用程序开发对应的API接口。