この連載が書籍になりました!『Kubernetes完全ガイド

Kubernetes環境の選択肢

2018年2月21日(水)
青山 真也
連載の2回目となる今回は、Kubernetes環境を準備するにあたり、どのような選択肢があるのかを紹介する。

Kubernetes環境の選択肢

第2回はKubernetes環境の準備をする話になります。Kubernetesの環境を利用する場合には、大きく分けると下記の3種類の方法があります。

  • 手元のWindows/Mac上でローカル Kubernetes 環境を立ち上げる
  • 構築ツールを使ってクラスタを構築する
  • パブリッククラウドのマネージド Kubernetes を利用する

環境により一部出来ないこと(外部ロードバランサとの連携やDynamic Persistent Volumeなど)がありますが、基本的にはどのKubernetes環境でも同じ動作をするようにCNCFがConformance Programを提供しています。今回紹介するKubernetes環境はいずれも、Conformance Programにより認定されたCertified Kubernetes Distribution/Platformです。数多くの選択肢がありますが、今回は各方法から2、3種類ずつ紹介します。

  • ローカルKubernetes
    • Minikube
    • Docker for Mac
  • Kubernetes構築ツール
    • kubeadm
    • Rancher
  • パブリッククラウド上のマネージドKubernetes
    • Google Kubernetes Engine(GKE)
    • Azure Container Service(AKS)
    • Elastic Container Service for Kubernetes(EKS)

ローカル Kubernetes

1つ目のローカルKubernetesは、手元のマシン上で気軽にKubernetesを試すことの出来る方法です。1台のマシン上にオールインワン構成で動作させるため、冗長性は一切担保されていない点に注意して下さい。また、一部の機能などが利用できません。

Minikube

Minikubeのロゴ

Minikubeのロゴ

手元でKubernetesを動作させる場合に、ほとんどの方がMinikubeを選択しているかと思います。Minikubeの動作にはデフォルトでVirtualBoxが必要なため、事前にインストールしておく必要があります。特にバージョンを気にしない場合にはHomebrewなどのパッケージマネージャーでインストールすることも可能ですし、インストーラなど別の手段でも問題ありません。その他にxhyveやVMware Fusionなども利用可能です。

リスト1:HomebrewのbrewコマンドでVirtualBoxをインストール

$ brew update
$ brew install kubectl
$ brew cask install virtualbox

Minikube自体はbrewでのインストールかバイナリのダウンロードを行って下さい。

リスト2:Minikubeをbrewコマンドでインストール

$ brew install minikube

または

リスト3:バイナリをダウンロードしてインストール

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
$ chmod 755 minikube

事前準備が整った後はMinikubeを起動します。バージョンの指定がある場合には--kubernetes-versionオプションを指定して下さい。

リスト4:Minikubeを起動した際のようす

$ minikube start --kubernetes-version v1.8.0
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Downloading Minikube ISO
 140.01 MB / 140.01 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
 148.25 MB / 148.25 MB [============================================] 100.00% 0s
 0 B / 65 B [----------------------------------------------------------]   0.00%
 65 B / 65 B [======================================================] 100.00% 0sSetting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

Minikubeが正しく起動できている場合には、「minikube status」コマンドを入力すると下記のような状態になっているかと思います。この時、Minikube用にVirtualBox上にVMが起動されています。これ以降は、kubectlでMinikubeのクラスタを操作することが可能です。

リスト5:Minikube起動後の状態を確認

$ minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

また、不要になったMinikubeクラスタは、以下のように簡単に削除することが可能です。

リスト6:Minikubeクラスタの削除

$ minikube delete

Docker for Mac

DockerCon EU 17においてDocker社もKubernetesサポートを発表し、KubernetesのCLIからDocker Swarmを操作するなど、連携機能の強化が行われることになりました。Docker for Macでも、バージョン17.12 CE EdgeからローカルマシンにKubernetesを起動できるようになり、選択肢の1つとなりました。ただし、Kubernetesのバージョン指定は現状では出来ないようなので、注意が必要です。

Docker for Macのインストールは下記から行います。

Install Docker for Mac

Docker for MacでKubernetesを使用するには、起動後に[Preference]からKubernetesを有効化する必要があります。

Docker for MacでKubernetesを有効化

Docker for MacでKubernetesを有効化

Kubernetesの展開には5分ほどかかります。

Kubernetesの展開

Kubernetesの展開

Minikubeなども利用している場合にはcontextが混在しているため、切り替えを行って下さい。以降はkubectlでクラスタを操作することが可能です。

リスト7:kubectlでの操作が可能に

$ kubectl config use-context docker-for-desktop

kubectl上ではDockerホストがnodeとして認識されています。

リスト8:kubectlからはDockerホストはnodeして認識されている

$ kubectl get nodes
NAME                 STATUS    ROLES     AGE       VERSION
docker-for-desktop   Ready     master    12m       v1.8.2

また、Kubernetes関連のコンポーネントがコンテナとして起動されています。

リスト9:Kubernetes関連のコンポーネントはコンテナとして起動

$ docker ps --format 'table {{.Image}}\t{{.Command}}' | grep -v pause
IMAGE                                                    COMMAND
docker/kube-compose-controller                           "/compose-controller…"
gcr.io/google_containers/k8s-dns-sidecar-amd64           "/sidecar --v=2 --lo…"
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64     "/dnsmasq-nanny -v=2…"
gcr.io/google_containers/k8s-dns-kube-dns-amd64          "/kube-dns --domain=…"
gcr.io/google_containers/kube-proxy-amd64                "/usr/local/bin/kube…"
gcr.io/google_containers/kube-scheduler-amd64            "kube-scheduler --ad…"
gcr.io/google_containers/etcd-amd64                      "etcd --listen-clien…"
gcr.io/google_containers/kube-controller-manager-amd64   "kube-controller-man…"
gcr.io/google_containers/kube-apiserver-amd64            "kube-apiserver --ad…"

Kubernetes構築ツール

次に紹介するのは、構築ツールを使ってマシン上にKubernetesをセットアップしていく方法です。いずれの場合も複数ノードのKubernetesクラスタを構築することが可能です。

kubeadm

kubeadmはKubernetesが公式に提供している構築ツールです。現状はベータリリースとなっており、2018年にGA予定となっています。一部動かないバージョンなどもありますが、基本的には動作は良好です。

今回はUbuntu 16.04をベースに説明します。まず、事前準備として全ノードでDockerやCLIを含む関連パッケージのインストールと、クラスタ内で利用するオーバーレイネットワーク用にカーネルパラメータを変更しておきます(以下の例では、必要に応じてsudoを補完してください)。

リスト10:kubeadmを利用するための準備

apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet=1.8.5-00 kubeadm=1.8.5-00 kubectl=1.8.5-00 docker.io
sysctl net.bridge.bridge-nf-call-iptables=1

次に、Kubernetes Masterとなるノードで下記を実行します。「--pod-network-cidr」は、クラスタ内ネットワーク(Podネットワーク)用にFlannelを利用するための設定です。

リスト11:Masterとなるノードで必要な設定

$ kubeadm init --pod-network-cidr=10.244.0.0/16
...
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
  kubeadm join --token 69e02a.b5cfe76e3394b3d3 10.240.0.7:6443 --discovery-token-ca-cert-hash sha256:e1f762f2534ae11dcb174a3f9b4495888103dbd65f3e7bcdc5252b0d9b27cd15

Masterの構築処理を実行するとKubernetes Nodeで実行するべきコマンドが出力されるため、そのコマンドを2台目以降のNode上で実行します。複数台追加する場合は、下記のkubeadm joinを複数回行って下さい。

リスト12:2台目以降のノードで必要な設定

$ kubeadm join --token 69e02a.b5cfe76e3394b3d3 10.240.0.7:6443 --discovery-token-ca-cert-hash sha256:e1f762f2534ae11dcb174a3f9b4495888103dbd65f3e7bcdc5252b0d9b27cd15

また、kubectlで使う認証ファイルも、下記のように表示されたコマンドを入力するだけで準備出来ます。

リスト13:認証ファイルの準備

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

最後に クラスタ内ネットワーク(Pod ネットワーク)用のFlannelデーモンのコンテナを起動することで、準備が完了します。

リスト14:Flannelデーモンを含むコンテナの起動

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

また、今回はクラスタ内ネットワーク(Pod ネットワーク)にはオーバーレイネットワークを展開するFlannelを選択しましたが、他にもいくつかの選択肢があります。詳しくは下記を参考にして下さい。

Installing a pod network

Rancher

Rancherは、Rancher Labs社が主体となって開発を行っているオープンソースのコンテナプラットフォームです。バージョン1.0ではKubernetesもサポートするような形でしたが、バージョン2.0からはKubernetesをメインにした形で開発しています。なお執筆時点では、Rancher 2.0はTechnical Previewとなっているため注意して下さい。

Rancher 2.0の特徴としては、下記のような機能があります。Kubernetesの知見が少ない場合には理解の手助けになるかと思います。

  • Kubernetesクラスタを様々なプラットフォームに展開可能(AWS、OpenStack、VMware etc.)
  • 既存のKubernetesクラスタをRancher管理にすることが可能
  • 中央集権的な認証、モニタリングおよびWebUIなどの機能の提供
  • 豊富なアプリケーションカタログ

Rancher自体は、中央集権サーバとしてRancher Serverを起動することで利用可能です。

リスト15:Rancher Serverの起動

docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:v2.0.0-alpha10

このRancher Serverから各Kubernetesクラスタの管理やクラウドプロバイダ連携などを行う形となります。プロダクションで利用する場合には、冗長化された外部のDatabaseの利用や、Rancher ServerのHA構成を検討して下さい。

Rancherのインターフェイス

Rancherのインターフェイス

その他の構築ツール

この他にも紹介しきれないほどの構築ツールが存在します。有名なものをいくつか挙げるなら、Rancherに類似した製品としてCoreOS社が開発しているTechtonic、Ansibleを使ったKubespray、TerraformやCloudFormation形式のファイルが出力可能なkops、OpenStack Heatを使ったOpenStack Magnumなどがあります。

パブリッククラウド上のマネージドKubernetes

3つ目はマネージドKubernetesを利用する方法です。パブリッククラウド上のKubernetesでは、永続化ボリュームとの連携やロードバランサとの連携などの機能を簡単にフル活用することが可能です。

GKE(Google Kubernetes Engine)

GKEのロゴ

GKEのロゴ

GKEでは、マネージドならではと言える数多くの便利な機能が利用可能です。例えば、ノードの自動アップデートや自動修復といった機能が用意されているため、簡単にクラスタのバージョンアップを行うことが可能です。また、GCE(Google Compute Engine)のプリエンプティブノードを使ったクラスタ構築が可能なため、コスト削減にもつながります。コンテナを利用しているため、Kubernetesノードが再作成されたとしてもサービス影響がないように設計することが可能です。

GKE ではGCP(Google Cloud Platform)の機能とインテグレーションが行われています。例えば、Stackdriverロギング連携では、デフォルトでコンテナから出力されるログを集めるようになっています。他にも高性能なHTTP LoadBalancer(Ingress)を利用出来るのも利点の一つです。

もう一つGKEで肝心なコンセプトに、NodePoolと呼ばれる機能があります。NodePoolは、Kubernetesクラスタ内のノードに対してラベル付けを行っておくことで、グルーピングをするような機能です。例えば、「vCPU数の多いノード」「メモリ容量の多いノード」のようにマシンタイプが異なるノードをクラスタに混在させて展開し、コンテナのスケジューリング時に考慮させることが可能です。また、特別スケジューリングの指定を行わない場合には、自動的にいずれかのノードに展開します。他にもノードをグルーピングしておくことで、ワークロードの混在を防ぐことや、どういった種類のノードをどれくらいの数でクラスタを構成するかの制御も可能です。

GKEでのNodePoolのイメージ

GKEでのNodePoolのイメージ

GKEでクラスタを構築するには、GUIで構築するかgcloudコマンドを使用します。

リスト16:gcloudコマンドでクラスタを構築

$ gcloud container clusters create example-cluster

構築したKubernetesクラスタへの認証情報もgcloudコマンドを使用することで、~/.kube/configに保存されます。

リスト17:認証情報の保存

$ gcloud container clusters get-credentials example-cluster

より詳細な情報は下記を確認して下さい。

Google Kubernetes Engine

今回の連載でもGKEをベースに説明を行いたいと思います。ですが、ほとんどの説明は他のKubernetes環境でも適用可能です。

AKS(Azure Container Service)

AKSのロゴ

AKSのロゴ

AKSもKubernetesの自動アップデートなどが利用可能なマネージドKubernetesです。AKSは執筆時点ではパブリックプレビュー段階のため、今後、仕様や機能が進化していくことでしょう。また、現段階ではプレビュー機能の有効化をする必要があります。GA後は、下記の手順は不要になります。

リスト18:現時点では手動でプレビュー機能の有効化が必要

$ az provider register -n Microsoft.ContainerService

プレビューの有効後は、リソースグループとAKSクラスタを作成出来るようになります。

リスト19:リソースグループとAKSクラスタの作成

$ az group create --name myResourceGroup --location eastus
$ az aks create --resource-group myResourceGroup --name myK8sCluster --node-count 1 --generate-ssh-keys

AKSでもGKEと同様に、Kubernetesクラスタへの認証情報を取得するコマンドが用意されています。

リスト20:AKSで認証情報を取得

$ az aks get-credentials --resource-group myResourceGroup --name myK8sCluster

より詳細な情報は下記を確認して下さい。

Azure Container Service

EKS(Elastic Container Service for Kubernetes)

EKSのロゴ

EKSのロゴ

EKSは、AWS re:Invent 2017で発表されたAWS上のマネージドKubernetesです。

IAM(Identity and Access Management)とKubernetesのユーザを紐付ける機能や、AWS VPCを使ったコンテナに疎通可能なネットワーク構成、AWS CloudTrailを使ったログ記録などが利用可能になる予定です。ノードのデプロイに関してはEKSで行うわけではなく、特定のAMIイメージを使ってEC2などで展開する方法のようです。また、AMIイメージに関しては、オリジナルのものが作れるような仕組みも提供されるようです。

現状では、まだPreview開始前の段階であるため、上記の仕様などは変更される可能性があることに注意して下さい。

より詳細な情報は下記を確認して下さい。

Amazon EKS

まとめ

今回はKubernetes環境の選択肢について説明しました。実際に使っていく場合には、環境ごとに多少の違いがあるため、可能な限りdevelopment/staging/productionは同じ環境で揃えるようにしましょう。次回からは、実際に用意したKubernetesを使って、コンセプトや使用方法の説明を行っていきます。

株式会社サイバーエージェント アドテク本部 Strategic Infrastructure Agency

2016年入社。OpenStackを使ったプライベートクラウドやGKE互換なコンテナプラットフォームをゼロから構築し、国内カンファレンスでのKeynoteに登壇。
その後、世界で2番目にCertified Kubernetes Application Developer、138番目にCertified Kubernetes Administratorの認定資格を取得。
現在はKubernetesやOpenStackなどOSSへのコントリビュート活動をはじめ、CNCF公式のCloud Native Meetup TokyoのOrganizerやJapan Container Daysの運営などコミュニティ活動にも従事している。

連載バックナンバー

仮想化/コンテナ技術解説
第9回

KubernetesのConfig&Storageリソース(その2)

2018/6/6
連載9回目となる今回は、Config&Storageリソースのうち、PersistentVolumeClaimについて解説する。
仮想化/コンテナ技術解説
第8回

KubernetesのConfig&Storageリソース(その1)

2018/5/31
今回と次回の2回に渡って、5種類に大別されるKubernetesのリソースのうち、Config&Storageリソースを解説する。
仮想化/コンテナ技術解説
第7回

KubernetesのDiscovery&LBリソース(その2)

2018/5/16
前回に引き続き、Discovery&LBリソースのServiceとIngressを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています