繁体   English   中英

无法从 Kubernetes 集群内部访问 Cassandra

[英]Unable to access the Cassandra from inside the Kubernetes cluster

我的 Kubernetes 集群中有一个 Cassandra 集群和一个 spring 引导应用程序。 它们位于相同的(默认)命名空间中。 spring 启动应用程序需要连接到 Cassandra,但它无法做到这一点。 在连接尝试期间,spring 引导应用程序收到以下异常:

抑制:io.netty.channel.AbstractChannel$AnnotatedConnectException:连接被拒绝:cassandra/10.111.117.185:32532 原因:java.net.ConnectException:连接在 java.base/sun.nio.ch.SocketChannelImpl.checkConnect(本机方法)被拒绝) at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:777) at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330) at io.netty.channel. nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:710) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:第658章)在 io.netty.channel.nio.NioEventLoop.processSelectedKeys 8B33D21F46Z:584) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) at io.netty.util. internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:829 ) 引起:io.netty.channel.StacklessClosedChannelException: null

Cassandra yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra
spec:
  type: NodePort
  ports:
  - port: 9042
    targetPort: 9042
    protocol: TCP
    nodePort: 32532
  selector:
    app: cassandra
---

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:
      terminationGracePeriodSeconds: 1800
      containers:
      - name: cassandra
        image: cassandra:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 7000
          name: intra-node
        - containerPort: 7001
          name: tls-intra-node
        - containerPort: 7199
          name: jmx
        - containerPort: 9042
          name: cql
        resources:
          limits:
            cpu: "500m"
            memory: 1Gi
          requests:
            cpu: "500m"
            memory: 1Gi
        securityContext:
          capabilities:
            add:
              - IPC_LOCK
        lifecycle:
          preStop:
            exec:
              command: 
              - /bin/sh
              - -c
              - nodetool drain
        env:
          - name: MAX_HEAP_SIZE
            value: 512M
          - name: HEAP_NEWSIZE
            value: 100M
          - name: CASSANDRA_SEEDS
            value: "cassandra-0.cassandra.default.svc.cluster.local"
          - name: CASSANDRA_CLUSTER_NAME
            value: "K8SCassandra"
          - name: CASSANDRA_DC
            value: "DC1-K8SCassandra"
          - name: CASSANDRA_RACK
            value: "Rack1-K8SCassandra"
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        
        volumeMounts:
        - name: cassandra-data
          mountPath: /cassandra_data
  volumeClaimTemplates:
  - metadata:
      name: cassandra-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: standard
      resources:
        requests:
          storage: 1Gi

Spring 启动应用程序 yaml:

apiVersion: v1
kind: Service
metadata:
  name: service-cassandraapp
  labels:
     app: cassandraapp
spec:
  selector:
    app: cassandraapp
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 32588
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-cassandraapp
  labels:
    app: cassandraapp
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: cassandraapp
  template:
    metadata:
      labels:
        app: cassandraapp
    spec:
      containers:
      - name: cassandraapp
        image: ek/cassandraapp:latest
        ports:
          - containerPort: 8080
        resources:
          limits:
            memory: "1Gi"
            cpu: "1000m"
          requests:
            memory: "256Mi"
            cpu: "500m"
        env:
          - name: CONFIG_CASSANDRA_HOST
            value: "cassandra"
          - name: CONFIG_CASSANDRA_PORT
            value: "32532"  

Spring 启动应用程序.properties:

spring.data.cassandra.local-datacenter=datacenter1
spring.data.cassandra.keyspace-name=testkeyspace
spring.data.cassandra.port=${CONFIG_CASSANDRA_PORT}
spring.data.cassandra.contact-points=${CONFIG_CASSANDRA_HOST}
spring.data.cassandra.username=cassandra
spring.data.cassandra.password=cassandra
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS

当我检查 Cassandra 吊舱时,它们正在运行 state。 但是 spring 引导应用程序被拒绝。 任何帮助将不胜感激。

我解决了这个问题。 我假设 spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS 会创建密钥空间,但它不会。 所以我手动创建了它。

我更新的springboot应用程序yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-cassandra-cassandraapp
data:
  cassandra-host: "cassandra.default.svc.cluster.local"
  cassandra-port: "9042"
  cassandra-keyspace: "testkeyspace"
  cassandra-datacenter: "datacenter1"
---
apiVersion: v1
kind: Service
metadata:
  name: service-cassandraapp
  labels:
     app: cassandraapp
spec:
  selector:
    app: cassandraapp
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-cassandraapp
  labels:
    app: cassandraapp
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: cassandraapp
  template:
    metadata:
      labels:
        app: cassandraapp
    spec:
      containers:
      - name: cassandraapp
        image: ek/cassandraapp:latest
        ports:
          - containerPort: 8080
        resources:
          limits:
            memory: "1Gi"
            cpu: "1000m"
          requests:
            memory: "256Mi"
            cpu: "500m"
        env:
          - name: CONFIG_CASSANDRA_HOST
            valueFrom:
              configMapKeyRef:
                name: configmap-cassandra-cassandraapp
                key: cassandra-host
          - name: CONFIG_CASSANDRA_PORT
            valueFrom:
              configMapKeyRef:
                name: configmap-cassandra-cassandraapp
                key: cassandra-port
          - name: CONFIG_CASSANDRA_KEYSPACE
            valueFrom:
              configMapKeyRef:
                name: configmap-cassandra-cassandraapp
                key: cassandra-keyspace
          - name: CONFIG_CASSANDRA_DATACENTER
            valueFrom:
              configMapKeyRef:
                name: configmap-cassandra-cassandraapp
                key: cassandra-datacenter

Springboot 应用程序.properties

spring.data.cassandra.local-datacenter=${CONFIG_CASSANDRA_DATACENTER}
spring.data.cassandra.keyspace-name=${CONFIG_CASSANDRA_KEYSPACE}
spring.data.cassandra.port=${CONFIG_CASSANDRA_PORT}
spring.data.cassandra.contact-points=${CONFIG_CASSANDRA_HOST}

最后我还尝试了 Bitnami Helm Chart。 我也推荐它。 [https://bitnami.com/stack/cassandra/helm][1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM