vSphere に Kubernetes クラスタを構築してみる。(Kubernetes Anywhere)



  • vSphere 6.7 に Kubernetes クラスタを構築してみます。

    今回のクラスタは、うちでの勉強のために作成するので

    「Kubernetes Anywhere」を利用しています。

    GitHub - kubernetes/kubernetes-anywhere: {concise,reliable,cross-platform} turnup of Kubernetes clusters

     

    今回の環境。

    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

     

    ファイルへの直接リンクは下記です。

    https://storage.googleapis.com/kubernetes-anywhere-for-vsphere-cna-storage/KubernetesAnywhereTemplatePhotonOS.ova

     

    デプロイ時のデフォルトの 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 はラボにあるユーザを指定。
      [email protected] などでもよい)
    • データストアでは 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       1m        v1.9.7

    kubernetes-node1    Ready                          1m        v1.9.7

    kubernetes-node2    Ready                          1m        v1.9.7

    kubernetes-node3    Ready                          1m        v1.9.7

    kubernetes-node4    Ready                          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 をデプロイしてみる話でした。



    https://communities.vmware.com/people/gowatana/blog/2018/08/25/k8s-anywhere

Log in to reply
 

© Lightnetics 2024