1.Установите Istio (1.0.2)
kubectl apply -f https://raw.githubusercontent.com/knative/serving/master/third_party/istio-1.0.2/istio-crds.yaml
kubectl apply -f https://raw.githubusercontent.com/knative/serving/master/third_party/istio-1.0.2/istio.yaml
2.Создайте два Deployment
с и соответствующие им Service
с
# Create Deployments
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-a
spec:
selector:
matchLabels:
app: a
replicas: 3
template:
metadata:
labels:
app: a
spec:
containers:
- name: print
image: gcr.io/invertible-lens-220304/print
env:
- name: TEXT_TO_PRINT
value: "AAAAAAAAAAAAAAAAAAAA"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-b
spec:
selector:
matchLabels:
app: b
replicas: 3
template:
metadata:
labels:
app: b
spec:
containers:
- name: print
image: gcr.io/invertible-lens-220304/print
env:
- name: TEXT_TO_PRINT
value: "BBBBBBBBBBBBBBBBBBBB"
EOF
# Create Services
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: service-a
spec:
ports:
- port: 80
protocol: TCP
selector:
app: a
---
apiVersion: v1
kind: Service
metadata:
name: service-b
spec:
ports:
- port: 80
protocol: TCP
selector:
app: b
EOF
3.Создайте два Gateway
s и соответствующие им NodePorts
# Create gateways
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: gateway-a
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 3001
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: gateway-b
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 3002
name: http
protocol: HTTP
hosts:
- "*"
EOF
# Add ports to the istio-ingressgateway service
kubectl patch service istio-ingressgateway -n istio-system --type json --patch "$(cat <<EOF
[{
"op" : "add" ,
"path" : "/spec/ports/-" ,
"value" : {
"name" : "node-port-1",
"nodePort" : 30001,
"port": 3001,
"protocol": "TCP",
"targetPort": 3001
}
}, {
"op" : "add" ,
"path" : "/spec/ports/-" ,
"value" : {
"name" : "node-port-2",
"nodePort" : 30002,
"port": 3002,
"protocol": "TCP",
"targetPort": 3002
}
}]
EOF)"
4.Создайте VirtualService
с для каждого Gateway
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtualservice-a
namespace: istio-system
spec:
gateways:
- gateway-a
hosts:
- example.com
http:
- match:
- authority:
exact: example.com
route:
- destination:
host: service-a.default.svc.cluster.local
port:
number: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtualservice-b
namespace: istio-system
spec:
gateways:
- gateway-b
hosts:
- example.com
http:
- match:
- authority:
exact: example.com
route:
- destination:
host: service-b.default.svc.cluster.local
port:
number: 80
EOF
5.Тест
NODE_IP=$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[1].address}")
curl $NODE_IP:30001 -H "Host: example.com"
# Result: AAAAAAAAAAAAAAAAAAAA
curl $NODE_IP:30002 -H "Host: example.com"
# Result: AAAAAAAAAAAAAAAAAAAA
kubectl delete virtualservice virtualservice-a -n istio-system
curl $NODE_IP:30001 -H "Host: example.com"
# Result: BBBBBBBBBBBBBBBBBBBB
curl $NODE_IP:30002 -H "Host: example.com"
# Result: BBBBBBBBBBBBBBBBBBBB
Поскольку 30001
связан с gateway-a
, где virtualservice-a
указывает на service-a
, а 30002
связан с gateway-b
, который имеет virtualservice-b
до service-b
, я бы ожидал, что результат будет:
curl $NODE_IP:30001 -H "Host: example.com"
# Result: AAAAAAAAAAAAAAAAAAAA
curl $NODE_IP:30002 -H "Host: example.com"
# Result: BBBBBBBBBBBBBBBBBBBB
Что случилось и как я могу заставить его работать?
PS
- Iзнаю, что это возможно с двумя
istio-ingressgateway
развертываниями, но могу ли я достичь тех же результатов только с одним? - Другая возможность состоит в том, чтобы использовать только одну
VirtualService
и одну Gateway
и установить port
в HTTPMatchRequest
, но это все же не то, что я хочу. - Да, яхотите, чтобы имена хостов были одинаковыми.Разве шлюзы не изолированы друг от друга?
Мне нужно иметь два шлюза на разных портах с одинаковым istio-proxy
(docker.io/istio/proxyv2:1.0.2) развертывание, со своими собственными соответствующими наборами виртуальных сервисов, не влияя друг на друга.Это возможно?