Kubernetes SSL certificate management

Share

List Kubenetes internal SSL certificates

sudo kubeadm certs check-expiration
[sudo] password for kubuser:
[check-expiration] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[check-expiration] Use 'kubeadm init phase upload-config --config your-config-file' to re-upload it.

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Nov 04, 2026 08:01 UTC   359d            ca                      no
apiserver                  Nov 04, 2026 08:01 UTC   359d            ca                      no
apiserver-etcd-client      Nov 04, 2026 08:01 UTC   359d            etcd-ca                 no
apiserver-kubelet-client   Nov 04, 2026 08:01 UTC   359d            ca                      no
controller-manager.conf    Nov 04, 2026 08:01 UTC   359d            ca                      no
etcd-healthcheck-client    Nov 04, 2026 08:01 UTC   359d            etcd-ca                 no
etcd-peer                  Nov 04, 2026 08:01 UTC   359d            etcd-ca                 no
etcd-server                Nov 04, 2026 08:01 UTC   359d            etcd-ca                 no
front-proxy-client         Nov 04, 2026 08:01 UTC   359d            front-proxy-ca          no
scheduler.conf             Nov 04, 2026 08:01 UTC   359d            ca                      no
super-admin.conf           Nov 04, 2026 08:01 UTC   359d            ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Nov 02, 2035 08:01 UTC   9y              no
etcd-ca                 Nov 02, 2035 08:01 UTC   9y              no
front-proxy-ca          Nov 02, 2035 08:01 UTC   9y              no

List Dashboard SSL certificates

kubectl get secrets -n kubernetes-dashboard
NAME                                         TYPE                                  DATA   AGE
admin-user                                   kubernetes.io/service-account-token   3      4d
kubernetes-dashboard-csrf                    Opaque                                1      5d19h
sh.helm.release.v1.kubernetes-dashboard.v1   helm.sh/release.v1                    1      5d19h

Renew Kubernetes internal SSL certificates

 sudo kubeadm certs renew all
[sudo] password for kubuser:
[renew] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[renew] Use 'kubeadm init phase upload-config --config your-config-file' to re-upload it.

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
certificate embedded in the kubeconfig file for the super-admin renewed

Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

Restarting above pods

kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS        AGE
calico-kube-controllers-79949b87d-4lgkr   1/1     Running   1 (3h44m ago)   5d22h
calico-node-2lfqp                         1/1     Running   1 (3h44m ago)   5d21h
calico-node-ll8mh                         1/1     Running   1 (3h44m ago)   5d22h
calico-node-sdc72                         1/1     Running   2 (3h44m ago)   5d21h
coredns-674b8bbfcf-55kgn                  1/1     Running   1 (3h44m ago)   5d22h
coredns-674b8bbfcf-wfshm                  1/1     Running   1 (3h44m ago)   5d22h
etcd-kub-master                           1/1     Running   1 (3h44m ago)   5d22h
kube-apiserver-kub-master                 1/1     Running   1 (3h44m ago)   5d22h
kube-controller-manager-kub-master        1/1     Running   1 (3h44m ago)   5d22h
kube-proxy-r4wzl                          1/1     Running   1 (3h44m ago)   5d22h
kube-proxy-smzdh                          1/1     Running   1 (3h44m ago)   5d21h
kube-proxy-v9v54                          1/1     Running   2 (3h44m ago)   5d21h
kube-scheduler-kub-master                 1/1     Running   1 (3h44m ago)   5d22h
kubectl delete pods kube-apiserver-kub-master kube-controller-manager-kub-master etcd-kub-master kube-scheduler-kub-master -n kube-system
pod "kube-apiserver-kub-master" deleted
pod "kube-controller-manager-kub-master" deleted
pod "etcd-kub-master" deleted
pod "kube-scheduler-kub-master" deleted

After this above pods are started again taking new SSL certs in effect.

kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS        AGE
calico-kube-controllers-79949b87d-4lgkr   1/1     Running   1 (3h46m ago)   5d22h
calico-node-2lfqp                         1/1     Running   1 (3h45m ago)   5d21h
calico-node-ll8mh                         1/1     Running   1 (3h46m ago)   5d22h
calico-node-sdc72                         1/1     Running   2 (3h46m ago)   5d22h
coredns-674b8bbfcf-55kgn                  1/1     Running   1 (3h46m ago)   5d22h
coredns-674b8bbfcf-wfshm                  1/1     Running   1 (3h46m ago)   5d22h
etcd-kub-master                           0/1     Pending   0               6s
kube-apiserver-kub-master                 1/1     Running   1 (3h46m ago)   6s
kube-controller-manager-kub-master        0/1     Pending   0               6s
kube-proxy-r4wzl                          1/1     Running   1 (3h46m ago)   5d22h
kube-proxy-smzdh                          1/1     Running   1 (3h45m ago)   5d21h
kube-proxy-v9v54                          1/1     Running   2 (3h46m ago)   5d22h
kube-scheduler-kub-master                 0/1     Pending   0               6s

Adding new CSR

Base64 encode CSR content and create YAML as following

vi csr.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: my-ssl-cert
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ2t6Q0NBWHNDQVFBd1RqRUxNQWtHQTFVRUJoTUNTVTR4Q3pBSkJnTlZCQWdNQWtoU01Rd3dDZ1lEVlFRSApEQU5IUjA0eERUQUxCZ05WQkFvTUJFaHZiV1V4RlRBVEJnTlZCQU1NRERFNU1pNHhOamd1TVM0ek5UQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNaWw2VERhbE0zU21xYkVZVHJuelZXRm5aQ0YKMG83K0d2MGxPbnhvTEYvOS8reDZMY3QxdklFNnk5UVNVenN2ZTU5dWJPRXpLYnNYeERNWXlwUGpuSUNPZUQ4Mwp4WE5zSFZ6S2RhNkdiL3luZ0ttZ3VnMU5MdTk4czRrSXZKczJWV3pIVFg1dWJHUTJHOWlLY3RCckk5dXFMQXNCCnBlaU9EY3YvbllsUnZsMm5sSXdHVE05YXA2R2pEK005c0F3NlRhQ2tadDNoaWlOcWwrbkFYdFd2ZXBSVnlOdS8KMVlQZFdQeEgyQ0VVVzhZWUVtR2liOTROcytsU012eUZ2Wk1PWVhxVTJBTVlJa004T0Zla2hMTlVrT3FmUzV4bAorUFNZa3A4ck92YldRZHNNUU5QdFNBamxSMXBFN0NpOFc2cndSSlI3RmxicC9ZNk1LSGhjWnlkUlhiY0NBd0VBCkFhQUFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJzWm9hTXkyRElTNGdudjBpUzBsVUNDUFBrL0RBTG42blUKVDgwdjlyRHBpb2swa1M3K3RFaSs4cVRId0hOcURnVXpYeWxkYmlaaWhibkJDbzVVRThsdkF0RmZBM04xWjJoNwowWDJWU1dlRWNucGo1YmFuQVU3UjYxUHR5NFFNMy83eXVIMmJDVE1yR2grSUlyTWRCWHV4dUlrSndBamYwQWVnCklRanRWY2NFVlhwd2ZnamJIZXp6UktScEpFOTRUaVFSN29ob1lnU1A1dm5vVFpROWtGVkRNWmtRK2Q5cmJ1czUKRGdVTE9NckhBQzcrWDVtam5Va0NWaUJTVlMxU3BhUnQwOWJpdjRMbU95MWpWNXNpemd6dTVoVm94T3NNLzB3VQpNaWNqa3RwSkM0MGRFamEwc1drYSt4bWZYUDhsV2xqcUZiQlhhNDFEL09OdWZCNXJKRjhlCi0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: "home.com/newsign"
  expirationSeconds: 86400000  # Optional: 10 days
  usages:
    - client auth

Apply above

kubectl apply -f csr.yaml

Check CSR

 kubectl get csr
NAME          AGE   SIGNERNAME         REQUESTOR          REQUESTEDDURATION   CONDITION
my-ssl-cert   15s   home.com/newsign   kubernetes-admin   2y270d              Pending

Approve

kubectl certificate approve my-ssl-cert
certificatesigningrequest.certificates.k8s.io/my-ssl-cert approved

Check again

kubectl get csr
NAME          AGE   SIGNERNAME         REQUESTOR          REQUESTEDDURATION   CONDITION
my-ssl-cert   56s   home.com/newsign   kubernetes-admin   2y270d              Approved

Add new SSL certificate for apps

Create a secret using new SSL certificate and private key

kubectl create secret tls kube-app-cert --cert=server.crt --key=server.key -n default
secret/kube-app-cert created

List newly added secret

kubectl get secrets -n default
NAME                                         TYPE                                  DATA   AGE
admin-user                                   kubernetes.io/service-account-token   3      4d
kube-app-cert                                kubernetes.io/tls                     2      9s
kubernetes-dashboard-csrf                    Opaque                                1      5d19h
sh.helm.release.v1.kubernetes-dashboard.v1   helm.sh/release.v1                    1      5d19h

View certificate and private key

This shows base64 encoded output

kubectl get secrets kube-app-cert -n default -o yaml
apiVersion: v1
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURTekNDQWpPZ0F3SUJBZ0lVTGFvLytDVHU2YTVXeTNHTFNoSGxGOG9OODV3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1RqRUxNQWtHQTFVRUJoTUNTVTR4Q3pBSkJnTlZCQWdNQWtoU01Rd3dDZ1lEVlFRSERBTkhSMDR4RFRBTApCZ05WQkFvTUJFaHZiV1V4RlRBVEJnTlZCQU1NRERFNU1pNHhOamd1TVM0ek5UQWVGdzB5TlRFeE1UQXdOVEU1Ck5ESmFGdzB5TmpFeE1UQXdOVEU1TkRKYU1FNHhDekFKQmdOVkJBWVRBa2xPTVFzd0NRWURWUVFJREFKSVVqRU0KTUFvR0ExVUVCd3dEUjBkT01RMHdDd1lEVlFRS0RBUkliMjFsTVJVd0V3WURWUVFEREF3eE9USXVNVFk0TGpFdQpNelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElwZWt3MnBUTjBwcW14R0U2CjU4MVZoWjJRaGRLTy9ocjlKVHA4YUN4Zi9mL3NlaTNMZGJ5Qk9zdlVFbE03TDN1ZmJtemhNeW03RjhRekdNcVQKNDV5QWpuZy9OOFZ6YkIxY3luV3VobS84cDRDcG9Mb05UUzd2ZkxPSkNMeWJObFZzeDAxK2JteGtOaHZZaW5MUQpheVBicWl3TEFhWG9qZzNMLzUySlViNWRwNVNNQmt6UFdxZWhvdy9qUGJBTU9rMmdwR2JkNFlvamFwZnB3RjdWCnIzcVVWY2pidjlXRDNWajhSOWdoRkZ2R0dCSmhvbS9lRGJQcFVqTDhoYjJURG1GNmxOZ0RHQ0pEUERoWHBJU3oKVkpEcW4wdWNaZmowbUpLZkt6cjIxa0hiREVEVDdVZ0k1VWRhUk93b3ZGdXE4RVNVZXhaVzZmMk9qQ2g0WEdjbgpVVjIzQWdNQkFBR2pJVEFmTUIwR0ExVWREZ1FXQkJTa1RiSEhTblNCdmRBeXZpM3E1Q2ppQ1ZLOXhUQU5CZ2txCmhraUc5dzBCQVFzRkFBT0NBUUVBRXFtNVcvYmRXVVFlbnNOQWYxaDdISFl1Nzh4cEdUdGUwb0dZZVRWUXNDdVAKMkJDbUUvdkFHaXplc0F2QXMvNnFwZmhNcmtEZ0NZN0llaUVqY3dnRmg0R3JOYllrVGljVVdqVUF3T0YxMUN0bQpoSlkzdnlSbUU0SGUyYmlSSDg4cG9zU1k1cTc2UHVoQU9UMEc4YnVEMUltS1pneHNVOCt0UUhJUDFhL1lNdVhNCkhNVTZGajBpTGhwd0JpTUJUYVppU09ocERobzQvUmNCbC92bEJqM01ILzhwVEJYTHlQT01aT2QyM1c3VkdVTHQKbWlrZmhWRU5ZSU93Y3pORHhzcUZTa1pDNG4zMkd0R3Rzc0IvOFpGQTh4Q0xsUW4weVZReEVxN2FaYk5jbE5iRApoNG96QVNqNUZNTU1SdXEvRGRMRkZCRFlobEdXQ0VoVFRIbjBDdU9ibmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRRElwZWt3MnBUTjBwcW0KeEdFNjU4MVZoWjJRaGRLTy9ocjlKVHA4YUN4Zi9mL3NlaTNMZGJ5Qk9zdlVFbE03TDN1ZmJtemhNeW03RjhRegpHTXFUNDV5QWpuZy9OOFZ6YkIxY3luV3VobS84cDRDcG9Mb05UUzd2ZkxPSkNMeWJObFZzeDAxK2JteGtOaHZZCmluTFFheVBicWl3TEFhWG9qZzNMLzUySlViNWRwNVNNQmt6UFdxZWhvdy9qUGJBTU9rMmdwR2JkNFlvamFwZnAKd0Y3VnIzcVVWY2pidjlXRDNWajhSOWdoRkZ2R0dCSmhvbS9lRGJQcFVqTDhoYjJURG1GNmxOZ0RHQ0pEUERoWApwSVN6VkpEcW4wdWNaZmowbUpLZkt6cjIxa0hiREVEVDdVZ0k1VWRhUk93b3ZGdXE4RVNVZXhaVzZmMk9qQ2g0ClhHY25VVjIzQWdNQkFBRUNnZ0VBSU9ZZ2xuTzdPRnJvSS9YenpLUEYrdGdvczFJRFB6em5rZldidHdXaHJscEkKV2RtQ3BCSDVuRHJXd1pRQTlQc0pJR1ZoRVlwcnRPaVFXL2NjVXM2eGtqRktBc1k5NkNTa1ZUQkJIQ0pMbEdLbQpsRlJDalZISUkxa1FCYVVGYW5Hb2oyaHlZQXVkQVhxNXdCeWJUTDhmSndlcVViZXR5MTdDQzdQWUp4N2NiQ0IyCnR4YmlzOEY0YU40eXdzUGlTdVpHYVFVYXhEOEpLVTRZcmgyVHc5ZTVoMlRIRllBUFdoY2kxZ2xHcjM4bjJpazkKQmlPR1Y5eVJ0NW5GQ2hTMHUzT3RSaWg5QTNFRzJIMHVCWVB2ZDhRSlpybTBXYzE2cE85U1pSSUluSXR4aEE0Ngp1YjlOOVZ0cUtTejRibVU1bkx4NVhTRXRzeUptUlBuZzRMVUFWajhSNlFLQmdRRHIrUE1EeldoMnJaaEZTY2pnClhNZVEwREZpdnU1bDZ1cXB1cjZFSVVpU0M5VlYyVFhnQ2oxcld3UUJid1BJMEx1TFZYZnV4UnA5ZXdiWXFIQ0EKMFRPcDlQaUsvbXIzaWtNU2phREJJNkphT1RLZVhESFA2ckNnUGhZQnAwcWloNEhrU2N4V0hFdFAzSEszSGszcgpweTNaZDJJRk50dzQ0ZTR1RklRZDN5ZFQ4d0tCZ1FEWnJYVWdKSkxPUXBiK2NzUnhzTkVDQjlHZjRQOVNUYUFGClpncWR4Ums4RkdEaExlYjhSdkM5VDhrbmFrbkVIMnB4cXpjRUhDRHNsdk1XVXQyM2psU0VjcmxnbkdBOTRWcUMKb1B2T3A0SDNpdUFmdUFZLzVrSkZHZVZXa1hLdmc3T3ZSNEpsK0FrcHJIVGlRTXdJUFgxa0tKK2dYR0Z2VmxrMQovWlRHOWd6MExRS0JnUUMyVWVjUnJRZGxpc0wzNWdaNnM3VE53czRsaVhnUTd1ellyeHk4WWlyOERJQ01rQUw4ClUyMFpJWDE2emhlU2RSUXlsNXJPdFNPK2grdkdRbjZLU1JrdDI4U2RQKzNOek5uOTM4ZXc4cU5pS29kZHE4WWcKNnlnRTUzT0JXNHhpLzJmd3hzUkdWQjRzV2h1WU9LWGp5WXUzVm5JNXJTV0NIYTQxbEV4ditCY2UyUUtCZ1FDVgp5bUV3N3puK3FhQVNGSlBOMEdqalJ0SWZmTXIxcmVrU0RmZjhQV2R5Q212b1NKZ012aHhuaVlIWWw3R1BQamNYClpVU0VsWDZxaisxVFRVNjVRejR4cm1pV2JNVmxqNitpK0hpTzZvSHJBQ3ZlWjlvVkdyUTdyT2crTy9SNWh0MmQKSGs1RE1QM05LWmw5SUMzRzlkbFZsUWJUYVA2N2lPWDIyenNIOXNWUE9RS0JnRDJYbEVLZEQ5YytWTUxEcUJ3eApoZExTOFprdUtlWXVMVnRJUkVEY20yY0dUSVFCdFBWcE9JUlU5Q1ovV1o3cENxZE1wTFc3MWVVS3V0OHdiTC95Ci85NXM2N0Ewc2duYnYxUnZuSHVWWVE2SWpaWEVlWHdNM2NvVC9tcUhmeE0vbjRBbVBPVFhGYzBub3ZKTURsSTAKc25ibGxpZjV1Y0lXRUszUWtBNlZJamlkCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
kind: Secret
metadata:
  creationTimestamp: "2025-11-10T05:21:41Z"
  name: kube-app-cert 
  namespace: default
  resourceVersion: "420370"
  uid: 81c48bef-7625-4a19-8f66-3cfcbb28cb82
type: kubernetes.io/tls

View decoded outputs

echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURTekNDQWpPZ0F3SUJBZ0lVTGFvLytDVHU2YTVXeTNHTFNoSGxGOG9OODV3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1RqRUxNQWtHQTFVRUJoTUNTVTR4Q3pBSkJnTlZCQWdNQWtoU01Rd3dDZ1lEVlFRSERBTkhSMDR4RFRBTApCZ05WQkFvTUJFaHZiV1V4RlRBVEJnTlZCQU1NRERFNU1pNHhOamd1TVM0ek5UQWVGdzB5TlRFeE1UQXdOVEU1Ck5ESmFGdzB5TmpFeE1UQXdOVEU1TkRKYU1FNHhDekFKQmdOVkJBWVRBa2xPTVFzd0NRWURWUVFJREFKSVVqRU0KTUFvR0ExVUVCd3dEUjBkT01RMHdDd1lEVlFRS0RBUkliMjFsTVJVd0V3WURWUVFEREF3eE9USXVNVFk0TGpFdQpNelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElwZWt3MnBUTjBwcW14R0U2CjU4MVZoWjJRaGRLTy9ocjlKVHA4YUN4Zi9mL3NlaTNMZGJ5Qk9zdlVFbE03TDN1ZmJtemhNeW03RjhRekdNcVQKNDV5QWpuZy9OOFZ6YkIxY3luV3VobS84cDRDcG9Mb05UUzd2ZkxPSkNMeWJObFZzeDAxK2JteGtOaHZZaW5MUQpheVBicWl3TEFhWG9qZzNMLzUySlViNWRwNVNNQmt6UFdxZWhvdy9qUGJBTU9rMmdwR2JkNFlvamFwZnB3RjdWCnIzcVVWY2pidjlXRDNWajhSOWdoRkZ2R0dCSmhvbS9lRGJQcFVqTDhoYjJURG1GNmxOZ0RHQ0pEUERoWHBJU3oKVkpEcW4wdWNaZmowbUpLZkt6cjIxa0hiREVEVDdVZ0k1VWRhUk93b3ZGdXE4RVNVZXhaVzZmMk9qQ2g0WEdjbgpVVjIzQWdNQkFBR2pJVEFmTUIwR0ExVWREZ1FXQkJTa1RiSEhTblNCdmRBeXZpM3E1Q2ppQ1ZLOXhUQU5CZ2txCmhraUc5dzBCQVFzRkFBT0NBUUVBRXFtNVcvYmRXVVFlbnNOQWYxaDdISFl1Nzh4cEdUdGUwb0dZZVRWUXNDdVAKMkJDbUUvdkFHaXplc0F2QXMvNnFwZmhNcmtEZ0NZN0llaUVqY3dnRmg0R3JOYllrVGljVVdqVUF3T0YxMUN0bQpoSlkzdnlSbUU0SGUyYmlSSDg4cG9zU1k1cTc2UHVoQU9UMEc4YnVEMUltS1pneHNVOCt0UUhJUDFhL1lNdVhNCkhNVTZGajBpTGhwd0JpTUJUYVppU09ocERobzQvUmNCbC92bEJqM01ILzhwVEJYTHlQT01aT2QyM1c3VkdVTHQKbWlrZmhWRU5ZSU93Y3pORHhzcUZTa1pDNG4zMkd0R3Rzc0IvOFpGQTh4Q0xsUW4weVZReEVxN2FaYk5jbE5iRApoNG96QVNqNUZNTU1SdXEvRGRMRkZCRFlobEdXQ0VoVFRIbjBDdU9ibmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==" | base64 --decode
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIULao/+CTu6a5Wy3GLShHlF8oN85wwDQYJKoZIhvcNAQEL
BQAwTjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAkhSMQwwCgYDVQQHDANHR04xDTAL
BgNVBAoMBEhvbWUxFTATBgNVBAMMDDE5Mi4xNjguMS4zNTAeFw0yNTExMTAwNTE5
NDJaFw0yNjExMTAwNTE5NDJaME4xCzAJBgNVBAYTAklOMQswCQYDVQQIDAJIUjEM
MAoGA1UEBwwDR0dOMQ0wCwYDVQQKDARIb21lMRUwEwYDVQQDDAwxOTIuMTY4LjEu
MzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIpekw2pTN0pqmxGE6
581VhZ2QhdKO/hr9JTp8aCxf/f/sei3LdbyBOsvUElM7L3ufbmzhMym7F8QzGMqT
45yAjng/N8VzbB1cynWuhm/8p4CpoLoNTS7vfLOJCLybNlVsx01+bmxkNhvYinLQ
ayPbqiwLAaXojg3L/52JUb5dp5SMBkzPWqehow/jPbAMOk2gpGbd4YojapfpwF7V
r3qUVcjbv9WD3Vj8R9ghFFvGGBJhom/eDbPpUjL8hb2TDmF6lNgDGCJDPDhXpISz
VJDqn0ucZfj0mJKfKzr21kHbDEDT7UgI5UdaROwovFuq8ESUexZW6f2OjCh4XGcn
UV23AgMBAAGjITAfMB0GA1UdDgQWBBSkTbHHSnSBvdAyvi3q5CjiCVK9xTANBgkq
hkiG9w0BAQsFAAOCAQEAEqm5W/bdWUQensNAf1h7HHYu78xpGTte0oGYeTVQsCuP
2BCmE/vAGizesAvAs/6qpfhMrkDgCY7IeiEjcwgFh4GrNbYkTicUWjUAwOF11Ctm
hJY3vyRmE4He2biRH88posSY5q76PuhAOT0G8buD1ImKZgxsU8+tQHIP1a/YMuXM
HMU6Fj0iLhpwBiMBTaZiSOhpDho4/RcBl/vlBj3MH/8pTBXLyPOMZOd23W7VGULt
mikfhVENYIOwczNDxsqFSkZC4n32GtGtssB/8ZFA8xCLlQn0yVQxEq7aZbNclNbD
h4ozASj5FMMMRuq/DdLFFBDYhlGWCEhTTHn0CuObng==
-----END CERTIFICATE-----

Use newly added SSL certificate in apps (eg nginx)

Prepare YAML file as following. Do use “kube-nginx-cert” in “secretName” variable

vi nginx 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-web-app
  labels:
    app: nginx-web
  annotations:
    cni.projectcalico.org/ipAddrs: "[\"192.168.100.50\"]"
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 443
    volumeMounts:
    - name: tls-secret
      mountPath: "/etc/ssl"
      readOnly: true
    - name: nginx-config
      mountPath: "/etc/nginx/nginx.conf"
      subPath: nginx.conf
      readOnly: true
  volumes:
  - name: tls-secret
    secret:
      secretName: kube-nginx-cert
  - name: nginx-config
    configMap:
      name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-web-svc
spec:
  selector:
    app: nginx-web
  ports:
  - protocol: TCP
    port: 443
    targetPort: 443
  type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |

    events {}

    http {
        server {
            listen 443 ssl;
            server_name localhost;

            ssl_certificate /etc/ssl/tls.crt;
            ssl_certificate_key /etc/ssl/tls.key;

            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    }

Apply to create/patch app pod

kubectl apply -f nginx.yaml

Check pod status

kubectl get pods
NAME                                  READY   STATUS    RESTARTS        AGE
mysql-colt-database-99ccb9f97-md8l8   1/1     Running   1 (5h13m ago)   3d20h
mysql-colt-database-99ccb9f97-qq27l   1/1     Running   1 (5h13m ago)   3d20h
nginx-web-app                         1/1     Running   0               5m33s

Check NodePort of app to access via worker/controller node ipAddrs

kubectl get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP         5d23h
mysql-svc       ClusterIP   10.108.111.223   <none>        3306/TCP        3d21h
nginx-web-svc   NodePort    10.97.39.153     <none>        443:31977/TCP   6m30s

Here you can see service port exposed on worker/controller node IPs is 31977

Access https://192.168.1.35:31977  or https://192.168.1.36:31977  or https://192.168.1.37:31977  from web browser to confirm SSL cert

manish