Using Alauda Container Platform Registry in Kubernetes Clusters

Реестр Alauda Container Platform (ACP) обеспечивает безопасное управление образами контейнеров для рабочих нагрузок Kubernetes.

Содержание

Registry Access Guidelines

  • Рекомендуется использовать внутренний адрес: Для образов, хранящихся в реестре кластера, всегда отдавайте предпочтение внутреннему сервисному адресу internal-docker-registry.cpaas-system.svc при развертывании внутри кластера. Это обеспечивает оптимальную сетевую производительность и избегает ненужной внешней маршрутизации.
  • Использование внешнего адреса: Внешний ingress-домен (например, registry.cluster.local) предназначен в первую очередь для:
    • загрузки/выгрузки образов из вне кластера (например, с машин разработчиков, систем CI/CD)
    • операций вне кластера, требующих доступа к реестру

Deploy Sample Application

  1. Создайте приложение с именем my-app в пространстве имён my-ns.
  2. Сохраните образ приложения в реестре по адресу internal-docker-registry.cpaas-system.svc/my-ns/my-app:v1.
  3. По умолчанию ServiceAccount в каждом пространстве имён автоматически настраивается с imagePullSecret для доступа к образам из internal-docker-registry.cpaas-system.svc.

Пример Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-ns
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: main-container
        image: internal-docker-registry.cpaas-system.svc/my-ns/my-app:v1
        ports:
        - containerPort: 8080

Cross-Namespace Access

Чтобы разрешить пользователям из my-ns вытягивать образы из shared-ns, администратор shared-ns может создать role binding для предоставления необходимых прав.

Example Role Binding

# Доступ к образам из другого пространства имён (требуются права)
kubectl create rolebinding cross-ns-pull \
  --clusterrole=system:image-puller \
  --serviceaccount=my-ns:default \
  -n shared-ns

Best Practices

  • Использование реестра: Всегда используйте internal-docker-registry.cpaas-system.svc для развертываний, чтобы обеспечить безопасность и производительность.
  • Изоляция пространств имён: Используйте изоляцию пространств имён для лучшей безопасности и управления образами.
    • Используйте пути образов, основанные на пространстве имён: internal-docker-registry.cpaas-system.svc/<namespace>/<image>:<tag>.
  • Контроль доступа: Используйте role bindings для управления доступом между пространствами имён для пользователей и сервисных аккаунтов.

Verification Checklist

  1. Проверьте доступность образа для ServiceAccount по умолчанию в my-ns:
    kubectl auth can-i get images.registry.alauda.io --namespace my-ns --as=system:serviceaccount:my-ns:default
  2. Проверьте доступность образа для пользователя в my-ns:
    kubectl auth can-i get images.registry.alauda.io --namespace my-ns --as=<username>

Troubleshooting

  • Ошибки при загрузке образа: Проверьте imagePullSecrets в спецификации pod и убедитесь, что они настроены корректно.
  • Отказ в доступе: Убедитесь, что у пользователя или ServiceAccount есть необходимые role bindings в целевом пространстве имён.
  • Проблемы с сетью: Проверьте сетевые политики и конфигурации сервисов, чтобы обеспечить подключение к внутреннему реестру.
  • Сбои DNS: Проверьте содержимое файла /etc/hosts на узле, убедитесь, что разрешение DNS для internal-docker-registry.cpaas-system.svc настроено правильно.
    • Проверьте конфигурацию /etc/hosts узла для корректного разрешения DNS internal-docker-registry.cpaas-system.svc
    • Пример отображения сервиса реестра (ClusterIP сервиса internal-docker-registry):
      # /etc/hosts
      127.0.0.1   localhost localhost.localdomain
      10.4.216.11 internal-docker-registry.cpaas-system internal-docker-registry.cpaas-system.svc internal-docker-registry.cpaas-system.svc.cluster.local # cpaas-generated-node-resolver
    • Как получить текущий ClusterIP internal-docker-registry:
      kubectl get svc -n cpaas-system internal-docker-registry -o jsonpath='{.spec.clusterIP}'