Kubernetes クラスタの作成
アップストリームの Kubernetes クラスタを作成するには、この例の手順を使用します。
この例の手順は情報提供を目的として提供します。クラスターの作成方法には、kubeadm、kOps、kubespray などがあります。
この例では、kubespray と Ansible を使用してクラスターを作成します。Kubespray では Ansible プレイブックを使用しているため、クラスタの作成がかなり簡単になります。手順を簡単に進めるために、別のインストーラマシンを使用してインストールを実行し、kubectlやその他のツールを実行します。
クラスターの作成の詳細については、公式の Kubernetes ドキュメント(https://kubernetes.io/docs/home/)を参照してください。
以下のコマンドラインの例では、必ずしも絶対ディレクトリパスを表示するとは限りません。ディレクトリ構造内にこれらのコマンドを適用するのはお客様に任せておきます。
- インストーラマシンに新しいOSをインストールし、以下の目的でOSを最小限に設定します。
- 静的 IP アドレスとマスク(単一クラスターの場合は 172.16.0.10/24 など)とゲートウェイ
- 1つ以上のDNSサーバーへのアクセス
- root SSHアクセスを含むSSH接続
- Ntp
- ローカルコンピューターからsshをsudoユーザーとしてインストーラマシンに入ります。
- ansible をインストールします。
sudo apt install ansible
- kubectl をインストールします。この例では、インストーラマシンでkubectlを実行しています。他のマシン(ローカルコンピューターなど)でkubectlを実行する場合は、そのマシンに代わりにkubectlをダウンロードしてインストールしてください。
- Kubernetes リポジトリを設定して更新します。
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
- kubectl をインストールします。
sudo apt install kubectl
- Kubernetes リポジトリを設定して更新します。
- Contrail Analytics をインストールする場合は、Helm 3.0 以降をインストールします。
-
Helm リポジトリを設定して更新します。
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
-
Helm をインストールします。
sudo apt install helm
-
- インストーラマシンからコントロールプレーンとワーカーノードへのSSHパスワードレスルートアクセスを設定します。これにより、後でプレイブックを実行するときに、これらのノードにansibleがログインできるようになります。
- SSHキーを作成します。
user@installer:~$ ssh-keygen
この例では、SSHキーをデフォルトの場所 ~/.ssh/id_rsa.pubに保存します。
- キーをコントロール プレーンとワーカー ノードのルート ユーザーにコピーします。例えば:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.11 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.12 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.0.13
- SSHキーを作成します。
- kubespray ディレクトリを複製します。
例えば:
user@installer:~/contrail$ git clone https://github.com/kubernetes-sigs/kubespray -b release-2.16
これにより、現在の場所に kubespray ディレクトリのクローンが作成されます(この例では ~/contrail )。
- 必要に応じて、ポッドとサービスサブネットを設定します。
kubespray が使用するデフォルトのサブネットは、 kubespray/roles/kubespray-defaults/defaults/main.yaml ファイルで定義されています。そのファイルで次のパラメータを探し、それに応じて変更します。
kube_service_addresses: 10.233.0.0/18 kube_pods_subnet: 10.233.64.0/18 kube_service_addresses_ipv6: fd85:ee78:d8a6:8607::1000/116 kube_pods_subnet_ipv6: fd85:ee78:d8a6:8607::1:0000/112
メモ:マルチクラスターContrailセットアップを作成する場合、各クラスターに異なるポッドとサービスサブネットを設定する必要があります。これらのサブネットは、マルチクラスター内で一意にする必要があります。
このドキュメントのマルチクラスターの例に従う場合は、中央クラスタのサブネットをデフォルトのままにし、ワークロードクラスター上のサブネットを以下のように設定します。
kube_service_addresses: 10.234.0.0/18 kube_pods_subnet: 10.234.64.0/18 kube_service_addresses_ipv6: fd85:ee78:d8a6:8608::1000/116 kube_pods_subnet_ipv6: fd85:ee78:d8a6:8608::1:0000/112
- ノードローカルDNSを無効にします。
kubespray/roles/kubespray-defaults/defaults/main.yaml ファイルで、 を設定
enable_nodelocaldns: false
します。 - クラスターでDPDKを実行している場合は、マルチを設定します。
DPDK を実行する場合は、Multus が必要です。
- マルチマルチを有効にします。
kubespray/roles/kubespray-defaults/defaults/main.yaml で、multus を有効にします。
kube_network_plugin_multus: true
- DPDK の実行に必要なバージョンである multus バージョンを 0.3.1 に設定します。バージョンは 2 つのファイルで設定します。
kubespray/roles/network_plugin/multus/defaults/main.ymlで、multusバージョンを設定します。
multus_cni_version: "0.3.1"
kubespray/extra_playbooks/roles/network_plugin/multus/defaults/main.ymlで、multusバージョンを設定します。multus_cni_version: "0.3.1"
- マルチマルチを有効にします。
- 使用するansible用のインベントリファイルを作成します。例えば:
all: hosts: # list all nodes here k8s-cp0: # desired hostname ansible_host: 172.16.0.11 k8s-worker0: ansible_host: 172.16.0.12 k8s-worker1: ansible_host: 172.16.0.13 vars: ansible_user: root artifacts_dir: /tmp/mycluster cluster_name: mycluster.contrail.lan container_manager: crio # container runtime docker_image_repo: <your docker repository URL> download_container: false download_localhost: true download_run_once: true enable_dual_stack_networks: true enable_nodelocaldns: false etcd_deployment_type: host host_key_checking: false kube_network_plugin: cni kube_network_plugin_multus: false kubeconfig_localhost: true kubectl_localhost: true kubelet_deployment_type: host override_system_hostname: true kube-master: hosts: # hostname of control plane node (from hosts section) k8s-cp0: kube-node: hosts: # hostnames of worker nodes (from hosts section) k8s-worker0: k8s-worker1: etcd: hosts: # hostname of control plane node (from hosts section) k8s-cp0: k8s-cluster: children: kube-master: kube-node:
ファイルで指定したホスト名(
k8s-cp0
、k8s-worker0
、k8s-worker1
)は、 パラメーターが に設定されている場合override_system_hostname
、ノードで自動的にtrue
設定されます。メモ:マルチクラスター Contrail セットアップを作成する場合は、マルチクラスター内の各ノードに異なるノード名を設定する必要があります。ノード名は、マルチクラスター全体で一意である必要があります。
メモ:DPDK を実行している場合は、 を設定します
kube_network_plugin_multus: true
。別のコンテナー ランタイムで実行する場合は、上記の値を変更します
container_manager
。が に設定されていることを確認
enable_nodelocaldns
しますfalse
。コントロール プレーンとワーカー ノードの数が異なる場合は、それに応じてインベントリを調整します。
- inventory.yaml ファイルの内容に基づいて、ansible がコントロール プレーンとワーカー ノードに SSH で接続できることを確認します。この例では、inventory.yaml ファイルは ~/contrail ディレクトリにあります。
user@installer:~/contrail$ ansible -i inventory.yaml -m ping all [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details k8s-cp0 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } k8s-worker0 | SUCCESS => {ansi "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } k8s-worker1 | SUCCESS => {ansi "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
- クラスターを作成するには、kubespray ディレクトリからプレイブックを実行します。ディレクトリ構造内の inventory.yaml を参照するには、以下のコマンドを調整します。
user@installer:~/contrail/kubespray$ ansible-playbook -i ../inventory.yaml cluster.yml
このステップの完了には、クラスターのサイズに応じて 1 時間以上かかります。メモ:CNIをまだ設定していないため、ネットワークとCNIの警告やエラーを安全に無視することができます。致命的なエラーが発生した場合、Ansibleはプレイブックを停止します。
- クラスターのセキュア トークンをデフォルトの ~/.kube/config の場所にコピーします。Kubeconfig は、Contrail ツールが動作するためのデフォルトの場所になければなりません。
inventory.yaml ファイルから安全なトークンの場所を見つけることができます。この例でインベントリファイルを使用する場合、トークンは /tmp/myclusterにあります。
mkdir ~/.kube
cp /tmp/mycluster/admin.conf ~/.kube/config
メモ:既存のクラスタのトークンをすでに保持しているkuberconfigがある場合は、 ~/.kube/config ファイルを上書きするのではなく、マージする必要があります。
- 標準の kubectl コマンドを使用して、クラスタの健全性を確認します。
- ノードのステータスを表示します。
user@installer:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-cp0 NotReady control-plane,master 4m57s v1.20.7 k8s-worker0 NotReady <none> 3m17s v1.20.7 k8s-worker1 NotReady <none> 2m45s v1.20.7 user@installer:~$ kubectl describe node k8s-cp0 <trimmed> Conditions: Type Status <trimmed> Reason Message ---- ------ ------ ------- MemoryPressure False KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False KubeletHasSufficientPID kubelet has sufficient PID available Ready False KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network Addresses: <trimmed>
- ポッドのステータスを表示します。
user@installer:~$ kubectl get pods -A -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE <trimmed> kube-system coredns-657959df74-rprzv 0/1 Pending 0 6m44s <none> <none> <none> <none> kube-system dns-autoscaler-b5c786945 0/1 Pending 0 6m40s <none> <none> <none> <none> kube-system kube-apiserver-k8s-cp0 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-controller-manager- 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-proxy-k5mcp 1/1 Running 0 7m28s 172.16.0.13 k8s-worker1 <none> <none> kube-system kube-proxy-sccjm 1/1 Running 0 7m28s 172.16.0.11 k8s-cp0 <none> <none> kube-system kube-proxy-wqbt8 1/1 Running 0 7m28s 172.16.0.12 k8s-worker0 <none> <none> kube-system kube-scheduler-k8s-cp0 1/1 Running 0 9m27s 172.16.0.11 k8s-cp0 <none> <none> kube-system nginx-proxy-k8s-worker0 1/1 Running 0 8m2s 172.16.0.12 k8s-worker0 <none> <none> kube-system nginx-proxy-k8s-worker1 1/1 Running 0 7m30s 172.16.0.13 k8s-worker1 <none> <none>
- ノードのステータスを表示します。