7

Kubernetes のドキュメントでこれに対する答えを見つけるのに苦労しています。シナリオは次のとおりです。

  • AWS 上の Kubernetes バージョン 1.4
  • Kubernetes デプロイメントとしてデプロイされた NodeJS API (Express) を実行する 8 つのポッド
  • ポッドの 1 つが深夜に明らかな理由もなく再起動されます (トラフィックがない、CPU スパイクがない、メモリ プレッシャーがない、アラートがないなど)。この結果、再起動の回数が増加します。
  • ログに異常は何も表示されません (kubectl -p以前のログを確認するために実行しましたが、エラーはまったくありません)
  • リソースの消費は正常です。Kubernetes がポッドを別のノードなどに再スケジュールすることに関するイベントは表示されません。
  • ポッドを記述するとTERMINATED状態が返され、理由と終了コード 0 が返されます。このポッドは現在複数回置き換えられているCOMPLETEDため、正確な出力はありません。kubectl

ポッドは NodeJS サーバー インスタンスであり、完了することができず、常に実行されてリクエストを待機しています。

これは、ポッドの Kubernetes の内部再配置でしょうか? これがいつ起こるかを知る方法はありますか?なぜそれが起こったのかを言うどこかのイベントであってはなりませんか?

アップデート

これは、本番環境で発生したものです。問題のあるポッドを説明した結果は次のとおりです。

api: Container ID: docker://7a117ed92fe36a3d2f904a882eb72c79d7ce66efa1162774ab9f0bcd39558f31 Image: 1.0.5-RC1 Image ID: docker://sha256:XXXX Ports: 9080/TCP, 9443/TCP State: Running Started: Mon, 27 Mar 2017 12:30:05 +0100 Last State: Terminated Reason: Completed Exit Code: 0 Started: Fri, 24 Mar 2017 13:32:14 +0000 Finished: Mon, 27 Mar 2017 12:29:58 +0100 Ready: True Restart Count: 1

更新 2

使用したdeployment.yamlファイルは次のとおりです。

apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
  namespace: "${ENV}"
  name: "${APP}${CANARY}"
  labels:
    component: "${APP}${CANARY}"
spec:
  replicas: ${PODS}
  minReadySeconds: 30
  revisionHistoryLimit: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        component: "${APP}${CANARY}"
    spec:
      serviceAccount: "${APP}"

${IMAGE_PULL_SECRETS}

      containers:
      - name: "${APP}${CANARY}"
        securityContext:
          capabilities:
            add:
              - IPC_LOCK
        image: "134078050561.dkr.ecr.eu-west-1.amazonaws.com/${APP}:${TAG}"
        env:
        - name: "KUBERNETES_CA_CERTIFICATE_FILE"
          value: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
        - name: "NAMESPACE"
          valueFrom:
            fieldRef:
              fieldPath: "metadata.namespace"
        - name: "ENV"
          value: "${ENV}"
        - name: "PORT"
          value: "${INTERNAL_PORT}"
        - name: "CACHE_POLICY"
          value: "all"
        - name: "SERVICE_ORIGIN"
          value: "${SERVICE_ORIGIN}"
        - name: "DEBUG"
          value: "http,controllers:recommend"
        - name: "APPDYNAMICS"
          value: "true"
        - name: "VERSION"
          value: "${TAG}"
        ports:
        - name: "http"
          containerPort: ${HTTP_INTERNAL_PORT}
          protocol: "TCP"
        - name: "https"
          containerPort: ${HTTPS_INTERNAL_PORT}
          protocol: "TCP"

上記の展開マニフェストで参照されているイメージの Dockerfile:

FROM ubuntu:14.04
ENV NVM_VERSION v0.31.1
ENV NODE_VERSION v6.2.0
ENV NVM_DIR /home/app/nvm
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH
ENV APP_HOME /home/app

RUN useradd -c "App User" -d $APP_HOME -m app
RUN apt-get update; apt-get install -y curl
USER app

# Install nvm with node and npm
RUN touch $HOME/.bashrc; curl https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash \
    && /bin/bash -c 'source $NVM_DIR/nvm.sh; nvm install $NODE_VERSION'

ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH

# Create app directory
WORKDIR /home/app
COPY . /home/app

# Install app dependencies
RUN npm install

EXPOSE 9080 9443
CMD [ "npm", "start" ]

npm startnode app.jsポート 9080 で NodeJS サーバーを起動する通常のコマンドのエイリアスです。

4

2 に答える 2