--- apiVersion: v1 kind: Namespace metadata: name: ${APP_NAMESPACE} labels: mesh: ${MESH_NAME} appmesh.k8s.aws/sidecarInjectorWebhook: enabled --- apiVersion: appmesh.k8s.aws/v1beta2 kind: Mesh metadata: name: ${MESH_NAME} spec: egressFilter: type: ALLOW_ALL namespaceSelector: matchLabels: mesh: ${MESH_NAME} --- apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualNode metadata: name: front namespace: ${APP_NAMESPACE} spec: podSelector: matchLabels: app: front listeners: - portMapping: port: 8080 protocol: http healthCheck: protocol: http path: '/ping' healthyThreshold: 2 unhealthyThreshold: 2 timeoutMillis: 2000 intervalMillis: 5000 backends: - virtualService: virtualServiceRef: name: color serviceDiscovery: dns: hostname: front.${APP_NAMESPACE}.svc.cluster.local --- apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualNode metadata: name: blue namespace: ${APP_NAMESPACE} spec: podSelector: matchLabels: app: color version: blue listeners: - portMapping: port: 8080 protocol: http healthCheck: protocol: http path: '/ping' healthyThreshold: 2 unhealthyThreshold: 2 timeoutMillis: 2000 intervalMillis: 5000 serviceDiscovery: dns: hostname: color-blue.${APP_NAMESPACE}.svc.cluster.local --- apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualNode metadata: name: green namespace: ${APP_NAMESPACE} spec: podSelector: matchLabels: app: color version: green listeners: - portMapping: port: 8080 protocol: http healthCheck: protocol: http path: '/ping' healthyThreshold: 2 unhealthyThreshold: 2 timeoutMillis: 2000 intervalMillis: 5000 serviceDiscovery: dns: hostname: color-green.${APP_NAMESPACE}.svc.cluster.local --- apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualService metadata: name: color namespace: ${APP_NAMESPACE} spec: awsName: color.${APP_NAMESPACE}.svc.cluster.local provider: virtualRouter: virtualRouterRef: name: color-router --- apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualRouter metadata: namespace: ${APP_NAMESPACE} name: color-router spec: listeners: - portMapping: port: 8080 protocol: http routes: - name: color-route httpRoute: match: prefix: / action: weightedTargets: - virtualNodeRef: name: blue weight: 1 - virtualNodeRef: name: green weight: 1 --- apiVersion: v1 kind: Service metadata: name: front namespace: ${APP_NAMESPACE} spec: ports: - port: 8080 protocol: TCP selector: app: front --- apiVersion: apps/v1 kind: Deployment metadata: name: front namespace: ${APP_NAMESPACE} spec: replicas: 5 selector: matchLabels: app: front template: metadata: labels: app: front spec: containers: - name: app image: ${FRONT_APP_IMAGE} ports: - name: app-port containerPort: 8080 readinessProbe: httpGet: path: /ping port: app-port initialDelaySeconds: 1 periodSeconds: 5 failureThreshold: 1 livenessProbe: httpGet: path: /ping port: app-port initialDelaySeconds: 1 periodSeconds: 5 failureThreshold: 1 env: - name: "COLOR_HOST" value: "color.${APP_NAMESPACE}.svc.cluster.local:8080" --- apiVersion: v1 kind: Service metadata: name: color-green namespace: ${APP_NAMESPACE} spec: ports: - port: 8080 name: http selector: app: color version: green --- apiVersion: apps/v1 kind: Deployment metadata: name: green namespace: ${APP_NAMESPACE} spec: replicas: 1 selector: matchLabels: app: color version: green template: metadata: labels: app: color version: green spec: containers: - name: app image: ${COLOR_APP_IMAGE} ports: - containerPort: 8080 env: - name: "COLOR" value: "green" --- apiVersion: v1 kind: Service metadata: name: color-blue namespace: ${APP_NAMESPACE} spec: ports: - port: 8080 name: http selector: app: color version: blue --- apiVersion: apps/v1 kind: Deployment metadata: name: blue namespace: ${APP_NAMESPACE} spec: replicas: 1 selector: matchLabels: app: color version: blue template: metadata: annotations: appmesh.k8s.aws/mesh: ${MESH_NAME} labels: app: color version: blue spec: containers: - name: app image: ${COLOR_APP_IMAGE} ports: - containerPort: 8080 env: - name: "COLOR" value: "blue" --- apiVersion: v1 kind: Service metadata: name: color namespace: ${APP_NAMESPACE} spec: ports: - port: 8080 name: http selector: app: color --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: color namespace: ${APP_NAMESPACE} annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/healthcheck-path: /color alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 10080}]' spec: rules: - http: paths: - backend: service: name: front port: number: 8080 path: /color pathType: Exact