База знаний LinxCloud Services

Ingress Controller

При создании PaaS кластера Kubernetes есть возможность выбрать среди предустановленных сервисов NGINX Ingress Controller. Если он был выбран, то после создания кластера, Ingress Controller будет развернут автоматически.

Ingress Controller состоит из двух компонентов:

  1. Контроллера, взаимодействующего с API-сервером Kubernetes.
  2. Реверсивного прокси-сервера.

Контроллер получает данные об 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.

Рассмотрим на примере:

  1. Создадим в кластере под*nginx-pod с веб-сервером Nginx, который будет отдавать надпись «Hello World!».
  2. Создадим сервис test-service который будет направлять трафик в под nginx-pod.
  3. Создадим ингресс 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.

Что вас интересует?
Получить демо-доступ

Спасибо за ваш запрос, мы свяжемся с вами в ближайшее время!