Cette page explique deux approches différentes pour configurer un Kubernetes à haute disponibilité.
cluster utilisant kubeadm:
- Avec des nœuds de control plane empilés. Cette approche nécessite moins d'infrastructure.
Les membres etcd et les nœuds du control plane sont co-localisés.
- Avec un cluster etcd externe cette approche nécessite plus d'infrastructure.
Les nœuds du control plane et les membres etcd sont séparés.
Avant de poursuivre, vous devez déterminer avec soin quelle approche répond le mieux
aux besoins de vos applications et de l'environnement. [Cette comparaison](/docs/setup/independent/ha-topology/)
décrit les avantages et les inconvénients de chacune.
Vos clusters doivent exécuter Kubernetes version 1.12 ou ultérieure. Vous devriez aussi savoir que
la mise en place de clusters HA avec kubeadm est toujours expérimentale et sera simplifiée davantage
dans les futures versions. Vous pouvez par exemple rencontrer des problèmes lors de la mise à niveau de vos clusters.
Nous vous encourageons à essayer l’une ou l’autre approche et à nous faire part de vos commentaires dans
[Suivi des problèmes Kubeadm](https://github.com/kubernetes/kubeadm/issues/new).
Notez que la fonctionnalité alpha `HighAvailability` est obsolète dans la version 1.12 et supprimée dans la version 1.13
Voir aussi [La documentation de mise à niveau HA](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-13).
{{<caution>}}
Cette page ne traite pas de l'exécution de votre cluster sur un fournisseur de cloud. Dans un
environnement Cloud, les approches documentées ici ne fonctionne ni avec des objets de type
load balancer, ni avec des volumes persistants dynamiques.
{{</caution>}}
{{% /capture %}}
{{% capture prerequisites %}}
Pour les deux méthodes, vous avez besoin de cette infrastructure:
- Trois machines qui répondent aux pré-requis des [exigences de kubeadm](/docs/setup/independent/install-kubeadm/#before-you-begin) pourles maîtres (masters)
- Trois machines qui répondent aux pré-requis des [exigences de kubeadm](/docs/setup/independent/install-kubeadm/#before-you-begin) pour les workers
- Connectivité réseau complète entre toutes les machines du cluster (public ou réseau privé)
- Privilèges sudo sur toutes les machines
- Accès SSH d'une machine à tous les nœuds du cluster
-`kubeadm` et une `kubelet` installés sur toutes les machines. `kubectl` est optionnel.
Pour le cluster etcd externe uniquement, vous avez besoin également de:
- Trois machines supplémentaires pour les membres etcd
{{<note>}}
Les exemples suivants utilisent Calico en tant que fournisseur de réseau de Pod. Si vous utilisez un autre
CNI, pensez à remplacer les valeurs par défaut si nécessaire.
{{</note>}}
{{% /capture %}}
{{% capture steps %}}
## Premières étapes pour les deux méthodes
{{<note>}}
Toutes les commandes d'un control plane ou d'un noeud etcd doivent être
éxecutées en tant que root.
{{</note>}}
- Certains plugins réseau CNI tels que Calico nécessitent un CIDR tel que `192.168.0.0 / 16` et
certains comme Weave n'en ont pas besoin. Voir la
[Documentation du CNI réseau](/docs/setup/independent/create-cluster-kubeadm/#pod-network).
Pour ajouter un CIDR de pod, définissez le champ `podSubnet: 192.168.0.0 / 16` sous
l'objet `networking` de` ClusterConfiguration`.
### Créez un load balancer pour kube-apiserver
{{<note>}}
Il existe de nombreuses configurations pour les équilibreurs de charge (load balancer).
L'exemple suivant n'est qu'un exemple. Vos exigences pour votre cluster peuvent nécessiter une configuration différente.
{{</note>}}
1. Créez un load balancer kube-apiserver avec un nom résolu en DNS.
- Dans un environnement cloud, placez vos nœuds du control plane derrière un load balancer TCP.
Ce load balancer distribue le trafic à tous les nœuds du control plane sains dans sa liste.
La vérification de la bonne santé d'un apiserver est une vérification TCP sur le port que
kube-apiserver écoute (valeur par défaut: `6443`).
- Il n'est pas recommandé d'utiliser une adresse IP directement dans un environnement cloud.
- Le load balancer doit pouvoir communiquer avec tous les nœuds du control plane sur le
port apiserver. Il doit également autoriser le trafic entrant sur son réseau deport d'écoute.
- [HAProxy](http://www.haproxy.org/) peut être utilisé comme load balancer.
- Assurez-vous que l'adresse du load balancer correspond toujours à
l'adresse de `ControlPlaneEndpoint` de kubeadm.
1. Ajoutez les premiers nœuds du control plane au load balancer et testez la connexion:
```sh
nc -v LOAD_BALANCER_IP PORT
```
- Une erreur `connection refused` est attendue car l'apiserver n'est pas encore enfonctionnement.
Cependant, un timeout signifie que le load balancer ne peut pas communiqueravec le nœud du
control plane. Si un timeout survient, reconfigurez le load balancer pour communiquer avec le nœud du control plane.
1. Ajouter les nœuds du control plane restants au groupe cible du load balancer.
### Configurer SSH
SSH est requis si vous souhaitez contrôler tous les nœuds à partir d'une seule machine.
1. Activer ssh-agent sur votre machine ayant accès à tous les autres nœuds du cluster:
```
eval $(ssh-agent)
```
1. Ajoutez votre clé SSH à la session:
```
ssh-add ~/.ssh/path_to_private_key
```
1. SSH entre les nœuds pour vérifier que la connexion fonctionne correctement.
- Lorsque vous faites un SSH sur un noeud, assurez-vous d’ajouter l’option `-A`:
```
ssh -A 10.0.0.7
```
- Lorsque vous utilisez sudo sur n’importe quel nœud, veillez à préserver l’environnement afin que le SSH forwarding fonctionne:
```
sudo -E -s
```
## Control plane empilé et nœuds etcd
### Étapes pour le premier nœud du control plane
1. Sur le premier nœud du control plane, créez un fichier de configuration appelé `kubeadm-config.yaml`:
N'utilisez que les certificats de la liste ci-dessus. kubeadm se chargera de générer le reste des certificats avec les SANs requis pour les instances du control plane qui se joignent.
Si vous copiez tous les certificats par erreur, la création de noeuds supplémentaires pourrait
échouer en raison d'un manque de SANs requis.
{{</caution>}}
### Étapes pour le reste des nœuds du control plane
1. Déplacer les fichiers créés à l'étape précédente où `scp` était utilisé: