Skip to content

Commit b48eec8

Browse files
committed
update grpc xds server and share eg ca cert in the infra configmap
Signed-off-by: Karol Szwaj <[email protected]>
1 parent 7e27132 commit b48eec8

12 files changed

+236
-102
lines changed

internal/infrastructure/kubernetes/infra.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ type ResourceRender interface {
3333
LabelSelector() labels.Selector
3434
ServiceAccount() (*corev1.ServiceAccount, error)
3535
Service() (*corev1.Service, error)
36-
ConfigMap() (*corev1.ConfigMap, error)
36+
ConfigMap(cert string) (*corev1.ConfigMap, error)
3737
Deployment() (*appsv1.Deployment, error)
3838
DeploymentSpec() (*egv1a1.KubernetesDeploymentSpec, error)
3939
DaemonSet() (*appsv1.DaemonSet, error)
@@ -80,11 +80,15 @@ func (i *Infra) Close() error { return nil }
8080
// createOrUpdate creates a ServiceAccount/ConfigMap/Deployment/Service in the kube api server based on the
8181
// provided ResourceRender, if it doesn't exist and updates it if it does.
8282
func (i *Infra) createOrUpdate(ctx context.Context, r ResourceRender) error {
83+
cert, err := i.getEnvoyCA(ctx)
84+
if err != nil {
85+
return fmt.Errorf("failed to fetch ca certificate for namespaced infra %s/%s: %w", i.Namespace, r.Name(), err)
86+
}
8387
if err := i.createOrUpdateServiceAccount(ctx, r); err != nil {
8488
return fmt.Errorf("failed to create or update serviceaccount %s/%s: %w", i.Namespace, r.Name(), err)
8589
}
8690

87-
if err := i.createOrUpdateConfigMap(ctx, r); err != nil {
91+
if err := i.createOrUpdateConfigMap(ctx, r, cert); err != nil {
8892
return fmt.Errorf("failed to create or update configmap %s/%s: %w", i.Namespace, r.Name(), err)
8993
}
9094

internal/infrastructure/kubernetes/infra_resource.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ import (
2424
"github.com/envoyproxy/gateway/internal/metrics"
2525
)
2626

27+
func (i *Infra) getEnvoyCA(ctx context.Context) (string, error) {
28+
secret := &corev1.Secret{}
29+
err := i.Client.Get(ctx, types.NamespacedName{
30+
Name: "envoy",
31+
Namespace: "envoy-gateway-system",
32+
}, secret)
33+
if err != nil {
34+
return "", err
35+
}
36+
return string(secret.Data["ca.crt"]), nil
37+
}
38+
2739
// createOrUpdateServiceAccount creates a ServiceAccount in the kube api server based on the
2840
// provided ResourceRender, if it doesn't exist and updates it if it does.
2941
func (i *Infra) createOrUpdateServiceAccount(ctx context.Context, r ResourceRender) (err error) {
@@ -56,7 +68,7 @@ func (i *Infra) createOrUpdateServiceAccount(ctx context.Context, r ResourceRend
5668

5769
// createOrUpdateConfigMap creates a ConfigMap in the Kube api server based on the provided
5870
// ResourceRender, if it doesn't exist and updates it if it does.
59-
func (i *Infra) createOrUpdateConfigMap(ctx context.Context, r ResourceRender) (err error) {
71+
func (i *Infra) createOrUpdateConfigMap(ctx context.Context, r ResourceRender, cert string) (err error) {
6072
var (
6173
cm *corev1.ConfigMap
6274
startTime = time.Now()
@@ -67,7 +79,7 @@ func (i *Infra) createOrUpdateConfigMap(ctx context.Context, r ResourceRender) (
6779
}
6880
)
6981

70-
if cm, err = r.ConfigMap(); err != nil {
82+
if cm, err = r.ConfigMap(cert); err != nil {
7183
resourceApplyTotal.WithFailure(metrics.StatusFailure, labels...).Increment()
7284
return err
7385
}

internal/infrastructure/kubernetes/proxy/resource.go

+61-24
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func enablePrometheus(infra *ir.ProxyInfra) bool {
8282
func expectedProxyContainers(infra *ir.ProxyInfra,
8383
containerSpec *egv1a1.KubernetesContainerSpec,
8484
shutdownConfig *egv1a1.ShutdownConfig, shutdownManager *egv1a1.ShutdownManager,
85-
namespace string, dnsDomain string, gatewayNamespaceMode bool,
85+
egNamespace string, dnsDomain string, gatewayNamespaceMode bool,
8686
) ([]corev1.Container, error) {
8787
ports := make([]corev1.ContainerPort, 0, 2)
8888
if enablePrometheus(infra) {
@@ -107,6 +107,9 @@ func expectedProxyContainers(infra *ir.ProxyInfra,
107107

108108
maxHeapSizeBytes := calculateMaxHeapSizeBytes(containerSpec.Resources)
109109

110+
if gatewayNamespaceMode {
111+
egNamespace = config.DefaultNamespace
112+
}
110113
// Get the default Bootstrap
111114
bootstrapConfigOptions := &bootstrap.RenderBootstrapConfigOptions{
112115
ProxyMetrics: proxyMetrics,
@@ -115,7 +118,7 @@ func expectedProxyContainers(infra *ir.ProxyInfra,
115118
TrustedCA: filepath.Join("/sds", common.SdsCAFilename),
116119
},
117120
MaxHeapSizeBytes: maxHeapSizeBytes,
118-
XdsServerHost: ptr.To(fmt.Sprintf("%s.%s.svc.%s", config.EnvoyGatewayServiceName, namespace, dnsDomain)),
121+
XdsServerHost: ptr.To(fmt.Sprintf("%s.%s.svc.%s", config.EnvoyGatewayServiceName, egNamespace, dnsDomain)),
119122
}
120123

121124
args, err := common.BuildProxyArgs(infra, shutdownConfig, bootstrapConfigOptions, fmt.Sprintf("$(%s)", envoyPodEnvVar), gatewayNamespaceMode)
@@ -130,7 +133,7 @@ func expectedProxyContainers(infra *ir.ProxyInfra,
130133
ImagePullPolicy: corev1.PullIfNotPresent,
131134
Command: []string{"envoy"},
132135
Args: args,
133-
Env: expectedContainerEnv(containerSpec),
136+
Env: expectedContainerEnv(containerSpec, egNamespace),
134137
Resources: *containerSpec.Resources,
135138
SecurityContext: expectedEnvoySecurityContext(containerSpec),
136139
Ports: ports,
@@ -192,7 +195,7 @@ func expectedProxyContainers(infra *ir.ProxyInfra,
192195
ImagePullPolicy: corev1.PullIfNotPresent,
193196
Command: []string{"envoy-gateway"},
194197
Args: expectedShutdownManagerArgs(shutdownConfig),
195-
Env: expectedContainerEnv(nil),
198+
Env: expectedContainerEnv(nil, egNamespace),
196199
Resources: *egv1a1.DefaultShutdownManagerContainerResourceRequirements(),
197200
TerminationMessagePolicy: corev1.TerminationMessageReadFile,
198201
TerminationMessagePath: "/dev/termination-log",
@@ -285,14 +288,14 @@ func expectedShutdownPreStopCommand(cfg *egv1a1.ShutdownConfig) []string {
285288
// expectedContainerVolumeMounts returns expected proxy container volume mounts.
286289
func expectedContainerVolumeMounts(gatewayNamespacedMode bool, containerSpec *egv1a1.KubernetesContainerSpec) []corev1.VolumeMount {
287290
var volumeMounts []corev1.VolumeMount
288-
if !gatewayNamespacedMode {
289-
certsMount := corev1.VolumeMount{
290-
Name: "certs",
291-
MountPath: "/certs",
292-
ReadOnly: true,
293-
}
294-
volumeMounts = append(volumeMounts, certsMount)
291+
292+
certsMount := corev1.VolumeMount{
293+
Name: "certs",
294+
MountPath: "/certs",
295+
ReadOnly: true,
295296
}
297+
volumeMounts = append(volumeMounts, certsMount)
298+
296299
sdsMount := corev1.VolumeMount{
297300
Name: "sds",
298301
MountPath: "/sds",
@@ -305,20 +308,39 @@ func expectedContainerVolumeMounts(gatewayNamespacedMode bool, containerSpec *eg
305308
// expectedVolumes returns expected proxy deployment volumes.
306309
func expectedVolumes(name string, gatewayNamespacedMode bool, pod *egv1a1.KubernetesPodSpec) []corev1.Volume {
307310
var volumes []corev1.Volume
311+
certsVolume := corev1.Volume{
312+
Name: "certs",
313+
VolumeSource: corev1.VolumeSource{
314+
Secret: &corev1.SecretVolumeSource{
315+
SecretName: "envoy",
316+
DefaultMode: ptr.To[int32](420),
317+
},
318+
},
319+
}
308320

309-
if !gatewayNamespacedMode {
310-
certsVolume := corev1.Volume{
321+
if gatewayNamespacedMode {
322+
certsVolume = corev1.Volume{
311323
Name: "certs",
312324
VolumeSource: corev1.VolumeSource{
313-
Secret: &corev1.SecretVolumeSource{
314-
SecretName: "envoy",
325+
ConfigMap: &corev1.ConfigMapVolumeSource{
326+
LocalObjectReference: corev1.LocalObjectReference{
327+
Name: ExpectedResourceHashedName(name),
328+
},
329+
Items: []corev1.KeyToPath{
330+
{
331+
Key: XdsTLSCaFileName,
332+
Path: XdsTLSCaFileName,
333+
},
334+
},
315335
DefaultMode: ptr.To[int32](420),
336+
Optional: ptr.To(false),
316337
},
317338
},
318339
}
319-
volumes = append(volumes, certsVolume)
320340
}
321341

342+
volumes = append(volumes, certsVolume)
343+
322344
sdsVolume := corev1.Volume{
323345
Name: "sds",
324346
VolumeSource: corev1.VolumeSource{
@@ -341,21 +363,36 @@ func expectedVolumes(name string, gatewayNamespacedMode bool, pod *egv1a1.Kubern
341363
},
342364
},
343365
}
366+
if gatewayNamespacedMode {
367+
sdsVolume = corev1.Volume{
368+
Name: "sds",
369+
VolumeSource: corev1.VolumeSource{
370+
ConfigMap: &corev1.ConfigMapVolumeSource{
371+
LocalObjectReference: corev1.LocalObjectReference{
372+
Name: ExpectedResourceHashedName(name),
373+
},
374+
Items: []corev1.KeyToPath{
375+
{
376+
Key: common.SdsCAFilename,
377+
Path: common.SdsCAFilename,
378+
},
379+
},
380+
DefaultMode: ptr.To[int32](420),
381+
Optional: ptr.To(false),
382+
},
383+
},
384+
}
385+
}
344386
volumes = append(volumes, sdsVolume)
345387
return resource.ExpectedVolumes(pod, volumes)
346388
}
347389

348390
// expectedContainerEnv returns expected proxy container envs.
349-
func expectedContainerEnv(containerSpec *egv1a1.KubernetesContainerSpec) []corev1.EnvVar {
391+
func expectedContainerEnv(containerSpec *egv1a1.KubernetesContainerSpec, egNamespace string) []corev1.EnvVar {
350392
env := []corev1.EnvVar{
351393
{
352-
Name: envoyNsEnvVar,
353-
ValueFrom: &corev1.EnvVarSource{
354-
FieldRef: &corev1.ObjectFieldSelector{
355-
APIVersion: "v1",
356-
FieldPath: "metadata.namespace",
357-
},
358-
},
394+
Name: envoyNsEnvVar,
395+
Value: egNamespace,
359396
},
360397
{
361398
Name: envoyPodEnvVar,

internal/infrastructure/kubernetes/proxy/resource_provider.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ const (
3737
// XdsTLSCaFilepath is the fully qualified path of the file containing Envoy's
3838
// trusted CA certificate.
3939
XdsTLSCaFilepath = "/certs/ca.crt"
40+
41+
// XdsTLSCertFileName is the file name of the xDS server TLS certificate.
42+
XdsTLSCaFileName = "ca.crt"
4043
)
4144

4245
type ResourceRender struct {
@@ -216,7 +219,7 @@ func (r *ResourceRender) Service() (*corev1.Service, error) {
216219
}
217220

218221
// ConfigMap returns the expected ConfigMap based on the provided infra.
219-
func (r *ResourceRender) ConfigMap() (*corev1.ConfigMap, error) {
222+
func (r *ResourceRender) ConfigMap(cert string) (*corev1.ConfigMap, error) {
220223
// Set the labels based on the owning gateway name.
221224
labels := envoyLabels(r.infra.GetProxyMetadata().Labels)
222225
if OwningGatewayLabelsAbsent(labels) {
@@ -237,6 +240,7 @@ func (r *ResourceRender) ConfigMap() (*corev1.ConfigMap, error) {
237240
Data: map[string]string{
238241
common.SdsCAFilename: common.GetSdsCAConfigMapData(XdsTLSCaFilepath),
239242
common.SdsCertFilename: common.GetSdsCertConfigMapData(XdsTLSCertFilepath, XdsTLSKeyFilepath),
243+
XdsTLSCaFileName: cert,
240244
},
241245
}, nil
242246
}

internal/infrastructure/kubernetes/proxy/resource_provider_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,7 @@ func TestConfigMap(t *testing.T) {
12431243
for _, tc := range cases {
12441244
t.Run(tc.name, func(t *testing.T) {
12451245
r := NewResourceRender(cfg.Namespace, cfg.DNSDomain, tc.infra.GetProxyInfra(), cfg.EnvoyGateway)
1246-
cm, err := r.ConfigMap()
1246+
cm, err := r.ConfigMap("")
12471247
require.NoError(t, err)
12481248

12491249
expected, err := loadConfigmap(tc.name)

internal/infrastructure/kubernetes/proxy_configmap_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func TestCreateOrUpdateProxyConfigMap(t *testing.T) {
112112
}
113113
kube := NewInfra(cli, cfg)
114114
r := proxy.NewResourceRender(kube.Namespace, kube.DNSDomain, infra.GetProxyInfra(), kube.EnvoyGateway)
115-
err := kube.createOrUpdateConfigMap(context.Background(), r)
115+
err := kube.createOrUpdateConfigMap(context.Background(), r, "")
116116
require.NoError(t, err)
117117
actual := &corev1.ConfigMap{
118118
ObjectMeta: metav1.ObjectMeta{

internal/infrastructure/kubernetes/proxy_infra.go

+4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ func (i *Infra) DeleteProxyInfra(ctx context.Context, infra *ir.Infra) error {
3737
return errors.New("infra ir is nil")
3838
}
3939

40+
if i.EnvoyGateway.GatewayNamespaceMode() && i.Namespace == "" {
41+
i.Namespace = infra.Proxy.Namespace
42+
}
43+
4044
r := proxy.NewResourceRender(i.Namespace, i.DNSDomain, infra.GetProxyInfra(), i.EnvoyGateway)
4145
return i.delete(ctx, r)
4246
}

internal/infrastructure/kubernetes/ratelimit/resource_provider.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func enablePrometheus(rl *egv1a1.RateLimit) bool {
7979
}
8080

8181
// ConfigMap returns the expected rate limit ConfigMap based on the provided infra.
82-
func (r *ResourceRender) ConfigMap() (*corev1.ConfigMap, error) {
82+
func (r *ResourceRender) ConfigMap(cert string) (*corev1.ConfigMap, error) {
8383
if !enablePrometheus(r.rateLimit) {
8484
return nil, nil
8585
}

internal/infrastructure/kubernetes/ratelimit/resource_provider_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func TestConfigmap(t *testing.T) {
197197
},
198198
}
199199
r := NewResourceRender(cfg.Namespace, cfg.EnvoyGateway, ownerReferenceUID)
200-
cm, err := r.ConfigMap()
200+
cm, err := r.ConfigMap("")
201201
require.NoError(t, err)
202202

203203
if *overrideTestData {

0 commit comments

Comments
 (0)