Skip to content

Instantly share code, notes, and snippets.

@ifgeny87
Last active December 23, 2023 11:19
Show Gist options
  • Select an option

  • Save ifgeny87/f7286e09cef4056fa5156f00c92ab9f4 to your computer and use it in GitHub Desktop.

Select an option

Save ifgeny87/f7286e09cef4056fa5156f00c92ab9f4 to your computer and use it in GitHub Desktop.
Простое решение для проверки работы ingress в домашнем окружении
# Author: Makarov Evgeny ([email protected])
# Updated: 2023-12-22
#
# Конфиг позволяет запустить несколько подов с nginx внутри.
# Каждый nginx будет на запрос корня отвечать именем своего хоста.
# Отдельный под с ubuntu будет выполнять запрос к подам с nginx каждые 5 секунд и логировать результат.
# Задача конфига показать как работает Service.
#
#
# Флоу:
# 1. Деплой запускает поды с контейнером nginx внутри.
# 2. При запуске контейнер подменяет index.html и пишет в него имя хоста.
# 3. Под nginx-test устанавливает curl и запускает бесконечный цикл с логом результата запроса.
# 4. Запросы curl выполняет по имени сервиса.
#
#
# Подготовка:
# Нужно установить Ingress Controller. Например для Google Cloud:
# > kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
#
#
# Запуск:
# > kubectl apply -f <this file>.yaml
# > kubectl logs -f pods/nginx-test
#
# Важно: Ingress должен создаваться после IngressClass, для того чтобы IngressClass увидел и подхватил Ingress.
# В противном случае Ingress повиснет и не обработается.
#
#
# Проверка:
# 1. Внутри пода nginx-test будут бесконечно отправляться запросы в сервис. Можно проверить логи командой:
# > kubectl logs -f pod/nginx-test
# 2. На хосте также будет доступен сервис по имени хоста nginx-front-svc.
# Можно добавить запись "127.0.0.1 nginx-front-svc" в файле /etc/hosts. И выполнить запрос:
# > curl nginx-front-svc -> вернет index.html
# > curl nginx-front-svc/test/foo.html -> вернет foo.html, /test/ будет обрезан
# > curl nginx-front-svc/foo.html -> вернет index.html, потому что будет обработано правило defaultBackend
# > curl localhost -> вернет 404, потому что в Ingress указан host: nginx-front-svc
#
#
# Как прибить:
# Следующая команда удалит все созданные ресурсы
# > kubectl delete -f <this file>.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dp-front
spec:
replicas: 3
selector:
matchLabels:
app: nginx-front
template:
metadata:
labels:
app: nginx-front
spec:
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command: ['/bin/bash', '-c', 'echo "Hello from ${HOSTNAME}" > /usr/share/nginx/html/index.html; echo "From FOO with ${HOSTNAME}" > /usr/share/nginx/html/foo.html']
---
apiVersion: v1
kind: Service
metadata:
name: nginx-front-svc
spec:
type: ClusterIP
selector:
app: nginx-front
ports:
- port: 80
targetPort: 80
protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
spec:
containers:
- name: ubuntu
image: ubuntu
command: ['/bin/bash', '-c']
args:
- |
apt-get update
apt-get install -y curl
while true; do
sleep 5
echo "$(date):"
echo " - Root says: $(curl -s nginx-front-svc)"
echo " - Foo says: $(curl -s nginx-front-svc/foo.html)"
done
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example
# annotations:
# ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-front-svc
annotations:
# пример регулярки для реврайта
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
labels:
app: mapp
spec:
ingressClassName: nginx-example
defaultBackend:
service:
name: nginx-front-svc
port:
number: 80
rules:
- host: nginx-front-svc
http:
paths:
- path: /test/(.*)
pathType: ImplementationSpecific
backend:
service:
name: nginx-front-svc
port:
number: 80
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment