Thank you for reading this post, don't forget to subscribe!
Мы используем nginx-ingress в качестве службы маршрутизации для наших приложений.
Существует гораздо больше, чем просто маршрутизация, которую мы можем настроить с помощью ingress.
Одной из важных функций является настройка аутентификации для нашего приложения.
Поскольку весь трафик идет с ingress на наш сервис, имеет смысл настроить аутентификацию.
Как упоминалось в репозитории, доступны разные типы аутентификации, включая:
- Базовая аутентификация ( basic )
- Аутентификации по сертификатам
- Внешняя аутентификация
- Oauth внешняя аутентификация
В этом руководстве мы настроим аутентификацию на примере приложения, используя базовую технику (basic) аутентификации Ingress.
Предпосылки
- Доступ к рабочему кластеру kubernetes.
- Понимание терминов Kubernetes, таких как поды, развертывания, службы, configmap, ingess и annotations
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ kubectl create -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml namespace "ingress-nginx" created deployment "default-http-backend" created service "default-http-backend" created configmap "nginx-configuration" created configmap "tcp-services" created configmap "udp-services" created serviceaccount "nginx-ingress-serviceaccount" created clusterrole "nginx-ingress-clusterrole" created role "nginx-ingress-role" created rolebinding "nginx-ingress-role-nisa-binding" created clusterrolebinding "nginx-ingress-clusterrole-nisa-binding" created deployment "nginx-ingress-controller" created |
Теперь, когда ресурсы ингресса созданы, нам нужен сервис для доступа к нему.
Используйте следующий манифест, чтобы создать сервис:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp labels: k8s-addon: ingress-nginx.addons.k8s.io name: ingress-nginx namespace: ingress-nginx spec: externalTrafficPolicy: Cluster ports: - name: https port: 443 protocol: TCP targetPort: http - name: http port: 80 protocol: TCP targetPort: http selector: app: ingress-nginx type: LoadBalancer |
Теперь давайте получим ендпоинт ELB и привяжем его к какому-нибудь доменному имени.
1 2 3 4 5 6 |
$kubectl create -f ingress-service.yml service ingress-nginx created $ kubectl -n ingress-nginx get svc ingress-nginx -o wide NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR ingress-nginx 100.71.250.56 abcghccf8540698e8bff782799ca8h04-1234567890.us-east-2.elb.amazonaws.com 80:30032/TCP,443:30108/TCP 10s app=ingress-nginx |
Нам нужен elasticsearch для запуска Kibana.
Вот манифест для примера приложения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: kibana name: kibana namespace: ingress-nginx spec: replicas: 1 template: metadata: labels: app: kibana spec: containers: - image: kibana:latest name: kibana ports: - containerPort: 5601 --- apiVersion: v1 kind: Service metadata: annotations: labels: app: kibana name: kibana namespace: ingress-nginx spec: ports: - name: kibana port: 5601 targetPort: 5601 selector: app: kibana --- apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: elasticsearch name: elasticsearch namespace: ingress-nginx spec: replicas: 1 strategy: type: RollingUpdate template: metadata: labels: app: elasticsearch spec: containers: - image: elasticsearch:latest name: elasticsearch ports: - containerPort: 5601 --- apiVersion: v1 kind: Service metadata: annotations: labels: app: elasticsearch name: elasticsearch namespace: ingress-nginx spec: ports: - name: elasticsearch port: 9200 targetPort: 9200 selector: app: elasticsearch |
kubectl apply -f kibana.yml
deployment "kibana" created
service "kibana" created
deployment "elasticsearch" created
service "elasticsearch" created
Теперь, когда мы создали ресурсы приложения и ингресса, пришло время создать сам Ingress и получить доступ к приложению.
Используйте следующий манифест:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: name: kibana-ingress namespace: ingress-nginx spec: rules: - host: logstest.myapp-staging.com http: paths: - path: / backend: serviceName: kibana servicePort: 5601 |
$kubectl -n ingress-nginx create -f ingress.yml
ingress "kibana-ingress" created.
Теперь давайте настроим базовую аутентификацию с использованием htpasswd.
Следуйте приведенным ниже командам, чтобы сгенерировать секрет для учетных данных.
Давайте создадим файл авторизации с именем пользователя и паролем.
1 2 3 4 5 |
$ htpasswd -c auth kibanaadmin New password: <kibanaadmin> New password: Re-type new password: Adding password for user kibanaadmin |
1 |
kubectl -n ingress-nginx edit ingress kibana ingress |
1 2 3 4 |
nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: "Kibana Authentication Required - kibanaadmin" |