Minikube, python alpine: python команда не найдена - PullRequest
0 голосов
/ 14 июля 2020

Это может показаться очень глупым вопросом для экспертов K8. Но я долго боролся с этим, поэтому вопрос ниже.

Я пытаюсь развернуть локально простое приложение Kubernetes через Minikube и docker для тестирования шаблона контейнера sidecar.

Начнем с элементов контейнера sidecar:

Dockerfile

FROM python:3.6-alpine

RUN pip install boto3==1.14.20
RUN pip install --upgrade awscli s3cmd
   
ENV APP_HOME_DIR=/home/sidecar
RUN mkdir $APP_HOME_DIR

ADD run.sh $APP_HOME_DIR
ADD s3_sync.py $APP_HOME_DIR
RUN chmod +x $APP_HOME_DIR/s3_sync.py
RUN chmod +x $APP_HOME_DIR/run.sh

ENV BUCKET_NAME=
ENV PROJECT_NAME=
ENV FEATURE_BRANCH=
ENV LOCAL_DIR=

WORKDIR $APP_HOME_DIR


ENTRYPOINT ["./run.sh"]

run. sh

#!/bin/sh

while true
do
    echo "Triggering an S3-SYNC"
    python /home/sidecar/s3_sync.py -b $BUCKET_NAME -p $PROJECT_NAME -f $FEATURE_BRANCH -l $LOCAL_DIR
    sleep 10
done

И упрощенная версия python файла s3_syn c .py :

import logging
import argparse

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.FileHandler("debug.log"), logging.StreamHandler()],
)

logger = logging.getLogger(__name__)

MASTER = "master"

def main():

    bucket_name = args.bucket_name
    project_name = args.project_name
    branch = args.feature_branch
    local_dir = args.local_dir
    sync_type = "production" if branch == MASTER else "review"

    logger.info(f"S3-SYNC starting for {sync_type} environment")



if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-b", "--bucket_name", help="s3 bucket name", required=True)
    parser.add_argument("-p", "--project_name", help="project name to sync", default="")
    parser.add_argument("-f", "--feature_branch", help="git feature branch name", default="master")
    parser.add_argument("-l", "--local_dir", help="local dir where to sync the s3 objects", required=True)

    args = parser.parse_args()
    main()

Если я соберу вышеуказанное и пропущу его через:

docker build -t sidecar_python .
docker run -e BUCKET_NAME=MYBUCKET -e PROJECT_NAME=MYPROJECT -e FEATURE_BRANCH=MYBRANCH -e LOCAL_DIR=/home sidecar_python

все работает без сбоев.

Затем я комбинирую сопроводительный файл в yaml-файле развертывания Kubernetes с другим локальным Docker образом:

k8_deployment.yml

apiVersion: v1
kind: Pod
metadata:
  name: mc1
spec:
  volumes:
    - name: dags
      emptyDir: {}
  containers:
    - name: readdag
      image: dag_reader
      imagePullPolicy: Never
      volumeMounts:
        - name: dags
          mountPath: /usr
    - name: sidecar
      image: sidecar_python:latest
      imagePullPolicy: Never
      env:
        - name: BUCKET_NAME
          value: "MYBUCKET"
        - name: PROJECT_NAME
          value: "MYPROJECT"
        - name: FEATURE_BRANCH
          value: "MYBRANCH"
        - name: LOCAL_DIR
          value: "/usr"
      volumeMounts:
        - name: dags
          mountPath: /usr

Образ dag_reader - это еще один локальный образ, для краткости я не буду публиковать его Dockerfile, поскольку он очень простой и выходит за рамки моего вопроса.

Затем я запускаю обычное: minikube start, eval $(minikube docker-env), docker build.. из 2 изображений и в конце kubectl apply -f k8_deployment.yml.

Если я выполню:

* 10 43 *

все выглядит хорошо.

Но затем, если я проверю логи контейнера с коляской:

kubectl logs -f mc1 sidecar

Triggering an S3-SYNC
./run.sh: line 6: python: not found

Итак, python не найден, я не могу найти причина, по которой контейнер, работающий в модуле, не может найти python, но контейнер, работающий автономно в модуле docker, может.

Та же ошибка возникает для другого контейнера, запущенного в модуле: у одного есть изображение python alpine.

Кто-нибудь может объяснить почему? Я что-то здесь не так делаю?

Спасибо, Алессио

1 Ответ

3 голосов
/ 14 июля 2020

Каталог /usr содержит различное системное и прикладное программное обеспечение. В частности, двоичный файл Python обычно находится в /usr/bin/python3 в системе (или контейнере) Linux.

Ваш Kubernetes YAML монтирует том emptyDir поверх /usr. Это скрывает все, что было в этом дереве каталогов, включая двоичный файл Python и все системные библиотеки Python. Это приводит к этой ошибке.

Установка тома в другом месте позволит избежать этой проблемы. Контейнерные приложения, как правило, не слишком разборчивы в отношении "стандартных" путей FHS, поэтому я мог бы вместо этого установить

  env:
    - name: LOCAL_DIR
      value: "/dags"
  volumeMounts:
    - name: dags
      mountPath: /dags
...