Google cloud platform Sonar无法通过istio虚拟服务访问,但可以在端口转发后在本地访问
我试图在Kubernetes集群中实现SonarQube。部署正在正常运行,并通过虚拟服务公开。我可以通过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
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入口网关路由流量
- 您的目标港口是集装箱港口。为避免任何混淆,只需将服务端口编号指定为与服务目标端口编号相同的编号即可
- 端口名在这里非常重要。“Istio要求服务端口遵循“协议后缀”的命名形式,其中“-suffix”部分是可选的”——
- 网关协议必须设置为HTTP
- 网关服务器端口和虚拟服务目标端口相同。如果您有不同的应用程序服务端口,则您的VirtualService目标端口号应与应用程序服务端口匹配。网关服务器端口应与应用程序的服务目标端口相匹配
- 现在是有趣的一点!主机是。如果您想访问集群外的服务,则需要将主机名(无论您想映射sonarqube服务器的主机名是什么)作为DNS A记录映射到istio ingressgateway的外部公共IP地址
- 要获取入口网关的EXTERNAL-IP地址,请运行
kubectl-n istio system get service istio-ingresgateway
- 如果执行简单的nslookup(运行-
),则获得的IP地址必须与分配给istio ingressgateway服务的IP地址匹配nslookup
- 请注意,您的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