Le contrôleur d'entrée Nginx prend en charge trois modes d'accès : accès via les réseaux public et privé, accès via le réseau public uniquement et accès via le réseau privé uniquement. Cette flexibilité répond aux exigences d'accès des clients dans différents environnements réseau.
Fonctionnement
Dans le cluster, l'instance SLB reçoit les requêtes des clients et les transfère au workload du contrôleur d'entrée Nginx. Ce dernier relaie ensuite les requêtes vers d'autres Services.
Configurer Nginx Ingress pour un accès via les réseaux public et privé
Déployez deux Services pour les pods backend du contrôleur d'entrée Nginx : l'un associé à une instance SLB publique et l'autre à une instance SLB privée. Cette configuration permet de prendre en charge l'accès via les réseaux public et privé.
-
Vérifiez le type de réseau SLB actuel.
kubectl describe service -n kube-system nginx-ingress-lb | grep "service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"Si la sortie contient
intranet, le type actuel est privé. Sinon, il s'agit d'un type public. -
Créez un nouveau Service afin de garantir la présence des deux types de réseau (public et privé).
Créez et enregistrez un fichier nommé
nginx-ingress-lb-new.yaml. Exécutezkubectl apply -f nginx-ingress-lb-new.yamlpour créer le Service.Ajouter un Service de réseau privé
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-intranet namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # Specifies that the SLB instance uses a private network address. spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxAjouter un Service de réseau public
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-internet namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx -
Remplacez
<service-name>par le nom de votre nouveau Service dans la commande suivante, puis exécutez-la. Si elle renvoie200, le nouveau Service fonctionne correctement.curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}') -
Remplacez
<service-name>par le nom de votre nouveau Service, puis exécutezkubectl get service <service-name>. Notez l'adresse IP externe du Service et configurez le DNS en fonction du type de Service :Nouveau Service de réseau privé
Connectez-vous à la console Alibaba Cloud DNS – Private DNS. Dans l'onglet , cliquez sur Add Zone. Si vous avez déjà ajouté le domaine, passez à l'étape c.
Dans le champ Authoritative Zone, saisissez votre nom de domaine. Conservez les autres options par défaut et cliquez sur OK.
-
Cliquez sur le domaine cible. Dans l'onglet Settings, cliquez sur Add Record. Remplissez le formulaire en utilisant les valeurs indiquées dans le tableau ci-dessous. Conservez les autres paramètres par défaut et cliquez sur OK.
Configuration item
Value
Record Type
A
Hostname
Saisissez un préfixe de sous-domaine selon vos besoins.
Record Value
L'adresse IP du nouveau Service.
Revenez à la liste User Defined Zones. Dans la colonne Actions correspondant à votre domaine cible, sélectionnez Effective Scope. Sous Effective in VPCs, sélectionnez le VPC où réside votre cluster ACK. Cliquez ensuite sur OK.
Nouveau Service de réseau public
Connectez-vous à la console Alibaba Cloud DNS – Public Authoritative DNS. Cliquez sur votre domaine cible pour ouvrir la page Settings. Cliquez sur le bouton Add Record.
-
Remplissez le formulaire en utilisant les valeurs indiquées dans le tableau ci-dessous. Conservez les autres paramètres par défaut et cliquez sur OK.
Configuration item
Value
Record Type
A.
Hostname
Saisissez un préfixe de sous-domaine selon vos besoins.
Record Value
L'adresse IP du nouveau Service.
Modifier le type de réseau
Cette opération supprime et recrée le Service pour remplacer l'instance SLB. Elle entraîne une interruption temporaire du service Nginx Ingress. L'instance SLB supprimée et son adresse IP ne peuvent pas être récupérées.
-
Assurez-vous que l'instance SLB existante ne reçoit aucun trafic :
Connectez-vous à la Container Service Management Console. Cliquez sur votre cluster cible. Dans le volet de navigation de gauche, accédez à . Recherchez
nginx-ingress-lbdans le namespacekube-system. Notez son adresse External IP.Connectez-vous à la console Classic Load Balancer console. Sélectionnez la même région que celle de votre cluster. Recherchez l'instance CLB dont l'IP Address correspond à l'adresse IP notée à l'étape précédente. Cliquez sur l'instance. Dans l'onglet Monitoring, vérifiez que le nombre de connexions est égal à 0 avant de poursuivre.
-
Supprimez le Service actuellement utilisé par le contrôleur d'entrée Nginx.
kubectl delete svc -n kube-system nginx-ingress-lb -
Créez et enregistrez un fichier nommé
nginx-ingress-lb.yaml. Exécutez ensuitekubectl apply -f nginx-ingress-lb.yamlpour créer le Service.ImportantLe nom du nouveau Service doit être
nginx-ingress-lb.Service de réseau privé
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # Specifies that the SLB instance uses a private network address. spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginxService de réseau public
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx -
Testez le nouveau Service. S'il renvoie
200, le Service fonctionne correctement.curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}') -
Exécutez
kubectl get service nginx-ingress-lb. Notez l'adresse IP externe du Service et configurez le DNS en fonction du type de Service :Nouveau Service de réseau privé
Connectez-vous à la console Alibaba Cloud DNS – Private DNS. Dans l'onglet , cliquez sur Add Zone. Si vous avez déjà ajouté le domaine, passez à l'étape c.
Dans le champ Authoritative Zone, saisissez votre nom de domaine. Conservez les autres options par défaut et cliquez sur OK.
-
Cliquez sur le domaine cible. Dans l'onglet Settings, cliquez sur Add Record. Remplissez le formulaire en utilisant les valeurs indiquées dans le tableau ci-dessous. Conservez les autres paramètres par défaut et cliquez sur OK.
Configuration item
Value
Record Type
A
Hostname
Saisissez un préfixe de sous-domaine selon vos besoins.
Record Value
L'adresse IP du nouveau Service.
Revenez à la liste User Defined Zones. Dans la colonne Actions correspondant à votre domaine cible, sélectionnez Effective Scope. Sous Effective in VPCs, sélectionnez le VPC où réside votre cluster ACK. Cliquez ensuite sur OK.
Nouveau Service de réseau public
Connectez-vous à la console Alibaba Cloud DNS – Public Authoritative DNS. Cliquez sur votre domaine cible pour ouvrir la page Settings. Cliquez sur le bouton Add Record.
-
Remplissez le formulaire en utilisant les valeurs indiquées dans le tableau ci-dessous. Conservez les autres paramètres par défaut et cliquez sur OK.
Configuration item
Value
Record Type
A.
Hostname
Saisissez un préfixe de sous-domaine selon vos besoins.
Record Value
L'adresse IP du nouveau Service.
FAQ
Pourquoi ne puis-je pas créer un nouveau Service avant de supprimer l'ancien ?
Lors de la modification du type de réseau du contrôleur d'entrée Nginx, vous ne pouvez pas effectuer la transition en créant d'abord un nouveau Service, puis en supprimant l'ancien. Vous devez supprimer l'ancien Service avant de créer le nouveau. Lors des mises à niveau des composants, le workload du contrôleur d'entrée Nginx fait correspondre le Service par son nom par défaut (nginx-ingress-lb). Étant donné que deux Services ne peuvent pas partager le même nom, la création d'un nouveau Service avant la suppression de l'ancien empêche le workload de faire correspondre l'instance SLB correcte, ce qui entraîne l'échec de la mise à niveau.
Pourquoi l'adresse IP utilisée par les clients diffère-t-elle du point de terminaison affiché dans la console ?
Le Endpoint affiché sur la page Ingress de la console correspond à l'adresse IP de l'instance SLB associée au Service nommé nginx-ingress-lb. Lorsque plusieurs Services de type LoadBalancer sont configurés, Nginx Ingress continue de transférer correctement toutes les requêtes. Toutefois, la console n'affiche que l'adresse IP de l'instance SLB liée au Service par défaut. L'adresse IP réelle accessible par les clients dépend de l'instance SLB qu'ils utilisent (ce que vous pouvez vérifier via des tests de résolution DNS). Par conséquent, elle peut différer de l'Endpoint affiché dans la console.
Si vous supprimez nginx-ingress-lb et recréez un Service portant le même nom, vous devez mettre à jour la ressource Ingress pour actualiser le point de terminaison affiché.
Comment revenir en arrière après une modification incorrecte ?
Effectuez ces étapes dans l'ordre dès que possible :
Supprimez le Service nouvellement créé pour éviter les conflits de noms qui empêcheraient le composant de créer le Service par défaut.
Dans la console, désinstallez et réinstallez le composant Nginx Ingress Controller, ce qui créera un nouveau Service par défaut dans le cluster afin de restaurer le point d'entrée Nginx Ingress.
Configurez le DNS pour ajouter la résolution de nom de domaine pour le nouveau Service par défaut (
nginx-ingress-lb), puis testez si le transfert fonctionne correctement.
Références
Pour plus de détails sur la configuration des annotations pour une instance SLB existante, consultez la rubrique Utiliser une instance SLB existante.