Стандартным способом настройки приложений, работающих на наборе подсистем в кластере Kubernetes, является использование ресурса службы.
Каждый Pod в Kubernetes имеет свой собственный IP-адрес, но набор подов может иметь одно DNS-имя.
Kubernetes способен балансировать нагрузку на поды без каких-либо изменений на прикладном уровне.
Службе по умолчанию присваивается IP-адрес (иногда называемый “cluster IP”), который используется прокси-серверами службы.
Служба может идентифицировать набор подов с помощью label selectors.
- Что такое Ingress?
- Вариант 1: Установка Nginx Ingress Controller без Helm
- Шаг 1: Установите инструменты git, curl и wget
- Шаг 2: Применим манифест Nginx Ingress Controller
- Шаг 3: Редактирование службы ingress-nginx-controller и установка внешних IP-адресов
- Шаг 4: Запуск подов ingress-nginx-controller на мастер нодах
- Вариант 2: Установка Nginx Ingress Controller Kubernetes с помощью Helm
- Шаг 1: Установите helm 3
- Шаг 2: Развертывание контоллера Nginx Ingress
- Развертывание приложения Nginx Ingress
- Создайте маршрут ingress
- Удаление чарта
Что такое 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, включая управляемые кластеры, см. следующие руководства:
- microk8s
- minikube
- AWS
- GCE – GKE
- Azure
- Digital Ocean
- Scaleway
- Exoscale
- Oracle Cloud Infrastructure
- Bare-metal
Метод 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
см. также:
- ☸️ Peirates : Инструмент для тестирования на проникновение Kubernetes
- ☸️ Побег из контейнера Kubernetes с помощью монтирования HostPath
- ☸️ Какие типы сервисов существуют в Kubernetes?
- ☸️ Kubernetes и RBAC: ограничение доступа пользователя в одном namespace
- ☸️ Как установить Prometheus и Grafana на Kubernetes с помощью Helm 3
- ☸️ kube-beacon: выполняет аудит безопасности на основе спецификации CIS Kubernetes Benchmark
- ☸️ Сканеры Kubernetes для поиска уязвимостей и неправильной конфигурации кластеров
- ☸️ Проброс логов Kubernetes в Elasticsearch (ELK) с помощью Fluentbit
- ☸️ Мониторинг контейнеров Docker и Kubernetes с помощью Weave Scope