J'essaie d'accomplir une tâche TRÈS courante pour une application:
Attribuez un certificat et sécurisez-le avec TLS/HTTPS.
J'ai passé près d'une journée à parcourir la documentation et à essayer plusieurs tactiques différentes pour que cela fonctionne, mais rien ne fonctionne pour moi.
Initialement, j'ai configuré nginx-ingress sur EKS en utilisant Helm en suivant les documents ici: https://github.com/nginxinc/kubernetes-ingress . J'ai essayé de faire fonctionner l'exemple d'application (café) en utilisant la configuration suivante:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
tls:
- hosts:
- cafe.example.com
secretName: cafe-secret
rules:
- Host: cafe.example.com
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
L'entrée et tous les services/déploiements pris en charge ont bien fonctionné, mais il manque une chose importante: l'entrée n'a pas d'adresse/ELB associée:
NAME HOSTS ADDRESS PORTS AGE
cafe-ingress cafe.example.com 80, 443 12h
Service LoadBalancers crée des ressources ELB, à savoir:
testnodeapp LoadBalancer 172.20.4.161 a64b46f3588fe... 80:32107/TCP 13h
Cependant, Ingress ne crée pas d'adresse. Comment puis-je obtenir un contrôleur Ingress exposé en externe sur EKS pour gérer TLS/HTTPS?
J'ai répliqué toutes les étapes nécessaires pour être opérationnel sur EKS avec une entrée sécurisée. J'espère que cela aide quiconque souhaite obtenir sa candidature sur EKS rapidement et en toute sécurité.
Pour être opérationnel sur EKS:
Déployez EKS en utilisant le modèle CloudFormation ici : Gardez à l'esprit que j'ai restreint l'accès avec le CidrIp: 193.22.12.32/32. Modifiez cela en fonction de vos besoins.
Installez les outils client. Suivez le guide ici .
Vous pouvez vérifier que le cluster est opérationnel et vous le pointez en exécutant:
kubectl get svc
Vous lancez maintenant une application de test avec l'entrée nginx.
REMARQUE: Tout est placé sous l'espace de noms ingress-nginx. Idéalement, ce modèle devrait être construit sous différents espaces de noms, mais pour les besoins de cet exemple, cela fonctionne.
Déployez nginx-ingress:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/cloud-generic.yaml
Récupérez rbac.yml dans ici . Courir:
kubectl apply -f rbac.yml
Ayez un certificat et une clé prêts pour le test. Créez le secret nécessaire comme ceci:
kubectl create secret tls cafe-secret --key mycert.key --cert mycert.crt -n ingress-nginx
Copiez coffee.yml de ici . Copiez coffee-ingress.yml de ici . Mettez à jour le domaine sous lequel vous souhaitez l'exécuter. Exécutez-les comme ça
kubectl apply -f coffee.yaml
kubectl apply -f coffee-ingress.yaml
Mettez à jour le CNAME de votre domaine pour pointer vers l'ADRESSE pour:
kubectl get ing -n ingress-nginx -o wide
Actualisez le cache DNS et testez le domaine. Vous devriez obtenir une page sécurisée avec les statistiques de demande. J'ai répliqué cela plusieurs fois, donc si cela ne fonctionne pas pour vous, vérifiez les étapes, la configuration et le certificat. Vérifiez également les journaux du module nginx-ingress-controller *.
kubectl logs pod/nginx-ingress-controller-*********** -n ingress-nginx
Cela devrait vous donner une idée de ce qui ne va pas.
Pour faire fonctionner un ressource Ingress , le cluster doit avoir un contrôleur Ingress configuré.
Ceci est différent des autres types de contrôleurs, qui s'exécutent généralement dans le cadre du binaire kube-controller-manager, et qui sont généralement démarrés automatiquement dans le cadre de la création d'un cluster.
Pour EKS avec barre , vous pouvez essayer:
helm registry install quay.io/coreos/alb-ingress-controller-helm
Ensuite, configurez la ressource Ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: 'true'
spec:
rules:
- Host: YOUR_DOMAIN
http:
paths:
- path: /
backend:
serviceName: ingress-example-test
servicePort: 80
tls:
- secretName: custom-tls-cert
hosts:
- YOUR_DOMAIN
Appliquez la config:
kubectl create -f ingress.yaml
Ensuite, créez le secret avec les certificats TLS:
kubectl create secret tls custom-tls-cert --key /path/to/tls.key --cert /path/to/tls.crt
et référence à eux dans la définition Ingress:
tls:
- secretName: custom-tls-cert
hosts:
- YOUR_DOMAIN
L'exemple de configuration suivant montre comment configurer le contrôleur Ingress:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
labels:
k8s-app: nginx-ingress-controller
spec:
replicas: 1
selector:
matchLabels:
k8s-app: nginx-ingress-controller
template:
metadata:
labels:
k8s-app: nginx-ingress-controller
spec:
# hostNetwork makes it possible to use ipv6 and to preserve the source IP correctly regardless of docker configuration
# however, it is not a hard dependency of the nginx-ingress-controller itself and it may cause issues if port 10254 already is taken on the Host
# that said, since hostPort is broken on CNI (https://github.com/kubernetes/kubernetes/issues/31307) we have to use hostNetwork where CNI is used
# like with kubeadm
# hostNetwork: true
terminationGracePeriodSeconds: 60
containers:
- image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.17.1
name: nginx-ingress-controller
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 1
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
- --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb
Ensuite, appliquez la configuration ci-dessus, puis vous pouvez vérifier les services pour les IP externes exposées:
kubectl get service nginx-controller -n kube-system
L'IP externe est une adresse qui se termine à l'un des nœuds Kubernetes tel que configuré par des mécanismes de routage configurés en externe. Lorsqu'il est configuré dans une définition de service, une fois qu'une demande atteint un nœud, le trafic est redirigé vers un point de terminaison de service.
Documentation de Kubernetes fournit plus d'exemples.