Mon cluster Kubernetes s'exécute sous Google Cloud. J'ai un déploiement qui fonctionne avec le port 443 et LoadBalancer l'expose à Internet.
Je l'ai créé de cette manière:
kubectl expose deployment my-app --target-port=443 --port=443 --type=LoadBalancer
Après avoir exécuté cette commande, l'équilibreur de charge pointe vers le déploiement de my-app
. J'ai maintenant créé my-app2
et je souhaite modifier l'équilibreur de charge pour pointer le nouveau déploiement ( my-app2
).
Remarque: Supprimer et recréer le déploiement libère l'adresse IP externe et je souhaite l'éviter.
Comment patcher le service existant pour pointer un autre déploiement sans perdre l'adresse IP externe?
3 Réponses :
Ceci est traité dans le didacticiel pour GKE ici .
Tout d'abord, vous devez réserver une adresse IP statique, afin qu'elle soit réutilisée entre les déploiements.
Vous pouvez le faire dans la console GCP ou via la commande, comme ceci:
gcloud compute addresses create helloweb-ip --region us-central1
Ensuite, vous pouvez trouver l'adresse IP statique qui vous a été attribuée:
Les adresses de calcul gcloud décrivent helloweb-ip --region us-central1
Ensuite, vous devez utiliser cette adresse IP lors de la configuration de votre service LoadBalancer
. Dans les commandes "impératives", vous tapez:
kubectl expose deployment my-app --target-port = 443 --port = 443 --type = LoadBalancer --loadBalancerIP = YOUR.IP .ADDRESS.HERE
Le formulaire "déclaratif" YAML est pratique car la configuration devient plus complexe, il peut également être sauvegardé pour une réutilisation future. Par exemple:
apiVersion: v1 kind: Service metadata: name: helloweb labels: app: hello spec: selector: app: hello tier: web ports: - port: 80 targetPort: 8080 type: LoadBalancer loadBalancerIP: "YOUR.IP.ADDRESS.HERE"
Oui, vous pouvez utiliser un service déjà existant pour pointer un nouveau déploiement.
Tout ce que vous avez à faire, éditez le service YAML avec l'étiquette du service nouvellement déployé.
Supposons que vous ayez récemment déployé les services yaml comme ci-dessous.
selector: app: my-app-2
Il porte le libellé
selector: app: my-app
Si votre service est comme ci-dessous:
kind: Service apiVersion: v1 metadata: name: my-app spec: type: LoadBalancer selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80
il vous suffit de changer la section de sélection du service
template: metadata: labels: app: my-app-2
en
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: my-app-2 spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
Agréable. Et s'il ne s'agit pas d'un nouveau déploiement (existant)?
il vous suffit alors d'ajouter les étiquettes du déploiement existant au sélecteur de service
@ No1Lives4Ever ça aide?
Oui, c'est un type de solution. Je préfère l'autre solution, évoquée ici. Merci pour l'aide!
Enfin, j'ai trouvé la solution:
kubectl patch service old-app -p '{"spec":{"selector":{"app": "new-app"}}}'