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

4si2a6ki  于 2023-03-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(180)

我正在尝试在Kubernetes群集中实现SonarQube。部署运行正常,也通过虚拟服务公开。我可以通过localhost:port/sonar打开UI,但无法通过外部IP访问它。我知道sonar绑定到localhost,不允许从远程服务器外部访问。我正在使用MYSQL数据库的GKE上运行此程序。以下是我的YAML文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sonarqube
  namespace: sonar
  labels:
    service: sonarqube
    version: v1
spec:
  replicas: 1
  template:
    metadata:
      name: sonarqube
      labels:
        name: sonarqube
    spec:
      terminationGracePeriodSeconds: 15
      initContainers:
        - name: volume-permission
          image: busybox
          command:
            - sh
            - -c
            - sysctl -w vm.max_map_count=262144
          securityContext:
            privileged: true
      containers:
        - name: sonarqube
          image: sonarqube:6.7
          resources:
            limits:
              memory: 4Gi
              cpu: 2
            requests:
              memory: 2Gi
              cpu: 1
          args:
            - -Dsonar.web.context=/sonar
            - -Dsonar.web.host=0.0.0.0
          env:
            - name: SONARQUBE_JDBC_USERNAME
              valueFrom:
                secretKeyRef:
                  name: cloudsql-db-credentials
                  key: username
            - name: SONARQUBE_JDBC_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql-db-credentials
                  key: password
            - name: SONARQUBE_JDBC_URL
              value: jdbc:mysql://***.***.**.*:3306/sonar?useUnicode=true&characterEncoding=utf8
          ports:
            - containerPort: 9000
              name: sonarqube-port
---
apiVersion: v1
kind: Service
metadata:
  labels:
    service: sonarqube
    version: v1
  name: sonarqube
  namespace: sonar
spec:
  selector:
    name: sonarqube
  ports:
    - name: http
      port: 80
      targetPort: sonarqube-port
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sonarqube-internal
  namespace: sonar
spec:
  hosts:
    - sonarqube.staging.jeet11.internal
    - sonarqube
  gateways:
    - default/ilb-gateway
    - mesh
  http:
    - route:
        - destination:
            host: sonarqube
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sonarqube-external
  namespace: sonar
spec:
  hosts:
    - sonarqube.staging.jeet11.com
  gateways:
    - default/elb-gateway
  http:
    - route:
        - destination:
            host: sonarqube
---

部署成功完成。公开的服务提供了已Map到主机url的公共ip,但我无法访问主机url上的服务。
我需要更改Map,使sonar与服务器ip绑定,但我不知道如何操作。我无法将其绑定到我的群集ip,也无法绑定到我的内部或外部服务ip。
我该怎么办?请帮帮我!

b1zrtrql

b1zrtrql1#

我最近也遇到了同样的问题,今天我设法解决了这个问题。
我希望下面的解决方案对任何面临同样问题的人都有效!
环境

  • 云提供商:** Azure - AKS**
  • 无论您使用什么提供程序,这都应该有效。
  • Istio版本:1.7.3
  • K8版本:1.16.10

工具-调试

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

问题

  • 无法通过外部IP访问sonarqube UI,但可通过本地主机(端口转发)访问。
  • 无法通过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是容器端口。为避免混淆,只需分配与服务targetport相同的服务port编号。
  • 端口名称在这里非常重要。“Istio要求服务端口遵循'protocol-suffix'的命名格式,其中'-suffix'部分是可选的”-KIA 0601-端口名称必须遵循[-suffix]格式

Sonarqube的Istio网关和虚拟服务清单

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目标端口编号应与应用程序服务端口匹配。网关服务器端口应与应用程序服务目标端口匹配。
  • 现在进入有趣的部分!hosts.如果你想访问集群外的服务,那么你需要把你的主机名(你想Map到sonarqube服务器的任何主机名)作为一个DNS A记录Map到isto-ingressgateway的外部公共IP地址。
  • 要获取入口网关的EXTERNAL-IP地址,请运行kubectl -n istio-system get service istio-ingressgateway
  • 如果您执行简单的nslookup(运行-nslookup <hostname>),您获得的IP地址必须与分配给istio-ingressgateway服务的IP地址匹配。

在入口网关中公开新端口

  • 请注意,您的sonarqube网关端口是您引入Kubernetes的新端口,并且您正在通知群集侦听该端口。但您的负载平衡器不知道此端口。因此,您需要在Kubernetes外部负载平衡器上打开指定的网关端口
  • 你不需要手动更改负载平衡器服务。你只需更新入口网关以包括新端口,这将自动更新负载平衡器。
  • 您可以通过运行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并将以下部分添加到端口。

跳过创建新端口

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

  • 您的设置将如下所示;

  • 要使指定端口的主机名无效,只需添加match uri前缀,如virtualservice清单所示。

测试时间

  • 如果一切都像预期的那样达到这一点,那么你就可以走了。

  • 在测试过程中,我犯了一个错误,没有指定端口。如果你得到404状态,这仍然是一件好事,这样你就可以验证它正在使用什么服务器。如果你设置正确,它应该使用isto-envoy服务器,而不是nginx

  • 而不指定端口。只有在添加匹配uri前缀的情况下才有效。

xurqigkl

xurqigkl2#

不要传递参数,只是尝试运行没有它一次为我工作。
这就是我的部署文件希望帮助

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

相关问题