- ライター:奈良 昌紀
- 通信事業者のデータセンターにおいてネットワーク・サーバー運用を経験した後、ネットワンシステムズに入社。帯域制御やWAN高速化製品担当を経て、2008年から仮想化関連製品を担当。現在は主にクラウド、仮想インフラの管理、自動化、ネットワーク仮想化を担当。
目次
はじめに
今回はVMwareのTanzu™ Kubernetes Grid™ (TKG) をAVS上で利用する方法をご紹介します。
本内容は2021年1月に実施した検証に基づいています。各サービス、コンポーネントの最新のバージョンや対応状況は、記事作成時と異なる可能性がありますのでご了承ください。
Azure VMware® Solution (AVS) は、Azureのインフラストラクチャ上でMicrosoftが提供するvSphere®環境です。AVSのvSphere環境はVMware Cloud Foundation™をベースに構築されており、VMwareのvSphere、vSAN™、NSX-T™ DataCenterによって構成されています。Azureが持つ様々なネットワークサービスを利用することができるため、ExpressRouteを利用してハイブリッドクラウドを実現し、Azure VNetと直接接続することによりAzureのネイティブサービスと組み合わせて利用する等、非常に柔軟にネットワークを構成することが可能です。概要はこちらの匠コラムでご紹介しています。
Tanzu Kubernetes Gridとは
Tanzu Kubernetes Grid (TKG) はオープンソースとして開発されているCluster APIを利用して、Kubernetesクラスターのプロビジョニングを行います。Clsuter APIはKubernetesクラスター上で機能する拡張機能で、vSphereやAWS、Azure等のパブリッククラウド環境にKubernetesクラスターをプロビジョニングすることが可能です。
現在、TKGには3つの種類があります。vSphere 7から利用可能になったVMware vSphere® with VMware Tanzu™は、vSphereにTKGをTanzu Kubernetes Grid Service (TKGS) として統合し、vSphere環境にKubernetesクラスターをプロビジョニングすることに特化しています。Tanzu Kubernetes Grid Multicloud (TKGM) は、vSphereのほか、AWSやAzure等のパブリッククラウドに対してもKubernetesクラスターをプロビジョニングすることが可能です。また、VMwareに買収されたPivotal社が提供していたPivotal Container Service (PKS) は、現在VMware Tanzu™ Kubernetes Grid™ Integrated Edition (TKGI) に名称変更されています(TKGの中でTKGIだけはCluster APIではなく、boshという仕組みを利用してKubernetesクラスターをプロビジョニングします)。
2021年3月現在、AVSのvSphereバージョンが6.7であるため、AVS上でTKGSを利用することができませんが、TGKMはvSphere 6.7以降に対応しており、AVS環境ではTKGMを利用することによりKubernetesクラスターのプロビジョニングが可能です。
Tanzu Kubernetes Gridの準備
AVS上でTanzu Kubernetes Grid Multicloudを利用するためには、Cluster APIをホストするManagement ClusterをAVS上にデプロイする必要があります。このデプロイは、ブートストラップノードと呼ばれるマシンでtkgコマンドを利用して行います。ブートストラップノードでは、内部的にkind (Kubernetes in Docker)と呼ばれる小規模なKubernetesクラスター作成し、このKubernetesクラスターに構成されるCluster APIを利用してAVS上にManagement Clusterを構成します。
Management Cluster/Tanzu Kubernetes Clsuterは、TKG用のベースOSイメージテンプレートを利用して仮想マシンを作成するため、TKG用のOVAをインポートしてテンプレート化します。また、Kubernetesクラスターが利用するネットワークはDHCPが必要となるため、NSX Managerでセグメントを追加し、DHCPを有効化しておきます。
ブートストラップノードがManagement Clusterを作成するために必要な各種パラメータは、~/.tkg/config.yaml
に以下のように設定します(VSPHERE_SERVERやVSPHERE_PASSWORD、VSPHERE_NETWORK 等環境に合わせて修正する必要があります)。
VSPHERE_SERVER: 10.43.224.2 VSPHERE_USERNAME: cloudadmin@vsphere.local VSPHERE_PASSWORD: <vsphere password> VSPHERE_DATACENTER: SDDC-Datacenter VSPHERE_DATASTORE: vsanDatastore VSPHERE_NETWORK: tanzu-pg VSPHERE_RESOURCE_POOL: /SDDC-Datacenter/host/Cluster-1/Resources/tkg VSPHERE_FOLDER: /SDDC-Datacenter/vm VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3NzaC1…. SERVICE_CIDR: 100.64.0.0/13 CLUSTER_CIDR: 100.96.0.0/11 VSPHERE_WORKER_DISK_GIB: 50 VSPHERE_WORKER_NUM_CPUS: 2 VSPHERE_WORKER_MEM_MIB: 4096 VSPHERE_CONTROL_PLANE_DISK_GIB: 30 VSPHERE_CONTROL_PLANE_NUM_CPUS: 2 VSPHERE_CONTROL_PLANE_MEM_MIB: 2048
上記設定ファイルを作成後、ブートストラップノードで tkg init
コマンドを実行すると、Management Clusterの作成が行われます。このときDHCPの範囲外にあるIPアドレスを --vsphere-controlplane-endpoint-ip
として指定し、Management ClusterのKubernetes APIのIPアドレスを設定します。
$ tkg init --infrastructure-vsphere --name=mgmt \
--vsphere-controlplane-endpoint-ip=10.43.235.253
Tanzu Kubernetes Gridの利用
AVS上にManagement Clusterが作成されると、tkgコマンドによりManagement ClusterのCluster APIを利用してAVS上にTanzu Kubernetes Clusterを作成することが可能になります。
tkg create cluster
コマンドでクラスターを作成することが可能です。クラスター作成時のオプションは以下の通りです。
- --kubernetes-version : Tanzu Kubernetes ClusterのKubernetesバージョンの指定。該当バージョンのベースOSイメージテンプレートがvSphere環境にインポートされている必要がある。
- --vsphere-controlplane-endpoint-ip : Management Clusterと同じく、オプションによりKubernetes API向けのStatic IPアドレスを指定する。
- --plan=prod/dev : prodを指定するとControl Plane 3台/Worker Node 3台構成となり、devを指定するとControl Plane 1台/Worker Node 1台構成となる。
- --worker-machine-count : Workerノード数の指定。上記planの構成を変更する場合に利用する。
$ tkg create cluster tkg1 --kubernetes-version=v1.19.1 --plan=prod \ --vsphere-controlplane-endpoint-ip=10.43.235.252 --worker-machine-count 4
作成したクラスターは、tkg get cluster
コマンドで確認可能です。
$ tkg get cluster NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES tkg1 default running 3/3 3/3 v1.19.1+vmware.2 <none>
作成したクラスターを利用するには、tkg get credentials
コマンドでクレデンシャルを取得する必要があります。取得したクレデンシャルはKUBECONFIGのContextとして設定されるため、kubectl config use-context
で接続先を切り替えることが可能です。
$ tkg get credentials tkg1 Credentials of workload cluster 'tkg1' have been saved You can now access the cluster by running 'kubectl config use-context tkg1-admin@tkg1'
ロードバランサー/Ingressコントローラーの利用
通常Kubernetesクラスターを利用する場合、外部のロードバランサーを利用してクラスターのサービス向けのロードバランサーを構成します。AVS上にデプロイされたTanzu Kubernetes Clusterではロードバランサーが構成されないため、今回はMetalLBを利用しました。MetalLBはソフトウェアとして提供されるロードバランサーです。
MetalLBを構成するネームスペースを作成します。
$ kubectl apply –f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
MetalLBをLayer2構成とするためのConfigMapを作成します。「addresses」にはMetalLBが利用するVIP用のアドレス範囲を指定します。
$ cat << EOF | kubectl apply –f - apiVersion: v1 kind: ConfigMap metadata: namespace: metallb-system name: config data: config: | address-pools: - name: default protocol: layer2 addresses: - 10.43.235.101-10.43.235.110 EOF
MetalLBを構成するDeployment/DaemonSet/Role、Secret等を作成します。
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml $ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
MetalLBをロードバランサーとして利用することで、Ingressコントローラーを利用することが可能になります。今回は、VMwareが提供するTKGの機能拡張としてサポートされるContourを構成しました。
ダウンロードしたTKGの機能拡張バンドルを利用して、Tanzu Kubernetes ClusterにExtension Managerをインストールします。
$ tar zxvf tkg-extensions-manifests-v1.2.0-vmware.1.tar-2.gz $ cd tkg-extensions-v1.2.0+vmware.1/extensions/ $ kubectl apply -f tmc-extension-manager.yaml $ kubectl apply -f kapp-controller.yaml
$ kubectl apply -f ../cert-manager/
Contour向けネームスペース (tanzu-system-ingress) とロールを作成し、contour-data-values.yamlを作成、envoy.service.type: LoadBalncer
を指定しEnvoyをMetalLB経由で公開する設定を追加し、Secretとして作成します。
$ kubectl apply -f ingress/contour/namespace-role.yaml $ cp ingress/contour/vsphere/contour-data-values.yaml.example ingress/contour/vsphere/contour-data-values.yaml $ vi ingress/contour/vsphere/contour-data-values.yaml $ kubectl create secret generic contour-data-values --from-file=values.yaml=ingress/contour/vsphere/contour-data-values.yaml -n tanzu-system-ingress
Extension Managerを利用して、Contourを機能拡張としてインストールすると、ContourがIngressコントローラーとして利用可能になります。
$ kubectl apply -f ingress/contour/contour-extension.yaml $ kubectl get app contour -n tanzu-system-ingress NAME DESCRIPTION SINCE-DEPLOY AGE contour Reconcile succeeded 3s 56s
Azure Container Registryの利用
TKGMを利用してクラスター内に、Habrorレジストリを利用することも可能ですが、Azure上であれば、Azureがサービスとして提供するAzure Container Registry (ACR) を利用することが可能です。AVSで作成されるvSphere環境は、ExpressRouteを利用してユーザーのVNetと接続されます。ACRをプライベートレジストリとして利用する場合、AzureのPrivate Linkを利用してユーザーVNet内にACRのPrivate Endpointを作成し、AVS上のTanzu Kubernetes Clusterからプライベートレジストリとして利用することが可能になります。
通常、Private Endpointは、VNet内の仮想マシンがセキュアにAzureのネイティブサービスにアクセスするために利用されるため、VNet内でAzure DNSのプライベートレコードとして、Private Endpointの名前解決が可能になります。AVS環境はAzureインフラストラクチャ上で動作していますが、VNet外のリソースであるためPrivate Endpointの名前解決を可能にするため、VNet内にDNSリゾルバとなる仮想マシンを作成し、Tanzu Kubernetes Clusterからこの仮想マシンをDNSサーバーとして指定することで、Private Endpointの名前解決が可能になり、ACRへの利用が可能になりました。
まとめ
Azure VMware Solutionを利用することにより、使い慣れたvSphere環境をAzureのインフラストラクチャ上で実行することが可能です。Azureが持つ様々なネイティブサービスと組み合わせることで、オンプレミス環境だけでは難しかった迅速なワークロードの展開が可能になります。
AVSはAzureやオンプレミスのネットワークと連携するために、柔軟にネットワークを構成することが可能となっており、オンプレミス、Azure両方のネットワークを考慮した設計が重要になります。Azure VMware Solutionの導入をご検討の際は、ぜひ弊社にご相談ください。
※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。