仅在 Google Cloud Platform (GCP) 上支持 NMState Operator 用于配置 IPsec。 |
通过启用 IPsec,您可以加密节点之间内部 Pod 到 Pod 的集群流量以及 Pod 与集群外部的 IPsec 端点之间的外部流量。OVN-Kubernetes 集群网络上节点之间所有 Pod 到 Pod 的网络流量都以传输模式使用 IPsec 加密。
默认情况下禁用 IPsec。您可以在安装集群期间或之后启用 IPsec。有关集群安装的信息,请参阅OpenShift Container Platform 安装概述。
OpenShift Container Platform 集群上的 IPsec 存在以下支持限制
您必须在更新到 OpenShift Container Platform 4.15 之前禁用 IPsec。已知问题可能会导致在未禁用 IPsec 的情况下更新时 Pod 到 Pod 通信中断。(OCPBUGS-43323)
在 IBM Cloud® 上,IPsec 仅支持 NAT-T。此平台不支持封装安全有效负载 (ESP)。
如果您的集群使用托管控制平面 用于 Red Hat OpenShift Container Platform,则不支持用于 Pod 到 Pod 或到外部主机的流量的 IPsec 加密。
如果一个或多个接口连接到 Open vSwitch (OVS),则不支持在任何网络接口上使用 ESP 硬件卸载。为您的集群启用 IPsec 将触发使用连接到 OVS 的接口的 IPsec。默认情况下,OpenShift Container Platform 将禁用连接到 OVS 的任何接口上的 ESP 硬件卸载。
如果您为未连接到 OVS 的网络接口启用了 IPsec,则集群管理员必须手动禁用未连接到 OVS 的每个接口上的 ESP 硬件卸载。
以下列表概述了 IPsec 文档中的关键任务
在集群安装后启用和禁用 IPsec。
为集群和外部主机之间的流量配置 IPsec 加密。
验证 IPsec 是否加密不同节点上的 Pod 之间的流量。
在 OpenShift Container Platform 集群上使用 IPsec 时,您可以选择以下操作模式
模式 | 描述 | 默认值 |
---|---|---|
|
没有流量被加密。这是集群默认值。 |
是 |
|
Pod 到 Pod 的流量将按照“Pod 到 Pod IPsec 加密类型的网络流量”中所述进行加密。完成 IPsec 的必要配置步骤后,可能会加密到外部节点的流量。 |
否 |
|
完成 IPsec 的必要配置步骤后,可能会加密到外部节点的流量。 |
否 |
要支持使用 IPsec 对外部主机的流量进行加密,请确保满足以下前提条件。
OVN-Kubernetes 网络插件必须配置为本地网关模式,其中 ovnKubernetesConfig.gatewayConfig.routingViaHost=true
。
已安装 NMState Operator。此 Operator 对于指定 IPsec 配置是必需的。有关更多信息,请参阅 Kubernetes NMState Operator。
仅在 Google Cloud Platform (GCP) 上支持 NMState Operator 用于配置 IPsec。 |
已安装 Butane 工具 (butane
)。要安装 Butane,请参阅 安装 Butane。
这些前提条件是将证书添加到主机 NSS 数据库以及配置 IPsec 以与外部主机通信所必需的。
必须配置机器之间的网络连接,以允许 OpenShift Container Platform 集群组件进行通信。每台机器必须能够解析集群中所有其他机器的主机名。
协议 | 端口 | 描述 |
---|---|---|
UDP |
|
IPsec IKE 数据包 |
|
IPsec NAT-T 数据包 |
|
ESP |
N/A |
IPsec 封装安全有效负载 (ESP) |
对于 Pod 到 Pod 流量的 IPsec 加密,以下部分描述了哪些特定的 Pod 到 Pod 流量被加密,使用了哪种加密协议,以及如何处理 X.509 证书。这些部分不适用于集群和外部主机之间的 IPsec 加密,您必须为您的特定外部网络基础设施手动配置这些加密。
启用 IPsec 后,只有以下 Pod 之间的网络流量流会被加密:
集群网络上不同节点上的 Pod 之间的流量
来自主机网络上的 Pod 到集群网络上的 Pod 的流量
以下流量流不会被加密:
集群网络上同一节点上的 Pod 之间的流量
主机网络上的 Pod 之间的流量
来自集群网络上的 Pod 到主机网络上的 Pod 的流量
加密和未加密的流量如下图所示
OpenShift Container Platform 支持对外部主机的流量进行 IPsec 加密,您必须提供 TLS 证书。
作为集群管理员,您可以启用 Pod 到 Pod IPsec 加密以及集群和外部 IPsec 端点之间的 IPsec 加密。
您可以通过以下任一模式配置 IPsec:
Full
:对 Pod 到 Pod 和外部流量进行加密
External
:对外部流量进行加密
如果您需要除了 Pod 到 Pod 流量之外还要配置对外部流量的加密,则还必须完成“配置外部流量的 IPsec 加密”过程。
安装 OpenShift CLI (oc
)。
您已以具有 cluster-admin
权限的用户身份登录到集群。
您已将集群 MTU 大小减小了 46
字节,以允许 IPsec ESP 报头的开销。
要启用 IPsec 加密,请输入以下命令:
$ oc patch networks.operator.openshift.io cluster --type=merge \
-p '{
"spec":{
"defaultNetwork":{
"ovnKubernetesConfig":{
"ipsecConfig":{
"mode":<mode>
}}}}}'
其中
模式
指定 External
仅加密到外部主机的流量,或指定 Full
加密 Pod 到 Pod 流量以及可选的到外部主机的流量。默认情况下,IPsec 已禁用。
可选:如果您需要加密到外部主机的流量,请完成“配置外部流量的 IPsec 加密”过程。
要查找 OVN-Kubernetes 数据平面 Pod 的名称,请输入以下命令:
$ oc get pods -n openshift-ovn-kubernetes -l=app=ovnkube-node
ovnkube-node-5xqbf 8/8 Running 0 28m
ovnkube-node-6mwcx 8/8 Running 0 29m
ovnkube-node-ck5fr 8/8 Running 0 31m
ovnkube-node-fr4ld 8/8 Running 0 26m
ovnkube-node-wgs4l 8/8 Running 0 33m
ovnkube-node-zfvcl 8/8 Running 0 34m
通过运行以下命令来验证您的集群上是否已启用 IPsec:
作为集群管理员,当 IPsec 配置为 |
$ oc -n openshift-ovn-kubernetes rsh ovnkube-node-<XXXXX> ovn-nbctl --no-leader-only get nb_global . ipsec
其中
<XXXXX>
指定上一步中 Pod 的随机字母序列。
true
作为集群管理员,要使用 IPsec 加密外部流量,您必须为您的网络基础设施配置 IPsec,包括提供 PKCS#12 证书。由于此过程使用 Butane 创建机器配置,因此您必须安装butane
命令。
应用机器配置后,机器配置操作符将重新启动集群中受影响的节点以推出新的机器配置。 |
安装 OpenShift CLI (oc
)。
您已在本地计算机上安装了butane
实用程序。
您已在集群上安装了 NMState 操作符。
您已以具有 cluster-admin
权限的用户身份登录到集群。
您拥有 IPsec 端点的现有 PKCS#12 证书和 PEM 格式的 CA 证书。
您已在集群上启用Full
或External
模式下的 IPsec。
OVN-Kubernetes 网络插件必须配置为本地网关模式,其中 ovnKubernetesConfig.gatewayConfig.routingViaHost=true
。
使用 NMState 操作符节点网络配置策略创建 IPsec 配置。更多信息,请参见 Libreswan 作为 IPsec VPN 实现。
要识别充当 IPsec 端点的集群节点的 IP 地址,请输入以下命令
$ oc get nodes
创建一个名为ipsec-config.yaml
的文件,其中包含 NMState 操作符的节点网络配置策略,例如以下示例。有关NodeNetworkConfigurationPolicy
对象的概述,请参见 Kubernetes NMState 项目。
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: ipsec-config
spec:
nodeSelector:
kubernetes.io/hostname: "<hostname>" (1)
desiredState:
interfaces:
- name: <interface_name> (2)
type: ipsec
libreswan:
left: <cluster_node> (3)
leftid: '%fromcert'
leftrsasigkey: '%cert'
leftcert: left_server
leftmodecfgclient: false
right: <external_host> (4)
rightid: '%fromcert'
rightrsasigkey: '%cert'
rightsubnet: <external_address>/32 (5)
ikev2: insist
type: transport
1 | 指定要应用策略的主机名。此主机在 IPsec 配置中充当左侧主机。 |
2 | 指定要在主机上创建的接口的名称。 |
3 | 指定在集群端终止 IPsec 隧道的主机名。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。 |
4 | 指定外部主机名,例如host.example.com 。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。 |
5 | 指定外部主机的 IP 地址,例如10.1.2.3/32 。 |
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: ipsec-config
spec:
nodeSelector:
kubernetes.io/hostname: "<hostname>" (1)
desiredState:
interfaces:
- name: <interface_name> (2)
type: ipsec
libreswan:
left: <cluster_node> (3)
leftid: '%fromcert'
leftmodecfgclient: false
leftrsasigkey: '%cert'
leftcert: left_server
right: <external_host> (4)
rightid: '%fromcert'
rightrsasigkey: '%cert'
rightsubnet: <external_address>/32 (5)
ikev2: insist
type: tunnel
1 | 指定要应用策略的主机名。此主机在 IPsec 配置中充当左侧主机。 |
2 | 指定要在主机上创建的接口的名称。 |
3 | 指定在集群端终止 IPsec 隧道的主机名。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。 |
4 | 指定外部主机名,例如host.example.com 。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。 |
5 | 指定外部主机的 IP 地址,例如10.1.2.3/32 。 |
要配置 IPsec 接口,请输入以下命令
$ oc create -f ipsec-config.yaml
提供以下证书文件以添加到每个主机上的网络安全服务 (NSS) 数据库中。这些文件作为后续步骤中的 Butane 配置的一部分导入。
left_server.p12
:IPsec 端点的证书捆绑包
ca.pem
:您用来签署证书的证书颁发机构
创建机器配置以将您的证书添加到集群
要为控制平面和工作节点创建 Butane 配置文件,请输入以下命令
$ for role in master worker; do
cat >> "99-ipsec-${role}-endpoint-config.bu" <<-EOF
variant: openshift
version: 4.17.0
metadata:
name: 99-${role}-import-certs
labels:
machineconfiguration.openshift.io/role: $role
systemd:
units:
- name: ipsec-import.service
enabled: true
contents: |
[Unit]
Description=Import external certs into ipsec NSS
Before=ipsec.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ipsec-addcert.sh
RemainAfterExit=false
StandardOutput=journal
[Install]
WantedBy=multi-user.target
storage:
files:
- path: /etc/pki/certs/ca.pem
mode: 0400
overwrite: true
contents:
local: ca.pem
- path: /etc/pki/certs/left_server.p12
mode: 0400
overwrite: true
contents:
local: left_server.p12
- path: /usr/local/bin/ipsec-addcert.sh
mode: 0740
overwrite: true
contents:
inline: |
#!/bin/bash -e
echo "importing cert to NSS"
certutil -A -n "CA" -t "CT,C,C" -d /var/lib/ipsec/nss/ -i /etc/pki/certs/ca.pem
pk12util -W "" -i /etc/pki/certs/left_server.p12 -d /var/lib/ipsec/nss/
certutil -M -n "left_server" -t "u,u,u" -d /var/lib/ipsec/nss/
EOF
done
要将您在上一步中创建的 Butane 文件转换为机器配置,请输入以下命令
$ for role in master worker; do
butane -d . 99-ipsec-${role}-endpoint-config.bu -o ./99-ipsec-$role-endpoint-config.yaml
done
要将机器配置应用于您的集群,请输入以下命令
$ for role in master worker; do
oc apply -f 99-ipsec-${role}-endpoint-config.yaml
done
随着机器配置操作符 (MCO) 更新每个机器配置池中的机器,它将逐个重新启动每个节点。您必须等到所有节点都更新完毕后,外部 IPsec 连接才能可用。 |
通过输入以下命令检查机器配置池状态
$ oc get mcp
成功更新的节点具有以下状态:UPDATED=true
,UPDATING=false
,DEGRADED=false
。
默认情况下,MCO 每次在一个池中更新一台机器,导致迁移所需的时间随着集群大小的增加而增加。 |
要确认 IPsec 机器配置已成功推出,请输入以下命令
确认已创建 IPsec 机器配置
$ oc get mc | grep ipsec
80-ipsec-master-extensions 3.2.0 6d15h
80-ipsec-worker-extensions 3.2.0 6d15h
确认 IPsec 扩展已应用于控制平面节点
$ oc get mcp master -o yaml | grep 80-ipsec-master-extensions -c
2
确认 IPsec 扩展已应用于工作节点
$ oc get mcp worker -o yaml | grep 80-ipsec-worker-extensions -c
2
有关 nmstate IPsec API 的更多信息,请参见 IPsec 加密
作为集群管理员,您可以删除到外部主机的现有 IPsec 隧道。
安装 OpenShift CLI (oc
)。
您已以具有 cluster-admin
权限的用户身份登录到集群。
您已在集群上启用Full
或External
模式下的 IPsec。
创建一个名为remove-ipsec-tunnel.yaml
的文件,其中包含以下 YAML
kind: NodeNetworkConfigurationPolicy
apiVersion: nmstate.io/v1
metadata:
name: <name>
spec:
nodeSelector:
kubernetes.io/hostname: <node_name>
desiredState:
interfaces:
- name: <tunnel_name>
type: ipsec
state: absent
其中
名称
指定节点网络配置策略的名称。
节点名称
指定要删除 IPsec 隧道的节点的名称。
隧道名称
指定现有 IPsec 隧道的接口名称。
要删除 IPsec 隧道,请输入以下命令
$ oc apply -f remove-ipsec-tunnel.yaml
作为集群管理员,您可以禁用 IPsec 加密。
安装 OpenShift CLI (oc
)。
使用具有cluster-admin
权限的用户登录到集群。
要禁用 IPsec 加密,请输入以下命令
$ oc patch networks.operator.openshift.io cluster --type=merge \
-p '{
"spec":{
"defaultNetwork":{
"ovnKubernetesConfig":{
"ipsecConfig":{
"mode":"Disabled"
}}}}}'
可选:您可以将集群 MTU 大小增加46
字节,因为 IP 数据包中不再有 IPsec ESP 头的开销。