HOWTOGCP VPCの間のサイトツーサイトVPNを使用している個人的なGKEクラスタに接続してください.


... そして、二重のNATEのUbiquiti夢機械プロ
何を待ちますか.Kubernetesクラスタに安全な方法でアクセスしたいだけです.容易であるべきです.
Googleから[ 2022 - 03 - 10 ]更新!私たちは、このメッセージを得ました:「我々は、2022年6月15日から始まることを知っているように、我々はあなたにピア雲VPNゲートウェイのインターネットキー交換(Ike)アイデンティティの制限を取り除きます」ということを知らせています
これは、リモートのIPがリモートIDに一致するようにGCPが要求しないので、NAT ' edセットアップが管理しやすくなることを意味します.
アットGOALS 我々は、ネイティブの雲であり、我々はセキュリティについて真剣です.結果として、我々のKubernetesクラスタはprivate endpoints only , すべてのノードが内部のIPアドレスを持つところ.これは素晴らしいです、しかし、質問はすぐに到着します-我々がVPCの外からそれにアクセスすることができないとき、どのように我々はそのようなクラスタを運営しますか?
ここに、我々が持っているものの高レベルの概要があります

図の上部には、プライベートのGoogle管理Kubernetes(GKE)クラスタが表示されます.Kubernetesクラスタは、制御プレーンと労働者ノードから成ります.GKEの場合、Googleはコントロールプレーン(APIサーバー、ETCDノードなど)を管理し、下にあるVMのコントロールプレーンがオンになっており、下にあるVMの作業者ノードが動いている.
我々は自身のVPCと労働者ノードが動いているサブネットをセットアップしました、そして、Googleは制御飛行機が走っている管理されたVPCをつくります.Googleは自動的に我々のVPCで制御プレーンVPCを支持します.
図の下に、オフィススペースネットワークの概要があります.スタートアップしているので、オフィススペースを借りて、ネットワークを他のテナントと共有します.我々はオフィススペースネットワークに遍在ドリームマシンProを接続し、我々は我々のワークステーションを接続する独自の目標ネットワークを作成しました.
明らかに走るkubectl describe nodes 私たちのオフィスネットワークのワークステーションからkubectl クラスタのAPIサーバへのアクセスが必要です.それで、どのように我々は安全な方法で我々のVPCに我々のオフィスネットワークを接続することができて、使用しているGKEクラスタの管理を可能にしますkubectl ?

インフラに関するノート
使用するTerraform すべてのGCPリソースを供給する.Googleは、GCP資源を管理するために、組織化されたterraformモジュールを提供しますhere .
我々の間接取引shared VPC そして、我々はproject factory モジュールを使用してホストプロジェクトとサービスプロジェクトを作成します.
VPNはVPCを所有するホストプロジェクトでプロビジョニングされます.
私たちのGKEクラスタはprivate cluster 地形形モジュール

必要条件と準備
我々が始める前に我々が確実にする若干のものと我々が集めなければならない若干の情報があります.
第一に、我々はUbiquiti Dream Machine(UDM)への管理アクセスを必要とします、そして、我々はネットワーク管理管理者と共にGoogleユーザーを必要とします.
さて、次のようにまとめる必要があります.
  • オフィススペース外部IPアドレス、EG 123.45.67.89
  • 目標ネットワークサブネット範囲、EG 192.168.1.0/24

  • Kubernetesクラスタが準備されることを確認してください
    つの構成エントリは、クラスタへのVPNアクセスを可能にするためにGKEを設定するときに正しく取得するために必要です.
  • master_authorized_networks Office Networkサブネット範囲を含む必要があります.
  • VPCペアリングはカスタムルートをエクスポートするように設定する必要があります-この特定の場合では、VPNがVPCからオフィスネットワークへの通信を可能にするために作成されるカスタムネットワークルートがGKE制御プレーンをホストするGoogle Managed VPCでも利用可能であることを意味します.これは、GKE設定に次の地形形式を追加することによって可能になります.
  • module "kubernetes_cluster" {
      source = "terraform-google-modules/kubernetes-engine/google//modules/private-cluster"
      version = "18.0.0"
      ...
    }
    
    resource "google_compute_network_peering_routes_config" "peering_gke_routes" {
      peering = module.kubernetes_cluster.peering_name
      network = var.vpc_id
      import_custom_routes = false
      export_custom_routes = true
    }
    

    共有VPN秘密
    それは、VPNピアの認証のために使用される共有秘密を生成し、新しい秘密にGCP秘密マネージャでは、名前のITオフィスVPN共有秘密.

    クラウド・ゲートウェイ
    この部分についてはVPN これをホストプロジェクトで設定します.
    locals {
      name = "office-vpn"
    }
    
    resource "google_compute_address" "vpn_external_ip_address" {
      project = var.project_id
      name = local.name
      network_tier = "PREMIUM"
      region = var.region
      address_type = "EXTERNAL"
    }
    
    data "google_secret_manager_secret_version" "office_vpn_shared_secret" {
      project = var.project_id
      secret = "office-vpn-shared-secret"
    }
    
    module "office_site_to_site" {
      source = "terraform-google-modules/vpn/google"
      version = "2.2.0"
    
      project_id = var.project_id
      network = var.vpc_id
      region = var.region
      gateway_name = local.name
      tunnel_name_prefix = local.name
      shared_secret = data.google_secret_manager_secret_version.office_vpn_shared_secret.secret_data
      ike_version = 2
      peer_ips = [ var.office_public_ip ]
      remote_subnet = var.office_subnet_ranges
      vpn_gw_ip = resource.google_compute_address.vpn_external_ip_address.address
    }
    
    resource "google_compute_firewall" "allow_office_traffic" {
      project = var.project_id
      name = "${local.name}-allow-office-traffic"
      network = var.vpc_id
      description = "Allow traffic from the office network"
      allow { protocol = "icmp" }
      allow {
        protocol = "udp"
        ports = [ "0-65535" ]
      }
      allow {
        protocol = "tcp"
        ports = [ "0-65535" ]
      }
      source_ranges = var.office_subnet_ranges
    }
    
    google_compute_address.vpn_external_ip_address GCP終了時にVPNエンドポイントとなる外部の静的IPアドレスを作成します.google_secret_manager_secret_version.office_vpn_shared_secret VPNピアを認証するために使用される共有秘密を取得します.
    The office_site_to_site モジュールは"クラシック"クラウドVPNを作成します.UDMはBGPをサポートしていませんが、これは「HAクラウドVPN」バリアントを作成できないことを意味します.google_compute_firewall.allow_office_traffic オフィスのサブネットから始まるトラフィックを許可します192.168.1.0/24 ) VPCを入力します.
    設定を適用した後、VPNトンネルはエラー状態になります.なぜなら、それはピアに接続できないからです.これはUDM側をまだ設定していないためです.

    UDMプロの上でVPNネットワークをつくってください
    UDM Proは私が知っている限りではコードによる設定をサポートしていませんので、ここでManual GUIを手動で使用する必要があります.
    設定→→Network ->新しいネットワークを追加し、名前を選択し、VPN -> Advanced -> site to site -> manual ipsecを選択します.
    事前共有秘密鍵はoffice-vpn-shared-secret 上から.
    パブリックIPアドレス(WAN)は、UDMがオフィススペースネットワーク上にあるIPアドレスです.例えば192.168.10.150 .
    リモートゲートウェイ/サブネットセクションでは、オフィスからアクセスしたいVPCのサブネット範囲を追加します10.0.0.0/8 and 172.16.0.0/16 .
    リモートIPアドレスは、GCPのVPNエンドポイント用に作成された公開静的IPです123.45.67.99 .
    「詳細」セクションを展開し、選択するIKEv2 . PFSとダイナミックルーティングを有効にします.
    新しいネットワークを保存します.
    残念ながら私たちはまだ準備ができていません.現在の設定ではUDMは設定したWAN IPを使用して自分自身を識別します.
    設定の最後の部分を修正するにはssh UDMプロに入ります.一度マシン上では、IPsecの設定を更新することができます.
    $ cd /run/strongswan/ipsec.d/tunnels
    $ vi <ipsec-config-name>.config
    
    以下の行をleft=192.168.10.150
      leftid=123.45.67.99
    
    これは、UCPがGCP端のVPNに接続するとき、それが実際の公共のIPを使用してそれ自体を識別するのを作ります.
    最後に、IPsec設定を更新します.
    $ ipsec update
    

    それはthats!
    UDMの接続が起動して起動することを確認します.
    $ swanctl --list-sas
    
    出力はトンネルに関する情報を記載しなければならず、トンネルはESTABLISHED 状態.
    現在、GCPのVPNトンネル状態は同様に緑の状態に動きます.
    そして、最後に、ゴールオフィスネットワークのワークステーションからKubernetesクラスタにアクセスすることは可能です.
    $ kubectl get nodes
    NAME                                      STATUS   ROLES    AGE   VERSION
    gke-XXXXX-controller-pool-28b7a87b-9ff2   Ready    <none>   17d   v1.21.6-gke.1500
    
    次のように設定します.


    トラブルシューティング
    UDMに接続している間に
    $ tcpdump -nnvi vti64
    
    すべてのトラフィックをVPNトンネル経由でルーティングしてください.
    時々、ルートはワークステーションでキャッシュされます
    $ sudo route -n flush
    
    何度も無効にする/有効にする無線LANは、ルーティングの設定は、最新のことを確認します.