Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform Sonar无法通过istio虚拟服务访问,但可以在端口转发后在本地访问_Google Cloud Platform_Sonarqube_Google Kubernetes Engine - Fatal编程技术网

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

Google cloud platform Sonar无法通过istio虚拟服务访问,但可以在端口转发后在本地访问,google-cloud-platform,sonarqube,google-kubernetes-engine,Google Cloud Platform,Sonarqube,Google Kubernetes Engine,我试图在Kubernetes集群中实现SonarQube。部署正在正常运行,并通过虚拟服务公开。我可以通过localhost:port/sonar打开UI,但无法通过外部ip访问它。我知道sonar绑定到本地主机,不允许从远程服务器外部进行访问。我用一个MYSQL数据库在GKE上运行这个。这是我的YAML文件: apiVersion: extensions/v1beta1 kind: Deployment metadata: name: sonarqube namespace: sona

我试图在Kubernetes集群中实现SonarQube。部署正在正常运行,并通过虚拟服务公开。我可以通过
localhost:port/sonar
打开UI,但无法通过外部ip访问它。我知道sonar绑定到本地主机,不允许从远程服务器外部进行访问。我用一个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
---
部署成功完成。我的公开服务提供了一个已映射到主机url的公共ip,但我无法在主机url访问该服务

我需要更改映射,以便sonar与服务器ip绑定,但我无法理解如何做到这一点。我不能将它绑定到我的集群ip,也不能绑定到我的内部或外部服务ip


我该怎么办?请帮忙

不要传递参数,只要试着在没有参数的情况下运行一次就行了

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

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

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

我希望下面的解决方案对任何面临同样问题的人都有效

环境
  • 云提供商:Azure-AKS
    • 无论您使用什么提供者,这都应该有效
  • Istio版本:1.7.3
  • K8版本:1.16.10
工具-调试
  • kubectl日志-n istio system-l app=istiod
    • 来自Istiod的日志和控制平面中发生的事件
  • istioctl分析-n
    • 这通常会为给定命名空间提供任何警告和错误
    • 让您知道是否配置错误
  • Kiali-
    istioctl仪表板Kiali
    • 看看你是否得到入境流量
    • 此外,还会显示任何错误配置
  • 普罗米修斯-
    istioctl仪表板普罗米修斯
    • 查询指标-
      istio\u请求总数
      。这将显示进入服务的流量
    • 如果存在任何错误配置,您将看到目的地应用程序未知
问题
  • 无法通过外部IP访问sonarqube UI,但可通过本地主机(端口转发)访问
  • 无法通过Istio入口网关路由流量
解决方案 Sonarqube服务清单
  • 您的目标港口是集装箱港口。为避免任何混淆,只需将服务端口编号指定为与服务目标端口编号相同的编号即可
  • 端口名在这里非常重要。“Istio要求服务端口遵循“协议后缀”的命名形式,其中“-suffix”部分是可选的”——
sonarqube的Istio网关和虚拟服务清单
  • 网关协议必须设置为HTTP
  • 网关服务器端口虚拟服务目标端口相同。如果您有不同的应用程序服务端口,则您的VirtualService目标端口号应与应用程序服务端口匹配。网关服务器端口应与应用程序的服务目标端口相匹配
  • 现在是有趣的一点!主机是。如果您想访问集群外的服务,则需要将主机名(无论您想映射sonarqube服务器的主机名是什么)作为DNS A记录映射到istio ingressgateway的外部公共IP地址
  • 要获取入口网关的EXTERNAL-IP地址,请运行
    kubectl-n istio system get service istio-ingresgateway
  • 如果执行简单的nslookup(运行-
    nslookup
    ),则获得的IP地址必须与分配给istio ingressgateway服务的IP地址匹配
在入口通道中公开一个新端口
  • 请注意,您的sonarqube网关端口是一个新端口,您正在向Kubernetes介绍该端口,并告诉集群在该端口上侦听。但是你的负载平衡器不知道这个端口。因此,您需要在kubernetes外部负载平衡器上打开指定的网关端口。参考-
  • 您不需要手动更改负载平衡器服务。您只需要更新入口网关以包含新端口,这将自动更新负载平衡器
  • 您可以通过运行
    istioctl analyze-n sonarqube
    来确定端口是否导致问题。你应该得到以下警告
[33mWarn[0m[IST0104](网关sonarqube Gateway.sonarqube)网关指的是未暴露在工作负载上的端口(pod选择器istio=ingressgateway;端口9000)错误:分析器在分析命名空间sonarqube时发现问题。请参阅https://istio.io/docs/reference/config/analysis 有关原因和解决方案的更多信息。

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

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

  • 您的设置如下所示; 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: {}
    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