Linux on Power 上创建一个 Cassandra 数据存储( ppc64le )

您可以安装 Cassandra 操作程序并设置数据存储器。

准备工作

确保已准备好联机和脱机主机以从外部存储库中拉取映像。 此外,请确保添加了正确的 Helm 存储库。

如需更多信息,请参阅 “准备安装数据存储 ”。

Cassandra 用于部署的操作系统版本和镜像标签

置顶的 Helm Chart 或操作程序版本需要以下映像。

表 1. Cassandra 运算符版本和图像标签
平台 操作程序版本 Helm Chart 版本 带有标记的图像
0.63.1 1.29.0 0.63.1

artifact-public.instana.io/self-hosted-images/3rd-party/operator/cass-operator: 1.29.0_v0.39.0

artifact-public.instana.io/self-hosted-images/3rd-party/datastore/k8ssandra-client: 0.8.12_v0.33.0

artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cassandra: 4.1.10_v0.41.0

artifact-public.instana.io/self-hosted-images/3rd-party/datastore/system-logger: 1.26.0_v0.18.0

创建安全上下文约束(在线和离线)

如果您使用的是 Red Hat® OpenShift® 集群,请在部署 Cassandra 操作员之前创建一个安全上下文约束(SCC)资源。 在线和离线部署都需要 SCC 资源。

要创建 SCC 资源,请完成以下步骤:

  1. 创建文件,例如 cassandra-scc.yaml,如下所示:

    apiVersion: security.openshift.io/v1
    kind: SecurityContextConstraints
    metadata:
      name: cassandra-scc
    runAsUser:
      type: MustRunAs
      uid: 999
    seLinuxContext:
      type: RunAsAny
    fsGroup:
      type: RunAsAny
    allowHostDirVolumePlugin: false
    allowHostNetwork: true
    allowHostPorts: true
    allowPrivilegedContainer: false
    allowHostIPC: true
    allowHostPID: true
    readOnlyRootFilesystem: false
    users:
      - system:serviceaccount:instana-cassandra:cass-operator
      - system:serviceaccount:instana-cassandra:cassandra
     
  2. 通过运行以下命令来应用该文件:

    kubectl apply -f cassandra-scc.yaml
     

在线安装 Cassandra

要在在线环境中安装Cassandra数据存储,请完成以下步骤:

  1. 创建 instana-cassandra 名称空间:

    kubectl create namespace instana-cassandra
     
  2. 创建服务 cassandra 账户。

    kubectl create serviceaccount cassandra -n instana-cassandra
     
  3. 创建图像拉动秘密。 使用自己的下载密钥更新 <download_key> 值。

    kubectl create secret docker-registry instana-registry --namespace instana-cassandra \
    --docker-username=_ \
    --docker-password=<download_key> \
    --docker-server=artifact-public.instana.io
     
  4. 安装 Cassandra 操作程序。

    helm install cass-operator instana/cass-operator -n instana-cassandra --version=0.63.1 --set securityContext.runAsGroup=999 --set securityContext.runAsUser=999 --set image.registry=artifact-public.instana.io --set image.repository=self-hosted-images/3rd-party/operator/cass-operator --set image.tag=1.29.0_v0.39.0 --set "imagePullSecrets[0].name=instana-registry" --set global.imageConfig.images.system-logger.repository=self-hosted-images/3rd-party/datastore --set global.imageConfig.images.system-logger.name=system-logger --set global.imageConfig.images.system-logger.tag=1.29.0_v0.39.0 --set global.imageConfig.images.k8ssandra-client.repository=self-hosted-images/3rd-party/datastore --set global.imageConfig.images.k8ssandra-client.name=k8ssandra-client --set global.imageConfig.images.k8ssandra-client.tag=0.8.12_v0.33.0 --set global.imageConfig.defaults.registry=artifact-public.instana.io --set global.imageConfig.defaults.pullSecrets[0]=instana-registry
  5. 创建一个名为 YAML 的文件,例如 cassandra.yaml,其中包含 Cassandra 配置。

    apiVersion: cassandra.datastax.com/v1beta1
    kind: CassandraDatacenter
    metadata:
      name: cassandra
    spec:
      clusterName: instana
      serverType: cassandra
      serverImage: artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cassandra:4.1.10_v0.41.0
      systemLoggerImage: artifact-public.instana.io/self-hosted-images/3rd-party/datastore/system-logger:1.26.0_v0.18.0
      serverVersion: "4.1.10"
      imagePullPolicy: IfNotPresent
      podTemplateSpec:
        spec:
          serviceAccountName: cassandra
          imagePullSecrets:
          - name: instana-registry
          containers:
            - name: cassandra
              image: 'artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cassandra:4.1.10_v0.41.0'
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  memory: "8Gi"  # Adjust based on your available resources
                  cpu: "2"       # Adjust as needed
                limits:
                  memory: "16Gi"  # Adjust to your available resources
                  cpu: "4"        # Adjust as needed
              readinessProbe:
                httpGet:
                  path: /api/v0/probes/readiness
                  port: 8080
                  scheme: HTTP
                initialDelaySeconds: 60  
                timeoutSeconds: 15       
                periodSeconds: 20        
                successThreshold: 1
                failureThreshold: 3
              livenessProbe:
                httpGet:
                  path: /api/v0/probes/liveness
                  port: 8080
                  scheme: HTTP
                initialDelaySeconds: 30  
                timeoutSeconds: 15       
                periodSeconds: 20        
                successThreshold: 1
                failureThreshold: 3
              terminationMessagePath: /dev/termination-log
              lifecycle:
                preStop:
                  exec:
                    command:
                      - curl
                      - '-X'
                      - POST
                      - '-s'
                      - '-m'
                      - '30'  
                      - '-o'
                      - /dev/null
                      - '--show-error'
                      - '--fail'
                      - 'http://localhost:8080/api/v0/ops/node/drain'
              env:
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
                - name: NODE_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: spec.nodeName
                - name: DS_LICENSE
                  value: accept
                - name: USE_MGMT_API
                  value: 'true'
                - name: MGMT_API_NO_KEEP_ALIVE
                  value: 'true'
                - name: MGMT_API_EXPLICIT_START
                  value: 'true'
              ports:
                - name: native
                  containerPort: 9042
                  protocol: TCP
                - name: tls-native
                  containerPort: 9142
                  protocol: TCP
                - name: internode
                  containerPort: 7000
                  protocol: TCP
                - name: tls-internode
                  containerPort: 7001
                  protocol: TCP
                - name: jmx
                  containerPort: 7199
                  protocol: TCP
                - name: mgmt-api-http
                  containerPort: 8080
                  protocol: TCP
                - name: prometheus
                  containerPort: 9103
                  protocol: TCP
                - name: metrics
                  containerPort: 9000
                  protocol: TCP
              volumeMounts:
                - name: server-logs
                  mountPath: /var/log/cassandra
                - name: server-data
                  mountPath: /var/lib/cassandra
                - name: server-config
                  mountPath: /config
              terminationMessagePolicy: File
            - name: server-system-logger
              image: 'artifact-public.instana.io/self-hosted-images/3rd-party/datastore/system-logger:1.26.0_v0.18.0'
              env:
                - name: POD_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
                - name: NODE_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: spec.nodeName
                - name: CLUSTER_NAME
                  value: instana
                - name: DATACENTER_NAME
                  value: cassandra
                - name: RACK_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: 'metadata.labels[''cassandra.datastax.com/rack'']'
                - name: NAMESPACE
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.namespace
              resources:
                limits:
                  memory: 256Mi  
                requests:
                  cpu: 100m
                  memory: 128Mi
      managementApiAuth:
        insecure: {}  
      size: 3
      allowMultipleNodesPerWorker: false
      storageConfig:
        cassandraDataVolumeClaimSpec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 200Gi  # Adjust the storage size if necessary
      config:
      jvm-server-options:
        initial_heap_size: "12G"
        max_heap_size: "12G"
        additional-jvm-opts:
          - -Dcassandra.allow_unsafe_aggressive_sstable_expiration=true
      cassandra-yaml:
        authenticator: org.apache.cassandra.auth.PasswordAuthenticator
        authorizer: org.apache.cassandra.auth.CassandraAuthorizer
        role_manager: org.apache.cassandra.auth.CassandraRoleManager
        memtable_flush_writers: 8
        auto_snapshot: false
        gc_warn_threshold_in_ms: 10000
        otc_coalescing_strategy: DISABLED
        memtable_allocation_type: offheap_objects
        num_tokens: 256
        drop_compact_storage_enabled: true
     
  6. 完成 部署和验证 Cassandra (联机和脱机)中的步骤。

离线安装 Cassandra

如果在 准备安装时尚未从外部注册表中拉取 Cassandra 映像,那么可以立即拉取这些映像。 在防御主机上运行以下命令。 然后,将这些图像复制到位于物理隔离环境中的 Instana 主机上。

docker pull artifact-public.instana.io/self-hosted-images/3rd-party/operator/cass-operator:1.29.0_v0.39.0
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/datastore/k8ssandra-client:0.8.12_v0.33.0
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cassandra:4.1.10_v0.41.0
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/datastore/system-logger:1.26.0_v0.18.0
         

请在您的 Instana 主机上完成以下步骤。

  1. 将映像重新标记到内部映像注册表。

    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/operator/cass-operator:1.29.0_v0.39.0 <internal-image-registry>/ppc64le-oss/cass-operator-ppc64le:1.29.0_v0.39.0
    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/k8ssandra-client:0.8.12_v0.33.0 <internal-image-registry>/ppc64le-oss/k8ssandra-client-ppc64le:0.8.12_v0.33.0
    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cassandra:4.1.10_v0.41.0 <internal-image-registry>/ppc64le-oss/cass-management-api-ppc64le:4.1.10_v0.41.0
    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/system-logger:1.26.0_v0.18.0<internal-image-registry>/ppc64le-oss/system-logger-ppc64le:1.26.0_v0.18.0
                   
  2. 将映像推送到防御主机上的内部映像注册表。

    docker push <internal-image-registry>/ppc64le-oss/cass-operator-ppc64le:1.29.0_v0.39.0
    docker push <internal-image-registry>/ppc64le-oss/k8ssandra-client-ppc64le:0.8.12_v0.33.0
    docker push <internal-image-registry>/ppc64le-oss/cass-management-api-ppc64le:4.1.10_v0.41.0
    docker push <internal-image-registry>/ppc64le-oss/system-logger-ppc64le:1.26.0_v0.18.0
                   
  3. 创建 instana-cassandra 名称空间:

    kubectl create namespace instana-cassandra
     
  4. 创建服务 cassandra 账户。

    kubectl create serviceaccount cassandra -n instana-cassandra
     
  5. 可选:如果内部图像注册表需要身份验证,请创建图像拉取密钥。

    kubectl create secret docker-registry <secret_name> --namespace instana-cassandra \
    --docker-username=<registry_username> \
    --docker-password=<registry_password> \
    --docker-server=<internal-image-registry>:<internal-image-registry-port> \
    --docker-email=<registry_email>
     
  6. 安装 Cassandra 操作程序。 如果您在上一步中创建了图像拉取秘密,请在以下命令中添加 --set imagePullSecrets[0].name="<internal-image-registry-pull-secret>"

    helm install cass-operator cass-operator-0.63.1.tgz -n instana-cassandra --create-namespace --version=0.63.1 --set securityContext.runAsGroup=999 --set securityContext.runAsUser=999 --set image.registry=<internal-image-registry> --set image.repository=self-hosted-images/3rd-party/operator/cass-operator --set image.tag=1.29.0_v0.39.0 --set "imagePullSecrets[0].name=<secret-name>" --set global.imageConfig.images.system-logger.repository=self-hosted-images/3rd-party/datastore --set global.imageConfig.images.system-logger.name=system-logger --set global.imageConfig.images.system-logger.tag=1.29.0_v0.39.0 --set global.imageConfig.images.k8ssandra-client.repository=self-hosted-images/3rd-party/datastore --set global.imageConfig.images.k8ssandra-client.name=k8ssandra-client --set global.imageConfig.images.k8ssandra-client.tag=0.8.12_v0.33.0 --set global.imageConfig.defaults.registry=<internal-image-registry> --set global.imageConfig.defaults.pullSecrets[0]=<secret-name>
                   
  7. 创建一个名为 YAML 的文件,例如 cassandra.yaml,其中包含 Cassandra 配置:

    apiVersion: cassandra.datastax.com/v1beta1
    kind: CassandraDatacenter
    metadata:
      name: cassandra
    spec:
      clusterName: instana
      serverType: cassandra
      serverImage: <internal-image-registry>/ppc64le-oss/cass-management-api-ppc64le:4.1.10_v0.41.0
      systemLoggerImage: <internal-image-registry>/ppc64le-oss/system-logger-ppc64le:1.26.0_v0.18.0
      serverVersion: 4.1.10
      imagePullPolicy: IfNotPresent
      podTemplateSpec:
        spec:
        # Optional: if you created an image pull secret for your internal registry, uncomment the following lines and update the image pull secret information.
        # imagePullSecrets:
        #   - name: <internal-image-registry-pull-secret>
          serviceAccountName: cassandra
          containers:
          - name: cassandra
      managementApiAuth:
        insecure: {}
      size: 3
      allowMultipleNodesPerWorker: false
      storageConfig:
        cassandraDataVolumeClaimSpec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 200Gi
      config:
        jvm-server-options:
          initial_heap_size: "12G"
          max_heap_size: "12G"
          additional-jvm-opts:
            - -Dcassandra.allow_unsafe_aggressive_sstable_expiration=true
        cassandra-yaml:
          authenticator: org.apache.cassandra.auth.PasswordAuthenticator
          authorizer: org.apache.cassandra.auth.CassandraAuthorizer
          role_manager: org.apache.cassandra.auth.CassandraRoleManager
          memtable_flush_writers: 8
          auto_snapshot: false
          gc_warn_threshold_in_ms: 10000
          otc_coalescing_strategy: DISABLED
          memtable_allocation_type: offheap_objects
          num_tokens: 256
          drop_compact_storage_enabled: true
     
  8. 完成 部署和验证 Cassandra (联机和脱机)中的步骤。

部署和验证 Cassandra (在线和离线)

注意: 部署 Cassandra 时, CassandraDatacenter 默认会创建一个超级用户,例如 <clustername>-superuser。 该值 <clustername> 是在 文件 cassandra.yaml 中 部分 .spec.clusterName 中指定的。 在下面的命令中,以 secret instana-superuser name 为例。

要部署 Cassandra 实例并创建数据存储器,请完成以下步骤:

  1. 通过运行以下命令来部署 Cassandra 。

    kubectl apply -f cassandra.yaml --namespace=instana-cassandra
     
  2. 检索 instana-superuser的密码。

    kubectl get secret instana-superuser -n instana-cassandra --template='{{index .data.password | base64decode}}' && echo
     
  3. 将密码存储在 config.yaml 文件中。 将 <RETRIEVED_FROM_SECRET> 替换为上一步中获取的密码。

    datastoreConfigs:
      ...
      cassandraConfigs:
        - user: instana-superuser
          password: <RETRIEVED_FROM_SECRET>
          adminUser: instana-superuser
          adminPassword: <RETRIEVED_FROM_SECRET>
      ...
     
  4. 验证 Cassandra 数据存储的部署。

    kubectl get all -n instana-cassandra
     
  5. 如果成功部署了 Cassandra 数据存储器,那么该命令的结果可能是以下输出:

    NAME                                  READY   STATUS    RESTARTS   AGE
    pod/cass-operator-57dcc8884f-92knc    1/1     Running   0          36m
    pod/instana-cassandra-default-sts-0   2/2     Running   0          26m
    pod/instana-cassandra-default-sts-1   2/2     Running   0          26m
    pod/instana-cassandra-default-sts-2   2/2     Running   0          26m
    
    NAME                                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                        AGE
    service/cass-operator-webhook-service               ClusterIP   192.168.1.55   <none>        443/TCP                                        36m
    service/instana-cassandra-additional-seed-service   ClusterIP   None           <none>        <none>                                         26m
    service/instana-cassandra-all-pods-service          ClusterIP   None           <none>        9042/TCP,8080/TCP,9103/TCP,9000/TCP            26m
    service/instana-cassandra-service                   ClusterIP   None           <none>        9042/TCP,9142/TCP,8080/TCP,9103/TCP,9000/TCP   26m
    service/instana-seed-service                        ClusterIP   None           <none>        <none>                                         26m
    
    NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/cass-operator   1/1     1            1           36m
    
    NAME                                       DESIRED   CURRENT   READY   AGE
    replicaset.apps/cass-operator-57dcc8884f   1         1         1       36m
    
    NAME                                             READY   AGE
    statefulset.apps/instana-cassandra-default-sts   3/3     26m