一、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接口。

打赏
支付宝 微信
上一篇 下一篇