Post

Install Rancher with Lets Encrypt on Kubernetes

Install Rancher with Lets Encrypt on Kubernetes

Rancher is a Kubernetes management tool to deploy and run clusters anywhere and on any provider.

🎞️ Watch Video

Prerequisites:

  • Kubernetes cluster
  • Helm 3.x
  • Domain name and ability to perform DNS changes

Install nginx ingress controller

1
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.3/deploy/static/provider/baremetal/deploy.yaml

Change the ‘ingress-nginx-controller’ service type to LoadBalancer

1
kubectl edit svc ingress-nginx-controller -n ingress-nginx

Create an A record with the IP Address of ‘ingress-nginx-controller’ service in your domain ragistrar.

1
nslookup subdomain_name

Install cert-manager with Helm

Add the Helm repository:

1
helm repo add jetstack https://charts.jetstack.io --force-update

Update the helm chart repository:

1
helm repo update

Install cert-manager:

1
2
3
4
5
6
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.19.1 \
  --set crds.enabled=true

Generate a private CA and use it with Rancher via cert-manager

Create a config file ca.cnf with CA extensions:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
x509_extensions    = v3_ca
prompt             = no

[ req_distinguished_name ]
CN = rancher-private-ca

[ v3_ca ]
basicConstraints = CA:TRUE
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always

Generate CA key and cert

1
2
openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 \
  -keyout ca.key -out ca.crt -config ca.cnf -nodes

Generate Rancher Server TLS Cert Signed by Private CA

Create a CSR config rancher-csr.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[req]
default_bits       = 2048
prompt             = no
default_md         = sha256
distinguished_name = dn
req_extensions     = req_ext

[dn]
CN = rancher.mkbn.in

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = rancher.mkbn.in

Generate private key and CSR

1
2
3
openssl genrsa -out tls.key 2048

openssl req -new -key tls.key -out tls.csr -config rancher-csr.cnf

Sign CSR with your CA

1
2
3
openssl x509 -req -in tls.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out tls.crt -days 365 -sha256 -extfile rancher-csr.cnf -extensions req_ext

Create cattle-system namesapce

1
kubectl create ns cattle-system

Create Kubernetes Secrets

Create CA certificate secret (generic).This secret is for Rancher to trust your private CA.

1
2
3
kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=ca.crt
kubectl -n cattle-system create secret generic tls-ca-additional --from-file=cacerts.pem=ca.crt

Create TLS secret for Rancher ingress.This secret holds your Rancher TLS cert and key signed by your private CA.

1
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key

Create cert-manager ClusterIssuer Using CA

1
2
3
4
5
6
7
8
9
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: rancher-ca-issuer
spec:
  ca:
    secretName: tls-ca
EOF

Install Rancher:

Add the rancher stable helm repository

1
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

Add the Helm repository

1
helm repo update

Retrieve the package from rancher repository, and download it locally

1
helm fetch rancher-stable/rancher --untar

Deploy Rancher

1
2
3
4
5
6
7
8
9
10
helm upgrade --install rancher rancher-stable/rancher --namespace cattle-system \
  --set hostname=rancher.mkbn.in \
  --set bootstrapPassword=P@ssw0rd \
  --set ingress.tls.source=secret \
  --set ingress.tls.secretName=tls-rancher-ingress \
  --set ingress.ingressClassName=nginx \
  --set privateCA=true \
  --set additionalTrustedCAs=true \
  --set-string "additionalTrustedCASecrets[0]=tls-ca" \
  --set replicas=3

Verify that the Rancher Server is Successfully Deployed

1
kubectl get pods -n cattle-system -w
1
kubectl -n cattle-system rollout status deploy/rancher

Access Rancher User Interface

1
https://rancher.url
This post is licensed under CC BY 4.0 by the author.