Я новичок в k8s и nginx. В настоящее время я реализую вход nginx в мои kubernetes microk8s через yaml, поскольку это nginx plus. Вот результат:
myubuntu$ kubectl get all -n nginx-ingress
NAME READY STATUS RESTARTS AGE
pod/nginx-ingress-8dd4c95f5-b5qzs 1/1 Running 0 3d23h
pod/nginx-ingress-8dd4c95f5-vbvc6 1/1 Running 0 3d23h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-ingress NodePort 10.152.183.119 <none> 80:31656/TCP,443:30406/TCP 4d3h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-ingress 2/2 2 2 4d3h
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-ingress-8dd4c95f5 2 2 2 3d23h
replicaset.apps/nginx-ingress-c4d985f57 0 0 0 4d3h
Я также развернул тестовое приложение со следующими значениями yaml:
apiVersion: v1
kind: Namespace
metadata:
name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
namespace: web
labels:
app: web
annotations:
deployment.kubernetes.io/revision: '1'
sensor.crowdstrike.com/imageanalyzer: "enable"
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: test
image: my docker image
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-server-service
namespace: web
spec:
selector:
app: web
type: ClusterIP
ports:
- port: 3000
targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-server-ingress
namespace: web
annotations:
kubernetes.io/ingress.class: nginx-ingress
spec:
ingressClassName: nginx
rules:
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-server-service
port:
number: 3000
Я проверил и подтвердил, что обе службы работают нормально независимо, но когда я пытался настроить порт в входном веб-файле, вход nginx plus всегда возвращал 404? Это проблема с моим конфигурационным файлом или пространством имен? Заранее спасибо.
Разверните приложение на microk8 с помощью специального nginx plus ingress.
Вы можете настроить свои службы в другом пространстве имен и разместить входящие контроллеры в другом пространстве имен.
В случае nginx в большинстве случаев при возникновении ошибки 404 имя хоста либо неверно, либо представлено неправильно. Или путь неправильный.
Я настроил локальный вход nginx и применил вашу конфигурацию, используя модуль nginx и 80 в качестве порта контейнера. Я изменил имя хоста web-server-ingress
на localhost. ниже приведен пример того, что я запускал:
# install nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml
# setup the application
k apply -f <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
namespace: web
labels:
app: web
annotations:
deployment.kubernetes.io/revision: '1'
sensor.crowdstrike.com/imageanalyzer: "enable"
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: test
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-server-service
namespace: web
spec:
selector:
app: web
type: ClusterIP
ports:
- port: 80
targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-server-ingress
namespace: web
spec:
ingressClassName: nginx
rules:
- host: localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-server-service
port:
number: 80
EOF
# expose the ingress controller
kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 8000:80
# access the application
curl -X GET http://localhost:8000/
В вашем случае я бы посоветовал вам получить имя модуля входного контроллера:
Меня зовут ingress-nginx-controller-77cfd766fc-2h4k8
Затем попробуйте просмотреть логи:
Вы не заметите журнал запросов, если имя хоста не совпадает.
Если есть логи, вы получите информацию о запросе, сделанном к вышестоящему сервису:
Ниже приведен пример ответа 200:
127.0.0.1 - - [05/Aug/2024:11:10:01 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 1758 0.004 [web-web-server-service-80] [] 172.17.0.4:80 615 0.003 200 f12389c9f84a7855e38758a2004a021e
Обратите внимание, что часть после [web-web-server-service-80]
записывает достигнутый модуль и порт, длину запроса, время и ответ, а также идентификатор запроса.
Вот журнал ответа 503:
127.0.0.1 - - [05/Aug/2024:11:08:12 +0000] "GET / HTTP/1.1" 503 592 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 1758 0.000 [web-web-server-service-80] [] - - - - c1e3a81377b6483e8e2fb8293ff181a7
Обратите внимание, что для запроса/ответа восходящей службы журнал не ведется.
Если имя хоста не совпадает, контроллер не ведет журнал и возвращает клиенту ошибку 404.
Проверьте, может ли это помочь, gist.github.com/codeopensrc/e43c2af8ad2376f60c6411a8dbf2060f. Если нет, я советую вам создать вопрос, подробно описывающий вашу настройку?
Спасибо, я попробовал это, и это сработало, но теперь у меня возникла еще одна проблема, связанная с превышением ограничений сервера имен. Вы знаете, как это исправить? Я попытался удалить неиспользуемое развертывание, но это не сработало.