Как выставить Redis снаружи с коляской istio? - PullRequest
0 голосов
/ 17 января 2020

Я использую redis с k8s 1.15.0, istio 1.4.3, он хорошо работает внутри сети.

Однако, когда я попытался использовать шлюз istio и коляску для показа его внешней сети, это не удалось.

Затем я удалил коляску istio и просто запустил сервер redis в k8s, все заработало.

После поиска я добавил DestinationRule в конфигурацию, но это не помогло.

Так в чем же проблема? Спасибо за любые советы!

Вот мой redis.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: docker.io/redis:5.0.5-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 16379
          protocol: TCP
          name: redis-port
        volumeMounts:
        - name: redis-data
          mountPath: /data
        - name: redis-conf
          mountPath: /etc/redis
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
      volumes:
        - name: redis-conf
          configMap:
            name: redis-conf
            items:
              - key: redis.conf
                path: redis.conf
        - name: redis-data
          nfs:
            path: /data/redis
            server: 172.16.8.34

---
apiVersion: v1
kind: Service
metadata:
  name: redis-svc
  labels:
    app: redis-svc
spec:
  type: ClusterIP
  ports:
  - name: redis-port
    port: 16379
    protocol: TCP
  selector:
    app: redis

---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: redis-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: tcp
      protocol: TCP
    hosts:
    - "redis.basic.svc.cluster.local"

---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: redis-svc
spec:
  host: redis-svc

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: redis-vs
spec:
  hosts:
  - "redis.basic.svc.cluster.local"
  gateways:
  - redis-gateway
  tcp:
  - route:
    - destination:
        host: redis-svc.basic.svc.cluster.local
        port:
          number: 16379

Обновление:

Вот как я прошу

[root]# redis-cli -h redis.basic.svc.cluster.local -p 80
redis.basic.svc.cluster.local:80> get Test
Error: Protocol error, got "H" as reply type byte

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Есть несколько вещей, которые должны отличаться в случае предоставления приложения TCP с istio.

  1. hosts: должно быть "*", так как протокол TCP работает только с IP:PORT. В L4 нет заголовков.

  2. Должен быть TCP порт match Ваш VirtualService, который соответствует GateWay. Я предлагаю назвать его уникальным образом и соответствовать Deployment имени порта.

  3. Я предлагаю избегать использования порта 80, так как он уже используется в конфигурации входа по умолчанию, и это может привести к в конфликте портов, поэтому я изменил его на 11337.

Так что ваш GateWay должен выглядеть примерно так:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: redis-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 11337
      name: redis-port
      protocol: TCP
    hosts:
    - "*"

и ваш VirtualService как это:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: redis-vs
spec:
  hosts:
  - "*"
  gateways:
  - redis-gateway
  tcp:
  - match:
    - port: 11337
    route:
      - destination:
          host: redis-svc
          port:
            number: 16379

Обратите внимание, что я удалил пространства имен для ясности.

Затем добавьте наш пользовательский порт к входному шлюзу по умолчанию, используя следующую команду:

kubectl edit svc istio-ingressgateway -n istio-system

И добавьте следующие следующие определения других портов:

- name: redis-port
  nodePort: 31402
  port: 11337
  protocol: TCP
  targetPort: 16379

Для доступа к уязвимому приложению используйте внешний IP-адрес шлюза istio и только что настроенный порт.

Кому получить внешний IP-адрес вашего шлюза, который вы можете использовать:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
redis-cli -h $INGRESS_HOST -p 11337

Если вашему istio-ingressgateway не назначен внешний IP, используйте один из IP-адресов и портов вашего узла 31402.

Надеюсь, это поможет.

0 голосов
/ 17 января 2020

Спасибо за верный ответ.

Но я думаю, redis.basic.svc.cluster.local находится за пределами DNS-хоста, который должен соответствовать VirtualService, а VirtualService. host - это маршрут к службе redis-svc с полным путем к пространству имен.

Может быть, не по этой причине.

...