☸️ Развертывание контроллера Nginx Ingress на Kubernetes с помощью чарта Helm |

☸️ Развертывание контроллера Nginx Ingress на Kubernetes с помощью чарта Helm

Мануал

Стандартным способом настройки приложений, работающих на наборе подсистем в кластере Kubernetes, является использование ресурса службы.

Каждый Pod в Kubernetes имеет свой собственный IP-адрес, но набор подов может иметь одно DNS-имя.

Kubernetes способен балансировать нагрузку на поды без каких-либо изменений на прикладном уровне.

Службе по умолчанию присваивается IP-адрес (иногда называемый “cluster IP”), который используется прокси-серверами службы.

Служба может идентифицировать набор подов с помощью label selectors.

Что такое Ingress?

Прежде чем ответить на этот вопрос, необходимо понять, что такое объект Ingress в Kubernetes.

Согласно официальной документации Kubernetes, Ingress определяется следующим образом

An API object that manages external access to the services in a cluster, typically HTTP.

Ingress may provide load balancing, SSL termination and name-based virtual hosting.

Ingress в Kubernetes открывает маршруты HTTP и HTTPS извне кластера для сервисов, работающих внутри кластера.

Вся маршрутизация трафика контролируется правилами, определенными на ресурсе Ingress.

Ingress может быть настроен для:

  • Предоставлять службам URL-адреса, доступные извне.
  • балансировать нагрузку трафика, поступающего в службы кластера
  • Терминировать трафик SSL/TLS
  • Предоставлять виртуальный хостинг на основе имен в Kubernetes.

Контроллер Ingress – это то, что выполняет Ingress, обычно с помощью балансировщика нагрузки.

Ниже приведен пример того, как Ingress направляет весь клиентский трафик на службу в кластере Kubernetes:

Для стандартного трафика HTTP и HTTPS контроллер Ingress будет настроен на прослушивание портов 80 и 443.

Он должен быть привязан к IP-адресу, с которого кластер будет получать трафик.

Запись Wildcard DNS для домена, используемого для маршрутов Ingress, будет указывать на IP-адрес(ы), который прослушивает контроллер Ingress.

Kubernetes использует подход BYOS (Bring-Your-Own-Software) для большинства своих дополнений и не предоставляет программное обеспечение, выполняющее функции Ingress из коробки.

Вы можете выбрать один из множества доступных контроллеров Ingress.

Kubedex также проделал хорошую работу по обобщению списка Ingress, доступных для Kubernetes.

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

Вариант 1: Установка Nginx Ingress Controller  без Helm

В этом методе вы вручную загрузите и запустите манифесты развертывания с помощью инструмента командной строки kubectl.

Шаг 1: Установите инструменты git, curl и wget

Установите инструменты git, curl и wget в вашем Bastion, где установлен и настроен kubectl:

# CentOS / RHEL / Fedora / Rocky
sudo yum -y install wget curl git

# Debian / Ubuntu
sudo apt update
sudo apt install wget curl git

Шаг 2: Применим манифест Nginx Ingress Controller

Процесс развертывания зависит от вашей настройки Kubernetes.

В моем Kubernetes будет использоваться руководство по развертыванию Bare-metal Nginx Ingress.

Для других кластеров Kubernetes, включая управляемые кластеры, см. следующие руководства:

Метод Bare-metal применяется к любым кластерам Kubernetes, развернутым на “железе” с общим дистрибутивом Linux (например, CentOS, Ubuntu, Debian, Rocky Linux) и т.д.

Скачайте деплоймент контроллера Nginx для Baremetal:

repos/kubernetes/ingress-nginx/releases/latest | grep tag_name | cut -d '"' -f 4)
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/${controller_tag}/deploy/static/provider/baremetal/deploy.yaml

Переименуйте файл:

mv deploy.yaml nginx-ingress-controller-deploy.yaml

Не стесняйтесь проверять содержимое файла и вносить изменения по своему усмотрению:

vim nginx-ingress-controller-deploy.yaml

Примените файл манифеста ингресс-контроллера Nginx:

$ kubectl apply -f nginx-ingress-controller-deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
serviceaccount/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created

Выполните следующую команду, чтобы проверить, запустились ли поды входящего контроллера:

$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create--1-hpkzp     0/1     Completed   0          43s
ingress-nginx-admission-patch--1-qnjlj      0/1     Completed   1          43s
ingress-nginx-controller-644555766d-snvqf   1/1     Running     0          44s

После того, как поды контроллера запущены, вы можете отменить команду, набрав Ctrl+C.

Шаг 3: Редактирование службы ingress-nginx-controller и установка внешних IP-адресов

В настройках деплоймента Kubernetes в частной инфраструктуре маловероятно, что у вас будет поддержка службы Load Balancer.

$ kubectl get svc  -n ingress-nginx ingress-nginx-controller
NAME                       TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.101.4.21   <none>        80:30248/TCP,443:30773/TCP   3m53s

Вы заметите службу типа NodePort.

Мы обновим сервис, сделав привязку Ingress к определенному IP-адресу с помощью External IP.

Kubernetes поддерживает назначение внешних IP-адресов в поле Service spec.externalIPs с помощью объекта ExternalIP.

Это откроет дополнительный виртуальный IP-адрес, назначенный службе Nginx Ingress Controller Service.

Это позволит нам направлять трафик на локальный узел для балансировки нагрузки.

В моем кластере Kubernetes у меня есть две ноды мастер с указанными ниже основными IP-адресами:

  • k8smaster01.example.com – 192.168.42.245
  • k8smaster02.example.com – 192.168.42.246

Я создам файл, содержащий модификацию для добавления внешних IP в службу.

$ vim external-ips.yaml
spec:
  externalIPs:
  - 192.168.42.245
  - 192.168.42.246

Теперь давайте применим патч к службе.

$ kubectl -n ingress-nginx patch svc ingress-nginx-controller --patch "$(cat external-ips.yaml)"
service/ingress-nginx-controller patched

Проверьте службу после применения исправления, были ли добавлены внешние IP-адреса:

$ kubectl get svc  ingress-nginx-controller -n ingress-nginx
NAME                       TYPE       CLUSTER-IP    EXTERNAL-IP                     PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.101.4.21   192.168.42.245,192.168.42.246   80:30248/TCP,443:30773/TCP   8m31

Шаг 4: Запуск подов ingress-nginx-controller на мастер нодах

Можно рассмотреть возможность запуска Ingress Controller на мастерах.

Для этого мы пометим мастер ноды, а затем воспользуемся node selector для назначения подов в деплойменте контроллера Ingress на нодах Control Plane.

$ kubectl get nodes -l node-role.kubernetes.io/control-plane
NAME                         STATUS   ROLES                  AGE   VERSION
k8smaster01.example.com      Ready    control-plane,master   16d   v1.22.2
k8smaster02.example.com      Ready    control-plane,master   16d   v1.22.2

Добавьте метки run-nginx-ingress=true на главные ноды; это могут быть любые другие ноды в кластере:

kubectl label node k8smaster01.example.com run-nginx-ingress=true
kubectl label node k8smaster02.example.com run-nginx-ingress=true

Метки, добавленные к ноде, можно проверить с помощью команды:

kubectl describe node <node-name>

Пример:

$ kubectl describe node k8smaster01.example.com
Name:               k8smaster01.example.com
Roles:              control-plane,master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8smaster01.example.com
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/control-plane=
                    node-role.kubernetes.io/master=
                    node.kubernetes.io/exclude-from-external-load-balancers=
                    run-nginx-ingress=true # Label added
.....

Создайте файл патча для запуска подов на нодах с labelrun-nginx-ingress=true

$ vim node-selector-patch.yaml
spec:
  template:
    spec:
      nodeSelector:
        run-nginx-ingress=true

Применим патч:

$ kubectl get deploy  -n ingress-nginx
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx-controller   1/1     1            1           20m

$ kubectl -n ingress-nginx patch deployment/ingress-nginx-controller --patch "$(cat node-selector-patch.yaml)"
deployment.apps/ingress-nginx-controller patched

В Kubernetes настройкой по умолчанию является запрет на запуск подов на мастер нодах.

Чтобы поды Ingress запускались на мастер-узлах, необходимо добавить tolerations.

Давайте создадим файл патча для применения tolerations при развертывании Ingress.

$ vim master-node-tolerations.yaml
spec:
  template:
    spec:
      tolerations:
        - key: node-role.kubernetes.io/master
          operator: Equal
          value: "true"
          effect: NoSchedule
        - key: node-role.kubernetes.io/master
        operator: Equal
        effect: NoSchedule

И применим его:

kubectl -n ingress-nginx patch deployment/ingress-nginx-controller --patch "$(cat master-node-tolerations.yaml)"

Вариант 2: Установка Nginx Ingress Controller Kubernetes с помощью Helm

Если вы выбрали метод установки с помощью Helm, выполните шаги, описанные в этом разделе.

Шаг 1: Установите helm 3

Установите helm 3 на рабочей станции, где установлен и настроен Kubectl.

cd ~/
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Скрипт установки работает как для операционных систем Linux, так и для macOS.

Вот результат успешной установки:

Helm v3.7.1 is available. Changing from version v3.6.3.
Downloading https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm

Давайте запросим версию пакета helm для проверки работоспособности установки:

$ helm version
version.BuildInfo{Version:"v3.7.1", GitCommit:"1d11fcb5d3f3bf00dbe6fe31b8412839a96b3dc4", GitTreeState:"clean", GoVersion:"go1.16.9"}

Шаг 2: Развертывание контоллера Nginx Ingress

Загрузите последний стабильный выпуск кода Nginx Ingress Controller:

controller_tag=$(curl -s https://api.github.com/repos/kubernetes/ingress-nginx/releases/latest | grep tag_name | cut -d '"' -f 4)
wget https://github.com/kubernetes/ingress-nginx/archive/refs/tags/${controller_tag}.tar.gz

Распакуйте загруженный файл:

tar xvf ${controller_tag}.tar.gz

Перейдите в созданный каталог:

cd ingress-nginx-${controller_tag}

Измените рабочий каталог на папку charts:

cd charts/ingress-nginx/

Пометим ноды, на которых будут работать поды Ingress Controller

Node selector используется в тем случаях, когда нам нужно развернуть под или группу подов на определенной группе нод, которые соответствуют критериям, заданным в конфигурационном файле.

Перечислим ноды:

$ kubectl get nodes
NAME                         STATUS   ROLES                  AGE   VERSION
k8smaster01.example.com      Ready    control-plane,master   14h   v1.22.2
k8smaster02.example.com      Ready    control-plane,master   14h   v1.22.2
k8sworker01.example.com      Ready    <none>                 13h   v1.22.2
k8sworker02.example.com      Ready    <none>                 13h   v1.22.2
k8sworker03.example.com      Ready    <none>                 13h   v1.22.2

Добавьте метку run-nginx-ingress=true:

$ kubectl label node k8smaster01.example.com run-nginx-ingress=true
node/k8smaster01.example.com labeled

$ kubectl label node k8smaster02.example.com run-nginx-ingress=true
node/k8smaster02.example.com labeled

Покажем набор меток:

$ kubectl describe node k8smaster01.example.com
Name:               k8smaster01.example.com
Roles:              control-plane,master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8smaster01.example.com
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/control-plane=
                    node-role.kubernetes.io/master=
                    node.kubernetes.io/exclude-from-external-load-balancers=
                    run-nginx-ingress=true # Label added
.....

Обновление файла values.yml для изменения параметров

Редактирование файла значений

vim values.yaml

Добавление tolerations для мастер нод

controller:
  tolerations:
    - key: node-role.kubernetes.io/master
      operator: Equal
      value: "true"
      effect: NoSchedule
    - key: node-role.kubernetes.io/master
      operator: Equal
      effect: NoSchedule

Setcontroller.service.externalIPs

controller:
  service:
    externalIPs: ["192.168.42.245","192.168.42.246"]

Чтобы установить количество реплик развертывания контроллера Ingress на controller.replicaCount

controller:
  replicaCount: 1

При использовании node selector для назначения подов контроллера Ingress, установленного в controller.nodeSelector

controller:
  nodeSelector:
    kubernetes.io/os: linux
    run-nginx-ingress: "true"

Создайте пространство имен

kubectl create namespace ingress-nginx

Теперь разверните Nginx Ingress Controller с помощью следующих команд

helm install -n ingress-nginx ingress-nginx  -f values.yaml .

Образец вывода развертывания

NAME: ingress-nginx
LAST DEPLOYED: Thu Nov  4 02:50:28 2021
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller'

An example Ingress that makes use of the controller:

  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    name: example
    namespace: foo
  spec:
    ingressClassName: example-class
    rules:
      - host: www.example.com
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port: 80
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

Проверка состояния всех ресурсов в пространстве имен ingress-nginx:

Поды:

$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-6f5844d579-hwrqn   1/1     Running   0          23m

Для проверки логов на нодах используйте команды:

$ kubectl -n ingress-nginx  logs deploy/ingress-nginx-controller
-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:       v1.0.4
  Build:         9b78b6c197b48116243922170875af4aa752ee59
  Repository:    https://github.com/kubernetes/ingress-nginx
  nginx version: nginx/1.19.9

-------------------------------------------------------------------------------

W1104 00:06:59.684972       7 client_config.go:615] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
I1104 00:06:59.685080       7 main.go:221] "Creating API client" host="https://10.96.0.1:443"
I1104 00:06:59.694832       7 main.go:265] "Running in Kubernetes cluster" major="1" minor="22" git="v1.22.2" state="clean" commit="8b5a19147530eaac9476b0ab82980b4088bbc1b2" platform="linux/amd64"
I1104 00:06:59.937097       7 main.go:104] "SSL fake certificate created" file="/etc/ingress-controller/ssl/default-fake-certificate.pem"
I1104 00:06:59.956498       7 ssl.go:531] "loading tls certificate" path="/usr/local/certificates/cert" key="/usr/local/certificates/key"
I1104 00:06:59.975510       7 nginx.go:253] "Starting NGINX Ingress controller"
I1104 00:07:00.000753       7 event.go:282] Event(v1.ObjectReference{Kind:"ConfigMap", Namespace:"ingress-nginx", Name:"ingress-nginx-controller", UID:"5aea2f36-fdf2-4f5c-96ff-6a5cbb0b5b82", APIVersion:"v1", ResourceVersion:"13359975", FieldPath:""}): type: 'Normal' reason: 'CREATE' ConfigMap ingress-nginx/ingress-nginx-controller
I1104 00:07:01.177639       7 nginx.go:295] "Starting NGINX process"
I1104 00:07:01.177975       7 leaderelection.go:243] attempting to acquire leader lease ingress-nginx/ingress-controller-leader...
I1104 00:07:01.178194       7 nginx.go:315] "Starting validation webhook" address=":8443" certPath="/usr/local/certificates/cert" keyPath="/usr/local/certificates/key"
I1104 00:07:01.180652       7 controller.go:152] "Configuration changes detected, backend reload required"
I1104 00:07:01.197509       7 leaderelection.go:253] successfully acquired lease ingress-nginx/ingress-controller-leader
I1104 00:07:01.197857       7 status.go:84] "New leader elected" identity="ingress-nginx-controller-6f5844d579-hwrqn"
I1104 00:07:01.249690       7 controller.go:169] "Backend successfully reloaded"
I1104 00:07:01.249751       7 controller.go:180] "Initial sync, sleeping for 1 second"
I1104 00:07:01.249999       7 event.go:282] Event(v1.ObjectReference{Kind:"Pod", Namespace:"ingress-nginx", Name:"ingress-nginx-controller-6f5844d579-hwrqn", UID:"d6a2e95f-eaaa-4d6a-85e2-bcd25bf9b9a3", APIVersion:"v1", ResourceVersion:"13364867", FieldPath:""}): type: 'Normal' reason: 'RELOAD' NGINX reload triggered due to a change in configuration

Следить за логами по мере их потокового выполнения:

kubectl -n ingress-nginx  logs deploy/ingress-nginx-controller -f

Я установлю количество реплик контроллера Pods равным 2:

$ vim values.yaml 
controller:
  replicaCount: 3

Мы можем подтвердить, что в настоящее время у нас есть один под:

$ kubectl -n ingress-nginx  get deploy
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx-controller   1/1     1            1           43m

Обновите версию ingress-nginx, выполнив следующие команды helm:

$ helm upgrade -n ingress-nginx ingress-nginx -f values.yaml .
Release "ingress-nginx" has been upgraded. Happy Helming!
NAME: ingress-nginx
LAST DEPLOYED: Thu Nov  4 03:35:41 2021
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 5
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.

Проверьте текущее количество подов после обновления:

$ kubectl -n ingress-nginx  get deploy
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx-controller   3/3     3            3           45m

Развертывание приложения Nginx Ingress

Метод определения Ingress можно также просмотреть с помощью опции команды explain:

$ kubectl explain ingress
KIND:     Ingress
VERSION:  networking.k8s.io/v1

DESCRIPTION:
     Ingress is a collection of rules that allow inbound connections to reach
     the endpoints defined by a backend. An Ingress can be configured to give
     services externally-reachable urls, load balance traffic, terminate SSL,
     offer name based virtual hosting etc.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec	<Object>
     Spec is the desired state of the Ingress. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

   status	<Object>
     Status is the current state of the Ingress. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

Создайте временное пространство имен под названием demo

kubectl create namespace demo

Создайте тестовый YAML-файл подов и служб:

cd ~/
vim demo-app.yml

Вставьте приведенные ниже данные в файл:

kind: Pod
apiVersion: v1
metadata:
  name: apple-app
  labels:
    app: apple
spec:
  containers:
    - name: apple-app
      image: hashicorp/http-echo
      args:
        - "-text=apple"
---

kind: Service
apiVersion: v1
metadata:
  name: apple-service
spec:
  selector:
    app: apple
  ports:
    - port: 5678 # Default port for image
---
kind: Pod
apiVersion: v1
metadata:
  name: banana-app
  labels:
    app: banana
spec:
  containers:
    - name: banana-app
      image: hashicorp/http-echo
      args:
        - "-text=banana"
---

kind: Service
apiVersion: v1
metadata:
  name: banana-service
spec:
  selector:
    app: banana
  ports:
    - port: 5678 # Default port for image

Создайте поды и службы:

$ kubectl apply -f demo-app.yml -n demo
pod/apple-app created
service/apple-service created
pod/banana-app created
service/banana-service created

Проверьте, работает ли он

$ kubectl get pods -n demo
NAME         READY   STATUS    RESTARTS   AGE
apple-app    1/1     Running   0          2m53s
banana-app   1/1     Running   0          2m52s
ubuntu       1/1     Running   0          11m

$ kubectl -n demo logs apple-app
2021/10/19 00:24:28 Server is listening on :5678

Создайте под Ubuntu, который будет использоваться для тестирования подключения к сервису

cat <<EOF | kubectl -n demo apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
  labels:
    app: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    command: ["/bin/sleep", "3650d"]
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
EOF

Тестирование

$ kubectl -n demo exec -ti ubuntu -- bash
root@ubuntu:/# apt update && apt install curl -y
root@ubuntu:/# curl apple-service:5678
apple
root@ubuntu:/# curl banana-service:5678
banana

Создайте маршрут ingress

Теперь объявите Ingress для маршрутизации запросов к /apple на первый сервис, а запросов к /banana на второй сервис.

Проверьте поле правил Ingress, которое определяет, как будут передаваться запросы.

Для кластера Kubernetes версии < 1.19

$ vim demo-app-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-app-ingress
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: apple-banana.example.com
    http:
      paths:
        - path: /apple
          pathType: Prefix
          backend:
            service:
              name: apple-service
              port:
                number: 5678
        - path: /banana
          pathType: Prefix
          backend:
            service:
              name: banana-service
              port:
                number: 5678

Создайте ресурс ingress с помощью kubectl:

$ kubectl -n demo apply -f  demo-app-ingress.yml
ingress.networking.k8s.io/demo-app-ingress created

Для кластера Kubernetes версии >= 1.19:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-app-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: apple-banana.example.com
    http:
      paths:
        - path: /apple
          pathType: Prefix
          backend:
            service:
              name: apple-service
              port:
                number: 5678
        - path: /banana
          pathType: Prefix
          backend:
            service:
              name: banana-service
              port:
                number: 5678

Затем примените файл для создания объектов

$ kubectl -n demo apply -f  demo-app-ingress.yml
ingressclass.networking.k8s.io/nginx configured
ingress.networking.k8s.io/demo-app-ingress created

Список сконфигурированных ингрессов:

$ kubectl get ingress
NAME               CLASS    HOSTS                         ADDRESS           PORTS   AGE
demo-app-ingress   <none>   apple-banana.example.com      192.168.42.245    80      7m36s

Проверка конфигурации:

 

$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-6f5844d579-hwrqn   1/1     Running   0          53m
ingress-nginx-controller-6f5844d579-kvgtd   1/1     Running   0          25m
ingress-nginx-controller-6f5844d579-lcrrt   1/1     Running   0          25m

$ kubectl exec -n ingress-nginx  -it ingress-nginx-controller-6f5844d579-hwrqn  -- /bin/bash
bash-5.1$

Удаление чарта

Чтобы удалить ингресс-контроллер nginx и все связанные с ним ресурсы, которые мы развернули с помощью Helm, выполните в терминале следующую команду.

$ helm -n ingress-nginx uninstall ingress-nginx
release "ingress-nginx" uninstalled

см. также:

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий