Добро пожаловать в Stack Laimis!
Я проверил ваш входной объект и обнаружил одну проблему.
В вашем входе отсутствует цель перезаписи :
В некоторых сценариях ios открытый URL-адрес в серверной службе отличается от указанного пути в правиле Ingress. Без перезаписи любой запрос вернет 404. Установите аннотацию nginx .ingress.kubernetes.io / rewrite-target в путь, ожидаемый службой.
Этот пример из документации показывает требуемая структура :
Вот ваш вход с правкой:
- добавлена строка
nginx.ingress.kubernetes.io/rewrite-target: /$1
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: jenkins-ing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: util.my-app.com
http:
paths:
- path: /jenkins/*
backend:
serviceName: jenkins-svc
servicePort: 80
Воспроизведение:
- Сначала я создал развертывание. Для этого я использую
echo-app
в качестве поясняющего вывода. - Добавьте сервис, чтобы выставить его внутри кластера на
port 8080
и снаружи как NodePort
.
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo1-deploy
spec:
selector:
matchLabels:
app: echo1-app
template:
metadata:
labels:
app: echo1-app
spec:
containers:
- name: echo1-app
image: mendhak/http-https-echo
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: echo1-svc
spec:
type: NodePort
selector:
app: echo1-app
ports:
- protocol: TCP
port: 8080
targetPort: 80
- Я создам еще одно развертывание и службу. Таким образом, мы сможем еще немного попробовать с Ingress и продемонстрировать, что делать, когда у вас есть более одной службы, которую необходимо предоставить при входе
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo2-deploy
spec:
selector:
matchLabels:
app: echo2-app
template:
metadata:
labels:
app: echo2-app
spec:
containers:
- name: echo2-app
image: mendhak/http-https-echo
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: echo2-svc
spec:
type: NodePort
selector:
app: echo2-app
ports:
- protocol: TCP
port: 8080
targetPort: 80
- Я буду использовать вход, так же как и у вас, единственные отличия:
- Изменен сервис на
echo1-svc
, эмулирующий ваш jenkins-sv c - Добавлен еще один сервис к
echo2-svc
для перенаправления всех http-запросов, кроме тех, которые соответствуют первому правилу.
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: jenkins-ing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: util.my-app.com
http:
paths:
- path: /jenkins/*
backend:
serviceName: echo1-svc
servicePort: 80
- path: /(.*)
backend:
serviceName: echo2-svc
servicePort: 80
- Теперь я разверну это приложения и вход:
$ kubectl apply -f echo1-deploy.yaml
deployment.apps/echo1-deploy created
service/echo1-svc created
$ kubectl apply -f echo2-deploy.yaml
deployment.apps/echo2-deploy created
service/echo2-svc created
$ kubectl apply -f jenkins-ing.yaml
ingress.networking.k8s.io/jenkins-ing created
- Теперь давайте проверим, все ли работает:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/echo1-deploy-989766d57-8pmhj 1/1 Running 0 27m
pod/echo2-deploy-65b6ffbcf-lfgzk 1/1 Running 0 27m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/echo1-svc NodePort 10.101.127.78 <none> 8080:30443/TCP 27m
service/echo2-svc NodePort 10.106.34.91 <none> 8080:32628/TCP 27m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/echo1-deploy 1/1 1 1 27m
deployment.apps/echo2-deploy 1/1 1 1 27m
NAME DESIRED CURRENT READY AGE
replicaset.apps/echo1-deploy-989766d57 1 1 1 27m
replicaset.apps/echo2-deploy-65b6ffbcf 1 1 1 27m
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
jenkins-ing util.my-app.com 80 4s
- Как вы можете видеть
echo1-svc
выставлено за пределами kubernetes на port 30443
и echo2-svc
на port 32628
- С помощью правила входа мы можем свернуть порт 80, и он будет перенаправлен на указанную службу.
- Поскольку у меня нет этого домена, я добавлю запись в свой файл
/etc/hosts
, чтобы эмулировать разрешение DNS, направляя его на мой IP-адрес kubernetes.
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.39.240 util.my-app.com
$ curl util.my-app.com/jenkins
{
"headers": {
"host": "util.my-app.com",
"x-real-ip": "192.168.39.1",
"x-forwarded-host": "util.my-app.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"user-agent": "curl/7.52.1",
},
"method": "GET",
"hostname": "util.my-app.com",
"ip": "::ffff:172.17.0.6",
"protocol": "http",
"subdomains": [
"util"
],
"os": {
"hostname": "echo1-deploy-989766d57-8pmhj"
}
Вы можете видеть, что HTTP GET был перенаправлен на модуль на бэкэнде echo1-svc
- Теперь давайте посмотрим, что происходит, когда мы свернем домен без /jenkins/
$ curl util.my-app.com
{
"headers": {
"host": "util.my-app.com",
"x-real-ip": "192.168.39.1",
"x-forwarded-host": "util.my-app.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"user-agent": "curl/7.52.1",
},
"method": "GET",
"hostname": "util.my-app.com",
"ip": "::ffff:172.17.0.6",
"protocol": "http",
"subdomains": [
"util"
],
"os": {
"hostname": "echo2-deploy-65b6ffbcf-lfgzk"
Вы можете видеть, что HTTP GET был перенаправлен на модуль в бэкэнде echo2-svc
.
- Я знаю, что ваш вопрос также затрагивает проблемы с вашей аутентификацией в Google, но я Я бы предложил вам сначала исправить ваш вход, затем вы можете вставить сюда статус, который он вернет, если у вас все еще есть проблемы с правильным перенаправлением входа.
Если у вас есть какие-либо сомнения, дайте мне знать в комментариях .