Argo CD

Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.

Architectural Overview - Argo CD - Declarative GitOps CD for Kubernetes

Deploying argo-cd https://argoproj.github.io/argo-cd/getting_started/

Argo components

Lets deploy Argo-Cd in my kubernetes clusters

check the latest tag : https://github.com/argoproj/argo-cd

Ex: https://github.com/argoproj/argo-cd/releases/tag/v2.0.1

I have my local minikube setup already done.

|  ❭ minikube start

😄  minikube v1.20.0 on Darwin 10.15.4

🐳  Preparing Kubernetes v1.20.2 on Docker 20.10.6 …

🏄  Done! kubectl is now configured to use “minikube” cluster and “default” namespace by default

List existing name-spaces

|  ❭ kubens 

  • default
  • ingress-nginx
  • kube-node-lease
  • kube-public
  • kube-system
  • kubernetes-dashboard
  • my-namespace

|  ❭ kubectl create namespace argocd

namespace/argocd created

|  ❭ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.1/manifests/install.yaml

  • customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
  • customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
  • serviceaccount/argocd-application-controller created
  • serviceaccount/argocd-dex-server created
  • serviceaccount/argocd-redis created
  • serviceaccount/argocd-server created
  • role.rbac.authorization.k8s.io/argocd-application-controller created
  • role.rbac.authorization.k8s.io/argocd-dex-server created
  • role.rbac.authorization.k8s.io/argocd-redis created
  • role.rbac.authorization.k8s.io/argocd-server created
  • clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
  • clusterrole.rbac.authorization.k8s.io/argocd-server created
  • rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
  • rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
  • rolebinding.rbac.authorization.k8s.io/argocd-redis created
  • rolebinding.rbac.authorization.k8s.io/argocd-server created
  • clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
  • clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
  • configmap/argocd-cm created
  • configmap/argocd-gpg-keys-cm created
  • configmap/argocd-rbac-cm created
  • configmap/argocd-ssh-known-hosts-cm created
  • configmap/argocd-tls-certs-cm created
  • secret/argocd-secret created
  • service/argocd-dex-server created
  • service/argocd-metrics created
  • service/argocd-redis created
  • service/argocd-repo-server created
  • service/argocd-server created
  • service/argocd-server-metrics created
  • deployment.apps/argocd-dex-server created
  • deployment.apps/argocd-redis created
  • deployment.apps/argocd-repo-server created
  • deployment.apps/argocd-server created
  • statefulset.apps/argocd-application-controller created

|  ❭ kubectl get all -n argocd

  • NAME                                      READY   STATUS    RESTARTS   AGE
  • pod/argocd-application-controller-0       1/1     Running   0          35s
  • pod/argocd-dex-server-66ff89cb7b-rxm6p    1/1     Running   0          35s
  • pod/argocd-redis-759b6bc7f4-gt2hf         1/1     Running   0          35s
  • pod/argocd-repo-server-84d58ff546-w6b4s   1/1     Running   0          35s
  • pod/argocd-server-7fd556c67c-9hh7b        1/1     Running   0          35s
  • NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
  • service/argocd-dex-server       ClusterIP   10.100.46.122    <none>        5556/TCP,5557/TCP,5558/TCP   35s
  • service/argocd-metrics          ClusterIP   10.96.148.16     <none>        8082/TCP                     35s
  • service/argocd-redis            ClusterIP   10.99.61.165     <none>        6379/TCP                     35s
  • service/argocd-repo-server      ClusterIP   10.103.32.177    <none>        8081/TCP,8084/TCP            35s
  • service/argocd-server           ClusterIP   10.109.164.100   <none>        80/TCP,443/TCP               35s
  • service/argocd-server-metrics   ClusterIP   10.110.96.118    <none>        8083/TCP                     35s
  • NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
  • deployment.apps/argocd-dex-server    1/1     1            1           35s
  • deployment.apps/argocd-redis         1/1     1            1           35s
  • deployment.apps/argocd-repo-server   1/1     1            1           35s
  • deployment.apps/argocd-server        1/1     1            1           35s
  • NAME                                            DESIRED   CURRENT   READY   AGE
  • replicaset.apps/argocd-dex-server-66ff89cb7b    1         1         1       35s
  • replicaset.apps/argocd-redis-759b6bc7f4         1         1         1       35s
  • replicaset.apps/argocd-repo-server-84d58ff546   1         1         1       35s
  • replicaset.apps/argocd-server-7fd556c67c        1         1         1       35s
  • NAME                                             READY   AGE
  • statefulset.apps/argocd-application-controller   1/1     35s

In order to access argo-cd UI, you can use ingress,loadbalancer , NodePort . I am going to use nodeport .

Ingress related steps can be found here https://argoproj.github.io/argo-cd/operator-manual/ingress

Just edit service type to Nodeport . using kubectl .

Or you can use Patch to update Type:

kubectl patch svc argocd-server -n argocd -p ‘{“spec”: {“type”: “NodePort”}}’

 ❭ kubectl edit svc argocd-server

|  ❭ kubectl edit svc argocd-server

service/argocd-server edited

|  ❭ kubectl get svc argocd-server

NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE

argocd-server   NodePort   10.109.164.100   <none>        80:32171/TCP,443:31643/TCP   12h

check on which node pod is running . And access the argo-cd using node-port in that node

|  ❭ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
argocd-application-controller-0 1/1 Running 4 12h 172.17.0.7 minikube
argocd-dex-server-66ff89cb7b-rxm6p 1/1 Running 1 12h 172.17.0.12 minikube
argocd-redis-759b6bc7f4-gt2hf 1/1 Running 1 12h 172.17.0.6 minikube
argocd-repo-server-84d58ff546-w6b4s 1/1 Running 4 12h 172.17.0.9 minikube
argocd-server-7fd556c67c-9hh7b 1/1 Running 2 12h 172.17.0.8 minikube

|  ❭ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 3d21h v1.20.2 192.168.64.2 Buildroot 2020.02.12 4.19.182 docker://20.10.6

https://192.168.64.2:32171/

decode initial password:

|  ❭ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=”{.data.password}” | base64 -d
xnHJpKDKnkaKaQSP%

Add repo to fetch Kubernetes manifest .

I gave my test repo where mongo installation config is present

https://github.com/shaikmdrafi/argo-test-deloyment

|  ❭ kubectl create ns argo-mongo

namespace/argo-mongo created

|  ❭ kubectl get all -n argo-mongo

NAME                              READY   STATUS    RESTARTS   AGE

pod/my-mongodb-54b94cb9fb-c5r56   1/1     Running   0          2m17s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/my-mongodb   1/1     1            1           2m17s

NAME                                    DESIRED   CURRENT   READY   AGE

replicaset.apps/my-mongodb-54b94cb9fb   1         1         1       2m17s

|  ❭ kubectl delete deployment my-mongodb -n argo-mongo

deployment.apps “my-mongodb” deleted

After you delete resource it went to outofsync but did not auto Heal . for that you need to enable it

Now even if you delete any resource it will automatically recreates

But if you delete NameSpace we cannot sync it again untill namespace is recreated .

|  ❭ kubectl delete ns argo-mongo

namespace “argo-mongo” deleted

Once it re-check and namespace is available it will re-sync and creates whatever is defined .

Leave a comment