5.2. 在 MicroShift 中配置入口控制
您可以通过更新 MicroShift 服务配置文件或使用配置片断来使用详细的入口控制设置。
-
config.yaml配置文件优先于内置设置。每次 MicroShift 服务启动时都会读取config.yaml文件。 -
配置片断 YAML 优先于内置设置和
config.yaml配置文件。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 有对节点的 root 访问权限。
- 您的节点使用 OVN-Kubernetes Container Network Interface (CNI)插件。
流程
使用以下两种方式之一应用入口控制设置:
-
通过在
/etc/microshift/目录中生成提供的文件的副本,将其命名为 config.yaml 并将其保留在源目录中,来更新 MicroShiftconfig.yaml.defaultconfig.yaml配置文件。 -
使用配置片段应用您想要的 ingress 控制设置。为此,请创建一个配置片断 YAML 文件,并将其放在
/etc/microshift/config.d/配置中。
-
通过在
将 MicroShift YAML 的
ingress部分中的默认值替换为您的有效值,或将配置片断文件替换为您需要的部分。带有默认值的 Ingress 控制器配置字段
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 5.1. Ingress 控制器配置字段定义表 参数 描述 ingressMicroShift
config.yaml文件的ingress部分定义了 OpenShift Container PlatformIngressControllerAPI 实现的可配置参数。下表中的所有参数都是 MicroShiftconfig.yaml的ingress部分中的子部分。accessLogging这个
ingress子部分描述了客户端请求的日志记录方式。如果status字段为空,则禁用访问日志记录。当 status 字段设置为Enabled时,使用accessLogging参数配置访问请求,并且accessLogging.destination.type会自动设置为Container。-
启用后,访问日志记录是
openshift-router日志的一部分。MicroShift 的 sos report 过程会捕获来自这个 pod 的日志。
accessLogging.destination日志的目的地。日志的目的地可以是本地 sidecar 容器或远程的。默认值为 null。
accessLogging.destination.type日志的目标类型。有效值为 container
或Syslog。-
将此值设置为
Container指定日志应该进入 sidecar 容器。当目标类型设置为容器时,会自动创建名为logs的容器。使用容器日志意味着当日志速率超过容器运行时容量或自定义日志记录解决方案容量时,可能会丢弃日志。您必须有一个自定义日志记录解决方案,从这个 sidecar 读取日志。 -
将此值设置为
Syslog指定日志发送到 Syslog 端点。您必须配置自定义 Syslog 实例,并指定可以接收 Syslog 消息的端点。您必须有一个自定义 Syslog 实例。例如,开始使用内核日志记录。
accessLogging.destination.container描述容器日志记录目的地类型的参数。您必须配置从这个 sidecar 读取日志的自定义日志记录解决方案。accessLogging.destination.container.maxLength可选配置。默认值为
1024字节。消息长度必须至少为480,且不能超过8192字节。accessLogging.destination.syslog描述
Syslog日志记录目的地类型的参数。您必须使用可接收 Syslog 消息的端点配置自定义 Syslog 实例。accessLogging.destination.syslog.address设置
Syslog目标类型时所需的配置。有效值是接收日志消息的 syslog 端点的 IP 地址。accessLogging.destination.syslog.facility设置
Syslog目的地类型时的可选配置。指定日志消息的 syslog 工具。如果该字段为空,则工具为local1。否则,字段必须指定以下有效 syslog 工具之一:kern,user,mail,daemon,auth,syslog,lpr,news,uucp,cron, auth2',ftp,ntp, audit ,audit,alert,cron2,local0,local1,local2,local3,local4,local5,local5,local6, 或 .7.accessLogging.destination.syslog.maxLength设置
Syslog目的地类型时的可选配置。Syslog消息的最大长度。消息长度必须至少为480,且不能超过4096字节。如果此字段为空,则最大长度设置为默认值1024字节。accessLogging.destination.syslog.port设置
Syslog目标类型时所需的配置。接收日志消息的 syslog 端点的 UDP 端口号。默认值为0。httpCaptureCookies指定您要在访问日志中捕获的 HTTP cookie。如果
httpCaptureCookies字段为空,则访问日志不会捕获 Cookie。默认值为空。配置ingress.accessLogging.httpCaptureCookies会自动启用入口访问日志记录。对于您要捕获的任何 Cookie,还必须设置matchType和maxLength参数。例如:
httpCaptureCookies: - matchType: Exact maxLength: 128 name: MYCOOKIEhttpCaptureCookies: - matchType: Exact maxLength: 128 name: MYCOOKIECopy to Clipboard Copied! Toggle word wrap Toggle overflow
httpCaptureCookies.matchType指定 Cookie 的字段名称与捕获 Cookie 设置完全匹配,或者是捕获 Cookie 设置的前缀。有效值是
Exact,用于精确字符串 match 和Prefix用于字符串前缀匹配。-
如果使用
Exact设置,还必须在httpCaptureCookies.name字段中指定一个名称。 -
如果使用
Prefix设置,还必须在httpCaptureCookies.namePrefix字段中指定前缀。例如,当namePrefix为 "mush" 时,matchType: Prefix的设置会捕获一个名为 "mush" 或 "mushroom" 的 Cookie,但不命名"room"。第一个匹配的 Cookie 被捕获。
httpCaptureCookies.maxLength指定已记录 Cookie 的最大长度,其中包括 Cookie 名称、Cookie 值和字符分隔符。如果日志条目超过这个长度,则会在日志消息中截断该值。入口控制器可能会对请求中的 HTTP 标头总长度施加单独的绑定。最小值为
1字节,最大值为1024字节。默认值为0。httpCaptureCookies.name指定用于 Cookie 名称匹配的确切名称,如
httpCaptureCookies.matchType参数中设置的。该值必须是有效的 HTTP cookie 名称,如 RFC 6265 第 4.1 部分中定义。最小长度为1字节,最大长度为1024字节。httpCaptureCookies.namePrefix指定 Cookie 名称匹配的前缀,如
httpCaptureCookies.matchType参数中设置的。该值必须是有效的 HTTP cookie 名称,如 RFC 6265 第 4.1 部分中定义。最小长度为1字节,最大长度为1024字节。httpCaptureHeaders定义应在访问日志中捕获的 HTTP 标头。此字段是一个列表,允许单独捕获请求和响应标头。当此字段为空时,不会捕获标头。这个选项只适用于纯文本 HTTP 连接,以及入口控制器终止加密的 HTTP 连接的安全:例如,edge-terminated 或 reencrypt 连接。对于 TLS
透传连接,无法捕获标头。配置ingress.accessLogging.httpCaptureHeaders参数会自动启用入口访问日志记录。httpCaptureHeaders.request指定要捕获的 HTTP 请求标头。当此字段为空时,不会捕获任何请求标头。
httpCaptureHeaders.request.maxLength指定标头值的最大长度。当标头值超过这个长度时,在日志消息中会截断该值。最低要求的值是
1字节。入口控制器可能会对请求中的 HTTP 标头总长度施加单独的绑定。httpCaptureHeaders.request.name指定标头名称。该值必须是有效的 HTTP 标头名称,如 RFC 2616 部分 4.2 中定义的。如果配置这个值,您必须指定
maxLength和name值。httpCaptureHeaders.response指定要捕获的 HTTP 响应标头。如果此字段为空,则不会捕获响应标头。
httpCaptureHeaders.response.maxLength指定标头值的最大长度。如果标头值超过这个长度,则会在日志消息中截断该值。入口控制器可能会对请求中的 HTTP 标头总长度施加单独的绑定。
httpCaptureHeaders.response.name指定标头名称。该值必须是有效的 HTTP 标头名称,如 RFC 2616 部分 4.2 中定义的。
httpLogFormat指定 HTTP 请求的日志消息格式。如果此字段为空,日志消息使用默认的 HTTP 日志格式。有关 HAProxy 默认 HTTP 日志格式,请参阅 HAProxy 文档。
status指定是否记录访问。有效值为
Enabled和Disabled。默认值为Disabled。-
当您配置
ingress.accessLogging.httpCaptureHeaders或ingress.accessLogging.httpCaptureCookies时,您必须将ingress.accessLogging.status设置为Enabled。 -
当您将
ingress.status字段设置为Enabled时,accessLogging.destination.type会自动设置为Container,路由器会在logs容器中记录所有请求。 -
如果将此值设置为
Disabled,路由器不会在访问日志中记录任何请求。
certificateSecret对包含 MicroShift ingress 控制器服务的默认证书的 secret 的
kubernetes.io/tls类型的引用。当路由没有指定其自身证书时,会使用certificateSecret参数。所有使用的 secret 必须包含tls.key密钥文件内容和tls.crt证书文件内容。-
如果没有设置
certificateSecret参数,则自动生成和使用通配符证书。通配符证书对入口控制器默认域及其子域有效。生成的证书颁发机构(CA)会自动与节点的信任存储集成。 - 使用生成和用户指定的证书会自动与 MicroShift 内置 OAuth 服务器集成。
clientTLS验证客户端对节点和服务的访问。因此,启用 mutual TLS 身份验证。如果没有设置此参数,则不会启用客户端 TLS。您必须设置
spec.clientTLS.clientCertificatePolicy和spec.clientTLS.clientCA参数才能使用客户端 TLS。clientTLS.AllowedSubjectPatterns可选子字段指定与有效客户端证书上可分辨名称匹配的正则表达式列表,以过滤请求。当您有客户端身份验证时,此参数很有用。使用此参数使入口控制器根据可分辨的名称拒绝证书。需要 Perl 兼容正则表达式(PCRE)语法。您必须设置
spec.clientTLS.clientCertificatePolicy和spec.clientTLS.clientCA参数,以使用clientTLS.AllowedSubjectPatterns。重要配置后,此字段必须包含有效的表达式,或者 MicroShift 服务失败。至少一种模式必须与客户端证书的可分辨名称匹配;否则,入口控制器拒绝证书,并拒绝连接。
clientTLS.clientCA指定
openshift-ingress命名空间中的所需配置映射。需要此项以启用客户端 TLS。配置映射必须包含名为ca-bundle.pem的证书颁发机构(CA)捆绑包,或者默认路由器部署失败。clientTLS.clientCA.nameclientTLS.clientCA值中引用的配置映射的metadata.name。clientTLS.ClientCertificatePolicy必需或可选是有效的值。设置为Required以启用客户端 TLS。入口控制器只检查边缘终止和重新加密的 TLS 路由的客户端证书。入口控制器无法检查纯文本 HTTP 或 passthrough TLS 路由的证书。defaultHTTPVersion为入口控制器设置 HTTP 版本。HTTP 1.1 的默认值为
1。建议为 HTTP 2 和 3 设置负载均衡器。forwardedHeaderPolicy指定入口控制器何时和如何设置 Forwarded ,
X-,Forwarded-ForX-Forwarded-Host,X-Forwarded-Port,X-Forwarded-Proto, 和X-Forwarded-Proto-VersionHTTP 标头。以下值有效:-
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 连接。此字段允许的值是
Respond和Ignore。默认值为Respond。空请求通常来自负载均衡器健康探测或预分配,通常可以忽略。但是,网络错误和端口扫描也可能导致这些请求。因此,将此字段设置为Ignore可妨碍检测或诊断网络问题,并检测入侵尝试。-
当策略设置为
Respond时,入口控制器发送 HTTP400或408响应,在启用了访问日志时记录连接,并在适当的指标中统计连接。 -
当策略设置为
Ignore时,http-ignore-probes参数将添加到HAproxy进程配置中。添加此参数后,ingress 控制器会在不发送响应的情况下关闭连接,然后记录连接或递增指标。
logEmptyRequests指定没有接收和记录请求的连接。
log和Ignore是有效的值。空请求通常来自负载均衡器健康探测或预分配,通常可以忽略。但是,网络错误和端口扫描也可能导致这些请求。因此,将此字段设置为Ignore可妨碍检测或诊断网络问题,并检测入侵尝试。默认值为Log。-
将此值设置为
Log表示应记录事件。 -
将此值设置为
Ignore会在HAproxy配置中设置dontlognull选项。
httpErrorCodePages描述自定义错误代码页面。要使用此设置,您必须配置
httpErrorCodePages.name参数。httpErrorCodePages.name指定自定义错误代码页面。您只能为
503和404页面代码自定义错误。要自定义错误代码页面,请指定ConfigMap名称。ConfigMap对象必须位于openshift-ingress命名空间中,且以 error-page-<error code>.http格式包含键,其中 <error code> 是一个 HTTP 状态代码。ConfigMap中的每个值都必须是完整的响应,包括 HTTP 标头。此参数的默认值为 null。ports定义默认路由器端口。
ports.http默认路由器 http 端口。必须在 1-65535 之间。默认值为
80。ports.https默认路由器 https 端口。必须在 1-65535 之间。默认值为
443。routeAdmission定义处理新路由声明的策略,如允许或拒绝命名空间之间的声明。
routeAdmission.namespaceOwnership描述如何处理跨命名空间的主机名声明。默认为
InterNamespaceAllowed。以下是有效值:-
严格不允许路由在命名空间间声明相同的主机名。 -
InterNamespaceAllowed允许路由在命名空间间声明相同主机名的不同路径。
routeAdmission.wildcardPolicy控制入口控制器如何使用配置的通配符策略处理路由。
WildcardsAllowed和WildcardsDisallowed是有效的值。默认值为WildcardsDisallowed。-
WildcardPolicyAllowed表示入口控制器接受具有任何通配符策略的路由。 -
WildcardPolicyDisallowed表示入口控制器只接受采用None通配符策略的路由。
重要将通配符策略从
WildcardsAllowed更改为WildcardsDisallowed会导致接受路由具有子域的通配符策略停止工作。ingress 控制器仅在使用None通配符策略重新创建后读取这些路由。status默认路由器状态。
Managed或Removed是有效的值。tlsSecurityProfiletlsSecurityProfile指定入口控制器的 TLS 连接的设置。如果没有设置,则默认值基于apiservers.config.openshift.io/cluster资源。Old或Custom配置集的 TLS1.0版本由入口控制器自动转换为1.1。intermediate是默认设置。-
入口控制器的最低 TLS 版本是
1.1。最大 TLS 版本为1.3。
注意TLSProfile状态显示配置的安全配置集的密码和最小 TLS 版本。当开发新的密码且发现现有密码不安全时,配置集会被有意改变。根据特定进程可以使用哪些密码,可以减少可用的列表。tlsSecurityProfile.custom用户定义的 TLS 安全配置集。如果您配置此参数和相关参数,请使用非常小心。
tlsSecurityProfile.custom.ciphers指定在 TLS 握手过程中协商的加密算法。Operator 可能会删除其操作对象不支持的条目。
tlsSecurityProfile.custom.minTLSVersion指定 TLS 握手期间协商的 TLS 协议的最小版本。例如,要使用 TLS 版本 1.1、1.2 和 1.3,请将值设为
VersionTLS11。minTLSVersion的最高有效值为VersionTLS12。tlsSecurityProfile.intermediate您可以将此 TLS 配置集用于大多数服务。中间兼容性(推荐)
tlsSecurityProfile.old用于向后兼容。旧的向后兼容性。
tlsSecurityProfile.type有效值为
Intermediate、Old或Custom。不支持Modern值。tuningOptions指定用于调整入口控制器 pod 性能的选项。
tuningOptions.clientFinTimeout指定入口控制器在服务器关闭连接前等待客户端响应时打开的连接的时间。默认超时为
1s。tuningOptions.clientTimeout指定入口控制器在等待客户端响应时保持打开的时长。默认超时为
30s。tuningOptions.headerBufferBytes为 ingress 控制器连接会话指定保留多少内存(以字节为单位)。如果为 ingress 控制器启用了 HTTP/2,则必须至少为
16384。如果没有设置,则默认值为32768字节。重要不建议设置此字段,因为
headerBufferMaxRewriteBytes参数值太小可能会破坏入口控制器。相反,headerBufferMaxRewriteBytes的值太大可能会导致入口控制器使用比必要更多的内存。tuningOptions.headerBufferMaxRewriteBytes指定在 HTTP 标头重写和附加 ingress 控制器连接会话时,应保留多少内存(以字节为单位)。
headerBufferMaxRewriteBytes的最小值是4096。headerBufferBytes必须大于传入的 HTTP 请求的headerBufferMaxRewriteBytes值。如果没有设置,则默认值为8192字节。重要不建议设置此字段,因为
headerBufferMaxRewriteBytes值太小可能会破坏入口控制器和headerBufferMaxRewriteBytes,它们太大可能会导致入口控制器使用比必要更多的内存。tuningOptions.healthCheckInterval指定路由器在健康检查之间等待的时间(以秒为单位)。默认值为
5s。tuningOptions.maxConnections指定可为每个
HAProxy进程建立的最大同时连接数。增加这个值可让每个入口控制器 pod 以额外的系统资源成本处理更多连接。允许的值是0、-1、以及范围为2000和2000000内的任何值,或者字段可以留空。-
如果此字段为空或者值为
0,入口控制器将使用默认值50000。 -
如果字段的值为
-1,则HAProxy进程会根据运行中容器中的可用ulimits动态计算最大值。与当前默认值50000相比,此进程会产生大量内存用量。 -
如果字段的值大于当前操作系统限制,则
HAProxy进程不会启动。 -
如果您选择了一个离散值,并且路由器 pod 迁移到新节点,则新节点可能没有配置相同的
ulimit。在这种情况下,pod 无法启动。 -
您可以使用
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。-
启用后,访问日志记录是
运行以下命令完成任何其他配置,然后启动或重启 MicroShift:
sudo systemctl start microshift
$ sudo systemctl start microshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow sudo systemctl restart microshift
$ sudo systemctl restart microshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在进行入口配置更改并重启 MicroShift 后,您可以检查路由器 Pod 的年龄,以确保应用更改。
要检查路由器 pod 的状态,请运行以下命令:
oc get pods -n openshift-ingress
$ oc get pods -n openshift-ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE router-default-8649b5bf65-w29cn 1/1 Running 0 6m10s
NAME READY STATUS RESTARTS AGE router-default-8649b5bf65-w29cn 1/1 Running 0 6m10sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.2.1. 为 ingress 控制器 certificateSecret 创建 secret 复制链接链接已复制到粘贴板!
使用这个流程创建由 MicroShift 配置文件中的 certificateSecret 参数值引用的 secret。此 secret 包含由入口控制器提供的默认证书。
任何使用的证书都会自动与 MicroShift 内置 OAuth 服务器集成。
先决条件
- 有对 MicroShift 的 root 访问权限。
-
已安装 OpenShift CLI(
oc)。 - 您的私钥没有加密,或者您已解密它以导入到 MicroShift 中。
流程
创建包含通配符证书链和密钥的 secret :
oc create secret tls <secret> --cert=</path/to/cert.crt> --key=</path/to/cert.key> -n openshift-ingress$ oc create secret tls <secret>1 --cert=</path/to/cert.crt>2 --key=</path/to/cert.key>3 -n openshift-ingressCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要证书必须包含显示 csi
apps.<nodename>.<domain>的subjectAltName扩展。-
使用新创建的 secret 更新 MicroShift 配置 YAML 中的
certificateSecret参数值。 运行以下命令完成任何其他配置,然后启动或重启 MicroShift:
sudo systemctl start microshift
$ sudo systemctl start microshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow sudo systemctl restart microshift
$ sudo systemctl restart microshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.2.2. 为入口控制器配置 TLS 安全配置集 复制链接链接已复制到粘贴板!
您可以通过在 MicroShift 配置 YAML 中设置类型,为 ingress 控制器配置 TLS 安全配置集。
先决条件
- 有对 MicroShift 节点的 root 访问权限。
流程
在 MicroShift YAML 配置文件中添加
spec.tlsSecurityProfile字段。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件以使改变生效。
运行以下命令重启 MicroShift:
sudo systemctl restart microshift
$ sudo systemctl restart microshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow