2种方案可以行:
- 方案一创建2个svc不使用DestinationRule:
2.1 创建yaml
#cat bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /
route:
- destination:
host: productpage-v1
port:
number: 8080
# subset: v1
- match:
- uri:
exact: /123
route:
- destination:
host: productpage-v2
port:
number: 8080
# subset: v2
#cat v1-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: productpage-v1
labels:
app: productpage
service: productpagev1
spec:
ports:
- port: 8080
name: http
selector:
app: productpagev1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpagev1
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpagev1
version: v1
template:
metadata:
labels:
app: productpagev1
version: v1
spec:
containers:
- name: productpage
image: argoproj/rollouts-demo:blue
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
---
kind: Service
metadata:
name: productpage-v2
labels:
app: productpagev2
service: productpagev2
spec:
ports:
- port: 8080
name: http
selector:
app: productpagev2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v2
labels:
app: productpagev2
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: productpagev2
version: v2
template:
metadata:
labels:
app: productpagev2
version: v2
spec:
containers:
- name: productpage
image: tomcat
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
---
启动:
kubectl apply -f ./
访问:lb地址/123 到tomcat
访问:lb地址/ 到argo
- 方式二一个svc,2个deployment使用DestinationRule:
3.1 yaml文件:
#cat bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /
route:
- destination:
host: productpage-v1
# host: rollout-destrule
# port:
# number: 8080
subset: v1
- match:
- uri:
exact: /123
route:
- destination:
host: productpage-v1
# port:
# number: 8080
subset: v2
#cat v1-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: productpage-v1
labels:
app: productpage
service: productpage
spec:
ports:
- port: 8080
name: http
selector:
app: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
labels:
app: productpage
version: v1
spec:
containers:
- name: productpage
image: argoproj/rollouts-demo:blue
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
---
#cat v2-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v2
labels:
app: productpage
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v2
template:
metadata:
labels:
app: productpage
version: v2
spec:
containers:
- name: productpage
image: tomcat
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 5m
---
#cat dr.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: rollout-destrule
spec:
host: productpage-v1
subsets:
- name: v1 # referenced in canary.trafficRouting.istio.destinationRule.canarySubsetName
labels: # labels will be injected with canary rollouts-pod-template-hash value
version: v1
- name: v2 # referenced in canary.trafficRouting.istio.destinationRule.stableSubsetName
labels: # labels will be injected with stable rollouts-pod-template-hash value
version: v2
启动:
kubectl apply -f ./
访问:lb地址/123 到tomcat
访问:lb地址/ 到argo
当然可以在VirtualService中加上权重实现流量比例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: helloworld
spec:
hosts:
- helloworld
http:
- route:
- destination:
host: helloworld
subset: v1
weight: 90
- destination:
host: helloworld
subset: v2
weight: 10