【问题标题】:Make rabbitmq cluster publicly accesible使rabbitmq集群可公开访问
【发布时间】:2019-04-16 16:25:19
【问题描述】:

我正在使用这个 helm chart 在 k8s 集群上配置 rabbitmq: https://github.com/helm/charts/tree/master/stable/rabbitmq

如何使集群可以通过公共端点访问?目前,我有一个具有以下配置的集群。我可以通过给定的主机名(公共端点,这很好)访问管理门户。但是,当我检查管理门户集群内部时,可以通过内部 IP 和/或主机名访问:rabbit@rabbitmq-0.rabbitmq-headless.default.svc.cluster.localrabbit@<private_ip>。我想公开集群,以便 VNET 之外的所有其他服务都可以连接到它。

helm install stable/rabbitmq --name rabbitmq \
  --set rabbitmq.username=xxx \
  --set rabbitmq.password=xxx \
  --set rabbitmq.erlangCookie=secretcookie \
  --set rbacEnabled=true \
  --set ingress.enabled=true \
  --set ingress.hostName=rabbitmq.xxx.com \
  --set ingress.annotations."kubernetes\.io/ingress\.class"="nginx" \
  --set resources.limits.memory="256Mi" \
  --set resources.limits.cpu="100m"

【问题讨论】:

  • 如果你需要一个部署和服务.yaml文件来创建rabbitmq-service并发布它。我会在答案中显示出来。
  • 因为我没有尝试过使用 Helm

标签: kubernetes rabbitmq kubernetes-helm


【解决方案1】:

我没有尝试使用 Helm,但我直接从 .yaml 配置文件构建并部署到 Kubernetes。所以我只关注了Template of Helm

为了在集群外发布你的 RabbitMQ 服务

1、你需要有一个外部IP:

如果您使用 Google Cloud,请运行以下命令:

gcloud compute addresses create rabbitmq-service-ip --region asia-southeast1
gcloud compute addresses describe rabbitmq-service-ip --region asia-southeast1
>address: 35.240.xxx.xxx

rabbitmq-service-ip 更改为您想要的名称,并将region 更改为您自己的名称。

2、配置Helm参数

service.type=LoadBalancer

service.loadBalancerSourceRanges=35.240.xxx.xxx/32#你从gcloud得到的IP地址

service.port=5672

3、部署并尝试 telnet 到您的 RabbitMQ 服务

telnet 35.240.xxx.xxx 5672
Trying 35.240.xxx.xxx...
Connected to 149.185.xxx.xxx.bc.googleusercontent.com.
Escape character is '^]'.

明白了!成功了

仅供参考:

如果你想创建 .yaml 并在没有 Helm 的情况下进行部署,这里是基本模板

service.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq
  labels:
    name: rabbitmq
  namespace: smart-office
spec:
  type: LoadBalancer
  loadBalancerIP: 35.xxx.xxx.xx
  ports:
    # the port that this service should serve on
  - port: 5672
    name: rabbitmq
    targetPort: 5672
    nodePort: 32672
  selector:
    name: rabbitmq

deployment.yaml

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: rabbitmq
  labels:
    name: rabbitmq
  namespace: smart-office
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: rabbitmq
      annotations:
        prometheus.io/scrape: "false"
    spec:
      containers:
      - name: rabbitmq
        image: rabbitmq:3.6.8-management
        ports:
        - containerPort: 5672
          name: rabbitmq
        securityContext:
          capabilities:
            drop:
              - all
            add:
              - CHOWN
              - SETGID
              - SETUID
              - DAC_OVERRIDE
          readOnlyRootFilesystem: true
      - name: rabbitmq-exporter
        image: kbudde/rabbitmq-exporter
        ports:
        - containerPort: 9090
          name: exporter
      nodeSelector:
        beta.kubernetes.io/os: linux

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    从您传递的 Helm 值中,我看到您已使用 Nginx Ingress 配置了 RabbitMQ 服务。

    您应该创建一个 DNS 记录,并将您的 ingress.hostName (rabbitmq.xxx.com) 定向到您的 nginx-ingress 负载均衡器的入口 IP(如果是 GCP)或 CNAME(如果是 AWS)。该 DNS 主机名 (rabbitmq.xx.com) 是您访问 RabbitMQ 服务的公共端点。

    确保您的 nginx-ingress 控制器正在您的集群中运行,以便入口能够正常工作。如果您不熟悉 ingresses:
    - Official Ingress Docs
    - Nginx Ingress installation guide
    - Nginx Ingress helm chart

    希望这会有所帮助!

    【讨论】:

    • Rabbitmq 管理门户在公共 DNS over ingress 上运行良好。但是,如何从公共端点连接到集群?
    • 连接集群是指访问队列并与队列交互吗?
    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2019-12-13
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多