Kubernetes (AKS): ошибка входа nginx 308 Ошибка постоянного перенаправления. Частный входной контроллер nginx
В целом описание того, что я делаю: я использую частный контроллер входа nginx в AKS (служба Azure Kubernetes) и настраиваю драйвер CSI хранилища секретов, чтобы включить контроллер входа NGINX с TLS, используя этот документ: Doc1
Ниже приведены шаги, которые я делаю в соответствии с документом:
- Развертывание поставщика секретов:
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-tls
spec:
provider: azure
secretObjects: # secretObjects defines the desired state of synced K8s secret objects
- secretName: ingress-tls-csi
type: kubernetes.io/tls
data:
- objectName: <CertName>
key: tls.key
- objectName: <CertName>
key: tls.crt
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: <GUIDForManagedIdentityProviderHavingAccessToKeyvault>
keyvaultName: <KeyvaultName> # the name of the AKV instance
objects: |
array:
- |
objectName: <CertName>
objectType: secret
tenantId: <GUIDForKeyVaultTenant> # the tenant ID of the AKV instance
- Развертывание частного контроллера входящего трафика nginx с использованием этой документации: Doc2
helm upgrade nginx-ingress ingress-nginx/ingress-nginx `
--install `
--version 4.1.3 `
--namespace ingress-nginx `
--set controller.replicaCount=2 `
--set controller.nodeSelector."kubernetes\.io/os"=linux `
--set controller.image.registry="ashwin.azurecr.io" `
--set controller.image.image="ingress-nginx/controller" `
--set controller.image.tag="v1.2.1" `
--set controller.image.digest="" `
--set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux `
--set controller.admissionWebhooks.patch.image.registry="ashwin.azurecr.io" `
--set controller.admissionWebhooks.patch.image.image="ingress-nginx/kube-webhook-certgen" `
--set controller.admissionWebhooks.patch.image.tag="v1.1.1" `
--set controller.admissionWebhooks.patch.image.digest="" `
--set defaultBackend.nodeSelector."kubernetes\.io/os"=linux `
--set defaultBackend.image.registry="ashwin.azurecr.io" `
--set defaultBackend.image.image="defaultbackend-amd64" `
--set defaultBackend.image.tag="1.5" `
--set defaultBackend.image.digest="" `
-f "..\..\manifests\internal-controller-tls.yaml" --debug
The ..\..\manifests\internal-controller-tls.yaml
файл имеет такое содержимое:
controller:
service:
loadBalancerIP: 10.0.0.11
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path: "/healthz"
extraVolumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-tls"
extraVolumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
- Развернул вход с этой конфигурацией (взято из здесь Doc1 ):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: healthcheck-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
tls:
- hosts:
- ingress.cluster.apaca.demo.com
secretName: ingress-tls-csi
rules:
- host: ingress.cluster.apaca.demo.com
http:
paths:
- path: /cluster-ingress-healthz(/|$)(.*)
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /(.*)
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
После выполнения 3 шагов я вижу308 Permanent Redirect
когда я выполняю команду curl для конечной точки http входа:
azadmin@acs-apaca-aksVm:~$ curl -v http://ingress.cluster.apaca.demo.com
* Rebuilt URL to: http://ingress.cluster.apaca.demo.com/
* Trying 10.0.0.11...
* TCP_NODELAY set
* Connected to ingress.cluster.apaca.demo.com (10.0.0.11) port 80 (#0)
> GET / HTTP/1.1
> Host: ingress.cluster.apaca.demo.com
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 308 Permanent Redirect
< Date: Thu, 14 Jul 2022 04:28:53 GMT
< Content-Type: text/html
< Content-Length: 164
< Connection: keep-alive
< Location: https://ingress.cluster.apaca.demo.com
<
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host ingress.cluster.apaca.demo.com left intact
azadmin@acs-apaca-aksVm:~$
Но когда я добавляю эту дополнительную аннотацию в kubernetes ingress, конечная точка http показывает правильное содержимое.
Это то, что я вижу, когда делаю завиток к конечной точке входа http:
azadmin@acs-apaca-aksVm:~$ curl -v http://ingress.cluster.apaca.demo.com
* Rebuilt URL to: http://ingress.cluster.apaca.demo.com/
* Trying 10.0.0.11...
* TCP_NODELAY set
* Connected to ingress.cluster.apaca.demo.com (10.0.0.11) port 80 (#0)
> GET / HTTP/1.1
> Host: ingress.cluster.apaca.demo.com
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 14 Jul 2022 04:33:34 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 617
< Connection: keep-alive
<
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="/static/default.css">
<title>WELCOME TO AZURE KUBERNETES SERVICE</title>
<script language="JavaScript">
function send(form){
}
</script>
</head>
<body>
<div id="container">
<form id="form" name="form" action="/"" method="post"><center>
<div id="logo">WELCOME TO AZURE KUBERNETES SERVICE</div>
<div id="space"></div>
<img src="/static/acs.png" als="acs logo">
<div id="form">
</div>
</div>
</body>
* Connection #0 to host ingress.cluster.apaca.demo.com left intact
</html>azadmin@acs-apaca-aksVm:~$
но с дополнительной аннотациейnginx.ingress.kubernetes.io/ssl-redirect: "false"
запросы будут только http. Когда я делаю завиток к конечной точке https для входа. Я вижу это в обоих случаях (case 1
: аннотация не добавлена к входу,case 2
: аннотация добавлена на вход).
azadmin@acs-apaca-aksVm:~$ curl -v https://ingress.cluster.apaca.demo.com
* Rebuilt URL to: https://ingress.cluster.apaca.demo.com/
* Trying 10.0.0.11...
* TCP_NODELAY set
* Connected to ingress.cluster.apaca.demo.com (10.0.0.11) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* stopped the pause stream!
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
azadmin@acs-apaca-aksVm:~$
Пожалуйста, помогите мне понять, что я должен изменить здесь, чтобы ошибка перенаправления 308 исчезла, и я мог успешно подключить https к входной конечной точке.