Configuración del controlador de entrada nativo de OCI
Descubra cómo configurar y personalizar el controlador de entrada nativo de OCI para equilibrar la carga y enrutar el tráfico entrante a los pods de servicio que se ejecutan en nodos de trabajador en un cluster de Kubernetes.
Cuando haya instalado el controlador de entrada nativo de OCI (ya sea como programa independiente o como complemento de cluster) y creado los recursos relacionados con la entrada de Kubernetes necesarios para utilizarlo, puede configurar el controlador de entrada nativo de OCI:
- Especificación de reglas de ruta para el controlador de entrada nativo de OCI
- Personalización del comportamiento del controlador de entrada nativo de OCI mediante anotaciones
- Configuración de una puerta de preparación de pod
- Configuración de listeners TCP
- Adición de compatibilidad con solicitudes HTTPS/TLS
- Agregación de puertos de listener HTTP/HTTPS
- Conservación del equilibrador de carga después de la supresión de IngressClass
- Aplicación de etiquetas al equilibrador de carga
Especificación de reglas de ruta para el controlador de entrada nativo de OCI
Para especificar cómo el equilibrador de carga de OCI creado por el controlador de entrada nativo de OCI (instalado como programa independiente o como complemento de cluster) enruta las solicitudes entrantes, especifique reglas de ruta en el manifiesto Ingress
.
Enrutar solicitudes según el host
Puede configurar el controlador de entrada nativo de OCI para enrutar una solicitud entrante según el nombre de dominio en la cabecera Host de la solicitud (el host al que se envió originalmente la solicitud).
Para enrutar una solicitud a un puerto y servicio de backend concreto según el host, cree una regla de ruta en el manifiesto Ingress
. Si el host coincide con la regla de ruta, el controlador de entrada nativo de OCI enruta la solicitud al puerto y servicio de backend asociados.
Por ejemplo, puede definir la siguiente regla para direccionar las solicitudes enviadas originalmente a http://foo.bar.com
a un servicio de backend denominado ServiceA en el puerto 80. Todo el tráfico entrante enviado originalmente a http://foo.bar.com
se direcciona a ServiceA en el puerto 80.
kind: Ingress
...
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: /
backend:
serviceName: ServiceA
servicePort: 80
Enrutar solicitudes a diferentes servicios de backend según la ruta de acceso
Puede configurar el controlador de entrada nativo de OCI para enrutar las solicitudes entrantes a diferentes servicios de backend, en función de los elementos de la ruta a la que se enviaron originalmente las solicitudes.
Para enrutar una solicitud a un puerto y servicio de backend concreto según la ruta de acceso, cree una regla de ruta en el manifiesto Ingress
. Si la ruta coincide con la regla de ruta, el controlador de entrada nativo de OCI enruta la solicitud al puerto y servicio de backend asociados. Puede especificar varias rutas en la misma regla para enrutar solicitudes a backends diferentes.
Por ejemplo, puede definir la siguiente regla para enrutar solicitudes en función de la ruta a la que se envió originalmente la solicitud:
- Si la ruta empieza por /app1, el controlador de entrada nativo de OCI enruta la solicitud a un servicio de backend denominado ServiceA en el puerto 80.
- Si la ruta empieza por /app2, el controlador de entrada nativo de OCI enruta la solicitud a un servicio de backend denominado ServiceB en el puerto 443.
Puesto que la regla no especifica un host, la regla se aplica a todo el tráfico entrante.
kind: Ingress
...
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /app1
backend:
serviceName: ServiceA
servicePort: 80
- pathType: Prefix
path: /app2
backend:
serviceName: ServiceB
servicePort: 443
Enrutar solicitudes según el host y la ruta
Puede configurar el controlador de entrada nativo de OCI para enrutar una solicitud entrante según el nombre de dominio de la cabecera Host de la solicitud (el host al que se envió originalmente la solicitud) y los elementos de la ruta a la que se envió la solicitud original.
Para enrutar una solicitud a un puerto y servicio de backend concreto según el host y la ruta de acceso, cree una regla de ruta en el manifiesto Ingress
. Si el host y la ruta coinciden con la regla de ruta, el controlador de entrada nativo de OCI enruta la solicitud al puerto y servicio de backend asociados.
Por ejemplo, puede definir la siguiente regla para direccionar las solicitudes enviadas originalmente a http://foo.bar.com/app1
a un servicio de backend denominado foo en el puerto 80:
kind: Ingress
...
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: /app1
backend:
serviceName: foo
servicePort: 80
Enrutar solicitudes a un backend por defecto
Puede configurar el controlador de entrada nativo de OCI para enrutar las solicitudes entrantes a un backend por defecto. Puede configurar un backend por defecto para gestionar solicitudes que no coincidan con ninguna regla de ruta.
Por ejemplo, puede definir el siguiente defaultBackend
para direccionar solicitudes que no coincidan con otras reglas del manifiesto Ingress
a un servicio de backend denominado ServiceC en el puerto 8080.
Tenga en cuenta que si no especifica ninguna otra regla en un manifiesto Ingress
, debe especificar un defaultBackend
.
kind: Ingress
...
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /app1
backend:
serviceName: ServiceA
servicePort: 80
- pathType: Prefix
path: /app2
backend:
serviceName: ServiceB
servicePort: 443
defaultBackend:
service:
name: ServiceC
port:
number: 8080
Personalización del comportamiento del controlador de entrada nativo de OCI mediante anotaciones
Puede agregar anotaciones a los manifiestos de recursos IngressClass
o Ingress
para personalizar el comportamiento del controlador de entrada nativo de OCI (instalado como programa independiente o como complemento de cluster).
Personalización del comportamiento general mediante anotaciones
Puede agregar anotaciones a los manifiestos de recursos IngressClass
o Ingress
para personalizar el comportamiento general del controlador de entrada nativo de OCI.
anotación | Descripción | Agregar anotación a este manifiesto de recurso | Ejemplo |
---|---|---|---|
oci-native-ingress.oraclecloud.com/id |
OCID de un equilibrador de carga de OCI existente que utilizar, en lugar de crear uno nuevo. Tenga en cuenta que si especifica un equilibrador de carga existente, el controlador de entrada nativo de OCI gestiona el equilibrador de carga y actualiza sus propiedades según sea necesario para alinearse con los valores de los manifiestos de recursos IngressClassParameters, IngressClass e Ingress. |
IngressClass |
oci-native-ingress.oraclecloud.com/id: ocid1.loadbalancer.oc1.iad.aaaaaaaan___u7a |
oci-native-ingress.oraclecloud.com/defined-tags |
Una o más etiquetas definidas que aplicar al equilibrador de carga, en formato JSON. Consulte Aplicación de etiquetas definidas al equilibrador de carga. |
IngressClass |
oci-native-ingress.oraclecloud.com/defined-tags: '{"tag-namespace-1": {"key1": "value1", "key2": "value2"}, "tag-namespace-2": {"key1": "value1"}}' |
oci-native-ingress.oraclecloud.com/freeform-tags |
Una o más etiquetas de formato libre que aplicar al equilibrador de carga, en formato JSON. Consulte Aplicación de etiquetas de formato libre al equilibrador de carga. |
IngressClass |
oci-native-ingress.oraclecloud.com/freeform-tags: '{"key1": "value1", "key2": "value2"}' |
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true" |
Si se debe conservar el equilibrador de carga si se suprime IngressClass. Si se define en Consulte Conservación del equilibrador de carga después de la supresión de IngressClass. |
IngressClass |
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true" |
oci-native-ingress.oraclecloud.com/network-security-group-ids |
Uno o más OCID de grupos de seguridad de red (NSG) a los que agregar el equilibrador de carga, en una lista delimitada por comas. Si no se especifica, el equilibrador de carga no se agrega a ningún NSG. | IngressClass |
oci-native-ingress.oraclecloud.com/network-security-group-ids: 'ocid1.networksecuritygroup.oc1.iad.agx___kby, ocid1.networksecuritygroup.oc1.iad.ahr___mlo' |
oci-native-ingress.oraclecloud.com/waf-policy-ocid |
OCID de una política de firewall de aplicación web (WAF) existente. Consulte Políticas de Web Application Firewall. | IngressClass |
oci-native-ingress.oraclecloud.com/waf-policy-ocid: ocid1.webappfirewallpolicy.oc1.iad.ama___aqq |
oci-native-ingress.oraclecloud.com/protocol |
Protocolo que se utilizará para el listener en el equilibrador de carga. Uno de HTTP2 o TCP. (Tenga en cuenta que si especifica HTTP2 como protocolo, se necesita un listener configurado con TLS). |
Ingress |
oci-native-ingress.oraclecloud.com/protocol: "HTTP2" |
oci-native-ingress.oraclecloud.com/backend-tls-enabled |
Si los pods de servicio de backend pueden recibir solicitudes TLS. Si se define en |
Ingress |
oci-native-ingress.oraclecloud.com/backend-tls-enabled: "false" |
oci-native-ingress.oraclecloud.com/http-listener-port |
Cree un único puerto de listener para todas las rutas HTTP en esta entrada, en lugar de crear un puerto de listener para cada puerto de servicio. Las políticas de enrutamiento se configuran según corresponda. |
Ingress |
oci-native-ingress.oraclecloud.com/http-listener-port: "100" |
oci-native-ingress.oraclecloud.com/https-listener-port |
Cree un único puerto de listener para todas las rutas HTTPS en esta entrada, en lugar de crear un puerto de listener para cada puerto de servicio. Las políticas de enrutamiento se configuran según corresponda. | Ingress |
oci-native-ingress.oraclecloud.com/https-listener-port: "500" |
oci-native-ingress.oraclecloud.com/policy |
Política que utilizará el juego de backends del equilibrador de carga para la distribución del tráfico. | Ingress |
oci-native-ingress.oraclecloud.com/policy: "ROUND_ROBIN" |
Personalización del comportamiento de las comprobaciones del sistema mediante anotaciones
Puede agregar anotaciones al manifiesto de recurso Ingress
para personalizar las comprobaciones del sistema realizadas por el equilibrador de carga creado por el controlador de entrada nativo de OCI. Para obtener más información sobre las comprobaciones del sistema del equilibrador de carga, consulte Comprobaciones del sistema para equilibradores de carga.
anotación | Descripción | Agregar anotación a este manifiesto de recurso | Ejemplo |
---|---|---|---|
oci-native-ingress.oraclecloud.com/healthcheck-protocol |
Protocolo que se utilizará para las comprobaciones del sistema del juego de backends del equilibrador de carga. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-protocol: "HTTP" |
oci-native-ingress.oraclecloud.com/healthcheck-port |
Puerto que se utilizará para las comprobaciones del sistema del juego de backends del equilibrador de carga. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-port: "80" |
oci-native-ingress.oraclecloud.com/healthcheck-path |
Ruta de acceso que se utilizará para las comprobaciones del sistema del juego de backends del equilibrador de carga. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-path: "/test" |
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds |
Intervalo entre las comprobaciones del sistema del juego de backends del equilibrador de carga. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds: "1000" |
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds |
Período de tiempo tras el cual se considera que la comprobación del sistema del juego de backends del equilibrador de carga ha fallado. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds: "750" |
oci-native-ingress.oraclecloud.com/healthcheck-retries |
Número de reintentos tras los cuales se considera que ha fallado la comprobación del sistema del juego de backends del equilibrador de carga. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-retries: "5" |
oci-native-ingress.oraclecloud.com/healthcheck-return-code |
Código de estado que debe devolver el juego de backends del equilibrador de carga en respuesta a una comprobación del sistema para que se considere en buen estado. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-return-code: "200" |
oci-native-ingress.oraclecloud.com/healthcheck-response-regex |
Expresión regular para analizar el cuerpo de respuesta del juego de backends del equilibrador de carga. Puede especificar cualquier valor de expresión regular (como * o / ) o un valor vacío. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-response-regex: "*" |
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext |
Si se debe enviar una comprobación del sistema al backend del equilibrador de carga sin SSL (solo HTTP). Si no se especifica, false es el valor por defecto. |
Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext: "true" |
Configuración de una puerta de preparación de pod
Las puertas de preparación de pod son condiciones adicionales incluidas en un manifiesto de pod para indicar que un pod está listo para recibir tráfico. Las puertas de preparación de pod le permiten implementar complejas comprobaciones de preparación personalizadas y pueden ayudar a lograr un tiempo de inactividad cero durante los despliegues sucesivos. Para obtener más información, consulte la sección sobre detalles sobre la preparación de los pods en la documentación de Kubernetes.
Al utilizar el controlador de entrada nativo de OCI (ya sea como programa independiente o como complemento de cluster) con un cluster que tenga una red de pod nativa de VCN como tipo de red, puede especificar que el controlador de entrada nativo de OCI inyecte una puerta de preparación de pod en la especificación de pod de cada pod creado en un espacio de nombre concreto. Tenga en cuenta que no puede utilizar el controlador de entrada nativo de OCI para inyectar puertas de preparación de pod en especificaciones de pod si el cluster tiene la superposición de franela como tipo de red.
Especifique que el controlador de entrada nativo de OCI inyecte una puerta de preparación de pod en la especificación de pod de cada pod creado en un espacio de nombres concreto introduciendo:
kubectl label ns <namespace> podreadiness.ingress.oraclecloud.com/pod-readiness-gate-inject=enabled
El controlador de entrada nativo de OCI inyecta una condición en la especificación de pod de cada pod creado en el espacio de nombres. Por ejemplo:
kind: Pod
...
spec:
readinessGates:
- conditionType: podreadiness.ingress.oraclecloud.com/k8s_6b5b1b3a38
kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testecho-7cdcfff87f-b6xt4 1/1 Running 0 35s 10.0.10.242 10.0.10.135 <none> 0/1
testecho-7cdcfff87f-b6xt4 1/1 Running 0 72s 10.0.10.242 10.0.10.135 <none> 1/1
Configuración de listeners TCP
Puede utilizar el controlador de entrada nativo de OCI (ya sea como programa independiente o como complemento de cluster) para configurar listeners del equilibrador de carga como listeners TCP. Cada listener TCP simplemente reenvía el tráfico TCP recibido en un puerto determinado al servicio de backend especificado para ese puerto en un manifiesto de recurso Ingress
, sin realizar ningún enrutamiento de capa de transporte 7.
Defina la anotación oci-native-ingress.oraclecloud.com/protocol
para especificar que el controlador de entrada nativo de OCI debe crear un listener TCP para cada puerto único que se incluya en las reglas de enrutamiento en un manifiesto de recurso Ingress
.
Para especificar que el controlador de entrada nativo de OCI cree listeners TCP:
- Defina un nuevo recurso de entrada en un archivo .yaml. Consulte Creación de recurso de entrada.
- En la sección
metadata:
, agregue un elementoannotations:
y defina la anotaciónoci-native-ingress.oraclecloud.com/protocol
enTCP
, con el formato:kind: Ingress metadata: name: <i-name> annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: ...
donde
name: <i-name>
es el nombre que elija para el recurso de entrada.Por ejemplo:
kind: Ingress metadata: name: ingress-pass-through annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: ...
- En la sección
rules:
del manifiesto de recursoIngress
, agregue una regla para cada listener que recibirá tráfico TCP:- (recomendado) Defina
paths.pathType
enImplementationSpecific
. - Defina
paths.backend.service.name
en el nombre del servicio de backend. - Establezca
paths.backend.service.port.number
en el puerto en el que recibir tráfico TCP y al que reenviar el tráfico TCP.
Por ejemplo, si desea que un listener TCP reciba en el puerto 8080 para reenviar tráfico TCP a
my-first-svc:8080
y un listener TCP reciba en el puerto 8081 para reenviar tráfico TCP amy-second-svc:8081
, puede configurar un manifiesto de recursoIngress
de la siguiente manera:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-pass-through annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: rules: - http: paths: - pathType: ImplementationSpecific backend: service: name: my-first-svc port: number: 8080 - http: paths: - pathType: ImplementationSpecific backend: service: name: my-second-svc port: number: 8081
- (recomendado) Defina
-
Cree el recurso introduciendo
kubectl create -f <filename>.yaml
Adición de compatibilidad con solicitudes HTTPS/TLS
Puede utilizar el controlador de entrada nativo de OCI (ya sea como programa independiente o como complemento de cluster) para soportar la comunicación HTTPS segura. Con el controlador de entrada nativo de OCI, puede configurar listeners y juegos de backends del equilibrador de carga de OCI para manejar el tráfico cifrado mediante TLS (anteriormente SSL).
Al utilizar el controlador de entrada nativo de OCI para soportar la comunicación HTTPS, tiene dos opciones:
- Opción 1: OCI Native Ingress Controller obtiene un certificado del servicio Certificates mediante un secreto de Kubernetes: crea un secreto de Kubernetes y especifica el nombre del secreto en un manifiesto de recurso
Ingress
. El controlador de entrada nativo de OCI utiliza el secreto de Kubernetes para obtener un certificado y un grupo de autoridades de certificación (grupo de autoridades de certificación) del servicio OCI Certificates. El controlador de entrada nativo de OCI asocia el certificado y el grupo de autoridades de certificación al listener y al juego de backends. - Opción 2: obtiene un certificado del servicio Certificates: crea manualmente un certificado en el servicio OCI Certificates. A continuación, especifique el OCID del certificado en el manifiesto de recurso
Ingress
como una anotación. El controlador de entrada nativo de OCI asocia el certificado al listener y al juego de backends.
Al manejar el tráfico HTTPS, el equilibrador de carga de OCI creado por el controlador de entrada nativo de OCI implanta TLS de extremo a extremo por defecto. El equilibrador de carga utiliza certificados para aceptar una solicitud cifrada TLS de un cliente y, a continuación, utiliza reglas de enrutamiento para reenviar la solicitud al juego de backends adecuado. El juego de backends crea una nueva conexión TLS con backends que se ejecutan en el cluster (mediante el grupo de autoridades de certificación como autoridad de confianza para la nueva conexión).
Tenga en cuenta lo siguiente:
- Si suprime un recurso
IngressClass
, el controlador de entrada nativo de OCI suprime el equilibrador de carga que ha creado o suprime el equilibrador de carga existente especificado por la anotaciónoci-native-ingress.oraclecloud.com/id
(a menos que haya definidooci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
). Sin embargo, tenga en cuenta que el controlador de entrada no suprime los recursos creados en el servicio OCI Certificates. Es responsable de suprimir dichos recursos del servicio Certificates. En particular, si ha especificado un secreto de Kubernetes en el manifiesto de recursoIngress
, tenga en cuenta que es responsable de suprimir cualquier recurso del servicio Certificates que el controlador de entrada nativo de OCI haya creado. - Los certificados obtenidos del servicio OCI Certificates de tipo Importado no se pueden rotar automáticamente. Si desea que los certificados se roten automáticamente, obtenga manualmente un certificado en el servicio OCI Certificates especificando que desea que el certificado lo emita una CA interna del servicio Certificates (los certificados son del tipo Emitidos por CA interna). Puede configurar certificados de tipo Emitidos por CA interna para que se roten automáticamente.
- Si especifica un secreto de Kubernetes en el manifiesto de recurso
Ingress
, los certificados que obtiene el controlador de entrada nativo de OCI del servicio Certificates son del tipo Importados y, por lo tanto, no se rotan automáticamente. Sin embargo, puede renovar manualmente el certificado obtenido del servicio Certificates cambiando los detalles del certificado de servidor actual especificado en el secreto de Kubernetes existente. Al cambiar los detalles del certificado del servidor, el controlador de entrada nativo de OCI actualiza los detalles correspondientes del certificado obtenido del servicio Certificates.Tenga en cuenta que el servicio Certificates no admite el cambio de información de asunto en el certificado de servidor actual (Nombre común, Nombre de organización, Nombres alternativos de asunto). Si desea cambiar la información de asunto, suprima el secreto de Kubernetes original y cree un nuevo secreto con el mismo nombre. El controlador de entrada nativo de OCI obtiene un nuevo certificado de tipo Importado y un nuevo grupo de autoridades de certificación del servicio Certificates y los asocia al listener y al juego de backends (sustituyendo el certificado anterior y el grupo de autoridades de certificación).
- Un listener solo se puede asociar a un certificado. Por lo tanto, no cree varios recursos de entrada que tengan reglas que especifiquen la misma combinación de servicio/puerto de backend, pero donde los recursos de entrada utilicen certificados diferentes.
- Por defecto, el equilibrador de carga de OCI creado por el controlador de entrada nativo de OCI implanta TLS de extremo a extremo. El equilibrador de carga finaliza la solicitud TLS en el listener y se establece una nueva conexión TLS entre el juego de backends y el juego de backends. Sin embargo, si los backends no están ejecutando un servidor HTTPS y, por lo tanto, desea que la conexión entre el juego de backends y los backends sea de texto sin formato, defina la anotación
oci-native-ingress.oraclecloud.com/backend-tls-enabled
en"false"
. Cuando la anotaciónoci-native-ingress.oraclecloud.com/backend-tls-enabled
se define en"false"
, el equilibrador de carga puede aceptar tráfico cifrado de un cliente, pero el tráfico entre el equilibrador de carga y los backends no está cifrado.
Opción 1: el controlador de entrada nativo de OCI obtiene el certificado del servicio Certificates mediante un secreto de Kubernetes
Para configurar el controlador de entrada nativo de OCI para obtener un certificado del servicio OCI Certificates:
- Obtenga un par de claves pública y privada TLS y un certificado.
En entornos de producción, obtiene un certificado TLS de la autoridad de certificación seleccionada enviando una solicitud de firma de certificado. Durante el proceso de solicitud de certificado, se generan una clave pública y la clave privada correspondiente.
En entornos de desarrollo y prueba, puede crear un certificado autofirmado y generar una clave privada usted mismo mediante una herramienta como OpenSSL. Por ejemplo (mediante OpenSSL 3.0 o posterior):
-
Genere un par de claves públicas y privadas introduciendo los siguientes comandos:
openssl genrsa -out rootCA.key 4096
openssl req -x509 -addext basicConstraints=critical,CA:TRUE -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt -subj /CN=RootCA
-
Genere un certificado introduciendo los siguientes comandos:
openssl genrsa -out server.key 4096
openssl req -new -sha256 -key server.key -subj /C=US/ST=CA/O=MyOrg,Inc./CN=my.example.com -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256
En este ejemplo:
rootCA.key
contiene el par de claves para la CA raíz.rootCA.crt
contiene el certificado de CA raíz.server.key
contiene el par de claves para generar el certificado de servidor.server.csr
contiene la solicitud de firma de certificado para el certificado de servidor.server.crt
contiene el certificado de servidor generado.
-
- Cree un recurso secreto de Kubernetes de una de las siguientes formas:
-
Mediante el comando
kubectl create secret generic
, introduzca:kubectl create secret generic <k8s-secret-name> --type=kubernetes.io/tls --from-file=ca.crt=<path-and-filename>.crt --from-file=tls.crt=<path-and-filename>.crt --from-file=tls.key=<path-and-filename>.key
donde:
<k8s-secret-name>
es el nombre que ha elegido para el secreto de Kubernetes--from-file=ca.crt=<path-and-filename>.crt
especifica la ruta de acceso al archivo que contiene el certificado de CA raíz. Por ejemplo,--from-file=ca.crt=rootCA.crt
--from-file=tls.crt=<path-and-filename>.crt
especifica la ruta al archivo que contiene el certificado de servidor generado. Por ejemplo,--from-file=tls.crt=server.crt
--from-file=tls.key=<path-and-filename>.key
especifica la ruta de acceso al archivo que contiene la clave privada generada. Por ejemplo,--from-file=tls.key=server.key
Por ejemplo:
kubectl create secret generic example-tls-secret --type=kubernetes.io/tls --from-file=ca.crt=rootCA.crt --from-file=tls.crt=server.crt --from-file=tls.key=server.key
- Mediante un archivo de manifiesto de recurso
Secret
:-
Defina el secreto de Kubernetes en un archivo .yaml con el siguiente formato:
apiVersion: v1 kind: Secret metadata: name: <k8s-secret-name> type: kubernetes.io/tls data: ca.crt: <base64-encoded-certificate-chain> tls.crt: <base64-encoded-server-certificate> tls.key: <base64-encoded-private-key>
donde:
name: <k8s-secret-name>
es el nombre que ha elegido para el recurso secreto de Kubernetes.ca.crt: <base64-encoded-certificate-chain>
es el contenido del archivo (o archivos) que contiene certificados intermedios que forman una cadena de certificados desde el certificado de hoja hasta la autoridad de certificación. Tenga en cuenta que puede omitirca.cert
, siempre que incluya toda la cadena de certificados como el valor detls.cert
(en cuyo caso, inicie la cadena de certificados con el contenido del archivo que contiene el certificado de servidor generado, seguido de los certificados restantes).tls.crt: <base64-encoded-server-certificate>
es el contenido del archivo que contiene el certificado de servidor generado.tls.key: <base64-encoded-private-key>
es el contenido del archivo que contiene la clave privada generada.
Por ejemplo:
apiVersion: v1 kind: Secret metadata: name: example-tls-secret type: kubernetes.io/tls data: ca.crt : MIIFGERTegcDFRTuSDGfghREdE______Jre tls.crt: MIIC2DCCAcCgAwIBAgIBATANBg______kqh tls.key: MIIEpgIBAAKCAQEA7yn3bRHQ5F______HMQ
-
Cree el recurso secreto introduciendo
kubectl create -f <filename>.yaml
-
-
- Agregue el secreto de Kubernetes a un manifiesto de recurso
Ingress
:- Defina un nuevo recurso de entrada en un archivo .yaml. Consulte Creación de recurso de entrada.
- En la sección
spec:
del manifiesto, agregue un elementotls:
que especifique tanto el host que va a recibir tráfico HTTPS como el nombre del secreto de Kubernetes, en el formato:kind: Ingress ... spec: tls: - hosts: - <host-name> secretName: <k8s-secret-name>
Por ejemplo:
kind: Ingress ... spec: tls: - hosts: - my.example.com secretName: example-tls-secret
- En la sección
rules:
del manifiesto, agregue una regla para el host que va a recibir tráfico HTTPS y especifique 443 como puerto en el que desea recibir tráfico HTTPS.Por ejemplo:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: acme-tls-secret-ingress spec: tls: - hosts: - my.example.com secretName: example-tls-secret rules: - host: "my.example.com" http: paths: - pathType: Prefix path: "/TLSPath" backend: service: name: tls-test port: number: 443
-
Cree el recurso introduciendo
kubectl create -f <filename>.yaml
Al crear el recurso de entrada, el controlador de entrada nativo de OCI utiliza el secreto de Kubernetes para obtener un certificado de tipo Importado y un grupo de autoridades de certificación (grupo de autoridades de certificación) del servicio OCI Certificates. El controlador de entrada nativo de OCI asocia el certificado al listener y el grupo de autoridades de certificación al juego de backends.
Cuando el listener que recibe en el puerto 443 recibe una solicitud HTTPS en el host especificado, el listener utiliza el certificado para la terminación TLS. A continuación, el listener utiliza la regla de direccionamiento para reenviar la solicitud al juego de backends. El juego de backends crea una nueva conexión TLS con los backends que se ejecutan en el cluster (mediante el grupo de autoridades de certificación como autoridad de confianza para la nueva conexión).
Opción 2: obtiene el certificado del servicio Certificates
Para configurar el controlador de entrada nativo de OCI para que utilice un certificado que haya obtenido del servicio OCI Certificates:
- Cree un certificado en el servicio OCI Certificates de una de las siguientes formas:
- mediante la importación de un certificado emitido por una CA de terceros (el certificado será del tipo Importado)
- emitiendo el certificado internamente desde una CA de servicio de certificados (el certificado será de tipo emitido por la CA interna)
No cree un certificado para gestionar externamente (de tipo Emitido por CA interna, gestionado externamente). Para obtener más información, consulte Creación de un certificado.
- Anote el OCID del certificado.
- Agregue el OCID del certificado a un manifiesto de recurso
Ingress
:- Defina un nuevo recurso de entrada en un archivo .yaml. Consulte Crear recurso de entrada.
- En la sección
metadata:
, agregue un elementoannotations:
que especifique el OCID del certificado que ha creado en el servicio OCI Certificates, con el formato:kind: Ingress metadata: name: <i-name> annotations: oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid> spec: ...
donde:
name: <i-name>
es el nombre que elija para el recurso de entrada.oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid>
es el OCID del certificado que ha creado en el servicio OCI Certificates
Por ejemplo:
kind: Ingress metadata: name: acme-tls-certificate-ingress annotations: oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc spec: ...
- En la sección
rules:
del manifiesto de recursoIngress
, agregue una regla para el host que va a recibir tráfico HTTPS y especifique 443 como puerto en el que desea recibir tráfico HTTPS.Por ejemplo:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: acme-tls-certificate-ingress annotations: oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc spec: rules: - host: "my.example.com" http: paths: - pathType: Prefix path: "/TLSPath" backend: service: name: tls-test port: number: 443
-
Cree el recurso introduciendo
kubectl create -f <filename>.yaml
Lo que sucede al crear el recurso de entrada depende de cómo haya creado el certificado en el servicio OCI Certificates:
- Si ha creado el certificado mediante la importación de un certificado emitido por una CA de terceros, el certificado es del tipo Importado. El controlador de entrada nativo de OCI asocia el certificado al listener, crea un grupo de autoridades de certificación a partir de la cadena de certificados y asocia el grupo de autoridades de certificación al juego de backends. Tenga en cuenta que no puede configurar certificados de tipo Importados para que se roten automáticamente.
- Si creó el certificado emitiendo el certificado internamente desde una CA de servicio de certificados, el certificado es del tipo Emitido por la CA interna. El controlador de entrada nativo de OCI asocia el certificado al listener, obtiene el OCID de la CA y asocia ese OCID al juego de backends. Tenga en cuenta que puede configurar certificados de tipo Emitidos por CA interna para que se roten automáticamente.
Cuando el listener que recibe en el puerto 443 recibe una solicitud HTTPS en el host especificado, el listener utiliza el certificado para la terminación TLS. A continuación, el listener utiliza la regla de direccionamiento para reenviar la solicitud al juego de backends. El juego de backends crea una nueva conexión TLS con los backends que se ejecutan en el cluster (mediante el grupo de autoridades de certificación o la autoridad de certificación identificada por su OCID, como autoridad de confianza para la nueva conexión).
Agregación de puertos de listener HTTP/HTTPS
Al utilizar el controlador de entrada nativo de OCI (ya sea como un programa independiente o como un complemento de cluster), puede agregar todo el tráfico HTTP en un único puerto de listener y, de manera similar, puede agregar todo el tráfico HTTPS en un único puerto.
Por defecto, el controlador de entrada nativo de OCI crea un listener de equilibrador de carga de OCI para cada puerto de servicio de backend definido en un manifiesto Ingress
. El controlador de entrada nativo de OCI también crea una política de enrutamiento para cada puerto de listener. Sin embargo, puede utilizar la anotación oci-native-ingress.oraclecloud.com/http-listener-port
y/o la anotación oci-native-ingress.oraclecloud.com/https-listener-port
para crear un único listener y una política de enrutamiento para todas las solicitudes HTTP, y/o un único listener y una política de enrutamiento para todas las solicitudes HTTPS.
Por ejemplo, puede definir una entrada con reglas para cuatro servicios de backend, cada uno de los cuales recibe en un puerto diferente, de la siguiente forma:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample-ingress
spec:
tls:
- hosts:
- "foo.bar.com3"
- "foo.bar.com4"
secretName: secret_name
rules:
- host: "foo.bar.com1"
http:
paths:
- pathType: Prefix
path: "/testecho1"
backend:
service:
name: testecho1
port:
number: 80
- host: "foo.bar.com2"
http:
paths:
- pathType: Prefix
path: "/testecho2"
backend:
service:
name: testecho2
port:
number: 81
- host: "foo.bar.com3"
http:
paths:
- pathType: Prefix
path: "/testecho3"
backend:
service:
name: testecho3
port:
number: 443
- host: "foo.bar.com4"
http:
paths:
- pathType: Prefix
path: "/testecho4"
backend:
service:
name: testecho4
port:
number: 444
En este ejemplo, el manifiesto Ingress
define cuatro servicios:
- testecho1, recepción en el puerto 80 para tráfico HTTP
- testecho2, recepción en el puerto 81 para tráfico HTTP
- testecho3, recepción en el puerto 443 para tráfico HTTPS
- testecho4, recepción en el puerto 444 para tráfico HTTPS
Por defecto, el controlador de entrada nativo de OCI crea:
- Cuatro listeners en el equilibrador de carga (dos listeners que reciben en los puertos 80 y 81 para el tráfico HTTP, y dos listeners que reciben en los puertos 443 y 444 para el tráfico HTTPS).
- Cuatro políticas de enrutamiento (una para cada puerto de listener).
Para simplificar la administración, puede decidir tener un único listener que reciba tráfico HTTP y un único listener que reciba tráfico HTTPS, definiendo las anotaciones de la siguiente forma:
oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port: "500"
Con las anotaciones definidas como se muestra, el controlador de entrada nativo de OCI crea:
- un único listener que recibe tráfico HTTP en el puerto 100 y una única política de enrutamiento para el puerto 100 con rutas para backends en los puertos testecho1:80 y testecho2:81
- un único listener que recibe tráfico HTTPS en el puerto 500 y una única política de enrutamiento para el puerto 500 con rutas para backends en los puertos testecho3:443 y testecho4:444
Tenga en cuenta lo siguiente:
-
Puede definir las anotaciones
oci-native-ingress.oraclecloud.com/http-listener-port
yoci-native-ingress.oraclecloud.com/https-listener-port
de forma independiente, para que no tenga que definir ambas anotaciones. -
Si el manifiesto de recurso
Ingress
incluye la anotaciónoci-native-ingress.oraclecloud.com/certificate-ocid
, el controlador de entrada nativo de OCI considera que todos los hosts están configurados para TLS. En este caso, el controlador de entrada nativo de OCI:- ignora la anotación
oci-native-ingress.oraclecloud.com/http-listener-port
(si está presente en el manifiesto de recursoIngress
) - aplica la anotación
oci-native-ingress.oraclecloud.com/https-listener-port
(si está presente en el manifiesto de recursoIngress
) para crear un único listener para todo el tráfico
- ignora la anotación
- Independientemente de las anotaciones
oci-native-ingress.oraclecloud.com/http-listener-port
yoci-native-ingress.oraclecloud.com/https-listener-port
, el controlador de entrada nativo de OCI solo crea listeners HTTP y/o HTTPS (y las políticas de enrutamiento correspondientes) si son necesarios para los servicios de backend definidos en el manifiesto de recurso de entrada. Por ejemplo:- Si incluye la anotación
oci-native-ingress.oraclecloud.com/http-listener-port
en un manifiesto de recursoIngress
que no define un backend HTTP, el controlador de entrada nativo de OCI no crea un listener HTTP. - Si incluye la anotación
oci-native-ingress.oraclecloud.com/https-listener-port
en un manifiesto de recursoIngress
que no define un backend HTTPS, el controlador de entrada nativo de OCI no crea un listener HTTPS. - Si incluye anotaciones
oci-native-ingress.oraclecloud.com/http-listener-port
yoci-native-ingress.oraclecloud.com/https-listener-port
en un manifiesto de recursoIngress
que solo define backends HTTP, el controlador de entrada nativo de OCI ignora la anotaciónoci-native-ingress.oraclecloud.com/https-listener-port
y no crea un listener HTTPS. - Si incluye anotaciones
oci-native-ingress.oraclecloud.com/http-listener-port
yoci-native-ingress.oraclecloud.com/https-listener-port
en un manifiesto de recursoIngress
que solo define backends HTTPS, el controlador de entrada nativo de OCI ignora la anotaciónoci-native-ingress.oraclecloud.com/http-listener-port
y no crea un listener HTTP.
- Si incluye la anotación
Conservación del equilibrador de carga después de la supresión de IngressClass
Puede especificar que desea que el controlador de entrada nativo de OCI conserve el equilibrador de carga para un recurso IngressClass
si suprime el propio IngressClass
.
Utilice la anotación oci-native-ingress.oraclecloud.com/delete-protection-enabled
en el manifiesto IngressClass
para especificar si se suprime el equilibrador de carga. Defina la anotación en true
para conservar el equilibrador de carga si suprime IngressClass
. Defina la anotación en false
(o no incluya la anotación en el manifiesto) para suprimir el equilibrador de carga si suprime IngressClass
. Por ejemplo:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: <ic-name>
annotations:
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
spec:
...
Si suprime un recurso IngressClass
y utiliza la anotación para conservar el equilibrador de carga, el controlador de entrada nativo de OCI conserva el propio equilibrador de carga, pero borra las asociaciones con otros recursos de soporte (como grupos de seguridad de red, etiquetas o un firewall de aplicación web). El controlador de entrada nativo de OCI también suprime el juego de backends default_ingress BackendSet
que ha creado.
Sin embargo, tenga en cuenta que el controlador de entrada nativo de OCI no suprime los recursos del equilibrador de carga de OCI (listeners, juegos de backends) que creó para los recursos Ingress
que actualmente hacen referencia al IngressClass
suprimido. Por lo tanto, antes de suprimir un recurso IngressClass
, suprima primero cualquier recurso Ingress
que haga referencia a IngressClass
en su manifiesto. Si no suprime estos recursos Ingress
en primer lugar, los recursos de OCI creados para ellos seguirán existiendo en el equilibrador de carga.
Aplicación de etiquetas al equilibrador de carga
Puede especificar que desea que el controlador de entrada nativo de OCI aplique etiquetas definidas y etiquetas de formato libre a un equilibrador de carga que crea (para un recurso IngressClass
) o gestiona (si lo especifica la anotación oci-native-ingress.oraclecloud.com/id
). El etiquetado permite agrupar recursos dispares en distintos compartimentos y, además, permite anotar recursos con sus propios metadatos. Para obtener más información sobre las etiquetas, consulte Etiquetado de recursos relacionados con el cluster de Kubernetes.
Aplicación de etiquetas definidas al equilibrador de carga
Un administrador de etiquetas configura y gestiona las etiquetas definidas. Una etiqueta definida consta de un espacio de nombres de etiqueta, una clave y un valor. El espacio de nombres de la etiqueta y la definición de la clave de la etiqueta deben estar configurados en un arrendamiento para poder aplicar una etiqueta definida a un recurso.
Para especificar que el controlador de entrada nativo de OCI debe aplicar etiquetas definidas al equilibrador de carga, utilice la anotación oci-native-ingress.oraclecloud.com/defined-tags
en el manifiesto IngressClass
, con el siguiente formato:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: <ic-name>
annotations:
oci-native-ingress.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'
spec:
...
donde:
<tag-namespace>
es el espacio de nombres de la etiqueta al que pertenece la etiqueta.<tag-key>
es el nombre de una etiqueta definida que se va a aplicar al equilibrador de carga.<tag-value>
es un valor para la etiqueta de una lista de valores predefinida, o un nuevo valor, o está en blanco (en función de cómo se haya configurado la etiqueta definida).
El valor de la anotación oci-native-ingress.oraclecloud.com/defined-tags
es una cadena JSON, que permite especificar varios espacios de nombres de etiqueta, claves de etiqueta y valores de etiqueta en formato JSON.
Por ejemplo:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: my-ingress-class
annotations:
oci-native-ingress.oraclecloud.com/defined-tags: '{"Operations": {"CostCenter": "42", "Department": "001"}, "Sales": {"Region": "US"}}'
spec:
...
Al cambiar una de las etiquetas de la anotación oci-native-ingress.oraclecloud.com/defined-tags
del manifiesto IngressClass
, el controlador de entrada nativo de OCI vuelve a aplicar al equilibrador de carga todas las etiquetas definidas especificadas por la anotación. Sin embargo, si una etiqueta definida contiene una variable de etiqueta, el controlador de entrada nativo de OCI solo vuelve a aplicar la etiqueta definida al equilibrador de carga si la etiqueta aún no está presente.
Tenga en cuenta que para permitir que el controlador de entrada nativo de OCI aplique etiquetas definidas a un equilibrador de carga, debe existir una política de IAM adecuada para permitir que el controlador de entrada nativo de OCI utilice el espacio de nombres de etiqueta adecuado. Para obtener más información, consulte:
Aplicación de etiquetas de formato libre al equilibrador de carga
Un administrador de etiquetas no gestiona las etiquetas de formato libre. Una etiqueta de formato libre consta de una clave y un valor. A diferencia de las etiquetas definidas, las etiquetas de formato libre no pertenecen a un espacio de nombres de etiqueta.
Para especificar que el controlador de entrada nativo de OCI debe aplicar etiquetas de formato libre al equilibrador de carga, utilice la anotación oci-native-ingress.oraclecloud.com/freeform-tags
en el manifiesto IngressClass
, con el siguiente formato:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: <ic-name>
annotations:
oci-native-ingress.oraclecloud.com/freeform-tags: '{"<tag-key>": "<tag-value>"}'
spec:
...
donde:
<tag-key>
es un nombre para la etiqueta de formato libre que se va a aplicar al equilibrador de carga.<tag-value>
es un valor para que la etiqueta de formato libre se aplique al equilibrador de carga.
El valor de la anotación oci-native-ingress.oraclecloud.com/freeform-tags
es una cadena JSON, que permite especificar varias claves de etiqueta y valores de etiqueta en formato JSON.
Por ejemplo:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: my-ingress-class
annotations:
oci-native-ingress.oraclecloud.com/freeform-tags: '{"Project": "Red", "Version": "Alpha"}'
spec:
...
Al cambiar una de las etiquetas de la anotación oci-native-ingress.oraclecloud.com/freeform-tags
del manifiesto IngressClass
, el controlador de entrada nativo de OCI vuelve a aplicar al equilibrador de carga todas las etiquetas de formato libre especificadas por la anotación.
Aplicación de valores por defecto de etiqueta al equilibrador de carga
Los valores por defecto de las etiquetas se configuran para un compartimento específico. Los valores por defecto de etiqueta son específicos del compartimento. Los valores por defecto de etiqueta especifican etiquetas definidas que se aplican automáticamente a todos los recursos creados en un compartimento específico en el momento de la creación.
Al utilizar el controlador de entrada nativo de OCI versión 1.4.0 (o posterior), los valores por defecto de etiqueta se aplican automáticamente a los equilibradores de carga que crea el controlador de entrada nativo de OCI. Posteriormente, el controlador de entrada nativo de OCI conserva un valor por defecto de etiqueta aplicado a un equilibrador de carga a menos que se cumpla una de las siguientes condiciones:
- Elimine manualmente un valor por defecto de etiqueta que se haya aplicado automáticamente a un equilibrador de carga.
- Puede especificar un valor por defecto de etiqueta como una etiqueta definida mediante la anotación
oci-native-ingress.oraclecloud.com/defined-tags
(en cuyo caso, el controlador de entrada nativo de OCI trata el valor por defecto de etiqueta como cualquier otra etiqueta definida).
Tenga en cuenta que los valores por defecto de etiqueta con valores aplicados por el usuario no están soportados. Si se ha configurado un valor por defecto de etiqueta con un valor aplicado por el usuario para un compartimento en el que el controlador de entrada nativo de OCI va a crear o gestionar un equilibrador de carga, debe utilizar la anotación oci-native-ingress.oraclecloud.com/defined-tags
para especificar el valor por defecto de etiqueta como etiqueta definida.
Para los equilibradores de carga creados mediante una versión del controlador de entrada nativo de OCI anterior a la versión 1.4.0, o al utilizar la anotación oci-native-ingress.oraclecloud.com/id
para especificar que el controlador de entrada nativo de OCI gestione un equilibrador de carga existente, tenga en cuenta que los valores por defecto de etiqueta no están soportados. En ambos casos, para aplicar o retener un valor por defecto de etiqueta, utilice la anotación oci-native-ingress.oraclecloud.com/defined-tags
para especificar el valor por defecto de etiqueta como una etiqueta definida en su lugar.