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

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 true, se conserva el equilibrador de carga. Si no se especifica, false es el valor por defecto y el equilibrador de carga se suprime si se suprime IngressClass.

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 false, las solicitudes de TLS terminan en el listener del equilibrador de carga, y las solicitudes entre el juego de backends y el juego de backends se intercambian en texto sin formato.

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
Puede verificar el estado de las puertas de preparación de pod introduciendo:
kubectl get pods -o wide -w
Salida de ejemplo:
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:

  1. Defina un nuevo recurso de entrada en un archivo .yaml. Consulte Creación de recurso de entrada.
  2. En la sección metadata:, agregue un elemento annotations: y defina la anotación oci-native-ingress.oraclecloud.com/protocol en TCP, 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:
    ...
  3. En la sección rules: del manifiesto de recurso Ingress, agregue una regla para cada listener que recibirá tráfico TCP:
    • (recomendado) Defina paths.pathType en ImplementationSpecific.
    • 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 a my-second-svc:8081, puede configurar un manifiesto de recurso Ingress 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 
    
  4. 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ón oci-native-ingress.oraclecloud.com/id (a menos que haya definido oci-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 recurso Ingress, 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ón oci-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:

  1. 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):

    1. 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
    2. 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.
  2. 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:
      1. 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 omitir ca.cert, siempre que incluya toda la cadena de certificados como el valor de tls.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
      2. Cree el recurso secreto introduciendo kubectl create -f <filename>.yaml

  3. Agregue el secreto de Kubernetes a un manifiesto de recurso Ingress:
    1. Defina un nuevo recurso de entrada en un archivo .yaml. Consulte Creación de recurso de entrada.
    2. En la sección spec: del manifiesto, agregue un elemento tls: 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
    3. 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
    4. 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:

  1. 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.

  2. Anote el OCID del certificado.
  3. Agregue el OCID del certificado a un manifiesto de recurso Ingress:
    1. Defina un nuevo recurso de entrada en un archivo .yaml. Consulte Crear recurso de entrada.
    2. En la sección metadata:, agregue un elemento annotations: 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:
      ...
    3. En la sección rules: del manifiesto de recurso Ingress, 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
    4. 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 y oci-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ón oci-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 recurso Ingress)
    • aplica la anotación oci-native-ingress.oraclecloud.com/https-listener-port (si está presente en el manifiesto de recurso Ingress) para crear un único listener para todo el tráfico
  • Independientemente de las anotaciones oci-native-ingress.oraclecloud.com/http-listener-port y oci-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 recurso Ingress 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 recurso Ingress 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 y oci-native-ingress.oraclecloud.com/https-listener-port en un manifiesto de recurso Ingress que solo define backends HTTP, el controlador de entrada nativo de OCI ignora la anotación oci-native-ingress.oraclecloud.com/https-listener-port y no crea un listener HTTPS.
    • Si incluye anotaciones oci-native-ingress.oraclecloud.com/http-listener-port y oci-native-ingress.oraclecloud.com/https-listener-port en un manifiesto de recurso Ingress que solo define backends HTTPS, el controlador de entrada nativo de OCI ignora la anotación oci-native-ingress.oraclecloud.com/http-listener-port y no crea un listener HTTP.

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.