Alibaba CloudではじめるKubernetes

こんにちは。ソリューションアーキテクトの森(@mosuke5)です。
先日札幌でユーザコミュニティが発足したとのことで、わたしもいってまいりました。そこで、Alibaba CloudのContainer Service(for Kubernetes)について話してきましたので、こちらでその内容について抜粋してまとめていきたいと思います。

Kubernetesとは

Kubernetesはコンテナ化されたアプリケーションの展開やスケーリングおよび管理をおこなうオーケストレーションツールです。
Dockerに代表されるコンテナは単体で利用することもできるのですが、実際のアプリケーションに応用すると、たくさんのコンポーネントを複数台のサーバの上で管理する必要があり、オーケストレーションツールなしでは運用が難しいです。
Kubernetesのようなオーケストレーションツールを利用することで、複数台のサーバにまたがるコンテナ利用を容易にしていくことができます。

Container Service for Kubernetes

Alibaba Cloudではコンテナアプリケーション化をサポートする、コンテナオーケストレーションサービス Container Service を提供しています。
簡単に言うと、Alibaba Cloud上にKubernetesを利用するためのクラスタを構築してくれるものです。
このサービスではオーケストレーションエンジンとして、実はDocker SwarmモードとKubernetesモードの2つをサポートしています。

Alibaba CloudのContainer Service for Kubernetesは、2017 年に Certified Kubernetes Conformance Program で認定されており、ネイティブKubernetesで利用しているツールやプラグインともちろん組み合わせて利用することが可能です。
Alibaba CloudのContainer Serviceは下記のような特徴を持っています。

  • Alibaba Cloudプロダクトとの連携
    • ロードバランサーとの連携
    • ログ管理サービス Log Serviceとの連携
    • マルチゾーンでのクラスタ構築(Closed Beta)
  • Kubernetes versionは1.9.7をサポート(2018/6/8現在)
    • もうじき1.10をサポート予定です。
  • クラスターのアップグレード機能をサポート
  • ノードのカスタムイメージサポート(CentOSであればカスタムイメージをサポート)

Kubernetesクラスタを立ち上げる

さっそくAlibaba CloudでKubernetesクラスタを構築してみます。
Container Serviceのコンソール画面にいき、「Kubernetesクラスターの作成」を押します。ここでは、下記の設定だけ行いあとはデフォルト設定にします。

クラスター名 my-k8s
リージョン 東京
VPC 自動作成
Master インスタンスタイプ ecs.n4.large
Worker インスタンスタイプ ecs.n4.large
Worker インスタンス数 3
ログイン キーペア
SSHログイン 有効

作成開始後、15分ほどするとクラスタが構築されていると思います。
クラスタといっているのは、Alibaba Cloud上で下記の通りリソースが購入され構築されています。

クラスタを構成するリソースは下記のとおりです。

VPC, Vswitch Kubernetesクラスタを構築するネットワーク
Security Group  Master NodeとWorker Nodeに適応されるファイアウォール
Master Node用ECS クラスタの管理を司るAPIサーバのノード群
Worker Node用ECS コンテナを実行するノード群
Master Node用ロードバランサ(パブリック) インターネットからAPIサーバに接続するためのフロントロードバランサ
Master Node用ロードバランサ(プライベート) VPC内部からAPIサーバに接続するためのフロントロードバランサ
NAT Gateway VPCのクラスタがインターネットの外にでていくためのNATゲートウェイ

クラスタを操作する

Kubernetesクラスタを操作するには一般的にkubectlというコマンドラインツールを利用します。Container Service for Kubernetesでも、kubectlをもちろん利用可能です。

kubectlを利用できるようにするためには、コマンドラインの設定が必要です。
設定が完了すると例えば下記のようにクラスタのノード情報など取得できるようになります。

こちらのドキュメントどおりkubectlを利用できるように設定する必要があります。
https://jp.alibabacloud.com/help/doc-detail/53755.htm

$ kubectl get node
NAME                                  STATUS  ROLES   AGE VERSION
ap-northeast-1.i-6we0kwno9n8bhp56copg Ready   master  4h  v1.9.7
ap-northeast-1.i-6we0kwno9n8bhp56copp Ready   master  4h  v1.9.7
ap-northeast-1.i-6we1bitt00nj1mxtdqmq Ready   <none>  4h  v1.9.7
ap-northeast-1.i-6we1bitt00nj1mxtdqmr Ready   <none>  4h  v1.9.7
ap-northeast-1.i-6we1bitt00nj1mxtdqms Ready   <none>  4h  v1.9.7
ap-northeast-1.i-6wef711ze30tusnthhw9 Ready   master  4h  v1.9.7

基本的な概念を理解する

さっそくHelloWorldにはいっていきたいところですが、その前にKubernetesででてくる用語をまず簡単に抑えていきたいと思います。かなり登場人物(概念)も絞っていて、この記事を読むにあたって必要な用語のみにしました。

Node  Nodeは、Kubernetesクラスタを構成するサーバのこと。Kubernetesクラスタを管理するためのMaster Nodeと、実際にコンテナが可動するWoker Nodeの2種類がある。
Pods PodはKubernetesでのデプロイの最小単位です。実行されるコンテナの集団だと思ってください。
Service サービスディスカバリのための機能。コンテナ化した世界ではコンテナがどこのノードでどのように動いているかわかりませんし変動していきます。サービスディスカバリではそういったコンテナへの接続経路を作っていきます。

Hello World

HelloWorld的にWebサーバをKubernetesで立ち上げてみましょう。Nginxのコンテナをデプロイしてみます。

$ kubectl run nginx --image=nginx:1.13.11
deployment.apps "nginx" created

$ kubectl get pod
NAME                    READY     STATUS    RESTARTS   AGE
nginx-966f97bf8-ktg28   1/1       Running   0          25s

 

ただ、いまのままではNginxのコンテナは起動して動いていますが、外部から接続できる状態ではありません。こちらを外部から接続するにはServiceオブジェクトを作る必要があります。Serviceオブジェクトを作成するとEXTERNAL-IPが付与され、こちらにブラウザからアクセスできるようになります。

$ kubectl expose deployment nginx --port 80 --type LoadBalancer
service "nginx" exposed
$ kubectl get service
NAME        TYPE         CLUSTER-IP   EXTERNAL-IP PORT(S)       AGE
kubernetes  ClusterIP    172.21.0.1   <none>      443/TCP       1d
nginx       LoadBalancer 172.21.9.38  47.91.3.60  80:31614/TCP  40s

ブラウザからNginxの画面が見れることを確認できたわけですが、Alibaba Cloud側ではどうなっているのでしょうか。下記のことが実行されています。

① kubectl exposeを実行する
② Master Nodeに実行リクエストがとびます
③ Master NodeはAPIを通じてSLBインスタンスを作成し、コンテナへアクセスするための経路を作ります

NginxにアクセスするようにSLBが構築され、SLBがアクセスするためのエンドポイントとなるわけです。

LogServiceと連携してログ管理する

Alibaba Cloud独自の強みとしてLogServiceと連携できるところがあります。
エージェントをサーバ内にインストールすることで、ログを収集し管理することのできるサービスがあり、Kubernetesクラスタもこちらと連携できるようになっています。詳しくは下記ブログを参照いただくとしますが、このサービスと連携することで、ログを検索可能にし、不要になったログはオブジェクトストレージに送付してアーカイブすることなどができるようになります。

Alibaba Cloudのログ収集機能を使ってみた

連携方法は、LogTailとよばれるエージェントをKubernetesのDaemonSetとして動作させることでできます。
※現状、日本サイトではLogService側の機能が一部足りず、推奨する連携方式はおこなえず、ここは今改善中です。。少々、お待ち下さい。

TerraformでKubernetesを操作する

最後にmosuke5毎度おなじみですが、Terraformについて。
Alibaba Cloudでは公式にHashiCorpのTerraformとPackerについてサポートしていくことを宣言しています。KubernetesクラスターについてもTerraformで操作可能なので、クラスターの立ち上げからアプリケーションのデプロイまでTerraformで操作することも可能です。

resource "alicloud_cs_kubernetes" "main" {
  name_prefix = "mosuke5-k8s"
  availability_zone = "${data.alicloud_zones.default.zones.0.id}"
  new_nat_gateway = true
  master_instance_type = "ecs.n4.small"
  worker_instance_type = "ecs.n4.small"
  worker_number = 3
  password = "***********"
  pod_cidr = "192.168.1.0/24"
  service_cidr = "192.168.2.0/24"
  enable_ssh = true
  install_cloud_monitor = true
}

resource "kubernetes_pod" "test" {
  metadata {
    name = "terraform-example"
  }
  spec {
    container {
      image = "nginx:lastes" name = "example"
    }
  }
}

さいごに

こちら今回はAlibaba CloudでのContainer Service for Kubernetesの初級編ということで、今後運用などについても更新していきたいと思っています。
どうやら、中国本土ではServerless Kubernetesというのも準備しており、われわれも情報をゲットし次第案内したいと思います。

さいごに、札幌でお話したスライドも掲載しておきます。

この記事をシェアする