Help us understand the problem. What is going on with this article?

Kubernetesとは?オーケストレーションツールってなに?

Dockerとセットでよく語られるのがKubernetesです。これって一体なんなのでしょう?オーケストレーション?一体なんなの?ってなってたので勉強しました。
加えて、私自身まだまだ浅学なため誤りなどございましたらご指摘していただけると幸いです。

目次

  1. はじめに
  2. Kubernetesとは
  3. Dockerの普及とKubernetes
  4. Kubernetesの概要
  5. 環境構築

1. はじめに

本記事ではKubernetesの概要に関して解説します。Dockerの基本的な操作、概要に関しては記述しませんので、もしDockerの基本的な操作の学習がまだの方はそちらから始めることをお勧めします。こちらの記事でDockerの概要に関して解説しています。また、網羅的により詳細な情報が知りたい場合は公式ドキュメントを参照することをお勧めします。

2. Kubernetesとは

wikiさんの説明を借用してみます。

Kubernetes(クバネティス/クバネテス/クーべネティス)はコンテナ化したアプリケーションのデプロイ、スケーリング、および管理を行うための、オープンソースのコンテナオーケストレーションシステムである。
リリース時より、Dockerを含む多数のコンテナツールと連携して動作する。多数のパブリッククラウドサービスプロバイダがKubernetesベースのPaaSやIaaSを提供しており、プラットフォーム提供サービスとしてKubernetesをデプロイすることができる。また、多くのソフトウェアベンダーも、ブランド化したKubernetesディストリビューションを提供している。

Dockerでデプロイしたコンテナのオートスケール、配置戦略...etc 色々なことを便利に快適にしてくれます。具体的にどう快適にするかは後ほど解説するとして、まずはこのサービスが生まれるに至ったかを纏めたいと思います。歴史は大事。

3. Dockerの普及とKubernets

Dockerの初版リリースは2013年の3月だそうです。コンテナ型仮想化という新しい形態の仮想化技術として生まれ、その使いやすさから利用が進みます。
コンテナを迅速に実行・破棄できるといった大きな利点に気づいたアーリーアダプターの開発者に利用され始める一方、Docker単体では本格的なシステムを運用するには難がありました。デプロイやコンテナの配置戦略、スケールイン、スケールアウト、運用のしやすさ、などの点で便利とは言えない状況だったようです。(実際、DockerはComposeやSwarm、Kubernetesなどを用いないと本格的なサービス作るのは至難の技です)
エコシステムが不十分な中でも熱い支持を受けて爆発的に普及が広がります。エコシステムが不十分だという認識はDocker社自身も認識しており、ComposeやSwarmといったオーケストレーションシステムが開発されました。

さらにAWSなどのPaaSでもECSの登場によりコンテナのアプリケーション開発が現実的なものとなってきます。
オーケストレーションツールの開発が進む中で、2014年に天下のGoogleさんがOSSとして公開したのがKubernetesです。Googleは元々、コンテナ技術において黎明期から開発に力を入れており豊富な知見がありました。それらを活かしてKubernetesは開発されています。

KubernetesはDocker社が開発しているSwarmよりもカスタマイズ性が高く便利なことから普及が進みました。AzureやGCP、AWSでもKubernetesのマネージドサービスが展開されるようになり、Kubernetesはその存在感を増していきます。そして2017年10月に正式にDockerとの統合が発表されデファクトスタンダードとなります。

以上がこれまでの流れです。言及したように本格的な開発を考えた場合、Kubernetesの活用は時代の流れを見てみても避けて通れなさそうです。

4. Kubernetesの概要

Kubernetesを構成する要素をまとめてみました。本章ではそれぞれの構成要素のざっくりとした役割を理解することを目的とします。次章以降、本格的に環境構築を行い操作方法に関して解説していきます。

KubernetesクラスタとNode

Kubernetesクラスタとはこれから紹介するリソースを管理する集合体で、一番外枠の概念です。公式によくわかる図があったのでお借りします。
image.png

https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/
より引用。

クラスターの中に位置するリソースの中で一番大きいものがNodeです。NodeにはMasterNodeとNodeの2種類が存在します。

Namespace

クラスタを入れ子構造のようにすることを可能にする概念です。つまりクラスタの中にクラスタができます。6章以降で実際に構築する際に紹介しますが、クラスタを作成した際、デフォルトでdefault、docker、kube-public、kube-systemの4つのNamespaceが用意されていることがわかります。

Pod

コンテナの集合体のことです。例えばですが、Nginxコンテナとバックエンドのアプリケーションコンテナのように密な関係なコンテナ同士をPodという単位で管理しデプロイすることができます。PodはNodeにデプロイされますが、この際複数のNodeにまたがってデプロイすることは許されていません。

6章以降実際に作成しデプロイ、管理を行ってみます。

ReplicaSet

Podはマニフェストファイル(yamlで記述されるPodの定義ファイル)から通常1個のPodしか作成できません。しかし、大規模のアプリケーションを構築する上では同一のPodを複数実行することが求められることもあります。この際用いるのがReplicaSetで、マニフェストファイルにてreplicas数を定義することで簡単に利用することができます。

Development

アプリケーションデプロイの基本単位です。ReplicaSetの上位概念でReplicaSetを管理・制御します。

Service

サービスディスカバリーなどを提供するためのリソースです。

5. Kubernetes環境設定

Kubernetesに触れてみるための環境設定を行いましょう。以下、主にMacOSでの環境設定方法に関して触れていきます。
Kubernetesのインストール、コマンドラインツール、Web上での管理を可能にするダッシュボードの3つをインストールします。

5.1 Kubernetes

image.png
MacOSの場合はpreferenceから簡単にインストールできます。

5.2 Kubectl

Kubernetesを操作するためのCLIツールです。

こちらを参照。一応MacOSのインストール方法について解説入れておきます。

Install and Set Up kubectl

インストールは順番にコマンド打てば良いです。

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl

$ chmod +x ./kubectl

$ sudo mv ./kubectl /usr/local/bin/kubectl

終わり。

5.3 ダッシュボード

Kubernetesにデプロイされているコンテナなどを確認できるWebベースの管理ツールをインストールします。以下のコマンドでデプロイします。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/src/deploy/recommended/kubernetes-dashboard.yaml
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created

次のコマンドで起動を確認

$ kubectl get pod --namespace=kube-system -l k8s-app=kubernetes-dashboard
NAME                                    READY   STATUS    RESTARTS   AGE
kubernetes-dashboard-7d5dcdb6d9-4fwt2   1/1     Running   0          2m

ダッシュボードを閲覧するためにプロキシサーバを立ち上げる。

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

サーバーがローカルホストで立ち上がってます。

以下のURLにアクセス

http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

ログインにはキーが必要らしいので以下の方法で取得しましょう。

$ kubectl -n kube-system get secret

これで僕の環境では以下のような結果が帰ってきました。

NAME                                             TYPE                                  DATA   AGE
attachdetach-controller-token-qv72c              kubernetes.io/service-account-token   3      1h
bootstrap-signer-token-2plt6                     kubernetes.io/service-account-token   3      1h
bootstrap-token-mzopdn                           bootstrap.kubernetes.io/token         7      1h
certificate-controller-token-z72bk               kubernetes.io/service-account-token   3      1h
clusterrole-aggregation-controller-token-59lv5   kubernetes.io/service-account-token   3      1h
cronjob-controller-token-swvdz                   kubernetes.io/service-account-token   3      1h
daemon-set-controller-token-7r5j4                kubernetes.io/service-account-token   3      1h
default-token-jgvpv                              kubernetes.io/service-account-token   3      1h
deployment-controller-token-w5rxs                kubernetes.io/service-account-token   3      1h
disruption-controller-token-8lhlr                kubernetes.io/service-account-token   3      1h
endpoint-controller-token-gk4rf                  kubernetes.io/service-account-token   3      1h
generic-garbage-collector-token-w27bc            kubernetes.io/service-account-token   3      1h
horizontal-pod-autoscaler-token-k8knh            kubernetes.io/service-account-token   3      1h
job-controller-token-7fxfp                       kubernetes.io/service-account-token   3      1h
kube-dns-token-4dtwd                             kubernetes.io/service-account-token   3      1h
kube-proxy-token-9rsbj                           kubernetes.io/service-account-token   3      1h
kubernetes-dashboard-certs                       Opaque                                0      21m
kubernetes-dashboard-key-holder                  Opaque                                2      20m
kubernetes-dashboard-token-wg7sm                 kubernetes.io/service-account-token   3      21m
namespace-controller-token-g9q87                 kubernetes.io/service-account-token   3      1h
node-controller-token-7j9jh                      kubernetes.io/service-account-token   3      1h
persistent-volume-binder-token-8tt78             kubernetes.io/service-account-token   3      1h
pod-garbage-collector-token-25clt                kubernetes.io/service-account-token   3      1h
pv-protection-controller-token-9jssr             kubernetes.io/service-account-token   3      1h
pvc-protection-controller-token-p6gfz            kubernetes.io/service-account-token   3      1h
replicaset-controller-token-5bdwj                kubernetes.io/service-account-token   3      1h
replication-controller-token-m7tkg               kubernetes.io/service-account-token   3      1h
resourcequota-controller-token-6ln57             kubernetes.io/service-account-token   3      1h
service-account-controller-token-lx5ts           kubernetes.io/service-account-token   3      1h
service-controller-token-jv4n7                   kubernetes.io/service-account-token   3      1h
statefulset-controller-token-lxzj6               kubernetes.io/service-account-token   3      1h
token-cleaner-token-j2zxd                        kubernetes.io/service-account-token   3      1h
ttl-controller-token-svdhr                       kubernetes.io/service-account-token   3      1h

deployment-controller権限でログインする場合は以下のような感じで

# 上のリストからdeployment-controller-xxxxxとなっているものを選びましょう!
$ kubectl -n kube-system describe secret deployment-controller-token-w5rxs

バカみたいに長いトークンが返ってきます。

Name:         deployment-controller-token-w5rxs
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: deployment-controller
              kubernetes.io/service-account.uid: fda38021-671d-11e9-a02d-025000000001

Type:  kubernetes.io/service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWNvbnRyb2xsZXItdG9rZW4tdzVyeHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVwbG95bWVudC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZmRhMzgwMjEtNjcxZC0xMWU5LWEwMmQtMDI1MDAwMDAwMDAxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRlcGxveW1lbnQtY29udHJvbGxlciJ9.QiPoGZ5HVBlttY7GXNwpz_08DaTSoS_qJ-b5dS7Q2B01_--AbGubasvZCrHIfI_9799iFm7MgE9Sb_w7mhQU-3qAb76MabtHCdqrXvKWEKOcquBtbADZ9LAHcOgwmu5T3TIguNqWqFJ1hWOC4KyUMrVQTorZkq_sr7_4-_oqf33LuElwrYS_tKafluFaWDKDkJkagko-Gz8MI1rdTgFgIB1lVEEKCYLHMp-7AT_XK-e_LYh8TJAXm6d6_ucnuUnETW89fpqvL-s6BeNVaU_YZN_ET7iLWxC6MjpzZC1heltSEPCTVdFOhdKEwBoCJMn9LWKaGjXd-kB3oKx2dYDreg
ca.crt:     1025 bytes

tokenを貼っつけてログインします。
スクリーンショット 2019-04-25 21.09.39.png
スクリーンショット 2019-04-25 21.09.52.png

でけた!グラフィカルに管理できると楽でいいですね。

今回はここまで。
体力のある時に実際にマニフェストファイルなどの定義の仕方やKubernetesでの実行方法など書きます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away