Serverless Kubernetes (ASK) を使用したPodのデプロイとServiceへの接続について

こんにちは、ソリューションアーキテクトの有馬です。
今回はServerless Kubernetes (ASK) の利用についてご紹介します。

f:id:sbc_sarima:20200319165457p:plain


はじめに

SBクラウドEngineers' Blogでも何度かご紹介しておりますが、Alibaba CloudではKubernetesをマネージドで利用可能な、Container Service for Kubernetes (ACK) と言うプロダクトがあります。
その中で利用可能なクラスタタイプは、大きく分けて3パターン利用する事が可能になっています。
各クラスタタイプの大きな違いとしては、Kubernetesのマスターノードとワーカーノードのデプロイ構成の違いとなります。
大まかな構成は以下のようになります。また、クラスタタイプによって他プロダクトの構成も少々変わってきますが、ここではわかりやくする為他プロダクトは省略しています。

f:id:sbc_sarima:20200316151856p:plain

  • Dedicated Cluster
    •  マスターノード(Controle plane)とワーカーノードはECSへデプロイされ、それぞれのノードをユーザ側で管理する必要があります。
  • Managed Cluster
    •  マスターノード(Controle plane)はAlibaba Cloud側で管理され、ワーカーノードはユーザ側で管理する、いわゆるクラウドベンダーが提供する一般的なマネージドのクラスタ構成となります。
  • Serverless Cluster
    •  マスターノード(Controle plane)はAlibaba Cloud側で管理され、ワーカーノードもAlibaba Cloud側で管理する構成となります。

Serverless Kubernetes (ASK) では、Podが実行される環境として、フルマネージドのコンテナプロダクトのElastic Container Instance (ECI) 上でPodが実行されます。その為ユーザはIaaS(ワーカーノード)を管理する必要はありません。 Elastic Container Instance (ECI) については、前回投稿しましたEngineers' Blogをご覧頂けるとイメージがつきやすいかと思います。

www.sbcloud.co.jp

※ 2020/3時点でServerless Kubernetes (ASK) は、日本リージョンにはローンチされていない為、利用可能なリージョンで実行する必要があります。

クラスタ作成

では、Serverless Kubernetes (ASK) クラスタを作成したいと思います。まずクラスターテンプレートの作成から「標準サーバレスクラスター」を選択します。
※ Serverless Kubernetes (ASK) について以降の表記はASKと記載させて頂き説明します。  

f:id:sbc_sarima:20200317132950p:plain

今回は以下の内容で設定していきます。

  • クラスター名:demo-ask
  • リージョン:シンガポール
  • ゾーン:アジア東南1ゾーンB
  • VPC:自動作成
  • NAT ゲートウェイ:自動作成
  • パブリックアクセス:EIPでAPIサーバの公開

f:id:sbc_sarima:20200318105525p:plain

クラスター名を入力しリージョンとゾーンを選択します。Podを起動する際に必要となるVPC, VSwitch、外部へ通信する為のNAT Gatewayは自動作成を選択します。
VPC, VSwitch, NAT Gatewayについては、事前に作成済みのリソースを指定する事も可能ですが、今回は検証の為自動作成を選択しています。
また、APIを外部から利用可能とする為、パブリックアクセスを有効とします。
他の設定項目としてPraivateZooneやLog Serviceの連携も可能ですが今回は無効としています。

最後にクラスター構成の確認で、クラスタ作成時に作成されるリソースが表示されます。 f:id:sbc_sarima:20200317163319p:plain

クラスタ作成のログが表示されしばらくすると、クラスタが正常に作成されます。
クラスタ作成から完了までの時間を手元で測ってみましたが、2分30秒程度で作成が完了しました。
f:id:sbc_sarima:20200317163322p:plain

基本操作

kubeconfigの作成

作成したクラスタへ接続する為、クラスターの基本情報からKubeConfigをローカルへ設定します。
コンソールから各ワークロードの設定は行えますが、今回はローカルのkubectlから実行します。

f:id:sbc_sarima:20200317181034p:plain

ノード

クラスタが作成された状態のノードの情報を見ると、virtual-kubeletが仮想ノードとして表示されています。
Podはvirtual-kubeletにデプロイされる事で、Elastic Container Instance (ECI) のコンテグループが作成されます。

# kubectl get nodes -o wide
NAME              STATUS   ROLES   AGE    VERSION                  INTERNAL-IP    EXTERNAL-IP   OS-IMAGE    KERNEL-VERSION   CONTAINER-RUNTIME
virtual-kubelet   Ready    agent   140m   v1.11.2-aliyun-1.0.242   10.10.106.37   <none>        <unknown>   <unknown>        <unknown>

f:id:sbc_sarima:20200318093441p:plain
引用:https://www.alibabacloud.com/help/doc-detail/86371.htm

Virtual Kubeletについて今回は細く説明しませんが、以下のブログから内容を確認頂けるかと思います。

www.alibabacloud.com

Podのデプロイ

ではPodをデプロイしてみましょう。DeploymentからnginxのPodを2つ作成します。今回は検証の為細かな設定は省略しています。

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  replicas: 2 
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
EOF

NginxのPodが2つvirtual-kubeletへ起動されました。

# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE              NOMINATED NODE   READINESS GATES
nginx-7db9fccd9b-dk9v6   1/1     Running   0          40s   192.168.0.15   virtual-kubelet   <none>           <none>
nginx-7db9fccd9b-rpv2g   1/1     Running   0          40s   192.168.0.14   virtual-kubelet   <none>           <none>

ECIのコンソール画面からも、コンテナグループが2つ作成されている事が確認できます。

f:id:sbc_sarima:20200318105619p:plain

f:id:sbc_sarima:20200318143551p:plain
PodはECIのコンテナグループとして起動されます

Serviceの作成

作成したPodへServiceを作成してみます。「type: LoadBalancer」を指定する事で、Alibaba Cloud のロードバランサーSLBが作成されPodへバランシングします。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: LoadBalancer
EOF

ServiceがTYPE LoadBalancerで作成され、パブリックIPでEXTERNAL-IP が取得できました。

# kubectl get service -l run=nginx
NAME    TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
nginx   LoadBalancer   172.19.10.141   161.117.162.169   80:31702/TCP   4m9s

作成されたSLBをコンソールから確認をしてると、EXTERNAL-IPで取得したパブリックIPでSLBが作成されている事が確認できます。

f:id:sbc_sarima:20200318110514p:plain

SLBのバランシング対象である仮想サーバグループには、ECIのコンテナグループ(Pod)へアタッチされたENIが設定されています。

f:id:sbc_sarima:20200318145034p:plain

f:id:sbc_sarima:20200318150238p:plain
Alibaba CloudのSLBが作成された状態です

ServiceのEXTERNAL-IPをブラウザで表示してみます。Nginxのトップページが表示されました。 f:id:sbc_sarima:20200318110915p:plain

接続したPodのログを確認すると、アクセスログが出力されています。(接続元IPはマスクしています)

# kubectl logs  nginx-7db9fccd9b-rpv2g
XX.XX.XX.XX - - [18/Mar/2020:02:08:56 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" "-"

まとめ

今回はASKクラスタの作成からPodのデプロイ、Service(SLB)を作成し外部からの接続を確認してみました。
簡易的な構成ではありますが、ASKを使用した場合も変わらずKubernetesを利用できている事が確認できたかと思います。
ただし現時点で全てのKubernetesの機能ををサポートしているわけでありませんので、ドキュメントをご確認の上ご利用頂ければと思います。

www.alibabacloud.com

次回はAlibaba Cloud Container Registry (ACR) を使用した、コンテナイメージのCI/CDパイプライについてご紹介できればと思います。
最後までお読みいただきありがとうございました。

SBクラウドのSlideShareへElastic Container Instance (ECI)とServerless Kubernetes (ASK) についてのスライドをアップロードしていますので、
こちらも参考になればと思います。

www.slideshare.net