こんにちは。ソリューションアーキテクトの森(@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クラスタもこちらと連携できるようになっています。詳しくは下記ブログを参照いただくとしますが、このサービスと連携することで、ログを検索可能にし、不要になったログはオブジェクトストレージに送付してアーカイブすることなどができるようになります。
https://techblog.sbcloud.co.jp/2018/02/07/log-service-logtail/
連携方法は、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というのも準備しており、われわれも情報をゲットし次第案内したいと思います。
さいごに、札幌でお話したスライドも掲載しておきます。