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
手元でKubernetesを動作させる場合に、ほとんどの方がMinikubeを選択しているかと思います。Minikubeの動作にはデフォルトでVirtualBoxが必要なため、事前にインストールしておく必要があります。特にバージョンを気にしない場合にはHomebrewなどのパッケージマネージャーでインストールすることも可能ですし、インストーラなど別の手段でも問題ありません。その他にxhyveやVMware Fusionなども利用可能です。
$ brew update $ brew install kubectl $ brew cask install virtualbox
Minikube自体はbrewでのインストールかバイナリのダウンロードを行って下さい。
$ brew install minikube
または
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 $ chmod 755 minikube
事前準備が整った後はMinikubeを起動します。バージョンの指定がある場合には--kubernetes-versionオプションを指定して下さい。
$ 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のクラスタを操作することが可能です。
$ minikube status minikube: Running cluster: Running kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100
また、不要になった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のインストールは下記から行います。
Docker for MacでKubernetesを使用するには、起動後に[Preference]からKubernetesを有効化する必要があります。
Kubernetesの展開には5分ほどかかります。
Minikubeなども利用している場合にはcontextが混在しているため、切り替えを行って下さい。以降はkubectlでクラスタを操作することが可能です。
$ kubectl config use-context docker-for-desktop
kubectl上ではDockerホストがnodeとして認識されています。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION docker-for-desktop Ready master 12m v1.8.2
また、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を補完してください)。
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を利用するための設定です。
$ 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を複数回行って下さい。
$ kubeadm join --token 69e02a.b5cfe76e3394b3d3 10.240.0.7:6443 --discovery-token-ca-cert-hash sha256:e1f762f2534ae11dcb174a3f9b4495888103dbd65f3e7bcdc5252b0d9b27cd15
また、kubectlで使う認証ファイルも、下記のように表示されたコマンドを入力するだけで準備出来ます。
$ 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デーモンのコンテナを起動することで、準備が完了します。
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
また、今回はクラスタ内ネットワーク(Pod ネットワーク)にはオーバーレイネットワークを展開するFlannelを選択しましたが、他にもいくつかの選択肢があります。詳しくは下記を参考にして下さい。
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を起動することで利用可能です。
docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:v2.0.0-alpha10
このRancher Serverから各Kubernetesクラスタの管理やクラウドプロバイダ連携などを行う形となります。プロダクションで利用する場合には、冗長化された外部のDatabaseの利用や、Rancher ServerのHA構成を検討して下さい。
その他の構築ツール
この他にも紹介しきれないほどの構築ツールが存在します。有名なものをいくつか挙げるなら、Rancherに類似した製品としてCoreOS社が開発しているTechtonic、Ansibleを使ったKubespray、TerraformやCloudFormation形式のファイルが出力可能なkops、OpenStack Heatを使ったOpenStack Magnumなどがあります。
パブリッククラウド上のマネージドKubernetes
3つ目はマネージドKubernetesを利用する方法です。パブリッククラウド上のKubernetesでは、永続化ボリュームとの連携やロードバランサとの連携などの機能を簡単にフル活用することが可能です。
GKE(Google Kubernetes Engine)
GKEでは、マネージドならではと言える数多くの便利な機能が利用可能です。例えば、ノードの自動アップデートや自動修復といった機能が用意されているため、簡単にクラスタのバージョンアップを行うことが可能です。また、GCE(Google Compute Engine)のプリエンプティブノードを使ったクラスタ構築が可能なため、コスト削減にもつながります。コンテナを利用しているため、Kubernetesノードが再作成されたとしてもサービス影響がないように設計することが可能です。
GKE ではGCP(Google Cloud Platform)の機能とインテグレーションが行われています。例えば、Stackdriverロギング連携では、デフォルトでコンテナから出力されるログを集めるようになっています。他にも高性能なHTTP LoadBalancer(Ingress)を利用出来るのも利点の一つです。
もう一つGKEで肝心なコンセプトに、NodePoolと呼ばれる機能があります。NodePoolは、Kubernetesクラスタ内のノードに対してラベル付けを行っておくことで、グルーピングをするような機能です。例えば、「vCPU数の多いノード」「メモリ容量の多いノード」のようにマシンタイプが異なるノードをクラスタに混在させて展開し、コンテナのスケジューリング時に考慮させることが可能です。また、特別スケジューリングの指定を行わない場合には、自動的にいずれかのノードに展開します。他にもノードをグルーピングしておくことで、ワークロードの混在を防ぐことや、どういった種類のノードをどれくらいの数でクラスタを構成するかの制御も可能です。
GKEでクラスタを構築するには、GUIで構築するかgcloudコマンドを使用します。
$ gcloud container clusters create example-cluster
構築したKubernetesクラスタへの認証情報もgcloudコマンドを使用することで、~/.kube/configに保存されます。
$ gcloud container clusters get-credentials example-cluster
より詳細な情報は下記を確認して下さい。
今回の連載でもGKEをベースに説明を行いたいと思います。ですが、ほとんどの説明は他のKubernetes環境でも適用可能です。
AKS(Azure Container Service)
AKSもKubernetesの自動アップデートなどが利用可能なマネージドKubernetesです。AKSは執筆時点ではパブリックプレビュー段階のため、今後、仕様や機能が進化していくことでしょう。また、現段階ではプレビュー機能の有効化をする必要があります。GA後は、下記の手順は不要になります。
$ az provider register -n Microsoft.ContainerService
プレビューの有効後は、リソースグループと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クラスタへの認証情報を取得するコマンドが用意されています。
$ az aks get-credentials --resource-group myResourceGroup --name myK8sCluster
より詳細な情報は下記を確認して下さい。
EKS(Elastic Container Service for Kubernetes)
EKSは、AWS re:Invent 2017で発表されたAWS上のマネージドKubernetesです。
IAM(Identity and Access Management)とKubernetesのユーザを紐付ける機能や、AWS VPCを使ったコンテナに疎通可能なネットワーク構成、AWS CloudTrailを使ったログ記録などが利用可能になる予定です。ノードのデプロイに関してはEKSで行うわけではなく、特定のAMIイメージを使ってEC2などで展開する方法のようです。また、AMIイメージに関しては、オリジナルのものが作れるような仕組みも提供されるようです。
現状では、まだPreview開始前の段階であるため、上記の仕様などは変更される可能性があることに注意して下さい。
より詳細な情報は下記を確認して下さい。
まとめ
今回はKubernetes環境の選択肢について説明しました。実際に使っていく場合には、環境ごとに多少の違いがあるため、可能な限りdevelopment/staging/productionは同じ環境で揃えるようにしましょう。次回からは、実際に用意したKubernetesを使って、コンセプトや使用方法の説明を行っていきます。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kubernetes環境を構築して、実際にコンテナを動かしてみよう
- KubernetesのDiscovery&LBリソース(その1)
- Kubernetesの基礎
- Rancherを構成するソフトウェア
- 「kind」でローカル環境にKubernetesクラスターを構築する
- Project CalicoをKubernetesで使ってみる:構築編
- RancherのCatalog機能を詳細に見てみる
- KubernetesのDiscovery&LBリソース(その2)
- Rancherコードリーディング入門(1/3)
- Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)