3.3. Pod 和服务


3.3.1. Pods

OpenShift Container Platform 利用 Kubernetes 的 pod 概念,它是共同部署在同一主机上的一个或多个容器,也是可被定义、部署和管理的最小计算单元。

对容器而言,Pod 大致相当于机器实例(物理或虚拟)。每个 pod 分配有自己的内部 IP 地址,因此拥有完整的端口空间,并且 pod 内的容器可以共享其本地存储和网络。

Pod 有生命周期,它们经过定义后,被分配到某一节点上运行,然后持续运行,直到容器退出或它们因为其他原因被删除为止。根据策略和退出代码,Pod 可在退出后删除,或被保留下来以启用对容器日志的访问。

OpenShift Container Platform 将 pod 基本上视为不可变;在运行期间无法更改 pod 定义。OpenShift Container Platform 通过终止现有的 pod,再利用修改后的配置和/或基础镜像重新创建 pod,从而实现更改。Pod 也被视为是可抛弃的,不会在重新创建时保持原来的状态。因此,pod 通常应由更高级别的 控制器 管理,而不是直接由用户管理。

注意

有关每个 OpenShift Container Platform 节点主机的最大 pod 数量,请参阅集群 最大

警告

不受复制控制器管理的裸机 pod 不会在节点中断时重新调度。

以下是一个提供长时间运行的服务的 pod 示例定义,该服务实际上是 OpenShift Container Platform 基础架构的一部分,即集成的容器镜像 registry。它展示了 pod 的许多特性,其中大多数已在其他主题中阐述,因此这里仅简略提及:

Pod 对象定义 (YAML)

apiVersion: v1
kind: Pod
metadata:
  annotations: { ... }
  labels:                                1
    deployment: docker-registry-1
    deploymentconfig: docker-registry
    docker-registry: default
  generateName: docker-registry-1-       2
spec:
  containers:                            3
  - env:                                 4
    - name: OPENSHIFT_CA_DATA
      value: ...
    - name: OPENSHIFT_CERT_DATA
      value: ...
    - name: OPENSHIFT_INSECURE
      value: "false"
    - name: OPENSHIFT_KEY_DATA
      value: ...
    - name: OPENSHIFT_MASTER
      value: https://master.example.com:8443
    image: openshift/origin-docker-registry:v0.6.2 5
    imagePullPolicy: IfNotPresent
    name: registry
    ports:                              6
    - containerPort: 5000
      protocol: TCP
    resources: {}
    securityContext: { ... }            7
    volumeMounts:                       8
    - mountPath: /registry
      name: registry-storage
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-br6yz
      readOnly: true
  dnsPolicy: ClusterFirst
  imagePullSecrets:
  - name: default-dockercfg-at06w
  restartPolicy: Always                 9
  serviceAccount: default               10
  volumes:                              11
  - emptyDir: {}
    name: registry-storage
  - name: default-token-br6yz
    secret:
      secretName: default-token-br6yz

1
pod 可以被“标上(tag)”一个或多个标签(label),然后使用这些标签在一个操作中选择和管理多组 pod。标签以键/值格式保存在 metadata 散列中。本例中的一个标签是 docker-registry=default
2
Pod 在其命名空间内需要具有唯一名称。一个 pod 定义可以使用 generateName 属性指定名称的基础,并且会自动添加随机字符来生成唯一名称。
3
containers 指定一组容器定义;本例中只有一个,与大多时候相同。
4
可以指定环境变量以将必要的值传递给每个容器。
5
pod 中的每个容器使用自己的Docker 格式的容器镜像进行安装。
6
容器可绑定至在 pod 的 IP 上提供的端口。
7
OpenShift Container Platform 为容器定义了一个安全上下文,指定是否允许其作为特权容器来运行,或者以所选用户身份运行,等等。默认上下文的限制性比较强,但管理员可以根据需要进行修改。
8
容器指定在容器中挂载外部存储卷的位置。在本例中,一个卷用于存储 registry 的数据,另一个卷则提供凭证的访问途径,registry 需要这些凭证来向 OpenShift Container Platform API 发出请求。
9
pod 重启策略,可能的值为 AlwaysOnFailureNever。默认值为 Always
10
Pod 对 OpenShift Container Platform API 发出请求是一种比较常见的模式,它有一个 serviceAccount 字段,用于指定 pod 在发出请求时使用哪个服务帐户用户进行身份验证。这可以为自定义基础架构组件提供精细的访问控制。
11
pod 定义了可供其容器使用的存储卷。在本例中,它提供了一个用于存储 registry 的临时卷,以及一个包含服务帐户凭证的 secret 卷。
注意

此 pod 定义不包括 OpenShift Container Platform 在 pod 创建并开始其生命周期后自动填充的属性。Kubernetes pod 文档详细介绍了 pod 的功能和用途。

3.3.1.1. Pod 重启策略

Pod 重启策略决定了 OpenShift Container Platform 在该 pod 中的容器退出时如何响应。策略应用到该 Pod 中的所有容器。

可能的值有:

  • 始终 - 在 pod 重启前,按指数避退延时(10s,20s,40s)持续重启 pod 上成功退出的容器。默认值为 Always
  • OnFailure - 按规定的延时值(10s,20s,40s)不断尝试重启 pod 中失败的容器,上限为 5 分钟。
  • Never - 不尝试重启 pod 中已退出或失败的容器。Pod 立即失败并退出。

绑定到节点后,pod 永远不会绑定到另一个节点。这意味着,需要一个控制器才能使 pod 在节点失败后存活:

状况控制器类型重启策略

应该终止的 Pod(例如,批量计算)

作业

OnFailureNever

不应该终止的 Pod(例如,Web 服务器)

复制控制器

Always

需要在每台机器上运行一个的 Pod

Daemonset

任意

如果 pod 上的容器失败,并且重启策略被设置为 OnFailure,则 pod 会保留在该节点上并重新启动容器。如果您不希望容器重启,请使用 Never 的重启策略。

如果整个 pod 失败,OpenShift Container Platform 会启动一个新 pod。开发人员需要解决应用程序可能会在新 pod 中重启的问题。特别是,应用程序需要处理由之前运行导致的临时文件、锁定、不完整的输出等。

注意

Kubernetes 架构需要来自云提供商的可靠端点。当云提供商停机时,kubelet 会防止 OpenShift Container Platform 重启。

如果底层云提供商端点不可靠,请不要使用云提供商集成来安装集群。应像在非云环境中一样安装集群。不建议在已安装的集群中打开或关闭云提供商集成。

如需详细了解 OpenShift Container Platform 如何使用与失败容器相关的重启策略,请参阅 Kubernetes 文档中的示例状态

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.