Kubernetes the Hard Way on Azure : 3. コンピュートリソース

こんにちは。

引き続き、Kubernetes the Hard Way on Azure を進めていきます。

3. Provisioning Compute Resources

今回はマシン、ネットワーク周りを構築していきます。

f:id:dombri:20200209104359j:plain

Kubernetesは、コントロールプレーン ワーカノード と呼ばれるマシンが必要になります。

このラボでは、以下の構成のKubernetesクラスタを構築します。

  • 2 コントロールプレーン(マスター)
  • 2 ワーカーノード
  • 1リソースグループ・1リージョン(デフォルト)

Networking

Kubernetesのネットワークモデルは、コンテナ・ノードが互いに通信できるフラットなネットワークを想定しています。これが望ましくない場合はネットワークポリシー でコンテナグループが互いに、そして外部ネットワークエンドポイントと通信する方法を制限出来ます。

Virtual Network

このセクションでは、Kubernetes クラスタをホストする、専用の仮想ネットワーク(Vnet)がセットアップされます。

Kubernetesクラスタの各ノードにプライベートIPを割り当てるのに十分な大きさのIPアドレス範囲でプロビジョニングされたサブネット[kubernetes] で、カスタムVnetネットワーク [kubernetes-vnet] を作成します。

az network vnet create -g kubernetes \
  -n kubernetes-vnet \
  --address-prefix 10.240.0.0/24 \
  --subnet-name kubernetes-subnet

10.240.0.0/24 IP アドレス範囲は、最大254個のコンピュートインスタンスをホストできます。

Firewall Rules

Azureでのファイアウォールに当たる ネットワークセキュリティグループ を作成し、サブネットに割当てます。

# NSGの作成
az network nsg create -g kubernetes -n kubernetes-nsg

# サブネットへ割当て
az network vnet subnet update -g kubernetes \
  -n kubernetes-subnet \
  --vnet-name kubernetes-vnet \
  --network-security-group kubernetes-nsg

外部からのSSHHTTPS接続を許可するファイアウォールルールを作成します。

# SSH
az network nsg rule create -g kubernetes \
  -n kubernetes-allow-ssh \
  --access allow \
  --destination-address-prefix '*' \
  --destination-port-range 22 \
  --direction inbound \
  --nsg-name kubernetes-nsg \
  --protocol tcp \
  --source-address-prefix '*' \
  --source-port-range '*' \
  --priority 1000

# HTTPS
az network nsg rule create -g kubernetes \
  -n kubernetes-allow-api-server \
  --access allow \
  --destination-address-prefix '*' \
  --destination-port-range 6443 \
  --direction inbound \
  --nsg-name kubernetes-nsg \
  --protocol tcp \
  --source-address-prefix '*' \
  --source-port-range '*' \
  --priority 1001

外部のロードバランサを使用して、Kuberenetes APIサーバをリモートクライアントに公開します。

Vnet [Kubernetes-vnet]のファイアウォールルールを一覧表示します。

az network nsg rule list -g kubernetes --nsg-name kubernetes-nsg --query "[].{Name:name, \
  Direction:direction, Priority:priority, Port:destinationPortRange}" -o table
出力
Name                         Direction    Priority    Port
---------------------------  -----------  ----------  ------
kubernetes-allow-ssh         Inbound      1000        22
kubernetes-allow-api-server  Inbound      1001        6443


Kubernetes Public IP Address

静的IPアドレスを、APIサーバの前段にある外部ロードバランサに割り当てます。

az network lb create -g kubernetes \
  -n kubernetes-lb \
  --backend-pool-name kubernetes-lb-pool \
  --public-ip-address kubernetes-pip \
  --public-ip-address-allocation static

静的IPアドレスが確実に生成されたか確認します。

az network public-ip  list --query="[?name=='kubernetes-pip'].{ResourceGroup:resourceGroup, \
  Region:location,Allocation:publicIpAllocationMethod,IP:ipAddress}" -o table
出力
ResourceGroup    Region     Allocation    IP
---------------  ---------  ------------  ------------
kubernetes       japaneast  Static        **.**.**.***


たぶんこの辺りが大事。

  • Kubernetesクラスタの各ノードにプライベートIPを割り当てるのに十分な大きさのIPアドレス範囲でプロビジョニングされたサブネット[kubernetes] を用意する
  • 外部のロードバランサを使用して、Kuberenetes APIサーバをリモートクライアントに公開する

Virtual Machines

このラボのインスタンスは、Ubuntu Server 18.04 を使用してプロビジョニングされます。これはcri-containerd ランタイム を適切にサポートします。Kubernetesのブートストラッププロセスを簡素化するために、各コンピューティングインスタンスに静的プライベートIPアドレスがプロビジョニングされます。

最新の安定版Ubuntuサーバを選択するために、以下のコマンドを実行し、変数 "UBUNTULTS" を表の最新行に置き換えます。

az vm image list --location japaneast --publisher Canonical --offer UbuntuServer --sku 18.04-LTS --all -o table

# 書き換える
UBUNTULTS="Canonical:UbuntuServer:18.04-LTS:18.04.202002040"


Kubernetes Controllers

・コントロールプレーンの作成
3台のコンピュートインスタンスを作成します。これらは可用性セットcontroller-as でまとめられたコントロールプレーンをホストします。

# 可用性セットを作成
az vm availability-set create -g kubernetes -n controller-as

# IP, NIC, VMを作成
for i in 0 1 ; do
​    echo "[Controller ${i}] Creating public IP..."
​    az network public-ip create -n controller-${i}-pip -g kubernetes > /dev/null
​    echo "[Controller ${i}] Creating NIC..."
​    az network nic create -g kubernetes \
​        -n controller-${i}-nic \
​        --private-ip-address 10.240.0.1${i} \
​        --public-ip-address controller-${i}-pip \
​        --vnet kubernetes-vnet \
​        --subnet kubernetes-subnet \
​        --ip-forwarding \
​        --lb-name kubernetes-lb \
​        --lb-address-pools kubernetes-lb-pool > /dev/null
​    echo "[Controller ${i}] Creating VM..."
​    az vm create -g kubernetes \
​        -n controller-${i} \
​        --image ${UBUNTULTS} \
​        --nics controller-${i}-nic \
​        --availability-set controller-as \
​        --nsg '' \
​        --admin-username 'kuberoot' > /dev/null \
​        --generate-ssh-keys
done


・ワーカーノードの作成

各ワーカーインスタンスには、KubernetesクラスターCIDR範囲からのポッドサブネットの割り当てが必要です。Podサブネットの割り当ては、後の演習でコンテナネットワークを構成するために使用されます。 インスタンスメタデータ [Pod-cidr] は、実行時に Pod サブネットの割り当てを計算インスタンスに公開するために使用されます。

KubernetesクラスターのCIDR範囲は、コントローラーマネージャーの--cluster-cidr フラグによって定義されます。このチュートリアルでは、クラスターCIDR範囲は10.240.0.0/16に設定され、254サブネットをサポートします。

3台のコンピュートインスタンスを作成します。これらは可用性セットworker-as でまとめられたワーカーノードをホストします。

# 可用性セットを作成
az vm availability-set create -g kubernetes -n worker-as

# IP, NIC, VMを作成
for i in 0 1 ; do
​    echo "[Worker ${i}] Creating public IP..."
​    az network public-ip create -n worker-${i}-pip -g kubernetes > /dev/null
​    echo "[Worker ${i}] Creating NIC..."
​    az network nic create -g kubernetes \
​        -n worker-${i}-nic \
​        --private-ip-address 10.240.0.2${i} \
​        --public-ip-address worker-${i}-pip \
​        --vnet kubernetes-vnet \
​        --subnet kubernetes-subnet \
​        --ip-forwarding > /dev/null
​    echo "[Worker ${i}] Creating VM..."
​    az vm create -g kubernetes \
​        -n worker-${i} \
​        --image ${UBUNTULTS} \
​        --nics worker-${i}-nic \
​        --tags pod-cidr=10.200.${i}.0/24 \
​        --availability-set worker-as \
​        --nsg '' \
​        --admin-username 'kuberoot' > /dev/null \
​        --generate-ssh-keys
done
echo "[Worker 1] Creating VM..."
​    az vm create -g kubernetes \
​        -n worker-1 \
​        --image ${UBUNTULTS} \
​        --nics worker-1-nic \
​        --tags pod-cidr=10.200.1.0/24 \
​        --availability-set worker-as \
​        --nsg '' \
​        --admin-username 'kuberoot' > /dev/null \
​        --generate-ssh-keys


デフォルトゾーンに、コンピュートインスタンスがデプロイされているか確認します。

az vm list -d -g kubernetes -o table

Name          ResourceGroup    PowerState    PublicIps      Fqdns    Location    Zones
------------  ---------------  ------------  -------------  -------  ----------  -------
controller-0  kubernetes       VM running    13.**.***.***            japaneast
controller-1  kubernetes       VM running    13.**.**.***            japaneast
worker-0      kubernetes       VM running    13.***.**.***            japaneast
worker-1      kubernetes       VM running    40.***.***.**           japaneast


4.に続きます。