- Infrastructure as code (IaC)
- Merge/ pull requests as change agent
- Continuous Delivery tool (Example: Argo CD)
Basically you keep all your application deployment manifests in a Git repository. And, if you like to make changes to your application, you create a merge/ pull request. Once it is approved and merged to the main branch a continuous delivery/ deployment tool like Argo CD will identify that and deploys the latest change to the target Kubernetes cluster. Here I am using a Tanzu Kubernetes Cluster with 1 control plane node and 3 worker nodes. I will be deploying Argo CD as well as my application on this K8s cluster.
❯ kubectl get node
NAME STATUS ROLES AGE VERSION
gc-control-plane-rhpmq Ready control-plane,master 34d v1.21.6+vmware.1
gc-workers-kfx7q-589888f77b-692n5 Ready <none> 34d v1.21.6+vmware.1
gc-workers-kfx7q-589888f77b-jfzrs Ready <none> 34d v1.21.6+vmware.1
gc-workers-kfx7q-589888f77b-xvjsh Ready <none> 34d v1.21.6+vmware.1
Lets create a namespace first.
❯ kubectl create namespace argocd
namespace/argocd created
❯ kubectl apply -f https://gist.githubusercontent.com/vineethac/dafa5b47afd674a1a9f7be2ce773a2bd/raw/4591e837098043b8095a5c48614e1c94b5ca2b44/tkg-psp.yml
clusterrole.rbac.authorization.k8s.io/psp:privileged created
clusterrolebinding.rbac.authorization.k8s.io/all:psp:privileged created
Following yaml file will install Argo CD:
❯ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
❯ kubectl get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 20h
pod/argocd-applicationset-controller-5f7d8fffb7-82xgp 1/1 Running 0 20h
pod/argocd-dex-server-75f7cff9cd-7vc64 1/1 Running 0 20h
pod/argocd-notifications-controller-69bf646f87-8bt5n 1/1 Running 0 20h
pod/argocd-redis-748569f956-bskfw 1/1 Running 0 19h
pod/argocd-repo-server-8699756b5d-7qmx2 1/1 Running 0 20h
pod/argocd-server-6dd9cd7964-gbfm4 1/1 Running 0 20h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.106.103.231 <none> 7000/TCP,8080/TCP 20h
service/argocd-dex-server ClusterIP 10.103.79.207 <none> 5556/TCP,5557/TCP,5558/TCP 20h
service/argocd-metrics ClusterIP 10.105.254.212 <none> 8082/TCP 20h
service/argocd-notifications-controller-metrics ClusterIP 10.97.254.140 <none> 9001/TCP 20h
service/argocd-redis ClusterIP 10.97.244.161 <none> 6379/TCP 20h
service/argocd-repo-server ClusterIP 10.101.181.242 <none> 8081/TCP,8084/TCP 20h
service/argocd-server ClusterIP 10.105.76.149 <none> 80/TCP,443/TCP 20h
service/argocd-server-metrics ClusterIP 10.100.168.241 <none> 8083/TCP 20h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-applicationset-controller 1/1 1 1 20h
deployment.apps/argocd-dex-server 1/1 1 1 20h
deployment.apps/argocd-notifications-controller 1/1 1 1 20h
deployment.apps/argocd-redis 1/1 1 1 20h
deployment.apps/argocd-repo-server 1/1 1 1 20h
deployment.apps/argocd-server 1/1 1 1 20h
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-applicationset-controller-5f7d8fffb7 1 1 1 20h
replicaset.apps/argocd-dex-server-75f7cff9cd 1 1 1 20h
replicaset.apps/argocd-notifications-controller-69bf646f87 1 1 1 20h
replicaset.apps/argocd-redis-748569f956 1 1 1 19h
replicaset.apps/argocd-repo-server-8699756b5d 1 1 1 20h
replicaset.apps/argocd-server-6dd9cd7964 1 1 1 20h
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 20h
Lets port forward, so that you can access the Argo CD web UI.
❯ kubectl port-forward -n argocd service/argocd-server 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Now you can access Argo CD in your web browser at https://localhost:8080/
username: admin
password: you can decode it from the following secret
❯ kubectl get secret argocd-initial-admin-secret -n argocd -o yaml
apiVersion: v1
data:
password: TTFSRXJJZ0NKbHc2Y2JINA==
kind: Secret
metadata:
creationTimestamp: "2022-06-22T13:00:14Z"
name: argocd-initial-admin-secret
namespace: argocd
resourceVersion: "39224285"
uid: d3b7c82e-0c92-4418-95eb-95a73fe674b6
type: Opaque
❯ echo TTFSRXJJZ0NKbHc2Y2JINA== | base64 --decode
Following is a screenshot of my repo:
We have the application.yaml file and then inside the dev folder I have two yaml files.
Now, we also have the application yaml file. Make sure to paste your git repo url in the repoURL field.
Note: If you using a private repo, then you need to add your repository to Argo CD first and connect with respective credentials.
> kubectl apply -f /Users/vineetha/myrepo/argocd/application.yaml
Once the application yaml is applied, after few seconds you can see nginx pod and svc getting deployed automatically under myapp namespace.
❯ kubectl get pods,deployment,svc -n myapp
NAME READY STATUS RESTARTS AGE
pod/my-nginx-74d7c6cb98-tzdfp 1/1 Running 0 2d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/my-nginx 1/1 1 1 2d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx ClusterIP 10.109.67.35 <none> 80/TCP 2d
Hope it was useful. Cheers!
Reference video by Nana https://twitter.com/Njuchi_