Promtail 基本身份验证在 helm values.yaml 中使用 kubernetes 秘密
Posted
技术标签:
【中文标题】Promtail 基本身份验证在 helm values.yaml 中使用 kubernetes 秘密【英文标题】:Promtail basic auth using kubernetes secret in helm values.yaml 【发布时间】:2021-06-02 09:15:20 【问题描述】:我正在使用 promtail helm 图表连接到在不同堆栈上运行的 Loki 服务器。我有 Loki 支持使用基本身份验证保护的 nginx 入口。
我找不到这方面的任何文档,而且很可能只是我公认的对 helm 的理解有限。
我只是尝试使用基本身份验证连接到 Loki 实例,同时在 helm 值中使用 Kubernetes 机密而不是纯文本凭据
这很完美:
snippets:
extraClientConfigs: |
basic_auth:
username: myusername
password: mypassword
我创建了一个这样的秘密:
kubectl create secret generic loki-credentials -n monitoring --from-literal=password="mypassword" --from-literal=username="myusername"
现在我想在values.yaml
文件中使用它。
这是我目前得到的:
extraEnv:
- name: LOKI_USERNAME
valueFrom:
secretKeyRef:
name: loki-credentials
key: username
- name: LOKI_PASSWORD
valueFrom:
secretKeyRef:
name: loki-credentials
key: password
extraArgs:
- -client.external-labels=stack=development
- -config.expand-env
config:
serverPort: 3101
lokiAddress: myurl
snippets:
extraClientConfigs: |
basic_auth:
username: $LOKI_USERNAME
password: $LOKI_PASSWORD
我刚刚收到 401 响应。
Chart version: 3.1.0
Promtail version: 2.1.0
编辑
这是我的入口 yaml:
controller:
replicaCount: 1
config:
force-ssl-redirect: "true"
use-forwarded-headers: "true"
service:
targetPorts:
http: http
https: http
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:123456:certificate/123456"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
enableHttp: false
enableHttps: true
type: LoadBalancer
loadBalancerSourceRanges:
- "0.0.0.0/0"
## Name of the ingress class to route through this controller
ingressClass: nginx-external
...还有我的洛基values.yaml
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx-external"
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: loki-ingress-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
hosts:
- host: loki.mydomain.com
paths:
- "/"
tls: []
config:
auth_enabled: false
ingester:
chunk_idle_period: 3m
chunk_block_size: 262144
chunk_retain_period: 1m
max_transfer_retries: 3
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
schema_config:
configs:
- from: 2021-03-06
store: boltdb-shipper
object_store: aws
schema: v11
index:
prefix: loki_index_
period: 24h
server:
http_listen_port: 3100
storage_config:
aws:
bucketnames: my-bucket-name
region: us-west-2
s3forcepathstyle: true
boltdb_shipper:
active_index_directory: /data/loki/boltdb-shipper-active
cache_location: /data/loki/boltdb-shipper-cache
shared_store: s3
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
compactor:
working_directory: /data/loki/boltdb-shipper-compactor
shared_store: aws
replicas: 1
podAnnotations:
iam.amazonaws.com/role: "arn:aws:iam::123456:role/my-loki-role"
resources:
limits:
cpu: 500m
memory: 2G
requests:
cpu: 250m
memory: 1G
# The values to set in the PodDisruptionBudget spec
# If not set then a PodDisruptionBudget will not be created
podDisruptionBudget:
minAvailable: 1
Loki 坐在后面的 nginx pod 中的日志:
2021/03/09 04:23:44 [error] 37#37: *925 user "myusername": password mismatch, client: xxx.xx.xxx.xxx, server: loki.mydomain.com, request: "POST /loki/api/v1/push HTTP/1.1", host: "loki.mydomain.com"
2021/03/09 04:23:44 [error] 37#37: *921 user "myusername": password mismatch, client: xxx.xx.xxx.xxx, server: loki.mydomain.com, request: "POST /loki/api/v1/push HTTP/1.1", host: "loki.mydomain.com"
xx.xxx.xxx.xx - myusername [09/Mar/2021:04:23:44 +0000] "POST /loki/api/v1/push HTTP/1.1" 401 172 "-" "promtail/2.1.0" 326 0.000 [monitoring-loki-3100] [] - - - - 63294b16fe010a8c9ec1d4684f0472f5
xxx.xx.xxx.xxx: - myusername [09/Mar/2021:04:23:44 +0000] "POST /loki/api/v1/push HTTP/1.1" 204 0 "-" "promtail/2.1.0" 2744 0.003 [monitoring-loki-3100] [] xxx.xx.xxx.xxx:3100 0 0.004 204 029e0a9d1ee6242cad8b9a6d2ee50940
2021/03/09 04:23:44 [error] 37#37: *925 user "myusername": password mismatch, client: xx.xxx.xxx.xx, server: loki.mydomain.com, request: "POST /loki/api/v1/push HTTP/1.1", host: "loki.mydomain.com"
xxx.xx.xxx.xxx - myusername [09/Mar/2021:04:23:44 +0000] "POST /loki/api/v1/push HTTP/1.1" 401 172 "-" "promtail/2.1.0" 325 0.000 [monitoring-loki-3100] [] - - - - b75a2cfcf6c62b81953dd4fb26f1a844
xxx.xx.xxx.xxx - myusername [09/Mar/2021:04:23:44 +0000] "POST /loki/api/v1/push HTTP/1.1" 204 0 "-" "promtail/2.1.0" 1513 0.014 [monitoring-loki-3100] [] xxx.xx.xxx.xxx:3100 0 0.016 204 0049965a49877cb5d336ac6ec869feb4
2021/03/09 04:23:45 [error] 36#36: *941 user "myusername": password mismatch, client: xxx.xx.xxx.xxx, server: loki.mydomain.com, request: "POST /loki/api/v1/push HTTP/1.1", host: "loki.c3dops.com"
xxx.xx.xxx.xxx - myusername [09/Mar/2021:04:23:45 +0000] "POST /loki/api/v1/push HTTP/1.1" 401 172 "-" "promtail/2.1.0" 326 0.000 [monitoring-loki-3100] [] - - - - e5954bd055db5b3e9bd3227f57651847
【问题讨论】:
您是否查看了 helm 生成的结果 ConfigMap?有正确的值吗? @JensBaitinger Baitinger 呵呵,promtail 实际上并不产生配置图。但是,我可以通过 SSH 连接到 pod 并且环境变量在那里,以及引用这些环境变量的预期配置文件 Nginx Ingress 日志告诉你什么?你能分享一下 Loki 配置和 Ingress yaml(去掉任何敏感的东西)吗? 我做了一些测试并创建了这个 repo,如果它有帮助的话,我还没有添加任何与promtail
相关的东西,但是如果你不确定,Ingress 部分可能会有所帮助:github.com/mikejoh/loki-basic-auth
@hhaslam11 谢谢,我会添加一个答案!我想知道如果密码对您有用,您是否会在创建秘密时单引号密码?您可以轻松地对密钥进行 base64 解码以查看保存的内容。很高兴你让它工作!
【参考方案1】:
如documentation 中所述,为 Loki 新手提供一些背景知识:Loki 不附带任何包含的身份验证层。运营商应在您的服务前运行身份验证反向代理,例如使用基本身份验证的 NGINX 或 OAuth2 代理。
这基本上意味着您必须在客户端和 Loki 之间放置一些东西来强制执行,例如基本认证。在这种情况下,有一个 Ingress (Nginx) 充当具有基本身份验证的反向代理。
要解决使用 Nginx 的身份验证问题,需要检查许多事项:
Nginx Ingress Pod 的日志,检查身份验证错误。 添加的 Kubernetes Secret 包含您期望的内容。 您已使用所需的annotations
配置 Ingress 对象。
谈到使用 Nginx 作为 Ingress 并从官方文档中添加基本身份验证 this 资源真的很有帮助。
一般来说,在创建 Kubernetes 机密时,尤其是从命令行使用 kubectl
时,如果密码包含特殊字符,则必须用单引号引起来。这样特殊字符就不会被您的 shell 解释。更多信息here.
【讨论】:
以上是关于Promtail 基本身份验证在 helm values.yaml 中使用 kubernetes 秘密的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Ldapmain 对您进行身份验证,因为“<用户名> 的凭据无效”-通过 Helm Chart 安装的 Gitlab 社区版
Spring Security LDAP 身份验证抛出 NO_ATTRIBUTE_OR_VAL 错误