配置 Network Connectivity Gateway

本文档介绍如何为 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。

GKE on Bare Metal 的 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 仅与 1.12 版 GKE on Bare Metal 兼容。如果您要创建新的 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 问题