Base OS : CentOS (1 master 2 minions)
K8S version : 1.9.5 (deployed using KubeSpray)
Je suis nouveau sur Kubernetes Ingress et je mets en place 2 services différents, chacun accessible avec son propre chemin.
J'ai créé 2 déploiements:
kubectl run nginx --image=nginx --port=80
kubectl run echoserver --image=gcr.io/google_containers/echoserver:1.4 --port=8080
J'ai également créé les services correspondants:
kubectl expose deployment nginx --target-port=80 --type=NodePort
kubectl expose deployment echoserver --target-port=8080 --type=NodePort
Mes svc
sont:
[root@node1 kubernetes]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echoserver NodePort 10.233.48.121 <none> 8080:31250/TCP 47m
nginx NodePort 10.233.44.54 <none> 80:32018/TCP 1h
Mon adresse NodeIP est 172.16.16.2
et je peux accéder aux deux modules à l'aide de
http://172.16.16.2:31250 &
http://172.16.16.2:32018
Maintenant, en plus de cela, je veux déployer une entrée afin que je puisse atteindre les deux pods sans utiliser 2 IP et 2 ports différents MAIS 1 adresse IP avec des chemins différents.
Mon fichier Ingress est donc:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: fanout-nginx-ingress
spec:
rules:
- http:
paths:
- path: /nginx
backend:
serviceName: nginx
servicePort: 80
- path: /echo
backend:
serviceName: echoserver
servicePort: 8080
Cela donne:
[root@node1 kubernetes]# kubectl describe ing fanout-nginx-ingress
Name: fanout-nginx-ingress
Namespace: development
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/nginx nginx:80 (<none>)
/echo echoserver:8080 (<none>)
Annotations:
Events: <none>
Maintenant, quand j'essaie d'accéder aux pods en utilisant l'adresse NodeIP (172.16.16.2), je ne reçois rien.
http://172.16.16.2/echo
http://172.16.16.2/nginx
Y a-t-il quelque chose que j'ai manqué dans mes configurations?
J'ai eu le même problème sur mon installation bare metal - ou plutôt quelque chose de proche (cluster virtuel kubernetes - ensemble de machines virtuelles connectées via Host-Only-Adapter). Voici le lien vers mon kubernetes vlab .
Tout d'abord, assurez-vous que le contrôleur d'entrée est installé. Actuellement, il y a deux contrôleurs d'entrée à essayer contrôleur d'entrée kubernetes nginx et contrôleur d'entrée nginx kubernetes -J'ai installé le premier.
Allez dans instructions d'installation et exécutez la première étape
# prerequisite-generic-deployment-command
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
Obtenez ensuite les adresses IP des nœuds de cluster.
$ kubectl get nodes -o wide
NAME STATUS ROLES ... INTERNAL-IP
master Ready master ... 192.168.121.110
node01 Ready <none> ... 192.168.121.111
node02 Ready <none> ... 192.168.121.112
En outre, la caisse ingress-nginx
service de type LoadBalancer
. Je le fais en téléchargeant le service de modèle NodePort
à partir du didacticiel d'installation et en effectuant les ajustements suivants dans svc-ingress-nginx-lb.yaml
fichier.
$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml > svc-ingress-nginx-lb.yaml
# my changes svc-ingress-nginx-lb.yaml
type: LoadBalancer
externalIPs:
- 192.168.121.110
- 192.168.121.111
- 192.168.121.112
externalTrafficPolicy: Local
# create ingress- service
$ kubectl apply -f svc-ingress-nginx-lb.yaml
Regarde ça ingress-nginx
le service a été créé.
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 10.110.127.9 192.168.121.110,192.168.121.111,192.168.121.112 80:30284/TCP,443:31684/TCP 70m
Regarde ça nginx-ingress-controller
le déploiement a été créé.
$ kubectl get deploy -n ingress-nginx
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-ingress-controller 1 1 1 1 73m
Regarde ça nginx-ingress
pod est en cours d'exécution.
$ kubectl get pods --all-namespaces -l
app.kubernetes.io/name=ingress-nginx
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-5cd796c58c-lg6d4 1/1 Running 0 75m
Enfin, vérifiez la version du contrôleur d'entrée. N'oubliez pas de changer le nom du pod!
$ kubectl exec -it nginx-ingress-controller-5cd796c58c-lg6d4 -n ingress-nginx -- /nginx-ingress-controller --version
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.21.0
Build: git-b65b85cd9
Repository: https://github.com/aledbf/ingress-nginx
-------------------------------------------------------------------------------
Testez que le contrôleur d'entrée fonctionne en exécutant les étapes de cette tutoriel -bien sûr, vous allez omettre la partie minikube
.
La réussite de l'exécution de toutes les étapes créera une ressource de contrôleur d'entrée qui devrait ressembler à ceci.
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
ingress-tutorial myminikube.info,cheeses.all 192.168.121.110,192.168.121.111,192.168.121.112 80 91m
Et des pods qui ressemblent à ça.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
cheddar-cheese-6f94c9dbfd-cll4z 1/1 Running 0 110m
echoserver-55dcfbf8c6-dwl6s 1/1 Running 0 104m
stilton-cheese-5f6bbdd7dd-8s8bf 1/1 Running 0 110m
Enfin, testez cette demande à myminikube.info
se propage via l'équilibreur de charge d'entrée.
$ curl myminikube.info
CLIENT VALUES:
client_address=10.44.0.7
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://myminikube.info:8080/
SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001
HEADERS RECEIVED:
accept=*/*
Host=myminikube.info
user-agent=curl/7.29.0
x-forwarded-for=10.32.0.1
x-forwarded-Host=myminikube.info
x-forwarded-port=80
x-forwarded-proto=http
x-original-uri=/
x-real-ip=10.32.0.1
x-request-id=b2fb3ee219507bfa12472c7d481d4b72
x-scheme=http
BODY:
Ce fut un long voyage pour faire pénétrer le travail dans un environnement semblable à celui du métal d'ours. Ainsi, j'inclurai des liens pertinents qui m'ont aidé.
Vérifiez si vous avez un contrôleur d'entrée dans votre cluster:
$ kubectl get po --all-namespaces
Vous devriez voir quelque chose comme:
kube-system nginx-ingress-controller-gwts0 1/1 Running 0 18d
Il est uniquement possible de créer une entrée pour adresser les services à l'intérieur de l'espace de noms dans lequel réside l'entrée. Les entrées d'espaces de noms croisés ne sont pas implémentées pour des raisons de sécurité.
Il semble que votre cluster manque de contrôleur Ingress.
En général, le contrôleur Ingress fonctionne comme suit: 1. recherchez un certain type d'objets (entrée, "nginx") dans un cluster 2. analysez cet objet et créez une section de configuration pour un module d'entrée spécifique. 3. mettez à jour cet objet pod (redémarrez-le avec une configuration mise à jour)
Ce pod particulier est responsable du traitement du trafic provenant des ports entrants (généralement quelques ports dédiés sur les nœuds) vers la destination de trafic configurée dans le cluster.
Vous pouvez choisir entre deux contrôleurs pris en charge et maintenus - Nginx et GCE
Le contrôleur d'entrée se compose de plusieurs composants que vous créez lors de l'installation. Voici la partie installation de la documentation Nginx Ingress :
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml | kubectl apply -f -
Si vous avez RBAC autorisation configurée dans votre cluster:
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml | kubectl apply -f -
Si aucun RBAC n'est configuré:
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/without-rbac.yaml | kubectl apply -f -
Si vous créez un cluster à partir de zéro:
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml | kubectl apply -f -
Vérifiez votre installation:
kubectl get pods --all-namespaces -l app=ingress-nginx --watch
Vous devriez voir quelque chose comme:
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-699cdf846-nj2rw 1/1 Running 0 1h
Vérifiez les services disponibles et leurs paramètres:
kubectl get services --all-namespaces
Si vous utilisez un déploiement de fournisseur de services personnalisé (minikube, AWS, Azure, GKE), suivez documentation Nginx Ingress pour les détails d'installation.
Voir officiel documentation Kubernetes Ingress pour plus de détails sur Ingress.