Я пытаюсь понять, что является хорошей практикой для того, что, как я предполагаю, является довольно распространенным сценарием построения и развертывания развертывания kubernetes с использованием kubectl.
Сценарий:
- Я хочу построить проект и развернуть его в своем кластере.
- У меня есть файл yaml с моим развертыванием (и связанными с ним вещами) и некоторый код sr c с Dockerfile.
- Я хочу не использовать : последний в теге изображения в соответствии с Рекомендация передовой практики и вместо этого использовать уникальный тег для этого изображения.
- У меня легко доступ к уникальному идентификатору, поступающему из CI или git sha, который доступен как переменная среды во время сборки.
Так что это выглядит довольно просто:
docker build -t my-registry/my-app:${BUILD_NUMBER} .
docker push my-registry/my-app:${BUILD_NUMBER}
kubectl apply -f kube.yaml
За исключением того, что нет никакого собственного способа сообщить kubectl, какое имя изображения использовать.
Я понимаю, что kubectl не поддерживает подстановку шаблонов переменных среды , но я никогда не видел только сценарий использования из них теги age упоминаются в явном виде.
Я могу использовать замену sed , но это кажется go вопреки духу «без поддержки переменных шаблонов», и я едва понимаю, что делает sed, когда я напишите это, чтобы я пожалел следующего разработчика, который должен читать мои команды.
Я чувствую, что для такого базового сценария c «Я хочу создать и развернуть в своем кластере» может быть более простое решение это не похоже на борьбу с kubectl.
Skaffold отлично справляется с назначением тега и дайджеста для каждого встроенного изображения, но было бы неплохо начать с простого процесса, прежде чем вводить более высокий уровень. инструменты уровня.
- Кроме "Использовать Skaffold" или "Использовать Helm", что мне нужно сделать, чтобы иметь простой процесс build + deploy?
- Хорошо ли создавать шаблоны yaml, либо с помощью sed , mo или другие инструменты для замены?
- Есть ли примеры проектов, в которых есть простой конвейер сборки и развертывания, использующий только kubectl и, возможно, kustomize?
kube.yaml (обратите внимание на отсутствие версии на названии изображения)
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: example
name: my-app
spec:
minReadySeconds: 2
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: my-app
image: "my-registry/my-app"
ports:
- containerPort: 3000
resources:
limits:
cpu: 300m
memory: 600m
requests:
cpu: 50m
memory: 100m