AKS と ACI を
組み合わせて使ってみた
青柳 英明
2018/06/23
JAZUG 熊本(くまあず)「九州JAZUG連動企画 Day2」
自己紹介
青柳 英明
職業: 福岡で インフラSE やってます
(オンプレOnly)
経歴: アプリケーション開発 … 3年
インフラエンジニア … 17年
Azure歴: 約2年?
(久々に触りました・・・)
コアメンバー:
Fukuoka.NET
(ふくてん)
JAWS-UG福岡
AKS (Azure Kubernetes Service) とは
→ Azure が提供する 「マネージド」 な Kubernetes サービス
【 アンマネージド 】
API サーバ
管理サービス
データベース
Master ノード
(管理プロセスを動かす)
Worker ノード
(コンテナ実行ホスト)
【 マネージド 】
API サーバ
管理サービス
データベース
サーバ構築不要
サーバ管理不要 Worker ノード
(コンテナ実行ホスト)
ACI (Azure Container Instance) とは
→ Azure が提供する 「サーバレス」 なコンテナ実行環境
【 通常のコンテナ実行環境 】
Docker
サーバ (物理/仮想) をホストとして利用
→ 構築や管理が必要
【 サーバレスなコンテナ実行環境 】
Docker
ホスト/Docker はサービスとして提供
→ 構築・管理は不要
AKS と ACI を組み合わせて使う
【 標準の AKS 環境 】
API サーバ
管理サービス
データベース
サーバ構築不要
サーバ管理不要 Worker ノード
(Azure VM)
【 AKS with ACI 】
API サーバ
管理サービス
データベース
サーバ構築不要
サーバ管理不要
ACI 上で実行
サーバ構築不要
サーバ管理不要
→ 管理ノード・コンテナ実行ノード ともに構築・管理が不要になる
「Virtual Kubelet」 ・・・ AKS with ACI を実現するためのソフトウェア
AKS
Kubelet Kubelet
Worker ノード
(Azure VM)
Virtual Kubelet
ACI ACI ACI
(実態の無いノード)
AKS 環境構築 (1/3)
使用するコマンドツールの準備
・ Azure CLI
・ Kubectl
・ Helm … Virtual Kubelet の導入で使用
Azure Cloud Shell を使う場合 → 上記は既に導入済み
PC / Mac を使う場合 → 適時導入
「Azure Cloud Shell」
→ Azure Portal の右上のアイコンから起動
AKS 環境構築 (2/3)
ASK クラスタの作成
・ リソースグループの作成
az group create –n myResourceGroup –l westus
AKS/ACI が利用できるリージョンに制限あり → 米国西部などを使用
・ AKS クラスタの作成
az aks create -n myAksCluster -g myResourceGroup
デフォルト (オプションを何もつけない) の場合
→ サイズ 「DS1v2」 のノードが 「3つ」 作成される (料金を確認しておきましょう)
AKS 環境構築 (3/3)
Kubectl コマンドツールの設定と確認
・ 作成した AKS クラスタへの接続情報 (資格情報) を取り込む
az aks get-credentials -n myAksCluster -g myResourceGroup
→ 「~/.kube/config」 へインポートされる
・ kubectl コマンドで接続できること (情報が取得できること) を確認
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-38988403-0 Ready agent 22m v1.9.6
aks-nodepool1-38988403-1 Ready agent 22m v1.9.6
aks-nodepool1-38988403-2 Ready agent 22m v1.9.6
Virtual Kubelet 環境構築 (1/3)
Helm コマンドツールの設定と確認
・ helm の初期化
helm init
・ 正常に初期化されたことを確認
$ helm version
Client: &version.Version{SemVer:“v2.9.1”, GitCommit:・・・
Server: &version.Version{SemVer:“v2.9.1”, GitCommit:・・・
「Server」 が上手く表示されない場合 → ここまでの設定を見直し
Virtual Kubelet 環境構築 (2/3)
Virtual Kubelet の導入
・ 「ACI コネクター」 を使った Virtual Kubelet のインストール
az aks install-connector -n myAksCluster -g myResourceGroup
--connector-name myconnector
※ 実際は1行
README の手順にある
「Manual set-up」
「Deployment of the ACI provider in your cluster」
は実施する必要なし
Virtual Kubelet 環境構築 (3/3)
環境構築の結果確認
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-38988403-0 Ready agent 1d v1.9.6
aks-nodepool1-38988403-1 Ready agent 1d v1.9.6
aks-nodepool1-38988403-2 Ready agent 1d v1.9.6
virtual-kubelet-myconnector-linux Ready agent 1d v1.8.3
$ kubectl get pods –o wide
NAME READY
myconnector-linux-virtual-kubelet-for-aks-68f6b94867-5z55f 1/1
STATUS RESTARTS AGE IP NODE
Running 0 1d 10.244.0.4 aks-nodepool1-38988403-0
動作確認 (その1)
README の手順に従い、サンプル Pod (コンテナ) をデプロイ
apiVersion: v1
kind: Pod
metadata:
name: helloworld
spec:
containers:
- image: microsoft/aci-helloworld
imagePullPolicy: Always
name: helloworld
・・・(略)・・・
nodeName: virtual-kubelet-myconnector-linux
tolerations:
- key: azure.com/aci
effect: NoSchedule
この記述が必要
動作確認 (その2)
自作のテストコンテナをデプロイ
・ 複数のPodを展開
・ ロードバランサによる負荷分散
TCP/80
Service
Load
Balancer
Pod
ACI
Pod
ACI
Pod
ACI
replicas:3
Deployment
ReplicaSet
・・・ Kubernetes Resouece
・・・ Azure Service
展開した 3 つの Pod が、
Virtual Kubelet が管理する仮想ノード上で稼働している
$ kubectl get pods -o wide
NAME READY STATUS
myconnector-linux-virtual-kubelet-for-aks-68f6b94867-5z55f 1/1 Running
webserver-aci-deploy-7475c87d6f-8s57w 1/1 Running
webserver-aci-deploy-7475c87d6f-d5lg6 1/1 Running
webserver-aci-deploy-7475c87d6f-xrbdb 1/1 Running
RESTARTS AGE IP NODE
0 1d 10.244.0.4 aks-nodepool1-38988403-0
0 4m 104.42.50.138 virtual-kubelet-myconnector-linux
0 4m 104.210.53.227 virtual-kubelet-myconnector-linux
0 4m 104.42.119.65 virtual-kubelet-myconnector-linux
ACI のインスタンス一覧を確認
→ 1つの Pod につき、1つのコンテナインスタンスが作成されている
$ az container list -o table
Name Image
--------------------------------------------- ---------------------------------------------
default-webserver-aci-deploy-7475c87d6f-8s57w kumaazu2018.azurecr.io/go-webserver-sample:v1
default-webserver-aci-deploy-7475c87d6f-d5lg6 kumaazu2018.azurecr.io/go-webserver-sample:v1
default-webserver-aci-deploy-7475c87d6f-xrbdb kumaazu2018.azurecr.io/go-webserver-sample:v1
ACR (Azure Container Registry) の使用
公式コンテナイメージ
の場合
(動作確認 その1)
自作コンテナイメージ
の場合
(動作確認 その2)
Docker Hub
pull
認証なし
Docker
push
ACR
pull
認証が必要
AKS/ACI
ACR の認証設定
AKS の場合
https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-aks#grant-aks-access-to-acr
→ Virtual Kubelet (AKS with ACI) の場合、この方法ではダメ
ACI の場合
・ az container create の 「--registry-username」 「--registry-password」 オプション
→ ACI は Virtual Kubelet から暗黙的にデプロイされるため、この方法は使えない
・ 「サービスプリンシパル」 を使用して認証設定を行う
https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-aks#access-with-kubernetes-secret
→ Virtual Kubelet (AKS with ACI) の場合は、この方法を使う必要がある
サービスプリンシパルを作成し、資格情報を抽出する
$ ACR_NAME=KumaAzu2018
$ SERVICE_PRINCIPAL_NAME=acr-service-principal
$ ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv)
$ ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
$ SP_PASSWD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --role Reader --scopes $ACR_REGISTRY_ID
--query password --output tsv)
$ CLIENT_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv)
$ echo $ACR_LOGIN_SERVER
$ echo $CLIENT_ID
$ echo $SP_PASSWD
資格情報を Kubenetes の 「シークレット」 に格納する
$ kubectl create secret docker-registry acr-auth --docker-server $ACR_LOGIN_SERVER --docker-username $CLIENT_ID
--docker-password $SP_PASSWD --docker-email "foo@example.com"
secret "acr-auth" created
$ kubectl get secrets -o wide
NAME TYPE DATA AGE
acr-auth kubernetes.io/dockerconfigjson 1 24s
default-token-58jjl kubernetes.io/service-account-token 3 18h
myconnector-linux-virtual-kubelet-for-aks Opaque 3 18h
Kubenetes マニフェストファイルの記述内容 (抜粋)
spec:
containers:
- name: go-webserver-sample
image: kumaazu2018.azurecr.io/go-webserver-sample:v1
imagePullSecrets:
- name: acr-auth
「imagePullSecrets」 を記述
→ イメージを ACR から pull する際、
シークレットから資格情報を取り出して認証を行う
まとめ (所感)
・ 現状 (プレビュー) では、複数のコマンドツール (Azure CLI、kubectl、Helm) を
組み合わせて設定する必要あり
・ ACR の認証設定や、Kubernetes マニフェストファイルの記述など、
面倒な部分が多い
正式リリース時には、Azure CLI コマンド (az aks) に統合されたり、
GUI (ポータル) でも設定できるようになる・・・のかな?(期待)
ご清聴ありがとうございました

AKS と ACI を組み合わせて使ってみた

  • 1.
    AKS と ACIを 組み合わせて使ってみた 青柳 英明 2018/06/23 JAZUG 熊本(くまあず)「九州JAZUG連動企画 Day2」
  • 2.
    自己紹介 青柳 英明 職業: 福岡でインフラSE やってます (オンプレOnly) 経歴: アプリケーション開発 … 3年 インフラエンジニア … 17年 Azure歴: 約2年? (久々に触りました・・・) コアメンバー: Fukuoka.NET (ふくてん) JAWS-UG福岡
  • 3.
    AKS (Azure KubernetesService) とは → Azure が提供する 「マネージド」 な Kubernetes サービス 【 アンマネージド 】 API サーバ 管理サービス データベース Master ノード (管理プロセスを動かす) Worker ノード (コンテナ実行ホスト) 【 マネージド 】 API サーバ 管理サービス データベース サーバ構築不要 サーバ管理不要 Worker ノード (コンテナ実行ホスト)
  • 4.
    ACI (Azure ContainerInstance) とは → Azure が提供する 「サーバレス」 なコンテナ実行環境 【 通常のコンテナ実行環境 】 Docker サーバ (物理/仮想) をホストとして利用 → 構築や管理が必要 【 サーバレスなコンテナ実行環境 】 Docker ホスト/Docker はサービスとして提供 → 構築・管理は不要
  • 5.
    AKS と ACIを組み合わせて使う 【 標準の AKS 環境 】 API サーバ 管理サービス データベース サーバ構築不要 サーバ管理不要 Worker ノード (Azure VM) 【 AKS with ACI 】 API サーバ 管理サービス データベース サーバ構築不要 サーバ管理不要 ACI 上で実行 サーバ構築不要 サーバ管理不要 → 管理ノード・コンテナ実行ノード ともに構築・管理が不要になる
  • 6.
    「Virtual Kubelet」 ・・・AKS with ACI を実現するためのソフトウェア AKS Kubelet Kubelet Worker ノード (Azure VM) Virtual Kubelet ACI ACI ACI (実態の無いノード)
  • 7.
    AKS 環境構築 (1/3) 使用するコマンドツールの準備 ・Azure CLI ・ Kubectl ・ Helm … Virtual Kubelet の導入で使用 Azure Cloud Shell を使う場合 → 上記は既に導入済み PC / Mac を使う場合 → 適時導入 「Azure Cloud Shell」 → Azure Portal の右上のアイコンから起動
  • 8.
    AKS 環境構築 (2/3) ASKクラスタの作成 ・ リソースグループの作成 az group create –n myResourceGroup –l westus AKS/ACI が利用できるリージョンに制限あり → 米国西部などを使用 ・ AKS クラスタの作成 az aks create -n myAksCluster -g myResourceGroup デフォルト (オプションを何もつけない) の場合 → サイズ 「DS1v2」 のノードが 「3つ」 作成される (料金を確認しておきましょう)
  • 9.
    AKS 環境構築 (3/3) Kubectlコマンドツールの設定と確認 ・ 作成した AKS クラスタへの接続情報 (資格情報) を取り込む az aks get-credentials -n myAksCluster -g myResourceGroup → 「~/.kube/config」 へインポートされる ・ kubectl コマンドで接続できること (情報が取得できること) を確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION aks-nodepool1-38988403-0 Ready agent 22m v1.9.6 aks-nodepool1-38988403-1 Ready agent 22m v1.9.6 aks-nodepool1-38988403-2 Ready agent 22m v1.9.6
  • 10.
    Virtual Kubelet 環境構築(1/3) Helm コマンドツールの設定と確認 ・ helm の初期化 helm init ・ 正常に初期化されたことを確認 $ helm version Client: &version.Version{SemVer:“v2.9.1”, GitCommit:・・・ Server: &version.Version{SemVer:“v2.9.1”, GitCommit:・・・ 「Server」 が上手く表示されない場合 → ここまでの設定を見直し
  • 11.
    Virtual Kubelet 環境構築(2/3) Virtual Kubelet の導入 ・ 「ACI コネクター」 を使った Virtual Kubelet のインストール az aks install-connector -n myAksCluster -g myResourceGroup --connector-name myconnector ※ 実際は1行 README の手順にある 「Manual set-up」 「Deployment of the ACI provider in your cluster」 は実施する必要なし
  • 12.
    Virtual Kubelet 環境構築(3/3) 環境構築の結果確認 $ kubectl get nodes NAME STATUS ROLES AGE VERSION aks-nodepool1-38988403-0 Ready agent 1d v1.9.6 aks-nodepool1-38988403-1 Ready agent 1d v1.9.6 aks-nodepool1-38988403-2 Ready agent 1d v1.9.6 virtual-kubelet-myconnector-linux Ready agent 1d v1.8.3 $ kubectl get pods –o wide NAME READY myconnector-linux-virtual-kubelet-for-aks-68f6b94867-5z55f 1/1 STATUS RESTARTS AGE IP NODE Running 0 1d 10.244.0.4 aks-nodepool1-38988403-0
  • 13.
    動作確認 (その1) README の手順に従い、サンプルPod (コンテナ) をデプロイ apiVersion: v1 kind: Pod metadata: name: helloworld spec: containers: - image: microsoft/aci-helloworld imagePullPolicy: Always name: helloworld ・・・(略)・・・ nodeName: virtual-kubelet-myconnector-linux tolerations: - key: azure.com/aci effect: NoSchedule この記述が必要
  • 14.
    動作確認 (その2) 自作のテストコンテナをデプロイ ・ 複数のPodを展開 ・ロードバランサによる負荷分散 TCP/80 Service Load Balancer Pod ACI Pod ACI Pod ACI replicas:3 Deployment ReplicaSet ・・・ Kubernetes Resouece ・・・ Azure Service
  • 15.
    展開した 3 つのPod が、 Virtual Kubelet が管理する仮想ノード上で稼働している $ kubectl get pods -o wide NAME READY STATUS myconnector-linux-virtual-kubelet-for-aks-68f6b94867-5z55f 1/1 Running webserver-aci-deploy-7475c87d6f-8s57w 1/1 Running webserver-aci-deploy-7475c87d6f-d5lg6 1/1 Running webserver-aci-deploy-7475c87d6f-xrbdb 1/1 Running RESTARTS AGE IP NODE 0 1d 10.244.0.4 aks-nodepool1-38988403-0 0 4m 104.42.50.138 virtual-kubelet-myconnector-linux 0 4m 104.210.53.227 virtual-kubelet-myconnector-linux 0 4m 104.42.119.65 virtual-kubelet-myconnector-linux
  • 16.
    ACI のインスタンス一覧を確認 → 1つのPod につき、1つのコンテナインスタンスが作成されている $ az container list -o table Name Image --------------------------------------------- --------------------------------------------- default-webserver-aci-deploy-7475c87d6f-8s57w kumaazu2018.azurecr.io/go-webserver-sample:v1 default-webserver-aci-deploy-7475c87d6f-d5lg6 kumaazu2018.azurecr.io/go-webserver-sample:v1 default-webserver-aci-deploy-7475c87d6f-xrbdb kumaazu2018.azurecr.io/go-webserver-sample:v1
  • 18.
    ACR (Azure ContainerRegistry) の使用 公式コンテナイメージ の場合 (動作確認 その1) 自作コンテナイメージ の場合 (動作確認 その2) Docker Hub pull 認証なし Docker push ACR pull 認証が必要 AKS/ACI
  • 19.
    ACR の認証設定 AKS の場合 https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-aks#grant-aks-access-to-acr →Virtual Kubelet (AKS with ACI) の場合、この方法ではダメ ACI の場合 ・ az container create の 「--registry-username」 「--registry-password」 オプション → ACI は Virtual Kubelet から暗黙的にデプロイされるため、この方法は使えない ・ 「サービスプリンシパル」 を使用して認証設定を行う https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-aks#access-with-kubernetes-secret → Virtual Kubelet (AKS with ACI) の場合は、この方法を使う必要がある
  • 20.
    サービスプリンシパルを作成し、資格情報を抽出する $ ACR_NAME=KumaAzu2018 $ SERVICE_PRINCIPAL_NAME=acr-service-principal $ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --query loginServer --output tsv) $ ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv) $ SP_PASSWD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --role Reader --scopes $ACR_REGISTRY_ID --query password --output tsv) $ CLIENT_ID=$(az ad sp show --id http://$SERVICE_PRINCIPAL_NAME --query appId --output tsv) $ echo $ACR_LOGIN_SERVER $ echo $CLIENT_ID $ echo $SP_PASSWD
  • 21.
    資格情報を Kubenetes の「シークレット」 に格納する $ kubectl create secret docker-registry acr-auth --docker-server $ACR_LOGIN_SERVER --docker-username $CLIENT_ID --docker-password $SP_PASSWD --docker-email "foo@example.com" secret "acr-auth" created $ kubectl get secrets -o wide NAME TYPE DATA AGE acr-auth kubernetes.io/dockerconfigjson 1 24s default-token-58jjl kubernetes.io/service-account-token 3 18h myconnector-linux-virtual-kubelet-for-aks Opaque 3 18h
  • 22.
    Kubenetes マニフェストファイルの記述内容 (抜粋) spec: containers: -name: go-webserver-sample image: kumaazu2018.azurecr.io/go-webserver-sample:v1 imagePullSecrets: - name: acr-auth 「imagePullSecrets」 を記述 → イメージを ACR から pull する際、 シークレットから資格情報を取り出して認証を行う
  • 23.
    まとめ (所感) ・ 現状(プレビュー) では、複数のコマンドツール (Azure CLI、kubectl、Helm) を 組み合わせて設定する必要あり ・ ACR の認証設定や、Kubernetes マニフェストファイルの記述など、 面倒な部分が多い 正式リリース時には、Azure CLI コマンド (az aks) に統合されたり、 GUI (ポータル) でも設定できるようになる・・・のかな?(期待) ご清聴ありがとうございました