Créer un cluster Kubernetes
Utilisez cet exemple de procédure pour créer un cluster Kubernetes en amont.
Nous fournissons cet exemple de procédure à titre purement informatif. Il existe plusieurs façons de créer un cluster, comme avec kubeadm, kOps ou kubespray, entre autres.
Dans cet exemple, nous allons utiliser kubespray et Ansible pour créer le cluster. Kubespray utilise les playbooks Ansible, ce qui rend la création de clusters assez simple. Pour faciliter le suivi des étapes, nous utiliserons une machine d’installation distincte pour effectuer l’installation et exécuter kubectl et d’autres outils.
Pour plus d’informations sur la création d’un cluster, consultez la documentation officielle de Kubernetes (https://kubernetes.io/docs/home/).
Les exemples de ligne de commande ci-dessous n’affichent pas toujours les chemins d’accès absolus aux répertoires. Nous vous laissons le soin d’appliquer ces commandes au sein de votre structure de répertoires.
- Installez un nouveau système d’exploitation sur la machine d’installation, en configurant le système d’exploitation au minimum pour les éléments suivants :
- adresse IP statique et masque (par exemple, 172.16.0.10/24 pour notre cluster unique) et passerelle
- l’accès à un ou plusieurs serveurs DNS
- Connectivité SSH, y compris l’accès SSH racine
- NTP
- À partir de votre ordinateur local, connectez-vous à la machine d’installation en tant qu’utilisateur sudo.
- Installez ansible.
sudo apt install ansible
- Installez kubectl. Dans cet exemple, nous exécutons kubectl sur la machine d’installation. Si vous souhaitez exécuter kubectl sur une autre machine (par exemple, votre ordinateur local), téléchargez et installez kubectl sur cette machine à la place.
- Configurer et mettre à jour le référentiel 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
- Installez kubectl.
sudo apt install kubectl
- Configurer et mettre à jour le référentiel Kubernetes.
- Si vous souhaitez installer Contrail Analytics, installez Helm 3.0 ou une version ultérieure.
-
Configurer et mettre à jour le référentiel 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
-
Installez Helm.
sudo apt install helm
-
- Configurez l’accès root sans mot de passe SSH de la machine d’installation au plan de contrôle et aux nœuds de travail. Cela permet à ansible de se connecter à ces nœuds lorsque vous exécuterez le playbook ultérieurement.
- Créez une clé SSH.
user@installer:~$ ssh-keygen
Dans cet exemple, nous stockons la clé SSH à son emplacement par défaut ~/.ssh/id_rsa.pub.
- Copiez la clé vers l’utilisateur racine sur le plan de contrôle et les nœuds de travail. Par exemple :
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
- Créez une clé SSH.
- Clonez le répertoire kubespray.
Par exemple :
user@installer:~/contrail$ git clone https://github.com/kubernetes-sigs/kubespray -b release-2.16
Cela crée un clone du répertoire kubespray à l’emplacement actuel (dans ~/contrail dans cet exemple).
- Configurez les sous-réseaux de pod et de service si vous le souhaitez.
Les sous-réseaux par défaut utilisés par kubespray sont définis dans le fichier kubespray/roles/kubespray-defaults/defaults/main.yaml . Recherchez les paramètres suivants dans ce fichier et modifiez-les en conséquence.
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
Note:Si vous créez une configuration Contrail à plusieurs clusters, vous devez configurer des sous-réseaux de pods et de services différents sur chaque cluster. Ces sous-réseaux doivent être uniques au sein de l’ensemble du multicluster.
Si vous suivez l’exemple multicluster de ce document, conservez les valeurs par défaut des sous-réseaux du cluster central et configurez-les comme suit :
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
- Désactivez le DNS local du nœud.
Dans le fichier kubespray/roles/kubespray-defaults/defaults/main.yaml , définissez
enable_nodelocaldns: false
. - Si vous exécutez DPDK dans votre cluster, configurez multus.
Multus est requis lors de l’exécution de DPDK.
- Activez multus.
Dans kubespray/roles/kubespray-defaults/defaults/main.yaml, activez multus :
kube_network_plugin_multus: true
- Définissez la version multus sur 0.3.1, qui est la version requise pour exécuter DPDK. Vous définissez la version dans deux fichiers.
Dans kubespray/roles/network_plugin/multus/defaults/main.yml, configurez la version multus :
multus_cni_version: "0.3.1"
Dans kubespray/extra_playbooks/roles/network_plugin/multus/defaults/main.yml, configurez la version multus :multus_cni_version: "0.3.1"
- Activez multus.
- Créez le fichier d’inventaire à utiliser par ansible. Par exemple :
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:
Les noms d’hôte (, , ) que vous spécifiez dans le fichier sont automatiquement configurés sur le noeud lorsque le
override_system_hostname
paramètre est défini surtrue
.k8s-worker1
k8s-worker0
k8s-cp0
Note:Si vous créez une configuration Contrail multicluster, vous devez configurer des noms de noeud différents pour chaque noeud du multicluster. Les noms de noeud doivent être uniques dans l’ensemble du multicluster.
Note:Si vous utilisez DPDK, définissez
kube_network_plugin_multus: true
.Si vous souhaitez l’exécuter avec un environnement d’exécution de conteneur différent, modifiez la
container_manager
valeur ci-dessus.Assurez-vous
enable_nodelocaldns
que la valeur est .false
Si vous souhaitez exécuter avec un nombre différent de nœuds de plan de contrôle et de travail, ajustez l’inventaire en conséquence.
- Vérifiez qu’ansible peut se connecter en SSH au plan de contrôle et aux nœuds de travail en fonction du contenu du fichier inventory.yaml. Dans cet exemple, le fichier inventory.yaml se trouve dans le répertoire ~/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" }
- Pour créer le cluster, exécutez le playbook à partir du répertoire kubespray. Ajustez la commande ci-dessous pour référencer inventory.yaml dans votre structure de répertoires.
user@installer:~/contrail/kubespray$ ansible-playbook -i ../inventory.yaml cluster.yml
Cette étape peut prendre une heure ou plus, en fonction de la taille de votre cluster.Note:Vous pouvez ignorer en toute sécurité les avertissements et les erreurs liés au réseau et au CNI, car vous n’avez pas encore configuré de CNI. Si une erreur fatale se produit, ansible arrête le playbook.
- Copiez le jeton sécurisé du cluster à l’emplacement par défaut ~/.kube/config. Le kubeconfig doit se trouver à cet emplacement par défaut pour que les outils Contrail fonctionnent.
Vous pouvez trouver l’emplacement du jeton sécurisé à partir du fichier inventory.yaml . Si vous utilisez le fichier inventory dans cet exemple, le jeton se trouve dans /tmp/mycluster.
mkdir ~/.kube
cp /tmp/mycluster/admin.conf ~/.kube/config
Note:Si vous avez un kubeconfig qui contient déjà des jetons pour les clusters existants, vous devrez fusionner plutôt que d’écraser le fichier ~/.kube/config .
- Utilisez les commandes kubectl standard pour vérifier l’intégrité du cluster.
- Afficher l’état des nœuds.
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>
- Afficher l’état des pods.
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>
- Afficher l’état des nœuds.