apiVersion: v1
kind: Namespace
metadata:
  name: colors
  labels:
    mesh: colors
    gateway: colors-gw
    appmesh.k8s.aws/sidecarInjectorWebhook: enabled
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: Mesh
metadata:
  name: colors
spec:
  namespaceSelector:
    matchLabels:
      mesh: colors
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualGateway
metadata:
  name: colors-gw
  namespace: colors
spec:
  namespaceSelector:
    matchLabels:
      gateway: colors-gw
  podSelector:
    matchLabels:
      app: colors-gw
  listeners:
    - portMapping:
        port: 8080
        protocol: http
    - portMapping:
        port: 8090
        protocol: http
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: GatewayRoute
metadata:
  name: gateway-route-main
  namespace: colors
spec:
  httpRoute:
    match:
      prefix: /
      port: 8090
    action:
      target:
        virtualService:
          virtualServiceRef:
            name: color-headers
        port: 8090
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: GatewayRoute
metadata:
  name: gateway-route-misc
  namespace: colors
spec:
  httpRoute:
    match:
      prefix: /
      port: 8080
    action:
      target:
        virtualService:
          virtualServiceRef:
            name: color-headers
        port: 8080
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
  name: multi-colors
  namespace: colors
spec:
  podSelector:
    matchLabels:
      app: color
  listeners:
    - portMapping:
        port: 8080
        protocol: http
      healthCheck:
        protocol: http
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 2
        timeoutMillis: 2000
        intervalMillis: 5000
    - portMapping:
        port: 8090
        protocol: http
      healthCheck:
        protocol: http
        path: '/ping'
        healthyThreshold: 2
        unhealthyThreshold: 2
        timeoutMillis: 2000
        intervalMillis: 5000
  serviceDiscovery:
    dns:
      hostname: color-white.colors.svc.cluster.local
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualService
metadata:
  name: color-headers
  namespace: colors
spec:
  awsName: color-headers.colors.svc.cluster.local
  provider:
    virtualRouter:
      virtualRouterRef:
        name: color-headers
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
  namespace: colors
  name: color-headers
spec:
  listeners:
    - portMapping:
        port: 8080
        protocol: http
    - portMapping:
        port: 8090
        protocol: http
  routes:
    - name: color-route-white
      httpRoute:
        match:
          prefix: /
          port: 8080
        action:
          weightedTargets:
            - virtualNodeRef:
                name: multi-colors
              weight: 1
              port: 8080
    - name: color-route-black
      httpRoute:
        match:
          prefix: /
          port: 8090
        action:
          weightedTargets:
            - virtualNodeRef:
                name: multi-colors
              weight: 1
              port: 8090
---
apiVersion: v1
kind: Service
metadata:
  name: color-white
  namespace: colors
spec:
  ports:
    - port: 8080
      name: main
    - port: 8090
      name: misc
  selector:
    app: color
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: white
  namespace: colors
spec:
  replicas: 1
  selector:
    matchLabels:
      app: color
  template:
    metadata:
      labels:
        app: color
    spec:
      containers:
        - name: app
          image: public.ecr.aws/b7m0w2t6/multiportapp:1.2.0
          ports:
            - containerPort: 8080
              name: main
            - containerPort: 8090
              name: misc
          env:
            - name: "PORT1"
              value: "8080"
            - name: "PORT2"
              value: "8090"
---
apiVersion: v1
kind: Service
metadata:
  name: color-headers
  namespace: colors
spec:
  ports:
    - port: 8080
      name: http
---
apiVersion: v1
kind: Service
metadata:
  name: colors-gw-1
  namespace: colors
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8080
  selector:
    app: colors-gw
---
apiVersion: v1
kind: Service
metadata:
  name: colors-gw-2
  namespace: colors
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 8090
  selector:
    app: colors-gw
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: colors-gw
  namespace: colors
spec:
  replicas: 1
  selector:
    matchLabels:
      app: colors-gw
  template:
    metadata:
      labels:
        app: colors-gw
    spec:
      containers:
        - name: envoy
          image: 840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy # public envoy image
          ports:
            - containerPort: 8080
              name: main
            - containerPort: 8090
              name: misc
