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」を修正します。また、下記の確認を実施してください。
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」を修正して下記の確認を実施します。
replicas
の数はSenseLinkノードの数を同じであること
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
SenseLink RDS サービスデータのクリーンアップ方法
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サービスマニュアルを参照してください。