cert-manager es un proyecto de código abierto de gestión de certificados nativa de la nube que se utiliza para proporcionar certificados HTTPS y renovarlos automáticamente en un clúster de Kubernetes, y admite la emisión de certificados gratuitos como Let's Encrypt y HashiCorp Vault. En un clúster de Kubernetes, podemos implementar HTTPS automatizado para servicios externos a través de Kubernetes Ingress y Let's Encrypt.
Hoy configuraremos el controlador de entrada de kubernetes para que use cert-manager para emitir comunicaciones gratuitas e implementar solicitudes de acceso normales.
Introducción al medio ambiente:
Nombre de host | Caracteristicas | dirección IP | |
---|---|---|---|
equilibrio de carga | Balanceador de carga responsable de simular el entorno de nube pública | 172.20.128.49 | |
Maestro | entorno de nodo único k8s | 172.20.128.50 | ** |
Diagrama de topología experimental:
Descripción experimental: debido a que el entorno experimental no tiene un dispositivo de equilibrio de carga de nube pública, aquí se utiliza haproxy para reemplazar el equilibrio de carga del entorno de nube pública. Finalmente, todo el proceso de solicitud es que la solicitud del cliente se envía a haproxy, y luego la solicitud se reenvía al nodo k8s-master. El servicio de ingress-nginx expuso su eslogan a través de nodeport.
1. Primero ejecute un nginx Pod como recurso de prueba y luego acceda a él a través del puerto externo expuesto de ingress-nginx.
Cree un espacio de nombres de cert-manager como el espacio de nombres de prueba
kubectl cree ns cert-manager
y luego cree una lista de recursos para generar los recursos de prueba necesarios
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: cert-manager
spec:
replicas: 1
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:latest
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
name: http-service
namespace: cert-manager
spec:
selector:
app: httpd
type: ClusterIP
ports:
- port: 80
targetPort: 80
En este punto, vemos los recursos en todo el espacio de nombres de cert-manager
y usamos el comando curl para solicitar directamente el servicio nginx en el nodo k8s.
2. Agrega una regla de acceso para el ingreso.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: http-ingress
namespace: cert-manager
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: httpd.test.com
http:
paths:
- path:
backend:
serviceName: http-service
servicePort: 80
En el archivo de hosts locales, resuelva la dirección IP del nodo principal con el nombre de dominio especificado por la regla de entrada y luego envíe una solicitud al navegador para su verificación
3. A continuación, utilice el componente de gestión de cert-manager para configurar la estrategia de generación de certificados.
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-http01
namespace: cert-manager
spec:
selfSigned: {}
Configurar certificado
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: httpd-test-com
namespace: cert-manager
spec:
dnsNames:
- httpd.test.com # 要签发证书的域名
issuerRef:
name: letsencrypt-http01 # 引用 Issuer,指示采用 http01 方式进行校验
secretName: httpd-test-com # 最终签发出来的证书会保存在这个 Secret 里面
Verifique el certificado recién generado, k8s lo ha encapsulado en secreto
kubectl get certificate -n cert-manager
4. Modifique la regla de acceso de ingreso en este momento y agregue un campo de autenticación tls.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: http-ingress
namespace: cert-manager
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: httpd.test.com
http:
paths:
- path:
backend:
serviceName: http-service
servicePort: 80
tls:
- hosts:
- httpd.test.com # ingress定义的域名
secretName: httpd-test-com # Certificate资源清单中定义的secretName
Utilice el protocolo https para solicitar en el navegador, en este momento debe solicitar el puerto 32232
Debido a que es un certificado autofirmado, le indicará que la conexión no es segura. Dado que no hay equilibrio de carga en el entorno de prueba local, la dirección que usamos para acceder al servicio es el nombre de dominio más el número de puerto. En este momento, haproxy se puede utilizar para simular una configuración de equilibrio de carga.
5. Modifique el archivo de configuración haproxy para que las solicitudes del cliente proxy al nodo maestro
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
log global
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
frontend kube-apiserver
bind *:443 # 指定前端端口
mode tcp
default_backend master
backend master # 指定后端机器及端口,负载方式为轮询
balance roundrobin
server master 172.20.128.50:32232 check maxconn 2000 // 此处指定的是master节点ingress-nginx暴漏的用于https协议的端口号
Luego modificamos la resolución del nombre de dominio original en el archivo de hosts locales del cliente a la dirección actual de
haproxy 172.20.128.49 httpd.test.com y
usamos el nombre de dominio directamente en el navegador para probar
todo el ejemplo de configuración.