Я новичок в ingress-nginx, и я включил его с помощью minikube, используя minikube addons enable ingress
. При поиске сервисов, связанных с ingress-nginx, я запустил kubectl get services -n kube-system
и получил:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller-admission ClusterIP 10.96.141.138 <none> 443/TCP 16m
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 16m
Заметив, что мне не хватает 80 порта, я запустил kubectl describe service/ingress-nginx-controller-admission -n kube-system
и получил:
Name: ingress-nginx-controller-admission
Namespace: kube-system
Labels: addonmanager.kubernetes.io/mode=Reconcile
app.kubernetes.io/component=controller
app.kubernetes.io/instance=ingress-nginx
app.kubernetes.io/name=ingress-nginx
Annotations: <none>
Selector: app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type: ClusterIP
IP: 10.96.141.138
Port: https-webhook 443/TCP
TargetPort: webhook/TCP
Endpoints: 172.17.0.3:8443
Session Affinity: None
Events: <none>
При попытке доступа к конечной точке https://ingress-nginx-controller-admission.kube-system.svc.cluster.local/foo
я получаю эту ошибку:
FetchError: request to https://ingress-nginx-controller-admission.kube-system.svc.cluster.local/foo failed, reason: unable to verify the first certificate
, хотя попадание в конечную точку /foo
из пода через вход работает нормально. Я просматривал документацию по tls безрезультатно. Любая помощь в этом будет высоко оценена.
Обновлено: я добавил вывод kubectl get svc -A
для каждого запроса:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default auth-svc ClusterIP 10.100.218.231 <none> 4000/TCP 13s
default client-svc ClusterIP 10.106.143.107 <none> 3000/TCP 12s
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37m
kube-system ingress-nginx-controller-admission ClusterIP 10.96.141.138 <none> 443/TCP 36m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 37m
@ArghyaSadhu спасибо. Я обновил исходный пост этой информацией
Какая версия миникуба? Какой драйвер для миникуба?
@zigarn Я использую minikube версии 1.16.0 в Arch Linux. Я не указал драйвер, поэтому я считаю, что по умолчанию. Спасибо.
Сервис, на который вы смотрите, как следует из его названия, является Admission Controller аддона входа minikube.
Он используется Ingress Controller для анализа определений Ingress и настройки базового nginx (вы можете взглянуть на развертывание надстройки minikube ingress)
Чтобы получить доступ к незащищенным входам, которые вы, возможно, определили, вам нужно подключиться к портам 80 или 443 машины minikube (доступно через minikube ip
). (Вы можете увидеть эти порты прослушивания, выполнив minikube ssh -- docker container ls --filter label=app.kubernetes.io/name=ingress-nginx
)
Вам нужна вот эта документация: https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
Итак, если вы определили Ingress с помощью host=hello-world.info
и path=/foo
, вы сможете получить к нему доступ с помощью:
curl --header 'Host: hello-world.info' http://`minikube ip`:80/foo
Конечно, лучше определить запись DNS для сопоставления hello-world.info
с IP-адресом minikube.
Спасибо. Я должен был уточнить, что я могу нажать hello-world.info
, а также IP-адрес minikube. Я просто не могу попасть по этому IP-адресу из одного из модулей, что я пытался сделать, когда пытался нажать https://ingress-nginx-controller-admission.kube-system.svc.cluster.local/foo
. Надеюсь, это поможет прояснить мою цель. Спасибо!
Ingress больше предназначен для обслуживания вне кластера; изнутри кластера, просто используйте прямой доступ к сервису. Сервис ingress-nginx-controller-admission
не предназначен для раскрытия контроллера входящего трафика, он предназначен для внутренних механизмов входящего трафика. Если вам нужно пройти через ingress, вы должны действовать как извне: добавить DNS-запись, доступную из ваших подов, или создать свою службу на 80-м порту развертывания ingress-nginx-controller
, но тогда имя службы и host
Ingress должен совпадать.
Nginx ingress на minikube не использует службу для предоставления доступа к модулям ingress.
Он использует hostPort. Вот часть yaml модуля контроллера ingres:
$ kubectl get pod -n kube-system ingress-nginx-controller-789d9c4dc-5wnc2 -oyaml
[...]
ports:
- containerPort: 80
hostPort: 80
name: http
protocol: TCP
- containerPort: 443
hostPort: 443
name: https
protocol: TCP
- containerPort: 8443
name: webhook
protocol: TCP
[...]
Его поведение описано в справочной документации k8s api
hostPort Номер порта для предоставления на хосте. Если указано, это должен быть допустимый номер порта, 0 < x < 65536. Если указан HostNetwork, он должен соответствовать ContainerPort. Большинству контейнеров это не нужно.
Благодаря этому к входу можно легко получить доступ с помощью:
curl $(minikube ip)
running kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodePort -n kube-system
позволяет мне получить доступ к входу из модуля в кластере.
Добавить вывод
kubectl get svc -A