В этом посте я опишу, как использовать ArgoCD на существующем кластере EKS.

Я не буду описывать все шаги, необходимые для настройки ArgoCD, но некоторые проблемы, с которыми я столкнулся.

Этот документация от ArgoCD предоставляет всю информацию о том, как установить ArgoCD в кластер Kubernetes и синхронизировать (развернуть) приложения.

Но я столкнулся с некоторыми проблемами при попытке доступа к API-серверу ArgoCD на EKS, который использует Fargate.

Поскольку модули Fargate разрешено запускать только в частной подсети, мы должны использовать Kubernetes Ingress для маршрутизации запросов из внешнего мира в реальные модули. А с надстройкой AWS Load-Balancer-Controller, когда мы создаем Kubernetes Ingress, он будет предоставлять AWS Application Load Balancer от имени, принимая все запросы на границе.

Вы можете установить надстройку AWS Load-Balancer-Controller следующим образом: эта документация.

Когда мы устанавливаем надстройку ArgoCD и AWS Load-Balancer-Controller в кластер EKS, нам не удастся подключиться к серверу API ArgoCD. Это связано с тем, что модули, на которых запущен ArgoCD API Server, доступны через порт 8080, а группа безопасности, прикрепленная к модулям, по умолчанию не принимает входящие запросы от 8080. Это приводит к сбою проверки работоспособности ALB для целевых групп.

Поэтому нам нужно определить новую группу безопасности для модулей ArgoCD API Server и применить ее.

Для этого вы можете просто следовать эта документация.

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

  • Разрешить входящий запрос на порт 53 (TCP) из группы безопасности кластера EKS.
  • Разрешить входящий запрос на порт 53 (UDP) из группы безопасности кластера EKS.
  • Разрешить входящий запрос на порт 8080 (TCP).

Давайте создадим новую группу безопасности и применим приведенный ниже файл yaml.

# argocd-pod-sg-policy.yaml
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
  name: argo-sgp
  namespace: argocd
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/name: argocd-server
  securityGroups:
    groupIds:
      - ${NEW_CREATED_SECURITY_GROUP_ID}
      - ${EKS_CLUSTER_SECURITY_GROUP_ID}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Давайте применим файл yaml выше и создадим новый SecurityGroupPolicy. Кроме того, эта новая SecurityGroupPolicy не применяется к уже запущенным модулям, поэтому нам необходимо перезапустить все модули ArgoCD API Server.

kubectl delete --all pod -n argocd
Войти в полноэкранный режим

Выйти из полноэкранного режима

Наконец, давайте определим Kubernetes Ingress, который в конечном итоге предоставит новый балансировщик нагрузки приложений AWS.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    alb.ingress.kubernetes.io/load-balancer-name: argocd-alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/subnets: ${PUBLIC_SUBNET_IDS}
    alb.ingress.kubernetes.io/certificate-arn: ${ACM_CERT_ARN}
    alb.ingress.kubernetes.io/security-groups: ${ALB_SECURITY_GROUP}
    alb.ingress.kubernetes.io/backend-protocol: HTTPS
    alb.ingress.kubernetes.io/conditions.argogrpc: |
      [{"field":"http-header","httpHeaderConfig":{"httpHeaderName": "Content-Type", "values":["application/grpc"]}}]
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
spec:
  ingressClassName: alb
  rules:
  - host: dev-argocd.planit-study.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: argogrpc
            port:
              number: 443
        pathType: Prefix
      - path: /
        backend:
          service:
            name: argocd-server
            port:
              number: 443
        pathType: Prefix
Войти в полноэкранный режим

Выйти из полноэкранного режима

В приведенном выше файле yaml мы использовали службу с именем argogrpc.
ArgoCD API Server работает как на gRPC, так и на HTTP/HTTPS.
gRPC используется для обслуживания запросов из интерфейса командной строки ArgoCD, а HTTP/HTTPS — для запросов пользовательского интерфейса (веб).

Идеально создать новую службу, обслуживающую только запросы gRPC, поэтому давайте создадим ее, которая также есть в документации ArgoCD.

apiVersion: v1
kind: Service
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol-version: HTTP2
  labels:
    app.kubernetes.io/name: argocd-server
  name: argogrpc
  namespace: argocd
spec:
  ports:
  - name: "443"
    port: 443
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/name: argocd-server
  sessionAffinity: None
  type: NodePort
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь мы можем успешно получить доступ к API-серверу ArgoCD как через CLI, так и через Web (UI)! Вот и все! Надеюсь, этот пост поможет вам 🙂