Kubernetes Helm pod 无限重启

Kubernetes Helm pod restart infinitly

我正在尝试将 Spinnaker 部署到 Kubernetes 集群中。为了做到这一点,我 使用使用 Helm 的 Halyard。 当我尝试 运行 我的 Helm pod 时,我有以下输出:

Cluster "default" set.
Context "default" created.
User "user" set.
Context "default" modified.
Switched to context "default".
Creating /home/spinnaker/.helm 
Creating /home/spinnaker/.helm/repository 
Creating /home/spinnaker/.helm/repository/cache 
Creating /home/spinnaker/.helm/repository/local 
Creating /home/spinnaker/.helm/plugins 
Creating /home/spinnaker/.helm/starters 
Creating /home/spinnaker/.helm/cache/archive 
Creating /home/spinnaker/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /home/spinnaker/.helm.
Tiller (the Helm server-side component) has been upgraded to the current version.
Happy Helming!

一切似乎都是正确的。但是我的 pod 引发了 CrashLoopBackOff 事件,没有任何其他错误,并且我的 pod 无缘无故地再次重启。

我用来构建 helm docker 图像的 docker 文件如下:

FROM gcr.io/spinnaker-marketplace/halyard:stable

ARG GCP_SPINNAKER_GCR_KEY

# install helm
WORKDIR /home/spinnaker

# get helm
RUN curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
RUN sed -i 's/\/usr\/local\/bin/\/home\/spinnaker/g' get_helm.sh

# sudo user workaround
RUN sed -i 's/sudo //g' get_helm.sh
RUN chmod u+x get_helm.sh

# add the current folder to the path 
ENV PATH="/home/spinnaker:${PATH}"

# install helm
RUN ./get_helm.sh

# importing the configuration script
ADD shell/halyard-configure.sh .

# auhtorize the spinnaker user to execute the configuration script
USER root
RUN chown -R spinnaker halyard-configure.sh
USER spinnaker

# create the gcp key directory for docker registry
RUN mkdir -p ~/.gcp
RUN echo $GCP_SPINNAKER_GCR_KEY | base64 -d > ~/.gcp/gcr-account.json

ENTRYPOINT [ "./halyard-configure.sh" ] 

CMD "/opt/halyard/bin/halyard"

这里是 halyard-configure.sh shell 脚本的内容:

#!/usr/bin/env bash
set -e

# configure kubectl
kubectl config set-cluster default --server=https://kubernetes.default --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
kubectl config set-context default --cluster=default
token=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
kubectl config set-credentials user --token=$token
kubectl config set-context default --user=user
kubectl config use-context default

# configure helm
helm init --service-account tiller --upgrade

您的入口点脚本需要以魔法行 exec "$@".

结尾

通常在 Docker 中,容器启动会启动容器入口点,并将命令作为参数传递给它。 (Kubernetes pod 规范将这些部分称为 "command" 和 "args"。)一旦入口点完成,容器就会退出。由于您的入口点脚本仅运行 kubectl confighelm init 命令,这些命令都立即完成,因此容器几乎立即退出;当它出现时,Kubernetes 会重新启动它;当它必须重新启动超过两三次时,它会进入 CrashLoopBackOff 状态。

解决此问题的通常方法是设置入口点脚本以执行任何所需的首次设置,然后 exec 作为参数传递给它的命令。然后命令(在你的情况下,/opt/halyard/bin/halyard)最终成为 "the main container process",并具有神奇的进程 ID 1,并将在容器终止时接收信号。

另请注意,有一个合理的标准 pattern for accessing the Kubernetes API from a pod,涉及为 pod 配置服务帐户并使用官方 API,或者启动 kubectl proxy sidecar。您也许可以使用它来代替此处的手动设置步骤。 (不过,我从未尝试从 Kubernetes pod 中启动 Helm。)