grpc-xds/k8s/greeter/components/bootstrap-diy-federation/patch-xds-init-diy-federation.yaml (134 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 a gRPC xDS bootstrap config file,
# with a self-managed xDS control plane management server.
apiVersion: apps/v1
kind: Deployment
metadata:
name: greeter
spec:
template:
spec:
containers:
- name: app
env:
- name: GRPC_XDS_BOOTSTRAP
value: /etc/grpc-xds/bootstrap.json
volumeMounts:
- name: grpc-xds-conf
mountPath: /etc/grpc-xds
readOnly: true
initContainers:
- name: grpc-xds-init
image: busybox
command:
- /bin/sh
- -c
- |
#
# Create the gRPC xDS bootstrap configuration file and populate it
# with values from the Pod environment and the GKE metadata server:
#
cat << EOF > /etc/grpc-xds/bootstrap.json
{
"xds_servers": [
{
"server_uri": "dns:///control-plane.xds:50051",
"channel_creds": [
{
"type": "insecure"
}
],
"server_features": [
"xds_v3",
"ignore_resource_deletion"
]
}
],
"authorities": {
"control-plane.xds.svc.cluster.example.com": {
"xds_servers": [
{
"server_uri": "dns:///control-plane.xds.svc.cluster.example.com:50051",
"channel_creds": [
{
"type": "insecure"
}
],
"server_features": [
"xds_v3",
"ignore_resource_deletion"
]
}
],
"client_listener_resource_name_template": "xdstp://control-plane.xds.svc.cluster.example.com/envoy.config.listener.v3.Listener/%s"
},
"control-plane.xds.svc.cluster2.example.com": {
"xds_servers": [
{
"server_uri": "dns:///control-plane.xds.svc.cluster2.example.com:50051",
"channel_creds": [
{
"type": "insecure"
}
],
"server_features": [
"xds_v3",
"ignore_resource_deletion"
]
}
],
"client_listener_resource_name_template": "xdstp://control-plane.xds.svc.cluster2.example.com/envoy.config.listener.v3.Listener/%s"
}
},
"node": {
"id": "$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)",
"cluster": "$(cat /etc/podinfo/label-app-name)",
"metadata": {
"INSTANCE_IP": "$(hostname -i)",
"K8S_NAMESPACE": "$(cat /etc/podinfo/namespace)",
"K8S_POD": "$(hostname -s)",
"XDS_STREAM_TYPE": "ADS"
},
"locality": {
"zone": "$(wget --header Metadata-Flavor:Google -qO- http://metadata.google.internal/computeMetadata/v1/instance/zone 2> /dev/null | cut -d/ -f4)"
}
},
"certificate_providers": {
"google_cloud_private_spiffe": {
"plugin_name": "file_watcher",
"config": {
"ca_certificate_file": "/var/run/secrets/workload-spiffe-credentials/ca_certificates.pem",
"certificate_file": "/var/run/secrets/workload-spiffe-credentials/certificates.pem",
"private_key_file": "/var/run/secrets/workload-spiffe-credentials/private_key.pem",
"refresh_interval": "600s"
}
}
},
"server_listener_resource_name_template": "grpc/server?xds.resource.listening_address=%s",
"client_default_listener_resource_name_template": "%s"
}
EOF
#
# Set `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/grpc-xds/bootstrap.json
resources:
requests:
cpu: 10m
memory: 100Mi
volumeMounts:
- name: grpc-xds-conf
mountPath: /etc/grpc-xds
- name: nodeinfo
mountPath: /etc/nodeinfo
readOnly: true
- name: podinfo
mountPath: /etc/podinfo
readOnly: true
volumes:
- name: grpc-xds-conf
emptyDir: {}
- name: nodeinfo
emptyDir: {}
- name: podinfo
downwardAPI:
# Used when creating the xDS bootstrap file.
items:
- path: label-app-name
fieldRef:
fieldPath: metadata.labels['app.kubernetes.io/name']
- path: namespace
fieldRef:
fieldPath: metadata.namespace