Я пытаюсь развернуть Spinnaker в кластере Kubernetes. Для этого я использую Halyard, который использует Helm. Пока я пытаюсь запустить свой 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!

Все кажется правильным. Но мой модуль вызывает событие CrashLoopBackOff без каких-либо других ошибок, и мой модуль перезапускается снова без видимой причины.

Dockerfile, который я использую для создания образа докера Helm, выглядит следующим образом:

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 :

#!/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
0
Laurent GRENIER 20 Дек 2018 в 19:21

1 ответ

Лучший ответ

Ваш сценарий точки входа должен заканчиваться волшебной строкой exec "$@".

В целом в Docker запуск контейнера запускает точку входа контейнера, передавая ей команду в качестве параметров. (В спецификации модуля Kubernetes эти части называются «команда» и «аргументы».) После завершения точки входа контейнер закрывается. Поскольку ваш сценарий точки входа просто запускает команды kubectl config и helm init, которые выполняются без промедления, контейнер закрывается почти сразу; когда это произойдет, Kubernetes перезапустит его; и когда ему необходимо перезапустить его более двух или трех раз, он переходит в состояние CrashLoopBackOff.

Обычный способ обойти это - настроить сценарий точки входа так, чтобы он выполнял любую требуемую первоначальную настройку, а затем exec команду, которая была передана ему в качестве параметров. Затем команда (в вашем случае /opt/halyard/bin/halyard) становится "основным процессом контейнера", имеет идентификатор магического процесса 1 и будет получать сигналы во время завершения контейнера.

Также обратите внимание, что существует достаточно стандартный шаблон для доступа к Kubernetes API из модуля, который включает в себя настройку учетной записи службы для модуля и использование официального API или запуск сопутствующего элемента kubectl proxy. Возможно, вы сможете использовать это вместо шагов ручной настройки, которые у вас есть. (Однако я никогда не пробовал запускать Helm из модуля Kubernetes.)

1
David Maze 20 Дек 2018 в 18:01