При создании PaaS кластера Kubernetes есть возможность выбрать среди предустановленных сервисов NGINX Ingress Controller. Если он был выбран, то после создания кластера, Ingress Controller будет развернут автоматически.
Ingress Controller состоит из двух компонентов:
- Контроллера, взаимодействующего с API-сервером Kubernetes.
- Реверсивного прокси-сервера.
Контроллер получает данные об ingress-объектах от API-сервера и на основании их настраивает работу реверсивного прокси.
Для работы ingress, как объектов Kubernetes, в кластере обязательно наличие Ingress Controller. Без него объекты ingress работать не будут.
После создания кластера Ingress Controller поднимается в нем в виде пода, находящегося в неймспейсе ingress-nginx. Его наличие можно проверить командой:
1kubectl get pods -n ingress-nginx
2NAME READY STATUS RESTARTS AGE
3nginx-ingress-controller-8696859596-74fwj 1/1 Running 0 7d21h
4nginx-ingress-default-backend-7c57f78d75-nmq5f 1/1 Running 0 7d21h
Доступность Ingress Controllerа извне осуществляется через сервис nginx-ingress-controller,, имеющей тип LoadBalancer. Его можно найти в списке сервисов в неймспейсе ingress-nginx, его «белый» адрес можно найти там же:
1kubectl get svc -n ingress-nginx
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3nginx-ingress-controller LoadBalancer 10.254.23.44 89.208.85.23 80:30080/TCP,443:30443/TCP 61d
4nginx-ingress-controller-metrics ClusterIP 10.254.101.237 <none> 9913/TCP 61d
5nginx-ingress-default-backend ClusterIP 10.254.33.216 <none> 80/TCP 61d
Ingress
Ingress — это объект Kubernetes, описывающий правила проксирования трафика от внешнего источника до сервисов внутри кластера K8S.
Добавление или изменение правил проксирования трафика происходит путем переконфигурирования Ingress — путем правки манифеста и его файла ConfigMap.
Рассмотрим на примере:
- Создадим в кластере под*nginx-pod с веб-сервером Nginx, который будет отдавать надпись «Hello World!».
- Создадим сервис test-service который будет направлять трафик в под nginx-pod.
- Создадим ингресс test-ingress который будет проксировать трафик до сервиса test-service.
Манифест для пода и его ConfigMap, который выступит конфигурационным файлом для веб-сервера:
1---
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: my-configmap
6 data:default.conf: |
7 server {
8 listen 80 default_server;
9 server_name _;
10 default_type text/plain;
11 location / {
12 return 200 "\n'Hello World!'\n";
13 }
14 }
15---
16apiVersion: v1
17kind: Pod
18metadata:
19 name: nginx-pod
20 labels:
21 app: my-app
22spec:
23 containers:
24 - image: nginx:1.12
25 name: nginx
26 ports:
27 - containerPort: 80
28 volumeMounts:
29 - name: config
30 mountPath: /etc/nginx/conf.d/
31 volumes:
32 - name: config
33 configMap:
34 name: my-configmap
В ConfigMap опишем конфигурацию для nginx-веб-сервера, а в поде смонтируем этот ConfigMap в /etc/nginx/conf.d/. Для пода зададим лэйбл app: my-app.
Манифест для сервиса:
1---
2apiVersion: v1
3kind: Service
4metadata:
5 name: test-service
6spec:
7 selector:
8 app: my-app
9 ports:
10 - protocol: TCP
11 port: 80
12 targetPort: 80
Создадим сервис, слушающий на 80-м порту и направляющий трафик на 80-й порт по TCP. В качестве селектора укажем лэйбл нашего пода app: my-app.
Манифест для ингресса:
1---
2apiVersion: networking.k8s.io/v1beta1
3kind: Ingress
4metadata:
5 name: test-ingress
6 annotations:
7 nginx.ingress.kubernetes.io/rewrite-target: /
8spec:
9 rules:
10 - http:
11 paths:
12 - path: /testpath
13 backend:
14 serviceName: test-service
15 servicePort: 80
Опишем ингресс, указав чтобы при переходе по пути /testpath трафик направлялся на сервис test-service по 80-му порту.
Создадим все описанные объекты, выполнив для каждого манифеста команду:
kubectl apply -f <object.yaml>
После чего проверим их:
1kubectl get configmap
2NAME DATA AGE
3my-configmap 1 173m
1kubectl get pods
2NAME READY STATUS RESTARTS AGE
3nginx-pod 1/1 Running 0 173m
1kubectl get svc
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 62d
4test-service ClusterIP 10.254.175.104 <none> 80/TCP 3h58m
1kubectl get ing
2NAME HOSTS ADDRESS PORTS AGE
3test-ingress \* 80 3h27m
Теперь для проверки выполним запрос до публичного адреса сервиса nginx-ingress-controller по пути /testpath:
1curl -k https://89.208.85.23/testpath
2
3'Hello World!'
В данном примере все создавалось для http-трафика, но в предустановленном Ingress Controller есть редирект с http на https, поэтому при проверке использовался https.