不能通过istio虚拟服务访问Sonar,但可以在端口转发后本地访问

时间:2020-02-12 08:47:30

标签: google-cloud-platform sonarqube google-kubernetes-engine

我正在尝试在Kubernetes集群中实现SonarQube。部署运行正常,并且还通过虚拟服务公开。我可以通过productHierarchy打开用户界面,但无法通过外部IP访问它。我知道声纳绑定到本地主机,并且不允许从远程服务器外部进行访问。我正在使用MYSQL数据库在GKE上运行此文件。这是我的YAML文件:

localhost:port/sonar

部署成功完成。我的公开服务提供了已映射到主机URL的公共ip,但是我无法通过主机URL访问该服务。

我需要更改映射,以使声纳与服务器ip绑定,但是我不知道该怎么做。我无法将其绑定到群集ip,也无法绑定到内部或外部服务ip。

我该怎么办?请帮忙!

2 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题,今天我设法解决了这个问题。

我希望以下解决方案对遇到相同问题的任何人都适用!。

环境

  • 云提供商: Azure-AKS
    • 无论您使用什么提供程序,它都应该起作用。
  • Istio版本:1.7.3
  • K8版本:1.16.1.10

工具-调试

  • kubectl logs -n istio-system -l app=istiod
    • 来自Istiod的日志和在控制平面中发生的事件。
  • istioctl analyze -n <namespace>
    • 这通常会为您提供给定命名空间的所有警告和错误。
    • 让您知道是否配置错误。
  • Kiali-istioctl dashboard kiali
    • 查看您是否有入站流量。
    • 此外,还会显示任何配置错误。
  • 普罗米修斯-istioctl dashboard prometheus
    • 查询指标-istio_requests_total。这会向您显示进入该服务的流量。
    • 如果配置有误,您会看到 destination_app 未知

问题

  • 无法通过外部IP访问sonarqube UI,但可以通过localhost(端口转发)进行访问。
  • 无法通过Istio Ingressgateway路由流量。

解决方案

Sonarqube服务清单

apiVersion: v1
kind: Service
metadata:
  name: sonarqube
  namespace: sonarqube
  labels:
    name: sonarqube
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 9000
    targetPort: 9000
  selector:
    app: sonarqube
status:
  loadBalancer: {}
  • 您的 targetport 是容器端口。为避免混淆,只需将服务端口的编号分配给服务目标端口
  • 端口名称在这里非常重要。 “ Istio要求服务端口遵循'protocol-suffix'的命名形式,其中'-suffix'部分是可选的”-KIA0601 - Port name must follow [-suffix] form

Sonarqube的Istio网关和VirtualService清单

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: sonarqube-gateway
  namespace: sonarqube
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 9000
      name: http
      protocol: HTTP
    hosts:
    - "XXXX.XXXX.com.au"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sonarqube
  namespace: sonarqube
spec:
  hosts:
  - "XXXX.XXXX.com.au"
  gateways:
  - sonarqube-gateway
  http:
  - route:
    - destination:
        host: sonarqube
        port:
          number: 9000
  • 网关协议必须设置为 HTTP
  • 网关服务器端口 VirtualService目标端口是相同的。如果您有其他应用程序服务端口,则您的 VirtualService目标端口编号应与应用程序服务端口匹配。 网关服务器端口应与应用程序服务目标端口匹配。
  • 现在来找点乐子吧! 主机。如果要访问群集外部的服务,则需要将主机名(要映射声纳服务器的任何主机名)作为 DNS A记录映射到 istio-ingressgateway 的外部公共IP地址。
  • 要获取入口网关的 EXTERNAL-IP 地址,请运行kubectl -n istio-system get service istio-ingressgateway
  • 如果执行简单的nslookup(运行-nslookup <hostname>),则获得的IP地址必须与分配给istio-ingressgateway服务的IP地址匹配。

在入口网关中暴露一个新端口

  • 请注意,您的sonarqube网关端口是您要引入Kubernetes的新端口,并且告诉集群在该端口上侦听。但是您的负载平衡器不知道该端口。因此,您需要在kubernetes外部负载均衡器上打开指定的网关端口。参考-Info
  • 您无需手动更改负载均衡器服务。您只需要更新入口网关以包括新端口,即可自动更新负载均衡器。
  • 您可以通过运行istioctl analyze -n sonarqube来确定端口是否引起了问题。您应该收到以下警告;

[33mWarn[0m [IST0104] (Gateway sonarqube-gateway.sonarqube) The gateway refers to a port that is not exposed on the workload (pod selector istio=ingressgateway; port 9000) Error: Analyzers found issues when analyzing namespace: sonarqube. See https://istio.io/docs/reference/config/analysis for more information about causes and resolutions.

  • 您应该在控制平面中得到相应的错误。运行kubectl logs -n istio-system -l app=istiod
  • 此时,您需要更新Istio ingressgateway服务以公开新端口。运行kubectl edit svc istio-ingressgateway -n istio-system,然后将以下部分添加到端口中。

enter image description here

绕过创建新端口

  • 在上一节中,您了解了如何公开一个新端口。这是可选的,具体取决于您的用例。
  • 在本节中,您将看到如何使用已经暴露的端口。
  • 如果您查看istio-ingressgateway的服务。您可以看到有暴露的默认端口。在这里,我们将使用端口80。

enter image description here

  • 您的设置将如下所示; enter image description here

enter image description here

  • 要取消使用主机名指定端口,只需添加match uri前缀即可,如virtualservice清单所示。

测试时间

  • 如果一切都按预期完成,那么您就可以了。

enter image description here

  • 在测试期间,我没有指定端口就犯了一个错误。如果您获得404状态(这仍然是一件好事),则可以通过这种方式验证其使用的服务器。如果设置正确,则应使用 istio-envoy 服务器,而不是 nginx

enter image description here

  • 未指定端口。仅当您添加match uri前缀时,此方法才有效。

enter image description here

答案 1 :(得分:0)

不要传递参数,只要对我有用,就不要尝试运行它。

这就是我的部署文件希望对您有帮助的方式

apiVersion: v1
kind: Service
metadata:
  name: sonarqube-service
spec:
  selector:
    app: sonarqube
  ports:
  - protocol: TCP
    port: 9000
    targetPort: 9000
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: sonarqube
  name: sonarqube
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      containers:
        - name: sonarqube
          image: sonarqube:7.1
          resources:
            requests:
              memory: "1200Mi"
              cpu: .10
            limits:
              memory: "2500Mi"
              cpu: .50
          volumeMounts:
          - mountPath: "/opt/sonarqube/data/"
            name: sonar-data
          - mountPath: "/opt/sonarqube/extensions/"
            name: sonar-extensions
          env:
          - name: "SONARQUBE_JDBC_USERNAME"
            value: "root"  #Put your db username
          - name: "SONARQUBE_JDBC_URL"
            value: "jdbc:mysql://192.168.112.4:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true" #DB URL
          - name: "SONARQUBE_JDBC_PASSWORD"
            value : password
          ports:
          - containerPort: 9000
            protocol: TCP
      volumes:
      - name: sonar-data
        persistentVolumeClaim:
          claimName: sonar-data
      - name: sonar-extensions
        persistentVolumeClaim:
          claimName: sonar-extensions