Compute Engine VM でベアメタル版 Anthos クラスタを試す

このページでは、Compute Engine 上で動作する仮想マシン(VM)を使用して、高可用性(HA)モードで ベアメタル版 Anthos クラスタを試す方法について説明します。

ベアメタル版 Anthos クラスタは、ハードウェアを準備せずにすぐに試すことができます。このページの手順を完了すると、ベアメタル版 Anthos 環境用に Compute Engine で実行されるテスト環境を操作できるようになります。

Compute Engine VM 上でベアメタル版 Anthos クラスタを試すには、次の手順を行います。

  1. Compute Engine で 6 つの VM を作成する
  2. すべての VM 間に L2 接続で vxlan ネットワークを作成する
  3. ベアメタル版 Anthos クラスタを使用するための前提条件をインストールする
  4. ベアメタル版 Anthos クラスタをデプロイする
  5. クラスタを確認する

始める前に

デプロイに必要なリソースは次のとおりです。

  • ベアメタル版 Anthos クラスタをデプロイするための 6 つの VM
  • プロジェクトに対するオーナー権限で gcloud にログインしている 1 つのワークステーション。

Compute Engine で 6 つの VM を作成する

以下の VM を作成する手順は次のとおりです。

  • 1 つの管理 VM。別のマシンにベアメタル版 Anthos クラスタをデプロイするために使用。
  • ベアメタル版 Anthos クラスタのコントロール プレーンを実行するために必要な 3 つのコントロール プレーン ノード用の 3 つの VM。
  • ベアメタル版 Anthos クラスタでワークロードを実行するために必要な 2 つのワーカーノード用の 2 つの VM。
  1. baremetal-gcr サービス アカウントを作成します。

    export PROJECT_ID=$(gcloud config get-value project)
    export ZONE=us-central1-a
    
    gcloud iam service-accounts create baremetal-gcr
    
    gcloud iam service-accounts keys create bm-gcr.json \
    --iam-account=baremetal-gcr@${PROJECT_ID}.iam.gserviceaccount.com
    
  2. 複数の API とサービスに複数のサービス アカウントが必要とならないように、baremetal-gcr サービス アカウントに追加の権限を付与します。

    gcloud services enable \
        anthos.googleapis.com \
        anthosaudit.googleapis.com \
        anthosgke.googleapis.com \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        gkeconnect.googleapis.com \
        gkehub.googleapis.com \
        serviceusage.googleapis.com \
        stackdriver.googleapis.com \
        monitoring.googleapis.com \
        logging.googleapis.com \
        opsconfigmonitoring.googleapis.com
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.connect"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.admin"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.dashboardEditor"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/stackdriver.resourceMetadata.writer"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:baremetal-gcr@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/opsconfigmonitoring.resourceMetadata.writer"
    
  3. このページのすべてのコマンドに必要な変数と配列を作成します。

    MACHINE_TYPE=n1-standard-8
    VM_PREFIX=abm
    VM_WS=$VM_PREFIX-ws
    VM_CP1=$VM_PREFIX-cp1
    VM_CP2=$VM_PREFIX-cp2
    VM_CP3=$VM_PREFIX-cp3
    VM_W1=$VM_PREFIX-w1
    VM_W2=$VM_PREFIX-w2
    declare -a VMs=("$VM_WS" "$VM_CP1" "$VM_CP2" "$VM_CP3" "$VM_W1" "$VM_W2")
    declare -a IPs=()
    
  4. 次のループを使用して 6 つの VM を作成します。

    for vm in "${VMs[@]}"
    do
        gcloud compute instances create $vm \
                  --image-family=ubuntu-2004-lts --image-project=ubuntu-os-cloud \
                  --zone=${ZONE} \
                  --boot-disk-size 200G \
                  --boot-disk-type pd-ssd \
                  --can-ip-forward \
                  --network default \
                  --tags http-server,https-server \
                  --min-cpu-platform "Intel Haswell" \
                  --scopes cloud-platform \
                  --machine-type $MACHINE_TYPE
        IP=$(gcloud compute instances describe $vm --zone ${ZONE} \
             --format='get(networkInterfaces[0].networkIP)')
        IPs+=("$IP")
    done
    
  5. 次のループを使用して、すべての VM で SSH を使用できることを確認します。

    for vm in "${VMs[@]}"
    do
        while ! gcloud compute ssh root@$vm --zone ${ZONE} --command "echo SSH to $vm succeeded"
        do
            echo "Trying to SSH into $vm failed. Sleeping for 5 seconds. zzzZZzzZZ"
            sleep  5
        done
    done
    

VM 間の L2 接続を使用して vxlan ネットワークを作成する

Linux の標準 vxlan 機能を使用して、L2 接続ですべての VM を接続するネットワークを作成します。

以下のコマンドには、次のアクションを行う 2 つのループが含まれています。

  1. 各 VM への SSH 接続
  2. 必要なパッケージの更新とインストール
  3. 必要なコマンドを実行して、vxlan でネットワークを構成します。

    i=2 # We start from 10.200.0.2/24
    for vm in "${VMs[@]}"
    do
        gcloud compute ssh root@$vm --zone ${ZONE} << EOF
            apt-get -qq update > /dev/null
            apt-get -qq install -y jq > /dev/null
            set -x
            ip link add vxlan0 type vxlan id 42 dev ens4 dstport 0
            current_ip=\$(ip --json a show dev ens4 | jq '.[0].addr_info[0].local' -r)
            echo "VM IP address is: \$current_ip"
            for ip in ${IPs[@]}; do
                if [ "\$ip" != "\$current_ip" ]; then
                    bridge fdb append to 00:00:00:00:00:00 dst \$ip dev vxlan0
                fi
            done
            ip addr add 10.200.0.$i/24 dev vxlan0
            ip link set up dev vxlan0
    
    EOF
        i=$((i+1))
    done
    
        systemctl stop apparmor.service
        systemctl disable apparmor.service
    

これで、10.200.0.0/24 ネットワーク内に L2 接続が確立されました。VM には次の IP アドレスが割り振られます。

  • 管理 VM: 10.200.0.2
  • コントロール プレーン ノードを実行する VM:
    • 10.200.0.3
    • 10.200.0.4
    • 10.200.0.5
  • ワーカーノードを実行する VM:
    • 10.200.0.6
    • 10.200.0.7

ベアメタル版 Anthos クラスタを使用するための前提条件をインストールする

ベアメタル版 Anthos クラスタをインストールするには、管理マシンに次のツールが必要です。

  • bmctl
  • kubectl
  • Docker
  1. 次のコマンドを実行して、必要なツールをインストールします。

    gcloud compute ssh root@$VM_WS --zone ${ZONE} << EOF
    set -x
    
    export PROJECT_ID=\$(gcloud config get-value project)
    gcloud iam service-accounts keys create bm-gcr.json \
    --iam-account=baremetal-gcr@\${PROJECT_ID}.iam.gserviceaccount.com
    
    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
    
    chmod +x kubectl
    mv kubectl /usr/local/sbin/
    mkdir baremetal && cd baremetal
    gsutil cp gs://anthos-baremetal-release/bmctl/1.10.8/linux-amd64/bmctl .
    chmod a+x bmctl
    mv bmctl /usr/local/sbin/
    
    cd ~
    echo "Installing docker"
    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    EOF
    
  2. 次のコマンドを実行して、root@10.200.0.x が動作することを確認します。このコマンドは、以下のタスクを実行します。

    1. 管理マシンで新しい SSH 認証鍵を生成します。
    2. デプロイメント内の他のすべての VM に公開鍵を追加します。
    gcloud compute ssh root@$VM_WS --zone ${ZONE} << EOF
    set -x
    ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
    sed 's/ssh-rsa/root:ssh-rsa/' ~/.ssh/id_rsa.pub > ssh-metadata
    for vm in ${VMs[@]}
    do
        gcloud compute instances add-metadata \$vm --zone ${ZONE} --metadata-from-file ssh-keys=ssh-metadata
    done
    EOF
    

ベアメタル版 Anthos クラスタをデプロイする

次のコードブロックには、次のタスクを完了するために必要なすべてのコマンドと構成が含まれています。

  1. 必要なハイブリッド クラスタ用の構成ファイルを作成します。
  2. プリフライト チェックを実行します。
  3. クラスタをデプロイします。
gcloud compute ssh root@$VM_WS --zone ${ZONE} << EOF
set -x
export PROJECT_ID=$(gcloud config get-value project)
export clusterid=cluster-1
bmctl create config -c \$clusterid
cat > bmctl-workspace/\$clusterid/\$clusterid.yaml << EOB
---
gcrKeyPath: /root/bm-gcr.json
sshPrivateKeyPath: /root/.ssh/id_rsa
gkeConnectAgentServiceAccountKeyPath: /root/bm-gcr.json
gkeConnectRegisterServiceAccountKeyPath: /root/bm-gcr.json
cloudOperationsServiceAccountKeyPath: /root/bm-gcr.json
---
apiVersion: v1
kind: Namespace
metadata:
  name: cluster-\$clusterid
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: \$clusterid
  namespace: cluster-\$clusterid
spec:
  type: hybrid
  anthosBareMetalVersion: 1.10.8
  gkeConnect:
    projectID: \$PROJECT_ID
  controlPlane:
    nodePoolSpec:
      clusterName: \$clusterid
      nodes:
      - address: 10.200.0.3
      - address: 10.200.0.4
      - address: 10.200.0.5
  clusterNetwork:
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 172.26.232.0/24
  loadBalancer:
    mode: bundled
    ports:
      controlPlaneLBPort: 443
    vips:
      controlPlaneVIP: 10.200.0.49
      ingressVIP: 10.200.0.50
    addressPools:
    - name: pool1
      addresses:
      - 10.200.0.50-10.200.0.70
  clusterOperations:
    # might need to be this location
    location: us-central1
    projectID: \$PROJECT_ID
  storage:
    lvpNodeMounts:
      path: /mnt/localpv-disk
      storageClassName: node-disk
    lvpShare:
      numPVUnderSharedPath: 5
      path: /mnt/localpv-share
      storageClassName: local-shared
  nodeConfig:
    podDensity:
      maxPodsPerNode: 250
    containerRuntime: containerd
---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: node-pool-1
  namespace: cluster-\$clusterid
spec:
  clusterName: \$clusterid
  nodes:
  - address: 10.200.0.6
  - address: 10.200.0.7
EOB

bmctl create cluster -c \$clusterid
EOF

クラスタを確認する

クラスタの kubeconfig ファイルは、管理マシンの bmctl-workspace ディレクトリにあります。デプロイを確認するには次の手順を行います。

  1. 管理ワークステーションに SSH で接続します。

    gcloud compute ssh root@$VM_WS --zone ${ZONE}
    
  2. KUBECONFIG 環境変数にクラスタの構成ファイルへのパスを設定し、クラスタで kubectl コマンドを実行します。

    export clusterid=cluster-1
    export KUBECONFIG=$HOME/bmctl-workspace/$clusterid/$clusterid-kubeconfig
    kubectl get nodes
    

Google Cloud コンソールからクラスタにログインする

Google Cloud コンソールでベアメタル版 Anthos クラスタのワークロードを確認するには、クラスタの kubeconfig ファイルが保存されている管理マシンにログインする必要があります。

詳細については、Google Cloud コンソールからクラスタにログインするご覧ください

クリーンアップ

  1. 管理マシンに接続して、クラスタ VM をインストール前の状態にリセットし、Google Cloud プロジェクトからクラスタを登録解除します。

    gcloud compute ssh root@$VM_WS --zone ${ZONE} << EOF
    set -x
    export clusterid=cluster-1
    bmctl reset -c \$clusterid
    EOF
    
  2. 名前に abm を含むすべての VM を一覧表示します。

    gcloud compute instances list | grep 'abm'
    
  3. 名前に abm を含むすべての VM を削除しても問題がないことを確認します。

    確認後、次のコマンドを実行して abm VM を削除できます。

    gcloud compute instances list --format="value(name)" | grep 'abm'  | xargs gcloud \
        --quiet compute instances delete