{"id":2089,"date":"2022-02-09T06:57:04","date_gmt":"2022-02-09T06:57:04","guid":{"rendered":"https:\/\/blog.samarthya.me\/wps\/?p=2089"},"modified":"2022-02-15T15:53:06","modified_gmt":"2022-02-15T15:53:06","slug":"cert-manager-tls-for-ingress","status":"publish","type":"post","link":"https:\/\/blog.samarthya.me\/wps\/2022\/02\/09\/cert-manager-tls-for-ingress\/","title":{"rendered":"Cert-Manager: TLS for ingress"},"content":{"rendered":"\n<p>A common use-case for cert-manager is requesting TLS signed certificates to secure your ingress resources.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p><code>cert-manager<\/code> adds certificates and certificate issuers as resource types in Kubernetes clusters, and simplifies the process of obtaining, renewing and using those certificates.<\/p><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation\">Installation<\/h2>\n\n\n\n<p>The easiest way is to use helm charts.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>helm repo add jetstack https:\/\/charts.jetstack.io<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master&gt;helm repo list\nNAME                    URL                                                                                         \nstable                  https:\/\/charts.helm.sh\/stable                                                                                                        \njetstack                https:\/\/charts.jetstack.io  <\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>helm install cert-manager jetstack\/cert-manager \\\n  --namespace cert-manager \\\n  --create-namespace \\\n  --version v1.7.1 \\\n  --set prometheus.enabled=false \\\n  --set webhook.timeoutSeconds=4 \\\n  --set installCRDs=true<\/code><\/pre>\n\n\n\n<p>Once deployed you can see the k8s objects deployed<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master&gt;k get all -n cert-manager<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME                                           READY   STATUS    RESTARTS   AGE\npod\/cert-manager-86f4f985d6-ntgtf              1\/1     Running   0          7d23h\npod\/cert-manager-cainjector-56bc5f744c-tdhx6   1\/1     Running   0          7d23h\npod\/cert-manager-webhook-997b5dd88-4jbmf       1\/1     Running   0          7d23h\n\nNAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE\nservice\/cert-manager           ClusterIP   10.100.35.73   &lt;none&gt;        9402\/TCP   67d\nservice\/cert-manager-webhook   ClusterIP   10.96.67.112   &lt;none&gt;        443\/TCP    67d\n\nNAME                                      READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps\/cert-manager              1\/1     1            1           67d\ndeployment.apps\/cert-manager-cainjector   1\/1     1            1           67d\ndeployment.apps\/cert-manager-webhook      1\/1     1            1           67d\n\nNAME                                                 DESIRED   CURRENT   READY   AGE\nreplicaset.apps\/cert-manager-57d89b9548              0         0         0       67d\nreplicaset.apps\/cert-manager-86f4f985d6              1         1         1       7d23h\nreplicaset.apps\/cert-manager-cainjector-56bc5f744c   1         1         1       7d23h\nreplicaset.apps\/cert-manager-cainjector-5bcf77b697   0         0         0       67d\nreplicaset.apps\/cert-manager-webhook-997b5dd88       1         1         1       7d23h\nreplicaset.apps\/cert-manager-webhook-9cb88bd6d       0         0         0       67d<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"example\">Example<\/h2>\n\n\n\n<pre id=\"block-8f7c34b0-f557-435d-ac59-e189217eb50c\" class=\"wp-block-code\"><code>&gt;kubectl get Issuers,ClusterIssuers,Certificates,CertificateRequests,Orders,Challenges -A<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"issuers\">Issuers<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>NAMESPACE           NAME                                          READY   AGE\ncert-manager-test   issuer.cert-manager.io\/test-selfsigned        True    7d21h\njenkins             issuer.cert-manager.io\/jenkins-selfsigned     True    6d18h\nspinnaker           issuer.cert-manager.io\/spinnaker-selfsigned   True    7d21h<\/code><\/pre>\n\n\n\n<pre id=\"block-8f7c34b0-f557-435d-ac59-e189217eb50c\" class=\"wp-block-code\"><code>NAMESPACE           NAME                                            READY   SECRET                AGE\ncert-manager-test   certificate.cert-manager.io\/selfsigned-cert     True    selfsigned-cert-tls   7d21h\njenkins             certificate.cert-manager.io\/jenkinsdevops.com   True    jenkinsdevops.com     6d18h\nspinnaker           certificate.cert-manager.io\/devops.com          True    devops.com            7d19h\nspinnaker           certificate.cert-manager.io\/selfsigned-cert     True    devops.com            7d21h<\/code><\/pre>\n\n\n\n<pre id=\"block-7a40d8b1-c345-4353-b2a6-b9642ab32ad8\" class=\"wp-block-code\"><code>NAMESPACE           NAME                                                         APPROVED   DENIED   READY   ISSUER                 REQUESTOR                                         AGE<br>cert-manager-test   certificaterequest.cert-manager.io\/selfsigned-cert-hnd85     True                True    test-selfsigned        system:serviceaccount:cert-manager:cert-manager   7d21h<br>jenkins             certificaterequest.cert-manager.io\/jenkinsdevops.com-75hdn   True                True    jenkins-selfsigned     system:serviceaccount:cert-manager:cert-manager   6d18h<br>spinnaker           certificaterequest.cert-manager.io\/devops.com-g6b2m          True                True    spinnaker-selfsigned   system:serviceaccount:cert-manager:cert-manager   5d22h<br>spinnaker           certificaterequest.cert-manager.io\/devops.com-rz6db          True                True    spinnaker-selfsigned   system:serviceaccount:cert-manager:cert-manager   5d23h<br>spinnaker           certificaterequest.cert-manager.io\/devops.com-wzs4h          True                True    spinnaker-selfsigned   system:serviceaccount:cert-manager:cert-manager   5d22h<br>spinnaker           certificaterequest.cert-manager.io\/selfsigned-cert-mfggn     True                True    spinnaker-selfsigned   system:serviceaccount:cert-manager:cert-manager   7d21h<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"after-installation-configure\">After Installation, Configure<\/h2>\n\n\n\n<p>The first thing you\u2019ll need to configure after you\u2019ve installed cert-manager is an issuer which you can then use to issue certificates.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"before-you-begin\">Before you begin<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"issuers-clusterissuer\"><code>Issuers<\/code> &amp; <code>ClusterIssuer<\/code><\/h4>\n\n\n\n<p><code>Issuers<\/code>, and&nbsp;<code>ClusterIssuers<\/code>, are Kubernetes resources that represent certificate authorities (CAs) that are able to generate signed certificates by honoring certificate signing requests.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"example-issuer\">Example &#8211; Issuer<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: cert-manager.io\/v1\nkind: Issuer\nmetadata:\n  name: jenkins-selfsigned\n  namespace: jenkins\nspec:\n  selfSigned: {}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"example-clusterissuer\">Example &#8211; ClusterIssuer<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: cert-manager.io\/v1\nkind: ClusterIssuer\nmetadata:\n  name: selfsigned-cluster-issuer\nspec:\n  selfSigned: {}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p>An&nbsp;<code>Issuer<\/code>&nbsp;is a namespaced resource, and it is not possible to issue certificates from an&nbsp;<code>Issuer<\/code>&nbsp;in a different namespace.&nbsp;<\/p><\/blockquote><\/figure>\n\n\n\n<p>If you want to create a single&nbsp;<code>Issuer<\/code>&nbsp;that can be consumed in multiple namespaces, you should consider creating a&nbsp;<code>ClusterIssuer<\/code>&nbsp;resource.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"certificate\">Certificate<\/h4>\n\n\n\n<p>A&nbsp;<code>Certificate<\/code>&nbsp;is a namespaced resource that references an&nbsp;<code>Issuer<\/code>&nbsp;or&nbsp;<code>ClusterIssuer<\/code>&nbsp;that determine what will be honoring the certificate request.<\/p>\n\n\n\n<p>When a&nbsp;<code>Certificate<\/code>&nbsp;is created, a corresponding&nbsp;<code>CertificateRequest<\/code>&nbsp;resource is created by cert-manager containing the encoded X.509 certificate request,&nbsp;<code>Issuer<\/code>&nbsp;reference, and other options based upon the specification of the&nbsp;<code>Certificate<\/code>&nbsp;resource.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"securing-ingress\">Securing Ingress<\/h2>\n\n\n\n<p>As I conclude the blog, let me use the deployed cert-manager to secure the TLS deployment for my spinnaker instance.<\/p>\n\n\n\n<p class=\"has-pale-pink-background-color has-background\">Supported Annotations in Ingress: <a href=\"https:\/\/cert-manager.io\/docs\/usage\/ingress\/#supported-annotations\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/cert-manager.io\/docs\/usage\/ingress\/#supported-annotations<\/a><\/p>\n\n\n\n<p>In our example we will use mostly<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>cert-manager.io\/issuer<\/code><\/li><li><code>cert-manager.io\/cluster-issuer<\/code><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"deployed-spinnaker-pods\">Deployed Spinnaker Pods<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master&gt;k get pods -n spinnaker\nNAME                                  READY   STATUS    RESTARTS   AGE\nminio-5bbd54df5b-qnfvs                1\/1     Running   0          8d\nspin-clouddriver-ddd75554c-tts9z      1\/1     Running   0          45h\nspin-deck-649d97f44f-kp59x            1\/1     Running   0          8d\nspin-echo-9587cdc9d-gm7pt             1\/1     Running   0          4d16h\nspin-front50-7dbbb7668-qpr5f          1\/1     Running   0          5d23h\nspin-gate-69b9f88748-pppwm            1\/1     Running   0          5d23h\nspin-igor-6bcc768f9c-fzr8c            1\/1     Running   0          47h\nspin-orca-68ff75b6f8-r6872            1\/1     Running   0          5d23h\nspin-redis-864dff6b7-82m55            1\/1     Running   0          8d\nspin-rosco-68dc887685-sm9p8           1\/1     Running   0          5d23h<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"services\">Services<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master&gt;k get svc -n spinnaker\nNAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE\nminio                 ClusterIP   10.96.179.180    &lt;none&gt;        9000\/TCP   8d\nspin-clouddriver      ClusterIP   10.107.86.175    &lt;none&gt;        7002\/TCP   8d\nspin-deck             ClusterIP   10.106.159.232   &lt;none&gt;        9000\/TCP   8d\nspin-echo             ClusterIP   10.98.31.29      &lt;none&gt;        8089\/TCP   8d\nspin-front50          ClusterIP   10.106.148.148   &lt;none&gt;        8080\/TCP   8d\nspin-gate             ClusterIP   10.105.124.157   &lt;none&gt;        8084\/TCP   8d\nspin-igor             ClusterIP   10.99.29.79      &lt;none&gt;        8088\/TCP   5d23h\nspin-orca             ClusterIP   10.103.240.238   &lt;none&gt;        8083\/TCP   8d\nspin-redis            ClusterIP   10.99.134.213    &lt;none&gt;        6379\/TCP   8d\nspin-rosco            ClusterIP   10.110.22.96     &lt;none&gt;        8087\/TCP   8d<\/code><\/pre>\n\n\n\n<p>I will use the Ingress to expose the UI and API<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  annotations:\n    haproxy.org\/cors-allow-origin: \"*.devops.com\"\n    haproxy.org\/ingress.class: haproxy\n    cert-manager.io\/issuer: \"spinnaker-selfsigned\"\n    cert-manager.io\/common-name: \"devops.com\"\n  name: spinnaker-ingress\n  namespace: spinnaker\nspec:\n  ingressClassName: haproxy\n  rules:\n  - host: ui.devops.com\n    http:\n      paths:\n      - backend:\n          service:\n            name: spin-deck\n            port:\n              number: 9000\n        path: \/\n        pathType: Prefix\n  - host: api.devops.com\n    http:\n      paths:\n      - backend:\n          service:\n            name: spin-gate\n            port:\n              number: 8084\n        path: \/\n        pathType: Prefix\n  tls:\n  - hosts:\n    - ui.devops.com\n    - api.devops.com\n    secretName: devops.com<\/code><\/pre>\n\n\n\n<p>Please note the annotation <code>cert-manager.io\/issuer: \"spinnaker-selfsigned\"<\/code> applied to the ingress once the resource is created using <code>kubectl create -f &lt;yaml&gt;<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>k get ing -n spinnaker\nNAME                  CLASS     HOSTS                                                 ADDRESS          PORTS     AGE\nspinnaker-ingress     haproxy   ui.devops.com,api.devops.com,clouddriver.devops.com   10.98.117.100    80, 443   7d21h<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"218\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-09-at-12.25.57-PM-1024x218.png\" alt=\"\" class=\"wp-image-2090\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-09-at-12.25.57-PM-1024x218.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-09-at-12.25.57-PM-300x64.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-09-at-12.25.57-PM-1536x328.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-09-at-12.25.57-PM-2048x437.png 2048w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-09-at-12.25.57-PM-300x64@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>A common use-case for cert-manager is requesting TLS signed certificates to secure your ingress resources. cert-manager adds certificates and certificate issuers as resource types in Kubernetes clusters, and simplifies the process of obtaining, renewing and using those certificates. Installation The easiest way is to use helm charts. Once deployed you can see the k8s objects [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2090,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[86,34],"tags":[236,237],"class_list":["post-2089","post","type-post","status-publish","format-image","has-post-thumbnail","hentry","category-docker","category-technical","tag-certmanager","tag-tls","post_format-post-format-image"],"_links":{"self":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/2089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/comments?post=2089"}],"version-history":[{"count":0,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/2089\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media\/2090"}],"wp:attachment":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media?parent=2089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/categories?post=2089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/tags?post=2089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}