【问题标题】:Running Graylog in a Kubernetes cluster behind an ingress controller在入口控制器后面的 Kubernetes 集群中运行 Graylog
【发布时间】:2020-03-24 10:01:20
【问题描述】:

我正在尝试在我的 Kubernetes 集群中设置 Graylog,如 here 所述。我遇到的问题是环境变量 GRAYLOG_HTTP_EXTERNAL_URI 的定义。文档告诉我输入“我的 IP 地址”,根据我能够找到的信息,该变量用于告诉浏览器在哪里可以找到 Graylog API。

但是我的集群是通过一个作为入口控制器的 NGINX 反向代理访问的,这意味着浏览器不能直接访问 Graylog pod,更不用说通过 http,所以它真的不知道我应该在那里设置什么值.我尝试了入口控制器的公共 IP 地址,但得到的只是 503。有没有办法在允许访问 Graylog API 的同时仍然保护入口控制器后面的服务?

【问题讨论】:

    标签: kubernetes reverse-proxy graylog


    【解决方案1】:

    这真的取决于你如何暴露它。默认情况下,它不会暴露给外界。我们有graylog3 类型的NodePort 服务,因此我们只有一个内部IP,可以从另一个pod 访问或用于通过入口公开它。

    $ kubectl get service -o wide
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                          AGE   SELECTOR
    es6          NodePort    10.23.244.28    <none>        9200:30001/TCP,9300:30002/TCP    54m   service=es-deploy
    graylog3     NodePort    10.23.242.128   <none>        9000:30003/TCP,12201:30004/TCP   54m   service=graylog-deploy
    kubernetes   ClusterIP   10.23.240.1     <none>        443/TCP                          57m   <none>
    mongo        ClusterIP   10.23.243.160   <none>        27017/TCP                        54m   service=mongo-deploy
    

    如果我们从另一个 pod 卷曲这个服务和端口,我们会得到以下输出:

    $ kubectl exec -ti ubuntu -- curl 10.23.242.128:9000
    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="robots" content="noindex, nofollow">
        <meta charset="UTF-8">
        <title>Graylog Web Interface</title>
        <link rel="shortcut icon" href="http://your_ip_address:30003/assets/favicon.png">
    
      </head>
      <body>
        <script src="http://your_ip_address:30003/config.js"></script>
    
        <script src="http://your_ip_address:30003/assets/vendor.4024e2a8db732781a971.js"></script>
    
        <script src="http://your_ip_address:30003/assets/polyfill.a5e2fb591e8fd54ee4ef.js"></script>
    
        <script src="http://your_ip_address:30003/assets/builtins.a5e2fb591e8fd54ee4ef.js"></script>
    
        <script src="http://your_ip_address:30003/assets/plugin/org.graylog.plugins.threatintel.ThreatIntelPlugin/plugin.org.graylog.plugins.threatintel.ThreatIntelPlugin.b864ba54b438ac0bdc48.js"></script>
    
        <script src="http://your_ip_address:30003/assets/plugin/org.graylog.plugins.collector.CollectorPlugin/plugin.org.graylog.plugins.collector.CollectorPlugin.bcc87290018e859a8a9e.js"></script>
    
        <script src="http://your_ip_address:30003/assets/plugin/org.graylog.aws.AWSPlugin/plugin.org.graylog.aws.AWSPlugin.8ae7cb13983ce33eeb5b.js"></script>
    
        <script src="http://your_ip_address:30003/assets/app.a5e2fb591e8fd54ee4ef.js"></script>
    
      </body>
    </html>
    

    可以看出,有http://your_ip_address:30003的引用。如果我们保持这种方式,应用程序将中断,因为它引用了不存在的东西。

    所以我将更改 2 件事,通过入口使其从外部世界可见,并将 GRAYLOG_HTTP_EXTERNAL_URI 更改为我将获得的正确 IP:

    1 - 创建入口规则以公开 Graylog:

    这就是我的入口清单的样子

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: graylog
    spec:
      backend:
        serviceName: graylog3
        servicePort: 9000
    
    $ kubectl get ingresses 
    NAME      HOSTS   ADDRESS          PORTS   AGE
    graylog   *       34.107.139.231   80      56s
    

    2 - 编辑我们的GRAYLOG_HTTP_EXTERNAL_URI 并将http://your_ip_address:30003 替换为http://34.107.139.231:80

    请注意,这里我将端口从 30003 更改为 80,因为我们的入口规则暴露在端口 80 上。

    $ kubectl edit deployments graylog-deploy 
    

    进行了更改,现在让我们从任何控制台卷曲这个端口(给它一些时间来重新创建 pod):

    $ curl 34.107.139.231:80
    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="robots" content="noindex, nofollow">
        <meta charset="UTF-8">
        <title>Graylog Web Interface</title>
        <link rel="shortcut icon" href="http://34.107.139.231:80/assets/favicon.png">
    
      </head>
      <body>
        <script src="http://34.107.139.231:80/config.js"></script>
    
        <script src="http://34.107.139.231:80/assets/vendor.4024e2a8db732781a971.js"></script>
    
        <script src="http://34.107.139.231:80/assets/polyfill.a5e2fb591e8fd54ee4ef.js"></script>
    
        <script src="http://34.107.139.231:80/assets/builtins.a5e2fb591e8fd54ee4ef.js"></script>
    
        <script src="http://34.107.139.231:80/assets/plugin/org.graylog.plugins.threatintel.ThreatIntelPlugin/plugin.org.graylog.plugins.threatintel.ThreatIntelPlugin.b864ba54b438ac0bdc48.js"></script>
    
        <script src="http://34.107.139.231:80/assets/plugin/org.graylog.plugins.collector.CollectorPlugin/plugin.org.graylog.plugins.collector.CollectorPlugin.bcc87290018e859a8a9e.js"></script>
    
        <script src="http://34.107.139.231:80/assets/plugin/org.graylog.aws.AWSPlugin/plugin.org.graylog.aws.AWSPlugin.8ae7cb13983ce33eeb5b.js"></script>
    
        <script src="http://34.107.139.231:80/assets/app.a5e2fb591e8fd54ee4ef.js"></script>
    
      </body>
    </html>
    

    现在我们可以正常看到http://34.107.139.231:80/,页面可以完美加载了。

    如果您有一个重定向到您的应用程序 IP 的域名,请将其放入此变量中。

    【讨论】:

    • 但这是否会破坏拥有入口控制器的目的,即防止直接访问您的资源,从而造成安全问题?
    • 我的示例试图向您展示如何理解应该在GRAYLOG_HTTP_EXTERNAL_URI 中使用哪个IP。你是对的,使用 ingress 是一种更好的方法,但在我的示例中,我选择使用 LoadBalancer 公开它,只是为了让事情变得更快和更具指导性。最后,不管你如何暴露它,GRAYLOG_HTTP_EXTERNAL_URI 应该是用于访问 Graylog 仪表板的外部 ip/name。
    • 我刚刚意识到我可能没有清楚地提出我的问题:访问 API 的同时仍将服务保护在入口后面是我在这里尝试做的实际点,所以暴露不幸的是,作为负载均衡器的整个事情对我来说不是一个选择。
    • 奇怪,这与我正在做的事情基本相同。我明天会更深入地研究这个,也许我会发现我犯的错误。无论如何,谢谢你的帮助。 :D
    • 好吧,问题似乎解决了,我在elasticsearch yaml中发现了一些复制粘贴错误,并且我还在入口使用了端口30003而不是9000。现在我仍然需要教它使用https但那是另一回事。再次感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多