本文档介绍如何为 GKE on Bare Metal 中的集群配置 Network Connectivity Gateway。
有时,您的 Pod 在集群中运行,并且该集群必须与 Virtual Private Cloud (VPC) 中运行的工作负载通信。该通信必须安全;并且您可能需要在不使用代理服务器的平面网络上进行这种通信。Network Connectivity Gateway 便可以实现此类通信。
Network Connectivity Gateway 作为集群中的 Pod 运行。如下图所示,此解决方案为从集群中的 Pod 发送到 VPC 中的虚拟机的流量提供了 IPsec 隧道。当网关 Pod 通过边界网关协议 (BGP) 会话接收 VPC 子网前缀时,它会使用 Dataplane V2 设置转发。当其他 Pod 将流量发送到具有其中一个前缀的地址时,流量将被定向到网关 Pod。之后,网关 Pod 会通过 IPsec 隧道将流量路由到 Google Cloud。
Network Connectivity Gateway 不支持以下特性和功能:
- 用来实现高可用性 VPN 和 BGP 的 IPv6
- 适用于 BGP 的 MD5
- 适用于 BGP 的双向转发检测 (BFD)
创建 Google Cloud 资源
在集群中启用 Network Connectivity Gateway 之前,您必须具有以下 Google Cloud 资源:
一个 Cloud Router 路由器
一个高可用性 VPN 网关
一个对等 VPN 网关:一个接口
两个 VPN 隧道
两个 BGP 会话:每个 VPN 隧道一个
如需了解如何创建和配置这些资源,请参阅创建连接到对等 VPN 网关的高可用性 VPN 网关。
创建这些资源时,请收集以下信息,以供稍后使用:
Google Cloud 分配给高可用性 VPN 网关的两个外部 IP 地址。
从您的组织发出的 IPsec/VPN 流量的公共 IP 地址。此地址可能是通过网络地址转换 (NAT) 获得的。
您的预共享密钥。
您分配给用于 BGP 会话的 Cloud Router 路由器的自治系统编号 (ASN)。
您已选择在本地集群中用于 BGP 会话的 ASN。
对于每个 BGP 会话,Cloud Router 路由器要使用的本地链路地址(如
169.254.1.1
)以及本地集群中要使用的本地链路地址。
如需了解如何查找 BGP 会话配置的详细信息,请参阅查看 BGP 会话配置。
集群要求
Network Connectivity Gateway 命令行工具下载 ncgctl-v1.12.0-linux-amd64.tar.gz
仅与 1.12 版 GKE on Bare Metal 兼容。如果您要创建新的 1.12.0 版集群,则可以在集群配置文件中使用注解来启用 Network Connectivity Gateway。
如需在创建集群期间启用 Network Connectivity Gateway,请执行以下操作:
在集群配置文件中,添加
baremetal.cluster.gke.io/enable-gng: "true"
注解。apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: annotations: baremetal.cluster.gke.io/enable-gng: "true" name: my-cluster namespace: cluster-my-cluster spec: ... anthosBareMetalVersion: 1.12.0 ...
使用
bmctl create
创建集群:bmctl create cluster -c CLUSTER_NAME
将
CLUSTER_NAME
替换为您在创建集群配置文件时指定的名称。如需详细了解如何创建集群,请参阅集群创建概览。
下载
如需下载 ncgctl
(Network Connectivity Gateway 命令行工具),请按照以下步骤操作:
下载 Network Connectivity Gateway 组件及自定义资源定义:
gsutil cp gs://ncg-release/anthos-baremetal/ncgctl-v1.12.0-linux-amd64.tar.gz .
解压缩归档文件:
tar -xvzf ncgctl-v1.12.0-linux-amd64.tar.gz
安装
如需安装 ncgctl
,请按以下步骤操作:
运行预检检查,确保集群满足前提条件。例如,确保启用 Dataplane V2。
./bin/ncgctl --verify --kubeconfig CLUSTER_KUBECONFIG
将
CLUSTER_KUBECONFIG
替换为集群 kubeconfig 文件的路径。安装 Network Connectivity Gateway。
./bin/ncgctl --install --kubeconfig CLUSTER_KUBECONFIG
如果您已有 1.12.0 版集群,则可以使用以下
ncgctl
命令启用 Network Connectivity Gateway:./bin/ncgctl --enable-ncg-on-existing-cluster
ncgctl
命令接受-e
作为启用标志的缩短版本。如需查看其他快捷方式和其他命令帮助,请使用以下命令:
./bin/ncgctl --help
为预共享密钥创建 Secret
IPsec 隧道任一端的网关都使用包含预共享密钥的 Secret 进行身份验证。
如需创建该 Secret,请按以下步骤操作:
使用以下 Secret 清单详细信息创建名为
psk-secret.yaml
的文件:apiVersion: v1 kind: Secret metadata: name: "ike-key" namespace: "kube-system" data: psk: PRE_SHARED_KEY
将
PRE_SHARED_KEY
替换为 base64 编码的预共享密钥。如果您有明文密钥,请在创建此 Secret 之前将密钥编码为 base64 格式。例如,Google Cloud 控制台为您生成的密钥就是明文密钥,您必须对其进行编码。如需对密钥进行 base64 编码,请执行以下操作:echo -n PLAINTEXT_KEY | base64
创建 Secret
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f psk-secret.yaml
创建两个 OverlayVPNTunnel
自定义资源
如需启动两个 IPsec 会话,请创建两个 OverlayVPNTunnel
自定义资源。
使用以下
OverlayVPNTunnel
清单详细信息创建名为overlay-vpn-tunnels.yaml
的文件:apiVersion: networking.gke.io/v1alpha1 kind: OverlayVPNTunnel metadata: namespace: "kube-system" name: TUNNEL_1_NAME spec: ikeKey: name: "ike-key" namespace: "kube-system" peer: publicIP: PEER_PUBLIC_IP_1 self: publicIP: SELF_PUBLIC_IP localTunnelIP: SELF_LOCAL_TUNNEL_IP_1 --- apiVersion: networking.gke.io/v1alpha1 kind: OverlayVPNTunnel metadata: namespace: "kube-system" name: TUNNEL_2_NAME spec: ikeKey: name: "ike-key" namespace: "kube-system" peer: publicIP: PEER_PUBLIC_IP_2 self: publicIP: SELF_PUBLIC_IP localTunnelIP: SELF_LOCAL_TUNNEL_IP_2
替换以下内容:
TUNNEL_NAME_1
:您为第一个OverlayVPNTunnel
选择的名称。TUNNEL_NAME_2
:您为第二个OverlayVPNTunnel
选择的名称。PEER_PUBLIC_IP_1
:高可用性 VPN 网关上的一个接口的公共 IP 地址。您会在创建第一个 VPN 隧道时指定该接口。PEER_PUBLIC_IP_2
:高可用性 VPN 网关上的另一个接口的公共 IP 地址。您会在创建第二个 VPN 隧道时指定该接口。SELF_LOCAL_TUNNEL_IP_1
:您的集群中将用于第一个隧道上的 BGP 会话的本地链路地址。SELF_LOCAL_TUNNEL_IP_2
:您的集群中将用于第二个隧道上的 BGP 会话的本地链路地址。SELF_PUBLIC_IP
:从您的组织发出的 IPsec/VPN 流量的公共 IP 地址。此地址可能是通过网络地址转换 (NAT) 获得的。
创建两个
OverlayVPNTunnels
:kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f overlay-vpn-tunnels.yaml
检查隧道的状态:
kubectl --kubeconfig CLUSTER_KUBECONFIG get OverlayVPNTunnel \ --namespace kube-system --output yaml
创建两个 OverlayBGPPeer
自定义资源
如需在每个隧道上启动一个 BGP 会话,请创建两个 OverlayBGPPeer
自定义资源。
使用以下
OverlayBGPPeer
清单详细信息创建名为overlay-bgp-peers.yaml
的文件。apiVersion: networking.gke.io/v1alpha1 kind: OverlayBGPPeer metadata: namespace: "kube-system" name: BGP_PEER_1_NAME spec: localASN: LOCAL_ASN localIP: LOCAL_IP peerIP: PEER_IP_1 peerASN: PEER_ASN vpnTunnel: TUNNEL_1_NAME --- apiVersion: networking.gke.io/v1alpha1 kind: OverlayBGPPeer metadata: namespace: "kube-system" name: BGP_PEER_2_NAME spec: localASN: LOCAL_ASN localIP: LOCAL_IP peerIP: PEER_IP_2 peerASN: PEER_ASN vpnTunnel: TUNNEL_2_NAME
替换以下内容:
BGP_PEER_1_NAME
:您为第一个OverlayBGPPeer
选择的名称。BGP_PEER_2_NAME
:您为第二个OverlayBGPPeer
选择的名称。LOCAL_ASN
:要在您的集群中用于 BGP 会话的 ASN。LOCAL_IP
:从您的组织发出的 IPsec/VPN 流量的公共 IP 地址。此地址可能是通过网络地址转换 (NAT) 获得的。PEER_IP_1
:高可用性 VPN 网关上的一个接口的公共 IP 地址。您会在创建第一个 VPN 隧道时指定该接口。PEER_IP_2
:高可用性 VPN 网关上的另一个接口的公共 IP 地址。您会在创建第二个 VPN 隧道时指定该接口。PEER_ASN
:分配给用于 BGP 会话的 Cloud Router 路由器的 ASN。TUNNEL_1_NAME
:您之前创建的第一个 OverlayVPNTunnel 的名称。TUNNEL_2_NAME
:您之前创建的第二个 OverlayVPNTunnel 的名称。
创建
OverlayBGPPeer
自定义资源:kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f overlay-bgp-peers.yaml
检查 BGP 会话的状态:
kubectl --kubeconfig CLUSTER_KUBECONFIG get OverlayBGPPeer --namespace kube-system \ --output yaml
检查 Network Connectivity Gateway 的状态
安装会创建一个 NetworkConnectivityGateway
自定义资源。
查看该
NetworkConnectivityGateway
自定义资源:kubectl --kubeconfig CLUSTER_KUBECONFIG get NetworkConnectivityGateway --namespace kube-system \ --output yaml
输出类似于以下内容:验证您是否看到
Status: Healthy
:apiVersion: networking.gke.io/v1alpha1 kind: NetworkConnectivityGateway metadata: namespace: kube-system name: default spec: status: CurrNode: worker1-node CreatedTime: 2021-09-07T03:18:15Z LastReportTime: 2021-09-21T23:57:54Z Status: Healthy
检查 Network Connectivity Gateway 日志
网关 Pod 属于名为 ncgd
的 DaemonSet,因此 Pod 名称以 ncgd
开头。
如需查看 Network Connectivity Gateway 日志,请按以下步骤操作:
找到网关 Pod 的名称:
kubectl --kubeconfig CLUSTER_KUBECONFIG pods --namespace kube-system | grep ncgd
查看网关 Pod 中的日志:
kubectl --kubeconfig CLUSTER_KUBECONFIG logs GATEWAY_POD --namespace kube-system \ --output yaml
将
GATEWAY_POD
替换为网关 Pod 的名称。
卸载
如需从集群中卸载 Network Connectivity Gateway,请执行以下操作:
./bin/ncgctl –-uninstall --kubeconfig CLUSTER_KUBECONFIG
问题排查
如需了解与 Network Connectivity Gateway 相关的问题排查提示,请参阅排查 Network Connectivity Gateway 问题。