Configuração de certificados HTTPS para ingresses do ELB
O ingress oferece suporte à configuração de certificados do TLS e protege seus Serviços com HTTPS.
Atualmente, você pode usar o certificado do segredo do TLS configurado no cluster e o certificado do ELB.
Se o HTTPS estiver habilitado para a mesma porta do mesmo balanceador de carga de várias ingresses, você deverá selecionar o mesmo certificado.
Usar um certificado do segredo do TLS
- Use o kubectl para se conectar ao cluster. Para mais detalhes, consulte Conexão a um cluster usando o kubectl.
- Ingress oferece suporte a dois tipos de segredo do TLS: kubernetes.io/tls e IngressTLS. IngressTLS é usado como exemplo. Para mais detalhes, consulte Criação de um segredo. Para obter detalhes sobre exemplos do segredo kubernetes.io/tls e sua descrição, consulte Segredos do TLS.
Execute o seguinte comando para criar um arquivo YAML chamado ingress-test-secret.yaml (o nome do arquivo pode ser personalizado):
vi ingress-test-secret.yaml
O arquivo YAML é configurado da seguinte forma:apiVersion: v1 data: tls.crt: LS0******tLS0tCg== tls.key: LS0tL******0tLS0K kind: Secret metadata: annotations: description: test for ingressTLS secrets name: ingress-test-secret namespace: default type: IngressTLS
Nas informações anteriores, tls.crt e tls.key são apenas exemplos. Substitua-os pelos arquivos reais. Os valores de tls.crt e tls.key são codificados em Base64.
- Crie um segredo.
kubectl create -f ingress-test-secret.yaml
Se forem exibidas informações semelhantes às seguintes, o segredo foi criado.
secret/ingress-test-secret created
Visualize o segredo criado.
kubectl get secrets
Se forem exibidas informações semelhantes às seguintes, o segredo foi criado.
NAME TYPE DATA AGE ingress-test-secret IngressTLS 2 13s
- Crie um arquivo YAML chamado ingress-test.yaml. O nome do arquivo pode ser personalizado.
vi ingress-test.yaml
A política de segurança padrão (kubernetes.io/elb.tls-ciphers-policy) é suportada apenas em clusters v1.17.17 ou posterior.
A política de segurança personalizada (kubernetes.io/elb.security_policy_id) é suportada apenas em clusters de v1.17.17 ou posterior.
A seguir, o balanceador de carga criado automaticamente é usado como exemplo. O arquivo YAML é configurado da seguinte forma:
Para clusters da v1.21 ou anterior:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.class: performance kubernetes.io/ingress.class: cce kubernetes.io/elb.port: '443' kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-******", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "available_zone": [ "ap-southeast-1a" ], "elb_virsubnet_ids":["b4bf8152-6c36-4c3b-9f74-2229f8e640c9"], "l7_flavor_name": "L7_flavor.elb.s1.small" }' kubernetes.io/elb.security_policy_id: 99bec42b-0dd4-4583-98e9-b05ce628d157 # The priority of the custom security policy is higher than that of the default security policy. kubernetes.io/elb.tls-ciphers-policy: tls-1-2 spec: tls: - secretName: ingress-test-secret rules: - host: foo.bar.com http: paths: - path: '/' backend: serviceName: <your_service_name> # Replace it with the name of your target Service. servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
Para clusters da v1.23 ou posterior:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.class: performance kubernetes.io/elb.port: '443' kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-******", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "available_zone": [ "ap-southeast-1a" ], "elb_virsubnet_ids":["b4bf8152-6c36-4c3b-9f74-2229f8e640c9"], "l7_flavor_name": "L7_flavor.elb.s1.small" }' kubernetes.io/elb.security_policy_id: 99bec42b-0dd4-4583-98e9-b05ce628d157 # The priority of the custom security policy is higher than that of the default security policy. kubernetes.io/elb.tls-ciphers-policy: tls-1-2 spec: tls: - secretName: ingress-test-secret rules: - host: foo.bar.com http: paths: - path: '/' backend: service: name: <your_service_name> # Replace it with the name of your target Service. port: number: 8080 # Replace 8080 with the port number of your target Service. property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
Tabela 1 Parâmetros principais Parâmetro
Obrigatório
Tipo
Descrição
kubernetes.io/elb.security_policy_id
Não
String
O ID da política de grupo de segurança personalizada no ELB. Obtê-lo no console do ELB. Esse campo entra em vigor somente quando HTTPS é usado e tem uma prioridade mais alta do que a política de segurança padrão.
Para obter detalhes sobre como criar e atualizar uma diretiva de segurança personalizada, consulte Política de segurança do TLS.
kubernetes.io/elb.tls-ciphers-policy
Não
String
O valor padrão é tls-1-2, que é a política de segurança padrão usada pelo ouvinte e só entra em vigor quando HTTPS é usado.
Opções:
- tls-1-0
- tls-1-1
- tls-1-2
- tls-1-2-strict
Para obter detalhes sobre conjuntos de cifras para cada política de segurança, consulte Tabela 2.
tls
Não
Array of strings
Quando HTTPS é usado, esse parâmetro deve ser adicionado para especificar o certificado do segredo.
Vários nomes de domínio independentes e certificados podem ser adicionados. Para mais detalhes, consulte Configuração da Indicação de nome do servidor (SNI) para ingresses de ELB.
secretName
Não
String
Esse parâmetro é obrigatório se o HTTPS for usado. Defina este parâmetro para o nome do segredo criado.
Tabela 2 Descrição do parâmetro tls_ciphers_policy Política de segurança
Versão do TLS
Conjunto de criptografia
tls-1-0
TLS 1.2
TLS 1.1
TLS 1.0
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA
tls-1-1
TLS 1.2
TLS 1.1
tls-1-2
TLS 1.2
tls-1-2-strict
TLS 1.2
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384
- Crie um ingress.
kubectl create -f ingress-test.yaml
Se forem exibidas informações semelhantes às seguintes, o ingress foi criado.
ingress/ingress-test created
Visualize o ingress criado.
kubectl get ingress
Se informações semelhantes às seguintes forem exibidas, o ingress foi criado e a carga de trabalho está acessível.
NAME HOSTS ADDRESS PORTS AGE ingress-test * 121.**.**.** 80 10s
- Digite https://121.**.**.**:443 na caixa de endereço do navegador para acessar a carga de trabalho (por exemplo, carga de trabalho do Nginx).
121.**.**.** indica o endereço IP do balanceador de carga unificado.
Usar o certificado do ELB
Para usar o certificado do ELB, você pode especificar as anotações kubernetes.io/elb.tls-certificate-ids.
- Se você especificar o certificado IngressTLS e o certificado do ELB, o último será usado.
- O CCE não verifica se o certificado do ELB é válido. Ele apenas verifica se o certificado existe.
- Somente os clusters de v1.19.16-r2, v1.21.5-r0, v1.23.3-r0 ou posterior dão suporte ao certificado do ELB.
Para clusters da v1.21 ou anterior:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/ingress.class: cce kubernetes.io/elb.port: '443' kubernetes.io/elb.id: 0b9a6c4d-bd8b-45cc-bfc8-ff0f9da54e95 kubernetes.io/elb.class: union kubernetes.io/elb.tls-certificate-ids: 058cc023690d48a3867ad69dbe9cd6e5,b98382b1f01c473286653afd1ed9ab63 spec: rules: - host: '' http: paths: - path: '/' backend: serviceName: <your_service_name> # Replace it with the name of your target Service. servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test namespace: default annotations: kubernetes.io/elb.port: '443' kubernetes.io/elb.id: 0b9a6c4d-bd8b-45cc-bfc8-ff0f9da54e95 kubernetes.io/elb.class: union kubernetes.io/elb.tls-certificate-ids: 058cc023690d48a3867ad69dbe9cd6e5,b98382b1f01c473286653afd1ed9ab63 spec: rules: - host: '' http: paths: - path: '/' backend: service: name: <your_service_name> # Replace it with the name of your target Service. port: number: 8080 # Replace 8080 with the port number of your target Service. property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce