Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ExternalCaCertSecret crd field for MinIO Tenant and Console #362

Merged
merged 1 commit into from
Nov 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/tenant-pod-security-policy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ spec:

## Enable Kubernetes based certificate generation and signing as explained in
## https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster
requestAutoCert: false
requestAutoCert: true

## Enable S3 specific features such as Bucket DNS which would allow `buckets` to be
## accessible as DNS entries of form `<bucketname>.minio.default.svc.cluster.local`
Expand Down
184 changes: 184 additions & 0 deletions examples/tenant-with-custom-ca-certs.yaml

Large diffs are not rendered by default.

30 changes: 28 additions & 2 deletions operator-kustomize/crds/minio.min.io_tenants.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,21 @@ spec:
- name
type: object
type: array
externalCaCertSecret:
description: ExternalCaCertSecret allows a user to provide additional CA certificates. This is used for Console to verify TLS connections with other applications.
items:
description: LocalCertificateReference defines the spec for a local certificate
properties:
name:
type: string
type:
type: string
required:
- name
type: object
type: array
externalCertSecret:
description: ExternalCertSecret allows a user to specify custom CA certificate, and private key. This is used for enabling TLS support on Console Pods.
description: ExternalCertSecret allows a user to provide an external certificate and private key. This is used for enabling TLS on Console and has priority over AutoCert.
properties:
name:
type: string
Expand Down Expand Up @@ -304,8 +317,21 @@ spec:
- name
type: object
type: array
externalCaCertSecret:
description: ExternalCaCertSecret allows a user to provide additional CA certificates. This is used for MinIO to verify TLS connections with other applications.
items:
description: LocalCertificateReference defines the spec for a local certificate
properties:
name:
type: string
type:
type: string
required:
- name
type: object
type: array
externalCertSecret:
description: ExternalCertSecret allows a user to specify one or more custom TLS certificates, and private keys. This is used for enabling TLS with SNI support on MinIO Pods.
description: ExternalCertSecret allows a user to provide one or more TLS certificates and private keys. This is used for enabling TLS with SNI support on MinIO server.
items:
description: LocalCertificateReference defines the spec for a local certificate
properties:
Expand Down
12 changes: 12 additions & 0 deletions pkg/apis/minio.min.io/v1/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ func (t *Tenant) ExternalCert() bool {
return t.Spec.ExternalCertSecret != nil
}

// ExternalCaCerts returns true is the user has provided a
// additional CA certificates for MinIO
func (t *Tenant) ExternalCaCerts() bool {
return len(t.Spec.ExternalCaCertSecret) > 0
}

// ExternalClientCert returns true is the user has provided a secret
// that contains CA client cert, server cert and server key
func (t *Tenant) ExternalClientCert() bool {
Expand All @@ -137,6 +143,12 @@ func (t *Tenant) ConsoleExternalCert() bool {
return t.Spec.Console != nil && t.Spec.Console.ExternalCertSecret != nil
}

// ConsoleExternalCaCerts returns true is the user has provided a
// additional CA certificates for Console
func (t *Tenant) ConsoleExternalCaCerts() bool {
return t.Spec.Console != nil && len(t.Spec.Console.ExternalCaCertSecret) > 0
}

// AutoCert is enabled by default, otherwise we return the user provided value
func (t *Tenant) AutoCert() bool {
if t.Spec.RequestAutoCert == nil {
Expand Down
16 changes: 12 additions & 4 deletions pkg/apis/minio.min.io/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,14 @@ type TenantSpec struct {
// If provided, use these environment variables for Tenant resource
// +optional
Env []corev1.EnvVar `json:"env,omitempty"`
// ExternalCertSecret allows a user to specify one or more custom TLS certificates, and private keys. This is
// used for enabling TLS with SNI support on MinIO Pods.
// ExternalCertSecret allows a user to provide one or more TLS certificates and private keys. This is
// used for enabling TLS with SNI support on MinIO server.
// +optional
ExternalCertSecret []*LocalCertificateReference `json:"externalCertSecret,omitempty"`
// ExternalCaCertSecret allows a user to provide additional CA certificates. This is
// used for MinIO to verify TLS connections with other applications.
// +optional
ExternalCaCertSecret []*LocalCertificateReference `json:"externalCaCertSecret,omitempty"`
// ExternalClientCertSecret allows a user to specify custom CA client certificate, and private key. This is
// used for adding client certificates on MinIO Pods --> used for KES authentication.
// +optional
Expand Down Expand Up @@ -195,10 +199,14 @@ type ConsoleConfiguration struct {
// If provided, use these requests and limit for cpu/memory resource allocation
// +optional
Resources corev1.ResourceRequirements `json:"resources,omitempty"`
// ExternalCertSecret allows a user to specify custom CA certificate, and private key. This is
// used for enabling TLS support on Console Pods.
// ExternalCertSecret allows a user to provide an external certificate and private key. This is
// used for enabling TLS on Console and has priority over AutoCert.
// +optional
ExternalCertSecret *LocalCertificateReference `json:"externalCertSecret,omitempty"`
// ExternalCaCertSecret allows a user to provide additional CA certificates. This is
// used for Console to verify TLS connections with other applications.
// +optional
ExternalCaCertSecret []*LocalCertificateReference `json:"externalCaCertSecret,omitempty"`
// If provided, use these annotations for Console Object Meta annotations
// +optional
Annotations map[string]string `json:"annotations,omitempty"`
Expand Down
22 changes: 22 additions & 0 deletions pkg/apis/minio.min.io/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 37 additions & 1 deletion pkg/resources/deployments/console-deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ func NewConsole(t *miniov1.Tenant) *appsv1.Deployment {
})
}

// If MinIO has AutoCert enabled load the autogenerated certificate into certs/CAS/public.crt
// If MinIO has AutoCert enabled load the autogenerated certificate into certs/CAS/minio.crt
if t.AutoCert() {
// MinIO tenant certificate generated by AutoCert
podVolumeSources = append(podVolumeSources, corev1.VolumeProjection{
Expand Down Expand Up @@ -206,6 +206,42 @@ func NewConsole(t *miniov1.Tenant) *appsv1.Deployment {
}
}

// Will mount into ~/.console/certs/CAs folder the user provided CA certificates.
// This is used for Console to verify TLS connections with other applications.
// certs
// + CAs
// + ca-0.crt
// + ca-1.crt
// + ca-2.crt
if t.ConsoleExternalCaCerts() {
for index, secret := range t.Spec.Console.ExternalCaCertSecret {
var caCertPaths []corev1.KeyToPath
// This covers both secrets of type "kubernetes.io/tls" and
// "cert-manager.io/v1alpha2" because of same keys in both.
if secret.Type == "kubernetes.io/tls" {
caCertPaths = []corev1.KeyToPath{
{Key: "tls.crt", Path: fmt.Sprintf("CAs/ca-%d.crt", index)},
}
} else if secret.Type == "cert-manager.io/v1alpha2" {
caCertPaths = []corev1.KeyToPath{
{Key: "ca.crt", Path: fmt.Sprintf("CAs/ca-%d.crt", index)},
}
} else {
caCertPaths = []corev1.KeyToPath{
{Key: "public.crt", Path: fmt.Sprintf("CAs/ca-%d.crt", index)},
}
}
podVolumeSources = append(podVolumeSources, corev1.VolumeProjection{
Secret: &corev1.SecretProjection{
LocalObjectReference: corev1.LocalObjectReference{
Name: secret.Name,
},
Items: caCertPaths,
},
})
}
}

podVolumes := []corev1.Volume{
{
Name: t.ConsoleVolMountName(),
Expand Down
35 changes: 35 additions & 0 deletions pkg/resources/statefulsets/minio-statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,41 @@ func NewForMinIOZone(t *miniov1.Tenant, wsSecret *v1.Secret, zone *miniov1.Zone,
},
})
}
// Will mount into ~/.minio/certs/CAs folder the user provided CA certificates.
// This is used for MinIO to verify TLS connections with other applications.
// certs
// + CAs
// + ca-0.crt
// + ca-1.crt
// + ca-2.crt
if t.ExternalCaCerts() {
for index, secret := range t.Spec.ExternalCaCertSecret {
var caCertPaths []corev1.KeyToPath
// This covers both secrets of type "kubernetes.io/tls" and
// "cert-manager.io/v1alpha2" because of same keys in both.
if secret.Type == "kubernetes.io/tls" {
caCertPaths = []corev1.KeyToPath{
{Key: "tls.crt", Path: fmt.Sprintf("CAs/ca-%d.crt", index)},
}
} else if secret.Type == "cert-manager.io/v1alpha2" {
caCertPaths = []corev1.KeyToPath{
{Key: "ca.crt", Path: fmt.Sprintf("CAs/ca-%d.crt", index)},
}
} else {
caCertPaths = []corev1.KeyToPath{
{Key: "public.crt", Path: fmt.Sprintf("CAs/ca-%d.crt", index)},
}
}
podVolumeSources = append(podVolumeSources, corev1.VolumeProjection{
Secret: &corev1.SecretProjection{
LocalObjectReference: corev1.LocalObjectReference{
Name: secret.Name,
},
Items: caCertPaths,
},
})
}
}
}

// Add SSL volume from SSL secret to the podVolumes
Expand Down