IBM Cloud Docs
对 IBM Cloud Pak for Data 的已知问题进行故障诊断

对 IBM Cloud Pak for Data 的已知问题进行故障诊断

IBM Cloud Pak for Data

获取有关解决您在 IBM Cloud Pak for Data上使用 Watson Assistant 时可能迂到的问题的帮助。

4.5.x

即使几个助手 pod 正在重新启动,在 4.5.x 升级后,pod RESTARTS 计数仍停留在 0

  • 问题: 升级 Watson Assistant后,即使某些助手 pod 正在重新启动,pod RESTARTS 计数仍停留在 0。

  • 原因: 在升级期间,将使用在后台运行的脚本来删除 certificates.certmanager.k8s.io CRD 的 Watson Assistant 所拥有的定制资源。 有时,在升级助手操作程序之前,CR 删除脚本会完成。 在这种情况下,旧的助手操作程序可能会为 certificates.certmanager.k8s.io CRD 重新创建定制资源。 剩余的 CR 可能会导致证书管理器持续重新生成一些证书私钥,从而导致某些助手 pod 以递归方式重新启动。

  • Solution: Run the following script to delete leftover custom resources for the certificates.certmanager.k8s.io CRD after you set INSTANCE (normally wa) and PROJECT_CPD_INSTANCE variables:

    for i in `oc get certificates.certmanager.k8s.io -l icpdsupport/addOnId=assistant --namespace ${PROJECT_CPD_INSTANCE} | grep "${INSTANCE}-"| awk '{print $1}'`; do oc delete certificates.certmanager.k8s.io $i --namespace ${PROJECT_CPD_INSTANCE}; done
    

4.5.0

安装后 Data Governor 运行状况不佳

安装 Watson Assistant 后,名为 wa-data-governor-ibm-data-governor-data-exhaust-internaldataexhausttenant 定制资源将停留在 Topics 阶段。 发生这种情况时,Data Governor pod 中的错误报告该服务不存在。

  1. 获取 wa-data-governor 定制资源的状态:

    oc get DataExhaust
    
  2. 等待 wa-data-governor 定制资源处于 Completed 阶段:

    NAME               STATUS      VERSION   COMPLETED
    wa-data-governor   Completed   master    1s
    
  3. 暂停 wa-data-governor 定制资源的协调:

    oc patch dataexhaust wa-data-governor -p '{"metadata":{"annotations":{"pause-reconciliation":"true"}}}' --type merge
    
  4. 将修订应用于 dataexhausttenant 定制资源:

    oc patch dataexhausttenant wa-data-governor-ibm-data-governor-data-exhaust-internal  -p '{"spec":{"topics":{"data":{"replicas": 1}}}}' --type merge
    
  5. 等待 Data Governor pod 停止失败。 您可以重新启动管理 pod 以加快此过程。

  6. 继续协调 wa-data-governor 定制资源:

    oc patch dataexhaust wa-data-governor --type=json -p='[{"op": "remove", "path": "/metadata/annotations/pause-reconciliation"}]'
    

RabbitMQ 在多次安装尝试后陷入循环

在初始安装或升级失败并重复尝试重试之后,公共服务 RabbitMQ 操作程序 pod 可以进入 CrashLoopBackOff 状态。 例如,日志可能包含以下类型的消息:

"error":"failed to upgrade release: post-upgrade hooks failed: warning:
Hook post-upgrade ibm-rabbitmq/templates/rabbitmq-backup-labeling-job.yaml
failed: jobs.batch "{%name}-ibm-rabbitmq-backup-label" already exists"

必须先除去 ibm-rabbitmq-operator.v1.0.11 组件的资源,然后才能启动新安装或升级。 如果连续进行过多尝试,那么剩余资源可能会导致新安装失败。

  1. 从先前的安装或升级尝试中删除 RabbitMQ 备份标签作业。 在日志中查找作业的名称。 名称以 -ibm-rabbitmq-backup-label 结尾:

    oc delete job {%name}-ibm-rabbitmq-backup-label -n ${PROJECT_CPD_INSTANCE}
    
  2. 检查 pod 是否返回 Ready 状态:

    oc get pods -n ibm-common-services | grep ibm-rabbitmq
    

准备安装大型部署

如果在安装 Watson Assistant时为 watson_assistant_size 选项指定 large,那么安装无法成功完成。

在安装 Watson Assistant的大型部署之前,请应用以下修订。 以下修订使用 wa 作为 Watson Assistant 实例的名称,并使用 cpd 作为安装 Watson Assistant 的名称空间。 这些值在环境变量中设置。 在运行该命令之前,请使用实例的名称更新 INSTANCE 变量,并使用安装了实例的名称空间更新 NAMESPACE 变量:

INSTANCE=wa ; \
NAMESPACE=cpd ; \
#DRY_RUN="--dry-run=client --output=yaml"     # To apply the changes, change to an empty string
DRY_RUN=""
cat <<EOF | tee wa-network-policy-base.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  annotations:
    oppy.ibm.com/internal-name: infra.networkpolicy
  labels:
    app: ${INSTANCE}-network-policy
    app.kubernetes.io/instance: ${INSTANCE}
    app.kubernetes.io/managed-by: Ansible
    app.kubernetes.io/name: watson-assistant
    component: network-policy
    icpdsupport/addOnId: assistant
    icpdsupport/app: ${INSTANCE}-network-policy
    icpdsupport/ignore-on-nd-backup: "true"
    icpdsupport/serviceInstanceId: inst-1
    service: conversation
    slot: ${INSTANCE}
    tenant: PRIVATE
    velero.io/exclude-from-backup: "true"
  name: ${INSTANCE}-network-policy
  namespace: ${NAMESPACE}
spec:
  ingress:
  - from:
    - podSelector:
        matchLabels:
          service: conversation
          slot: ${INSTANCE}
    - podSelector:
        matchLabels:
          slot: global
    - podSelector:
        matchLabels:
          component: watson-gateway
    - podSelector:
        matchLabels:
          component: dvt
    - podSelector:
        matchLabels:
          dwf_service: ${INSTANCE}-clu
          network-policy: allow-egress
    - podSelector:
        matchLabels:
          app: 0020-zen-base
    - namespaceSelector:
        matchLabels:
          ns: ${NAMESPACE}
      podSelector:
        matchLabels:
          app: 0020-zen-base
    - podSelector:
        matchLabels:
          component: ibm-nginx
    - namespaceSelector:
        matchLabels:
          ns: ${NAMESPACE}
      podSelector:
        matchLabels:
          component: ibm-nginx
    - namespaceSelector:
        matchLabels:
          assistant.watson.ibm.com/role: operator
      podSelector:
        matchLabels:
          release: assistant-operator
    - namespaceSelector:
        matchLabels:
          assistant.watson.ibm.com/role: operator
      podSelector:
        matchLabels:
          app: watson-assistant-operator
    - namespaceSelector:
        matchLabels:
          assistant.watson.ibm.com/role: operator
      podSelector:
        matchLabels:
          app.kubernetes.io/instance: watson-assistant-operator
    - namespaceSelector:
        matchLabels:
          assistant.watson.ibm.com/role: operator
      podSelector:
        matchLabels:
          app.kubernetes.io/instance: ibm-etcd-operator-release
    - namespaceSelector:
        matchLabels:
          assistant.watson.ibm.com/role: operator
      podSelector:
        matchLabels:
          app.kubernetes.io/instance: ibm-etcd-operator
  podSelector:
    matchLabels:
      service: conversation
      slot: ${INSTANCE}
  policyTypes:
  - Ingress
EOF
for MICROSERVICE in analytics clu-embedding clu-serving clu-training create-slot-job data-governor dialog dragonfly-clu-mm ed es-store etcd integrations master nlu recommends sireg-ubi-ja-tok-20160902 sireg-ubi-ko-tok-20181109 spellchecker-mm store store-admin store-cronjob store-sync store_db_creator store_db_schema_updater system-entities tfmm ui ${INSTANCE}-redis webhooks-connector
do
  # Change name and add component to selector
  # Apply to the cluster
  cat wa-network-policy-base.yaml | \
    oc patch --dry-run=client --output=yaml -f - --type=merge --patch "{
        \"metadata\": {\"name\": \"${INSTANCE}-network-policy-$( echo $MICROSERVICE | tr _ -)\"},
        \"spec\": {\"podSelector\":{\"matchLabels\":{\"component\": \"${MICROSERVICE}\"}}}
      }" |
    oc apply -f - ${DRY_RUN}
done

修复大型安装

如果安装了大小为 large 的部署,并且安装未能成功完成,请应用此修订。 在某些情况下,pod 无法与其他 pod 通信,并且无法建立传输控制协议 (TCP) 连接。

要确认您是否受此问题影响,请运行以下命令:

oc logs --selector app=sdn --namespace openshift-sdn --container sdn | grep "Ignoring NetworkPolicy"

如果受影响,您将看到类似于以下示例的输出:

W0624 12:58:21.407901    2480 networkpolicy.go:484] Ignoring NetworkPolicy cpd/wa-network-policy because it generates

如果迂到此错误,请应用以下修订以解决问题。 以下修订使用 wa 作为 Watson Assistant 实例的名称。 此值在环境变量中设置。 在运行该命令之前,请使用实例的名称更新 INSTANCE 变量:

INSTANCE=wa ; \
#DRY_RUN="--dry-run=client --output=yaml"     # To apply the changes, change to an empty string
DRY_RUN=""
for MICROSERVICE in analytics clu-embedding clu-serving clu-training create-slot-job data-governor dialog dragonfly-clu-mm ed es-store etcd integrations master nlu recommends sireg-ubi-ja-tok-20160902 sireg-ubi-ko-tok-20181109 spellchecker-mm store store-admin store-cronjob store-sync store_db_creator store_db_schema_updater system-entities tfmm ui ${INSTANCE}-redis webhooks-connector
do
  # Get original networking policy
  # Clean up metadata fields to get the resource applied by Watson Assistant
  # Change name and add component to selector
  # Apply to the cluster
  oc get networkpolicy $INSTANCE-network-policy --output yaml | \
  oc patch --dry-run=client --output=yaml -f - --type=json --patch='[
      {"op":"remove", "path":"/metadata/creationTimestamp"},
      {"op":"remove", "path":"/metadata/generation"},
      {"op":"remove", "path":"/metadata/resourceVersion"},
      {"op":"remove", "path":"/metadata/uid"},
      {"op":"remove", "path":"/metadata/annotations/kubectl.kubernetes.io~1last-applied-configuration"},
      {"op":"remove", "path":"/metadata/ownerReferences"}
    ]' | \
    oc patch --dry-run=client --output=yaml -f - --type=merge --patch "{
        \"metadata\": {\"name\": \"${INSTANCE}-network-policy-$( echo $MICROSERVICE | tr _ -)\"},
        \"spec\": {\"podSelector\":{\"matchLabels\":{\"component\": \"${MICROSERVICE}\"}}}
      }" |
    oc apply -f - ${DRY_RUN}
done

无法缩放 Redis pod 的大小

当您缩放 Watson Assistant的部署大小时,Redis pod 无法正确缩放,并且与部署的新大小 (smallmediumlarge) 不匹配。 此问题是 Redis 操作程序 v1.5.1中的已知问题。

缩放部署大小时,必须删除 Redis 定制资源。 Redis 会自动重新创建具有正确大小和 pod 的定制资源。

要删除并重新创建 Redis 定制资源:

  1. 从脚本中获取环境变量:

    source ./cpd_vars.sh
    

    如果没有用于定义环境变量的脚本,请参阅 设置安装环境变量

  2. 将 Redis 定制资源的名称导出到环境变量:

    export REDIS_CR_NAME=`oc get redissentinels.redis.databases.cloud.ibm.com -l icpdsupport/addOnId=assistant -n ${PROJECT_CPD_INSTANCE} | grep -v NAME| awk '{print $1}'`
    
  3. 删除 Redis 自定义资源:

    oc delete redissentinels.redis.databases.cloud.ibm.com ${REDIS_CR_NAME} -n ${PROJECT_CPD_INSTANCE}
    

    可能需要大约 5 分钟才能重新创建定制资源。

  4. 验证 Redis 是否正在运行:

    oc get redissentinels.redis.databases.cloud.ibm.com -n ${PROJECT_CPD_INSTANCE}
    
  5. 将实例的名称导出为环境变量:

    export INSTANCE=`oc get wa -n ${PROJECT_CPD_INSTANCE} |grep -v NAME| awk '{print $1}'`
    
  6. 删除 Redis 分析私钥:

    oc delete secrets ${INSTANCE}-analytics-redis
    
  7. 删除 ${INSTANCE}-analytics 部署 pod。

4.0.x

Data Governor 错误导致部署失败

以下修订适用于 4.0.0 到 4.0.8。 在某些情况下,由于“事件”操作程序与 Data Governor 定制资源 (CR) 之间的交互存在问题,因此部署卡住并且 pod 未出现。

完成以下步骤以确定您是否受此问题影响,并在必要时应用补丁来解决此问题:

  1. 要确定您是否受影响,请运行以下命令以查看是否成功应用了 CR:

    oc get dataexhaust wa-data-governor -n $OPERAND_NS -o yaml
    

    如果未收到任何错误,那么无需应用补丁。 如果收到类似于以下示例的错误,请完成下一步以应用补丁:

    message: 'Failed to create object: b''{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Internal
          error occurred: replace operation does not apply: doc is missing path: /metadata/labels/icpdsupport/serviceInstanceId:
          missing value","reason":"InternalError","details":{"causes":[{"message":"replace
          operation does not apply: doc is missing path: /metadata/labels/icpdsupport/serviceInstanceId:
          missing value"}]},"code":500}\n'''
        reason: Failed
        status: "True"
        type: Failure
      ibmDataGovernorService: InProgress
    
  2. 从操作数命名空间中运行以下命令来应用补丁。 在该命令中,wa 用作实例的名称。 将此值替换为实例的名称:

    cat <<EOF | oc apply -f -
    apiVersion: assistant.watson.ibm.com/v1
    kind: TemporaryPatch
    metadata:
      name: wa-data-governor
    spec:
        apiVersion: assistant.watson.ibm.com/v1
        kind: WatsonAssistant
        name: wa     # Replace wa with the name of your Watson Assistant instance
        patch:
          data-governor:
            dataexhaust:
              spec:
                additionalLabels:
                  icpdsupport/serviceInstanceId: inst-1
          kafkauser:
            metadata:
              labels:
                icpdsupport/serviceInstanceId: inst-1
    patchType: patchStrategicMerge
    EOF
    

    等待大约 15 分钟以使更改生效。

  3. 验证是否已成功应用补丁:

    oc get dataexhaust wa-data-governor -n $OPERAND_NS -o yaml
    

    serviceInstanceId 的值为 inst-1 时,已成功应用补丁:

    spec:
      additionalLabels:
        icpdsupport/serviceInstanceId: inst-1
    

安全上下文约束许可权错误

以下修订适用于 4.0.0 到 4.0.5。 如果集群具有优先于 restricted SCC 的安全上下文约束 (SCC),并且具有与 restricted SCC 不同的许可权,那么 4.0.0 到 4.0.5 安装可能会失败,并产生许可权错误。 例如,update-schema-store-db-job 作业报告类似于以下示例的错误:

oc logs wa-4.0.2-update-schema-store-db-job-bpsdr postgres-is-prepared
Waiting until postgres is running and responding
psql: error: could not read root certificate file "/tls/ca.crt": Permission denied
    - The basic command to postgres failed (retry in 5 sec)
psql: error: could not read root certificate file "/tls/ca.crt": Permission denied
    - The basic command to postgres failed (retry in 5 sec)
psql: error: could not read root certificate file "/tls/ca.crt": Permission denied
    - The basic command to postgres failed (retry in 5 sec)
..
..

其他 pod 可能有类似的许可权错误。 如果您查看 pod 的 SCC,可以看到它们不受限制。 例如,如果运行 oc describe pod wa-etcd-0 |grep scc 命令,那么将获得类似于以下示例的输出:

openshift.io/scc: fsgroup-scc

要解决此问题,请提高 restricted SCC 的优先级,以使其优先:

  1. 运行以下命令:

    oc edit scc restricted
    
  2. prioritynull 更改为 1

现在,新 pod 缺省返回到期望的 restricted SCC。 运行 oc describe pod wa-etcd-0 |grep scc 命令时,将获得类似于以下示例的输出:

openshift.io/scc: restricted

无法使用 Webhook 收集日志

以下修订适用于 Watson Assistant 4.0.x的所有版本。 如果无法使用 Webhook 收集日志,那么可能是因为您使用的是连接到使用自签名证书的服务器的 Webhook。 如果是这样,请完成以下步骤以将证书导入到密钥库中,以便您可以使用 Webhook 收集日志:

  1. 登录到集群和 oc project cpd-instance,这是实例所在的名称空间。

  2. 运行以下命令。 在以下命令中,将 INSTANCE_NAME 替换为实例的名称,并将 CUSTOM_CERTIFICATE 替换为 Base64 编码的定制证书密钥:

    INSTANCE="INSTANCE_NAME"     # Replace INSTANCE_NAME with the name of the Watson Assistant instance
    CERT="CUSTOM_CERTIFICATE"     # Replace CUSTOM_CERTIFICATE with the custom certificate key
    
    cat <<EOF | oc apply -f -
    apiVersion: v1
    data:
      ca_cert: ${CERT}
    kind: Secret
    metadata:
      name: ${INSTANCE}-custom-webhooks-cert
    type: Opaque
    ---
    apiVersion: assistant.watson.ibm.com/v1
    kind: TemporaryPatch
    metadata:
      name: ${INSTANCE}-add-custom-webhooks-cert
    spec:
      apiVersion: assistant.watson.ibm.com/v1
      kind: WatsonAssistantStore
      name: ${INSTANCE}
      patchType: patchStrategicMerge
      patch:
        webhooks-connector:
          deployment:
            spec:
              template:
                spec:
                  containers:
                  - name: webhooks-connector
                    env:
                    - name: CERTIFICATES_IMPORT_LIST
                      value: /etc/secrets/kafka/ca.pem:kafka_ca,/etc/secrets/custom/ca.pem:custom_ca
                    volumeMounts:
                    - mountPath: /etc/secrets/custom
                      name: custom-cert
                      readOnly: true
                  volumes:
                  - name: custom-cert
                    secret:
                      defaultMode: 420
                      items:
                      - key: ca_cert
                        path: ca.pem
                      secretName: ${INSTANCE}-custom-webhooks-cert
    EOF
    
  3. 等待大约 10 分钟,以便 wa-webhooks-connector pod 重新启动。 此 pod 会自动重新启动。

  4. 在 pod 重新启动后,通过运行以下命令来检查日志。 在该命令中,将 XXXX 替换为 wa-webhooks-connector pod 的后缀:

    oc logs wa-webhooks-connector-XXXX     // Replace XXXX with the suffix of the wa-webhooks-connector pod
    

    运行此命令后,应该会在日志开头看到两行类似于以下示例:

    Certificate was added to keystore
    Certificate was added to keystore
    

    当您看到这两行时,那么定制证书已正确导入到密钥库中。

4.0.5

如果基础服务版本高于 3.14.1,请安装 Redis

如果您安装的 Redis 操作员 IBM Cloud Pak 基础服务版本高于 3.14.1,则 Redis 操作员可能会停留在 Pending 状态。 如果您具有气郄集群,请完成 气郄集群 部分中的步骤以解决此问题。 如果要使用 IBM Entitled Registry,请完成 IBM Entitled Registry 部分中的步骤来解决此问题。

气隙式集群

  1. 查看 Redis 运营商的状态:

    oc get opreq common-service-redis -n ibm-common-services -o jsonpath='{.status.phase}  {"\n"}'
    
  2. 如果 Redis 操作数请求处于 Pending 状态,请删除操作数请求:

    oc delete opreq watson-assistant-redis -n ibm-common-services
    
  3. 设置环境以下载 CASE 软件包。

    1. 创建要用于存储 CASE 软件包的目录:

      mkdir -p $HOME/offline/cpd  
      mkdir -p $HOME/offline/cpfs  
      
    2. 设置以下环境变量:

      export CASE_REPO_PATH=https://github.com/IBM/cloud-pak/raw/master/repo/case  
      export OFFLINEDIR=$HOME/offline/cpd  
      export OFFLINEDIR_CPFS=$HOME/offline/cpfs  
      
  4. 下载 Redis 操作程序和 IBM Cloud Pak® for Data 平台操作程序 CASE 软件包:

    cloudctl case save \
    --repo ${CASE_REPO_PATH} \
    --case ibm-cloud-databases-redis \
    --version  1.4.5  \
    --outputdir $OFFLINEDIR
    
    cloudctl case save \
    --repo ${CASE_REPO_PATH} \
    --case ibm-cp-datacore \
    --version 2.0.10 \
    --outputdir ${OFFLINEDIR} \
    --no-dependency
    
  5. 创建 Redis 目录来源:

    cloudctl case launch \
    --case ${OFFLINEDIR}/ibm-cloud-databases-redis-1.4.5.tgz \
    --inventory redisOperator \
    --action install-catalog \
    --namespace openshift-marketplace \
    --args "--registry icr.io --inputDir ${OFFLINEDIR} --recursive"
    
  6. 设置注册表凭证的环境变量:

    export PRIVATE_REGISTRY_USER=username  
    export PRIVATE_REGISTRY_PASSWORD=password  
    export PRIVATE_REGISTRY={registry-info}  
    
  7. 运行以下命令以保存凭据:

    cloudctl case launch \
    --case ${OFFLINEDIR}/ibm-cp-datacore-2.0.10.tgz \
    --inventory cpdPlatformOperator \
    --action configure-creds-airgap \
    --args "--registry ${PRIVATE_REGISTRY} --user ${PRIVATE_REGISTRY_USER} --pass ${PRIVATE_REGISTRY_PASSWORD}"
    
  8. 镜像映像:

    export USE_SKOPEO=true  
    cloudctl case launch \
    --case ${OFFLINEDIR}/ibm-cp-datacore-2.0.10.tgz \
    --inventory cpdPlatformOperator \
    --action mirror-images \
    --args "--registry ${PRIVATE_REGISTRY} --user ${PRIVATE_REGISTRY_USER} --pass ${PRIVATE_REGISTRY_PASSWORD} --inputDir ${OFFLINEDIR}"
    
  9. 创建 Redis 订阅。

    1. 导出包含 IBM Cloud Pak® for Data 操作程序的项目:

      export OPERATOR_NS=ibm-common-services|cpd-operators     # Select the project that contains the Cloud Pak for Data operator
      
    2. 创建预订:

      cat <<EOF | oc apply --namespace $OPERATOR_NS -f -
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: ibm-cloud-databases-redis-operator
      spec:
        name: ibm-cloud-databases-redis-operator
        source: ibm-cloud-databases-redis-operator-catalog
        sourceNamespace: openshift-marketplace
      EOF
      

IBM 授权注册

  1. 查看 Redis 运营商的状态:

    oc get opreq common-service-redis -n ibm-common-services -o jsonpath='{.status.phase}  {"\n"}'
    
    
  2. 如果 Redis 操作数请求处于 Pending 状态,请删除操作数请求:

    oc delete opreq watson-assistant-redis -n ibm-common-services
    
  3. 创建 Redis 订阅。 根据您是否正在使用,创建以下两个预订之一。

    1. 导出包含 IBM Cloud Pak® for Data 操作程序的项目:

      export OPERATOR_NS=ibm-common-services|cpd-operators     # Select the project that contains the Cloud Pak for Data operator
      
    2. 创建预订。 根据您使用 IBM Entitled Registry 的方式,选择以下两个预订之一:

      • 来自 ibm-operator-catalog 的 IBM 授权注册表:

        cat <<EOF | oc apply --namespace  $OPERATOR_NS -f -
        apiVersion: operators.coreos.com/v1alpha1
        kind: Subscription
        metadata:
           name: ibm-cloud-databases-redis-operator
        spec:
           name: ibm-cloud-databases-redis-operator
           source: ibm-operator-catalog
           sourceNamespace: openshift-marketplace
        EOF
        
      • IBM Entitled Registry,其中包含用于提取特定版本映像的目录源:

        cat <<EOF | oc apply --namespace $OPERATOR_NS -f -
        apiVersion: operators.coreos.com/v1alpha1
        kind: Subscription
        metadata:
           name: ibm-cloud-databases-redis-operator
        spec:
           name: ibm-cloud-databases-redis-operator
           source: ibm-cloud-databases-redis-operator-catalog
           sourceNamespace: openshift-marketplace
        EOF
        
  4. 验证是否已成功创建操作程序。

    1. 运行以下命令以确认已应用预订:

      oc get sub -n $OPERATOR_NS  ibm-cloud-databases-redis-operator -o jsonpath='{.status.installedCSV} {"\n"}'
      
    2. 运行以下命令确认是否已安装操作员:

      oc get pod -n $OPERATOR_NS -l app.kubernetes.io/name=ibm-cloud-databases-redis-operator \
      -o jsonpath='{.items[0].status.phase} {"\n"}'
      

4.0.4

气郄式安装上的集成映像问题

如果安装为气郄式,那么集成映像无法正确启动。

如果安装使用 IBM Entitled Registry 来拉取映像,请完成 IBM Entitled Registry 部分中的步骤。 如果安装使用专用 Docker 注册表来拉取映像,请完成 专用 Docker 注册表 部分中的步骤。

IBM 授权注册

如果您的安装使用 IBM 授权注册表来拉取映像,请完成以下步骤以向 CR 添加覆盖条目:

  1. 运行以下命令获取实例名称:

    oc get wa
    
  2. 编辑并保存CR。

    1. 运行以下命令编辑CR。 在该命令中,将 INSTANCE_NAME 替换为实例的名称:

      oc edit wa INSTANCE_NAME
      
    2. 通过添加以下行来编辑 CR:

      appConfigOverrides:
         container_images:
         integrations:
            image: cp.icr.io/cp/watson-assistant/servicedesk-integration
            tag: 20220106-143142-0ea3fbf7-wa_icp_4.0.5-signed@sha256:7078fdba4ab0b69dbb93f47836fd9fcb7cfb12f103662fef0d9d1058d2553910
      
  3. 等待操作程序获取更改并启动新的集成 pod。 这可能需要10分钟。

  4. 新集成 pod 启动后,旧 pod 将终止。 当新 pod 启动时,服务器将在本地启动,日志类似于以下示例:

    oc logs -f ${INTEGRATIONS_POD}
    [2022-01-07T01:33:13.609] [OPTIMIZED] db.redis.RedisManager - Redis trying to connect. counter# 1
    [2022-01-07T01:33:13.628] [OPTIMIZED] db.redis.RedisManager - Redis connected
    [2022-01-07T01:33:13.629] [OPTIMIZED] db.redis.RedisManager - Redis is ready to serve!
    [2022-01-07T01:33:14.614] [OPTIMIZED] Server - Server started at: https://localhost:9449
    

专用 Docker 注册表

如果您的安装使用专用 Docker 注册表来拉取映像,请完成以下步骤以下载新集成映像并将其推送到专用 Docker 注册表,然后向 CR 添加覆盖条目:

  1. 编辑 CSV 文件以添加新的集成图像。

    1. 运行以下命令打开CSV文件:

      vi $OFFLINEDIR/ibm-watson-assistant-4.0.4-images.csv
      
    2. 将以下行立即添加到 CSV 文件中的现有集成映像之后:

      cp.icr.io,cp/watson-assistant/servicedesk-integration,20220106-143142-0ea3fbf7-wa_icp_4.0.5-signed,sha256:7078fdba4ab0b69dbb93f47836fd9fcb7cfb12f103662fef0d9d1058d2553910,IMAGE,linux,x86_64,"",0,CASE,"",ibm_wa_4_0_0;ibm_wa_4_0_2;ibm_wa_4_0_4;vLatest
      
  2. 使用用于下载和推送所有映像的命令再次镜像该映像,例如:

    cloudctl case launch \
      --case ${OFFLINEDIR}/ibm-cp-datacore-2.0.9.tgz \
      --inventory cpdPlatformOperator \
      --action configure-creds-airgap \
      --args "--registry cp.icr.io --user cp --pass $PRD_ENTITLED_REGISTRY_APIKEY --inputDir ${OFFLINEDIR}"
    
  3. 运行以下命令获取实例名称:

    oc get wa
    
  4. 编辑并保存CR。

    1. 运行以下命令编辑CR。 在该命令中,将 INSTANCE_NAME 替换为实例的名称:

      oc edit wa INSTANCE_NAME
      
    2. 通过添加以下行来编辑 CR:

      appConfigOverrides:
         container_images:
         integrations:
            image: cp.icr.io/cp/watson-assistant/servicedesk-integration
            tag: 20220106-143142-0ea3fbf7-wa_icp_4.0.5-signed@sha256:7078fdba4ab0b69dbb93f47836fd9fcb7cfb12f103662fef0d9d1058d2553910
      
  5. 等待操作程序获取更改并启动新的集成 pod。 这可能需要10分钟。

  6. 新集成 pod 启动后,旧 pod 将终止。 当新 pod 启动时,服务器将在本地启动,日志类似于以下示例:

    oc logs -f ${INTEGRATIONS_POD}
    [2022-01-07T01:33:13.609] [OPTIMIZED] db.redis.RedisManager - Redis trying to connect. counter# 1
    [2022-01-07T01:33:13.628] [OPTIMIZED] db.redis.RedisManager - Redis connected
    [2022-01-07T01:33:13.629] [OPTIMIZED] db.redis.RedisManager - Redis is ready to serve!
    [2022-01-07T01:33:14.614] [OPTIMIZED] Server - Server started at: https://localhost:9449
    

4.0.0

安装具有 EDB V 1.8 的 Watson Assistant 4.0.0

仅当需要全新安装 Watson Assistant 4.0.0时,才应完成此任务。 请勿在具有数据的现有集群上完成此任务。 在具有数据的现有集群上完成此任务会导致数据丢失。

如果您已升级到 EDB V 1.8,并且需要 Watson Assistant 4.0.0的新安装,请完成以下步骤。 在以下步骤中,wa 用作定制资源的名称。 将此值替换为定制资源的名称:

  1. 首先,应用以下补丁:

    cat <<EOF | oc apply -f -
    apiVersion: assistant.watson.ibm.com/v1
    kind: TemporaryPatch
    metadata:
      name: wa-postgres-180-hotfix
    spec:
      apiVersion: assistant.watson.ibm.com/v1
      kind: WatsonAssistantStore
      name: wa     # Specify the name of your custom resource
      patchType: patchStrategicMerge
      patch:
        postgres:
          postgres:
            spec:
              bootstrap:
                initdb:
                  options:
                   - "--encoding=UTF8"
                   - "--locale=en_US.UTF-8"
                   - "--auth-host=scram-sha-256"
    EOF
    
  2. 运行以下命令以检查是否已将临时补丁应用于 WatsonAssistantStore 定制资源。 在更新商店定制资源之后,可能最多需要 10 分钟时间:

    oc get WatsonAssistantStore wa -o jsonpath='{.metadata.annotations.oppy\.ibm\.com/temporary-patches}' ; echo
    

    如果应用了补丁,那么该命令将返回类似于以下示例的输出:

    {"wa-postgres-180-hotfix": {"timestamp": "2021-09-23T15:48:12.071497", "api_version": "assistant.watson.ibm.com/v1"}}`
    
  3. 运行以下命令删除 Postgres 实例:

    oc delete clusters.postgresql.k8s.enterprisedb.io wa-postgres
    
  4. 等 10 分钟 然后,运行以下命令以检查 Postgres 实例:

    oc get pods | grep wa-postgres
    

    当 Postgres 实例正常运行时,该命令将返回类似于以下示例的输出:

    wa-postgres-1                                                     1/1     Running     0          37m
    wa-postgres-2                                                     1/1     Running     0          36m
    wa-postgres-3                                                     1/1     Running     0          36m
    
  5. 运行以下命令以检查初始化 Postgres 数据库的作业是否成功完成:

    oc get jobs wa-create-slot-store-db-job wa-4.0.0-update-schema-store-db-job
    

    当作业成功完成时,该命令将返回类似于以下示例的输出:

    NAME                                  COMPLETIONS   DURATION   AGE
    wa-create-slot-store-db-job           1/1           3s         31m
    wa-4.0.0-update-schema-store-db-job   1/1           13s        31m
    

    如果作业未成功完成,那么它们将超时并需要重新创建。 通过运行 oc delete jobs wa-create-slot-store-db-job wa-4.0.0-update-schema-store-db-job 命令来删除作业。 操作员将在 10 分钟后重新创建这些作业。

有关从 Watson Assistant 4.0.0 升级到 Watson Assistant 4.0.2的信息,请参阅 将 Watson Assistant 升级到较新的 4.0 刷新

1.5.0

由于定制证书而导致搜索技能不工作

如果您在 IBM Cloud Pak® for Data中 配置了定制 TLS 证书,那么搜索技能 (即与 IBM Watson® Discovery 服务的集成) 可能不起作用。 如果定制证书未由知名认证中心 (CA) 签署,那么搜索技能无法按预期工作。 您还可能会在搜索技能的 试用 部分中看到错误。

验证问题

首先,检查搜索技能 pod 的日志以确认此问题是否适用于您。

  1. 运行以下命令以列出搜索技能 pod:

    oc get pods -l component=skill-search
    
  2. 运行以下命令以检查日志中是否存在以下异常:

    oc logs -l component=skill-search | grep "IBMCertPathBuilderException"
    

    错误看起来与以下示例类似:

    {"level":"ERROR","logger":"wa-skills","message":"Search skill exception","exception":[{"message":"com.ibm.jsse2.util.h: PKIX path building failed: com.ibm.security.cert.IBMCertPathBuilderException: unable to find valid certification path to requested target","name":"SSLHandshakeException"}]}
    

    如果看到此错误,请继续执行应用修订的步骤。

应用修订

要修订搜索技能,请将签署 TLS 证书的 CA 注入到搜索技能所使用的 Java 信任库中。 然后,搜索技能 pod 能够验证证书并与 IBM Watson® Discovery 服务进行通信。

  1. 首先,获取您的证书。 您可能具有此证书,但在这些步骤中,您可以直接从集群中检索该证书。

    1. 运行以下命令以检查私钥是否存在:

      oc get secret external-tls-secret
      
    2. 运行以下命令以从私钥中检索证书链:

      oc get secret external-tls-secret --output jsonpath='{.data.cert\.crt}' | base64 -d | tee ingress_cert_chain.crt
      
    3. 抽取 CA 证书。

      ingress_cert_chain.crt 文件通常包含多个证书。 文件中的最后一个证书通常是 CA 证书。

    4. 复制最后一个证书块,该证书块以 -----BEGIN CERTIFICATE----- 开头,以 -----END CERTIFICATE----- 结尾。

    5. 将此证书保存在 ingress_ca.crt 文件中。 保存 ingress_ca.crt 文件时,-----BEGIN CERTIFICATE----- 行必须是该文件的第一行,-----END CERTIFICATE----- 行必须是该文件的最后一行。

  2. 检索搜索技能 pod 所使用的信任库。

    1. 运行以下命令以列出搜索技能 pod:

      oc get pods -l component=skill-search
      
    2. 运行以下命令以使用搜索技能 pod 名称设置 SEARCH_SKILL_POD 环境变量:

      SEARCH_SKILL_POD="$(oc get pods -l component=skill-search --output custom-columns=NAME:.metadata.name --no-headers | head -n 1
      
    3. 运行以下命令查看选定的 pod:

      echo "Selected search skill pod: ${SEARCH_SKILL_POD}"
      
    4. 检索信任库文件。 cacerts 文件是 Java使用的缺省信任库。 它包含缺省情况下 Java 信任的认证中心的列表。 运行以下命令以将二进制 cacerts 文件从 pod 复制到当前目录中:

      oc cp ${SEARCH_SKILL_POD}:/opt/ibm/java/jre/lib/security/cacerts cacerts
      
  3. 运行以下命令以将 ingress_ca.crt 文件插入到 cacerts 文件中:

    keytool -import -trustcacerts -keystore cacerts -storepass changeit -alias customer_ca -file ingress_ca.crt
    

    您可以运行 keytool -list -keystore cacerts -storepass changeit | grep customer_ca -A 1 命令以检查 CA 证书是否包含在 cacerts 文件中。

  4. 运行以下命令以创建包含更新后的 cacerts 文件的 configmap:

    oc create configmap watson-assistant-skill-cacerts --from-file=cacerts
    

    由于 cacerts 文件是二进制文件,因此 oc describe configmap watson-assistant-skill-cacerts 命令的输出会显示空数据部分。 要检查更新后的 cacerts 文件是否存在于 configmap 中,请运行 oc get configmap watson-assistant-skill-cacerts --output yaml 命令。

  5. 覆盖搜索技能 pod 中的 cacerts 文件。 在此步骤中,您将操作程序配置为使用更新后的 cacerts 文件覆盖搜索技能 pod 中的 cacerts 文件。 在以下示例文件中,实例称为 watson-assistant---wa。 将此值替换为实例的名称:

    cat <<EOF | oc apply -f -
    kind: TemporaryPatch
    apiVersion: com.ibm.oppy/v1
    metadata:
      name: watson-assistant---wa-skill-cert
    spec:
      apiVersion: com.ibm.watson.watson-assistant/v1
      kind: WatsonAssistantSkillSearch
      name: "watson-assistant---wa"    # Replace this with the name of your Watson Assistance instance
      patchType: patchStrategicMerge
      patch:
        "skill-search":
          deployment:
            spec:
              template:
                spec:
                  volumes:
                   - name: updated-cacerts
                     configMap:
                       name: watson-assistant-skill-cacerts
                       defaultMode: 420
                  containers:
                  - name: skill-search
                    volumeMounts:
                    - name: updated-cacerts
                      mountPath: /opt/ibm/java/jre/lib/security/cacerts
                      subPath: cacerts
    EOF
    
  6. 等待直到创建新的搜索技能 pod。 可能需要最多 10 分钟才能使更新生效。

  7. 请检查搜索技能功能是否按预期工作。

禁用水平 Pod 自动缩放并设置最大主 Pod 数

水平 Pod 自动缩放(HPA)功能自动启用。 因此,复制品的数量在1到10个之间动态变化。 如果要限制主 pod 的最大数量,或者如果您担心创建和删除主 pod 的频率过高,那么可以禁用 HPA。

  1. 通过运行以下命令来禁用 master 微服务的 HPA。 在这些步骤中,将实例名称替换为 INSTANCE_NAME 变量:

    oc patch wa ${INSTANCE_NAME} --type='json' --patch='[{"op": "add", "path": "/appConfigOverrides/clu", "value":{"master":{"autoscaling":{"enabled":false}}}}]'
    
  2. 等待信息传播到操作程序:

    sleep 600
    
  3. 运行以下命令以除去 master 微服务的 HPA:

    oc delete hpa ${INSTANCE_NAME}-master
    
  4. 等待大约 30 秒:

    sleep 30
    
  5. master 微服务缩减为所需的副本数。 在以下示例中,master 微服务缩减为两个副本:

    oc scale deploy ${INSTANCE_NAME}-master --replicas=2
    

cpd-watson-assistant-1.5.0-patch-1

cpd-watson-assistant-1.5.0-patch-1 可用于安装 V 1.5.0。

此补丁包括:

  • 针对 FIPS 兼容性的配置更改
  • 在 UI 中选择多个项时发生的空白屏幕问题的修订
  • 在 Google Chrome 中进行开发时用于解决 localStorage 问题的更新
  • 滚动问题的修订

在对 1.5.0 应用补丁 1 后调整 Redis 有状态集内存和 CPU 值的大小

以下是在应用 cpd-watson-assistant-1.5.0-patch-1之后调整 Redis 状态集内存和 CPU 值大小的步骤。

  1. 使用 oc get wa 来查看实例名称:

    oc get wa
    NAME                       VERSION   READY   READYREASON   UPDATING   UPDATINGREASON   DEPLOYED   VERIFIED   AGE
    watson-assistant---wa-qa   1.5.0     True    Stable        False      Stable           18/18      18/18      11h
    
  2. 将实例名称导出为可在每个步骤中使用的变量,例如:

    export INSTANCENAME=watson-assistant---wa-qa
    
  3. 将两个 Redis 有状态集中的 updateStrategy 更改为类型 RollingUpdate:

    oc patch statefulset c-$INSTANCENAME-redis-m -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
    oc patch statefulset c-$INSTANCENAME-redis-s -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
    
  4. 使用调整大小的 cpu 和内存值更新 Redis 有状态集:

    • 成员 CPU

      oc patch statefulset c-$INSTANCENAME-redis-m --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources/requests/cpu", "value":"50m"},{"op": "replace", "path": "/spec/template/spec/containers/1/resources/requests/cpu", "value":"50m"},{"op": "replace", "path": "/spec/template/spec/containers/2/resources/requests/cpu", "value":"50m"},{"op": "replace", "path": "/spec/template/spec/containers/3/resources/requests/cpu", "value":"50m"}]'
      
    • 成员内存

      oc patch statefulset c-$INSTANCENAME-redis-m --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/1/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/2/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/3/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/0/resources/requests/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/1/resources/requests/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/2/resources/requests/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/3/resources/requests/memory", "value":"256Mi"}]'
      
    • Sentinel CPU

      oc patch statefulset c-$INSTANCENAME-redis-s --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources/requests/cpu", "value":"50m"},{"op": "replace", "path": "/spec/template/spec/containers/1/resources/requests/cpu", "value":"50m"},{"op": "replace", "path": "/spec/template/spec/containers/2/resources/requests/cpu", "value":"50m"},{"op": "replace", "path": "/spec/template/spec/containers/3/resources/requests/cpu", "value":"50m"}]'
      
    • Sentinel 内存

      oc patch statefulset c-$INSTANCENAME-redis-s --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/1/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/2/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/3/resources/limits/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/0/resources/requests/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/1/resources/requests/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/2/resources/requests/memory", "value":"256Mi"},{"op": "replace", "path": "/spec/template/spec/containers/3/resources/requests/memory", "value":"256Mi"}]'
      
  5. 确认 Redis 成员和 sentinel pod 具有新的内存和 cpu 值,例如:

    oc describe pod c-$INSTANCENAME-redis-m-0 |grep cpu
    oc describe pod c-$INSTANCENAME-redis-m-0 |grep memory
    oc describe pod c-$INSTANCENAME-redis-s-0 |grep cpu
    oc describe pod c-$INSTANCENAME-redis-s-0 |grep memory
    
  6. 结果应该类似于以下示例:

    oc describe sts c-$INSTANCENAME-redis-m |grep cpu
                          {"m":{"db":{"limits":{"cpu":"4","memory":"256Mi"},"requests":{"cpu":"25m","memory":"256Mi"}},"mgmt":{"limits":{"cpu":"2","memory":"100Mi"}...
          cpu:     4
          cpu:     50m
          cpu:     2
          cpu:     50m
          cpu:     2
          cpu:      50m
          cpu:     2
          cpu:     50m
    
    oc describe sts c-$INSTANCENAME-redis-m |grep memory
                          {"m":{"db":{"limits":{"cpu":"4","memory":"256Mi"},"requests":{"cpu":"25m","memory":"256Mi"}},"mgmt":{"limits":{"cpu":"2","memory":"100Mi"}...
          memory:  256Mi
          memory:  256Mi
          memory:  256Mi
          memory:  256Mi
          memory:  256Mi
          memory:   256Mi
          memory:  256Mi
          memory:  256Mi
    
    oc describe pod c-$INSTANCENAME-redis-s-0 |grep cpu
                    {"m":{"db":{"limits":{"cpu":"4","memory":"256Mi"},"requests":{"cpu":"25m","memory":"256Mi"}},"mgmt":{"limits":{"cpu":"2","memory":"100Mi"}...
          cpu:     2
          cpu:     50m
          cpu:     2
          cpu:     50m
          cpu:     2
          cpu:      50m
          cpu:     2
          cpu:     50m
    
    oc describe pod c-$INSTANCENAME-redis-s-0 |grep memory
                    {"m":{"db":{"limits":{"cpu":"4","memory":"256Mi"},"requests":{"cpu":"25m","memory":"256Mi"}},"mgmt":{"limits":{"cpu":"2","memory":"100Mi"}...
          memory:  256Mi
          memory:  256Mi
          memory:  256Mi
          memory:  256Mi
          memory:  256Mi
          memory:   256Mi
          memory:  256Mi
          memory:  256Mi
    
  7. 将两个 Redis 有状态集中的 updateStrategy 更改回类型 OnDelete:

    oc patch statefulset c-$INSTANCENAME-redis-m -p '{"spec":{"updateStrategy":{"type":"OnDelete"}}}'
    oc patch statefulset c-$INSTANCENAME-redis-s -p '{"spec":{"updateStrategy":{"type":"OnDelete"}}}'
    

将部署从中型更改为小型时删除 pdb (pod破坏性预算)

每当部署大小从中型更改为小型时。 需要手动步骤来删除为中型实例创建的 poddisruptionbudgets

运行以下命令,将 <instance-name> 替换为 CR 实例的名称,将 <namespace-name> 替换为实例所在的名称空间的名称。

oc delete pdb  -l icpdsupport/addOnId=assistant,component!=etcd,ibmevents.ibm.com/kind!=Kafka,app.kubernetes.io/instance=<instance-name> -n <namespace-name>