Контекст:
Технология: Java, Docker Toolbox, Minikube.
У меня есть веб-приложение java (уже упакованное как web-tool.jar), которое я хочу чтобы работать, имея все преимущества кубернетов.
Чтобы дать кубернетам команду брать изображение локально, я использую тег изображения:
docker build -t despot/web-tool:1.0 .
а затем сделать его доступным для minikube:
docker save despot/web-tool:1.0 | (eval $(minikube docker-env) && docker load)
файл докера:
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 применить некоторую конфигурацию модуля с помощью команды и аргументов к уже созданному развертыванию / модулю / службе? (худшее решение, как дополнительные ручные шаги)
1.3. Если 1.2. невозможно, возможно ли создать развертывание / службу и прикрепить ее к уже работающему модулю (который был запущен с помощью "kubectl run ... java -jar app.jar reg")?
Я пробовал:
a) Создайте развертывание (которое автоматически запускает модуль) и предоставьте доступ (создана служба):
kubectl create deployment reggo --image=despot/web-tool:1.0
При этом создается модуль с состоянием CrashLoopBackoff, поскольку в нем еще не запущен процесс переднего плана.
б) Пробовал следующее в надежде на то, что развертывание примет команду и аргументы, которые будут распространяться на создание модуля (1.1.):
kubectl create deployment reggo --image=despot/web-tool:1.0 -- java -jar app.jar reg
Тот же результат, что и модуль, поскольку развертывание не принимает команды и аргументы.
c) Пытался применить конфигурацию модуля с помощью команды и аргументов после того, как развертывание создало модуль, поэтому я выполнил команду из а), нашел идентификатор (reggo-858ccdcddd-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. Подставка "reggo-858ccdcddd-mswzs" недействительна:
* spec.containers [0] .image: Обязательное значение
* spec.containers: Запрещено: обновления модуля не могут добавлять или удалять контейнеры
это позволяет мне думать, что я не могу выполнить команду, применив конфигурацию command / args.
Решение (с использованием ответа Arghya):
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
CMD
к своемуDockerfile
, говоря, какую команду выполнять, либо указать его в спецификации развертывания в формате YAML. Я бы предпочел написать Kubernetes YAML (и проверить его в системе управления версиями) и развернуть его сkubectl apply
, а не с императивными командами типаkubectl create
. - person David Maze   schedule 26.04.2020