Skip to content
This repository was archived by the owner on May 17, 2024. It is now read-only.

Commit c5ca429

Browse files
authored
Merge pull request #59 from jetstack/10-custom-ca
Enable custom CA certificates for kube-oidc-proxy tutorial
2 parents 2b83611 + 3792605 commit c5ca429

File tree

7 files changed

+85
-15
lines changed

7 files changed

+85
-15
lines changed

demo/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ CLOUD ?= google
55
KUBECONFIG := $(CURDIR)/.kubeconfig-$(CLOUD)
66

77
GOOGLE_PROJECT := $(shell gcloud config get-value core/project)
8+
CA_CRT_FILE ?= /dev/null
9+
CA_KEY_FILE ?= /dev/null
810

911
EXT_VARS := --tla-str cloud=$(CLOUD)
1012

@@ -33,6 +35,8 @@ help: ## Display this help
3335
terraform_apply: ## Applies terraform infrastructure
3436
echo '' > infrastructure/$(CLOUD)/terraform.tfvars
3537
echo 'google_project = "$(GOOGLE_PROJECT)"' > infrastructure/$(CLOUD)/terraform.tfvars
38+
echo 'ca_crt_file = "$(CA_CRT_FILE)"' >> infrastructure/$(CLOUD)/terraform.tfvars
39+
echo 'ca_key_file = "$(CA_KEY_FILE)"' >> infrastructure/$(CLOUD)/terraform.tfvars
3640
cd infrastructure/$(CLOUD) && terraform init && terraform apply
3741
cd infrastructure/$(CLOUD) && terraform output config > ../../manifests/$(CLOUD)-config.json
3842
$(shell cd infrastructure/$(CLOUD) && terraform output kubeconfig_command)

demo/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ records for DNS challenges and OIDC secrets for all clusters. It should
8383
generate a JSON configuration file for each cluster in
8484
`./manifests/[google|amazon|digitalocean]-config.json` respectively.
8585

86+
If you wish to use a custom CA to sign certificates for the `kube-oidc-proxy`
87+
then this is possible by setting the environment variables `CA_CRT_FILE` and
88+
`CA_KEY_FILE` to the full file path of the CA certificate and private key
89+
respectively. After a terraform apply, these will be stored in the terraform
90+
state and will eventually be uploaded to Kubernetes as a Secret. Cert-manager
91+
will then issue the kube-oidc-proxy with a signed certificate from this CA.
92+
8693
## Configuration
8794

8895
Copy `config.dist.jsonnet` to `config.jsonnet`. This file will hold

demo/infrastructure/google/dns.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
module "dns" {
22
source = "../modules/google-dns"
33
suffix = "${random_id.suffix.hex}"
4+
5+
ca_crt_file = "${var.ca_crt_file}"
6+
ca_key_file = "${var.ca_key_file}"
47
}

demo/infrastructure/google/providers.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ variable "google_zone" {
88

99
variable "google_project" {}
1010

11+
variable "ca_crt_file" {}
12+
variable "ca_key_file" {}
13+
1114
provider "google" {
1215
region = "${var.google_region}"
1316
credentials = "${file("~/.config/gcloud/terraform-admin.json")}"

demo/infrastructure/modules/google-dns/dns.tf

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
variable "suffix" {}
22

3+
variable "ca_crt_file" {}
4+
variable "ca_key_file" {}
5+
36
resource "google_service_account" "external_dns" {
47
account_id = "external-dns-${var.suffix}"
58
display_name = "External DNS/Cert Manager service account for GKE cluster cluster-${var.suffix}"
@@ -15,10 +18,21 @@ resource "google_service_account_key" "external_dns" {
1518
service_account_id = "${google_service_account.external_dns.account_id}"
1619
}
1720

21+
data "local_file" "ca_crt" {
22+
filename = "${var.ca_crt_file}"
23+
}
24+
25+
data "local_file" "ca_key" {
26+
filename = "${var.ca_key_file}"
27+
}
28+
1829
output "config" {
1930
value = {
2031
service_account_credentials = "${base64decode(google_service_account_key.external_dns.private_key)}"
21-
project = "${google_service_account.external_dns.project}"
22-
provider = "google"
32+
33+
project = "${google_service_account.external_dns.project}"
34+
provider = "google"
35+
ca_crt = "${data.local_file.ca_crt.content}"
36+
ca_key = "${data.local_file.ca_key.content}"
2337
}
2438
}

demo/manifests/components/cert-manager.jsonnet

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,28 @@ local kube = import '../vendor/kube-prod-runtime/lib/kube.libsonnet';
33

44
local CERT_MANAGER_IMAGE = '';
55

6+
local add_acme_spec(issuer, obj) =
7+
if std.objectHas(issuer.spec, 'acme') then
8+
obj {
9+
spec+: {
10+
acme: {
11+
config: [{
12+
dns01: {
13+
provider: issuer.spec.acme.dns01.providers[0].name,
14+
},
15+
domains: obj.spec.dnsNames,
16+
}],
17+
},
18+
},
19+
}
20+
else
21+
obj;
22+
623
upstream_cert_manager {
24+
ca_secret_name:: 'ca-key-pair',
25+
726
// create simple to use certificate resource
8-
Certificate(namespace, name, issuer, domains):: kube._Object($.certCRD.spec.group + '/' + $.certCRD.spec.version, $.certCRD.spec.names.kind, name) + {
27+
Certificate(namespace, name, issuer, domains):: add_acme_spec(issuer, kube._Object($.certCRD.spec.group + '/' + $.certCRD.spec.version, $.certCRD.spec.names.kind, name) + {
928
metadata+: {
1029
namespace: namespace,
1130
name: name,
@@ -17,18 +36,8 @@ upstream_cert_manager {
1736
name: issuer.metadata.name,
1837
kind: issuer.kind,
1938
},
20-
acme: {
21-
config: [
22-
{
23-
dns01: {
24-
provider: issuer.spec.acme.dns01.providers[0].name,
25-
},
26-
domains: domains,
27-
},
28-
],
29-
},
3039
},
31-
},
40+
}),
3241

3342
// TODO: use upstream images for cert-manager
3443
}

demo/manifests/main.jsonnet

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,24 @@ local IngressRouteTLSPassthrough(namespace, name, domain, serviceName, servicePo
4848
},
4949
};
5050

51+
local apply_ca_issuer(ca_crt, ca_key, obj) =
52+
if ca_crt != '' && ca_key != '' then
53+
{
54+
issuer: obj,
55+
secret: kube.Secret(obj.spec.ca.secretName) + cert_manager.metadata {
56+
metadata+: {
57+
namespace: 'kube-system',
58+
},
59+
60+
data_+: {
61+
'tls.crt': ca_crt,
62+
'tls.key': ca_key,
63+
},
64+
},
65+
}
66+
else
67+
{};
68+
5169
{
5270

5371
cloud:: 'google',
@@ -89,6 +107,9 @@ local IngressRouteTLSPassthrough(namespace, name, domain, serviceName, servicePo
89107
ns: kube.Namespace($.namespace),
90108

91109

110+
ca_crt:: $.config.cert_manager.ca_crt,
111+
ca_key:: $.config.cert_manager.ca_key,
112+
92113
cert_manager: cert_manager {
93114
google_secret: kube.Secret($.cert_manager.p + 'clouddns-google-credentials') + $.cert_manager.metadata {
94115
data_+: {
@@ -103,6 +124,15 @@ local IngressRouteTLSPassthrough(namespace, name, domain, serviceName, servicePo
103124
},
104125
letsencrypt_environment:: 'prod',
105126

127+
ca_issuer: apply_ca_issuer($.ca_crt, $.ca_key, $.cert_manager.ClusterIssuer($.p + 'ca-issuer') {
128+
local this = self,
129+
spec+: {
130+
ca+: {
131+
secretName: $.cert_manager.ca_secret_name,
132+
},
133+
},
134+
}),
135+
106136
letsencryptStaging+: {
107137
spec+: {
108138
acme+: {
@@ -340,7 +370,7 @@ local IngressRouteTLSPassthrough(namespace, name, domain, serviceName, servicePo
340370
certificate: cert_manager.Certificate(
341371
$.namespace,
342372
this.name,
343-
$.cert_manager.letsencryptProd,
373+
if $.ca_crt != '' && $.ca_key != '' then $.cert_manager.ca_issuer.issuer else $.cert_manager.letsencryptProd,
344374
[this.domain]
345375
),
346376
ingressRoute: IngressRouteTLSPassthrough($.namespace, this.name, this.domain, this.name, 443),

0 commit comments

Comments
 (0)