配置


Red Hat build of MicroShift 4.19

配置 MicroShift

Red Hat OpenShift Documentation Team

摘要

本文档提供有关配置 MicroShift 的说明。

第 1 章 使用 MicroShift 配置文件

通过一个 YAML 文件,可根据您的偏好、设置和参数自定义 MicroShift 实例。

1.1. 配置 Red Hat Device Edge

MicroShift 和 Red Hat Enterprise Linux (RHEL)协同工作,将轻量级、单节点 Kubernetes 引入边缘。这种组合意味着只有一个节点同时是 control-plane 和 worker。这也意味着操作系统处理许多功能。您可以通过安装可选 RPM 或 Operator 来添加功能。在很多情况下,除了 MicroShift 服务外,还需要配置操作系统或其他资源。

将许多组件结合到 MicroShift 配置文件 config.yaml。MicroShift 配置文件自定义您的应用平台,并可启用许多高级功能。例如:

  • 默认情况下,ingress 可用,但您可以使用 MicroShift 配置文件中的参数添加 TLS 和路由准入规格等高级功能。
  • 如果不需要存储,您可以使用 MicroShift 配置文件禁用内置存储供应商。如果要使用内置存储供应商,您必须在 lvmd.config 文件中进行调整。本例中,MicroShift 配置文件的角色是设置是否使用默认存储供应商。
  • 高级网络功能,如使用多个网络。Multus 软件包是一个可安装的 RPM,但您使用 MicroShift 配置文件设置访问权限来设置参数。另外,您必须通过主机在网络上配置网络设置。

为方便起见,会自动安装 config.yaml.default 文件。您可以复制并重命名此文件 config.yaml,并将其用作您自己的自定义配置的起点。

注意

您还可以将在没有配置的情况下运行的功能添加到 MicroShift config.yaml 文件中。例如,您可以在不配置 MicroShift 的情况下为应用程序管理安装和配置 GitOps。

注意

如果要使用 kustomize 清单以外的工具通过 MicroShift API 进行配置更改或部署应用程序,您必须等待 greenboot 健康检查完成。这可确保,如果 greenboot 将 rpm-ostree 系统回滚回较早的状态,您的更改不会丢失。

1.2. MicroShift YAML 配置文件

在启动时,MicroShift 会检查系统范围的 /etc/microshift/ 目录,以获取名为 config.yaml 的配置文件。如果目录中不存在配置文件,则使用内置默认值来启动服务。

您必须使用 MicroShift 配置文件与主机(有时、应用程序和服务设置)结合使用。在调整 MicroShift 集群的设置时,请确保根据需要在 tandem 中配置每个功能。

为方便起见,会自动安装您的输入的 config.yaml.default 文件。

1.2.1. 默认设置

如果您没有创建 config.yaml 文件或使用配置片断 YAML 文件,则会使用默认值。以下示例显示了默认配置设置。

  • 要查看默认值,请运行以下命令:

    $ microshift show-config

    YAML 格式输出的默认值

    apiServer:
      advertiseAddress: 10.44.0.0/32 
    1
    
      auditLog:
        maxFileAge: 0
        maxFileSize: 200
        maxFiles: 10
        profile: Default
      namedCertificates:
        - certPath: ""
          keyPath: ""
          names:
            - ""
      subjectAltNames: []
      tls:
        cipherSuites:
        - ""
        minVersion: VersionTLS12
    debugging:
      logLevel: "Normal"
    dns:
      baseDomain: microshift.example.com
    etcd:
      memoryLimitMB: 0
    ingress:
      certificateSecret: router-certs-default
      clientTLS:
        allowedSubjectPatterns:
        clientCA:
          name: ""
        clientCertificatePolicy: ""
      defaultHTTPVersion: 1
      forwardedHeaderPolicy: ""
      httpCompression:
        mimeTypes:
          - ""
      httpEmptyRequestsPolicy: Respond
      listenAddress:
        - ""
      logEmptyRequests: Log
      ports:
        http: 80
        https: 443
      routeAdmissionPolicy:
        namespaceOwnership: InterNamespaceAllowed
        wildcardPolicy: WildcardPolicyAllowed
      status: Managed
      tlsSecurityProfile:
        type: Intermediate
      tuningOptions:
          clientFinTimeout: "1s"
          clientTimeout: "30s"
          headerBufferBytes: 0
          headerBufferMaxRewriteBytes: 0
          healthCheckInterval: "5s"
          maxConnections: 0
          serverFinTimeout: "1s"
          serverTimeout: "30s"
          threadCount: 0
          tlsInspectDelay: "5s"
          tunnelTimeout: "1h"
    kubelet:
    manifests:
      kustomizePaths:
        - /usr/lib/microshift/manifests
        - /usr/lib/microshift/manifests.d/*
        - /etc/microshift/manifests
        - /etc/microshift/manifests.d/*
    network:
      clusterNetwork:
        - 10.42.0.0/16
      cniPlugin: ""
      multus:
        status: Disabled 
    2
    
      serviceNetwork:
        - 10.43.0.0/16
      serviceNodePortRange: 30000-32767
    node:
      hostnameOverride: ""
      nodeIP: "" 
    3
    
      nodeIPv6: ""
    storage:
      driver: "" 
    4
    
      optionalCsiComponents: 
    5
    
        - ""
    telemetry:
      endpoint: https://infogw.api.openshift.com
      proxy: ""
      status: Enabled

    1
    根据服务网络的地址计算。
    2
    控制 Multus Container Network Interface (CNI)的部署。
    3
    默认路由的 IP 地址。
    4
    默认 null 值部署逻辑卷管理器存储(LVMS)。
    5
    默认 null 值部署 snapshot-controller

1.3. 使用自定义设置

要创建自定义配置,请制作 /etc/microshift/ 目录中提供的 config.yaml.default 文件的副本,请将其重命名为 config.yaml。将此文件保存在 /etc/microshift/ 目录中,然后您可以在启动或重启 MicroShift 前更改预期覆盖默认值的支持的设置。

重要

在更改任何配置设置后,重新启动 MicroShift 使其生效。当 MicroShift 启动时,config.yaml 文件是只读的。

1.3.1. 单独的重启

可能需要单独重启 MicroShift 集群的应用程序和其他可选服务,以便在集群中应用配置更改。例如,在更改某些网络设置时,您必须停止并重启服务和应用程序 pod 以应用这些更改。如需更多信息,请参阅您要完成的任务的每个步骤。

提示

如果您同时添加您需要的所有配置,您可以最小化系统重启。

1.3.2. MicroShift config.yaml 文件的参数和值

下表解释了 MicroShift 配置 YAML 参数以及每个有效值:

Expand
表 1.1. MicroShift config.yaml 参数
字段类型描述

advertiseAddress

string

指定 API 服务器公告给集群成员的 IP 地址的字符串。默认值根据服务网络的地址计算。

auditLog.maxFileAge

number

在自动删除前保留日志文件的时长。maxFileAge 参数中的默认值为 0 表示日志文件永远不会根据年龄删除。可以配置这个值。

auditLog.maxFileSize

number

默认情况下,当 audit.log 文件达到 maxFileSize 限制时,audit.log 文件会被轮转,MicroShift 开始写入新的 audit.log 文件。可以配置这个值。

auditLog.maxFiles

number

保存的日志文件总数。默认情况下,MicroShift 保留 10 个日志文件。创建过量文件时,会删除最旧的文件。可以配置这个值。

auditLog.profile

默认,WriteRequestBodies,AllRequestBodies, 或 None

仅记录读取和写入请求的日志元数据 ;除了 OAuth 访问令牌请求外,不记录请求正文。如果没有指定此字段,则使用 Default 配置集。

namedCertificates

list

使用自定义证书颁发机构定义外部生成的证书和域名。

namedCertificates.certPath

path

证书的完整路径。

namedCertificates.keyPath

path

证书密钥的完整路径。

namedCertificates.names

list

可选。添加显式 DNS 名称列表。允许前导通配符。如果没有提供名称,则会从证书中提取隐式名称。

subjectAltNames

完全限定域名(FQDN),通配符,如 3.0. domain.com、或 IP 地址。

API 服务器证书的主题备用名称。sans 表示证书保护的所有域名和 IP 地址。

tls

list

定义使用的传输协议(TLS)以及允许的密码套件。为公开的 MicroShift API 服务器和内部 control plane 端点提供安全性。

tls.cipherSuites

string

列出 API 服务器接受和服务的密码套件。默认为允许 TLS 规格在 tls.minVersion 参数中设置的密码套件。

tls.minVersion

VersionTLS12VersionTLS13

指定要从 API 服务器提供服务的 TLS 的最低版本。默认值为 VersionTLS12

debugging.logLevel

normal,Debug,Trace, 或 TraceAll

日志详细程度。默认值为 Normal

dns.baseDomain

有效域

集群的基域。所有管理的 DNS 记录都是这个基础的子域。

etcd.memoryLimitMB

number

默认情况下,etcd 根据需要使用尽可能多的内存来处理系统上的负载。但是,在内存受限系统中,可能需要限制在给定时间可以使用 etcd 的内存量。

ingress.certificateSecret

string

对包含由入口控制器提供的默认证书的 secret 的引用。当路由没有指定其自身证书时,会使用 certificateSecret

secret 必须包含以下密钥和数据:

  • tls.crt: 证书文件内容
  • tls.key: 密钥文件内容

如果没有设置这些值,会自动生成并使用通配符证书。该证书对 ingress 控制器 域和 子域 字段有效,证书生成的 CA 会自动与集群的信任存储集成。

任何正在使用的证书都会自动集成到 MicroShift OAuth 服务器中。

ingress.clientTLS

AllowedSubjectPatterns,spec.clientTLS.ClientCA,spec.clientTLS.clientCertificatePolicy

验证客户端对集群和服务的访问。使用这些设置时启用双向 TLS 身份验证。如果您没有为 spec. clientTLS.clientCertificatePolicy 和 spec.clientTLS.ClientCA 所需的子字段设置值,则不会启用客户端 TLS。

ingress.clientTLS.AllowedSubjectPatterns

以 PCRE 语法列出

可选子字段指定与有效客户端证书上可分辨名称匹配的正则表达式列表,以过滤请求。使用此参数使入口控制器根据可分辨的名称拒绝证书。需要 Perl 兼容正则表达式(PCRE)语法。如果配置此字段,它必须包含有效的表达式,否则 MicroShift 服务会失败。至少一种模式必须与客户端证书的可分辨名称匹配;否则,入口控制器拒绝证书,并拒绝连接。

ingress.clientTLS.ClientCA

string

openshift-ingress 命名空间中指定配置映射所需的子字段。配置映射必须包含 CA 证书捆绑包。

ingress.clientTLS.ClientCertificatePolicy

必需可选

必需的子字段,其使用重新加密 TLS 终止和自定义证书创建安全路由。您必须在 PEM 编码文件中有一个证书/密钥对,其中的证书对路由主机有效。ingress 控制器只检查边缘终止和重新加密 TLS 路由的客户端证书。纯文本 HTTP 或 passthrough TLS 路由的证书不会通过此设置检查。

ingress.defaultHTTPVersion

number

决定用于入口的默认 HTTP 版本。默认值为 1,即 HTTP/1.1 协议。

ingress.forwardedHeaderPolicy

附加,替换,IfNone,Never

指定入口控制器何时和如何设置 Forwarded ,X- Forwarded -For,X-Forwarded-Host,X-Forwarded-Port,X-Forwarded-Proto, 和 X-Forwarded-Proto-Version HTTP 标头。默认值为 Append

  • Append 指定入口控制器附加现有的标头。
  • replace 指定入口控制器设置标头并替换任何现有的 ForwardedX-Forwarded requirements 标头。
  • IfNone 指定入口控制器如果尚未设置标头,则它们会被设置。
  • Never 指定入口控制器永远不会设置标头,并保留任何现有的标头。

ingress.httpCompression

object

定义 HTTP 流量压缩的策略。默认没有 HTTP 压缩。

ingress.httpCompression.mimeTypes

数组 或 null

要压缩的 MIME 类型列表。当列表为空时,ingress 控制器不会应用任何压缩。要定义一个列表,请使用 RFC 1341 中的 Content-Type 定义格式,该格式指定了消息正文中数据的类型和子类型,以及数据的原生编码。例如,Content-Type := type \"/\" subtype *[\";\" parameter]

  • Content-Type 的值可以是以下类型之一:application, audio, image, message, multipart, text, video, 或一个自定义类型,前面带有 \"X-\",后跟一个令牌。令牌必须以以下一种方式定义:
  • 令牌是至少一个字符的字符串,不包含空格、控制字符或 tspecials 设置中的任何字符。
  • tspecials set 包含字符 ()\u003c\u003e@、:\\\"/[]?.=
  • Content-Type 中的子类型也是令牌。
  • 子类型后面的可选参数定义为 令牌 \"=\" (令牌 / quoted-string)。
  • quoted-string 在 RFC 822 中定义,用双引号括起,可以包含空格以及除 \\\"CR 以外的任何字符。quoted-string 也可以包含任何单个 ASCII 字符(如果其用以下字符转义): \\."。

并非所有 MIME 类型都受益于压缩,但 HAProxy 使用资源在配置压缩时尝试压缩文件。通常说,文本格式(如 htmlccsjs )可从压缩中受益。将 CPU 资源用于压缩文件类型(如图像、音频和视频)可能并不能获得有限的好处。

ingress.httpEmptyRequestsPolicy

respondIgnore

默认值为 Respond。描述在收到请求前连接超时时应如何处理 HTTP 连接。这些连接通常来自负载平衡器服务的健康状况探测或 Web 浏览器的规范连接,如 预连接

  • 如果将字段设置为 Respond,入口控制器发送 "HTTP 400" 或 "408" 响应,如果启用了访问日志记录,则会在适当的指标中计算连接。
  • 如果字段设置为 Ignore,则入口控制器在不发送响应的情况下关闭连接,记录连接或递增指标。将此字段设置为 Ignore 可能会妨碍对问题或入侵的检测和诊断,特别是在因为网络错误或端口扫描导致超时连接时。在这两种情况下,记录空请求都可用于诊断错误和检测入侵尝试。

ingress.listenAddress

IP 地址、NIC 名称或多个

值默认为主机的整个网络。有效可配置的值是一个列表,可以是单个 IP 地址或 NIC 名称,也可以是多个 IP 地址和 NIC 名称。

ingress.logEmptyRequests

logIgnore

默认值为 Log。指定如何记录接收空请求的连接。这些连接通常源自负载平衡器服务运行状况或 Web 浏览器的规范连接(如 预连接 )的健康探测。日志记录典型的请求可能并不可取,但请求也可能是由网络错误或端口扫描导致的,在这种情况下,日志记录对于诊断错误和检测入侵尝试非常有用。

ingress.ports.http

80

显示的默认端口。可配置。有效值是 1-65535 范围内的单个唯一端口。ports.httpports.https 字段的值不能相同。

ingress.ports.https

443

显示的默认端口。可配置。有效值是 1-65535 范围内的单个唯一端口。ports.httpports.https 字段的值不能相同。

ingress.routeAdmissionPolicy

namespaceOwnershipwildcardPolicy

定义处理新路由声明的策略,如允许或拒绝命名空间之间的声明。默认情况下,允许路由在命名空间间声明相同主机名的不同路径。

ingress.routeAdmissionPolicy.namespaceOwnership

strictInterNamespaceAllowed

描述如何处理跨命名空间的主机名声明。默认值为 InterNamespaceAllowed。指定 Strict 可防止不同命名空间中的路由声明相同的主机名。如果在自定义 MicroShift config.yaml 文件中删除了该值,则会自动设置 InterNamespaceAllowed 值。

  • Strict:不允许路由在命名空间间声明相同的主机名。
  • InterNamespaceAllowed :允许路由在命名空间间声明相同主机名的不同路径。

ingress.routeAdmissionPolicy.wildcardPolicy

WildcardsAllowedWildcardsDisallowed

描述如何使用通配符策略的路由由入口控制器处理。

  • WildcardsAllowed :表示入口控制器接受任何通配符策略的路由。
  • WildcardsDisallowed :表示入口控制器只接受采用 None 通配符策略的路由。将 wildcardPolicyWildcardsAllowed 更新为 WildcardsDisallowed,会导致采用 Subdomain 通配符策略的已接受路由停止工作。这些路由必须重新创建为 None 通配符策略,才能被入口控制器读取。WildcardsDisallowed 是默认设置。

ingress.status

ManagedRemoved

路由器状态.默认值为 Managed

ingress.tlsSecurityProfile

object

指定入口控制器 TLS 连接的设置。如果没有设置,则默认值基于 apiservers.config.openshift.io/cluster 资源。

ingress.tlsSecurityProfile.type

,Intermediate,Modern,Custom

指定 TLS 安全性的配置集类型。默认值为 Intermediate

当使用 OldIntermediateModern配置集类型时,有效的配置集可能会在不同发行版本间有所改变。例如,使用在版本 X.Y.Z 中部署的 Intermediate 配置集的规格,升级到版本 X.Y.Z+1 可能会导致新的配置集配置应用到 ingress 控制器,从而导致一个 rollout 操作。

ingress.tlsSecurityProfile.minTLSVersion

number

指定入口控制器的 TLS 版本。

最低 TLS 版本为 1.1,最大 TLS 版本为 1.3。

  • 加密器和配置的安全配置集的最小 TLS 版本反映在 TLSProfile 状态中。
  • ingress 控制器将 OldCustom 配置集的 TLS 1.0 转换为 1.1

ingress.tuningOptions

对象(object)

指定用于调整入口控制器 pod 性能的选项。

ingress.tuningOptions.clientFinTimeout

带有格式 持续时间的字符串

定义连接在关闭连接前等待客户端响应服务器/后端时保持打开的时长。默认超时为 1s,即 1 秒。

ingress.tuningOptions.clientTimeout

带有格式 持续时间的字符串

定义连接在等待客户端响应时保持打开的时长。默认超时为 30s,即 30 秒。

ingress.tuningOptions.headerBufferBytes

格式为 int32 的整数 ;当启用了 HTTP/2 时,16384 是最小值。

描述为 IngressController 连接会话保留多少内存,以字节为单位。默认值为 32768,以字节为单位。

  • 通常不建议设置此字段,因为 headerBufferBytes 值太小可能会破坏 IngressControllerheaderBufferBytes 值太大可能会导致 IngressController 使用比必要多的内存。

ingress.tuningOptions.headerBufferMaxRewriteBytes

整数,格式化的 int32; 4096 是最小值

描述必须使用 headerBufferBytes 为 HTTP 标头重写和附加 IngressController 连接会话保留多少内存。默认值为 8192 字节。传入的 HTTP 请求仅限于 headerBufferBytes 字节,减去 headerBufferMaxRewriteBytes 字节,这意味着 headerBufferBytes 的值必须大于 headerBufferMaxRewriteBytes 的值。

  • 通常不建议设置此字段,因为 headerBufferMaxRewriteBytes 值可能会破坏 IngressControllerheaderBufferMaxRewriteBytes 值,它们太大可能会导致 IngressController 使用比必要更多的内存。

ingress.tuningOptions.healthCheckInterval: ""

string with pattern: ^(0|((\\.[0-9])? (ns|us| swigs|ms|s|m|h))+)$

默认的 healthCheckInterval 值为 5s,即 5 秒。此参数值定义路由器配置的后端的两个连续健康检查之间等待的时间。允许的最小值为 1s,允许的最大值为 2147483647ms,即 24.85 天。

  • 这个值被全局应用作为所有路由的默认值,但可以被路由注解 router.openshift.io/haproxy.health.check.interval 覆盖每个路由。
  • 需要未签名的持续时间字符串为十进制数字,每个数字都有一个可选的分数和单位后缀,如 300ms1.5h2h45m。有效时间单位是 nsus (或 mtc s U+00B5 或 rhacm s U+03BC)、mssmh
  • 将此参数设置为小于 5s 可能会导致流量因为频繁的 TCP 健康检查和附带 SYN 数据包状态而造成过量流量。
  • 设置此参数值太大可能会导致延迟增加,因为后端服务器不再可用,但还没有检测到。
  • 空或 0 值表示 "no opinion",ingress 控制器会选择一个默认值。请注意,默认值可能会在以后的版本中改变。

ingress.tuningOptions.maxConnections

整数,有效值为: ,0,-1, 和 range 2000-2000000

默认值为 0。 定义每个 HAProxy 进程可以建立的最大同时连接数。增加这个值可让每个入口控制器 pod 以额外的系统资源成本处理更多连接。

  • 如果此字段为空或 0, IngressController 将使用默认值 50000,但默认值可能会在以后的版本中有所变化。
  • 如果值为 1,则 HAProxy 根据运行中容器中的 ulimit 值设置的可用资源动态计算最大值。选择 -1,这意味着 auto,它会计算大量值,因此每个 HAProxy 进程都会与当前默认值 50000 相比产生大量内存用量。
  • 设置大于当前操作系统限制的值可防止 HAProxy 进程启动。
  • 您可以使用以下指标监控路由器容器的内存用量:

    container_memory_working_set_bytes{container=`router`,namespace=`openshift-ingress`}`
  • 您可以使用以下指标监控路由器容器中的独立 'HAProxy'processes 的内存用量:

    container_memory_working_set_bytes{container=`router`,namespace=`openshift-ingress`}/container_processes{container=`router`,namespace=`openshift-ingress`}

ingress.tuningOptions.serverFinTimeout

格式 持续时间的字符串

定义连接在关闭连接前等待服务器或后端响应时保持打开的时长。默认超时为 1s

ingress.tuningOptions.serverTimeout

格式 持续时间的字符串

定义连接在等待服务器或后端响应时保持打开的时长。默认超时为 30s

ingress.tuningOptions.threadCount

形式为 int32 的整数 ;最小值为 1,最大值为 64

定义每个 HAProxy 进程创建的线程数量。默认值为 4。如果此字段为空,则使用默认值。

  • 通常不建议设置此字段。创建更多线程可让每个入口控制器 pod 以更多系统资源成本处理更多连接。增加 HAProxy 线程数量可让入口控制器 pod 在负载下使用更多 CPU 时间,如果设置过高,则可能会耗尽其他 pod。相反,减少线程数量可能会导致入口控制器性能不佳。

ingress.tuningOptions.tlsInspectDelay

格式 持续时间的字符串

定义路由器可以保存数据以查找匹配路由的时长。如果将此间隔设置得太短,则值太短可能会导致路由器恢复到边缘终止的客户端或重新加密路由的默认证书,即使可以使用更好匹配的证书。

  • 默认检查延迟为 5s,对于大多数情况应该已经足够。为高延迟网络增加此配置的值可能会导致 SSL 握手完成延迟。任何配置的值都必须对您的应用程序是透明的。

ingress.tuningOptions.tunnelTimeout

格式 持续时间的字符串

定义隧道连接(包括 websocket)在隧道闲置时保持打开的时长。默认超时为 1h,即 1 小时。

kubelet

请参阅 MicroShift 低延迟指令

kubelet 节点代理的 passthrough 配置参数。用于低延迟配置。默认值为 null。

清单

路径列表

用于扫描 kustomization 文件的位置,用于加载清单。设置为仅扫描这些路径的路径列表。设置为空列表以禁用加载清单。列表中的条目可以是 glob 模式,以匹配多个子目录。默认值为 /usr/lib/microshift/manifests/usr/lib/microshift/manifests.d//etc/microshift/manifests/etc/microshift/manifests.d/

network.clusterNetwork

IP 地址块

从中分配 Pod IP 地址的 IP 地址块。IPv4 是默认网络。支持双栈条目。此字段中的第一个条目在 MicroShift 启动后是不可变的。默认范围为 10.42.0.0/16

network.cniPlugin

字符串

当为空或设置为 "ovnk" 时,将 Open Virtual Networking - Kubernetes (OVN-K)网络插件部署为默认容器网络接口(CNI)。支持的值为空,"""ovnk "。设置为 "none" 可删除 CNI,我们不建议这样做。只有 OVN-K 由 MicroShift 管理。

network.multus.status

string

控制 Multus Container Network Interface (CNI)的部署。默认状态为 Disabled。如果将值设为 Enabled,则无法删除 Multus CNI。

network.serviceNetwork

IP 地址块

Kubernetes 服务的虚拟 IP 地址块。服务的 IP 地址池.IPv4 是默认设置。支持双栈条目。此字段中的第一个条目在 MicroShift 启动后是不可变的。默认范围为 10.43.0.0/16

network.serviceNodePortRange

range

端口范围允许用于 NodePort 类型的 Kubernetes 服务。如果没有指定范围,则使用默认范围 30000-32767。没有指定 NodePort 的服务会自动从这个范围内分配一个。这个参数可以在 MicroShift 启动后更新。

node.hostnameOverride

string

节点的名称。默认值为 hostname。如果非空,则使用此字符串来识别节点,而不是主机名。此值在 MicroShift 启动后是不可变的。

node.nodeIP

IPv4 地址

节点的 IPv4 地址。默认值是默认路由的 IP 地址。

nodeIPv6

IPv6 地址

用于双栈配置的节点的 IPv6 地址。无法在单个堆栈中为 IPv4 或 IPv6 配置。默认值为空值或 null。

storage.driver

nonelvms

默认值为空。空值或 null 字段默认为 LVMS 部署。

storage.optionalCsiComponents

数组

默认值为 null 或空数组。null 或空数组默认为部署 snapshot-controller。预期值为 csi-snapshot-controllernone。值 none 与所有其他值相互排斥。

telemetry.endpoint

https://infogw.api.openshift.com

发送遥测数据的端点。报告的指标中没有包括用户或私有数据。默认值为 https://infogw.api.openshift.com

telemetry.status

Enabled

Telemetry 状态,可以是 EnabledDisabled。默认值为 Enabled

1.3.3. 使用配置片断

如果要配置一个或多个设置,如添加主题备用名称(SAN),您可以使用 /etc/microshift/config.d/ 配置目录来丢弃配置片断 YAML 文件。您必须重启 MicroShift 才能应用新配置。

要返回前面的值,您可以删除配置片断并重启 MicroShift。

1.3.3.1. 配置片断如何工作

在运行时,/etc/microshift/config.d 中的 YAML 文件合并到现有的 MicroShift 配置中,无论配置是否为默认值或用户创建的 config.yaml 文件。您不需要创建 config.yaml 文件来使用配置片断。

代码片段目录中的文件按字典顺序排序,并按顺序运行。您可以对代码片段使用数字前缀,以便按您想要的顺序读取每个项。当同一参数有多个 YAML 时,最后一个读取文件具有优先权。

重要

配置片断优先于默认值和自定义 config.yaml 配置文件。

1.3.3.2. 列出配置片断示例

列表或数组不会被合并,它们会被覆盖。例如,您可以通过为第一个字段之后读取的同一字段创建额外的片断来替换 SAN 或 SAN 列表:

MicroShift 配置目录内容

  • /etc/microshift/config.yaml.default/etc/microshift/config.yaml

MicroShift 配置片断目录内容示例

  • /etc/microshift/config.d/10-san.yaml
  • /etc/microshift/config.d/20-san.yaml

    示例 10-san.yaml 片断

    apiServer:
      subjectAltNames:
        - host1
        - host2

    20-san.yaml 片断示例

    apiServer:
      subjectAltNames:
        - hostZ

    配置结果示例

    apiServer:
      subjectAltNames:
        - hostZ

如果要在现有列表中添加值,您可以将其添加到现有片断中。例如,要将 hostZ 添加到现有 SAN 列表中,请编辑您已有的代码片段,而不是创建新端口:

示例 10-san.yaml 片断

apiServer:
  subjectAltNames:
    - host1
    - host2
    - hostZ

配置结果示例

apiServer:
  subjectAltNames:
    - host1
    - host2
    - hostZ

1.3.3.3. 对象配置片断示例

对象合并在一起。

10-advertiseAddress.yaml 片断示例

apiServer:
  advertiseAddress: "microshift-example"

20-audit-log.yaml 片断示例

apiServer:
  auditLog:
    maxFileAge: 12

配置结果示例

apiServer:
  advertiseAddress: "microshift-example"
  auditLog:
    maxFileAge: 12

1.3.3.4. 混合配置片断示例

在本例中,advertiseAddressauditLog.maxFileAge 字段的值都合并到配置中,但只有 c.comd.com subjectAltNames 值会被保留,因为文件名中的编号表示它们具有更高的优先级。

10-advertiseAddress.yaml 片断示例

apiServer:
  advertiseAddress: "microshift-example"

20-audit-log.yaml 片断示例

apiServer:
  auditLog:
    maxFileAge: 12

30-SAN.yaml 片断示例

apiServer:
  subjectAltNames:
    - a.com
    - b.com

40-SAN.yaml 片断示例

apiServer:
  subjectAltNames:
    - c.com
    - d.com

配置结果示例

apiServer:
  advertiseAddress: "microshift-example"
  auditLog:
    maxFileAge: 12
  subjectAltNames:
    - c.com
    - d.com

1.3.4. 配置广告地址网络标记

apiserver.advertiseAddress 标志指定将 API 服务器公告给集群成员的 IP 地址。此地址必须可以被集群访问。您可以在此处设置自定义 IP 地址,但还必须将 IP 地址添加到主机接口。自定义此参数 preempts MicroShift,不向 br-ex 网络接口添加默认 IP 地址。

重要

如果您自定义 advertiseAddress IP 地址,请确保集群可在 MicroShift 启动时通过添加 IP 地址到主机接口来访问它。

如果未设置,则默认值将在服务网络后设置为下一个直接子网。例如,当服务网络为 10.43.0.0/16 时,advertiseAddress 被设置为 10.44.0.0/32

1.3.5. 为 NodePort 服务扩展端口范围

serviceNodePortRange 设置扩展可用于 NodePort 服务的端口范围。当需要公开 30000-32767 范围下的特定标准端口时,这个选项很有用。例如,如果您的设备需要公开网络上的 1883/tcp MQ 遥测传输(MQTT)端口,因为客户端设备无法使用不同的端口。

重要

NodePort 可以与系统端口重叠,从而导致系统或 MicroShift 出现故障。

在配置 NodePort 服务范围时请考虑以下几点:

  • 不要在没有明确选择了 nodePort 的情况下创建任何 NodePort 服务。如果没有指定显式 nodePort,则端口由 kube-apiserver 随机分配,且无法预测。
  • 不要为在设备 HostNetwork 上公开的系统服务端口、MicroShift 端口或其他服务创建任何 NodePort 服务。
  • 表一指定在扩展端口范围时要避免的端口:

    Expand
    表 1.2. 避免的端口。
    端口描述

    22/tcp

    SSH 端口

    80/tcp

    OpenShift Router HTTP 端点

    443/tcp

    OpenShift Router HTTPS 端点

    1936/tcp

    openshift-router 的指标服务,目前不会公开

    2379/tcp

    etcd 端口

    2380/tcp

    etcd 端口

    6443

    kubernetes API

    8445/tcp

    openshift-route-controller-manager

    9537/tcp

    cri-o 指标

    10250/tcp

    kubelet

    10248/tcp

    kubelet healthz port

    10259/tcp

    kube 调度程序

第 2 章 配置 IPv6 单或双栈网络

您可以在单堆栈或双栈网络模式中使用 IPv6 网络协议。

2.1. 使用 MicroShift 的 IPv6 网络

MicroShift 服务默认为集群范围的 IPv4 地址系列。但是,支持的平台上提供了 IPv6 单堆栈和 IPv4/IPv6 双栈网络。

  • 当您在 MicroShift 配置文件中为 IPv6 设置值并重启服务时,由 OVN-Kubernetes 网络插件管理的设置会自动更新。
  • 迁移到双栈网络后,新的和现有的 pod 都启用了双栈网络。
  • 如果您需要集群范围的 IPv6 访问,如 control plane 和其他服务,请使用以下配置示例。MicroShift Multus Container Network Interface (CNI)插件可以为 pod 启用 IPv6。
  • 对于双栈网络,每个 MicroShift 集群网络和服务网络都支持集群中和服务网络配置参数中的两个值。
重要

第一次启动 MicroShift 前,计划 IPv6。除非将集群从默认的单堆栈迁移到双栈网络,否则不支持将集群切换到不同的 IP 系列。

如果为 IPv6 单一堆栈或 IPv4/IPv6 双堆栈配置网络,您必须重启应用程序 pod 和服务。否则,Pod 和服务仍使用默认 IP 系列配置。

2.2. 配置 IPv6 单堆栈网络

您可以通过更新 MicroShift 服务配置文件来使用 IPv6 网络协议。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 有对集群的 root 访问权限。
  • 集群使用 OVN-Kubernetes 网络插件。
  • 主机具有 IPv6 地址和 IPv6 路由,包括默认值。

流程

  1. 如果您还没有这样做,请在 /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,将它重命名为 config.yaml
  2. 将新的 MicroShift config.yaml 保留在 /etc/microshift/ 目录中。MicroShift 服务每次启动时都会读取 config.yaml 文件。

    注意

    创建后,config.yaml 文件优先于内置设置。

  3. 将 MicroShift YAML 的 network 部分中的默认值替换为您的有效值。

    单堆栈 IPv6 网络配置示例

    apiServer:
    # ...
    network:
      clusterNetwork:
      - fd01::/48 
    1
    
      serviceNetwork:
      - fd02::/112 
    2
    
    node:
      nodeIP: 2600:1f14:1c48:ee00:2d76:3190:5bc2:5aef 
    3
    
    # ...

    1
    使用小于 64 的 CIDR 值指定 clusterNetwork
    2
    指定一个带有 112 前缀的 IPv6 CIDR。Kubernetes 仅使用最低 16 位。对于前缀 112,IP 地址从 112 分配给 128 位。
    3
    示例节点 IP 地址。有效值为 IPv6 地址系列中的 IP 地址。只有存在 IPv4 网络时,才必须指定 IPv6 地址。如果没有 IPv4 网络,MicroShift 服务会在重启时自动填充这个值。
  4. 运行以下命令完成任何其他配置,然后启动 MicroShift:

    $ sudo systemctl start microshift

验证

  1. 运行以下命令,检索节点资源中定义的网络:

    $ oc get node -o jsonpath='{.items[].spec.podCIDRs[]}'

    输出示例

    fd01::/48

  2. 运行以下命令,检索 pod 的状态:

    $ oc get pod -A -o wide

    输出示例

    NAMESPACE                  NAME                                      READY   STATUS    RESTARTS   AGE   IP                      NODE           NOMINATED NODE   READINESS GATES
    kube-system                csi-snapshot-controller-bb7cb654b-rqrt6   1/1     Running   0          65s   fd01:0:0:1::5           microshift-9   <none>           <none>
    openshift-dns              dns-default-cjn66                         2/2     Running   0          62s   fd01:0:0:1::9           microshift-9   <none>           <none>
    openshift-dns              node-resolver-ppnjb                       1/1     Running   0          63s   2001:db9:ca7:ff::1db8   microshift-9   <none>           <none>
    openshift-ingress          router-default-6d97d7b8b6-wdtmg           1/1     Running   0          61s   fd01:0:0:1::8           microshift-9   <none>           <none>
    openshift-ovn-kubernetes   ovnkube-master-gfvp5                      4/4     Running   0          63s   2001:db9:ca7:ff::1db8   microshift-9   <none>           <none>
    openshift-ovn-kubernetes   ovnkube-node-bnpjh                        1/1     Running   0          63s   2001:db9:ca7:ff::1db8   microshift-9   <none>           <none>
    openshift-service-ca       service-ca-5d7bd9db6-j25bd                1/1     Running   0          60s   fd01:0:0:1::4           microshift-9   <none>           <none>
    openshift-storage          lvms-operator-656cd9b59b-bwr47            1/1     Running   0          63s   fd01:0:0:1::7           microshift-9   <none>           <none>
    openshift-storage          vg-manager-f7dmk                          1/1     Running   0          27s   fd01:0:0:1::a           microshift-9   <none>           <none>

  3. 运行以下命令来检索服务的状态:

    $ oc get svc -A

    输出示例

    NAMESPACE           NAME                            TYPE           CLUSTER-IP   EXTERNAL-IP                                             PORT(S)                      AGE
    default             kubernetes                      ClusterIP      fd02::1      <none>                                                  443/TCP                      3m42s
    openshift-dns       dns-default                     ClusterIP      fd02::a      <none>                                                  53/UDP,53/TCP,9154/TCP       2m58s
    openshift-ingress   router-default                  LoadBalancer   fd02::f2e6   2001:db9:ca7:ff::1db8,fd01:0:0:1::2,fd02::1:0,fd69::2   80:31133/TCP,443:31996/TCP   2m58s
    openshift-ingress   router-internal-default         ClusterIP      fd02::c55e   <none>                                                  80/TCP,443/TCP,1936/TCP      2m58s
    openshift-storage   lvms-operator-metrics-service   ClusterIP      fd02::7afb   <none>                                                  443/TCP                      2m58s
    openshift-storage   lvms-webhook-service            ClusterIP      fd02::d8dd   <none>                                                  443/TCP                      2m58s
    openshift-storage   vg-manager-metrics-service      ClusterIP      fd02::fc1    <none>                                                  443/TCP                      2m58s

2.3. 在 MicroShift 启动前配置 IPv6 双栈网络

您可以在启动该服务前,使用配置文件将 MicroShift 集群配置为在支持 IPv4 和 IPv6 地址系列的双栈网络上运行。

  • 配置中的第一个 IP 系列是集群中的主要 IP 堆栈。
  • 使用双栈网络运行集群后,通过重启双栈来为双栈启用应用程序 pod 和附加服务。
重要

OVN-Kubernetes 网络插件要求 IPv4 和 IPv6 默认路由位于同一个网络设备中。不支持独立网络设备上的 IPv4 和 IPv6 默认路由。

重要

当使用需要 IPv6 的双栈网络时,您无法使用 IPv4 映射 IPv6 地址,如 ::FFFF:198.51.100.1

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 有对集群的 root 访问权限。
  • 集群使用 OVN-Kubernetes 网络插件。
  • 主机同时具有 IPv4 和 IPv6 地址和路由,包括每个地址的默认地址。
  • 主机至少有两个 L3 网络,即 IPv4 和 IPv6。

流程

  1. 如果您还没有这样做,请在 /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,将它重命名为 config.yaml
  2. 将新的 MicroShift config.yaml 保留在 /etc/microshift/ 目录中。MicroShift 服务每次启动时都会读取 config.yaml 文件。

    注意

    创建后,config.yaml 文件优先于内置设置。

  3. 如果您还没有启动 MicroShift,请将 MicroShift YAML 的 network 部分中的默认值替换为您的有效值。

    带有网络分配的双栈 IPv6 网络配置示例

    apiServer:
    # ...
    apiServer:
      subjectAltNames:
      - 192.168.113.117
      - 2001:db9:ca7:ff::1db8
    network:
      clusterNetwork:
      - 10.42.0.0/16
      - fd01::/48 
    1
    
      serviceNetwork:
      - 10.43.0.0/16
      - fd02::/112 
    2
    
    node:
      nodeIP: 192.168.113.117 
    3
    
      nodeIPv6: 2001:db9:ca7:ff::1db8 
    4
    
    # ...

    1
    使用小于 64 的 CIDR 值指定 IPv6 clusterNetwork
    2
    指定一个带有 112 前缀的 IPv6 CIDR。Kubernetes 仅使用最低 16 位。对于前缀 112,IP 地址从 112 分配给 128 位。
    3
    示例节点 IP 地址。必须是 IPv4 地址系列。
    4
    dual-stack 配置的节点 IP 地址示例。必须是 IPv6 地址系列。仅使用双栈网络进行配置。
  4. 运行以下命令,完成任何其他 MicroShift 配置,然后启动 MicroShift:

    $ sudo systemctl start microshift
  5. 根据需要重置应用 pod 和服务的 IP 系列策略,然后重新启动这些应用 pod 和服务,以启用双栈网络。如需简单示例,请参阅"为应用程序 pod 和服务重置 IP 系列策略"。

验证

  1. 您可以按照以下步骤验证所有系统服务和 pod 是否具有两个 IP 地址,每个系列一个:

    1. 运行以下命令,检索节点资源中定义的网络:

      $ oc get pod -n openshift-ingress router-default-5b75594b4-w7w6s -o jsonpath='{.status.podIPs}'

      输出示例

      [{"ip":"10.42.0.4"},{"ip":"fd01:0:0:1::4"}]

    2. 运行以下命令,检索主机网络 pod 定义的网络:

      $ oc get pod -n openshift-ovn-kubernetes ovnkube-master-2fm2k -o jsonpath='{.status.podIPs}'

      输出示例

      [{"ip":"192.168.113.117"},{"ip":"2001:db9:ca7:ff::1db8"}]

2.4. 将 MicroShift 集群迁移到 IPv6 双栈网络

您可以通过在 MicroShift 配置文件中设置两个条目,将单堆栈集群转换为支持 IPv4 和 IPv6 地址系列的双栈网络。

  • 配置中的第一个 IP 系列是集群中的主要 IP 堆栈。
  • MicroShift 系统 pod 和服务会在 MicroShift 重启时自动更新。
  • 在集群迁移到双栈网络并重启时,通过重启双栈网络来启用工作负载 pod 和服务。
重要

OVN-Kubernetes 网络插件要求 IPv4 和 IPv6 默认路由位于同一个网络设备中。不支持独立网络设备上的 IPv4 和 IPv6 默认路由。

重要

当使用需要 IPv6 的双栈网络时,您无法使用 IPv4 映射 IPv6 地址,如 ::FFFF:198.51.100.1

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 有对集群的 root 访问权限。
  • 集群使用 OVN-Kubernetes 网络插件。
  • 主机同时具有 IPv4 和 IPv6 地址和路由,包括每个地址的默认地址。
  • 主机至少有两个 L3 网络,即 IPv4 和 IPv6。

流程

  1. 如果您还没有这样做,请在 /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,将它重命名为 config.yaml
  2. 将新的 MicroShift config.yaml 保留在 /etc/microshift/ 目录中。MicroShift 服务每次启动时都会读取 config.yaml 文件。

    注意

    创建后,config.yaml 文件优先于内置设置。

  3. 使用您的有效值在 MicroShift YAML 的 network 部分添加 IPv6 配置:

    警告

    您必须在重启和迁移后保留相同的第一个条目。对于任何迁移而言,这是正确的:单到双堆栈或双到单一堆栈。如果需要更改第一个条目,则需要完全擦除 etcd 数据库。这可能会导致应用程序数据丢失且不受支持。

    1. 使用您的有效值,在 MicroShift YAML 的 network 部分为第二个网络添加 IPv6 配置。
    2. 将网络分配添加到 MicroShift config.yamlnetwork 部分,以启用将 IPv6 作为二级网络的双堆栈。

      带有网络分配的双栈 IPv6 配置示例

      # ...
      apiServer:
        subjectAltNames:
        - 192.168.113.117
        - 2001:db9:ca7:ff::1db8 
      1
      
      network:
        clusterNetwork:
        - 10.42.0.0/16 
      2
      
        - fd01::/48 
      3
      
        serviceNetwork:
        - 10.43.0.0/16
        - fd02::/112 
      4
      
      node:
        nodeIP: 192.168.113.117 
      5
      
        nodeIPv6: 2001:db9:ca7:ff::1db8 
      6
      
      # ...

      1
      IPv6 节点地址。
      2
      IPv4 网络。使用小于 24 的 CIDR 值指定 clusterNetwork
      3
      IPv6 网络。使用小于 64 的 CIDR 值指定 clusterNetwork
      4
      指定一个带有 112 前缀的 IPv6 CIDR。Kubernetes 仅使用最低 16 位。对于前缀 112,IP 地址从 112 分配给 128 位。
      5
      示例节点 IP 地址。维护前面的 IPv4 IP 地址。
      6
      示例节点 IP 地址。必须是 IPv6 地址系列。
  4. 运行以下命令完成任何其他配置,然后重启 MicroShift:

    $ sudo systemctl restart microshift
  5. 根据需要重置应用 pod 和服务的 IP 系列策略,然后重新启动这些应用 pod 和服务,以启用双栈网络。如需简单示例,请参阅"为应用程序 pod 和服务重置 IP 系列策略"。

验证

您可以按照以下步骤验证所有系统服务和 pod 是否具有两个 IP 地址,每个系列一个:

  1. 运行以下命令,检索 pod 的状态:

    $ oc get pod -A -o wide

    输出示例

    NAMESPACE                  NAME                                      READY   STATUS    RESTARTS        AGE     IP                NODE           NOMINATED NODE   READINESS GATES
    kube-system                csi-snapshot-controller-bb7cb654b-7s5ql   1/1     Running   0               46m     10.42.0.6         microshift-9   <none>           <none>
    openshift-dns              dns-default-zxkqn                         2/2     Running   0               46m     10.42.0.5         microshift-9   <none>           <none>
    openshift-dns              node-resolver-r2h5z                       1/1     Running   0               46m     192.168.113.117   microshift-9   <none>           <none>
    openshift-ingress          router-default-5b75594b4-228z7            1/1     Running   0               2m5s    10.42.0.3         microshift-9   <none>           <none>
    openshift-ovn-kubernetes   ovnkube-master-bltk7                      4/4     Running   2 (2m32s ago)   2m36s   192.168.113.117   microshift-9   <none>           <none>
    openshift-ovn-kubernetes   ovnkube-node-9ghgs                        1/1     Running   2 (2m32s ago)   46m     192.168.113.117   microshift-9   <none>           <none>
    openshift-service-ca       service-ca-5d7bd9db6-qgwgw                1/1     Running   0               46m     10.42.0.7         microshift-9   <none>           <none>
    openshift-storage          lvms-operator-656cd9b59b-8rpf4            1/1     Running   0               46m     10.42.0.8         microshift-9   <none>           <none>
    openshift-storage          vg-manager-wqmh4                          1/1     Running   2 (2m39s ago)   46m     10.42.0.10        microshift-9   <none>           <none>

  2. 运行以下命令,检索 OVN-K 网络插件定义的网络:

    $ oc get pod -n openshift-ovn-kubernetes ovnkube-master-bltk7 -o jsonpath='{.status.podIPs}'

    输出示例

    [{"ip":"192.168.113.117"},{"ip":"2001:db9:ca7:ff::1db8"}]

  3. 运行以下命令,检索节点资源中定义的网络:

    $ oc get pod -n openshift-ingress router-default-5b75594b4-228z7 -o jsonpath='{.status.podIPs}'

    输出示例

    [{"ip":"10.42.0.3"},{"ip":"fd01:0:0:1::3"}]

注意

要返回单堆栈网络,您可以删除第二个条目到网络,并返回到在迁移到双栈网络之前配置的单个堆栈。

2.5. 为应用 Pod 和服务重置 IP 系列策略

在将 MicroShift 配置更新为双栈网络后,PreferSingleStack 默认 ipFamilyPolicy 配置值不会自动更新。要在服务和应用程序 pod 中启用双栈网络,您必须更新 ipFamilyPolicy 值。

先决条件

  • 您可以使用 MicroShift config.yaml 来定义带有 IPv6 地址系列的双栈网络。

流程

  1. 使用以下示例,将 spec.ipFamilyPolicy 字段设置为服务或 pod 中双栈网络的有效值:

    服务的双栈网络配置示例

    kind: Service
    apiVersion: v1
    metadata:
      name: microshift-new-service
      labels: app: microshift-application
    spec:
      type: NodePort
      ipFamilyPolicy: `PreferDualStack` 
    1
    
    # ...

    1
    必需。双栈网络的有效值为 PreferDualStackRequireDualStack。设定的值取决于您应用程序的要求。PreferSingleStackipFamilyPolicy 字段的默认值。
  2. 重启没有定义 hostNetwork 的任何应用 pod。定义了 hostNetwork 的 Pod 不需要重启来更新 ipFamilyPolicy 值。
注意

ipFamilyPolicy 值被更新时,MicroShift 系统服务和 pod 会被自动更新。

2.6. OVN-Kubernetes IPv6 和双栈限制

OVN-Kubernetes 网络插件有以下限制:

  • 对于为双栈网络配置的集群,IPv4 和 IPv6 流量都必须使用与默认网关相同的网络接口。

    如果不满足此要求,则 ovnkube-node 守护进程集中的主机上的容器集进入 CrashLoopBackOff 状态。

    如果您使用 oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yaml 等命令显示 pod,则 status 字段具有多个有关默认网关的消息,如以下输出所示:

    I1006 16:09:50.985852   60651 helper_linux.go:73] Found default gateway interface br-ex 192.168.127.1
    I1006 16:09:50.985923   60651 helper_linux.go:73] Found default gateway interface ens4 fe80::5054:ff:febe:bcd4
    F1006 16:09:50.985939   60651 ovnkube.go:130] multiple gateway interfaces detected: br-ex ens4

    唯一的解析是重新配置主机网络,以便两个 IP 系列都针对默认网关使用相同的网络接口。

  • 对于为双栈网络配置的集群,IPv4 和 IPv6 路由表必须包含默认网关。

    如果不满足此要求,则 ovnkube-node 守护进程集中的主机上的容器集进入 CrashLoopBackOff 状态。

    如果您使用 oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yaml 等命令显示 pod,则 status 字段具有多个有关默认网关的消息,如以下输出所示:

    I0512 19:07:17.589083  108432 helper_linux.go:74] Found default gateway interface br-ex 192.168.123.1
    F0512 19:07:17.589141  108432 ovnkube.go:133] failed to get default gateway interface

    唯一的解析是重新配置主机网络,以便两个 IP 系列都包含默认网关。

  • 如果您在集群的 MachineConfig 自定义资源(CR)的 kernelArgument 部分中将 ipv6.disable 参数设置为 1,则 OVN-Kubernetes pod 会进入 CrashLoopBackOff 状态。另外,将集群更新至 MicroShift 的更新版本会失败,因为 Network Operator 处于 Degraded 状态。红帽不支持为集群禁用 IPv6 adddresses,因此不要将 ipv6.disable 参数设置为 1

第 3 章 为 MicroShift 集群使用入口控制

使用 MicroShift 配置文件中的 ingress 控制器选项,使 pod 和服务可以被集群外部访问。

3.1. 在 MicroShift 中使用入口控制

在创建 MicroShift 集群时,集群中运行的每个 pod 和服务都会分配一个 IP 地址。默认情况下,这些 IP 地址可以被其他 pod 和服务访问,但外部客户端无法访问。MicroShift 使用 OpenShift Container Platform IngressController API 的最小实现来启用对集群服务的外部访问。

通过更多配置选项,您可以微调 ingress 来满足特定的需求。要使用增强的入口控制,请更新 MicroShift 配置文件中的参数并重启该服务。Ingress 配置以多种方式很有用,例如:

  • 如果您的应用程序开始处理来自客户端的请求,但可以在响应前关闭连接,您可以将配置文件中的 ingress.tuningOptions.serverTimeout 参数设置为更高的值,以容纳来自服务器的响应速度。
  • 如果路由器有很多连接打开,因为集群中运行的应用程序没有正确关闭连接,您可以将 ingress.tuningOptions.serverTimeoutspec.tuningOptions.serverFinTimeout 参数设置为较低值,强制这些连接更早。
  • 如果需要配置 ingress 控制器以验证客户端证书,您可以使用 ingress.clientTLS 参数设置 clientCA 值,这是对配置映射的引用。配置映射包含 PEM 编码的 CA 证书捆绑包,用于验证客户端的证书。另外,您还可以配置证书主题过滤器列表。
  • 如果需要为入口控制器配置 TLS 安全配置集,您可以使用 ingress.tlsSecurityProfile 参数指定默认或自定义单独的 TLS 安全配置集。TLS 安全配置集定义入口控制器的 TLS 连接的最低 TLS 版本和 TLS 密码。如果没有配置 TLS 安全配置集,则默认值基于为 API 服务器设置的 TLS 安全配置集。
  • 如果需要定义处理新路由声明的策略,您可以使用 routeAdmission 参数在命名空间间允许或拒绝声明。您可以设置 routeAdmission 参数来描述应如何处理跨命名空间的主机名声明,并描述如何处理带有通配符策略的路由。

3.2. 在 MicroShift 中配置入口控制

您可以通过更新 MicroShift 服务配置文件或使用配置片断来使用详细的入口控制设置。

重要
  • config.yaml 配置文件优先于内置设置。每次 MicroShift 服务启动时都会读取 config.yaml 文件。
  • 配置片断 YAML 优先于内置设置和 config.yaml 配置文件。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 有对集群的 root 访问权限。
  • 集群使用 OVN-Kubernetes Container Network Interface (CNI)插件。

流程

  1. 使用以下两种方式之一应用入口控制设置:

    1. 通过在 /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,将其命名为 config.yaml 并将其保留在源目录中,来更新 MicroShift config.yaml 配置文件。
    2. 使用配置片段应用您想要的 ingress 控制设置。为此,请创建一个配置片断 YAML 文件,并将其放在 /etc/microshift/config.d/ 配置中。
  2. 将 MicroShift YAML 的 ingress 部分中的默认值替换为您的有效值,或将配置片断文件替换为您需要的部分。

    带有默认值的 Ingress 控制器配置字段

    apiServer:
    # ...
    ingress:
      certificateSecret: router-certs-custom
      clientTLS:
        allowedSubjectPatterns: []
        clientCA:
          name: ""
        clientCertificatePolicy: ""
      defaultHTTPVersion: 1
      forwardedHeaderPolicy: Append
      httpCompression:
        mimeTypes:
          - ""
      httpEmptyRequestsPolicy: Respond
      listenAddress: []
      logEmptyRequests: Log
      ports:
         http: 80
         https: 443
      routeAdmissionPolicy:
        namespaceOwnership: InterNamespaceAllowed
        wildcardPolicy: WildcardsDisallowed
      status: Managed
      tlsSecurityProfile:
        type:
        custom:
          ciphers:[]
          minTLSVersion:""
        intermediate: {}
        old: {}
      tuningOptions:
        clientFinTimeout: 1s
        clientTimeout: 30s
        headerBufferBytes: 0
        headerBufferMaxRewriteBytes: 0
        healthCheckInterval: 5s
        maxConnections: 0
        serverFinTimeout: 1s
        serverTimeout: 30s
        threadCount: 4
        tlsInspectDelay: 5s
        tunnelTimeout: 1h
    # ...

    Expand
    表 3.1. Ingress 控制器配置字段定义表
    参数描述

    ingress

    MicroShift config.yaml 文件的 ingress 部分定义了 OpenShift Container Platform Ingress Control Operator 的实现部分的可配置参数。此表的其余部分中的所有参数都是 config.yamlingress 部分中的子部分。

    certificateSecret

    对包含 MicroShift 入口控制器提供的默认证书的 secret 的 kubernetes.io/tls 类型的引用。当路由没有指定其自身证书时,会使用 certificateSecret 参数。所有使用的 secret 必须包含 tls.key 密钥文件内容和 tls.crt 证书文件内容。

    • 如果没有设置 certificateSecret 参数,则自动生成和使用通配符证书。通配符证书对入口控制器 默认域 及其 子域 有效。生成的证书颁发机构(CA)会自动与集群的信任存储集成。
    • 使用生成和用户指定的证书会自动与 MicroShift 内置 OAuth 服务器集成。

    clientTLS

    验证客户端对集群和服务的访问。因此,启用 mutual TLS 身份验证。如果没有设置,则不启用客户端 TLS。您必须设置 spec.clientTLS.clientCertificatePolicyspec.clientTLS.ClientCA 参数才能使用客户端 TLS。

    clientTLS.AllowedSubjectPatterns

    可选子字段指定与有效客户端证书上可分辨名称匹配的正则表达式列表,以过滤请求。使用此参数使入口控制器根据可分辨的名称拒绝证书。需要 Perl 兼容正则表达式(PCRE)语法。

    重要

    配置后,此字段必须包含有效的表达式,或者 MicroShift 服务失败。至少一种模式必须与客户端证书的可分辨名称匹配;否则,入口控制器拒绝证书,并拒绝连接。

    clientTLS.clientCA

    指定 openshift-ingress 命名空间中的所需配置映射。需要此项以启用客户端 TLS。配置映射必须包含名为 ca-bundle.pem 的证书颁发机构(CA)捆绑包,或者默认路由器部署失败。

    clientTLS.ClientCA.name

    clientTLS.ClientCA 值中引用的配置映射的 metadata.name

    clientTLS.ClientCertificatePolicy

    必需可选 是有效的值。设置为 Required 以启用客户端 TLS。入口控制器只检查边缘终止和重新加密的 TLS 路由的客户端证书。入口控制器无法检查纯文本 HTTP 或 passthrough TLS 路由的证书。

    defaultHTTPVersion

    为入口控制器设置 HTTP 版本。HTTP 1.1 的默认值为 1

    forwardedHeaderPolicy

    指定入口控制器何时和如何设置 Forwarded ,X- Forwarded -For,X-Forwarded-Host,X-Forwarded-Port,X-Forwarded-Proto, 和 X-Forwarded-Proto-Version HTTP 标头。以下值有效:

    • Append 通过指定入口控制器附加它们来保留任何现有标头。'append' 是默认值。
    • replace 通过指定入口控制器设置标头来删除任何现有标头。
    • IfNone 通过指定入口控制器设置标头(如果未设置标头)来设置标头。
    • 永远不会 通过指定入口控制器来保留任何现有的标头,从而永远不会设置标头。

    httpCompression

    定义 HTTP 流量压缩的策略。

    httpCompression.mimeTypes

    定义应将压缩应用到的 MIME 类型列表。

    • 例如: text/css; charset=utf-8,text/html,text configured, image/svg+xml,application/octet-stream,X-custom/customsub, in the, type/subtype; [;attribute=value] 格式。
    • 有效 类型包括 :application, image, message, multipart, text, video, 或一个自定义类型,前是 X-。要查看 MIME 类型和子类型的完整表示法,请参阅 RFC1341 (IETF Datatracker 文档)。

    httpEmptyRequestsPolicy

    描述在收到请求前连接超时时如何处理 HTTP 连接。此字段允许的值是 RespondIgnore。默认值为 Respond。空请求通常来自负载均衡器健康探测或预分配,通常可以忽略。但是,这些请求也可能由网络错误和端口扫描导致。因此,将此字段设置为 Ignore 可妨碍检测或诊断网络问题,并检测入侵尝试。

    • 当策略设置为 Respond 时,入口控制器发送 HTTP 400408 响应,在启用了访问日志时记录连接,并在适当的指标中统计连接。
    • 当策略设置为 Ignore 时,http-ignore-probes 参数将添加到 HAproxy 进程配置中。添加此参数后,ingress 控制器会在不发送响应的情况下关闭连接,然后记录连接或递增指标。

    logEmptyRequests

    指定没有接收和记录请求的连接。logIgnore 是有效的值。空请求通常来自负载均衡器健康探测或预分配,通常可以忽略。但是,这些请求也可能由网络错误和端口扫描导致。因此,将此字段设置为 Ignore 可妨碍检测或诊断网络问题,并检测入侵尝试。默认值为 Log

    • 将此值设置为 Log 表示应记录事件。
    • 将此值设置为 Ignore 会在 HAproxy 配置中设置 dontlognull 选项。

    ports

    定义默认路由器端口。

    ports.http

    默认路由器 http 端口。必须在 1-65535 之间。默认值为 80

    ports.https

    默认路由器 https 端口。必须在 1-65535 之间。默认值为 443。

    routeAdmission

    定义处理新路由声明的策略,如允许或拒绝命名空间之间的声明。

    routeAdmission.namespaceOwnership

    描述如何处理跨命名空间的主机名声明。默认为 InterNamespaceAllowed。以下是有效值:

    • 严格 不允许路由在命名空间间声明相同的主机名。
    • InterNamespaceAllowed 允许路由在命名空间间声明相同主机名的不同路径。

    routeAdmission.wildcardPolicy

    控制 Ingress 控制器如何处理配置通配符策略的路由。WildcardsAllowedWildcardsDisallowed 是有效的值。默认值为 WildcardsDisallowed

    • WildcardPolicyAllowed 表示入口控制器接受任何通配符策略的路由。
    • WildcardPolicyDisallowed 表示只有带有 None 通配符策略的路由才会被入口控制器接受。
    重要

    将通配符策略从 WildcardsAllowed 更改为 WildcardsDisallowed 会导致接受路由具有 子域的 通配符策略停止工作。这些路由必须重新创建为 None 通配符策略,才能被入口控制器读取。

    status

    默认路由器状态。ManagedRemoved 是有效的值。

    tlsSecurityProfile

    tlsSecurityProfile 指定入口控制器的 TLS 连接的设置。如果没有设置,则默认值基于 apiservers.config.openshift.io/cluster 资源。OldCustom 配置集的 TLS 1.0 版本由入口控制器自动转换为 1.1intermediate 是默认设置。

    • 入口控制器的最低 TLS 版本是 1.1。最大 TLS 版本为 1.3。
    注意

    加密器和配置的安全配置集的最小 TLS 版本反映在 TLSProfile 状态中。当开发新的密码且发现现有密码不安全时,配置集会被有意改变。根据特定进程可以使用哪些密码,可以减少可用的列表。

    tlsSecurityProfile.custom

    用户定义的 TLS 安全配置集。如果您配置此参数和相关参数,请使用非常小心。

    tlsSecurityProfile.custom.ciphers

    指定在 TLS 握手过程中协商的加密算法。Operator 可能会删除其操作对象不支持的条目。

    tlsSecurityProfile.custom.minTLSVersion

    指定 TLS 握手期间协商的 TLS 协议的最小版本。例如,要使用 TLS 版本 1.1、1.2 和 1.3,请将值设为 VersionTLS11minTLSVersion 的最高有效值为 VersionTLS12

    tlsSecurityProfile.intermediate

    此 TLS 配置集可用于大多数服务。中间兼容性(推荐)

    tlsSecurityProfile.old

    用于向后兼容。旧的向后兼容性

    tlsSecurityProfile.type

    有效值为 IntermediateOldCustom。不支持 Modern 值。

    tuningOptions

    指定用于调整入口控制器 pod 性能的选项。

    tuningOptions.clientFinTimeout

    指定连接在等待客户端响应关闭连接时保持打开的时长。默认超时为 1s

    tuningOptions.clientTimeout

    指定连接在等待客户端响应时保持打开的时长。默认超时为 30s

    tuningOptions.headerBufferBytes

    为 ingress 控制器连接会话指定保留多少内存(以字节为单位)。如果为 ingress 控制器启用了 HTTP/2,则必须至少为 16384。如果没有设置,则默认值为 32768 字节。

    重要

    不建议设置此字段,因为 headerBufferMaxRewriteBytes 参数值太小可能会破坏入口控制器。相反,headerBufferMaxRewriteBytes 的值太大可能会导致入口控制器使用比必要更多的内存。

    tuningOptions.headerBufferMaxRewriteBytes

    指定在 HTTP 标头重写和附加 ingress 控制器连接会话时,应保留多少内存(以字节为单位)。headerBufferMaxRewriteBytes 的最小值是 4096headerBufferBytes 必须大于传入的 HTTP 请求的 headerBufferMaxRewriteBytes 值。如果没有设置,则默认值为 8192 字节。

    重要

    不建议设置此字段,因为 headerBufferMaxRewriteBytes 值太小可能会破坏入口控制器和 headerBufferMaxRewriteBytes,它们太大可能会导致入口控制器使用比必要更多的内存。

    tuningOptions.healthCheckInterval

    指定路由器在健康检查之间等待的时间(以秒为单位)。默认值为 5s

    tuningOptions.maxConnections

    指定可为每个 HAProxy 进程建立的最大同时连接数。增加这个值可让每个入口控制器 pod 以额外的系统资源成本处理更多连接。允许的值是 0-1、以及范围为 20002000000 内的任何值,或者字段可以留空。

    • 如果此字段为空或者值为 0, 入口控制器将使用默认值 50000
    • 如果字段的值为 -1,则 HAProxy 进程会根据运行中容器中的可用 ulimits 动态计算最大值。与当前默认值 50000 相比,此进程会产生大量内存用量。
    • 如果字段的值大于当前操作系统限制,则 HAProxy 进程不会启动。
    • 如果您选择了一个离散值,并且路由器 pod 迁移到新节点,则新节点可能没有配置相同的 ulimit。在这种情况下,pod 无法启动。
    • 如果您配置了不同的 ulimits 的节点,并且选择了离散值,您可以将 -1 的值用于此字段,以便在运行时计算最大连接数。
    • 您可以使用 container_memory_working_set_bytes{container="router",namespace="openshift-ingress"} 指标监控路由器容器的内存用量。
    • 您可以使用 container_memory_ working_set_bytes{container="router",namespace="openshift-ingress",container_processes{container="router",namespace="openshift-ingress",namespace="openshift-ingress"} 指标来监控路由器 容器中的独立 HAProxy 进程。

    tuningOptions.serverFinTimeout

    指定连接在等待服务器响应关闭连接时保持打开的时长。默认超时为 1s

    tuningOptions.serverTimeout

    指定连接在等待服务器响应时保持打开的时长。默认超时为 30s

    tuningOptions.threadCount

    指定每个 HAProxy 进程创建的线程数量。创建更多线程可让每个入口控制器 pod 处理更多连接,而代价会增加所使用的系统资源。HAProxy 负载均衡器支持最多 64 个线程。如果此字段为空,入口控制器将使用默认值 4 个线程。

    重要

    不建议设置此字段,因为增加 HAProxy 线程数量允许入口控制器 pod 在负载下使用更多 CPU 时间,并防止其他 pod 接收需要执行的 CPU 资源。减少线程数量可能会导致入口控制器性能不佳。

    tuningOptions.tlsInspectDelay

    指定路由器可以保存数据以查找匹配路由的时长。将此值设置为低时,可能会导致路由器回退到边缘终止、重新加密或透传路由的默认证书,即使在使用更好匹配的证书时也是如此。默认检查延迟为 5s

    tuningOptions.tunnelTimeout

    指定隧道连接(包括 websocket)在隧道闲置期间保持打开的时长。默认超时为 1h

  3. 运行以下命令完成任何其他配置,然后启动或重启 MicroShift:

    $ sudo systemctl start microshift
    $ sudo systemctl restart microshift

验证

在进行 ingress 配置更改并重启 MicroShift 后,您可以检查路由器 Pod 的年龄,以确保应用了更改。

  • 要检查路由器 pod 的状态,请运行以下命令:

    $ oc get pods -n openshift-ingress

    输出示例

    NAME                              READY   STATUS    RESTARTS   AGE
    router-default-8649b5bf65-w29cn   1/1     Running   0          6m10s

使用这个流程创建由 MicroShift 配置文件中的 certificateSecret 参数值引用的 secret。此 secret 包含由入口控制器提供的默认证书。

注意

任何使用的证书都会自动与 MicroShift 内置 OAuth 服务器集成。

先决条件

  • 有对 MicroShift 的 root 访问权限。
  • 已安装 OpenShift CLI(oc)。
  • 您的私钥没有加密,或者您已解密它以导入到 MicroShift 中。

流程

  1. 创建包含通配符证书链和密钥的 secret :

    $ oc create secret tls <secret> 
    1
    
         --cert=</path/to/cert.crt> 
    2
    
         --key=</path/to/cert.key> 
    3
    
         -n openshift-ingress
    1
    <secret > 是包含证书链和私钥的 secret 名称。
    2
    </path/to/cert.crt> 是证书链在本地文件系统中的路径。
    3
    </path/to/cert.key> 是与此证书关联的私钥的路径。
    重要

    证书必须包含显示 *.apps.<clustername>.<domain>subjectAltName 扩展。

  2. 使用新创建的 secret 更新 MicroShift 配置 YAML 中的 certificateSecret 参数值。
  3. 运行以下命令完成任何其他配置,然后启动或重启 MicroShift:

    $ sudo systemctl start microshift
    $ sudo systemctl restart microshift

3.2.2. 为入口控制器配置 TLS 安全配置集

您可以通过在 MicroShift 配置 YAML 中设置类型,为 ingress 控制器配置 TLS 安全配置集。

先决条件

  • 有对 MicroShift 集群的 root 访问权限。

流程

  1. 在 MicroShift YAML 配置文件中添加 spec.tlsSecurityProfile 字段。

     ...
    spec:
      tlsSecurityProfile:
        type: Custom 
    1
    
        custom: 
    2
    
          ciphers: 
    3
    
          - ECDHE-ECDSA-CHACHA20-POLY1305
          - ECDHE-RSA-CHACHA20-POLY1305
          - ECDHE-RSA-AES128-GCM-SHA256
          - ECDHE-ECDSA-AES128-GCM-SHA256
          minTLSVersion: VersionTLS11
     ...
    1
    指定 TLS 安全配置集类型(OldIntermediateCustom)。默认值为 Intermediate
    2
    为所选类型指定适当的字段:
    • old: {}
    • intermediate: {}
    • custom:
    3
    对于 custom 类型,请指定 TLS 密码列表和最低接受的 TLS 版本。
    警告

    如果您选择 自定义 TLS 配置,请使用非常小心。使用自签名 TLS 证书可能会带来安全风险。

  2. 保存文件以使改变生效。
  3. 运行以下命令重启 MicroShift:

    $ sudo systemctl restart microshift

第 4 章 禁用 LVMS CSI 供应商或 CSI 快照

您可以将 MicroShift 配置为禁用内置逻辑卷管理器存储(LVMS) Container Storage Interface (CSI)供应商或 CSI 快照功能,以减少运行时资源的使用,如 RAM、CPU 和存储。

4.1. 禁用运行 CSI 快照实现的部署

使用以下步骤禁用 CSI 实现 pod 的安装。

重要

此流程适用于在安装和运行 MicroShift 前定义配置文件的用户。如果 MicroShift 已启动,则 CSI 快照实现将正在运行。用户必须按照卸载说明手动删除它。

注意

MicroShift 不会删除 CSI 快照实现 pod。您必须将 MicroShift 配置为在引导过程中禁用 CSI 快照实现 pod 的安装。

流程

  1. 通过在 /etc/microshift/config.yaml 中的 MicroShift 配置文件的 storage 部分下输入 optionalCsiComponents 值来禁用 CSI 快照控制器的安装:

    # ...
      storage: {} 
    1
    
    # ...
    1
    接受的值是:
    • 没有定义 可选CsiComponents
    • 使用空值([])或单个空字符串元素([""])指定 optionalCsiComponents 字段。
    • 使用 snapshot-controllernone 之一指定 可选CsiComponents。值 none 与所有其他值相互排斥。

      注意

      如果 optionalCsiComponents 值为空或 null,MicroShift 默认为部署 snapshot-controller。

  2. 使用 config.yaml 中的支持值指定 optionalCsiComponents 字段后,运行以下命令启动 MicroShift:

    $ sudo systemctl start microshift
    注意

    MicroShift 重启后不会重新部署禁用的组件。

4.2. 禁用运行 CSI 驱动程序实现的部署

使用以下步骤禁用 CSI 实现 pod 的安装。

重要

此流程适用于在安装和运行 MicroShift 前定义配置文件的用户。如果 MicroShift 已启动,则 CSI 驱动程序实现将正在运行。用户必须按照卸载说明手动删除它。

注意

MicroShift 不会删除 CSI 驱动程序实现 pod。您必须将 MicroShift 配置为在引导过程中禁用 CSI 驱动程序实现 pod 的安装。

流程

  1. 通过在 /etc/microshift/config.yaml 中的 MicroShift 配置文件的 storage 部分输入 驱动程序 值来禁用 CSI 驱动程序的安装:

    # ...
      storage
       driver:
       - "none" 
    1
    
    # ...
    1
    有效值为 nonelvms
    注意

    默认情况下,驱动程序 值为空或 null,其中 LVMS 被部署。

  2. 运行以下命令,在 driver 字段指定了 /etc/microshift/config.yaml 文件中的支持值后启动 MicroShift:

    $ sudo systemctl enable --now microshift
    注意

    MicroShift 在重启操作后不会重新部署禁用的组件。

第 5 章 检查 greenboot 脚本状态

要使用 kustomize 清单以外的工具通过 MicroShift API 部署应用程序或进行其他更改,您必须等待 greenboot 健康检查完成。这可确保,如果 greenboot 将 rpm-ostree 系统回滚回较早的状态,您的更改不会丢失。

greenboot-healthcheck 服务运行一次,然后退出。在 greenboot 退出并且系统处于健康状态后,您可以继续配置更改和部署。

5.1. 检查 greenboot 健康检查的状态

在对系统进行更改或故障排除期间,检查 greenboot 健康检查的状态。您可以使用以下任一命令来帮助确保 greenboot 脚本已完成运行。

流程

  • 要查看健康检查状态的报告,请使用以下命令:

    $ systemctl show --property=SubState --value greenboot-healthcheck.service
    • start 的输出表示 greenboot 检查仍在运行。
    • 退出 的输出表示检查已通过,reenboot 已退出。当系统处于健康状态时,greenboot 在 green.d 目录中运行脚本。
    • 失败的输出表示 检查尚未通过。greenboot 在系统处于此状态时在 red.d 目录中运行脚本,并可能重启系统。
  • 要查看一个报告显示服务的数字退出代码,其中 0 表示成功,非零值表示发生了失败,请使用以下命令:

    $ systemctl show --property=ExecMainStatus --value greenboot-healthcheck.service
  • 要查看显示引导状态的报告,如 Boot Status 为 GREEN - Health Check SUCCESS,请使用以下命令:

    $ cat /run/motd.d/boot-status

第 6 章 使用 kubeconfig 进行集群访问

了解如何将 kubeconfig 文件用于 MicroShift 部署。CLI 工具使用 kubeconfig 文件与集群的 API 服务器通信。这些文件提供身份验证所需的集群详情、IP 地址和其他信息。

6.1. 用于配置集群访问的 kubeconfig 文件

MicroShift 中使用的两个 kubeconfig 文件是本地访问和远程访问。每次 MicroShift 启动时,都会生成一组用于本地和远程访问 API 服务器的 kubeconfig 文件。这些文件在 /var/lib/microshift/resources/kubeadmin/ 目录中生成,使用预先存在的配置信息。

每种访问类型都需要使用不同的证书颁发机构(CA)签名的证书。生成一个多个 kubeconfig 文件可满足这一需求。

您可以将适当的 kubeconfig 文件用于每个情况下所需的访问类型,以提供身份验证详情。MicroShift kubeconfig 文件的内容由默认的内置值或 config.yaml 文件决定。

注意

必须存在一个 kubeconfig 文件,集群才能被访问。这些值从内置默认值或 config.yaml (如果创建)应用。

kubeconfig 文件的内容

/var/lib/microshift/resources/kubeadmin/
├── kubeconfig 
1

├── alt-name-1 
2

│   └── kubeconfig
├── 1.2.3.4 
3

│   └── kubeconfig
└── microshift-rhel9 
4

    └── kubeconfig

1
本地主机名。主机的主 IP 地址始终是默认值。
2
API 服务器证书的主题备用名称。
3
DNS 名称.
4
MicroShift 主机名。

6.2. 本地访问 kubeconfig 文件

本地访问 kubeconfig 文件被写入 /var/lib/microshift/resources/kubeadmin/kubeconfig。此 kubeconfig 文件提供对使用 localhost 的 API 服务器的访问。当您在本地连接集群时,选择这个文件。

用于本地访问的 kubeconfig 内容示例

clusters:
- cluster:
    certificate-authority-data: <base64 CA>
    server: https://localhost:6443

localhost kubeconfig 文件只能从从同一主机连接到 API 服务器的客户端中使用。文件中的证书不适用于远程连接。

6.2.1. 本地访问 MicroShift 集群

使用以下步骤,使用 kubeconfig 文件在本地访问 MicroShift 集群。

先决条件

  • 已安装 OpenShift CLI (oc)。

流程

  1. 可选:如果您的 Red Hat Enterprise Linux (RHEL)机器没有 ~/.kube/ 文件夹,请运行以下命令:

    $ mkdir -p ~/.kube/
  2. 运行以下命令,将生成的本地访问 kubeconfig 文件复制到 ~/.kube/ 目录中:

    $ sudo cat /var/lib/microshift/resources/kubeadmin/kubeconfig > ~/.kube/config
  3. 运行以下命令更新 ~/.kube/config 文件的权限:

    $ chmod go-r ~/.kube/config

验证

  • 输入以下命令验证 MicroShift 是否正在运行:

    $ oc get pods -A

    输出示例

    NAMESPACE                   NAME                                                     READY   STATUS   RESTARTS  AGE
    default                     i-06166fbb376f14a8bus-west-2computeinternal-debug-qtwcr  1/1     Running  0		    46m
    kube-system                 csi-snapshot-controller-5c6586d546-lprv4                 1/1     Running  0		    51m
    openshift-dns               dns-default-45jl7                                        2/2     Running  0		    50m
    openshift-dns               node-resolver-7wmzf                                      1/1     Running  0		    51m
    openshift-ingress           router-default-78b86fbf9d-qvj9s                          1/1     Running  0		    51m
    openshift-ovn-kubernetes    ovnkube-master-5rfhh                                     4/4     Running  0		    51m
    openshift-ovn-kubernetes    ovnkube-node-gcnt6                                       1/1     Running  0		    51m
    openshift-service-ca        service-ca-bf5b7c9f8-pn6rk                               1/1     Running  0		    51m
    openshift-storage           topolvm-controller-549f7fbdd5-7vrmv                      5/5     Running  0		    51m
    openshift-storage           topolvm-node-rht2m                                       3/3     Running  0		    50m

    注意

    这个示例输出显示基本的 MicroShift。如果您安装了可选的 RPM,则您的输出中也会显示运行这些服务的 pod 状态。

6.3. 远程访问 kubeconfig 文件

当 MicroShift 集群从外部源连接到 API 服务器时,会使用 SAN 字段中所有替代名称的证书进行验证。MicroShift 使用 hostname 值为外部访问生成默认 kubeconfig。默认值在默认 kubeconfig 文件的 < node.hostnameOverride><node.nodeIP > 和 api.<dns.baseDomain > 参数值中设置。

/var/lib/microshift/resources/kubeadmin/<hostname>/kubeconfig 文件使用机器的 hostnamenode.hostnameOverride(如果设置了这个选项)来访问 API 服务器。kubeconfig 文件的 CA 可以在外部访问时验证证书。

用于远程访问的默认 kubeconfig 文件的内容示例

clusters:
- cluster:
    certificate-authority-data: <base64 CA>
    server: https://microshift-rhel9:6443

6.3.1. 远程访问自定义

可以生成多个远程访问 kubeconfig 文件值来访问使用不同 IP 地址或主机名的集群。额外的 kubeconfig 文件会为 apiServer.subjectAltNames 参数中的每个条目生成。您可以在 IP 连接时从主机复制远程访问 kubeconfig 文件,然后使用它们从其他工作站访问 API 服务器。

6.4. 为远程访问生成额外的 kubeconfig 文件

如果您需要比默认远程访问文件提供更多的主机名或 IP 地址,您可以生成额外的 kubeconfig 文件。

重要

您必须重启 MicroShift 才能实现配置更改。

先决条件

  • 您已为 MicroShift 创建了 config.yaml

流程

  1. 可选:您可以显示 config.yaml 的内容。运行以下命令:

    $ cat /etc/microshift/config.yaml
  2. 可选:您可以显示远程访问 kubeconfig 文件的内容。运行以下命令:

    $ cat /var/lib/microshift/resources/kubeadmin/<hostname>/kubeconfig
    重要

    其他远程访问 kubeconfig 文件必须包含红帽构建的 MicroShift config.yaml 文件中列出的服务器名称之一。其他 kubeconfig 文件还必须使用相同的 CA 进行验证。

  3. 要为其他 DNS 名称 SAN 或外部 IP 地址生成额外的 kubeconfig 文件,请将您需要的条目添加到 apiServer.subjectAltNames 字段。在以下示例中,使用的 DNS 名称为 alt-name-1,IP 地址为 1.2.3.4

    带有额外身份验证值的 config.yaml 示例

    dns:
      baseDomain: example.com
    node:
      hostnameOverride: "microshift-rhel9" 
    1
    
      nodeIP: 10.0.0.1
    apiServer:
      subjectAltNames:
      - alt-name-1 
    2
    
      - 1.2.3.4 
    3

    1
    主机名
    2
    DNS 名称
    3
    IP 地址或范围
  4. 运行以下命令,重启 MicroShift 以应用配置更改并自动生成您需要的 kubeconfig 文件:

    $ sudo systemctl restart microshift
  5. 要检查其他远程访问 kubeconfig 文件的内容,请将 config.yaml 中列出的名称或 IP 地址插入到 cat 命令中。例如,以下示例命令中使用 alt-name-1

    $ cat /var/lib/microshift/resources/kubeadmin/alt-name-1/kubeconfig
  6. 选择 kubeconfig 文件,其中包含您要用来连接集群的 SAN 或 IP 地址。在本例中,cluster.server 字段中包含'alt-name-1' 的 kubeconfig 是正确的文件。

    额外 kubeconfig 文件的内容

    clusters:
    - cluster:
        certificate-authority-data: <base64 CA>
        server: https://alt-name-1:6443 
    1

    1
    /var/lib/microshift/resources/kubeadmin/alt-name-1/kubeconfig 文件值来自 apiServer.subjectAltNames 配置值。
注意

所有这些参数都作为通用名称(CN)和主题替代名称(SAN)包含在 API 服务器的外部提供证书中。

6.4.1. 打开防火墙以远程访问 MicroShift 集群

使用以下步骤打开防火墙,以便远程用户可以访问 MicroShift 集群。必须在 workstation 用户可以访问集群前完成此步骤。

对于此过程,user@microshift 是 MicroShift 主机上的用户,负责设置该机器,使其可以被单独的工作站上的远程用户访问。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • 您的帐户具有集群管理特权。

流程

  • 在 MicroShift 主机上以 user@microshift 的身份,运行以下命令来打开 Kubernetes API 服务器的防火墙端口 (6443/tcp):

    [user@microshift]$ sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp && sudo firewall-cmd --reload

验证

  • user@microshift 的身份,输入以下命令验证 MicroShift 是否正在运行:

    $ oc get pods -A

    输出示例

    NAMESPACE                   NAME                                                     READY   STATUS   RESTARTS  AGE
    default                     i-06166fbb376f14a8bus-west-2computeinternal-debug-qtwcr  1/1     Running  0		    46m
    kube-system                 csi-snapshot-controller-5c6586d546-lprv4                 1/1     Running  0		    51m
    openshift-dns               dns-default-45jl7                                        2/2     Running  0		    50m
    openshift-dns               node-resolver-7wmzf                                      1/1     Running  0		    51m
    openshift-ingress           router-default-78b86fbf9d-qvj9s                          1/1     Running  0		    51m
    openshift-ovn-kubernetes    ovnkube-master-5rfhh                                     4/4     Running  0		    51m
    openshift-ovn-kubernetes    ovnkube-node-gcnt6                                       1/1     Running  0		    51m
    openshift-service-ca        service-ca-bf5b7c9f8-pn6rk                               1/1     Running  0		    51m
    openshift-storage           topolvm-controller-549f7fbdd5-7vrmv                      5/5     Running  0		    51m
    openshift-storage           topolvm-node-rht2m                                       3/3     Running  0		    50m

    注意

    这个示例输出显示基本的 MicroShift。如果您安装了可选的 RPM,则您的输出中也会显示运行这些服务的 pod 状态。

6.4.2. 远程访问 MicroShift 集群

使用以下步骤,使用 kubeconfig 文件从远程位置访问 MicroShift 集群。

user@workstation 登录用于远程访问主机计算机。该流程中的 <user> 值是 user@workstation 登录到 MicroShift 主机所使用的用户名。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • user@microshift 已打开来自本地主机的防火墙。

流程

  1. user@workstation 的身份,如果 Red Hat Enterprise Linux (RHEL)机器没有,使用以下命令创建一个 ~/.kube/ 文件夹:

    [user@workstation]$ mkdir -p ~/.kube/
  2. user@workstation 的身份,运行以下命令来为您的 MicroShift 主机的主机名设置变量:

    [user@workstation]$ MICROSHIFT_MACHINE=<microshift_hostname> 
    1
    1
    将值 & lt;MicroShift_hostname > 替换为运行 的主机的名称或 IP 地址。
  3. user@workstation 的身份,运行以下命令来复制生成的 kubeconfig 文件,该文件包含您要从运行 MicroShift 的 RHEL 机器连接到本地机器的主机名或 IP 地址:

    [user@workstation]$ ssh <user>@$MICROSHIFT_MACHINE "sudo cat /var/lib/microshift/resources/kubeadmin/$MICROSHIFT_MACHINE/kubeconfig" > ~/.kube/config 
    1
    1
    <user > 替换为您的 SSH 登录凭证。
    注意

    要为此步骤生成 kubeconfig 文件,请参阅为远程访问生成额外的 kubeconfig 文件

  4. user@workstation 的身份,运行以下命令来更新 ~/.kube/config 文件的权限:

    $ chmod go-r ~/.kube/config

验证

  • user@workstation 的身份,输入以下命令验证 MicroShift 是否正在运行:

    $ oc get pods -A

    输出示例

    NAMESPACE                   NAME                                                     READY   STATUS   RESTARTS  AGE
    default                     i-06166fbb376f14a8bus-west-2computeinternal-debug-qtwcr  1/1     Running  0		    46m
    kube-system                 csi-snapshot-controller-5c6586d546-lprv4                 1/1     Running  0		    51m
    openshift-dns               dns-default-45jl7                                        2/2     Running  0		    50m
    openshift-dns               node-resolver-7wmzf                                      1/1     Running  0		    51m
    openshift-ingress           router-default-78b86fbf9d-qvj9s                          1/1     Running  0		    51m
    openshift-ovn-kubernetes    ovnkube-master-5rfhh                                     4/4     Running  0		    51m
    openshift-ovn-kubernetes    ovnkube-node-gcnt6                                       1/1     Running  0		    51m
    openshift-service-ca        service-ca-bf5b7c9f8-pn6rk                               1/1     Running  0		    51m
    openshift-storage           topolvm-controller-549f7fbdd5-7vrmv                      5/5     Running  0		    51m
    openshift-storage           topolvm-node-rht2m                                       3/3     Running  0		    50m

    注意

    这个示例输出显示基本的 MicroShift。如果您安装了可选的 RPM,则您的输出中也会显示运行这些服务的 pod 状态。

第 7 章 配置 MicroShift 身份验证和安全性

7.1. 配置自定义证书颁发机构

通过将 MicroShift 默认 API 服务器证书替换为证书颁发机构(CA)发布的自定义服务器证书来允许和加密与外部客户端的连接。

当 MicroShift 启动时,内部 MicroShift 集群证书颁发机构(CA)会发出默认的 API 服务器证书。默认情况下,集群外的客户端无法验证 MicroShift 发布的 API 服务器证书。您可以授予 MicroShift API 服务器和外部客户端之间的安全访问权限和加密连接。将默认证书替换为外部由客户端信任的 CA 发布的自定义服务器证书。

以下步骤演示了在 MicroShift 中自定义 API 服务器证书配置的工作流:

  1. 将证书和密钥复制到主机操作系统中的首选目录中。确保只有 root 访问权限才能访问这些文件。
  2. 通过在 MicroShift /etc/microshift/config.yaml 配置文件中指定证书名称和新的完全限定域名(FQDN)来更新每个自定义 CA 的 MicroShift 配置。

    每个证书配置都可以包含以下值:

    • 证书文件位置是一个必需的值。
    • 包含 API 服务器 DNS 和 IP 地址或 IP 地址范围的一个通用名称。

      提示

      在大多数情况下,MicroShift 为您的自定义 CA 生成新的 kubeconfig 文件,其中包含您指定的 IP 地址或范围。例外是在为 IP 地址指定通配符时。在这种情况下,MicroShift 会生成一个 kubeconfig 文件,其中包含服务器的公共 IP 地址。要使用通配符,您必须使用特定详情更新 kubeconfig 文件。

    • 多个主题备用名称(SAN),其中包含 API 服务器 DNS 和 IP 地址或通配符证书。
    • 您可以列出每个证书的额外 DNS 名称。
  3. MicroShift 服务重启后,您必须将生成的 kubeconfig 文件复制到客户端。
  4. 在客户端系统上配置额外的 CA。例如,您可以更新 Red Hat Enterprise Linux (RHEL)信任存储中的 CA 捆绑包。

    重要

    自定义服务器证书必须针对主机操作系统信任根中配置的 CA 数据进行验证。如需更多信息,请参阅以下文档:

  5. 证书和密钥从主机上的指定文件位置读取。您可以从客户端测试和验证配置。

    • 如果任何验证失败,MicroShift 会跳过自定义配置,并使用默认证书启动。优先级是继续服务不间断。MicroShift 在服务启动时记录错误。常见错误包括过期的证书、缺失文件或错误的 IP 地址。
  6. 外部服务器证书不会自动续订。您必须手动轮转外部证书。

7.1.2. 配置自定义证书颁发机构

要使用自定义证书颁发机构(CA)配置外部生成的证书和域名,请将它们添加到 MicroShift /etc/microshift/config.yaml 配置文件中。您还必须配置主机操作系统信任 root。

注意

外部生成的 kubeconfig 文件在 /var/lib/microshift/resources/kubeadmin/<hostname>/kubeconfig 目录中创建。如果您需要在外部生成的配置之外使用 localhost,请在其默认位置保留原始 kubeconfig 文件。localhost kubeconfig 文件使用自签名证书颁发机构。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • 您可以使用具有集群管理角色的用户访问集群。
  • 证书颁发机构已发布自定义证书。
  • MicroShift /etc/microshift/config.yaml 配置文件存在。

流程

  1. 复制您要添加到 MicroShift 主机的信任根中的自定义证书。确保证书和私钥只能被 MicroShift 访问。
  2. 对于您需要的每个自定义 CA,使用以下示例 将名为Certificates 的 apiServer 部分添加到 /etc/microshift/config.yaml MicroShift 配置文件中:

    apiServer:
      namedCertificates:
       - certPath: ~/certs/api_fqdn_1.crt 
    1
    
         keyPath:  ~/certs/api_fqdn_1.key 
    2
    
       - certPath: ~/certs/api_fqdn_2.crt
         keyPath:  ~/certs/api_fqdn_2.key
         names: 
    3
    
         - api_fqdn_1
         - *.apps.external.com
    1
    添加证书的完整路径。
    2
    添加证书密钥的完整路径。
    3
    可选。添加显式 DNS 名称列表。允许前导通配符。如果没有列出名称,则会从证书中提取隐式名称。
  3. 运行以下命令重启 MicroShift 以应用证书:

    $ systemctl microshift restart
  4. 等待几分钟,让系统重新启动并应用自定义服务器。新的 kubeconfig 文件在 /var/lib/microshift/resources/kubeadmin/ 目录中生成。
  5. kubeconfig 文件复制到客户端。如果您为 IP 地址指定了通配符,请更新 kubeconfig 以删除服务器的公共 IP 地址,并使用您要使用的特定通配符范围替换该 IP 地址。
  6. 在客户端中,执行以下步骤:

    1. 运行以下命令指定要使用的 kubeconfig

      $ export KUBECONFIG=~/custom-kubeconfigs/kubeconfig 
      1
      1
      使用复制的 kubeconfig 文件的位置作为路径。
    2. 使用以下命令检查是否应用了证书:

      $ oc --certificate-authority ~/certs/ca.ca get node

      输出示例

      oc get node
      NAME                             STATUS   ROLES                         AGE   VERSION
      dhcp-1-235-195.arm.example.com   Ready    control-plane,master,worker   76m   v1.32.3

    3. 运行以下命令,将新 CA 文件添加到 $KUBECONFIG 环境变量中:

      $ oc config set clusters.microshift.certificate-authority /tmp/certificate-authority-data-new.crt
    4. 运行以下命令,验证新的 kubeconfig 文件是否包含新的 CA:

      $ oc config view --flatten

      外部生成的 kubeconfig 文件示例

      apiVersion: v1
      clusters:
      - cluster:
          certificate-authority: /tmp/certificate-authority-data-new.crt 
      1
      
          server: https://api.ci-ln-k0gim2b-76ef8.aws-2.ci.openshift.org:6443
        name: ci-ln-k0gim2b-76ef8
      contexts:
      - context:
          cluster: ci-ln-k0gim2b-76ef8
          user:
        name:
      current-context:
      kind: Config
      preferences: {}

      1
      外部生成的 kubeconfig 文件中不存在 certificate-authority-data 部分。它通过之前使用的 oc config set 命令添加。
    5. 运行以下命令,验证自定义 API 服务器证书颁发机构的 主题和签发者

      $ curl --cacert /tmp/caCert.pem https://${fqdn_name}:6443/healthz -v

      输出示例

      Server certificate:
        subject: CN=kas-test-cert_server
        start date: Mar 12 11:39:46 2024 GMT
        expire date: Mar 12 11:39:46 2025 GMT
        subjectAltName: host "dhcp-1-235-3.arm.eng.rdu2.redhat.com" matched cert's "dhcp-1-235-3.arm.eng.rdu2.redhat.com"
        issuer: CN=kas-test-cert_ca
        SSL certificate verify ok.

      重要

      将生成的 kubeconfig 文件中的 certificate-authority-data 替换为新的 rootCA,或者将 certificate-authority-data 添加到操作系统的信任根中。不要同时使用这两种方法。

    6. 在操作系统的信任根中配置额外的 CA。例如,在客户端系统上的 RHEL 客户端信任存储中。系统范围的信任存储

      • 建议使用包含 CA 的配置更新证书捆绑包。
      • 如果您不想配置证书捆绑包,也可以使用 oc login localhost:8443 --certificate-authority=/path/to/cert.crt 命令,但这不是首选的方法。

7.1.3. 自定义证书保留名称值

以下证书问题会导致 MicroShift 动态忽略证书并记录错误:

  • 磁盘中不存在证书文件或不可读。
  • 证书不可解析。
  • 证书会覆盖 SubjectAlternativeNames (SAN)字段中的内部证书 IP 地址或 DNS 名称。在配置 SAN 时不要使用保留的名称。
Expand
表 7.1. 保留名称值
地址类型注释

localhost

DNS

 

127.0.0.1

IP 地址

 

10.42.0.0

IP 地址

集群网络

10.43.0.0/16,10.44.0.0/16

IP 地址

服务网络

169.254.169.2/29

IP 地址

br-ex Network

kubernetes.default.svc

DNS

 

openshift.default.svc

DNS

 

svc.cluster.local

DNS

 

7.1.4. 自定义证书故障排除

要排除自定义证书的实施,您可以执行以下步骤。

流程

  1. 在 MicroShift 中,确保证书由 kube-apiserver 提供,并通过运行以下命令来验证证书路径是否已附加到 the -tls-sni-cert-key FLAG 中:

    $ journalctl -u microshift -b0 | grep tls-sni-cert-key

    输出示例

    Jan 24 14:53:00 localhost.localdomain microshift[45313]: kube-apiserver I0124 14:53:00.649099   45313 flags.go:64] FLAG: --tls-sni-cert-key="[/home/eslutsky/dev/certs/server.crt,/home/eslutsky/dev/certs/server.key;/var/lib/microshift/certs/kube-apiserver-external-signer/kube-external-serving/server.crt,/var/lib/microshift/certs/kube-apiserver-external-signer/kube-external-serving/server.key;/var/lib/microshift/certs/kube-apiserver-localhost-signer/kube-apiserver-localhost-serving/server.crt,/var/lib/microshift/certs/kube-apiserver-localhost-signer/kube-apiserver-localhost-serving/server.key;/var/lib/microshift/certs/kube-apiserver-service-network-signer/kube-apiserver-service-network-serving/server.crt,/var/lib/microshift/certs/kube-apiserver-service-network-signer/kube-apiserver-service-network-serving/server.key

  2. 在客户端中,运行以下命令来确保 kube-apiserver 提供正确的证书:

    $ openssl s_client -connect <SNI_ADDRESS>:6443 -showcerts | openssl x509 -text -noout -in - | grep -C 1 "Alternative\|CN"

7.1.5. 清理和重新创建自定义证书

要停止 MicroShift 服务,请清理自定义证书并重新创建自定义证书,请使用以下步骤。

流程

  1. 运行以下命令,停止 MicroShift 服务并清理自定义证书:

    $ sudo microshift-cleanup-data --cert

    输出示例

    Stopping MicroShift services
    Removing MicroShift certificates
    MicroShift service was stopped
    Cleanup succeeded

  2. 运行以下命令重启 MicroShift 服务以重新创建自定义证书:

    $ sudo systemctl start microshift

7.1.6. 其他资源

7.2. 配置 TLS 安全配置集

使用传输层安全(TLS)协议帮助防止已知的不安全协议、密码或算法访问您在 MicroShift 上运行的应用程序。

7.2.1. 在 MicroShift 中使用 TLS

传输层安全(TLS)配置集为服务器提供了一种方式,以规范客户端在连接到服务器时可以使用哪些密码。使用 TLS 有助于确保 MicroShift 应用程序使用加密库,它们不允许已知的不安全协议、密码或算法。您可以在 MicroShift 中使用 TLS 1.2 或 TLS 1.3 安全配置集。

MicroShift API 服务器密码套件会自动应用到以下内部 control plane 组件:

  • API Server
  • Kubelet
  • kube 控制器管理器
  • kube 调度程序
  • etcd
  • 路由控制器管理器

API 服务器使用配置的最低 TLS 版本和相关密码套件。如果将 cipher suites 参数留空,则会自动使用配置的最小版本的默认值。

TLS 1.2 的默认密码套件

以下列表指定 TLS 1.2 的默认密码套件:

  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256

TLS 1.3 的默认密码套件

以下列表指定 TLS 1.3 的默认密码套件:

  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256

7.2.2. 为 MicroShift 配置 TLS

您可以选择使用带有 MicroShift 的 TLS 1.2 或 TLS 1.3 安全配置集进行系统强化。

先决条件

  • 您可以使用 root 用户身份访问集群。
  • MicroShift 尚未首次启动,或者已停止。
  • 已安装 OpenShift CLI (oc)。
  • 证书颁发机构已发布自定义证书(CA)。

流程

  1. /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,将它重命名为 config.yaml
  2. 将新的 MicroShift config.yaml 保留在 /etc/microshift/ 目录中。MicroShift 服务每次启动时都会读取 config.yaml 文件。

    注意

    创建后,config.yaml 文件优先于内置设置。

  3. 可选:如果使用现有的 MicroShift YAML,请使用配置片断。如需更多信息,请参阅附加资源部分中的"使用配置片断"。
  4. 将 MicroShift YAML 的 tls 部分中的默认值替换为您的有效值。

    TLS 1.2 配置示例

    apiServer:
    # ...
      tls:
        cipherSuites: 
    1
    
        - <cipher_suite_1> 
    2
    
        - ...
        minVersion: VersionTLS12 
    3
    
    # ...

    1
    默认为配置的 minVersion 的套件。如果没有配置 minVersion,则默认值为 TLS 1.2。
    2
    从支持的密码套件列表中指定要使用的密码套件。如果没有配置此列表,则会使用所有支持的密码套件。连接到 API 服务器的所有客户端都必须支持配置的密码套件,或者连接在 TLS 握手阶段会失败。务必将 CA 证书捆绑包添加到 TLS 客户端或服务器信任的 CA 证书列表中。
    3
    指定 VersionTLS12VersionTLS13
    重要

    当您选择 TLS 1.3 作为最小 TLS 版本时,只能使用默认的 MicroShift 密码套件。额外的密码套件不可配置。如果配置了用于 TLS 1.3 的其他密码套件,则这些套件将被忽略,并被 MicroShift 默认值覆盖。

  5. 运行以下命令完成任何其他额外配置,然后运行以下命令来重启 MicroShift:

    $ sudo systemctl restart microshift
7.2.2.1. 默认密码套件

MicroShift 包含用于 TLS 1.2 和 TLS 1.3 的默认密码套件。TLS 1.3 的密码套件无法自定义。

TLS 1.2 的默认密码套件

以下列表指定 TLS 1.2 的默认密码套件:

  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256

TLS 1.3 的默认密码套件

以下列表指定 TLS 1.3 的默认密码套件:

  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256

7.3. 配置审计日志记录策略

您可以使用配置值控制 MicroShift 审计日志文件轮转和保留。

7.3.1. 关于设置审计日志文件的限制

使用配置值控制 MicroShift 审计日志文件的轮转和保留有助于防止超过边缘设备的有限存储容量。在这样的设备中,日志记录数据积累可能会限制主机系统或集群工作负载,从而导致设备停止工作。设置审计日志策略有助于确保关键处理空间持续可用。

您设置为限制 MicroShift 审计日志的值可让您强制实施审计日志备份的大小、数字和年龄限制。字段值相互独立处理,无需优先处理。

您可以组合设置字段,为保留的日志定义最大存储限制。例如:

  • maxFileSizemaxFiles 设置为创建一个日志存储上限。
  • 设置 maxFileAge 值,以自动删除文件名中时间戳旧的文件,而不考虑 maxFiles 值。
7.3.1.1. 默认审计日志值

MicroShift 包括以下默认审计日志轮转值:

Expand
表 7.2. MicroShift 默认审计日志值
审计日志参数默认设置定义

maxFileAge:

0

在自动删除前保留日志文件的时长。默认值表示,日志文件永远不会根据年龄删除。可以配置这个值。

maxFiles:

10

保留的日志文件总数。默认情况下,MicroShift 保留 10 个日志文件。创建过量文件时,会删除最旧的文件。可以配置这个值。

maxFileSize:

200

默认情况下,当 audit.log 文件达到 maxFileSize 限制时,audit.log 文件会被轮转,MicroShift 开始写入新的 audit.log 文件。这个值以 MB 为单位,可以进行配置。

配置集

default

Default 配置集只为读取和写入请求记录元数据;除了 OAuth 访问令牌请求外,请求正文不会被记录。如果没有指定此字段,则使用 Default 配置集。

如果文件有 10 个或更少,则审计日志保留的最大默认存储使用量为 2000Mb。

如果没有为字段指定值,则使用默认值。如果删除了之前设置的字段值,则会在下一个 MicroShift 服务重启后恢复默认值。

重要

您必须在 Red Hat Enterprise Linux (RHEL)中为应用程序 Pod 生成的日志配置审计日志保留和轮转。这些日志打印到控制台并被保存。确保为 RHEL /var/log/audit/audit.log 文件配置了日志首选项,以维护 MicroShift 集群健康状况。

7.3.2. 关于审计日志策略配置集

审计日志配置集定义如何记录发送到 OpenShift API 服务器和 Kubernetes API 服务器的请求。

MicroShift 支持以下预定义的审计策略配置集:

Expand
profile描述

default

仅记录读取和写入请求的日志元数据 ;除了 OAuth 访问令牌请求外,不记录请求正文。这是默认策略。

WriteRequestBodies

除了记录所有请求的元数据外,还会记录对 API 服务器的写入请求(create, update, patch, delete, deletecollection)。这个配置集的资源开销比 Default 配置集大。[1]

AllRequestBodies

除了记录所有请求的元数据外,对 API 服务器的每个读写请求(getlistcreateupdatepatch)都进行日志记录。这个配置集的资源开销最大。[1]

None

没有记录请求,包括 OAuth 访问令牌请求和 OAuth 授权令牌请求。

警告

除非完全了解在对问题进行故障排除时无法记录数据的风险,否则不要使用 None 配置集禁用审计日志记录。如果禁用审计日志记录且出现支持情况,您可能需要启用审计日志记录并重现问题,才能正确排除故障。

  1. 敏感资源(如 SecretRouteOAuthClient 对象)仅记录在元数据级别上。

默认情况下,MicroShift 使用 Default 审计日志配置集。您可以使用另一个审计策略配置集来记录请求的具体数据,但注意这会消耗更多资源(如 CPU、内存和 I/O)。

7.3.3. 配置审计日志值

您可以使用 MicroShift 服务配置文件配置审计日志设置。

流程

  1. /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,将它重命名为 config.yaml。在 /etc/microshift/ 目录中保留您创建的新的 MicroShift config.yaml。每当 MicroShift 服务启动时,会读取新的 config.yaml。创建后,config.yaml 文件优先于内置设置。
  2. 将 YAML 的 auditLog 部分中的默认值替换为您所需的有效值。

    默认 auditLog 配置示例

    apiServer:
    # ....
      auditLog:
        maxFileAge: 7 
    1
    
        maxFileSize: 200 
    2
    
        maxFiles: 1 
    3
    
        profile: Default 
    4
    
    # ....

    1
    指定日志文件要保留的最大时间(以天为单位)。超过这个限制的文件会被删除。在本例中,日志文件超过 7 天后,将被删除。无论实时日志是否达到 maxFileSize 字段中指定的最大文件大小,都会删除这些文件。文件年龄由使用轮转日志文件名称写入的时间戳决定,例如 audit-2024-05-16T17-03-59.994.log。当值为 0 时,会禁用限制。
    2
    最大审计日志文件大小(以 MB 为单位)。在本例中,文件会在实时日志达到 200 MB 限制时进行轮转。当值设为 0 时,会禁用限制。
    3
    保留的最大轮转审计日志文件数。达到限制后,日志文件将从最旧的到最新的顺序删除。在本例中,除了当前活跃日志外,值 1 会导致只保留 1 个 size maxFileSize 的文件。当值设为 0 时,会禁用限制。
    4
    仅记录读取和写入请求的日志元数据 ;除了 OAuth 访问令牌请求外,不记录请求正文。如果没有指定此字段,则使用 Default 配置集。
  3. 可选: 要为日志指定新目录,您可以停止 MicroShift,然后将 /var/log/kube-apiserver 目录移到所需的位置:

    1. 运行以下命令来停止 MicroShift:

      $ sudo systemctl stop microshift
    2. 运行以下命令,将 /var/log/kube-apiserver 目录移到所需位置:

      $ sudo mv /var/log/kube-apiserver <~/kube-apiserver> 
      1
      1
      将 < ~/kube-apiserver > 替换为您要使用的目录的路径。
    3. 如果为日志指定新目录,请运行以下命令到位于 /var/log/kube-apiserver 的自定义目录:

      $ sudo ln -s <~/kube-apiserver> /var/log/kube-apiserver 
      1
      1
      将 < ~/kube-apiserver > 替换为您要使用的目录的路径。这启用了 sos 报告中的日志集合。
  4. 如果要在运行的实例上配置审计日志策略,请输入以下命令重启 MicroShift:

    $ sudo systemctl restart microshift

7.3.4. 审计日志配置故障排除

使用以下步骤对自定义审计日志设置和文件位置进行故障排除。

流程

  • 运行以下命令检查配置的当前值:

    $ sudo microshift show-config --mode effective

    输出示例

    auditLog:
        maxFileSize: 200
        maxFiles: 1
        maxFileAge: 7
        profile: AllRequestBodies

  • 运行以下命令检查 audit.log 文件权限:

    $ sudo ls -ltrh /var/log/kube-apiserver/audit.log

    输出示例

    -rw-------. 1 root root 46M Mar 12 09:52 /var/log/kube-apiserver/audit.log

  • 运行以下命令,列出当前日志目录的内容:

    $ sudo ls -ltrh /var/log/kube-apiserver/

    输出示例

    total 6.0M
    -rw-------. 1 root root 2.0M Mar 12 10:56 audit-2024-03-12T14-56-16.267.log
    -rw-------. 1 root root 2.0M Mar 12 10:56 audit-2024-03-12T14-56-49.444.log
    -rw-------. 1 root root 962K Mar 12 10:57 audit.log

7.4. 验证容器签名以进行供应链安全

您可以使用 sigstore 签名方法增强供应链安全性。

重要

sigstore 支持只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

7.4.1. 了解如何使用 sigstore 验证容器签名

您可以使用 sigstore 签名方法配置容器运行时以验证镜像的完整性。配置 MicroShift 容器运行时可启用镜像完整性的验证。通过 sigstore 项目,开发人员可以数字签名其构建的内容,创建将软件追踪回源的安全链。然后管理员可以大规模验证签名和监控工作流。通过使用 sigstore,您可以在与构建镜像相同的 registry 中存储签名。

  • 对于特定于用户的镜像,您必须更新配置文件以指向适当的公钥,或者禁用这些镜像源的签名验证。
重要

对于断开连接或离线配置,您必须将公钥内容嵌入到操作系统镜像中。

7.4.2. 使用 sigstore 验证容器签名

通过将容器运行时配置为使用 sigstore 来验证 MicroShift 的容器日志。在对镜像进行签名时,容器签名验证使用来自红帽密钥对的公钥。要使用 sigstore,请编辑作为容器运行时软件包的一部分安装的默认 /etc/containers/policy.json 文件。

您可以通过以下链接访问红帽公钥:

您必须使用发行版本密钥 3 来验证 MicroShift 容器签名。

先决条件

  • 有对 MicroShift 主机的 admin 访问权限。
  • 已安装 MicroShift。

流程

  1. 运行以下命令,下载相关的公钥并将其保存为 /etc/containers/RedHat_ReleaseKey3.pub

    $ sudo curl -sL https://access.redhat.com/security/data/63405576.txt -o /etc/containers/RedHat_ReleaseKey3.pub
  2. 要将容器运行时配置为验证来自红帽源的镜像,请编辑 /etc/containers/policy.json 文件使其包含以下配置:

    策略 JSON 文件示例

    {
        "default": [
            {
                "type": "reject"
            }
        ],
        "transports": {
            "docker": {
                "quay.io/openshift-release-dev": [{
                    "type": "sigstoreSigned",
                    "keyPath": "/etc/containers/RedHat_ReleaseKey3.pub",
                    "signedIdentity": {
                        "type": "matchRepoDigestOrExact"
                    }
                }],
                "registry.redhat.io": [{
                    "type": "sigstoreSigned",
                    "keyPath": "/etc/containers/RedHat_ReleaseKey3.pub",
                    "signedIdentity": {
                        "type": "matchRepoDigestOrExact"
                    }
                }]
            }
        }
    }

  3. 通过编辑 /etc/containers/registries.d/registry.redhat.io.yaml' 文件来在拉取镜像到本地存储时使用 sigstore attachments,使其包含以下配置:

    $ cat /etc/containers/registries.d/registry.redhat.io.yaml
    docker:
         registry.redhat.io:
             use-sigstore-attachments: true
  4. 通过编辑 /etc/containers/registries.d/registry.quay.io.yaml 文件来在拉取镜像到本地存储时使用 sigstore 附加功能,使其包含以下配置:

    $ cat /etc/containers/registries.d/quay.io.yaml
    docker:
      quay.io/openshift-release-dev:
        use-sigstore-attachments: true
  5. 如果您的用例需要这些镜像源的签名验证,请创建特定于用户的 registry 配置文件。您可以使用此处的示例开始并添加您自己的要求。

后续步骤

  1. 如果您使用镜像 registry,请启用 sigstore attachments。
  2. 否则,继续清理本地容器存储。
7.4.2.1. 为镜像 registry 启用 sigstore 附加

如果使用镜像 registry,您必须应用额外的配置来启用 sigstore 附加功能,并通过摘要进行镜像(mirror)。

先决条件

  • 有对 MicroShift 主机的 admin 访问权限。
  • 您已使用 sigstore 完成"验证容器签名"中的步骤。

流程

  1. 通过创建 /etc/containers/registries.d/mirror.registry.local.yaml 文件来启用 sigstore 附加。

    $ cat /etc/containers/registries.d/<mirror.registry.local.yaml> 
    1
    
    docker:
       mirror.registry.local:
            use-sigstore-attachments: true
    1
    在镜像 registry URL 后命名 < mirror.registry.local.yaml > 文件。
  2. 通过创建包含以下内容的 /etc/containers/registries.conf.d/999-microshift-mirror.conf 来启用镜像:

    $ cat /etc/containers/registries.conf.d/999-microshift-mirror.conf
    [[registry]]
        prefix = "quay.io/openshift-release-dev"
        location = "mirror.registry.local"
        mirror-by-digest-only = true
    
    [[registry]]
        prefix = "registry.redhat.io"
        location = "mirror.registry.local"
        mirror-by-digest-only = true

后续步骤

  1. 清除本地容器存储清理。
7.4.2.2. 擦除本地容器存储清理

将配置应用到现有系统时,您必须清理本地容器存储。清理容器存储可确保正确下载带有签名的容器镜像。

先决条件

  • 有对 MicroShift 主机的管理员访问权限。
  • 您在镜像 registry 上启用了 sigstore。

流程

  1. 运行以下命令停止 CRI-O 容器运行时服务和 MicroShift:

    $ sudo systemctl stop crio microshift
  2. 运行以下命令擦除 CRI-O 容器运行时存储清理:

    $ sudo crio wipe --force
  3. 运行以下命令重启 CRI-O 容器运行时服务和 MicroShift:

    $ sudo systemctl start crio microshift

验证

输入以下命令验证所有 pod 是否都处于健康状态:

$ oc get pods -A

输出示例

NAMESPACE                   NAME                                                     READY   STATUS   RESTARTS  AGE
default                     i-06166fbb376f14a8bus-west-2computeinternal-debug-qtwcr  1/1     Running  0		    46m
kube-system                 csi-snapshot-controller-5c6586d546-lprv4                 1/1     Running  0		    51m
openshift-dns               dns-default-45jl7                                        2/2     Running  0		    50m
openshift-dns               node-resolver-7wmzf                                      1/1     Running  0		    51m
openshift-ingress           router-default-78b86fbf9d-qvj9s                          1/1     Running  0		    51m
openshift-ovn-kubernetes    ovnkube-master-5rfhh                                     4/4     Running  0		    51m
openshift-ovn-kubernetes    ovnkube-node-gcnt6                                       1/1     Running  0		    51m
openshift-service-ca        service-ca-bf5b7c9f8-pn6rk                               1/1     Running  0		    51m
openshift-storage           topolvm-controller-549f7fbdd5-7vrmv                      5/5     Running  0		    51m
openshift-storage           topolvm-node-rht2m                                       3/3     Running  0		    50m

注意

这个示例输出显示基本的 MicroShift。如果您安装了可选的 RPM,则您的输出中也会显示运行这些服务的 pod 状态。

第 8 章 配置低延迟

8.1. 配置低延迟

您可以配置和调优低延迟功能,以提高边缘设备上的应用程序性能。

8.1.1. 在 MicroShift 应用程序中降低延迟

延迟定义为事件到该事件的响应的时间。您可以在在操作或软件定义的控制系统上运行的 MicroShift 集群中使用低延迟配置和调优,其中边缘设备需要快速响应外部事件。您可以通过将 MicroShift 配置与操作系统调优和工作负载分区结合使用来完全优化低延迟性能。

重要

为管理应用程序设置的 CPU,如 MicroShift 服务、OVS、CRI-O、MicroShift pod 和隔离内核必须包含 all-online CPU。

要为在 MicroShift 集群中运行的应用程序配置低延迟,您必须完成以下任务:

必填
  • 安装 microshift-low-latency RPM。
  • 配置工作负载分区。
  • /etc/microshift/ 目录中配置 config.yaml 文件的 kubelet 部分。
  • 配置并激活 TuneD 配置集。TuneD 是一个 Red Hat Enterprise Linux (RHEL)服务,它监控主机系统并优化特定工作负载的性能。
  • 重启主机。
选填

8.1.2. 安装 MicroShift 低延迟 RPM 软件包

安装 MicroShift 时,默认不会安装低延迟 RPM 软件包。您可以将低延迟 RPM 安装为可选软件包。

先决条件

  1. 已安装 MicroShift RPM。
  2. 为 MicroShift 配置工作负载分区。

流程

  • 运行以下命令来安装低延迟 RPM 软件包:

    $ sudo dnf install -y microshift-low-latency
    提示

    等待主机重启,直到激活 TuneD 配置集后。重启主机重启 MicroShift 和 CRI-O,它应用低延迟清单并激活 TuneD 配置集。

后续步骤

  1. 为 MicroShift config.yaml 中的低延迟配置 kubelet 参数。
  2. 调优操作系统,例如配置并激活 TuneD 配置集。
  3. 可选:配置 TuneD 配置集的自动激活。
  4. 可选:如果您使用 x86_64 架构,请安装 Red Hat Enterprise Linux for Real Time (实时内核)。
  5. 为低延迟准备工作负载。

8.1.3. MicroShift 中的配置 kubelet 参数和值

为 MicroShift 集群启用低延迟的第一步是将配置添加到 MicroShift config.yaml 文件中。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 有对集群的 root 访问权限。
  • 您在 /etc/microshift/ 目录中生成提供的 config.yaml.default 文件的副本,并将它重命名为 config.yaml

流程

  • 将 kubelet 配置添加到 MicroShift config.yaml 文件中:

    passthrough kubelet 配置示例

    apiServer:
    # ...
    kubelet: 
    1
    
      cpuManagerPolicy: static 
    2
    
      cpuManagerPolicyOptions:
        full-pcpus-only: "true" 
    3
    
      cpuManagerReconcilePeriod: 5s
      memoryManagerPolicy: Static 
    4
    
      topologyManagerPolicy: single-numa-node
      reservedSystemCPUs: 0-1 
    5
    
      reservedMemory:
      - limits:
          memory: 1100Mi 
    6
    
        numaNode: 0
      kubeReserved:
        memory: 500Mi
      systemReserved:
        memory: 500Mi
      evictionHard: 
    7
    
        imagefs.available: "15%" 
    8
    
        memory.available: "100Mi" 
    9
    
        nodefs.available: "10%" 
    10
    
        nodefs.inodesFree: "5%" 
    11
    
      evictionPressureTransitionPeriod: 5m 
    12
    
    # ...

    1
    如果您在 kubelet 配置中更改 CPU 或内存管理器,您必须删除缓存之前配置的文件。重启主机以自动删除它们,或者手动删除 /var/lib/kubelet/cpu_manager_state/var/lib/kubelet/memory_manager_state 文件。
    2
    要使用的策略的名称。有效值为 nonestatic。需要启用 CPUManager 功能门。默认值为 none
    3
    一组 key=value 对,用于设置额外选项,以微调 CPUManager 策略的行为。默认值为 null。需要启用 CPUManagerCPUManagerPolicyOptions 功能门。
    4
    Memory Manager 使用的策略名称。区分大小写。默认值为 none。需要启用 MemoryManager 功能门。
    5
    必需。reservedSystemCPUs 值必须是离线 CPU 的反转,因为组合的值都必须考虑系统中的所有 CPU。这个参数对于划分管理和应用程序工作负载非常重要。使用此参数为主机级别系统和 Kubernetes 守护进程定义静态 CPU 设置,以及中断和计时器。然后,系统中的其余 CPU 专门用于工作负载。
    6
    本例中的 reservedMemory[0].limits.memory,1100 Mi 的值等于 kubeReserved.memory + systemReserved.memory + evictionHard.memory.available
    7
    evictionHard 参数定义 kubelet 在哪些情况下驱除 pod。当您更改 evictionHard 小节的一个参数的默认值时,其他参数的默认值不会继承,且设置为零。即使您想要只更改一个阈值,也请提供所有阈值。
    8
    imagefs 是一个文件系统,容器运行时用来存储容器镜像和容器可写入层。在本例中,evictionHard.imagefs.available 参数意味着当镜像文件系统的可用空间小于 15% 时 pod 会被驱除。
    9
    在本例中,evictionHard.memory.available 参数意味着当节点的可用内存下降到 100MiB 时,pod 会被驱除。
    10
    在本例中,evictionHard.nodefs.available 参数意味着当节点的主文件系统小于 10% 时,pod 会被驱除。
    11
    在本例中,evictionHard.nodefs.inodesFree 参数意味着,在使用节点主文件系统内节点的 15% 时 pod 会被驱除。
    12
    对于容器垃圾回收: 摆脱驱除压力状况前等待的持续时间。将 evictionPressureTransitionPeriod 参数设置为 0 会将默认值配置为 5 分钟。

验证

  • 完成后续步骤并重新启动主机后,您可以使用 root-access 帐户来检查您的设置是否在 /var/lib/microshift/resources/kubelet/config/ 目录中的 config.yaml 文件中。

后续步骤

  1. 启用工作负载分区。
  2. 调优您的操作系统。例如,配置和激活 TuneD 配置集。
  3. 可选:配置 TuneD 配置集的自动启用。
  4. 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。
  5. 为低延迟准备 MicroShift 工作负载。

8.1.4. 调整 Red Hat Enterprise Linux 9

作为 Red Hat Enterprise Linux (RHEL)系统管理员,您可以使用 TuneD 服务针对各种用例优化 RHEL 的性能配置集。TuneD 监控并优化某些工作负载下的系统性能,包括延迟性能。

  • 使用 TuneD 配置集根据不同的用例调优您的系统,如部署低延迟 MicroShift 集群。
  • 您可以修改为每个配置集定义的规则,并自定义特定设备的调整。
  • 当您切换到另一个配置集或取消激活 TuneD 时,对之前配置集进行的所有更改都会恢复到其原始状态。
  • 您还可以将 TuneD 配置为响应设备使用的变化,并调整设置以提高活跃设备的性能并减少不活跃设备的功耗。
8.1.4.1. 配置 MicroShift TuneD 配置集

在安装 microshift-low-latency RPM 软件包后,使用 Red Hat Enterprise Linux (RHEL) /etc/tuned/ host 目录中提供的 microshift-baseline-variables.conf 配置文件,将 TuneD 配置集配置为对 MicroShift 工作负载使用低延迟。

先决条件

  • 有对集群的 root 访问权限。
  • 已安装 microshift-low-latency RPM 软件包。
  • 您的 RHEL 主机已安装了 TuneD。请参阅开始使用 TuneD (RHEL 文档)。

流程

  1. 您可以使用 /etc/tuned/ 目录配置集中的默认 microshift-baseline-variables.conf TuneD 配置集,或者自行添加更多调整。

    microshift-baseline-variables.conf TuneD 配置集示例

    # Isolate cores 2-7 for running application workloads
    isolated_cores=2-7 
    1
    
    
    # Size of the hugepages
    hugepages_size=2M 
    2
    
    
    # Number of hugepages
    hugepages=0
    
    # Additional kernel arguments
    additional_args= 
    3
    
    
    # CPU set to be offlined
    offline_cpu_set= 
    4

    1
    控制应隔离哪些内核。默认情况下,在 MicroShift 中为每个插槽保留 1 个内核,用于内务处理。其他内核被隔离。有效值为核心列表或范围。您可以隔离任何范围,例如: isolated_cores=2,4-7isolated_cores=2-23
    重要

    您必须只保留一个 isolated_cores= 变量。

    注意

    Kubernetes CPU Manager 可以使用任何 CPU 来运行工作负载,但 kubelet 配置中定义的保留 CPU 除外。因此,最好这样做:

    • kubelet 保留 CPU 和隔离内核的总和包括所有在线 CPU。
    • 隔离内核与 kubelet 配置中定义的保留 CPU 的补充。
    2
    巨页的大小。有效值为 2M 或 1G。
    3
    其他内核参数,例如 additional_args=console=tty0 console=ttyS0,115200
    4
    设置为 offlined 的 CPU。
    重要

    不得与 isolated_cores 重叠。

  2. 运行以下命令启用配置集或更改活跃:

    $ sudo tuned-adm profile microshift-baseline
  3. 重启主机,使内核参数处于活动状态。

验证

  • 可选:您可以读取包含在启动时当前运行内核的参数的 /proc/cmdline 文件。

    $ cat /proc/cmdline

    输出示例

    BOOT_IMAGE=(hd0,msdos2)/ostree/rhel-7f82ccd9595c3c70af16525470e32c6a81c9138c4eae6c79ab86d5a2d108d7fc/vmlinuz-5.14.0-427.31.1.el9_4.x86_64+rt crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M rd.lvm.lv=rhel/root fips=0 console=ttyS0,115200n8 root=/dev/mapper/rhel-root rw ostree=/ostree/boot.1/rhel/7f82ccd9595c3c70af16525470e32c6a81c9138c4eae6c79ab86d5a2d108d7fc/0 skew_tick=1 tsc=reliable rcupdate.rcu_normal_after_boot=1 nohz=on nohz_full=2,4-5 rcu_nocbs=2,4-5 tuned.non_isolcpus=0000000b intel_pstate=disable nosoftlockup hugepagesz=2M hugepages=10

后续步骤

  1. 为低延迟准备 MicroShift 工作负载。
  2. 可选:配置 TuneD 配置集的自动启用。
  3. 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。
8.1.4.2. 自动启用 MicroShift TuneD 配置集

microshift-low-latency RPM 软件包包含在 microshift-low-latency RPM 软件包中,您可以将它配置为在系统启动时自动启用 TuneD 配置集。如果要在大量设备中安装 MicroShift 时,此功能特别有用。

先决条件

  1. 在主机上安装了 microshift-low-latency RPM 软件包。
  2. 您可以在 MicroShift config.yaml 中启用低延迟。
  3. 您创建了 TuneD 配置集。
  4. 您已配置了 microshift-baseline-variables.conf 文件。

流程

  1. /etc/microshift/ 目录中配置 tuned.yaml,例如:

    tuned.yaml 示例

    profile: microshift-baseline 
    1
    
    reboot_after_apply: True 
    2

    1
    控制激活 TuneD 配置集。在本例中,配置集的名称是 microshift-baseline
    2
    控制应用配置文件后是否必须重启主机。有效值为 TrueFalse。例如,使用 True 设置在部署新的 ostree 提交后自动重启主机。
    重要

    microshift-tuned.service 运行时,主机会被重启,但它不会在部署新提交时重启系统。您必须重启主机以启用新的提交,当 microshift-tuned.service 在该引导时运行时,系统会再次启动,并检测对配置集和变量的更改。

    这个双引导可能会影响回滚。确保您调整了在使用自动配置集激活时在回滚前允许的 greenboot 中的重启数量。例如,如果在 greenboot 的回滚前允许 3 个重启,请将该数字增加到 4。如需更多信息,请参阅"附加资源"列表。

  2. 输入以下命令启用 microshift-tuned.service 在每个系统启动时运行:

    $ sudo systemctl enable microshift-tuned.service
    重要

    如果将 reboot_after_apply 设置为 True,请确保 TuneD 配置集处于活跃状态,且不会在 MicroShift 服务外激活其他配置集。否则,启动 microshift-tuned.service 会导致主机重启。

  3. 运行以下命令启动 microshift-tuned.service

    $ sudo systemctl start microshift-tuned.service
    注意

    microshift-tuned.service 使用收集的校验和来检测对所选 TuneD 配置集和变量的更改。如果磁盘中没有 checksum,服务会激活 TuneD 配置集并重启主机。预计首先启动 microshift-tuned.service 时,主机会重启。

后续步骤

  • 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。

8.1.5. Using Red Hat Enterprise Linux for Real Time

如果您的工作负载对核心内核功能有严格的低延迟确定性要求,如中断处理和进程调度(在微秒)范围内,您可以使用 Red Hat Enterprise Linux for Real Time (实时内核)。实时内核的目标是提供可预测的响应时间的一致性、低延迟确定性。

在考虑系统调整时,请考虑以下因素:

  • 使用实时内核与标准内核一样,系统调优非常重要。
  • 在运行作为 RHEL 9 版本的一部分所提供的、未调整的标准内核系统上安装实时内核可能无法获得显著的好处。
  • 调优标准内核会获得大约 90% 的延迟。
  • 实时内核提供要求最高的工作负载所需的最后 10% 的延迟减少。

虽然低延迟工作负载不需要实时内核,但使用实时内核可以优化低延迟性能。您可以使用 RPM 软件包在主机上安装它,并将其包括在 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像部署中。

先决条件

  • 您有一个红帽订阅,其中包括 Red Hat Enterprise Linux for Real Time (实时内核)。例如,您的主机机器已注册,且 Red Hat Enterprise Linux (RHEL)附加到 RHEL for Real Time 订阅。
  • 您使用 x86_64 架构。

流程

  1. 运行以下命令来启用实时内核存储库:

    $ sudo subscription-manager repos --enable rhel-9-for-x86_64-rt-rpms
  2. 运行以下命令来安装实时内核:

    $ sudo dnf install -y kernel-rt
  3. 运行以下命令查询实时内核版本:

    $ RTVER=$(rpm -q --queryformat '%{version}-%{release}.%{arch}' kernel-rt | sort | tail -1)
  4. 运行以下命令,在 GRUB 中进行持久更改,该更改将实时内核指定为默认内核:

    $ sudo grubby --set-default="/boot/vmlinuz-${RTVER}+rt"
  5. 重启主机以激活实时内核。

后续步骤

  1. 为低延迟准备 MicroShift 工作负载。
  2. 可选:使用蓝图在 RHEL for Edge 镜像中安装实时内核。

您可以使用镜像构建器在 RHEL for Edge 镜像部署中包括实时内核。以下示例蓝图部分包括从之前为 MicroShift 集群配置低延迟所需的步骤收集的引用。

先决条件

  • 您已在包含 Red Hat Enterprise Linux for Real Time (实时内核)的主机上启用了红帽订阅。
  • 您使用 x86_64 架构。
  • 您已将 osbuild 配置为使用 kernel-rt 存储库。
重要

在用于构建提交的主机上必须启用包含实时内核的订阅。

流程

  • 在完整的安装蓝图中添加以下示例蓝图,以便在 RHEL for Edge 镜像中安装实时内核:

    实时内核的蓝图片断示例

    [[packages]]
    name = "microshift-low-latency"
    version = "*"
    
    # Kernel RT is supported only on the x86_64 architecture
    [customizations.kernel]
    name = "kernel-rt"
    
    [customizations.services]
    enabled = ["microshift", "microshift-tuned"]
    
    [[customizations.files]]
    path = "/etc/microshift/config.yaml"
    data = """
    kubelet:
      cpuManagerPolicy: static
      cpuManagerPolicyOptions:
        full-pcpus-only: "true"
      cpuManagerReconcilePeriod: 5s
      memoryManagerPolicy: Static
      topologyManagerPolicy: single-numa-node
      reservedSystemCPUs: 0-1
      reservedMemory:
      - limits:
          memory: 1100Mi
        numaNode: 0
      kubeReserved:
        memory: 500Mi
      systemReserved:
        memory: 500Mi
      evictionHard:
        imagefs.available: 15%
        memory.available: 100Mi
        nodefs.available: 10%
        nodefs.inodesFree: 5%
      evictionPressureTransitionPeriod: 5m
    """
    
    [[customizations.files]]
    path = "/etc/tuned/microshift-baseline-variables.conf"
    data = """
    # Isolated cores should be complementary to the kubelet configuration reserved CPUs.
    # Isolated and reserved CPUs must contain all online CPUs.
    # Core #3 is for testing offlining, therefore it is skipped.
    isolated_cores=2,4-5
    hugepages_size=2M
    hugepages=10
    additional_args=test1=on test2=true dummy
    offline_cpu_set=3
    """
    
    [[customizations.files]]
    path = "/etc/microshift/tuned.yaml"
    data = """
    profile: microshift-baseline
    reboot_after_apply: True
    """

后续步骤

  1. 完成镜像构建过程。
  2. 如果您还没有完成为 MicroShift 集群启用低延迟的步骤,请现在完成。使用这些步骤中收集的信息更新蓝图。
  3. 如果您还没有配置工作负载分区,请现在这样做。
  4. 为低延迟准备 MicroShift 工作负载。

从以下流程开始,在 RHEL for Edge 镜像中嵌入 MicroShift 来完成构建过程。然后在 RHEL for Edge 镜像中安装 MicroShift 的安装文档中完成剩余的步骤:

8.1.7. 为低延迟准备 MicroShift 工作负载

为了利用低延迟,在 MicroShift 上运行的工作负载必须使用 RuntimeClass 功能设置 microshift-low-latency 容器运行时配置。CRI-O RuntimeClass 对象使用 microshift-low-latency RPM 安装,因此只需要配置 pod 注解。

先决条件

  • 已安装 microshift-low-latency RPM 软件包。
  • 配置了工作负载分区。

流程

  • 使用以下示例在 pod 规格中设置以下注解:

    cpu-load-balancing.crio.io: "disable"
    irq-load-balancing.crio.io: "disable"
    cpu-quota.crio.io: "disable"
    cpu-load-balancing.crio.io: "disable"
    cpu-freq-governor.crio.io: "<governor>"

    运行 oslat 测试的 pod 示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: oslat
      annotations:
        cpu-load-balancing.crio.io: "disable" 
    1
    
        irq-load-balancing.crio.io: "disable" 
    2
    
        cpu-quota.crio.io: "disable" 
    3
    
        cpu-c-states.crio.io: "disable" 
    4
    
        cpu-freq-governor.crio.io: "<governor>" 
    5
    
    spec:
      runtimeClassName: microshift-low-latency 
    6
    
      containers:
      - name: oslat
        image: quay.io/container-perf-tools/oslat
        imagePullPolicy: Always
        resources:
          requests:
            memory: "400Mi"
            cpu: "2"
          limits:
            memory: "400Mi"
            cpu: "2"
        env:
        - name: tool
          value: "oslat"
        - name: manual
          value: "n"
        - name: PRIO
          value: "1"
        - name: delay
          value: "0"
        - name: RUNTIME_SECONDS
          value: "60"
        - name: TRACE_THRESHOLD
          value: ""
        - name: EXTRA_ARGS
          value: ""
        securityContext:
          privileged: true
          capabilities:
            add:
              - SYS_NICE
              - IPC_LOCK

    1
    禁用 pod 的 CPU 负载均衡。
    2
    选择 pod 不使用中断处理(IRQ)。
    3
    在 pod 运行时禁用 CPU 完全公平调度程序(CFS)配额。
    4
    为每个 CPU 启用或禁用 C-states。将值设为 disable,以便为高优先级 pod 提供最佳性能。
    5
    为每个 CPU 设置 cpufreq 调控器。对于高优先级工作负载,建议使用 performance governor。
    6
    runtimeClassName 必须与集群中配置的性能配置集的名称匹配。例如,microshift-low-latency
    注意

    仅在启用了 CPU 管理器静态策略以及带有保证 QoS 使用整个 CPU 的 pod 时,禁用 CPU 负载均衡。否则,禁用 CPU 负载均衡会影响集群中其他容器的性能。

    重要

    要使 pod 具有 Guaranteed QoS 类,在请求和限值中,它必须具有相同的 CPU 和内存值。请参阅 Guaranteed (Kubernetes 上游文档)

镜像蓝图是所需镜像自定义的持久定义,可让您创建多个构建。您不需要为每个镜像构建重新配置蓝图,而是编辑、重建、删除并保存蓝图,以便您可以保留重新构建镜像。

在 RHEL for Edge 镜像中安装实时内核的蓝图示例

name = "microshift-low-latency"
description = "RHEL 9.4 and MicroShift configured for low latency"
version = "0.0.1"
modules = []
groups = []
distro = "rhel-94"

[[packages]]
name = "microshift"
version = "*"

[[packages]]
name = "microshift-greenboot"
version = "*"

[[packages]]
name = "microshift-networking"
version = "*"

[[packages]]
name = "microshift-selinux"
version = "*"

[[packages]]
name = "microshift-low-latency"
version = "*"

# Kernel RT is only available for x86_64
[customizations.kernel]
name = "kernel-rt"

[customizations.services]
enabled = ["microshift", "microshift-tuned"]

[customizations.firewall]
ports = ["22:tcp", "80:tcp", "443:tcp", "5353:udp", "6443:tcp", "30000-32767:tcp", "30000-32767:udp"]

[customizations.firewall.services]
enabled = ["mdns", "ssh", "http", "https"]

[[customizations.firewall.zones]]
name = "trusted"
sources = ["10.42.0.0/16", "169.254.169.1"]

[[customizations.files]]
path = "/etc/microshift/config.yaml"
data = """
kubelet:
  cpuManagerPolicy: static
  cpuManagerPolicyOptions:
    full-pcpus-only: "true"
  cpuManagerReconcilePeriod: 5s
  memoryManagerPolicy: Static
  topologyManagerPolicy: single-numa-node
  reservedSystemCPUs: 0-1
  reservedMemory:
  - limits:
      memory: 1100Mi
    numaNode: 0
  kubeReserved:
    memory: 500Mi
  systemReserved:
    memory: 500Mi
  evictionHard:
    imagefs.available: 15%
    memory.available: 100Mi
    nodefs.available: 10%
    nodefs.inodesFree: 5%
  evictionPressureTransitionPeriod: 5m
"""

[[customizations.files]]
path = "/etc/tuned/microshift-baseline-variables.conf"
data = """
# Isolated cores should be complementary to the kubelet configuration reserved CPUs.
# Isolated and reserved CPUs must contain all online CPUs.
# Core #3 is for testing offlining, therefore it is skipped.
isolated_cores=2,4-5
hugepages_size=2M
hugepages=10
additional_args=test1=on test2=true dummy
offline_cpu_set=3
"""

[[customizations.files]]
path = "/etc/microshift/tuned.yaml"
data = """
profile: microshift-baseline
reboot_after_apply: True
"""

8.2. 工作负载分区

工作负载分区将节点 CPU 资源划分为不同的 CPU 集。主要目标是限制所有 control plane 组件的 CPU 使用量,为用户的工作负载保留其余设备 CPU 资源。

工作负载分区将保留的 CPU 分配给 MicroShift 服务、集群管理工作负载和基础架构 pod,确保集群部署中剩余的 CPU 不受影响,并只可用于非平台工作负载。

8.2.1. 启用工作负载分区

要在 MicroShift 上启用工作负载分区,请进行以下配置更改:

  • 更新 MicroShift config.yaml 文件,使其包含 kubelet 配置文件。
  • 创建 CRI-O systemd 和配置文件。
  • 分别为 MicroShift 和 CRI-O 服务创建和更新 systemd 配置文件。

流程

  1. 更新 MicroShift config.yaml 文件,使其包含 kubelet 配置文件,以便为工作负载启用和配置 CPU Manager:

    • 在路径 /etc/kubernetes/openshift-workload-pinning 中创建 kubelet 配置文件。kubelet 配置指示 kubelet 根据容量和可分配 CPU 修改节点资源。

      kubelet 配置示例

      # ...
      {
        "management": {
          "cpuset": "0,6,7" 
      1
      
        }
      }
      # ...

      1
      cpuset 适用于具有 8 个 VCPU (4 个内核)的计算机,并在整个文档中有效。
    • 更新路径 /etc/microshift/config.yaml 中的 MicroShift config.yaml 文件。在 MicroShift config.yaml 文件中嵌入 kubelet 配置,以便为工作负载启用和配置 CPU Manager。

      MicroShift config.yaml 示例

      # ...
      kubelet:
        reservedSystemCPUs: 0,6,7 
      1
      
        cpuManagerPolicy: static
        cpuManagerPolicyOptions:
          full-pcpus-only: "true" 
      2
      
        cpuManagerReconcilePeriod: 5s
      # ...

      1
      用于系统守护进程和中断/计时器的专用 cpuset。
      2
      kubelet 配置将 CPUManagerPolicyOptions 选项设置为 full-pcpus-only,以确保将整个内核分配给容器工作负载。
  2. 创建 CRI-O systemd 和配置文件:

    • 在路径 /etc/crio/crio.conf.d/20-microshift-workload-partition.conf 中创建 CRI-O 配置文件,该文件会覆盖 11-microshift-ovn.conf 文件中已存在的默认配置。

      CRI-O 配置示例

      # ...
      [crio.runtime]
      infra_ctr_cpuset = "0,6,7"
      
      [crio.runtime.workloads.management]
      activation_annotation = "target.workload.openshift.io/management"
      annotation_prefix = "resources.workload.openshift.io"
      resources = { "cpushares" = 0, "cpuset" = "0,6,7" }
      # ...

    • 在路径 /etc/systemd/system/crio.service.d/microshift-cpuaffinity.conf 中为 CRI-O 创建 systemd 文件。

      CRI-O systemd 配置示例

      # ...
      [Service]
      CPUAffinity=0,6,7
      # ...

  3. 为 MicroShift 和 CRI-O 服务创建并更新带有 CPUAffinity 值的 systemd 配置文件:

    • 在路径 /etc/systemd/system/microshift.service.d/microshift-cpuaffinity.conf 中创建 MicroShift 服务 systemd 文件。MicroShift 将使用 systemd CPUAffinity 值进行固定。

      MicroShift 服务 systemd 配置示例

      # ...
      [Service]
      CPUAffinity=0,6,7
      # ...

    • 更新 MicroShift ovs-vswitchd systemd 文件中的 CPUAffinity 值,该文件路径 /etc/systemd/system/ovs-vswitchd.service.d/microshift-cpuaffinity.conf

      MicroShift ovs-vswitchd systemd 配置示例

      # ...
      [Service]
      CPUAffinity=0,6,7
      # ...

    • 更新路径 /etc/systemd/system/ovsdb-server.service.d/microshift-cpuaffinity.conf中的 MicroShift ovsdb-server systemd 文件中的 CPUAffinity

      MicroShift ovsdb-server systemd 配置示例

      # ...
      [Service]
      CPUAffinity=0,6,7
      # ...

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部