Как ссылаться на хост/IP Redis, созданный коннектором конфигурации в GKE из настройки
У меня есть развертывание, которому нужен IP-адрес экземпляра облачного Redis.
Я создаю экземпляр облачного Redis через коннектор конфигурации:
apiVersion: redis.cnrm.cloud.google.com/v1beta1
kind: RedisInstance
metadata:
name: redis-name
annotations:
cnrm.cloud.google.com/project-id: project-id
spec:
region: region
displayName: Cloud Redis
tier: BASIC
memorySizeGb: 1
authorizedNetworkRef:
external: projects/project-id/global/networks/network-name
У меня есть развертывание, в которое я хочу добавить это через переменную окружения.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-name
spec:
template:
spec:
containers:
- name: web
env:
- name: REDIS_HOST
value: "needs to be replaced"
Я пытался заменить его несколькими способами, но безуспешно.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-namespace
bases:
- ../../base
replacements:
- source:
kind: RedisInstance
name: redis-name
namespace: my-namespace
fieldPath: status.host
Я получаю ошибку
fieldPath `status.host` is missing for replacement source RedisInstance.[noVer].[noGrp]/redis-name.my-namespace
Я также пробовал с
vars:
- name: REDIS_HOST
objref:
kind: RedisInstance
name: redis-name
apiVersion: redis.cnrm.cloud.google.com/v1beta1
fieldref:
fieldpath: status.host
Я предполагаю, что это невозможно сделать, потому что статус не существует, пока ресурс не станет «живым». Есть ли лучший способ сделать это?
В Terraform я смогу ссылаться на существующий ресурс. Кажется, в Kustomize это невозможно?
2 ответа
Недавно мне пришлось сделать что-то подобное. Вы можете создать задание PostSync , которое запускаетсяkubectl get redisinstance <your redisinstance name> -o json | jq -r .status.host
и внедрите его в манифест живого развертывания через карту конфигурации. В конце концов, экземпляр Redis является ресурсом K8s в Config Connector. Задание необходимо будет запустить с учетной записью службы K8s, привязанной к учетной записи службы GCP через идентификатор рабочей нагрузки и заданнойget
разрешение наredisinstances
в группе APIredis.cnrm.cloud.google.com
иcreate
иupdate
разрешение наconfigmaps
.
Вот еще один способ ссылки на хост/IP Redis, созданный коннектором конфигурации в GKE из настройки.
1.Создайте настройку с помощьюREDIS_HOST
окружение
# cat overlays/test/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: default
bases:
- ../../base/
replacements:
- source:
kind: RedisInstance
name: redis-test
namespace: default
fieldPath: status.host
targets:
- select:
name: hello
fieldPaths:
- spec.template.spec.containers.[name=hello].env.[name=REDIS_HOST].value
Примечание . Указанный выше yaml работает только в том случае, если у cat base/redis.yaml есть status.host.
2. Это экземпляр Redis, имеющий ниже yaml:
spec:
authorizedNetworkRef:
external: projects/gkeprivate/global/networks/default
connectMode: DIRECT_PEERING
displayName: Cloud Redis
locationId: us-central1-b
memorySizeGb: 1
persistenceConfig:
persistenceMode: DISABLED
readReplicasMode: READ_REPLICAS_DISABLED
redisVersion: REDIS_6_X
region: us-central1
resourceID: redis-test
tier: BASIC
transitEncryptionMode: DISABLED
status:
conditions:
- lastTransitionTime: "2023-06-28T10:57:44Z"
message: The resource is up to date
reason: UpToDate
status: "True"
type: Ready
createTime: "2023-06-28T10:53:23.758110949Z"
currentLocationId: us-central1-b
host: 10.34.137.179
nodes:
- id: node-0
zone: us-central1-b
Ваш yaml не работает, потому что изначально манифест RedisInstance не имеет status.host, и вы не можете определить его при создании манифеста RedisInstance.
3. Файл развертывания:
# cat base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
labels:
app: hello
spec:
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: ubuntu
env:
- name: REDIS_HOST
value: "needs to be replaced"
command:
- sleep
- infinity
4. Наконец-то я вижу среду REDIS_HOST внутри POD.
root@hello-cc98748c4-kfw99:/# env | grep RED
REDIS_HOST=10.34.137.17
Я не вижу никакого выхода, который вы могли бы предоставитьREDIS_HOST env
если вы не создадите ресурс Redis, а затем обновите redis.yaml (kubectl get redisinstance -o yaml > ../../base/redis.yaml
) тогда только кажется возможным поставить как env