付録3:インストールに関する問題のトラブルシューティング

Diamondインストール後の画像チェックエラーについて

Diamondのインストールが中断された時に、多くのpodにImageInspectErrorが発生する場合、以下の手順で復旧する可能性があります。

# make sure that which node  has pods with ImageInspectError
kubectl get pod -o wide

# delete image in tht pod with ImageInspectError
docker rmi -f imageId 
docker system prune 

# delete the pod with ImageInspectError 
kubectl delete pod

SenseLinkライセンスのアクティベーション

SenseLinkをアクティベーションにする前に、全てのホスト用にライセンスファイルとアクティベーションを準備する必要があります。 当手順はライセンスの更新時も同様です。ライセンスファイルの有効期限が切れる前に、必ず更新を行ってください。

また、ライセンスファイルとアクティベーションコードを申請するために、featureサービスのログからDUIDを取得する必要があります。

# get DUID of all Link node
kubectl logs -f feature-0 -n senselink | grep DUID
kubectl logs -f feature-1 -n senselink | grep DUID
kubectl logs -f feature-2 -n senselink | grep DUID

ライセンスファイルとアクティベーションコードを手に入れたら、次の処理でホストをアクティベーションできます。

ステップ1:featureポッドとpvcを削除します。

# delete Feature pods
kubectl delete -f  $install_package_path/senselink/multi-done/statefulset/feature-statefulset.yaml

# delete Feature pvc
kubectl delete pvc -n senselink feature-claim-feature-0
kubectl delete pvc -n senselink feature-claim-feature-1
kubectl delete pvc -n senselink feature-claim-feature-2

ステップ2:「feature-statefulset.yaml」を修正します。また、下記の確認を実施してください。

  1. ライセンスファイルがHOSTPATHにあること

  2. replicasの数は1となること

  3. Node selectorはapp:senselink feature:enableであること

# vim $install_package_path/senselink/multi-done/statefulset/feature-statefulset.yaml  
apiVersion: apps/v1
kind: StatefulSet
metadata:
  creationTimestamp: null
  labels:
    senselink: feature
  name: feature
  namespace: senselink
spec:
  replicas: 1
  serviceName: feature
  selector:
    matchLabels:
      senselink: feature
  template:
    metadata:
      creationTimestamp: null
      labels:
        senselink: feature
    spec:
      containers:
      - image: registry.sensetime.com/jcv/feature_service:v2.3.0
        name: feature
        ports:
        - containerPort: 50052
        resources:
          limits:
            memory: "1073741824"
        stdin: true
        tty: true
        volumeMounts:
        - mountPath: /go/log
          name: feature-claim
        - mountPath: /go/conf/qa.toml
          subPath: qa.toml
          name: feature-qa
        - mountPath: /go/conf/feature.toml
          subPath: feature.toml
          name: feature-conf
        - mountPath: /go/license/
          name: feature-sub-license
      restartPolicy: Always
      volumes:
      - name: feature-claim
        persistentVolumeClaim:
          claimName: feature-claim
      - name: feature-qa
        configMap:
          name: feature-qa
      - name: feature-conf
        configMap:
          name: feature-conf
      - name: feature-sub-license
        hostPath:
          path: /etc/senselink/license
      nodeSelector:
        app: senselink
        feature: enable
  volumeClaimTemplates:
  - metadata:
      name: feature-claim
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

ステップ3:ラベルkubernetesノードの設定が「feature=enable」であること

# show all k8s nodes with labels
kubectl get node  --show-labels

# Only label the node you want to activate this time.
kubectl label node sz-office2-172-20-52-184-172.20.52.184 feature=enable --overwrite

# Label other node to diable feature service in this node.
kubectl label node sz-office2-172-20-52-184-172.20.52.184 feature=disable --overwrite

ステップ4:redis cacheにあるSenseLinkのアクティブ状態は「期限切れ」であることを確認してください。

# delete the redis key `authorize-license-status` or wait 5 minutes.
redis-cli -h 10.10.41.16  -a 2CH189BxbsKceg4l
10.10.41.16:0>del authorize-license-status

ステップ5:featureサービスのポッドを起動して、ラベルノードをアクティします。

kubectl apply -f $install_package_path/senselink/multi-done/statefulset/feature-statefulset.yaml

ステップ6:上記のステップ1〜ステップ5を繰り返して、全てのノードをアクティベーションします。その後に「feature-statefulset.yaml」を修正して下記の確認を実施します。

  1. ライセンスファイルがHOSTPATHにあること

  2. replicasの数はSenseLinkノードの数を同じであること

  3. Node selectorはapp:senselink feature:enableであること

最後にNode selectorのfeature:enableを削除します。

# vim $install_package_path/senselink/multi-done/statefulset/feature-statefulset.yaml  
apiVersion: apps/v1
kind: StatefulSet
metadata:
  creationTimestamp: null
  labels:
    senselink: feature
  name: feature
  namespace: senselink
spec:
  replicas: 3  #number of line nodes
  serviceName: feature
  selector:
    matchLabels:
      senselink: feature
  template:
    metadata:
      creationTimestamp: null
      labels:
        senselink: feature
    spec:
      containers:
      - image: registry.sensetime.com/jcv/feature_service:v2.3.0
        name: feature
        ports:
        - containerPort: 50052
        resources:
          limits:
            memory: "1073741824"
        stdin: true
        tty: true
        volumeMounts:
        - mountPath: /go/log
          name: feature-claim
        - mountPath: /go/conf/qa.toml
          subPath: qa.toml
          name: feature-qa
        - mountPath: /go/conf/feature.toml
          subPath: feature.toml
          name: feature-conf
        - mountPath: /go/license/
          name: feature-sub-license
      restartPolicy: Always
      volumes:
      - name: feature-claim
        persistentVolumeClaim:
          claimName: feature-claim
      - name: feature-qa
        configMap:
          name: feature-qa
      - name: feature-conf
        configMap:
          name: feature-conf
      - name: feature-sub-license
        hostPath:
          path: /etc/senselink/license
      nodeSelector:
        app: senselink
  volumeClaimTemplates:
  - metadata:
      name: feature-claim
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi

ステップ7:pvcを削除し、featureポッドを再起動します。

kubectl delete -f  $install_package_path/senselink/multi-done/statefulset/feature-statefulset.yaml

# delete Feature pvc
kubectl delete pvc -n senselink feature-claim-feature-0
kubectl delete pvc -n senselink feature-claim-feature-1
kubectl delete pvc -n senselink feature-claim-feature-2 

kubectl apply -f  $install_package_path/senselink/multi-done/statefulset/feature-statefulset.yaml

IP設定

オペレーションログのクライアントIPは実際のIPではありません。 SenseLinkポータルIPが外部SLBのIPである場合、オペレーターログのクライアントIPは実際のIPではない可能性があります。この問題を解決するには、外部配置を追加する必要があります。

# vim $install_package_path/senselink/multi-done/configmap/web-configmap.yaml
# 100.122.0.0/16 is the Subnet mask of external SLB Ip
...
location /sl {
      add_header 'Access-Control-Allow-Origin' *;
      proxy_pass $upstream_apiv2;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-PORT $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Cookie $http_cookie;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_redirect off;
      set_real_ip_from 100.122.0.0/16;
      real_ip_recursive on;
      real_ip_header  X-Forwarded-For;
    }
...

SenseLinkのセッションタイムアウト設定

以下の設定からセッションタイムアウト時間を変更することができます。

vim $install_package_path/senselink/multi-done/configmap/apiv2-configmap.yaml

########
keeper:
  token:
    expires: 43200  # Token validity period in seconds

kubectl apply -f $install_package_path/senselink/multi-done/configmap/apiv2-configmap.yaml
kubectl delete -f $install_package_path/senselink/multi-done/statefulset/apiv2-statefulset.yaml
kubectl apply -f $install_package_path/senselink/multi-done/statefulset/apiv2-statefulset.yaml

PV や PVC を削除できない場合

sk patch pvc infra-claim-infra-1 -p '{"metadata":{"finalizers":null}}'

SenseLink: Apiv2 ポッドでポート番号問題により CrashLoopBackOff が発生する場合

Apiv2 ポッドクラッシュの状況

SenseLink のデプロイ後、 apiv2 ポッドが以下のように CrashLoopBackOff の状態になりました。

$ kubectl -n senselink get pod

NAME                         READY     STATUS             RESTARTS   AGE
apiv2-0                      0/1       CrashLoopBackOff   37         172m
apiv2-1                      0/1       CrashLoopBackOff   37         172m
apiv2-2                      0/1       CrashLoopBackOff   36         172m
emq-5c5b6fbbf9-wmxw9         1/1       Running            0          3h9m
feature-0                    1/1       Running            0          3h9m
feature-1                    1/1       Running            0          3h8m
feature-2                    1/1       Running            0          3h8m
mmo-init-job-nbm59           0/1       Completed          0          3h10m
...

ポッドのログを確認すると、以下に示すような 'java.lang.String' のタイプ値を 'java.lang.Integer' の該当するタイプに変換できない (Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer') という内容のエラーが何行も表示されます。

$ kubectl -n senselink logs apiv2-0
...
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'InfraService': Unsatisfied dependency expressed through field 'port'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "tcp://10.108.12.226:50009"
...

Apiv2 ポッドクラッシュの原因

原因は不明ですが、infra-service のキャッシュにより apiv2 の正常動作を妨げられたことが原因であると推測されます。 SenseLink のコンポーネントには動作依存があります。このため、コンポーネントは順番にデプロイされます。今回のケースでは、infra-service が apiv2 の後にデプロイされていました。したがって、この問題は通常発生することはありません。

Apiv2 ポッドのクラッシュ問題の修正

statefulset infra-service と apiv2 を削除してから、apiv2、infra-service の順にデプロイします。

# delete infra-service fs-service and apiv2 pods
$ kubectl delete -f /data/senselink/multi-done/service/infra-service.yaml
service "infra" deleted
$ kubectl delete -f /data/senselink/multi-done/service/fs-service.yaml
service "fs" deleted
$ kubectl delete -f /data/senselink/multi-done/statefulset/apiv2-statefulset.yaml
statefulset.apps "apiv2" deleted

# re-deploy apiv2 pods
$ kubectl apply -f /data/senselink/multi-done/statefulset/apiv2-statefulset.yaml
statefulset.apps/apiv2 created
# chech all apiv2 pods are running
$ kubectl -n senselink get pods
NAME                         READY     STATUS      RESTARTS   AGE
apiv2-0                      1/1       Running     0          4m15s
apiv2-1                      1/1       Running     0          4m5s
apiv2-2                      1/1       Running     0          3m59s
...

# redeploy infra-service
$ kubectl apply -f /data/senselink/multi-done/service/infra-service.yaml
service/infra created

# redeploy fs-service
$ kubectl apply -f /data/senselink/multi-done/service/fs-service.yaml
service/fs created

docker-containerd-shim、docker-runc が検出されない場合

コマンド未検出の状況

現バージョンの Diamond v1.8.3 では、Docker v18.09.2 がコンテナコンポーネントとしてインストールされますが、Ubuntu では APT アップグレードサービスによって Docker が v18.09.7 にアップグレードされることがあります。この変更により、稼働中のコンテナでエラーが発生し、k8s ポッドのエラーを引き起こします。問題のログを精査すると、docker-containerd-shim が検出されなかったことを示すエラーメッセージを確認できます。

docker: Error response from daemon: failed to start shim: exec: "docker: Error response from daemon: failed to start shim: exec: "docker-containerd-shim": executable file not found in $PATH: unknown.
": executable file not found in $PATH: unknown.

docker-runc が検出されなかったことを示す別のエラーが表示されることもあります。

docker: Error response from daemon: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/b123c36ddea60f7bf562946b7ffb9520023fcb4946b3e7f9941a564a46bad28c/log.json: no such file or directory): exec: "docker-runc": executable file not found in $PATH: unknown.

コマンド未検出の原因

根本原因は調査されていませんが、新バージョンで別の実行ライブラリ構造が使用されたため、一部のファイルが削除されていました。

コマンド未検出問題の対応策

適切なバージョンの Docker を使用して別の環境を構築することをお勧めします。任意の Docker または k8s ホストの /usr/bin/ フォルダに移動します。 docker-containerd-shim および docker-runc ファイルを問題のホストの /usr/bin/ にコピーします。

同じ問題が再び発生しないようにするためには、以下のコマンドを使用して APT のアップグレードサービスを無効にすることをお勧めします。以下のコマンドは、クラスタ内のすべてのホストに対する Diamond パブリックキーを設定するセクションで、デプロイメントガイドに追加されています。

# Disable apt package auto upgrade service
sudo systemctl stop apt-daily.service apt-daily.timer apt-daily-upgrade.timer apt-daily-upgrade.service
sudo systemctl disable apt-daily.service apt-daily.timer apt-daily-upgrade.timer apt-daily-upgrade.service

SNTP Server By Default

ワークロードマシンにNTPサービスを使用したい場合は、クラウドサービスのNTPサービスマニュアルを参照してください。

最終更新