簡體   English   中英

無法使用 Google Kubernetes Engien Nginx 入口控制器獲得 HTTP 基本身份驗證

[英]Can't get HTTP basic auth with Google Kubernetes Engien Nginx ingress controller

根據 Kubernetes 文檔,Nginx 入口控制器支持添加基本身份驗證。 我正在設置的必需的 Ingress 注釋是:

nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: namespace/secret
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"

我的入口控制器圖像是:gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11

我找不到來自入口控制器的任何指示錯誤的日志,但不存在基本身份驗證。 以防萬一,我正在使用 cert-manager 來配置 Let's Encrypt TLS 證書,它運行良好。

您使用了錯誤的控制器/注釋。 這些注釋適用於具有此官方圖像的https://github.com/kubernetes/ingress-nginx

您有如何在此處部署控制器的示例

如果你想使用 gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11,注釋是:

ingress.kubernetes.io/auth-type: basic
ingress.kubernetes.io/auth-secret: basic-auth
ingress.kubernetes.io/auth-realm: "Authentication Required"

您可以在此處此處找到完整的文章。

要在 Nginx Ingress 上配置基本身份驗證,應該做兩件事:
(我假設您已經在集群上運行了入口控制器)

  1. 一個名稱和內容為 base64 編碼行的用戶名/密碼的 Secret 應該存在:(在本例中,名稱“basic-auth”用作 Secret 的名稱,但您可以選擇任何您想要的有效名稱。) : foo , 密碼: bar

     $ htpasswd -c auth foo New password: bar Re-type new password: bar Adding password for user foo $ kubectl create secret generic basic-auth --from-file=auth secret "basic-auth" created $ kubectl get secret basic-auth -o yaml apiVersion: v1 data: auth: Zm9vOiRhcHIxJE9GRzNYeWJwJGNrTDBGSERBa29YWUlsSDkuY3lzVDAK kind: Secret metadata: name: basic-auth namespace: default type: Opaque
  2. Ingress 對象應該與 Secret 存在於同一個命名空間中:
    (這里我們為 Ingress 和 Secret 使用默認命名空間)

     echo " apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-with-auth annotations: # type of authentication nginx.ingress.kubernetes.io/auth-type: basic # name of the secret that contains the user/password definitions nginx.ingress.kubernetes.io/auth-secret: basic-auth # message to display with an appropriate context why the authentication is required nginx.ingress.kubernetes.io/auth-realm: \\"Authentication Required - foo\\" spec: rules: - host: foo.bar.com http: paths: - path: / backend: serviceName: <your_backend_service_name> servicePort: <your_backend_service_port> " | kubectl create -f -

要使用帶有或不帶有身份驗證的 GET 請求來驗證您的配置檢查回復:
30xxx - 從命令kubectl get svc --all-namespaces | grep ingress-nginx | grep NodePort輸出中獲取端口號)

$ curl -v http://cluster.node.ip.address:30xxx/ -H 'Host: foo.bar.com'
...
< HTTP/1.1 401 Unauthorized
...

$ curl -v http://cluster.node.ip.address:30xxx/ -H 'Host: foo.bar.com' -u 'foo:bar'
...
< HTTP/1.1 200 OK
...

在下一步中,您可以將您選擇的 SSL 或 TLS 配置添加到 Ingress 對象規范。

更新:上面的例子在 當前的 nginx 入口控制器v0.44.0 上仍然可以正常工作

我重新確認,如果未強制實施 SSL/HTTPS,則cert-manager配置不應影響入口控制器管理普通 HTTP 流量的方式。

htpasswd可以作為 CentOS 的 Ubuntu/Debian 軟件包apache2-utilshttpd-tools的一部分安裝:

apt install apache2-utils
yum install httpd-tools

對於入口控制器的ngninxinc版本,請考慮閱讀問題 #200

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM