grpc-xds/k8s/envoy/base/patch-config.yaml (127 lines of code) (raw):
# Copyright 2023 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
#
# http://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.
# Patch to add an init container that creates an Envoy proxy config file,
# configuring Envoy to fetch dynamic configuration from an xDS control plane
# management server.
apiVersion: apps/v1
kind: Deployment
metadata:
name: envoy
spec:
template:
spec:
containers:
- name: app
volumeMounts:
- name: envoy-conf
mountPath: /etc/envoy
readOnly: true
- name: nodeinfo
mountPath: /etc/nodeinfo
readOnly: true
- name: podinfo
mountPath: /etc/podinfo
readOnly: true
initContainers:
- name: envoy-conf-init
image: busybox
command:
- /bin/sh
- -c
- |
#
# Create the Envoy proxy configuration file and populate it
# with values from the Pod environment and the GKE metadata server:
#
cat << EOF > /etc/envoy/envoy.yaml
node:
cluster: $(cat /etc/podinfo/label-app-name)
id: $(cat /proc/sys/kernel/random/uuid)~$(hostname -i)
locality:
zone: $(wget --header Metadata-Flavor:Google -qO- http://metadata.google.internal/computeMetadata/v1/instance/zone 2> /dev/null | cut -d/ -f4)
metadata:
INSTANCE_IP: $(hostname -i)
K8S_NAMESPACE: $(cat /etc/podinfo/namespace)
K8S_POD: $(hostname -s)
XDS_STREAM_TYPE: ADS
dynamic_resources:
ads_config:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
cds_config:
resource_api_version: V3
ads: {}
lds_config:
resource_api_version: V3
ads: {}
static_resources:
clusters:
- name: xds_cluster
type: STRICT_DNS
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
connect_timeout: 10s
load_assignment:
cluster_name: xds_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: control-plane.xds.svc.cluster.example.com
port_value: 50051
secrets:
- name: upstream_cert
tls_certificate:
certificate_chain:
filename: /var/run/secrets/workload-spiffe-credentials/certificates.pem
private_key:
filename: /var/run/secrets/workload-spiffe-credentials/private_key.pem
- name: upstream_validation
validation_context:
trusted_ca:
filename: /var/run/secrets/workload-spiffe-credentials/ca_certificates.pem
- name: downstream_cert
tls_certificate:
certificate_chain:
filename: /etc/envoy-ssl/certificates.pem
private_key:
filename: /etc/envoy-ssl/private_key.pem
- name: downstream_validation
validation_context:
trusted_ca:
filename: /etc/envoy-ssl/ca_certificates.pem
admin:
address:
socket_address:
address: 0.0.0.0
port_value: 19000
EOF
#
# Set `node.locality.zone` from a file if the GKE metadata server is unavailable,
# e.g., when running on a local kind cluster. Also handle the special cases of
# Cloud Workstations (https://cloud.google.com/workstations/docs) and
# gLinux Rodete (https://cloud.google.com/blog/topics/developers-practitioners/how-google-got-to-rolling-linux-releases-for-desktops).
#
wget --header Metadata-Flavor:Google --spider -q http://metadata.google.internal/computeMetadata/v1/instance/zone 2> /dev/null \
&& ( ! wget --header Metadata-Flavor:Google -qO- http://metadata.google.internal/computeMetadata/v1/instance/tags 2> /dev/null | grep '"cloud-workstations-instance"' > /dev/null ) \
&& grep -v rodete <(uname -r) > /dev/null \
|| sed -i "s/zone: .*$/zone: $(cat /etc/nodeinfo/zone)/" /etc/envoy/envoy.yaml
resources:
requests:
cpu: 10m
memory: 100Mi
volumeMounts:
- name: envoy-conf
mountPath: /etc/envoy
- name: nodeinfo
mountPath: /etc/nodeinfo
readOnly: true
- name: podinfo
mountPath: /etc/podinfo
readOnly: true
volumes:
- name: envoy-conf
emptyDir: {}
- name: nodeinfo
emptyDir: {}
- name: podinfo
downwardAPI:
# Used when creating the Envoy proxy configuration file.
items:
- path: label-app-name
fieldRef:
fieldPath: metadata.labels['app.kubernetes.io/name']
- path: namespace
fieldRef:
fieldPath: metadata.namespace