Как ссылаться на хост/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

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