Kubernetes 使用 Traefik 进行基本身份验证



我正在尝试使用 Traefik 作为入口控制器在 Nginx 示例中配置基本身份验证。

我只是在 Kubernetes 秘密上创建秘密"mypasswd"

这是我正在使用的入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginxingress
annotations:
ingress.kubernetes.io/auth-type: basic
ingress.kubernetes.io/auth-realm: traefik
ingress.kubernetes.io/auth-secret: mypasswd
spec:
rules:
- host: nginx.mycompany.com
http:
paths:
- path: /
backend:
serviceName: nginxservice
servicePort: 80

我检查了 Traefik 仪表板,它似乎,如果我访问 nginx.mycompany.com 我可以检查 Nginx 网页,但没有基本身份验证。

这是我的nginx部署:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

Nginx服务:

apiVersion: v1
kind: Service
metadata:
labels:
name: nginxservice
name: nginxservice
spec:
ports:
# The port that this service should serve on.
- port: 80
# Label keys and values that must match in order to receive traffic for this service.
selector:
app: nginx
type: ClusterIP

使用基本身份验证很流行。参考 Kubernetes 文档,您应该能够使用以下步骤保护对 Traefik 的访问:

  1. 使用htpasswd工具创建身份验证文件。系统会要求您输入用户的密码:

htpasswd -c ./auth

  1. 现在使用kubectl使用htpasswd创建的文件在监视命名空间中创建密钥。

kubectl create secret generic mysecret --from-file auth --命名空间=监视

  1. 通过将注释附加到入口对象来启用基本身份验证:

ingress.kubernetes.io/auth-type:"基本">

ingress.kubernetes.io/auth-secret:《我的秘密》

因此,基本身份验证的完整示例配置如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: prometheus-dashboard
namespace: monitoring
annotations:
kubernetes.io/ingress.class: traefik
ingress.kubernetes.io/auth-type: "basic"
ingress.kubernetes.io/auth-secret: "mysecret"
spec:
rules:
- host: dashboard.prometheus.example.com
http:
paths:
- backend:
serviceName: prometheus
servicePort: 9090
  1. 您可以按如下方式应用示例:

Kubectl create -f prometheus-ingress.yaml -n monitoring

这应该可以毫无问题地工作。

Kubernetes 和 Traefik 2 的基本身份验证配置似乎略有变化。我花了一些时间才找到解决方案,这就是我想分享它的原因。顺便说一句,我使用 k3s 。

步骤 1 + 2 与@d0bry写的内容相同,创建密钥:

printf "my-username:`openssl passwd -apr1`n" >> my-auth
kubectl create secret generic my-auth --from-file my-auth --namespace my-namespace

步骤 3 是创建入口对象并应用将处理身份验证的中间件

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-auth-middleware
namespace: my-namespace
spec:
basicAuth:
removeHeader: true
secret: my-auth
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: my-namespace
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.middlewares: my-namespace-my-auth-middleware@kubernetescrd
spec:
rules:
- host: my.domain.net
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 8080

然后当然应用配置

kubectl apply -f my-ingress.yaml

裁判:

  • https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/
  • https://doc.traefik.io/traefik/middlewares/http/basicauth/

使用最新的traefik(通过2.7验证(,它变得更加简单。只需创建一个类型kubernetes.io/basic-auth的密钥,并在中间件中使用它。无需先创建用户名:密码字符串并从中创建密钥。

apiVersion: v1
kind: Secret
metadata:
name: my-auth
namespace: my-namespace
type: kubernetes.io/basic-auth
data:
username: <username in base64>
password: <password in base64>
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-auth-middleware
namespace: my-namespace
spec:
basicAuth:
removeHeader: true
secret: my-auth

请注意,密码不像htpasswd那样进行哈希处理,而只是 base64 编码。

参考文档

相关内容

  • 没有找到相关文章

最新更新