Как заставить созданный модуль запускать приложение (команду и аргументы) и одновременно иметь в нем развертывание и службу, ссылающуюся на него? - PullRequest
0 голосов
/ 26 апреля 2020

Контекст :
Tech : Java, Docker Панель инструментов, Minikube.
У меня есть java веб-приложение (уже упакованное как веб- tool.jar), который я хочу запустить, имея при этом все преимущества kubernetes.
Для того, чтобы kubernetes поручил локально получать изображение Я использую тег image:

docker build -t despot/web-tool:1.0 .

и затем сделать его доступным для мини-куба:

docker save despot/web-tool:1.0 | (eval $(minikube docker-env) && docker load)

Файл docker :

FROM openjdk:11-jre
ADD target/web-tool-1.0-SNAPSHOT.jar app.jar
EXPOSE 1111
EXPOSE 2222

1. Как я могу создать модуль, запустить приложение java и в то же время иметь ссылку на развертывание и службу?

1.1. Могу ли я создать развертывание, которое будет распространять команду и аргументы при создании модуля? (лучше для меня, поскольку я гарантирую создание развертывания и службы до создания модуля)
1.2. Если 1.1. не выполнимо, можно ли kubectl применить некоторую конфигурацию pod с помощью команды и аргументов к уже созданному развертыванию / pod / service? (худшее решение как дополнительные ручные шаги)
1.3. Если 1.2. невозможно, возможно ли создать развертывание / службу и подключить ее к уже запущенному модулю (который был запущен с помощью "kubectl run ... java -jar app.jar reg")?

Я попробовал :
a) Создать развертывание (которое автоматически запускает модуль) и открыть (служба создана):

kubectl create deployment reggo --image=despot/web-tool:1.0

С Таким образом, модуль создается с состоянием CrashLoopBackoff, поскольку у него еще не запущен процесс переднего плана.

b) Попробовал следующее в надежде на то, что развертывание примет команду и аргументы, которые будут распространяться на создание модуля (1.1.):

kubectl create deployment reggo --image=despot/web-tool:1.0 -- java -jar app.jar reg

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

c) Попытка применения конфигурации модуля с командой и аргументами после развертывания создала модуль, поэтому я запустил команду из a), нашел идентификатор (reg go -858ccd cddd -mswzs) модуля с (kubectl get pods) и затем я выполнил:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: reggo-858ccdcddd-mswzs
spec:
  containers:
  - name: reggo-858ccdcddd-mswzs
    command: ["java"]
    args: ["-jar", "app.jar", "reg"]
EOF

, но я получил:

Предупреждение: приложение kubectl apply должно использоваться на ресурсе созданный kubectl create --save-config или kubectl apply Модуль Pod
"reg go -858ccd cddd -mswzs" недействителен:
* spe c .containers [0] .image: Обязательное значение
* spe c .containers: Запрещено: обновления модуля не могут добавлять или удалять контейнеры

, что позволяет мне думать, что я не могу выполнить команду, применив команду конфигурация команды / args.

Решение (с использованием Arghya answer ) :

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reggo
spec:
  selector:
    matchLabels:
      app: reggo-label
  template:
    metadata:
      labels:
        app: reggo-label
    spec:
     containers:
     - name: reggo
       image: "despot/web-tool:1.0"
       command: ["java"]
       args: ["-jar", "app.jar", "reg"]
       ports:
       - containerPort: 1111
EOF

и выполнение:

kubectl expose deployment reggo  --type=NodePort --port=1111

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Команду java -jar можно указать как ENTRYPOINT в самом файле docker, который сообщает Docker о запуске приложения java.

FROM openjdk:11-jre
ADD target/web-tool-1.0-SNAPSHOT.jar app.jar
EXPOSE 1111
EXPOSE 2222
ENTRYPOINT ["java", "-jar", "app.jar", "reg"]

В качестве альтернативы может быть достигнуто то же самое через command и args секцию в kubernetes yaml

containers:
- name: myapp
  image: myregistry.azurecr.io/myapp:0.1.7
  command: ["java"]
  args: ["-jar", "app.jar", "reg"]

Теперь, когда дело доходит до ошибки Forbidden: pod updates may not add or remove containers, причина этого в том, что вы пытаетесь изменить существующий объект pod containers раздел, который не допускается. Вместо этого вы можете получить весь yaml развертывания, открыть его в редакторе и отредактировать, добавив раздел команд, а затем удалить существующее развертывание и, наконец, применить измененный yaml развертывания к кластеру.

  1. kubectl get deploy reggo -o yaml --export > deployment.yaml
  2. Удалите существующее развертывание с помощью kubectl delete deploy reggo
  3. Отредактируйте deploy.yaml для добавления правильной команды
  4. Примените yaml к кластеру kubectl apply -f deployment.yaml
1 голос
/ 27 апреля 2020

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

Однако, если вы хотите создать развертывание с помощью команды kubectl, вы можете запустить

kubectl run $DEPLOYMENT_NAME --image=despot/web-tool:1.0 --command -- java -jar app.jar reg

Кроме того, если вы хотите представить развертывание с помощью той же команды, вы можете передать:

--expose=true аргумент, который создаст службу типа ClusterIP и

--port=$PORT_NUMBER для выбора порта, на котором он будет выставлен.

чтобы изменить тип порта на NodePort, вам нужно выполнить:

kubectl run $DEPLOYMENT_NAME --image=despot/web-tool:1.0 --expose=true --service-overrides='{ "spec": { "type": "NodePort" } }' --port=$PORT_NUMBER --command -- java -jar app.jar reg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...