manifests/sni-service-template.yaml (131 lines of code) (raw):

# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Config for routing to a CloudRun service using the SNI gateway. # # This will be automated as a controller, but useful to see the actual config and also # debug or create custom entries. The controller will operate on 'create if it doesn't exist' mode, i.e. users can # either create their own config (ahead of time) or edit or patch the created config. # K_SERVICE is the first component of the CloudRun URL - example fortio-cr-icq63pqnqq-uc # WORKLOAD_NAME is the name of the CloudRun service - in this case fortio-cr # WORKLOAD_NAMESPACE is the k8s namespace where the CR service is 'attached' # TODO: replace K_SERVICE with K_SERVICE_BASE_URL, WORKLOAD_NAME with K_SERVICE # Each CloudRun service is mapped to one Service. The new K8S Gateway API is # not using DestinationRule-style subsetting, we want to represent each CR region # as a separate subset that can be selected with the Gateawy API or VirtualService. apiVersion: v1 kind: Service metadata: name: ${K_SERVICE} namespace: ${WORKLOAD_NAMESPACE} labels: service.istio.io/canonical-name: ${WORKLOAD_NAME} mesh-cloudrun: ${WORKLOAD_NAME} spec: # Service name matches the actual service name in CloudRun. # This is used to acccess only the service in cloudrun, in a region. Can be used as a subset # TODO: auto-create this if it doesn't exist, in SNIGate ports: # Port corresponds to the CloudRun app port - default is 8080 # TODO: support custom ports in cloudrun - port: 8080 name: http # TargetPort is the fixed port for the SNI router. targetPort: 15443 selector: app: ${WORKLOAD_NAME} --- # When doing auto-registration, the Service and VirtualService should be 'create if it doesn't exist', i.e. user can # customize or replace it, we'll just create the initial/default version. apiVersion: v1 kind: Service metadata: name: ${WORKLOAD_NAME} namespace: ${WORKLOAD_NAMESPACE} labels: service.istio.io/canonical-name: ${WORKLOAD_NAME} mesh-cloudrun: ${WORKLOAD_NAME} spec: ports: - port: 80 name: http targetPort: 15443 - port: 8080 name: http-8080 targetPort: 15443 - port: 8079 name: grpc targetPort: 15443 selector: app: ${WORKLOAD_NAME} --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ${WORKLOAD_NAME} namespace: ${WORKLOAD_NAMESPACE} labels: service.istio.io/canonical-name: ${WORKLOAD_NAME} mesh-cloudrun: ${WORKLOAD_NAME} spec: hosts: - ${WORKLOAD_NAME} - ${WORKLOAD_NAME}.${WORKLOAD_NAMESPACE} - ${WORKLOAD_NAME}.${WORKLOAD_NAMESPACE}.svc http: - route: - destination: host: ${K_SERVICE} --- # The registered cloudrun service only support mTLS, don't generate extra # config for 'permissive' or plain. apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ${K_SERVICE} namespace: ${WORKLOAD_NAMESPACE} spec: host: ${K_SERVICE}.${WORKLOAD_NAMESPACE}.svc.cluster.local trafficPolicy: tls: mode: ISTIO_MUTUAL --- apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: ${K_SERVICE} namespace: ${WORKLOAD_NAMESPACE} spec: selector: matchLabels: app: ${WORKLOAD_NAME} portLevelMtls: 15003: mode: STRICT --- apiVersion: networking.istio.io/v1alpha3 kind: WorkloadEntry metadata: name: ${WORKLOAD_NAME}-sni namespace: ${WORKLOAD_NAMESPACE} spec: labels: service.istio.io/canonical-name: ${WORKLOAD_NAME} app: ${WORKLOAD_NAME} serviceAccount: default address: ${SNI_GATE_IP} ports: http: 15442 --- apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: namespace: ${WORKLOAD_NAMESPACE} name: ${K_SERVICE} labels: service.istio.io/canonical-name: ${WORKLOAD_NAME} # topology.istio.io/network: hbone spec: hosts: - ${K_SERVICE}.${WORKLOAD_NAMESPACE}.svc.cluster.local location: MESH_INTERNAL ports: - number: 8080 name: http protocol: HTTP #targetPort: 15443 resolution: STATIC workloadSelector: labels: app: ${WORKLOAD_NAME} --- # Sidecar entry - when automating, it'll be 'create if missing', not reconciled, i.e. users can modify it. # This is needed until Istiod has native support for HBONE. apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: ${K_SERVICE} namespace: ${WORKLOAD_NAMESPACE} spec: workloadSelector: labels: app: ${WORKLOAD_NAME} # egress: # - hosts: # # For now, visibility only on same namespace and istio-system. # - ${WORKLOAD_NAMESPACE}/* # - istio-system/* ingress: - port: number: 15003 protocol: HTTP name: http-testsidecar2 bind: 127.0.0.1 defaultEndpoint: 127.0.0.1:8080 captureMode: NONE