【问题标题】:How to expose a headless service for a StatefulSet cassandra cluster externally in Kubernetes如何在 Kubernetes 外部公开 StatefulSet cassandra 集群的无头服务
【发布时间】:2019-03-27 17:37:17
【问题描述】:

我正在 kubernetes (Azure AKS) 中设置多节点 cassandra 集群,因为这是一个无头服务,具有全状态集 pod,没有外部 IP。 如何将我的 spark 应用程序与 kubernetes 集群中的 cassandra 连接

我们已经尝试使用集群 ip,入口 ip 也但是只有单个 pod 起床休息失败。

我有 3 个清单:

  1. 服务
  2. PersistentVolumeClaim
  3. 有状态集
apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra
spec:
  clusterIP: None
  ports:
    - port: 9042
  selector:
    app: cassandra


kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myvolume-disk-claim
spec:
  storageClassName: default
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi


apiVersion: "apps/v1"
kind: StatefulSet
metadata:
  name: cassandra
  labels:
    app: cassandra
spec:
  serviceName: cassandra
  replicas: 3
  selector:
    matchLabels:
      app: cassandra
  template:
    metadata:
      labels:
        app: cassandra
    spec:
      containers:
        - name: cassandra
          image: gcr.io/google-samples/cassandra:v13
          imagePullPolicy: Always
          ports:
            - containerPort: 7000
              name: intra-node
            - containerPort: 7001
              name: tls-intra-node
            - containerPort: 7199
              name: jmx
            - containerPort: 9042
              name: cql
          env:
            - name: CASSANDRA_SEEDS
              value: cassandra-0.cassandra.default.svc.cluster.local
            - name: MAX_HEAP_SIZE
              value: 256M
            - name: HEAP_NEWSIZE
              value: 100M
            - name: CASSANDRA_CLUSTER_NAME
              value: "Cassandra"
            - name: CASSANDRA_DC
              value: "DC1"
            - name: CASSANDRA_RACK
              value: "Rack1"
            - name: CASSANDRA_ENDPOINT_SNITCH
              value: GossipingPropertyFileSnitch
            - name: POD_IP
              valueFrom:
                fieldRef:
                   fieldPath: status.podIP
          readinessProbe:
            exec:
              command:
              - /bin/bash
              - -c
              - /ready-probe.sh
            initialDelaySeconds: 15
            timeoutSeconds: 5        
          volumeMounts:
          - mountPath: /var/lib/cassandra/data
            name: myvolume-disk-claim
  volumeClaimTemplates:
  - metadata:
      name: myvolume-disk-claim
    spec:
      storageClassName: default
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi

预期结果:(公共IP作为外部IP)

dspg@Digiteds28:$ kubectl get svc
NAME                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes                ClusterIP   10.0.0.1     <none>        443/TCP    1h
cassandra                 ClusterIP   None        154.167.90.98  9042/TCP   1h



dspg@Digiteds28:$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
cassandra-0         1/1     Running   0          59m
cassandra-1         1/1     Running   0          58m
cassandra-2         1/1     Running   0          56m

实际输出:

dspg@Digiteds28:$ kubectl get svc
NAME                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes                ClusterIP   10.0.0.1     <none>        443/TCP    1h
cassandra                 ClusterIP   None         <none>        9042/TCP   1h



dspg@Digiteds28:$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
cassandra-0         1/1     Running   0          59m
cassandra-1         1/1     Running   0          58m
cassandra-2         1/1     Running   0          56m

现在这不包括连接到应用程序的外部 IP。

【问题讨论】:

标签: apache-spark cassandra kubernetes


【解决方案1】:

这取决于您到底想做什么。如果您需要一个外部 IP,那么通常您需要创建一个额外的服务对象(可能是 type: LoadBalancer),如下所示:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra-ext
spec:
  type: LoadBalancer
  ports:
    - port: 9042
  selector:
    app: cassandra

如果您需要从集群中访问它,请使用来自另一个 pod 的 DNS 名称 cassandra-0.cassandra.default(如果 StatefulSet 部署在默认命名空间中)

【讨论】:

  • 使用上述建议创建附加服务,为我工作。伟大的帮助朋友。非常感谢。
  • 我可以使用默认存储类挂载 cassandra 数据文件夹,但我需要使用 Azure 文件共享来查找其中的困难。 {链接}(stackoverflow.com/questions/55468427/…)
【解决方案2】:
apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra-ext
spec:
  type: LoadBalancer
  ports:
    - port: 9042
  selector:
    app: cassandra

使用附加服务给了我一个外部 IP,因为如果我开始将我的 spark 或 devcenter 应用程序连接到 cassandra 集群。

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 2021-12-21
    • 2017-02-13
    • 2020-04-25
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2020-08-18
    相关资源
    最近更新 更多