Как я могу создать пространство имен с помощью Kustomize?

У меня есть простой проект, который использует Kustomize, как это:

base/
  namespace.yaml
  kustomization.yaml
  service.yaml

С участием kustomization.yaml является:

resources:
  - namespace.yaml
  - service.yaml
namespace: my_wanted_namespace

А также namespace.yaml является:

apiVersion: v1
kind: Namespace
metadata:
  name: default

Проблема в том, что когда я делаю: kustomize build ./base

У меня есть это:

apiVersion: v1
kind: Namespace
metadata:
  name: default

Как я могу иметь

apiVersion: v1
kind: Namespace
metadata:
  name: my_wanted_namespace

Благодарю.

6 ответов

Если вы хотите создать свое пространство имен с помощью kustomize, ваш файл kustomize должен выглядеть следующим образом. Он должен использовать пространство имен.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-wanted-namespace
resources:
- ./namespace.yml

И ваш файл пространства имен должен быть нормальным развертыванием пространства имен следующим образом:

apiVersion: v1
kind: Namespace
metadata:
  name: my-wanted-namespace

В качестве альтернативы ответу Хадриена у меня также работал JSON Patch:

namespace: my-wanted-namespace
patchesJSON6902:
- target:
    version: v1
    kind: Namespace
    name: base-namespace
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-wanted-namespace

Ключ этого метода - преобразование базы Namespace имя, чтобы точно соответствовать namespace введите накладку kustomization.yaml файл.

Старый пост, но приведенные выше ответы сложнее, чем нужно.

В kustomization.yaml

      apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: my-desired-namespace
resources:
- namespace.yaml

И в namespace.yaml

      apiVersion: v1
kind: Namespace
metadata:
  name: intentionally.broken.namespace

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

Старый пост, но у меня есть еще один пример для будущих странников.

В вашей базе вы можете объявить пространство имен с помощью namespace.yaml. Т.е. это будет значение по умолчанию.

      base/
  namespace.yaml
  kustomization.yaml
  ...

Примерbase/namespace.yamlсодержание:

      apiVersion: v1
kind: Namespace
metadata:
  name: default

При использовании PatchTransformer для обновления значения пространства имен по умолчанию без создания ресурса пространства имен в каждом каталоге наложения.

Примерoverlay/kustomization.yamlсодержание:

      namespace: my-wanted-namespace

resources:
- ../base

patches:
- target:
    kind: Namespace
    name: default
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-wanted-namespace

По моему опыту, самый простой ответ таков:

в базе

  • НЕ включайте пространство имен.yaml
  • НЕ добавляйте пространство имен к своим ресурсам

в оверлее или среде

  • добавьте namespace.yaml, если вам нужно создать выделенное пространство имен
  • добавитьnamespace: my-nameк kustomization.yaml в вашем оверлее

структура папок

так что структура такая

      base/
 - service.yaml
 - ...
 - kustomization.yaml
overlays/
 - some-overlay/
   - namespace.yaml # (optional) can be defined here
   - kustomization.yaml
environments/
 - environment-1/
   - namespace.yaml # or define it here
   - kustomization.yaml # with namespace: my-name

вы можете видеть вkustomize build .вывод среды о том, что все ресурсы правильно привязаны к пространству имен.

для справки:

      # kustomization.yaml in environment
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: my-namespace

bases:
- ../base/

resources:
- namespace.yaml

См. документацию здесь: https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/namespace/

Чтобы иметь возможность создавать пространство имен на лету и использовать его для других ресурсов, которые Kustomize настраивает, вы можете использовать этот трюк:


namespace=${1:-"my-namespace-meaning"}

rm -rf ./base
mkdir ./base

cat <<EOF > ./base/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: suffix
EOF

cat <<EOF > ./base/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: docker-registry
  labels:
    name: docker-registry
spec:
  ports:
    - port: 5001
      targetPort: 5000
  selector:
    name: docker-registry
  type: ClusterIP
EOF

cat <<EOF > ./base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-registry
  template:
    metadata:
      labels:
        app: docker-registry
    spec:
      containers:
        - name: docker-registry
          image: registry
          ports:
            - containerPort: 5000
          resources:
            limits:
              memory: 200Mi
              cpu: 300m
            requests:
              memory: 100Mi
              cpu: 100m
EOF

cat <<EOF > ./kustomization.yaml
namePrefix: "${namespace}-"

namespace: "${namespace}-suffix"

resources:
- base/deployment.yaml
- base/namespace.yaml
- base/service.yaml
EOF

kubectl kustomize ./

Запуск этого скрипта выведет:

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace-meaning-suffix
---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: docker-registry
  name: my-namespace-meaning-docker-registry
  namespace: my-namespace-meaning-suffix
spec:
  ports:
  - port: 5001
    targetPort: 5000
  selector:
    name: docker-registry
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-namespace-meaning-docker-registry
  namespace: my-namespace-meaning-suffix
spec:
  replicas: 1
  selector:
    matchLabels:
      app: docker-registry
  template:
    metadata:
      labels:
        app: docker-registry
    spec:
      containers:
      - image: registry
        name: docker-registry
        ports:
        - containerPort: 5000
        resources:
          limits:
            cpu: 300m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi

Идея состоит в том, чтобы сначала использовать namePrefixключевое слово (документ здесь), чтобы детерминированно определить значение пространства имен после настройки. Затем это настраиваемое пространство имен можно использовать для каждого другого ресурса благодаряnamespaceключевое слово (документ здесь).

Другие вопросы по тегам