3 min read | by Jordi Prats
On ArgoCD an Application is a group of resources defined from a given source, for example, a helm chart. To create it we can use the argocd cli tool or create it declaratively as any other Kubernetes object using a manifest
Since we are going to retrieve the helm chart from a git repository, first we will have to create a Secret with some credentials to be able to retrieve it (if needed). On this example we are going to use github's possibility to create some Deploy keys (ssh key) to be able to get the repository.
Assuming we have the private key on the following path ~/.ssh/deploy_key.private_key for the git repository git@github.com:jordiprats/helm-pet2cattle.git, we can create the secret like this:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
annotations:
managed-by: argocd.argoproj.io
labels:
argocd.argoproj.io/secret-type: repository
name: github-helm-pet2cattle
namespace: argocd
type: Opaque
data:
insecure: $(echo -n false | base64)
project: $(echo -n default | base64)
sshPrivateKey: $(base64 -w0 ~/.ssh/deploy_key.private_key)
type: $(echo -n git | base64)
url: $(echo -n ssh://git@github.com:jordiprats/helm-pet2cattle.git | base64)
EOF
With this secret available, ArgoCD we will be able to retrieve the helm chart from the repository using the ssh key we are specifying.
At this point we can now create the Application definition. We will need to specify:
Using spec.source we can set where do we want to fetch the helm chart from. On the following example we are retrieving the tag 3.5 from the git@github.com:jordiprats/helm-pet2cattle.git repository.
We can specify any values we want to set for the helm chart using spec.source.helm.values:
spec:
source:
repoURL: ssh://git@github.com:jordiprats/helm-pet2cattle.git
path: .
targetRevision: 3.5
helm:
values: |
ingress:
enabled: true
ArgoCD can be configured to deploy to multiple Kubernetes clusters, on this example we are going to use the local kubernetes cluster where ArgoCD is currently installed.
Using spec.destination.namespace we can deploy to any namespace:
spec:
destination:
server: https://kubernetes.default.svc
namespace: pet2cattle
With the spec.syncPolicy we can specify how ArgoCD is going to handle changes on the source repository. For this example we have configured an automated sync with self heal and prune enabled.
We can also configure it so that if the target namespace does not exist it will create it:
spec:
syncPolicy:
automated:
selfHeal: true
prune: true
syncOptions:
- CreateNamespace=true
Putting all the pieces together the application will look like this:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: blog
namespace: argocd
spec:
project: default
source:
repoURL: ssh://git@github.com:jordiprats/helm-pet2cattle.git
path: .
targetRevision: 3.5
helm:
values: |
ingress:
enabled: true
destination:
server: https://kubernetes.default.svc
namespace: pet2cattle
syncPolicy:
automated:
selfHeal: true
prune: true
syncOptions:
- CreateNamespace=true
At this point we just need to apply this manifest to deploy this application. We can use kubectl get application to get it's current status:
$ kubectl get application -n argocd
NAME SYNC STATUS HEALTH STATUS
blog Synced Healthy
Posted on 06/06/2022