一、什么是pod

Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
在这里插入图片描述

二、pod的工作方式

1. Pod模版

K8s一般不直接创建Pod,而是通过控制器和模版配置来管理和调度。

2. Pod重启

在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过restartPolicy字段设置重启策略如下:

  • Always: 只要退出就会重启。
  • OnFailure: 只有在失败退出(exit code不等于0)时,才会重启。
  • Never: 只要退出,就不再重启
    注意:这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上。

3. Pod资源限制

Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括 requests(请求,调度器保证调度到资源充足的Node上)和 limits(上限)等。

4. Pod健康检查

在Pod部署到Kubernetes集群中以后,为了确保Pod处于健康正常的运行状态,Kubernetes提供了两种探针,用于检测容器的状态:

  • Liveness Probe : 检查容器是否处于运行状态。如果检测失败,kubelet将会杀掉容器,并根据重启策略进行下一步的操作。如果容器没有提供Liveness Probe,则默认状态为Success。
  • ReadinessProbe : 检查容器是否已经处于可接受服务请求的状态。如果Readiness Probe失败,端点控制器将会从服务端点(与Pod匹配的)中移除容器的IP地址。如果一个容器未提供Readiness Probe,则默认状态是Success。

kubelet在容器上周期性的执行探针以检测容器的健康状态,kubelet通过调用被容器实现的处理器来实现检测,在Kubernetes中有三类处理器:

  • ExecAction : 在容器中执行一个指定的命令。如果命令的退出状态为0,则判断认为是成功的。
  • TCPSocketAction : 在容器IP地址的特定端口上执行一个TCP检查,如果端口处于打开状态,则视为成功。
  • HTTPGetAcction : 在容器IP地址的特定端口和路径上执行一个HTTP Get请求使用container的IP地址和指定的端口以及请求的路径作为url,用户可以通过host参数设置请求的地址,通过scheme参数设置协议类型(HTTP、HTTPS)如果其响应代码在200~400之间,设为成功。

健康检测的结果为下面三种情况:

  • Success : 表示容器通过检测
  • Failure : 表示容器没有通过检测
  • Unknown : 检测失败,因此不会采取任何行动。

5. 初始化容器

Pod可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个优先于容器启动的 init 容器。如果为一个 Pod 指定了多个 init 容器,这些 init 容器会按顺序逐个运行。每个 init 容器都必须运行成功,下一个才能够运行。当所有的 init 容器运行完成时,Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。
为什么需要 init 容器?
在开发一个程序时,通常初始化代码与主体业务代码放置在同一个程序中。而kubernetes提供初始化容器这种功能,初始化容器与普通容器有各自独立的image,本质上是将初始化逻辑与主体业务逻辑分离并放置在不同的image中,以下是初始化容器的主要用处:
(1)初始化容器可以包含不能随普通容器一起发布出去的敏感信息。
(2)初始化容器可以包含用户自定义的代码、工具,如sed、awk、python等方便完成初始化、设置工作。
(3)因为初始化逻辑与主体业务逻辑分布在不同的image中,因此image构建者与主体业务逻辑开发者可以各自独立的工作。
(4)初始化容器使用Linux namespace,不同于普通应用容器,具有不同的文件系统视图,并且对于低层的操作系统有更大的访问权限。
(5)当应用启动的前置条件不具备时,初始化容器可以阻止普通应用容器启动,避免在条件不具备时反复启动注定会失败的容器而浪费系统资源。
init 容器和普通容器的区别
Init 容器与普通的容器非常像,除了如下两点:
(1)它们总是运行到完成
(2)init 容器不支持 Readiness,因为它们必须在 Pod 就绪之前运行完成,每个 init 容器必须运行成功,下一个才能够运行。

6. pod的生命

在这里插入图片描述

  • 一般Pod不会消失,直到人为销毁他们,这可能是一个人或控制器。
  • 建议创建适当的控制器来创建 Pod,而不是直接自己创建 Pod。因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。
  • 三种可用的控制器:
    (1)使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为 OnFailure 或 Never 的 Pod。
    (2)对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有 restartPolicy 为 Always 的 Pod。
    (3)提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod 。

三、pod实验截图

1. init容器实验

vim init.yml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: nginx 
    imagePullPolicy: IfNotPresent
  initContainers:
  - name: init-myservice
    image: busyboxplus
    command: ["sh", "-c", "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]     
vim service.yml 
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

在这里插入图片描述
单独运行无法成功init因为在等待myservice运行
在这里插入图片描述
创建myservice
在这里插入图片描述
pod变成running状态(注意虚拟机内要含有busyboxplus镜像,否则可能报错)
在这里插入图片描述

2. liveness测试

vim live.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        livenessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 2
          timeoutSeconds: 3
        readinessProbe:
          httpGet:
            path: /test.html
            port: 80
          initialDelaySeconds: 1
          periodSeconds: 3
          timeoutSeconds: 1

补充:另一个liveness实例

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: nginx
    imagePullPolicy: IfNotPresent
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

探针的使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于没有test页面所以报错
在这里插入图片描述
此时运行正常
在这里插入图片描述

3. readiness测试

vim readiness.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: readiness
  name: readiness-http
spec:
  containers:
  - name: readiness
    image: nginx
    readinessProbe:
      httpGet:
        path: /test.html
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

4. 负载均衡

负载均衡演示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以访问容器地址
在这里插入图片描述
server2和server3同下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现实现了负载均衡
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐