EKS 中的 AWS 跨账户 Loki promtail 设置

Posted

技术标签:

【中文标题】EKS 中的 AWS 跨账户 Loki promtail 设置【英文标题】:AWS cross account Loki promtail setup in EKS 【发布时间】:2021-12-07 12:28:52 【问题描述】:

这是我的设置。

我有 2 个 AWS 账户。

    应用程序帐户 监控帐号

应用账号有EKS+Istio+应用相关微服务+promtail代理。

监控账户在 EKS + Istio + 内有集中式日志系统(Grafana & Prometheus & loki pods running)

从应用程序帐户,我想将日志推送到 Loki on Monitoring a/c。我尝试在监控 a/c 之外公开 Loki 服务,但我面临将 loki url 设置为 https:///loki 的问题。我尝试使用here 和here 的建议进行此更改,但这对我不起作用。我已经从 this url 安装了 loki-stack

问题是如何从应用程序帐户访问 loki URL,以便可以在应用程序 a/c 的 promtail 中对其进行配置? 请注意,这两个帐户都在 EKS 中使用 pod,而不是独立的 loki 或 promtail。

感谢和问候。

apiVersion: v1                                
kind: Service                                 
metadata:                                     
  annotations:                                
    meta.helm.sh/release-name: loki           
    meta.helm.sh/release-namespace: monitoring
  creationTimestamp: "2021-10-25T14:59:20Z"   
  labels:                                     
    app: loki                                 
    app.kubernetes.io/managed-by: Helm        
    chart: loki-2.5.0                         
    heritage: Helm                            
    release: loki                             
  name: loki                                  
  namespace: monitoring                       
  resourceVersion: "18279654"                 
  uid: 7eba14cb-41c9-445d-bedb-4b88647f1ebc   
spec:                                         
  clusterIP: 172.20.217.122                   
  clusterIPs:                                 
  - 172.20.217.122                            
  ports:                                      
  - name: metrics                             
    port: 80                                  
    protocol: TCP                             
    targetPort: 3100                          
  selector:                                   
    app: loki                                 
    release: loki                             
  sessionAffinity: None                       
  type: ClusterIP                             
status:                                       
  loadBalancer:                             
---

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  generation: 14
  name: grafana-vs
  namespace: monitoring
  resourceVersion: "18256422"
  uid: e8969da7-062c-49d6-9152-af8362c08016
spec:
  gateways:
  - my-gateway
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /grafana/
    name: grafana-ui
    rewrite:
      uri: /
    route:
    - destination:
        host: prometheus-operator-grafana.monitoring.svc.cluster.local
        port:
          number: 80
  - match:
    - uri:
        prefix: /loki
    name: loki-ui
    rewrite:
      uri: /loki
    route:
    - destination:
        host: loki.monitoring.svc.cluster.local
        port:
          number: 80

---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      "apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":"annotations":,"name":"my-gateway","namespace":"monitoring","spec":"selector":"istio":"ingressgateway","servers":["hosts":["*"],"port":"name":"http","number":80,"protocol":"HTTP"]
  creationTimestamp: "2021-10-18T12:28:05Z"
  generation: 1
  name: my-gateway
  namespace: monitoring
  resourceVersion: "16618724"
  uid: 9b254a22-958c-4cc4-b426-4e7447c03b87
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*'
    port:
      name: http
      number: 80
      protocol: HTTP

---
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      alb.ingress.kubernetes.io/scheme: internal
      alb.ingress.kubernetes.io/target-type: ip
      kubectl.kubernetes.io/last-applied-configuration: |
        "apiVersion":"networking.k8s.io/v1beta1","kind":"Ingress","metadata":"annotations":"alb.ingress.kubernetes.io/scheme":"internal","alb.ingress.kubernetes.io/target-type":"ip","kubernetes.io/ingress.class":"alb","name":"ingress-alb","namespace":"istio-system","spec":"rules":["http":"paths":["backend":"serviceName":"istio-ingressgateway","servicePort":80,"path":"/*"]]
      kubernetes.io/ingress.class: alb
    finalizers:
    - ingress.k8s.aws/resources
    generation: 1
    name: ingress-alb
    namespace: istio-system
    resourceVersion: "4447931"
    uid: 74b31fba-0f03-41c6-a63f-6a10dee8780c
  spec:
    rules:
    - http:
        paths:
        - backend:
            service:
              name: istio-ingressgateway
              port:
                number: 80
          path: /*
          pathType: ImplementationSpecific
  status:
    loadBalancer:
      ingress:
      - hostname: internal-k8s-istiosys-ingressa-25a256ef4d-1368971909.us-east-1.elb.amazonaws.com
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

入口与 AWS ALB 相关联。

我想从 ALB URL 访问 Loki,例如 http(s)://my-alb-url/loki 我希望我现在已经提供了所需的详细信息。 让我知道。谢谢。

【问题讨论】:

【参考方案1】:

...how can I access loki URL from applications account so that it can be configured in promtail in applications a/c?

您没有描述当您使用上面的外部LB时应该工作的问题,无论如何,由于此方法将通过Internet,因此安全风险较高,出口成本考虑日志记录量。在这种情况下,您可以使用Privatelink,请参阅第 16 页共享服务。您的 promtail 将使用 ENI DNS 名称作为 loki 目标。

【讨论】:

感谢您的回复@gohm'c。我试图使用 LB 公开服务,但问题是如果我按照我在帖子中提到的建议链接进行更改,Loki 不会被公开,我无法从 Grafana 仪表板以外的任何其他地方访问它。那么想知道如何使用 LB 在 EKS 集群之外公开 Loki? 您发布的 GitHub 问题链接主要是针对 loki 的反向代理,它希望进行路径重写。但是您的问题读起来就像您希望 pod 在 diff 中运行。 EKS/帐户能够登录到特定 EKS/帐户中的 loki,对吗?如果是这样,如果不是 PrivateLink(推荐),您可以使用 NLB。 是的。我正在尝试公开 Loki 服务,但是当我进行更改时,无法通过 NLB 访问 loki 服务,这就是我卡住的地方。如果您知道我可以参考配置更改的任何参考,请告诉我。我尝试过,但仍在等待成功。 在问题中发布您使用的服务规范expose the Loki service 您好,请查看问题中的更新

以上是关于EKS 中的 AWS 跨账户 Loki promtail 设置的主要内容,如果未能解决你的问题,请参考以下文章

另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject

AWS 跨账户 - 对 AWS CDK 中的参数的参数存储/Secrets Manager 访问

AWS 跨账户 Postgres RDS IAM 身份验证

AWS Beanstalk 跨多个 AWS 账户部署

AWS ECS Fargate 从跨账户 ECR 存储库中提取映像

使用默认 aws/S3 KMS 密钥对解密对象进行跨账户访问