vSphere 6.7 に Kubernetes クラスタを構築してみます。
今回のクラスタは、うちでの勉強のために作成するので
「Kubernetes Anywhere」を利用しています。
今回の環境。
Kubernetes クラスタを展開する環境のソフトウェア構成は下記です。
- vSphere 6.7(vCenter 6.7 / ESXi 6.7。vSphere の DRS クラスタ構成ずみ)
- Kubernetes v1.9.7(Kubernetes Anywhere でデプロイ)
- vSAN 6.7(Kubernetes VM のデータストアとして利用)
- NSX for vSphere 6.4.1(NSX Edge の DHCP サービスと論理スイッチを利用)
Kubernetes Anywhere で、Docker コンテナを利用した Kubernetes クラスタのデプロイをします。
実行する Docker ホストのソフトウェア構成は下記です。
- VMware Photon OS 2.0
- Docker 17.06.0-ce
Kubernetes Anywhere 用の OVA のデプロイ。
Kubernetes Anywhere on vSphere むけの Photon OS の OVA ファイル
「KubernetesAnywhereTemplatePhotonOS.ova」が、下記で提供されています。
kubernetes-anywhere/README.md at master · kubernetes/kubernetes-anywhere · GitHub
ファイルへの直接リンクは下記です。
デプロイ時のデフォルトの VM 名は長いので、今回は
03-Template という VM フォルダを作成し、その直下に
k8s-anywhere-ova という名前でデプロイしています。
DHCP によるアドレス取得の都合により、
この OVA はデプロイ後にパワーオンしないようにしておきます。
Kubernetes Anywhere の Docker ホストの準備。
Docker Host の Photon OS は、OVA 版を利用しています。
まず、下記から Photon OS 2.0 GA の OVA をダウンロードして、ESXi にデプロイします。
Photon OS 2.0 GA Binaries
OVA with virtual hardware v13 (ESX 6.5 and above)
Downloading Photon OS · vmware/photon Wiki · GitHub
root / changeme でログインして初期パスワードを変更します。
tdnf コマンドで RPM パッケージをアップデートしたうえで、OS を再起動しておきます。
root@photon-machine [ ~ ]# cat /etc/photon-release
VMware Photon OS 2.0
PHOTON_BUILD_NUMBER=304b817
root@photon-machine [ ~ ]# tdnf update -y
root@photon-machine [ ~ ]# reboot
Docker はあらかじめインストールされているので、
サービスを有効化 / 起動します。
root@photon-machine [ ~ ]# systemctl enable docker
root@photon-machine [ ~ ]# systemctl start docker
Kubernetes Anywhere コンテナのダウンロード~起動。
kubernetes-anywhere のコンテナイメージをダウンロードします。
root@photon-machine [ ~ ]# docker pull cnastorage/kubernetes-anywhere:v2
コンテナを起動します。
今回は、Docker ホストのカレントディレクトリ直下の tmp ディレクトリを、
コンテナの /tmp に割り当てています。
起動してそのままコンテナの中に入っているため
プロンプトが「[container]:/opt/kubernetes-anywhere>」になります。
root@photon-machine [ ~ ]# mkdir tmp
root@photon-machine [ ~ ]# docker run -it -v `pwd`/tmp:/tmp --rm --env="PS1=[container]:\w> " --net=host cnastorage/kubernetes-anywhere:v2 /bin/bash
[container]:/opt/kubernetes-anywhere>
Kubernetes をデプロイするためのコンフィグを作成します。
[container]:/opt/kubernetes-anywhere> make config
今回は、下記のように実行しました。
赤字部分が入力部分です。
パラメータを入力した直後には Enter キーも押していますが、
ただ Enter キーを押した個所はわかりにくいため「 Enterキー」と記載しています。
できるだけデフォルト値を採用していますが、
じつは今回は Blockchain on Kubernetes(BoK)検証むけの
Kubernetes クラスタを作成しようとしているため一部の設定値は BoK むけに調整しています。
- CPU、メモリを増加。
- Kubernetes のバージョンは BoK のガイドにある v1.9.7 に決め打ち。
- 同様に phase2.installer_container もガイドにあるイメージを指定。
このラボ環境むけのパラメータ指定もあります。
- phase1.vSphere.username はラボにあるユーザを指定。
(administrator@vsphere.local などでもよい) - データストアでは vSAN データストア(vsanDatastore)を指定。
- vSphere のクラスタで DRS を有効化し、リソースプール(kube-pool-01)を事前作成してある。
- VM フォルダ(02-Lab/lab-k8s-01)を指定しているが、これらは事前作成してある。
02-Lab/lab-k8s-01 は、VM フォルダを2階層にしている。 - ポートグループ(vxw-dvs-30-virtualwire-14-sid-10003-ls-lab-k8s-003)は、NSX 論理スイッチのバッキングとなっている分散ポートグループを指定。
この論理スイッチでは、NSX Edge の DHCP サービスを利用して、インターネット接続できるようネットワーク設定をしている。
(DHCP は Kubernetes Anywhere のデプロイで必要) - Kubernetes ノードのテンプレートになる VM は配置している VM フォルダも併せて指定(03-Template/k8s-anywhere-ova)。
[container]:/opt/kubernetes-anywhere> make config
CONFIG_="." kconfig-conf Kconfig
*
* Kubernetes Minimal Turnup Configuration
*
*
* Phase 1: Cluster Resource Provisioning
*
number of nodes (phase1.num_nodes) [4] (NEW) Enterキー
kubernetes cluster name (phase1.cluster_name) [kubernetes] (NEW) Enterキー
SSH user to login to OS for provisioning (phase1.ssh_user) [] (NEW) Enterキー
*
* cloud provider: gce, azure or vsphere
*
cloud provider: gce, azure or vsphere (phase1.cloud_provider) [vsphere] (NEW) Enterキー
*
* vSphere configuration
*
vCenter URL Ex: 10.192.10.30 or myvcenter.io (without https://) (phase1.vSphere.url) [] (NEW) infra-vc-01.go-lab.jp
vCenter port (phase1.vSphere.port) [443] (NEW) Enterキー
vCenter username (phase1.vSphere.username) [] (NEW) gowatana
vCenter password (phase1.vSphere.password) [] (NEW) パスワード
Does host use self-signed cert (phase1.vSphere.insecure) [Y/n/?] (NEW) Enterキー
Datacenter (phase1.vSphere.datacenter) [datacenter] (NEW) infra-dc-01
Datastore (phase1.vSphere.datastore) [datastore] (NEW) vsanDatastore
Deploy Kubernetes Cluster on 'host' or 'cluster' (phase1.vSphere.placement) [cluster] (NEW) Enterキー
vsphere cluster name. Please make sure that all the hosts in the cluster are time-synchronized otherwise some of the nodes can remain in pending state for ever due to expired certificate (phase1.vSphere.cluster) [] (NEW) infra-cluster-01
Do you want to use the existing resource pool on the host or cluster? [yes, no] (phase1.vSphere.useresourcepool) [no] (NEW) yes
Name of the existing Resource Pool. If Resource pool is enclosed within another Resource pool, specify pool hierarchy as ParentResourcePool/ChildResourcePool (phase1.vSphere.resourcepool) [] (NEW) kube-pool-01
VM Folder name or Path (e.g kubernetes, VMFolder1/dev-cluster, VMFolder1/Test Group1/test-cluster). Folder path will be created if not present (phase1.vSphere.vmfolderpath) [kubernetes] (NEW) 02-Lab/lab-k8s-01
Number of vCPUs for each VM (phase1.vSphere.vcpu) [1] (NEW) 2
Memory for VM (phase1.vSphere.memory) [2048] (NEW) 4096
Network for VM (phase1.vSphere.network) [VM Network] (NEW) vxw-dvs-30-virtualwire-14-sid-10003-ls-lab-k8s-003
Name of the template VM imported from OVA. If Template file is not available at the destination location specify vm path (phase1.vSphere.template) [KubernetesAnywhereTemplatePhotonOS.ova] (NEW) 03-Template/k8s-anywhere-ova
Flannel Network (phase1.vSphere.flannel_net) [172.1.0.0/16] (NEW) Enterキー
*
* Phase 2: Node Bootstrapping
*
kubernetes version (phase2.kubernetes_version) [v1.6.5] (NEW) v1.9.7
bootstrap provider (phase2.provider) [ignition] (NEW) Enterキー
installer container (phase2.installer_container) [docker.io/cnastorage/k8s-ignition:v2] (NEW) docker.io/cnastorage/k8s-ignition:v1.8-dev-release
docker registry (phase2.docker_registry) [gcr.io/google-containers] (NEW) Enterキー
*
* Phase 3: Deploying Addons
*
Run the addon manager? (phase3.run_addons) [Y/n/?] (NEW) Enterキー
Run kube-proxy? (phase3.kube_proxy) [Y/n/?] (NEW) Enterキー
Run the dashboard? (phase3.dashboard) [Y/n/?] (NEW) Enterキー
Run heapster? (phase3.heapster) [Y/n/?] (NEW) Enterキー
Run kube-dns? (phase3.kube_dns) [Y/n/?] (NEW) Enterキー
Run weave-net? (phase3.weave_net) [N/y/?] (NEW) Enterキー
#
# configuration written to .config
#
[container]:/opt/kubernetes-anywhere>
上記の入力により、コンフィグファイル「.config」は下記のように作成されます。
make config を実行せず、下記のファイルを直接作成してもデプロイ可能です。
#
# Automatically generated file; DO NOT EDIT.
# Kubernetes Minimal Turnup Configuration
#
#
# Phase 1: Cluster Resource Provisioning
#
.phase1.num_nodes=4
.phase1.cluster_name="kubernetes"
.phase1.ssh_user=""
.phase1.cloud_provider="vsphere"
#
# vSphere configuration
#
.phase1.vSphere.url="infra-vc-01.go-lab.jp"
.phase1.vSphere.port=443
.phase1.vSphere.username="gowatana"
.phase1.vSphere.password="パスワード"
.phase1.vSphere.insecure=y
.phase1.vSphere.datacenter="infra-dc-01"
.phase1.vSphere.datastore="vsanDatastore"
.phase1.vSphere.placement="cluster"
.phase1.vSphere.cluster="infra-cluster-01"
.phase1.vSphere.useresourcepool="yes"
.phase1.vSphere.resourcepool="kube-pool-01"
.phase1.vSphere.vmfolderpath="02-Lab/lab-k8s-01"
.phase1.vSphere.vcpu=2
.phase1.vSphere.memory=4096
.phase1.vSphere.network="vxw-dvs-30-virtualwire-14-sid-10003-ls-lab-k8s-003"
.phase1.vSphere.template="03-Template/k8s-anywhere-ova"
.phase1.vSphere.flannel_net="172.1.0.0/16"
#
# Phase 2: Node Bootstrapping
#
.phase2.kubernetes_version="v1.9.7"
.phase2.provider="ignition"
.phase2.installer_container="docker.io/cnastorage/k8s-ignition:v1.8-dev-release"
.phase2.docker_registry="gcr.io/google-containers"
#
# Phase 3: Deploying Addons
#
.phase3.run_addons=y
.phase3.kube_proxy=y
.phase3.dashboard=y
.phase3.heapster=y
.phase3.kube_dns=y
# .phase3.weave_net is not set
設定が完了したら、デプロイします。
[container]:/opt/kubernetes-anywhere> make deploy
デプロイが完了したら、kubectl で Kubernetes クラスタの状態を確認します。
環境変数 KUBECONFIG を設定して、クラスタの情報を確認します。
Kubernetes master が起動(running)していることや、Kubernetes ノードの状態が確認できます。
今回は、Worker が 4ノードです。
[container]:/opt/kubernetes-anywhere> export KUBECONFIG=phase1/vsphere/kubernetes/kubeconfig.json
[container]:/opt/kubernetes-anywhere> kubectl cluster-info
Kubernetes master is running at https://10.0.3.121
Heapster is running at https://10.0.3.121/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://10.0.3.121/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[container]:/opt/kubernetes-anywhere> kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready,SchedulingDisabled <none> 1m v1.9.7
kubernetes-node1 Ready <none> 1m v1.9.7
kubernetes-node2 Ready <none> 1m v1.9.7
kubernetes-node3 Ready <none> 1m v1.9.7
kubernetes-node4 Ready <none> 1m v1.9.7
[container]:/opt/kubernetes-anywhere>
kubeconfig.json ファイルはコンテナを停止すると削除されてしまうので、
Docker ホストのディレクトリを割り当てている /tmp にコピーしておきます。
[container]:/opt/kubernetes-anywhere> cp phase1/vsphere/kubernetes/kubeconfig.json /tmp/
これで勉強用 Kubernetes が手ごろに作成できるかなと思います。
以上、vSphere に Kubernetes をデプロイしてみる話でした。