Я развернул модули со своим сервисом и получаю: не удалось подключиться к порту 80
У меня есть кластер кубернетов на GCP, состоящий из двух узлов. У меня есть pod -> mycha-deploy, с сервисом -> mycha-svc, также у меня есть pod nginx-controller с сервисом nginx-svc. Когда я пытаюсь подключиться к пакетам или службам, я продолжаю получать: соединение с портом 80 отказано. Когда я просматриваю главный IP-адрес, я ничего не получаю. Что-то мне не хватает в конфигурации? Спасибо.
# mycha-deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: mycha-deploy
labels:
app: mycha-app
spec:
replicas: 1
selector:
matchLabels:
app: mycha-app
template:
metadata:
labels:
app: mycha-app
spec:
containers:
- name: mycha-container
image: us.gcr.io/########/mycha-frontend_kubernetes_rrk8s
ports:
- containerPort: 80
#mycha-svc
apiVersion: v1
kind: Service
metadata:
name: mycha-svc
labels:
app: mycha-app
spec:
selector:
app: mycha-app
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
#nginx-controller
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-controller
spec:
replicas: 1
selector:
matchLabels:
name: nginx-ingress
template:
metadata:
labels:
name: nginx-ingress
spec:
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.27.0
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
#nignx-svc
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
name: nginx-ingress
##nginx-resource
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mycha-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: mycha-svc
servicePort: 80
-----
kubectl describe svc nginx-ingress
Name: nginx-ingress
Namespace: default
Labels: app.kubernetes.io/name=ingress-nginx
app.kubernetes.io/part-of=ingress-nginx
Annotations: <none>
Selector: name=nginx-ingress
Type: NodePort
IP: 10.107.186.83
Port: http 80/TCP
TargetPort: 80/TCP
NodePort: http 32606/TCP
Endpoints: 10.244.1.3:80
Port: https 443/TCP
TargetPort: 443/TCP
NodePort: https 31481/TCP
Endpoints: 10.244.1.3:443
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
-------
kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/mycha-deploy-5f9b6f5c46-jjdhq 1/1 Running 0 76m
pod/nginx-controller-5c45cf6d5c-dpp44 1/1 Running 0 60m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 100m
service/mycha-svc ClusterIP 10.103.188.25 <none> 80/TCP 68m
service/nginx-ingress NodePort 10.107.186.83 <none> 80:32606/TCP,443:31481/TCP 51m
------
sudo lsof -i -P -n | grep LISTEN
systemd-r 890 systemd-resolve 13u IPv4 16536 0t0 TCP 127.0.0.53:53 (LISTEN)
splunkd 1111 root 4u IPv4 25377 0t0 TCP *:8089 (LISTEN)
sshd 1842 root 3u IPv4 23916 0t0 TCP *:22 (LISTEN)
sshd 1842 root 4u IPv6 23931 0t0 TCP *:22 (LISTEN)
kube-cont 22737 root 5u IPv6 116157110 0t0 TCP *:10252 (LISTEN)
kube-cont 22737 root 6u IPv4 116157116 0t0 TCP 127.0.0.1:10257 (LISTEN)
kube-prox 23291 root 8u IPv6 116256894 0t0 TCP *:31481 (LISTEN)
kube-prox 23291 root 11u IPv6 116256895 0t0 TCP *:32606 (LISTEN)
kube-prox 23291 root 16u IPv6 116164057 0t0 TCP *:10256 (LISTEN)
kube-prox 23291 root 17u IPv4 116164061 0t0 TCP 127.0.0.1:10249 (LISTEN)
etcd 23380 root 3u IPv4 116158620 0t0 TCP 10.242.6.2:2380 (LISTEN)
etcd 23380 root 5u IPv4 116158624 0t0 TCP 10.242.6.2:2379 (LISTEN)
etcd 23380 root 6u IPv4 116158625 0t0 TCP 127.0.0.1:2379 (LISTEN)
etcd 23380 root 11u IPv4 116157996 0t0 TCP 127.0.0.1:2381 (LISTEN)
kube-sche 23803 root 5u IPv6 116159474 0t0 TCP *:10251 (LISTEN)
kube-sche 23803 root 6u IPv4 116159480 0t0 TCP 127.0.0.1:10259 (LISTEN)
kube-apis 24180 root 5u IPv6 116163385 0t0 TCP *:6443 (LISTEN)
node 27844 robertorios 20u IPv4 116024875 0t0 TCP 127.0.0.1:38509 (LISTEN)
kubelet 30601 root 10u IPv4 116038855 0t0 TCP 127.0.0.1:33119 (LISTEN)
kubelet 30601 root 17u IPv6 116038993 0t0 TCP *:10250 (LISTEN)
kubelet 30601 root 31u IPv4 116038997 0t0 TCP 127.0.0.1:10248 (LISTEN)
Спасибо.
4 ответа
В GKE можно использовать два типа Ingress. ОдинNginx Ingress
который вы, вероятно, хотели использовать на основе аннотации kubernetes.io/ingress.class: "nginx"
. Второй - GKE Ingress.
1. GKE Ingress
Когда вы хотите использовать GKE Ingress
вам нужно указать свою услугу как NodePort
и применить Ingress
. На основе ваших YAML я воспроизвел это.
Поскольку вы использовали свое собственное изображение, Ive использовал изображение nginx.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mycha-deploy
labels:
app: mycha-app
spec:
replicas: 1
selector:
matchLabels:
app: mycha-app
template:
metadata:
labels:
app: mycha-app
spec:
containers:
- name: mycha-container
image: nginx
ports:
- containerPort: 80
---
#added type: Nodeport
apiVersion: v1
kind: Service
metadata:
name: mycha-svc
labels:
app: mycha-app
spec:
type: NodePort
selector:
app: mycha-app
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
---
#removed annotation, as here we are using GKE Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mycha-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: mycha-svc
servicePort: 80
deployment.apps/mycha-deploy created
service/mycha-svc created
ingress.extensions/mycha-ingress created
Вы должны увидеть результат, как показано ниже:
$ kubectl get pods,svc,ing
NAME READY STATUS RESTARTS AGE
pod/mycha-deploy-685f894996-xbbnv 1/1 Running 0 38s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.99.0.1 <none> 443/TCP 33d
service/mycha-svc NodePort 10.99.13.51 <none> 80:30808/TCP 39s
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/mycha-ingress * 34.107.251.59 80 3m3s
Теперь у вас должна быть возможность скручивать файл svc.
$ curl 34.107.251.59
...
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
Поскольку вы используете GKE Ingress, ваш Ingress
автоматически получит ВНЕШНИЙ IP. Если ты будешь держатьservice
как ClusterIP
он не получит никаких Address
.
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
mycha-ingress * 80 34m
Обратите внимание, что в манифесте службы используется тип NodePort. Это обязательный тип для Ingress, который используется для настройки балансировщика нагрузки HTTP(S). Более подробную информацию можно найти здесь.
2. Nginx Ingress на GKE
Когда вы используете Nginx Ingress
вы можете указать свою услугу как ClusterIP
или NodePort
.
Для этого вам нужно правильно развернуть Nginx Ingress
. Хорошо tutorail можно найти здесь, однако он немного устарел. Я публикую ниже обновленные шаги:
- Установите Helm v3. Эта версия не требует
tiller
. - Добавьте соответствующий репозиторий для
Helm 3
. Подробности можно найти здесь.
Добавление и обновление репо:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
- Примените свой deploymnet и сервис (
NodePort
илиClusterIP
, с помощьюNginx Ingress
оба типа будут работать). - Развернуть
Nginx Ingress
с помощью$ helm install --name nginx-ingress stable/nginx-ingress
. Это создаст 2deployments
и 2services
. Одна из служб будет создана какLoadBalancer
. - Развернуть Ingress
С annotation.kubernetes.io/ingress.class: "nginx"
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mycha-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: mycha-svc
servicePort: 80
У вас должен получиться такой вывод:
$ kk get pods,svc,ing
NAME READY STATUS RESTARTS AGE
pod/mycha-deploy-c469dc58b-mdp6d 1/1 Running 0 2m41s
pod/nginx-ingress-controller-5d47f75dfc-d6xnl 1/1 Running 0 7m18s
pod/nginx-ingress-default-backend-f5b888f7d-rf5cx 1/1 Running 0 7m18s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.99.0.1 <none> 443/TCP 33d
service/mycha-svc ClusterIP 10.99.8.140 <none> 80/TCP 2m12s
service/nginx-ingress-controller LoadBalancer 10.99.11.177 34.90.172.116 80:31593/TCP,443:30104/TCP 7m19s
service/nginx-ingress-default-backend ClusterIP 10.99.7.106 <none> 80/TCP 7m19s
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/mycha-ingress * 80 17s
Твой Ingress
не получит никаких Address
как service/nginx-ingress-controller
будет работать как LoadBalancer.
Теперь вы можете проверить, все ли работает, с помощью curl.
$ curl 34.90.172.116
<!DOCTYPE html>
...
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
Я обнаружил свою проблему: служба, которую я использовал, - это служба узла, работающая на порте 3000. Мне пришлось добавить containerPort: 3000 для развертывания и targetPort: 3000 для службы. Спасибо за вашу помощь
У вас должна быть возможность получить доступ к службе через nodeport и общедоступный IP-адрес рабочего узла, на котором развернут входной контроллер nginx. Это потому, что вы развернули вход nginx как nodeport.
curl http://public-ip-of-worker-node:32606
Путь: 1
После развертывания контроллера входящего трафика Nginx вам необходимо настроить ingress
который перенаправит ваш трафик на сервис.
Поток будет выглядеть примерно так: правило входа> служба> развертывание> модуль.
Для получения дополнительной информации вы можете проверить это руководство на Digital Ocean: Нажмите здесь
Путь: 2
Если вы хотите напрямую предоставить службу, вы можете обновить тип службы для балансировщика нагрузки и использовать этот IP-адрес для прямого доступа к службе.
Чтобы представить через службу в качестве балансировщика нагрузки, вы можете проверить это: Нажмите здесь