Skip to content

Commit 27ffec1

Browse files
authored
Merge pull request #70 from zvlb/main
Add logic for add opaque secrets to envoy sDS
2 parents a429c8a + 9e7aa57 commit 27ffec1

File tree

5 files changed

+115
-56
lines changed

5 files changed

+115
-56
lines changed

controllers/controller_utils.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,20 @@ func defaultNodeIDs(ctx context.Context, cl client.Client, namespace string) ([]
5050
return nil, errors.Wrap(err, errors.GetFromKubernetesMessage)
5151
}
5252
for _, l := range listeners.Items {
53-
nodeIDs = append(nodeIDs, k8s.NodeIDs(l.DeepCopy())...)
53+
for _, v := range k8s.NodeIDs(l.DeepCopy()) {
54+
if !contains(nodeIDs, v) {
55+
nodeIDs = append(nodeIDs, v)
56+
}
57+
}
5458
}
5559
return nodeIDs, nil
5660
}
61+
62+
func contains(s []string, e string) bool {
63+
for _, a := range s {
64+
if a == e {
65+
return true
66+
}
67+
}
68+
return false
69+
}

controllers/kube_secret_controller.go

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func (r *KubeSecretReconciler) Reconcile(ctx context.Context, req ctrl.Request)
6262
err := r.Get(ctx, req.NamespacedName, kubeSecret)
6363
if err != nil {
6464
if api_errors.IsNotFound(err) {
65-
r.log.Info("Secret not found. Delete object fron xDS cache")
65+
r.log.Info("Secret not found. Delete object from xDS cache")
6666
nodeIDs, err := r.Cache.GetNodeIDsForResource(resourcev3.SecretType, getResourceName(req.Namespace, req.Name))
6767
if err != nil {
6868
return ctrl.Result{}, errors.Wrap(err, errors.GetNodeIDForResource)
@@ -90,13 +90,16 @@ func (r *KubeSecretReconciler) Reconcile(ctx context.Context, req ctrl.Request)
9090
nodeIDs = append(nodeIDs, defaultNodeIDs...)
9191
}
9292

93+
envoySecrets, err := r.makeEnvoySecrets(kubeSecret)
94+
if err != nil {
95+
return ctrl.Result{}, errors.Wrap(err, "cannot generate xDS secret from Kubernetes Secret")
96+
}
97+
9398
for _, nodeID := range nodeIDs {
94-
envoySecret, err := r.makeEnvoySecret(kubeSecret)
95-
if err != nil {
96-
return ctrl.Result{}, errors.Wrap(err, "cannot generate xDS secret from Kubernetes Secret")
97-
}
98-
if err := r.Cache.Update(nodeID, envoySecret); err != nil {
99-
return ctrl.Result{}, errors.Wrap(err, errors.CannotUpdateCacheMessage)
99+
for _, envoySecret := range envoySecrets {
100+
if err := r.Cache.Update(nodeID, envoySecret); err != nil {
101+
return ctrl.Result{}, errors.Wrap(err, errors.CannotUpdateCacheMessage)
102+
}
100103
}
101104
}
102105

@@ -117,26 +120,40 @@ func (r *KubeSecretReconciler) valid(secret *corev1.Secret) bool {
117120
r.log.V(1).Info("Not a xds controller secret")
118121
return false
119122
}
120-
if secret.Type != corev1.SecretTypeTLS {
121-
r.log.V(1).Info("Kuberentes Secret is not a type TLS. Skip")
123+
if secret.Type != corev1.SecretTypeTLS && secret.Type != corev1.SecretTypeOpaque {
124+
r.log.V(1).Info("Kuberentes Secret is not a type TLS or Opaque. Skip")
122125
return false
123126
}
124127
return true
125128
}
126129

127-
func (r *KubeSecretReconciler) makeEnvoySecret(kubeSecret *corev1.Secret) (*tlsv3.Secret, error) {
130+
// Generate xDS secret from Kubernetes Secret
131+
func (r *KubeSecretReconciler) makeEnvoySecrets(kubeSecret *corev1.Secret) ([]*tlsv3.Secret, error) {
132+
switch kubeSecret.Type {
133+
case corev1.SecretTypeTLS:
134+
return r.makeEnvoyTLSSecret(kubeSecret)
135+
case corev1.SecretTypeOpaque:
136+
return r.makeEnvoyOpaqueSecret(kubeSecret)
137+
default:
138+
return nil, fmt.Errorf("unsupported secret type %s", kubeSecret.Type)
139+
}
140+
}
141+
142+
func (r *KubeSecretReconciler) makeEnvoyTLSSecret(kubeSecret *corev1.Secret) ([]*tlsv3.Secret, error) {
143+
secrets := make([]*tlsv3.Secret, 0)
144+
128145
envoySecret := &tlsv3.Secret{
129146
Name: fmt.Sprintf("%s-%s", kubeSecret.Namespace, kubeSecret.Name),
130147
Type: &tlsv3.Secret_TlsCertificate{
131148
TlsCertificate: &tlsv3.TlsCertificate{
132149
CertificateChain: &corev3.DataSource{
133150
Specifier: &corev3.DataSource_InlineBytes{
134-
InlineBytes: kubeSecret.Data["tls.crt"],
151+
InlineBytes: kubeSecret.Data[corev1.TLSCertKey],
135152
},
136153
},
137154
PrivateKey: &corev3.DataSource{
138155
Specifier: &corev3.DataSource_InlineBytes{
139-
InlineBytes: kubeSecret.Data["tls.key"],
156+
InlineBytes: kubeSecret.Data[corev1.TLSPrivateKeyKey],
140157
},
141158
},
142159
},
@@ -146,5 +163,34 @@ func (r *KubeSecretReconciler) makeEnvoySecret(kubeSecret *corev1.Secret) (*tlsv
146163
return nil, errors.Wrap(err, "cannot validate Envoy Secret")
147164
}
148165

149-
return envoySecret, nil
166+
secrets = append(secrets, envoySecret)
167+
168+
return secrets, nil
169+
}
170+
171+
func (r *KubeSecretReconciler) makeEnvoyOpaqueSecret(kubeSecret *corev1.Secret) ([]*tlsv3.Secret, error) {
172+
secrets := make([]*tlsv3.Secret, 0)
173+
174+
for k, v := range kubeSecret.Data {
175+
envoySecret := &tlsv3.Secret{
176+
Name: fmt.Sprintf("%s-%s-%s", kubeSecret.Namespace, kubeSecret.Name, k),
177+
Type: &tlsv3.Secret_GenericSecret{
178+
GenericSecret: &tlsv3.GenericSecret{
179+
Secret: &corev3.DataSource{
180+
Specifier: &corev3.DataSource_InlineBytes{
181+
InlineBytes: v,
182+
},
183+
},
184+
},
185+
},
186+
}
187+
188+
if err := envoySecret.ValidateAll(); err != nil {
189+
return nil, errors.Wrap(err, "cannot validate Envoy Secret")
190+
}
191+
192+
secrets = append(secrets, envoySecret)
193+
}
194+
195+
return secrets, nil
150196
}

helm/charts/envoy-xds-controller/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ type: application
1515
# This is the chart version. This version number should be incremented each time you make changes
1616
# to the chart and its templates, including the app version.
1717
# Versions are expected to follow Semantic Versioning (https://semver.org/)
18-
version: 0.1.19
18+
version: 0.1.20
1919

2020
# This is the version number of the application being deployed. This version number should be
2121
# incremented each time you make changes to the application. Versions are not expected to
2222
# follow Semantic Versioning. They should reflect the version the application is using.
2323
# It is recommended to use it with quotes.
24-
appVersion: "v0.1.19"
24+
appVersion: "v0.1.20"
2525

2626
home: https://github.com/kaasops/envoy-xds-controller
2727
sources:

0 commit comments

Comments
 (0)