J'essaye d'installer une entrée dans GCE Kubernetes. Mais lorsque je visite la combinaison adresse IP et chemin définie dans l'Ingress, je reçois toujours l'erreur 502 suivante:
Voici ce que je reçois quand je cours: kubectl describe ing --namespace dpl-staging
Name: dpl-identity
Namespace: dpl-staging
Address: 35.186.221.153
Default backend: default-http-backend:80 (10.0.8.5:8080)
TLS:
dpl-identity terminates
Rules:
Host Path Backends
---- ---- --------
*
/api/identity/* dpl-identity:4000 (<none>)
Annotations:
https-forwarding-rule: k8s-fws-dpl-staging-dpl-identity--5fc40252fadea594
https-target-proxy: k8s-tps-dpl-staging-dpl-identity--5fc40252fadea594
url-map: k8s-um-dpl-staging-dpl-identity--5fc40252fadea594
backends: {"k8s-be-31962--5fc40252fadea594":"HEALTHY","k8s-be-32396--5fc40252fadea594":"UNHEALTHY"}
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
15m 15m 1 {loadbalancer-controller } Normal ADD dpl-staging/dpl-identity
15m 15m 1 {loadbalancer-controller } Normal CREATE ip: 35.186.221.153
15m 6m 4 {loadbalancer-controller } Normal Service no user specified default backend, using system default
Je pense que le problème est dpl-identity:4000 (<none>)
. Est-ce que je ne devrais pas voir l'adresse IP du service dpl-identity
au lieu de <none>
?
Voici la description de mon service: kubectl describe svc --namespace dpl-staging
Name: dpl-identity
Namespace: dpl-staging
Labels: app=dpl-identity
Selector: app=dpl-identity
Type: NodePort
IP: 10.3.254.194
Port: http 4000/TCP
NodePort: http 32396/TCP
Endpoints: 10.0.2.29:8000,10.0.2.30:8000
Session Affinity: None
No events.
De plus, voici le résultat de l'exécution: kubectl describe ep -n dpl-staging dpl-identity
Name: dpl-identity
Namespace: dpl-staging
Labels: app=dpl-identity
Subsets:
Addresses: 10.0.2.29,10.0.2.30
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
http 8000 TCP
No events.
Voici mon deployment.yaml:
apiVersion: v1
kind: Secret
metadata:
namespace: dpl-staging
name: dpl-identity
type: Opaque
data:
tls.key: <base64 key>
tls.crt: <base64 crt>
---
apiVersion: v1
kind: Service
metadata:
namespace: dpl-staging
name: dpl-identity
labels:
app: dpl-identity
spec:
type: NodePort
ports:
- port: 4000
targetPort: 8000
protocol: TCP
name: http
selector:
app: dpl-identity
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: dpl-staging
name: dpl-identity
labels:
app: dpl-identity
annotations:
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- secretName: dpl-identity
rules:
- http:
paths:
- path: /api/identity/*
backend:
serviceName: dpl-identity
servicePort: 4000
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: dpl-staging
name: dpl-identity
kind: Ingress
metadata:
namespace: dpl-staging
name: dpl-identity
labels:
app: dpl-identity
annotations:
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- secretName: dpl-identity
rules:
- http:
paths:
- path: /api/identity/*
backend:
serviceName: dpl-identity
servicePort: 4000
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: dpl-staging
name: dpl-identity
labels:
app: dpl-identity
spec:
replicas: 2
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: dpl-identity
spec:
containers:
- image: gcr.io/munpat-container-engine/dpl/identity:0.4.9
name: dpl-identity
ports:
- containerPort: 8000
name: http
volumeMounts:
- name: dpl-identity
mountPath: /data
volumes:
- name: dpl-identity
secret:
secretName: dpl-identity
Votre backcode k8s-be-32396--5fc40252fadea594
s'affiche sous la forme "UNHEALTHY"
.
Ingress ne fera pas suivre le trafic si le backend est UNHEALTHY, cela entraînera l’erreur 502 que vous voyez.
Il sera marqué comme étant en manque de santé, car il ne réussit pas sa vérification de l'état. Vous pouvez vérifier le paramètre de vérification de l'état de santé pour k8s-be-32396--5fc40252fadea594 pour voir si elles conviennent à votre pod. cela ne renvoie pas une réponse 200. Vous pouvez trouver ces paramètres sous Compute Engine> Health Checks.
S'ils sont corrects, il existe de nombreuses étapes entre votre navigateur et le conteneur susceptibles de transmettre le trafic de manière incorrecte. Vous pouvez essayer kubectl exec -it PODID -- bash
(ou ash si vous utilisez Alpine), puis essayer de courber localhost pour voir si le conteneur répond en tant que Si les contrôles de santé sont également configurés correctement, cela réduirait le problème à votre service, vous pouvez alors essayer de remplacer le service d'un type NodePort par un LoadBalancer et de voir si vous atteignez directement l'adresse IP du service. votre navigateur fonctionne.
J'ai eu le même problème, et il a persisté après avoir activé livenessProbe
ainsi que readinessPorbe
. Il s’agissait à présent de l’authentification de base. J'ai ajouté l'authentification de base à livenessProbe
et à la readinessPorbe
, mais il s'avère que l'équilibreur de charge GCE HTTP (S) ne dispose pas d'une option de configuration pour cela.
Il semble y avoir quelques autres problèmes avec, par exemple: La définition du port de conteneur à 8080 et du port de service à 80 ne fonctionnait pas avec le contrôleur d’entrée GKE (mais je n’indiquerais pas clairement quel était le problème). En gros, il me semble que la visibilité est très réduite et que gérer son propre conteneur d’entrée est une meilleure option en ce qui concerne la visibilité.
J'ai choisi Traefik pour mon projet, cela fonctionnait comme prévu et j'aimerais activer l'intégration de Let's Encrypt. Le seul changement que je devais apporter aux manifestes Traefik consistait à modifier l'objet de service afin de désactiver l'accès à l'interface utilisateur depuis l'extérieur du cluster et d'exposer mon application via un équilibreur de charge externe (GCE TCP LB). En outre, Traefik est plus natif de Kubernetes. J'ai essayé Heptio Contour, mais quelque chose n'a pas fonctionné immédiatement (j'essaierai la prochaine fois que la nouvelle version sortira).
La section "Limitations" de la documentation kubernetes
indique que:
Tous les services Kubernetes doivent servir 200 pages sur '/', ou toute autre valeur personnalisée que vous avez spécifiée via le
--health-check-path argument
de GLBC.
J'avais le même problème. Il s'avère que j'ai dû attendre quelques minutes avant d'entrer pour valider le service. Si quelqu'un suit la même procédure et exécute toutes les étapes telles que readinessProbe
et linvenessProbe
, assurez-vous simplement que votre entrée pointe vers un service qui est soit une NodePort
et attendez quelques minutes que l'icône d'avertissement jaune devienne verte. Consultez également le journal sur StackDriver pour avoir une meilleure idée de ce qui se passe. Ma readinessProbe
et livenessProbe
est sur /login
, pour la classe gce
. Donc, je ne pense pas que cela doit être sur /healthz
.
Issue est en effet un bilan de santé et semblait "aléatoire" pour mes applications dans lesquelles j'ai utilisé des hôtes virtuels basés sur des noms pour inverser les demandes de proxy de l'entrée via des domaines vers deux services principaux distincts. Les deux ont été sécurisés à l'aide de Lets Encrypt et kube-lego
. Ma solution consistait à normaliser le chemin d'accès aux contrôles de l'état pour tous les services partageant une entrée et à déclarer les configs readinessProbe
et livenessProbe
dans mon fichier deployment.yml
.
J'ai rencontré ce problème avec la version du noeud de cluster cloud Google 1.7.8
et j'ai découvert ce problème qui ressemblait beaucoup à ce que j'ai connu: * https://github.com/jetstack/kube-lego/issues/27
J'utilise gce
et kube-lego
et mes vérifications de l'intégrité du service backend étaient sur /
et kube-lego
est sur /healthz
. Il semble que des chemins différents pour les vérifications de l'état physique avec gce ingress
pourraient en être la cause. Il peut donc être intéressant de mettre à jour les services principaux pour qu'ils correspondent au modèle /healthz
afin qu'ils soient tous identiques (ou qu'un commentateur dans le numéro de Github ait déclaré avoir mis à jour kube-lego pour transmettre /
).