ПРИМЕЧАНИЕ: в настоящее время werf поддерживает сборку образов с использованием Docker-сервера или без его использования (в экспериментальном режиме). Эта страница содержит инструкции, которые подходят только для экспериментального режима без Docker-сервера. На данный момент для этого типа сборки доступен только сборщик образов на основе Dockerfile’ов. Сборщик Stapel будет доступен через некоторое время.

1. Подготовьте кластер Kubernetes

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

Ядро Linux с поддержкой OverlayFS в режиме rootless

Дополнительные действия не требуются.

Ядро Linux без поддержки OverlayFS в режиме rootless и использование привилегированного контейнера

Дополнительные действия не требуются.

Ядро Linux без поддержки OverlayFS в режиме rootless и использование непривилегированного контейнера

Для подключения устройства /dev/fuse в контейнерах под управлением werf необходим плагин Fuse device:

# werf-fuse-device-plugin-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: werf-fuse-device-plugin
spec:
  selector:
    matchLabels:
      name: werf-fuse-device-plugin
  template:
    metadata:
      labels:
        name: werf-fuse-device-plugin
    spec:
      hostNetwork: true
      containers:
      - image: soolaugust/fuse-device-plugin:v1.0
        name: fuse-device-plugin-ctr
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
        volumeMounts:
          - name: device-plugin
            mountPath: /var/lib/kubelet/device-plugins
      volumes:
        - name: device-plugin
          hostPath:
            path: /var/lib/kubelet/device-plugins

Примените приведенный выше манифест плагина в пространстве имен kube-system:

kubectl -n kube-system apply -f werf-fuse-device-plugin-ds.yaml

2. Настройте доступ к реестру контейнеров

Подготовьте конфигурацию Docker в формате base64 для доступа к реестру.

# registrysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: registrysecret
data:
  .dockerconfigjson: <base64 of ~/.docker/config.json>
type: kubernetes.io/dockerconfigjson

Создайте registrysecret в пространстве имен приложения:

kubectl -n quickstart-application apply -f registrysecret.yaml

3. Настройте service account для werf

Service account необходим werf для доступа к кластеру Kubernetes при развертывании приложения.

# werf-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: werf
  namespace: quickstart-application
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: werf
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: werf
    namespace: quickstart-application

Создайте описанный выше service account werf с ролью cluster-admin в пространстве имен приложения:

kubectl -n quickstart-application apply -f werf-service-account.yaml

4. Выполните развертывание приложения

Выберите один из доступных режимов работы и перейдите к нему.

Ядро Linux с поддержкой OverlayFS в режиме rootless

Команда werf converge будет выполняться в специальном Pod’е. Обратите внимание, что CONTAINER_REGISTRY_REPO следует заменить на реальный адрес репозитория реестра контейнеров, для которого на предыдущем шаге мы настраивали registrysecret.

# werf-converge.yaml
apiVersion: v1
kind: Pod
metadata:
  name: werf-converge
  annotations:
    "container.apparmor.security.beta.kubernetes.io/werf-converge": "unconfined"
spec:
  serviceAccount: werf
  automountServiceAccountToken: true
  restartPolicy: Never
  containers:
  - name: werf-converge
    image: registry.werf.io/werf/werf
    args:
      - "sh"
      - "-ec"
      - |
        git clone --depth 1 https://github.com/werf/quickstart-application.git $HOME/quickstart-application &&
        cd $HOME/quickstart-application &&
        werf converge --release quickstart-application --repo CONTAINER_REGISTRY_REPO
    env:
      - name: WERF_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
    volumeMounts:
      - mountPath: /home/build/.docker/
        name: registrysecret
  volumes:
    - name: registrysecret
      secret:
        secretName: registrysecret
        items:
          - key: .dockerconfigjson
            path: config.json

Создайте pod и разверните приложение в соответствующем пространстве имен:

kubectl -n quickstart-application apply -f werf-converge.yaml
kubectl -n quickstart-application logs -f werf-converge

Ядро Linux без поддержки OverlayFS в режиме rootless и использование привилегированного контейнера

Команда werf converge будет выполняться в специальном Pod’е. Обратите внимание, что CONTAINER_REGISTRY_REPO следует заменить на реальный адрес репозитория реестра контейнеров, для которого на предыдущем шаге мы настраивали registrysecret.

# werf-converge.yaml
apiVersion: v1
kind: Pod
metadata:
  name: werf-converge
spec:
  serviceAccount: werf
  automountServiceAccountToken: true
  restartPolicy: Never
  containers:
  - name: werf-converge
    image: registry.werf.io/werf/werf
    securityContext:
      privileged: true
    args:
      - "sh"
      - "-ec"
      - |
        git clone --depth 1 https://github.com/werf/quickstart-application.git $HOME/quickstart-application &&
        cd $HOME/quickstart-application &&
        werf converge --release quickstart-application --repo CONTAINER_REGISTRY_REPO
    env:
      - name: WERF_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
    volumeMounts:
      - mountPath: /home/build/.docker/
        name: registrysecret
  volumes:
    - name: registrysecret
      secret:
        secretName: registrysecret
        items:
          - key: .dockerconfigjson
            path: config.json

Создайте pod и разверните приложение в соответствующем пространстве имен:

kubectl -n quickstart-application apply -f werf-converge.yaml
kubectl -n quickstart-application logs -f werf-converge

Ядро Linux без поддержки OverlayFS в режиме rootless и использование непривилегированного контейнера

Команда werf converge будет выполняться в специальном Pod’е. Обратите внимание, что CONTAINER_REGISTRY_REPO следует заменить на реальный адрес репозитория реестра контейнеров, для которого на предыдущем шаге мы настраивали registrysecret.

# werf-converge.yaml
apiVersion: v1
kind: Pod
metadata:
  name: werf-converge
  annotations:
    "container.apparmor.security.beta.kubernetes.io/werf-converge": "unconfined"
spec:
  serviceAccount: werf
  automountServiceAccountToken: true
  restartPolicy: Never
  containers:
  - name: werf-converge
    image: registry.werf.io/werf/werf
    resources:
      limits:
        github.com/fuse: 1
    args:
      - "sh"
      - "-ec"
      - |
        git clone --depth 1 https://github.com/werf/quickstart-application.git $HOME/quickstart-application &&
        cd $HOME/quickstart-application &&
        werf converge --release quickstart-application --repo CONTAINER_REGISTRY_REPO
    env:
      - name: WERF_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
    volumeMounts:
      - mountPath: /home/build/.docker/
        name: registrysecret
  volumes:
    - name: registrysecret
      secret:
        secretName: registrysecret
        items:
          - key: .dockerconfigjson
            path: config.json

Создайте pod и разверните приложение в целевом пространстве имен:

kubectl -n quickstart-application apply -f werf-converge.yaml
kubectl -n quickstart-application logs -f werf-converge

Устранение проблем

Если у вас возникли какие-либо сложности, пожалуйста, обратитесь к разделу Устранение проблем