これは私が得るものです:
[root@centos-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-server-h6nw8 1/1 Running 0 1h
nfs-web-07rxz 0/1 CrashLoopBackOff 8 16m
nfs-web-fdr9h 0/1 CrashLoopBackOff 8 16m
以下は「ポッドの説明」からの出力です kubectl describe pods
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
16m 16m 1 {default-scheduler } Normal Scheduled Successfully assigned nfs-web-fdr9h to centos-minion-2
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Created Created container with docker id 495fcbb06836
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Started Started container with docker id 495fcbb06836
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Started Started container with docker id d56f34ae4e8f
16m 16m 1 {kubelet centos-minion-2} spec.containers{web} Normal Created Created container with docker id d56f34ae4e8f
16m 16m 2 {kubelet centos-minion-2} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "web" with CrashLoopBackOff: "Back-off 10s restarting failed container=web pod=nfs-web-fdr9h_default(461c937d-d870-11e6-98de-005056040cc2)"
Nfs-web-07rxz、nfs-web-fdr9hの2つのポッドがありますが、「kubectl logs nfs-web-07rxz」または「-p」オプションを使用すると、両方のポッドにログが表示されません。
[root@centos-master ~]# kubectl logs nfs-web-07rxz -p
[root@centos-master ~]# kubectl logs nfs-web-07rxz
これは私のreplicationController yamlファイルです: replicationController yaml file
apiVersion: v1 kind: ReplicationController metadata: name: nfs-web spec: replicas: 2 selector:
role: web-frontend template:
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: eso-cmbu-docker.artifactory.eng.vmware.com/demo-container:demo-version3.0
ports:
- name: web
containerPort: 80
securityContext:
privileged: true
私のDockerイメージは、次の単純なdockerファイルから作成されました。
FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y nfs-common
KubernetesクラスターをCentOs-1611、kubeバージョンで実行しています。
[root@centos-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/AMD64"}
Server Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/AMD64"}
「docker run」でdockerイメージを実行すると、kubernetesを介してのみ問題なくイメージを実行できました。
誰かが私を助けてくれますか、ログを見ずにデバッグするにはどうすればよいですか?
@Sukumarがコメントしたように、Dockerfileで Command を実行するか、ReplicationControllerでコマンドを指定する必要があります。
ポッドは起動してすぐに終了するためクラッシュします。そのため、Kubernetesが再起動し、サイクルが継続します。
kubectl -n <namespace-name> describe pod <pod name>
kubectl -n <namespace-name> logs -p <pod name>
後続のkubectl exec呼び出しのためにポッドを実行し続ける必要があり、上記のコメントが指摘したように、ポッドはすべてのタスクの実行を完了したため、k8sクラスターによって殺されました。ポッドを次のように自動的に停止しないコマンドでポッドをキックするだけで、ポッドの実行を維持できました。
kubectl run YOUR_POD_NAME -n YOUR_NAMESPACE --image SOME_PUBLIC_IMAGE:latest --command tailf /dev/null
このページ から、コンテナはすべてを正しく実行した後に終了しますが、すべてのコマンドが終了したためクラッシュします。サービスをフォアグラウンドで実行するか、キープアライブスクリプトを作成します。そうすることで、Kubernetesはアプリケーションが実行されていることを示します。 Docker
環境では、この問題は発生しません。実行中のアプリが必要なのはKubernetesのみです。
ブートストラップに時間がかかるアプリケーションがある場合、レディネス/活性プローブの初期値に関連している可能性があります。 initialDelaySeconds
アプリケーションが多くの初期化を処理するため、SpringBoot
の値を120に増やすことで問題を解決しました。ドキュメントには、notデフォルト0が記載されています( https://kubernetes.io/docs/api-reference/v1.9/# probe-v1-core )
service:
livenessProbe:
httpGet:
path: /health/local
scheme: HTTP
port: 8888
initialDelaySeconds: 120
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 10
readinessProbe:
httpGet:
path: /admin/health
scheme: HTTP
port: 8642
initialDelaySeconds: 150
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 10
これらの値に関する非常に良い説明は initialDelaySecondsのデフォルト値 で与えられます。
正常性または準備チェックアルゴリズムは次のように機能します。
initialDelaySeconds
を待つ- 継続的な成功の数が
timeoutSeconds
より大きい場合、チェックを実行し、successThreshold
がタイムアウトするまで待機します- 継続的な失敗の数が
failureThreshold
より大きい場合は失敗を返し、そうでない場合はperiodSeconds
を待って新しいチェックを開始します
私の場合、アプリケーションは非常に明確な方法でbootstrapできるようになったため、定期的なcrashloopbackoffが発生しないことがあります。
私の場合、問題はSteve S.が言ったことです。
ポッドは起動してすぐに終了するためクラッシュします。そのため、Kubernetesが再起動し、サイクルが継続します。
つまり、Javaアプリケーションがあり、そのmain
が例外をスローしました(そして、何かがログに記録されないように、デフォルトのキャッチされていない例外ハンドラをオーバーライドしました)。解決策は、main
の本体をtry { ... } catch
に入れ、例外を出力することでした。したがって、何が間違っているかを見つけて修正することができました。
(別の原因は、アプリでSystem.exit
を呼び出している可能性があります; SecurityManager
をオーバーライドしたカスタムcheckExit
を使用して、終了を防止(または呼び出し元をログに記録)できます。 https://stackoverflow.com/a/5401319/204205 。)
同じ問題をトラブルシューティングしながら、kubeclt logs <pod_id>
を使用しているときにログが見つかりませんでした。したがって、ノードインスタンスにssh:edして、プレーンドッカーを使用してコンテナを実行しようとしました。驚いたことに、これも失敗しました。
コンテナに入るとき:
docker exec -it faulty:latest /bin/sh
いろいろ調べてみると、それが最新バージョンではないことがわかりました。
欠陥のあるバージョンのdockerイメージは、インスタンスですでに利用可能です。
Faulty:latestインスタンスを削除したとき:
docker rmi faulty:latest
すべてが機能し始めました。