Инсталляция ArgoCD на Kind с помощью Helm


Делаю:
2026.01.28


https://artifacthub.io/packages/helm/argo-cd-oci/argo-cd

Актуальная версия: 9.3.7


Взято в книге: [Book][Andrew Block, Christian Hernandez] Argo CD: Up and Running: A Hands-On Guide to GitOps and Kubernetes [ENG, 2025]


Установить Argo CD CLI


Запустить kind

$ cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    - containerPort: 443
      hostPort: 443
      protocol: TCP
EOF


$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   55s   v1.34.0


$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update


$ cd ~/tmp


$ cat > values-ingress-nginx.yaml <<EOF
controller:
  service:
    type: NodePort
  hostPort:
    enabled: true
  updateStrategy:
    type: Recreate
EOF


$ helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --values values-ingress-nginx.yaml


// Дожидаемся запуска pod
$ kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s


$ kubectl get pods -n ingress-nginx
NAME                                       READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-c98c9b6d4-gs5rz   1/1     Running   0          67s


$ kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.96.27.157    <none>        80:31117/TCP,443:30497/TCP   2m6s
ingress-nginx-controller-admission   ClusterIP   10.96.244.156   <none>        443/TCP                      2m6s


// OK!
$ curl http://127.0.0.1
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>


Инсталляция argocd


$ helm repo add argo \
    https://argoproj.github.io/argo-helm


// Посмотреть какие версии есть
$ helm repo add argo/argo-cd --versions


$ cat > values-argocd-ingress.yaml <<EOF
server:
  ingress:
    enabled: true
    hostname: argocd.k8s.local
    ingressClassName: nginx
  extraArgs:
  - --insecure
EOF


// Сделано заранее
// $ kubectl get pods -n argocd -o jsonpath='{.items[*].spec.containers[*].image} {.items[*].spec.initContainers[*].image}' | tr ' ' '\n' | grep -v '^$' | sort -u

Тот, что с ecr-public.aws.com прям вообще долго качается. Заменим его.

ecr-public.aws.com/docker/library/redis:8.2.2-alpine
ghcr.io/dexidp/dex:v2.44.0
quay.io/argoproj/argocd:v3.2.6


// Скачаю образы до инсталляции
$ {
  docker pull ghcr.io/dexidp/dex:v2.44.0
  docker pull quay.io/argoproj/argocd:v3.2.6
  docker pull redis:8.2.2-alpine
}


$ helm upgrade argo-cd argo/argo-cd \
  --install \
  --namespace argocd \
  --create-namespace \
  --values values-argocd-ingress.yaml \
  --version 9.3.7


// Прописываю image
$ kubectl set image deployment/argo-cd-argocd-redis redis=redis:8.2.2-alpine


$ {
    TIMEFORMAT="⏱ Прошло времени: %R сек."
    time {
      kubectl wait --namespace argocd \
        --for=condition=ready pod \
        --selector=app.kubernetes.io/instance=argo-cd \
        --timeout=300s && \
        echo "✅ Успех: Все поды ArgoCD запущены!" || \
        (echo "❌ Ошибка: Тайм-аут!"; exit 1)
      }
}


$ kubectl get pods -n argocd
NAME                                                        READY   STATUS    RESTARTS   AGE
argo-cd-argocd-application-controller-0                     1/1     Running   0          10m
argo-cd-argocd-applicationset-controller-586d475675-ch7zs   1/1     Running   0          10m
argo-cd-argocd-dex-server-949d55f49-lrjzw                   1/1     Running   0          10m
argo-cd-argocd-notifications-controller-78c4879795-hl9k2    1/1     Running   0          10m
argo-cd-argocd-redis-9b58f4d5c-jd7dn                        1/1     Running   0          10m
argo-cd-argocd-repo-server-bfc967df4-5lrzv                  1/1     Running   0          10m
argo-cd-argocd-server-678b78f468-j5dkb                      1/1     Running   0          10m


$ kubectl get ingress -n argocd
NAME                    CLASS   HOSTS              ADDRESS   PORTS   AGE
argo-cd-argocd-server   nginx   argocd.k8s.local             80      2s


// Добавить в hosts
$ echo "127.0.0.1 argocd.k8s.local" | sudo tee -a /etc/hosts


$ export ARGOCD_PASSWORD=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
$ echo ${ARGOCD_PASSWORD}


// Подключаюсь в консоли
$ argocd login argocd.k8s.local \
    --insecure \
    --username admin \
    --password $ARGOCD_PASSWORD \
    --grpc-web


// Меняю пароль
$ ARGOCD_PASSWORD_NEW_PASSWORD=ABCDEFGH123
$ argocd account update-password \
    --current-password ${ARGOCD_PASSWORD} \
    --new-password ${ARGOCD_PASSWORD_NEW_PASSWORD}
$ ARGOCD_PASSWORD=${ARGOCD_PASSWORD_NEW_PASSWORD}
$ echo ${ARGOCD_PASSWORD}


// OK!
// admin / ABCDEFGH123
http://argocd.k8s.local


$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   13m   v1.34.0


// Удалить
// $ kind delete cluster