This guide demonstrates the usage of cert-manager as a certificate provider to manage and issue certificates in OSM.
Prerequisites
- Kubernetes cluster running Kubernetes v1.20.0 or greater.
- Have
kubectlavailable to interact with the API server. - Have
osmCLI available for installing and managing the service mesh.
Demo
The following demo uses cert-manager as the certificate provider to issue certificates to the curl and httpbin applications communicating over Mutual TLS (mTLS) in an OSM managed service mesh.
Install
cert-manager. This demo usescert-manager v1.6.1.kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.yaml
Confirm the pods are ready and running in the
cert-managernamespace.kubectl get pod -n cert-managerNAME READY STATUS RESTARTS AGEcert-manager-55658cdf68-pdnzg 1/1 Running 0 2m33scert-manager-cainjector-967788869-prtjq 1/1 Running 0 2m33scert-manager-webhook-6668fbb57d-vzm4j 1/1 Running 0 2m33s
Configure
cert-managerIssuerandCertificateresources required bycert-managerto be able to issue certificates in OSM. These resources must be created in the namespace where OSM will be installed later.Note:
cert-managermust first be installed, with an issuer ready, before OSM can be installed usingcert-manageras the certificate provider.Create the namespace where OSM will be installed.
export osm_namespace=osm-system # Replace osm-system with the namespace where OSM is installedkubectl create namespace "$osm_namespace"
Next, we use a
SelfSignedissuer to bootstrap a custom root certificate. This will create aSelfSignedissuer, issue a root certificate, and use that root as aCAissuer for certificates issued to workloads within the mesh.# Create Issuer and Certificate resourceskubectl apply -f - <<EOFapiVersion: cert-manager.io/v1kind: Issuermetadata:name: selfsignednamespace: "$osm_namespace"spec:selfSigned: {}---apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: osm-canamespace: "$osm_namespace"spec:isCA: trueduration: 87600h # 365 dayssecretName: osm-ca-bundlecommonName: osm-systemissuerRef:name: selfsignedkind: Issuergroup: cert-manager.io---apiVersion: cert-manager.io/v1kind: Issuermetadata:name: osm-canamespace: "$osm_namespace"spec:ca:secretName: osm-ca-bundleEOF
Confirm the
osm-ca-bundleCA secret is created bycert-managerin OSM’s namespace.$ kubectl get secret osm-ca-bundle -n "$osm_namespace"NAME TYPE DATA AGEosm-ca-bundle kubernetes.io/tls 3 84s
The CA certificate saved in this secret will be used by OSM upon install to bootstrap its ceritifcate provider utility.
Install OSM with its certificate provider kind set to
cert-manager.osm install --set osm.certificateProvider.kind="cert-manager"
Confirm the OSM control plane pods are ready and running.
$ kubectl get pod -n "$osm_namespace"NAME READY STATUS RESTARTS AGEosm-bootstrap-7ddc6f9b85-k8ptp 1/1 Running 0 2m52sosm-controller-79b777889b-mqk4g 1/1 Running 0 2m52sosm-injector-5f96468fb7-p77ps 1/1 Running 0 2m52s
Enable permissive traffic policy mode to set up automatic application connectivity.
Note: this is not a requirement to use
cert-managerbut simplifies the demo by not requiring explicit traffic policies for application connectivity.kubectl patch meshconfig osm-mesh-config -n "$osm_namespace" -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":true}}}' --type=merge
Deploy the
httpbinservice into thehttpbinnamespace after enrolling its namespace to the mesh. Thehttpbinservice runs on port14001.# Create the httpbin namespacekubectl create namespace httpbin# Add the namespace to the meshosm namespace add httpbin# Deploy httpbin service in the httpbin namespacekubectl apply -f https://raw.githubusercontent.com/openservicemesh/osm-docs/release-v1.1/manifests/samples/httpbin/httpbin.yaml -n httpbin
Confirm the
httpbinservice and pods are up and running.$ kubectl get svc -n httpbinNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEhttpbin ClusterIP 10.96.198.23 <none> 14001/TCP 20s
$ kubectl get pods -n httpbinNAME READY STATUS RESTARTS AGEhttpbin-5b8b94b9-lt2vs 2/2 Running 0 20s
Deploy the
curlclient into thecurlnamespace after enrolling its namespace to the mesh.# Create the curl namespacekubectl create namespace curl# Add the namespace to the meshosm namespace add curl# Deploy curl client in the curl namespacekubectl apply -f https://raw.githubusercontent.com/openservicemesh/osm-docs/release-v1.1/manifests/samples/curl/curl.yaml -n curl
Confirm the
curlclient pod is up and running.$ kubectl get pods -n curlNAME READY STATUS RESTARTS AGEcurl-54ccc6954c-9rlvp 2/2 Running 0 20s
Confirm the
curlclient is able to access thehttpbinservice on port14001.$ kubectl exec -n curl -ti "$(kubectl get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')" -c curl -- curl -I http://httpbin.httpbin:14001HTTP/1.1 200 OKserver: envoydate: Mon, 15 Mar 2021 22:45:23 GMTcontent-type: text/html; charset=utf-8content-length: 9593access-control-allow-origin: *access-control-allow-credentials: truex-envoy-upstream-service-time: 2
A
200 OKresponse indicates the HTTP request from thecurlclient to thehttpbinservice was successful. The traffic between the application sidecar proxies is encrypted and authenticated usingMutual TLS (mTLS)by leverging the certificates issued by thecert-managercertificate provider.
