Введение в istio mesh

У меня была сетка Istio с отключенным mtls со следующими модулями и службами. Я использую кубеадм.

pasan@ubuntu:~$ kubectl get pods --all-namespaces
NAMESPACE       NAME                                                       READY     STATUS      RESTARTS   AGE
default         debug-tools                                                2/2       Running     0          2h
default         employee--debug-deployment-57947cf67-gwpjq                 2/2       Running     0          2h
default         employee--employee-deployment-5f4d7c9d78-sfmtx             2/2       Running     0          2h
default         employee--gateway-deployment-bc646bd84-wnqwq               2/2       Running     0          2h
default         employee--salary-deployment-d4969d6c8-lz7n7                2/2       Running     0          2h
default         employee--sts-deployment-7bb9b44bf7-lthc8                  1/1       Running     0          2h
default         hr--debug-deployment-86575cffb6-6wrlf                      2/2       Running     0          2h
default         hr--gateway-deployment-8c488ff6-827pf                      2/2       Running     0          2h
default         hr--hr-deployment-596946948d-rzc7z                         2/2       Running     0          2h
default         hr--sts-deployment-694d7cff97-4nz29                        1/1       Running     0          2h
default         stock-options--debug-deployment-68b8fccb97-4znlc           2/2       Running     0          2h
default         stock-options--gateway-deployment-64974b5fbb-rjrwq         2/2       Running     0          2h
default         stock-options--stock-deployment-d5c9d4bc8-dqtrr            2/2       Running     0          2h
default         stock-options--sts-deployment-66c4799599-xx9d4             1/1       Running     0          2h

pasan@ubuntu:~$ kubectl get services
NAME                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
employee--debug-service          ClusterIP   10.104.23.141    <none>        80/TCP              2h
employee--employee-service       ClusterIP   10.96.203.80     <none>        80/TCP              2h
employee--gateway-service        ClusterIP   10.97.145.188    <none>        80/TCP              2h
employee--salary-service         ClusterIP   10.110.167.162   <none>        80/TCP              2h
employee--sts-service            ClusterIP   10.100.145.102   <none>        8080/TCP,8081/TCP   2h
hr--debug-service                ClusterIP   10.103.81.158    <none>        80/TCP              2h
hr--gateway-service              ClusterIP   10.106.183.101   <none>        80/TCP              2h
hr--hr-service                   ClusterIP   10.107.136.178   <none>        80/TCP              2h
hr--sts-service                  ClusterIP   10.105.184.100   <none>        8080/TCP,8081/TCP   2h
kubernetes                       ClusterIP   10.96.0.1        <none>        443/TCP             2h
stock-options--debug-service     ClusterIP   10.111.51.88     <none>        80/TCP              2h
stock-options--gateway-service   ClusterIP   10.100.81.254    <none>        80/TCP              2h
stock-options--stock-service     ClusterIP   10.96.189.100    <none>        80/TCP              2h
stock-options--sts-service       ClusterIP   10.108.59.68     <none>        8080/TCP,8081/TCP   2h

Я получил доступ к этой службе с помощью модуля отладки, используя следующую команду:

curl -X GET http://hr--gateway-service.default:80/info -H "Authorization: Bearer $token" -v

Следующим шагом я включил mtls в сетке. Как и ожидалось, вышеприведенная команда curl не удалась.

Теперь я хочу настроить входной контроллер, чтобы иметь доступ к сервисной сетке, как и раньше.

Итак, я настроил шлюз и VirtualService, как показано ниже:

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: hr-ingress-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "hr--gateway-service.default"
EOF


cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: hr-ingress-virtual-service
spec:
  hosts:
  - "*"
  gateways:
  - hr-ingress-gateway
  http:
  - match:
    - uri:
        prefix: /info/
    route:
    - destination:
        port:
          number: 80
        host: hr--gateway-service
EOF

Но все же я получаю следующий результат

wso2carbon@gateway-5bd88fd679-l8jn5:~$ curl -X GET http://hr--gateway-service.default:80/info -H "Authorization: Bearer $token" -v
Note: Unnecessary use of -X or --request, GET is already inferred.
*   Trying 10.106.183.101...
* Connected to hr--gateway-service.default (10.106.183.101) port 80 (#0)
> GET /info HTTP/1.1
> Host: hr--gateway-service.default
> User-Agent: curl/7.47.0
> Accept: */*
...
* Recv failure: Connection reset by peer
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer

Не могли бы вы сообщить мне, правильно ли настроен мой входящий трафик и как я могу получить доступ к сервису с помощью curl после настройки. Мои сервисы Ingress перечислены ниже:

ingress-nginx   default-http-backend                    ClusterIP   10.105.46.168    <none>         80TCP                                                                                                                    3h
ingress-nginx   ingress-nginx                           NodePort    10.110.75.131    172.17.17.100   80:30770/TCP,443:32478/TCP
istio-ingressgateway       NodePort    10.98.243.205    <none>        80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31775/TCP,8060:32436/TCP,853:31351/TCP,15030:32149/TCP,15031:32653/TCP   3h

person Pasan W.    schedule 04.01.2019    source источник


Ответы (1)


@Pasan, чтобы применить Istio CRD (VirtualServices) к входящему трафику, вам необходимо использовать шлюз Istio Ingress в качестве точки входа, как показано здесь: https://istio.io/docs/tasks/traffic-management/ingress/

Входной шлюз - это оболочка для envoy, которую можно настроить с помощью CRD Istio.

В принципе, вам не нужен второй контроллер входящего трафика, и во время установки istio устанавливается тот, который используется по умолчанию, узнайте, выполнив:

kubectl get services -n istio-system -l app=istio-ingressgateway

и с IP шлюза Ingress выполните:

curl -X GET http://{INGRESSGATEWAY_IP}/info -H "Authorization: Bearer $token" -H "Host: hr--gateway-service.default"

Я добавил хост в качестве заголовка, как он определен в шлюзе, что означает, что вход разрешен только для этого хоста.

person Rinor    schedule 04.01.2019
comment
Привет, @rinormaloku. Я обновил свой вопрос подробностями istio-ingressgateway. Не могли бы вы подсказать, как я могу получить доступ к услуге сейчас? - person Pasan W.; 04.01.2019
comment
@PasanW. Если у вас есть IP-адрес общедоступного узла, то: curl http: // ‹public-node-ip›: ‹node-port›; В противном случае обновите SVC шлюза Ingress, чтобы предоставить вам внешний IP-адрес, изменив его тип на LoadBalancer. - person Rinor; 04.01.2019
comment
@PasanW. расширил ответ дополнительными сведениями о хосте. Это может привести к сбою /info/ используется в VirtualService, а в curl /info - person Rinor; 04.01.2019
comment
Привет @rinormaloku Как я обновил в ответе, мой входной шлюз не имеет внешнего IP-адреса. Не могли бы вы посоветовать мне, как его установить. (Я использую kubeadm на Ubuntu VirtualBox) - person Pasan W.; 04.01.2019
comment
@PasanW. выполнить kubectl edit svc {name of ingressgateway} -n istio-system и в соответствии со спецификацией изменить на type: LoadBalancer - person Rinor; 04.01.2019
comment
Я думаю, что в kubeadm нет определения, как подготовить балансировщик нагрузки. и поэтому вам действительно нужно придерживаться порта узла, разве это не работает curl -X GET http://10.98.243.205/info -H "Authorization: Bearer $token" -H "Host: hr--gateway-service.default"? - person Rinor; 04.01.2019
comment
Это работает с NodePort: curl -X GET 10.0.2.15:31380/info -H Авторизация: Bearer $ токен -v - person Pasan W.; 04.01.2019
comment
Позвольте нам продолжить это обсуждение в чате. - person Rinor; 04.01.2019