#kubernetes #istio
#kubernetes #istio
Вопрос:
У меня есть кластер k8s с входом Istio. Я развернул развертывание, службу, шлюз и виртуальную службу, но я все еще не могу получить доступ к своей службе извне кластера. Я могу получить доступ к своей службе, обратившись к рабочим на указанном узловом порту, но я ожидаю, что шлюз Istio по-прежнему будет прослушивать порт 80 на моем главном сервере, но это не похоже на это. Что я здесь делаю не так?
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: microservices-service
spec:
type: NodePort
selector:
app: microservices-deployment
ports:
- port: 5001
targetPort: 5001
nodePort: 30007
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: microservices-deployment
labels:
app: microservices-deployment
spec:
replicas: 3
template:
metadata:
name: microservices-deployment
labels:
app: microservices-deployment
spec:
containers:
- name: microservices-deployment
image: *** private docker registry ***
imagePullPolicy: Always
ports:
- containerPort: 5001
restartPolicy: Always
imagePullSecrets:
- name: regcred
selector:
matchLabels:
app: microservices-deployment
ingress.yaml:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: microservices-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: microservices
spec:
hosts:
- "*"
gateways:
- microservices-gateway
http:
- match:
route:
- destination:
host: *** master hostname ***
port:
number: 5001
Большое спасибо!
Ответ №1:
Я проверил вашу конфигурацию, и все выглядит правильно. Нужно исправить только одну маленькую ошибку — ваш виртуальный сервис.
Измените его с
http:
- match:
route:
- destination:
host: *** master hostname ***
port:
number: 5001
Для
http:
- route:
- destination:
host: microservices-service
port:
number: 5001
И вы должны иметь возможность получить к нему доступ с помощью вашего внешнего шлюза istio-ip LoadBalancer / NodePort.
Подробнее об этом здесь .
kubectl get svc -n istio-system | grep istio-ingress
Краткий пример с nginx, обратите внимание, что я использую LoadBalancer вместо NodePort.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
spec:
selector:
matchLabels:
run: nginx1
replicas: 1
template:
metadata:
labels:
run: nginx1
app: frontend
spec:
containers:
- name: nginx1
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: frontend
spec:
ports:
- port: 80
protocol: TCP
selector:
app: frontend
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: nginx-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nginx-virtual
spec:
gateways:
- nginx-gateway
hosts:
- "*"
http:
- route:
- destination:
host: nginx.default.svc.cluster.local
port:
number: 80
kubectl get svc -n istio-system | grep ingress
istio-ingressgateway LoadBalancer xx.x.xx.xxx xx.xx.xx.xx 15021:30880/TCP,80:31983/TCP,443:31510/TCP,15443:32267/TCP 2d2h
Тест с помощью curl
curl -v xx.xx.xx.xx/
GET / HTTP/1.1
HTTP/1.1 200 OK
Hello nginx1
Комментарии:
1. Я проверю это сегодня. Большое спасибо!
2. @Яаков Шами Рад помочь. Если этот или любой другой ответ решил вашу проблему, пожалуйста, отметьте его как принятый или проголосуйте за него.
3. У меня нет балансировщика нагрузки, поэтому я использую порт узла, но я даже не могу получить доступ к своему шлюзу. Я получаю IP-адрес и порт, но они недоступны как внутри сервера, так и за его пределами. Что может быть не так?
4. Какова ваша инфраструктура? Изменили ли вы тип входного шлюза istio с LoadBalancer на NodePort, как упоминалось здесь ?
5. По какой-то причине я не могу изменить тип.. У меня даже нет istioctl