Fujitsu Cloud Direct ブログ

初心者エンジニア向け技術ブログ

ニフクラでKubernetesを使う方法(第2回. マルチクラウド環境構築_VPN接続編)

この記事は、ニフクラブログで2023-10-17に公開された記事を移転したものです。 こんにちは、CRE部 技術支援チームです。

前回ではAnthos on bare metalクラスタインストール・作成を実施しました。

今回はGoogleCloudにKubernetesクラスタを作成して、ニフクラとGoogleCloudのKubernetesクラスタ同士をVPNで接続するマルチクラウド環境の構築方法を紹介します。

第1回. Anthos on bare metalクラスタインストール・作成編

第2回. マルチクラウド環境構築_VPN接続編

第3回. マルチクラスタメッシュ構成_East-WestGateway作成編

第4回. マルチクラスタメッシュ構成_疎通確認編

はじめに

今回はGoogle Kubernetes Engine(GKE)クラスタ(他社サイトリンク)を作成して、ニフクラ環境とGoogleCloud環境を拠点間VPNゲートウェイで接続してクラスタ同士の通信を確認します。

全体構成イメージ

前提条件

  • ニフクラの基本的なコントロールパネルの操作、サービスを利用する知識
  • GoogleCloudの基本的なコントロールパネルの操作、サービスを利用する知識
  • Kubernetesの基本的な知識、利用経験
  • Google Kubernetes Engine(GKE)クラスタの基本的な知識、利用経験
  • Istio(他社サイトリンク)等のサービスメッシュの基本的な知識、利用経験
  • GoogleCloudのアカウントを取得済み
  • GoogleCloudにプロジェクトが作成済み

作成するリソース

ニフクラリソース

前回作成のニフクラ環境リソースに拠点間VPNゲートウェイを追加します。

リソース 数量
拠点間VPNゲートウェイ 1
拠点間VPNゲートウェイ:VPNコネクション 1
拠点間VPNゲートウェイ:カスタマーゲートウェイ 1

以下前回作成リソースを利用します。

  • ファイアウォール
ファイアウォール名 INルール 用途
FWNIFC TCP22:xxx.xxx.xxx.xxx 外部のサーバー構築アクセス元から検証サーバーへのSSH接続用グローバルIP

  • プライベートLAN
プライベートLAN名 CIDR 用途
NifcAnthosClsLan 172.16.232.0/24 作成したAnthos on bare metalクラスタが展開されるネットワーク
  • 検証サーバー
項目
サーバー名 NifcAnthosSrv
OS Ubuntu Server 20.04 LTS
サーバータイプ e-large16
グローバルIPアドレス 自動割り当て
プライベートIPアドレス 172.16.232.1
  • 増設ディスク
項目
ディスク名 NifcDisk
ディスクタイプ 標準ディスク
容量 300G

GoogleCloudリソース

以下のリソースをGoogleCloud環境に作成します。

リソース 数量
VPC(他社サイトリンク) 1
ファイアウォール(他社サイトリンク) 1
GKEクラスタ(他社サイトリンク) 1
CLOUD VPN(他社サイトリンク) 1

ニフクラ環境構築

ニフクラ環境に拠点間VPNゲートウェイを作成します。

ニフクラ 拠点間VPNゲートウェイ作成

項目
VPN名 NifcAnthosVpn
グローバルIPアドレス 自動割り当て
プライベートIPアドレス 172.16.232.2

GoogleCloud環境構築

以下の内容でマルチクラウド環境の連携先であるGoogleCloud環境を構築します。

GoogleCloudリソース作成

ネットワーク名
anthos-hybrid
ファイアウォール名 送信元IP プロトコルとポート 用途
nifc-rules 172.16.232.0/24(NifcAnthosClsLan) 全て許可 ニフクラAnthos on bare metalクラスタが稼働しているプライベートLAN環境からの通信を許可
ニフクラ拠点間VPNゲートウェイのグローバルIP 全て許可 ニフクラ拠点間VPNゲートウェイからの通信を許可

GKEクラスタ作成

以下の内容でGKEクラスタ(他社リンクサイト)を作成します

項目
名前 nifc-anthosgke-cls
ゾーン us-central1-c
コントロールプレーンのバージョン 静的バージョン
GKEバージョン 1.27.3-gke.100 (デフォルト)
マシンの構成 e2-standard-2以上
ネットワーク anthos-hybrid
ノードのサブネット anthos-hybrid
IPv4ネットワークス 一般公開クラスタ
Workload Identity 有効

GKEクラスタが登録されます。

以上でGKEクラスタ作成は完了です。

GoogleCloud CloudVPN作成

GoogleCloudのCloudVPNを作成します。

※CloudVPNはニフクラの拠点間VPNゲートウェイの接続確認済み機器ではないので利用者責任のもと検証を実施、利用をご検討ください。

項目
名前 nifc-anthos-vpn
ネットワーク anthos-hybrid
リージョン us-central1(アイオワ)
グローバルIPアドレス 自動割り当て
トンネル名 nif-anthos-tn
リモートピアIPアドレス ニフクラ拠点間VPNゲートウェイのグローバルIP
IKEバージョン IKEv1
IKE 事前共有キー ニフクラの事前共有鍵仕様に沿った内容で作成
※「生成してコピー」ボタンで生成する場合、ニフクラの事前共有鍵仕様と合致しない場合があるので注意する。
ルーティングオプション ルートベース選択
リモートネットワークIPの範囲 172.16.232.0/24(NifcAnthosClsLan)

ニフクラとGoogleCloudを拠点間VPNゲートウェイで接続

クラスタ間連携のためにニフクラとGoogleCloudを拠点間VPNゲートウェイで接続します。

ニフクラ ファイアウォール編集

ニフクラのファイアウォールにGKEクラスタとCloudVPNの設定を追加します。

ファイアウォール名 INルール 用途
FWNIFC TCP22:xxx.xxx.xxx.xxx 外部のサーバー構築アクセス元から検証サーバーへのSSH接続用グローバルIP
ANY:anthos-hybridのus-central1リージョンの内部IP範囲 GoogleCloud GKEクラスタ
ANY:CloudVPNのグローバルIP GoogleCloud CloudVPN
  • anthos-hybridの内部IP範囲はGoogleCloudコントロールパネルの以下で確認

  • CloudVPNのグローバルIPはGoogleCloudコントロールパネルの以下で確認

ニフクラ拠点間VPNゲートウェイ接続設定

以下のリソースを作成します。

項目
名前 VPNCGW
対向機器IPアドレス CloudVPNのグローバルIP
接続方式 IPSec VTI
対向機器LAN側IPアドレス帯 anthos-hybridのus-central1リージョンの内部IP範囲
対向機器LAN側IPアドレス 空欄
項目
カスタマーゲートウェイ VPNCGW
接続方式 IPSec VTI
IKEバージョン IKEv1
暗号化アルゴリズム AES128
認証アルゴリズム SHA1
事前共有キー Cloud VPNで作成した事前共有キー
IKE lifetime 空欄
ESP lifetime 空欄
DH Group デフォルト

ステータスが「接続済み」で表示されていることを確認します。

ニフクラからGoogleCloudルーティング

ニフクラ検証サーバー(NifcAnthosSrv)でroute コマンドを実行してGoogleCloudへのルーティングを設定します。

$ route add -net yyy.yyy.yyy.yyy/20(anthos-hybridのus-central1リージョンの内部IP範囲)  gw 172.16.232.50

GoogleCloud環境拠点間VPNゲートウェイ接続確認

ステータスが「確立済み」で表示されていることを確認します。

以上で拠点間VPNゲートウェイ接続は完了です。

GKEクラスタのAnthos登録

ニフクラとGoogleCloudの拠点間VPNゲートウェイ接続疎通確認の前にGKEクラスタをAnthosに登録します。GKEクラスタをAnthos登録するための方法(他社リンクサイト)は複数存在します。 GoogleCloudコントロールパネル上からも可能ですが、今回はニフクラ検証サーバーからgcloudコマンド登録(他社サイトリンク)を使ってGKEクラスタのAnthos登録を実施します。

gcloud認証プラグインインストール

ニフクラ検証サーバーからgcloudコマンドでGKEクラスタに接続するために認証プラグインをインストールします。 以下のコマンドを実行します。

$ apt-get install google-cloud-sdk-gke-gcloud-auth-plugin
---------省略---------
Unpacking google-cloud-sdk-gke-gcloud-auth-plugin (449.0.0-0) ...
Setting up google-cloud-sdk-gke-gcloud-auth-plugin (449.0.0-0) ...

gcloudコマンドコピー

GoogleCloudコントロールパネルからgcloudコマンドラインアクセスをコピーします。

gcloudコマンド実行

コピーしたgcloudコマンドをニフクラ環境の検証サーバーで実行します。

$ gcloud container clusters get-credentials xxxxxxxxxxxxxxxx

Fetching cluster endpoint and auth data.
kubeconfig entry generated for nifc-anthosgke-cls.

GKEクラスタの認証情報を取得が完了です。

gcloudコマンドでAnthosクラスタを登録

gcloudコマンド登録(他社サイトリンク)に従って以下のコマンドを実行します。

  • メンバーシップ名称はクラスタ名と同じ nifc-anthosgke-cls を設定します。
  • ロケーションの値はGKE作成で選択したロケーションなので us-central1-c を設定します。
  • --enable-workload-identityは固定値の設定です。
$ gcloud container fleet memberships register nifc-anthosgke-cls --gke-cluster=us-central1-c/nifc-anthosgke-cls --enable-workload-identity

コントロールパネルでAnthos登録が確認できます。

以上でGKEクラスタのAnthos登録は完了です。

ニフクラ環境上でGKEクラスタでのコマンド操作について

GKEクラスタ認証情報を取得している場合、ニフクラ環境の検証サーバーからkubectlコマンドでGKEクラスタを操作できます。切り替え表示と簡略化操作について少し解説します。

GKEクラスタ認証情報取得

上記gcloud実行で認証情報は取得しています。

以下のkubectlコマンドを実行してGKEクラスタに接続したことを確認します。
アスタリスク* が先頭に付与されている。

$ kubectl config get-contexts

CURRENT   NAME                                                 CLUSTER                                              AUTHINFO                                             NAMESPACE
*         gke_xxxx_us-central1-c_nifc-anthosgke-cls   gke_xxxxxx_us-central1-c_nifc-anthosgke-cls   gke_xxxxxx_us-central1-c_nifc-anthosgke-cls
          nifc-anthosbm-cls-admin@nifc-anthosbm-cls            nifc-anthosbm-cls                                    nifc-anthosbm-cls-admin

この状態だとGKEクラスタに接続してます。

以下のkubectlコマンドを実行してクラスタを切り替えます。

kubectl config use-context クラスタ名

ニフクラ環境のAnthos on bare metalクラスタに接続するために切り替える場合は以下のコマンドを実行します。

kubectl config use-context standalone-admin@standalone

以下のkubectlコマンドを実行してニフクラ環境のAnthos on bare metalクラスタに接続したことを確認できます。

$ kubectl config get-contexts

CURRENT   NAME                                                 CLUSTER                                              AUTHINFO                                             NAMESPACE
         gke_xxxx_us-central1-c_nifc-anthosgke-cls   gke_xxxxxx_us-central1-c_nifc-anthosgke-cls   gke_xxxxxx_us-central1-c_nifc-anthosgke-cls
*          nifc-anthosbm-cls-admin@nifc-anthosbm-cls            nifc-anthosbm-cls                                    nifc-anthosbm-cls-admin

この状態だとニフクラ環境のAnthos on bare metalクラスタに接続してます。

操作簡略化の環境変数設定

切り替え操作を簡略化するためにクラスタ名を環境変数で以下のように設定します。

# Anthosクラスタ名※kubectl config get-contextsで表示された「NAME」項目の内容
export CTX_CLUSTER1=nifc-anthosbm-cls-admin@nifc-anthosbm-cls                               
# GKEクラスタ名※kubectl config get-contextsで表示された「NAME」項目の内容
export CTX_CLUSTER2=gke_xxxxx_us-central1-c_nifc-anthosgke-cls                              

以下のように --contextパラメーター にクラスタ名を設定することで対象のクラスタをkubectlコマンドで操作できます。

ニフクラ環境のAnthos on bare metalクラスタの場合

kubectl --context=${CTX_CLUSTER1} get pods等

GKEクラスタの場合

kubectl --context=${CTX_CLUSTER2} get pods等

次回以降の検証では、kubectlコマンド操作は --context=${CTX_CLUSTER1}、--context=${CTX_CLUSTER2} を用いて実行します。

  • 第3回. マルチクラスタメッシュ構成_East-WestGateway作成編

  • 第4回. マルチクラスタメッシュ構成_疎通確認編

以上でGKEクラスタでのコマンド操作についての解説は終了です。

ニフクラ環境からGoogleCloud環境へ拠点間VPNゲートウェイ接続疎通確認

ニフクラ環境からGoogleCloud環境へpingを実行して疎通確認を実施します。

GoogleCloudのGKEクラスタ内部IP確認

GoogleCloudコンソールの「VMインスタンス」ページに移動します。

作成したGoogleCloudのGKEクラスタの内部IPを確認します。
確認した内部IPの1つをメモ等で記憶しておきます。

ping実行

ニフクラのクラスタからGoogleCloudのクラスタ(yyy.yyy.yyy.yyy)にpingを実行して疎通確認をします。 以下のコマンドを実行します。クラスタ上に一時的にalpineイメージ(他社サイトリンク)からpingを実行します。

※ニフクラ環境で実行するために--context=${CTX_CLUSTER1}付与します。

$ kubectl run --context=${CTX_CLUSTER1}  -it debug --image=alpine:latest --rm --restart=Never -- ping yyy.yyy.yyy.yyy(作成したGoogleCloudのGKEクラスタの内部IP)

If you don't see a command prompt, try pressing enter.
64 bytes from yyy.yyy.yyy.yyy: seq=1 ttl=60 time=153.506 ms
64 bytes from yyy.yyy.yyy.yyy: seq=2 ttl=60 time=150.889 ms
64 bytes from yyy.yyy.yyy.yyy: seq=3 ttl=60 time=154.262 ms

ping応答が返却されて疎通が確認できます。

GoogleCloud環境からニフクラ環境へ拠点間VPNゲートウェイ接続疎通確認

GoogleCloud環境からニフクラ環境へpingを実行して疎通確認を実施します。

GoogleCloudクラスタのマスカレードエージェント作成

GoogleCloud上のGKEクラスタが異なるネットワークのクラスタと通信するためにIP マスカレード エージェント(他社サイトリンク)を作成します。

作業ディレクトリ作成

mkdirコマンドで作業ディレクトリを作成します。
※今回はmasqで作成します。

$ mkdir masq

マニュフェストファイル作成

viコマンドでマニュフェストファイル(nifc-masq.yaml)を作成します。

$ vi masq/nifc-masq.yaml

ip-masq-agent DaemonSet のデプロイ(他社サイトリンク)の内容をコピーして マニュフェストファイル(nifc-masq.yaml)を保存します。

マスカレード作成

kubectlコマンドを実行してマスカレードを作成します。

kubectl apply -f masq/nifc-masq.yaml --context=${CTX_CLUSTER2}

GKEクラスタの送信元PodのIP アドレスを保護するためConfigファイル(config)を作成します。 anthos-hybridのus-central1リージョンの内部IP範囲を nonMasqueradeCIDRs に設定します。

$ vi masq/config
nonMasqueradeCIDRs:
      - yyy.yyy.yyy.yyy/20(anthos-hybridのus-central1リージョンの内部IP範囲)
masqLinkLocal: false
resyncInterval: 60s

kubectlコマンドを実行してConfigMapを作成します。

$ kubectl create configmap ip-masq-agent \
  --from-file  masq/config \
  --namespace kube-system \
  --context=${CTX_CLUSTER2}

kubectlコマンドを実行して確認します。
※GoogleCloud環境で実行するために--context=${CTX_CLUSTER2}付与します。

$ kubectl describe configmaps/ip-masq-agent -n kube-system  --context=${CTX_CLUSTER2}

Name:         ip-masq-agent
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
config:
----
nonMasqueradeCIDRs:
      - yyy.yyy.yyy.yyy/20(anthos-hybridのus-central1リージョンの内部IP範囲)
masqLinkLocal: false
resyncInterval: 60s


BinaryData
====
---------省略---------

マスカレードエージェント作成は完了です。

ping実行

GoogleCloudのクラスタからニフクラのクラスタ(172.16.232.1)にpingを実行して疎通確認をします。

※GoogleCloud環境で実行するために--context=${CTX_CLUSTER2}付与します。

$ kubectl run --context=${CTX_CLUSTER2} -it debug --image=alpine:latest --rm --r                     start=Never -- ping 172.16.232.1
If you don't see a command prompt, try pressing enter.
64 bytes from 172.16.232.1: seq=1 ttl=63 time=0.079 ms
64 bytes from 172.16.232.1: seq=2 ttl=63 time=0.129 ms
64 bytes from 172.16.232.1: seq=3 ttl=63 time=0.177 ms

以上でニフクラとGoogleCloudの拠点間VPNゲートウェイ接続疎通確認は完了です。

まとめ

今回はGoogleCloudにKubernetesクラスタを作成してニフクラのKubernetesクラスタと通信ができることを確認しました。

次回はサービスメッシュIstioベースのAnthos Service Mesh(ASM)(他社サイトリンク)を利用してクラスタ間で負荷分散するマルチクラスタメッシュ(他社サイトリンク)構成の構築方法を紹介します。

最後までお読みくださいましてありがとうございました。

注意事項

  • 本記事に記載されている会社名、製品名等の固有名詞は各社の商号、登録商標または商標です。
  • 本記事の他社サイトへのリンクにつきまして、リンク切れの際はご容赦ください。
  • 本記事は、2023年10月時点の情報です。