Расширенная маршрутизация#
Ниже приведен пример настройки расширенной маршрутизации с помощью ресурса VirtualServer для приложения "cafe" из примера настройки базовой конфигурации.
Внесены следующие изменения:
Вместо одной версии сервиса
tea
теперь две:tea-post-svc
иtea-svc
. POST-запросы дляtea
направляются вtea-post-svc
. Остальные запросы (например, GET) направляются вtea-svc
.Вместо одной версии сервиса
coffee
теперь две:coffee-v1-svc
иcoffee-v2-svc
. Запросы, содержащие cookieversion=v2
, направляются вcoffee-v2-svc
. Все остальные запросы направляются вcoffee-v1-svc
.Для упрощения из примера удалена поддержка TLS.
Предварительные действия#
Установите ANIC с включенными пользовательскими ресурсами.
Сохраните публичный IP-адрес ANIC в переменной оболочки:
$ IC_IP=XXX.YYY.ZZZ.III
Сохраните HTTP-порт ANIC в переменной оболочки:
$ IC_HTTP_PORT=<номер порта>
Настройка расширенной маршрутизации#
Создайте Deployment и Service для для
coffee
иtea
:apiVersion: apps/v1 kind: Deployment metadata: name: coffee-v1 spec: replicas: 1 selector: matchLabels: app: coffee-v1 template: metadata: labels: app: coffee-v1 spec: containers: - name: coffee-v1 image: angiesoftware/angie-hello:plain-text ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: coffee-v1-svc spec: ports: - port: 80 targetPort: 8080 protocol: TCP name: http selector: app: coffee-v1 --- apiVersion: apps/v1 kind: Deployment metadata: name: coffee-v2 spec: replicas: 1 selector: matchLabels: app: coffee-v2 template: metadata: labels: app: coffee-v2 spec: containers: - name: coffee-v2 image: angiesoftware/angie-hello:plain-text ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: coffee-v2-svc spec: ports: - port: 80 targetPort: 8080 protocol: TCP name: http selector: app: coffee-v2 --- apiVersion: apps/v1 kind: Deployment metadata: name: tea-post spec: replicas: 1 selector: matchLabels: app: tea-post template: metadata: labels: app: tea-post spec: containers: - name: tea-post image: angiesoftware/angie-hello:plain-text ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: tea-post-svc spec: ports: - port: 80 targetPort: 8080 protocol: TCP name: http selector: app: tea-post --- apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 1 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: angiesoftware/angie-hello:plain-text ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 8080 protocol: TCP name: http selector: app: tea
Примените настройки:
$ kubectl create -f cafe.yaml
Создайте ресурс VirtualServer:
apiVersion: k8s.angie.software/v1 kind: VirtualServer metadata: name: cafe spec: host: cafe.example.com upstreams: - name: tea-post service: tea-post-svc port: 80 - name: tea service: tea-svc port: 80 - name: coffee-v1 service: coffee-v1-svc port: 80 - name: coffee-v2 service: coffee-v2-svc port: 80 routes: - path: /tea authRequest: /auth/path authRequestSets: - key: foo value: bar matches: - conditions: - variable: $request_method value: POST action: pass: tea-post action: pass: tea-post - path: /coffee matches: - conditions: - cookie: version value: v2 action: pass: coffee-v2 action: pass: coffee-v1 authRequestLocations: - path: /auth/path proxyPass: upstreamName: "tea" proxyPassHeaders: - key: Content-Length value: "100"
Примените настройки:
$ kubectl create -f cafe-virtual-server.yaml
Протестируйте конфигурацию.
Проверьте, что конфигурация была успешно применена, просмотрев события ресурса VirtualServer:
$ kubectl describe virtualserver cafe
Вывод:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal AddedOrUpdated 2s ANIC Configuration for default/cafe was added or updated
Протестируйте доступ к сервису
tea
.Отправьте POST-запрос и убедитесь, что ответ приходит от
tea-post-svc
:$ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/tea -X POST
Ожидаемый результат:
Server address: 10.16.1.188:80 Server name: tea-post-b5dd479b4-6ssmh . . .
Отправьте GET-запрос и убедитесь, что ответ приходит от
tea-svc
:$ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/tea
Ожидаемый результат:
Server address: 10.16.1.189:80 Server name: tea-7d57856c44-2hsvr . . .
Протестируйте доступ к сервису
coffee
.Отправьте запрос с cookie
version=v2
и убедитесь, что ответ приходит отcoffee-v2-svc
:$ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/coffee --cookie "version=v2"
Ожидаемый результат:
Server address: 10.16.1.187:80 Server name: coffee-v2-7fd446968b-vkthp . . .
Отправьте запрос без cookie и убедитесь, что ответ приходит от
coffee-v1-svc
:$ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/coffee
Ожидаемый результат:
Server address: 10.16.0.153:80 Server name: coffee-v1-78754bdcfb-bs9nh . . .