Как я могу создать пространство имен с помощью 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
ключевое слово (документ здесь).