Kubernetes クラスタの作成
アップストリームの Kubernetes クラスタを作成するには、この例の手順を使用します。
この例の手順は情報提供を目的として提供します。クラスターを作成する方法は複数あります。この例では kubespray を使用します。
手順を簡単に進めるために、別のインストーラマシンを使用してインストールを実行し、kubectlやその他のツールを実行します。
クラスターの作成の詳細については、公式の Kubernetes ドキュメント(https://kubernetes.io/docs/home/)を参照してください。
以下のコマンドラインの例では、ディレクトリパスは表示しません。ディレクトリ構造内にこれらのコマンドを適用するのはお客様に任せておきます。
開始する前に、クラスター ノードに使用する予定のサーバーまたは VM が起動していることを確認してください。
- インストーラマシンに新しいOSをインストールし、以下の目的でOSを最小限に設定します。
- 静的 IP アドレスとマスク(単一クラスターの場合は 172.16.0.10/24 など)とゲートウェイ
- 1つ以上のDNSサーバーへのアクセス
- root SSHアクセスを含むSSH接続
- Ntp
- ローカルコンピューターから、SSHをrootユーザーとしてインストーラマシンに入ります。
- kubectl をインストールします。この例では、インストーラマシンでkubectlを実行しています。他のマシン(ローカルコンピュータなど)でkubectlを実行する場合は、そのマシンに代わりにkubectlをダウンロードしてインストールしてください。
- これにより、kubectl バージョン 1.24.3 がダウンロードされます。
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.24.3/bin/linux/amd64/kubectl
- ファイル実行可能ファイルを作成し、パス内のディレクトリ(/usr/local/bin など)に移動します。
chmod +x kubectl
sudo mv kubectl /usr/local/bin
- これにより、kubectl バージョン 1.24.3 がダウンロードされます。
- 実行中の Python バージョンの Python 仮想環境をインストールします。この例では Python 3.8を実行しています
python3 --version
apt install -y python3.8-venv
- Contrail Analytics をインストールする場合は、Helm 3.0 以降をインストールします。
Helmのインストール方法については、 https://helm.sh/docs/intro/install/ を参照してください。
- インストーラマシンからコントロールプレーンとワーカーノードへのSSHパスワードレスルートアクセスを設定します。これにより、後でプレイブックを実行するときに、これらのノードにansibleがログインできるようになります。
- SSHキーを作成します。
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 ディレクトリを複製します。この例では リリース2.20のクローン作成をしています
例えば:
git clone https://github.com/kubernetes-sigs/kubespray -b release-2.20
- このバージョンの kubespray を実行するために必要なパッケージをインストールします。必要なパッケージは kubespray/requirements.txt に記載されています。Python 仮想環境にこれらのパッケージをインストールします。
- 仮想環境を設定します。
cd kubespray
python3 -m venv env
source env/bin/activate
- 仮想環境内に必要なパッケージをインストールします。
pip3 install -r requirements.txt
メモ:クラスタがセットアップされるまで、この仮想環境で以降の手順を実行します。この仮想環境では、このバージョンの kubespray に対して正しいバージョンの ansible が実行されていることを確認します。
- 仮想環境を設定します。
- 必要に応じて、ポッドとサービスサブネットを設定します。
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
メモ:マルチクラスターCN2セットアップを作成する場合、各クラスターに異なるポッドとサービスサブネットを設定する必要があります。これらのサブネットは、マルチクラスター内で一意にする必要があります。
このドキュメントのマルチクラスターの例に従う場合は、中央クラスタのサブネットをデフォルトのままにし、ワークロードクラスター上のサブネットを以下のように設定します。
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
- クラスターで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 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 kube_version: v1.24.3 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
設定されます。メモ:マルチクラスターCN2セットアップを作成する場合、マルチクラスター内の各ノードに異なるノード名を設定する必要があります。ノード名は、マルチクラスター全体で一意である必要があります。
メモ:DPDK を実行している場合は、 を設定します
kube_network_plugin_multus: true
。別のコンテナー ランタイムで実行する場合は、上記の値を変更します
container_manager
。が に設定されていることを確認
enable_nodelocaldns
しますfalse
。コントロール プレーンとワーカー ノードの数が異なる場合は、それに応じてインベントリを調整します。
- inventory.yaml ファイルの内容に基づいて、ansible がコントロール プレーンとワーカー ノードに SSH で接続できることを確認します。この例では、inventory.yaml ファイルは ~/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 を参照するには、以下のコマンドを調整します。
ansible-playbook -i inventory.yaml cluster.yml
このステップの完了には、クラスターのサイズに応じて 1 時間以上かかります。メモ:CNIをまだ設定していないため、ネットワークとCNIの警告やエラーを安全に無視することができます。
- 必要に応じて、Python 仮想環境を無効化します。Ansibleの運用は終了しましたので、仮想環境はもう必要ありません。
deactivate
- クラスターのセキュア トークンをデフォルトの ~/.kube/config の場所にコピーします。CN2ツールが動作するためには、kubeconfigがデフォルトの場所にある必要があります。
inventory.yaml ファイルから安全なトークンの場所を見つけることができます。この例でインベントリファイルを使用する場合、トークンは /tmp/myclusterにあります。
mkdir ~/.kube
cp /tmp/mycluster/admin.conf ~/.kube/config
メモ:既存のクラスタのトークンを既に保持しているkuberconfigがある場合は、 ~/.kube/config ファイルを上書きするのではなく、マージする必要があります。
- 標準の kubectl コマンドを使用して、クラスタの健全性を確認します。
- ノードのステータスを表示します。
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>
- ポッドのステータスを表示します。
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>
- ノードのステータスを表示します。