配置 Network Connectivity Gateway

本文档介绍如何为 Google Distributed Cloud 中的集群配置 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。

Google Distributed Cloud 的 Network Connectivity Gateway 图表

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 仅与 Google Distributed Cloud 的 1.12 版兼容。如果您要创建新的 1.12.0 版集群,则可以在集群配置文件中使用注解来启用 Network Connectivity Gateway。

如需在创建集群期间启用 Network Connectivity Gateway,请执行以下操作:

  1. 在集群配置文件中,添加 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
      ...
    
  2. 使用 bmctl create 创建集群:

    bmctl create cluster -c CLUSTER_NAME
    

    CLUSTER_NAME 替换为您在创建集群配置文件时指定的名称。如需详细了解如何创建集群,请参阅集群创建概览

下载

如需下载 ncgctl(Network Connectivity Gateway 命令行工具),请按照以下步骤操作:

  1. 下载 Network Connectivity Gateway 组件及自定义资源定义:

    gsutil cp gs://ncg-release/anthos-baremetal/ncgctl-v1.12.0-linux-amd64.tar.gz .
    
  2. 解压缩归档文件:

    tar -xvzf ncgctl-v1.12.0-linux-amd64.tar.gz
    

安装

如需安装 ncgctl,请按以下步骤操作:

  1. 运行预检检查,确保集群满足前提条件。例如,确保启用 Dataplane V2。

    ./bin/ncgctl --verify --kubeconfig CLUSTER_KUBECONFIG
    

    CLUSTER_KUBECONFIG 替换为集群 kubeconfig 文件的路径。

  2. 安装 Network Connectivity Gateway。

    ./bin/ncgctl --install --kubeconfig CLUSTER_KUBECONFIG
    
  3. 如果您已有 1.12.0 版集群,则可以使用以下 ncgctl 命令启用 Network Connectivity Gateway:

    ./bin/ncgctl --enable-ncg-on-existing-cluster
    

    ncgctl 命令接受 -e 作为启用标志的缩短版本。

  4. 如需查看其他快捷方式和其他命令帮助,请使用以下命令:

    ./bin/ncgctl --help
    

为预共享密钥创建 Secret

IPsec 隧道任一端的网关都使用包含预共享密钥的 Secret 进行身份验证。

如需创建该 Secret,请按以下步骤操作:

  1. 使用以下 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
    
  2. 创建 Secret

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f psk-secret.yaml
    

创建两个 OverlayVPNTunnel 自定义资源

如需启动两个 IPsec 会话,请创建两个 OverlayVPNTunnel 自定义资源。

  1. 使用以下 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) 获得的。

  2. 创建两个 OverlayVPNTunnels

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f overlay-vpn-tunnels.yaml
    
  3. 检查隧道的状态:

    kubectl --kubeconfig CLUSTER_KUBECONFIG get OverlayVPNTunnel \
        --namespace kube-system --output yaml
    

创建两个 OverlayBGPPeer 自定义资源

如需在每个隧道上启动一个 BGP 会话,请创建两个 OverlayBGPPeer 自定义资源。

  1. 使用以下 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 的名称。

  2. 创建 OverlayBGPPeer 自定义资源:

    kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f overlay-bgp-peers.yaml
    
  3. 检查 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 日志,请按以下步骤操作:

  1. 找到网关 Pod 的名称:

    kubectl --kubeconfig CLUSTER_KUBECONFIG pods --namespace kube-system | grep ncgd
    
  2. 查看网关 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 问题