Пример Ingress в minikube (Nginx) + TLS
Делаю: 23.04.2019
По материалам:
https://www.youtube.com/watch?v=7K0gAYmWWho&list=PLShDm2AZYnK3cWZpOjV7nOpL7plH2Ztz0&index=2
$ minikube start
$ minikube addons enable ingress
$ kubectl get pods -n kube-system | grep ingress
nginx-ingress-controller-7c66d668b-vjnqc 1/1 Running 0 4m22s
$ kubectl run nginx --image=nginx
$ kubectl expose deployment nginx --port 80
$ cat <<EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
EOF
$ echo "$(minikube ip) example.com" | sudo tee -a /etc/hosts
$ curl example.com
OK
Самоподписанный сертификат
Генерим сертификат
$ cd ~/tmp
$ openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout tls.key -out tls.crt -subj "/CN=example.com" -days 365
Создаем секрет cо сгенерированным сертификатом
$ kubectl create secret tls example-com-tls --cert=tls.crt --key=tls.key
// удалить потом можно командой
$ kubectl delete secret example-com-tls
$ kubectl get secret -o yaml
$ cat <<EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
tls:
- secretName: example-com-tls
hosts:
- example.com
rules:
- host: example.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
EOF
$ curl -k https://example.com
$ curl --cacert tls.crt https://example.com
Automatically Provision TLS Certificates in K8s with cert-manager
https://www.youtube.com/watch?v=JJTJfl-V_UM&list=PLShDm2AZYnK3cWZpOjV7nOpL7plH2Ztz0&index=3
https://github.com/jetstack/cert-manager
// удалить потом можно командой
$ kubectl delete secret example-com-tls
$ kubectl delete ing nginx
// У меня уже был установлен локально
$ helm init
https://docs.cert-manager.io/en/latest/getting-started/install.html
# Install the CustomResourceDefinition resources separately
kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml
# Create the namespace for cert-manager
kubectl create namespace cert-manager
# Label the cert-manager namespace to disable resource validation
kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io
# Update your local Helm chart repository cache
helm repo update
# Install the cert-manager Helm chart
helm install \
--name cert-manager \
--namespace cert-manager \
--version v0.7.0 \
jetstack/cert-manager
$ kubectl get crd
NAME CREATED AT
certificates.certmanager.k8s.io 2019-04-23T01:34:01Z
challenges.certmanager.k8s.io 2019-04-23T01:34:05Z
clusterissuers.certmanager.k8s.io 2019-04-23T01:34:05Z
issuers.certmanager.k8s.io 2019-04-23T01:34:05Z
orders.certmanager.k8s.io 2019-04-23T01:34:05Z
$ openssl genrsa -out ca.key 2048
$ cp /etc/ssl/openssl.cnf openssl-with-ca.cnf
$ vi openssl-with-ca.cnf
https://github.com/jetstack/cert-manager/issues/279
Вставляю перед [ usr_cert ]
[ v3_ca ]
basicConstraints = critical,CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
$ openssl req -x509 -new -nodes -key ca.key -sha256 -subj "/CN=sampleissuer.local" -days 1024 -out ca.crt -extensions v3_ca -config openssl-with-ca.cnf
$ kubectl create secret tls ca-key-pair --key=ca.key --cert=ca.crt
$ cat <<EOF | kubectl apply -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Issuer
metadata:
name: ca-issuer
namespace: default
spec:
ca:
secretName: ca-key-pair
EOF
$ kubectl get issuer
NAME AGE
ca-issuer 11s
$ cat <<EOF | kubectl apply -f -
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls
issuerRef:
name: ca-issuer
kind: Issuer
commonName: example.com
dnsNames:
- www.example.com
EOF
$ kubectl get certificate
NAME
example-com
$ kubectl describe certificate example-com
$ kubectl get secret
NAME TYPE DATA AGE
ca-key-pair kubernetes.io/tls 2 6m13s
default-token-kjt2v kubernetes.io/service-account-token 3 59m
example-com-tls kubernetes.io/tls 3 94s
$ kubectl get secret example-com-tls -o yaml
$ cat <<EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
tls:
- secretName: example-com-tls
hosts:
- example.com
rules:
- host: example.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
EOF
$ kubectl get ing nginx -o yaml
https://example.com/
Использование сертификатов Let’s Encrypt совместно с cert-manager.
https://www.youtube.com/watch?v=etC5d0vpLZE&list=PLShDm2AZYnK3cWZpOjV7nOpL7plH2Ztz0&index=4
Не доразобрался. Не хочется пока разбираться с доступом к сайту из интернета. И мне пока видится, что лучше поставить сертификат на haproxy сервер который будет стоять перед kubernetes кластером (по крайней мере на локальном, а не на облачном).