Nodetool fails after updated cassandra from 4.0.18 to 4.1.10

We are using FluxCD to deploy k8ssandra CRDs as a Helm chart. I updated Cassandra to 4.1.10 in the K8ssandraCluster manifest. Cluster is up and running, and Authentication is enabled, but nodetool doesn’t work. I get this error when I try to run nodetool -u xxx -pw yyy nodetool: Failed to connect to '127.0.0.1:7199' - IOException: '/opt/cassandra/conf/cassandra-jaas.config (No such file or directory). It was working before the update. I checked the file /opt/cassandra/conf/cassandra-jaas.config, but it doesn’t exist. I tried to add it manually, but it didn’t work. Also, when I run cqlsh -u xxx -p yyy, it’s working with the WARNING message like this;

Warning: Cannot create directory at `/opt/cassandra/.cassandra`. Command history will not be saved. Please check what was the environment property CQL_HISTORY set to.

Warning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.
Let me share my k8ssandra-operator and k8ssandraCluster manifest files.

Let me share my k8ssandra-operator and k8ssandraCluster manifest files.

K8ssandra-operator.yaml

---
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
  name: k8ssandra
  namespace: default
spec:
  interval: 1m0s
  url: https://helm.k8ssandra.io/stable

---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: k8ssandra-operator
  namespace: default
spec:
  chart:
    spec:
      chart: k8ssandra-operator
      reconcileStrategy: ChartVersion
      sourceRef:
        kind: HelmRepository
        name: k8ssandra
        namespace: default
      version: 1.23.1
  interval: 1m0s
k8ssandraCluster.yaml

k8ssandraCluster.yaml

apiVersion: k8ssandra.io/v1alpha1
kind: K8ssandraCluster
metadata:
  name: cassandra
  namespace: default
  annotations:
    kustomize.toolkit.fluxcd.io/prune: true
spec:
  auth: true
  reaper:
    containerImage:
      name: cassandra-reaper
      registry: docker.io
      repository: thelastpickle
      tag: 3.8.0
    initContainerImage:
      name: cassandra-reaper
      registry: docker.io
      repository: thelastpickle
      tag: 3.8.0
    autoScheduling:
      enabled: false
    telemetry:
      prometheus:
        enabled: true
  cassandra:
    telemetry: 
      prometheus:
        enabled: true
      mcac:
        metricFilters:
          - "deny:org.apache.cassandra.metrics.Table"
    serverVersion: "4.1.10"
    resources:
      requests:
        memory: "13Gi"
        cpu: "1"
      limits:
        memory: "13Gi"
    datacenters:
      - metadata:
          name: dc1
        size: 3
        racks:
        - name: me-south-1a
          nodeAffinityLabels:
            topology.kubernetes.io/zone: me-south-1a
        - name: me-south-1b
          nodeAffinityLabels:
            topology.kubernetes.io/zone: me-south-1b
        - name: me-south-1c
          nodeAffinityLabels:
            topology.kubernetes.io/zone: me-south-1c
        storageConfig:
          cassandraDataVolumeClaimSpec:
            storageClassName: gp3-retain
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 200Gi
        config:
          cassandraYaml:
            batch_size_fail_threshold: 5000KiB
            batch_size_warn_threshold: 1000KiB
          jvmOptions:
            gc: ZGC
            heapSize: 3072M

  medusa:
    storageProperties:
      storageProvider: s3
      storageSecretRef:
        name: s3-bucket-key
      bucketName: demo-k8ssandra-backup-store1
      prefix: demo
      region: eu-central-1

      # Whether or not to use SSL to connect to the storage backend
      secure: true

      # Maximum backup age that the purge process should observe.
      # 0 equals unlimited
      maxBackupAge: 15

      # File size in bytes over which cloud specific cli tools are used for transfer.
      #Defaults to 100 MB.
      multiPartUploadThreshold: 109951162777600

k8ssandra-operator version:

$ k get deployment k8ssandra-operator -ojsonpath="{.spec.template.spec.containers[0].image}"
cr.k8ssandra.io/k8ssandra/k8ssandra-operator:v1.23.1

cass-operator version:

$ k get deployment k8ssandra-operator-cass-operator -ojsonpath="{.spec.template.spec.containers[0].image}"
cr.k8ssandra.io/k8ssandra/cass-operator:v1.24.1

cass-operator CRD version:

$ k get crd cassandradatacenters.cassandra.datastax.com -o json | jq '.metadata.annotations'
{
  "controller-gen.kubebuilder.io/version": "v0.16.4"
}

I would expect the operator(1.23.1) to create this missed file “cassandra-jass.config”

$ winpty kubectl exec -it cassandra-dc1-me-south-1a-sts-0 -c cassandra -- bash -c "ls -l opt/cassandra/conf/"
total 56
-rwxr-x--- 1 cassandra cassandra 13843 Sep 16 00:37 cassandra-env.sh
-rwxr-x--- 1 cassandra cassandra    24 Sep 16 00:37 cassandra-rackdc.properties
-rw-r----- 1 cassandra cassandra  4223 Sep 16 00:37 cassandra.yaml
-rw-r--r-- 1 cassandra cassandra  2134 Sep 16 00:37 jvm11-clients.options
-rwxr-x--- 1 cassandra cassandra   940 Sep 16 00:37 jvm11-server.options
-rwxr-x--- 1 cassandra cassandra     0 Sep 16 00:37 jvm17-server.options
-rw-r--r-- 1 cassandra cassandra  1323 Sep 16 00:37 jvm-clients.options
-rwxr-x--- 1 cassandra cassandra   261 Sep 16 00:37 jvm-server.options
-rw-r--r-- 1 cassandra cassandra  1195 Sep 16 00:37 logback-tools.xml
-rw-r--r-- 1 cassandra cassandra  5098 Sep 16 00:37 logback.xml

I also checked the logs using grep “jass” in the operator, cass-operator, flux pods, cassandra pod… to catch any logs regarding this missed file, but I couldn’t find anything.

Is there something I’ve missed that’s required? How can I fix this issue?

Also, there is no information about a compatible matrix between the operator and Cassandra in the official documents. How can I make sure which operator version is compatible with the Cassandra version that I want to update?

I need your support asap. Thanks.

Hi, see the solution in this ticket.
In a nutshell, you need to modify the Reaper spec to use the management api by setting:

    httpManagement:
      enabled: true

That will remove the need for that cassandra-jass.config file, and allow you to use pods with read only root filesystem enabled.

1 Like

Hi @alexander ,

I really appreciated. It’s working now. Thank you so much :folded_hands: