Setup Argocd with extra cluster and git integrated
Create Main Cluster
Setup the Data
export ORG_CONTROL_PLANE_K8S=main
clusterName=$ORG_CONTROL_PLANE_K8S
kind delete cluster --name=${clusterName}
apiServerPort=6443
cat << EOF > ${clusterName}-cluster-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: ${clusterName}
networking:
apiServerAddress: "0.0.0.0"
apiServerPort: $apiServerPort
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 443
hostPort: 443
listenAddress: "0.0.0.0"
- containerPort: 80
hostPort: 80
listenAddress: "0.0.0.0"
EOF
kind create cluster --config ${clusterName}-cluster-config.yaml --kubeconfig ./kubeconfig
cat kubeconfig | sed "s|https://:${apiServerPort}|https://0.0.0.0:${apiServerPort}|g" > ./config
kind get kubeconfig --name=${clusterName} | sed "s|https://:${apiServerPort}|https://${clusterName}-control-plane:6443|g" > ${clusterName}-config
Install Ingress Controller haproxy
helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts
helm upgrade --install ingress haproxy-ingress/haproxy-ingress -n ingress-controller --create-namespace --set controller.hostNetwork=true --set controller.ingressClassResource.enabled=true
export DOMAIN=10.157.53.176.nip.io
export INGRESS_CLASS=haproxy
Install ArgoCD and Argocd Ingress
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
cat<<EOF >argocd-values.yaml
configs:
params:
server.insecure: true
EOF
helm upgrade --install root argo/argo-cd -n argocd -f argocd-values.yaml --create-namespace
kubectl wait --for=condition=Ready -n argocd pod -l app.kubernetes.io/name=argocd-server
#kubectl create ingress argocd --rule="argocd.${DOMAIN}/=root-argocd-server:8080" -n argocd
ARGOCDURL=argocd.${DOMAIN}
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
name: argocd
namespace: argocd
spec:
ingressClassName: haproxy
rules:
- host: $ARGOCDURL
http:
paths:
- backend:
service:
name: root-argocd-server
port:
number: 443
path: /
pathType: Prefix
tls:
- hosts:
- $ARGOCDURL
EOF
Add git repo
Prepare the values
export MY_GIT_NAME={name}
export MY_GIT_USER={user}
export MY_GIT_TOKEN={token}
export MY_GIT_URL={url}
cat<<EOF | kubectl create -f -
apiVersion: v1
kind: Secret
metadata:
name: ${MY_GIT_NAME}-https-creds
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repo-creds
stringData:
type: git
url: ${MY_GIT_URL}
username: ${MY_GIT_USER}
password: ${MY_GIT_TOKEN}
EOF
Create Edge Cluster
Setup the data
clusterName=edge-1 #Change me
kind delete cluster --name=${clusterName}
apiServerPort=6444 # change me
cat << EOF > ${clusterName}-cluster-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: ${clusterName}
networking:
apiServerAddress: "0.0.0.0"
apiServerPort: $apiServerPort
nodes:
- role: control-plane
EOF
kind create cluster --config ${clusterName}-cluster-config.yaml --kubeconfig ./kubeconfig
cat kubeconfig | sed "s|https://:${apiServerPort}|https://0.0.0.0:${apiServerPort}|g" > ./config
kind get kubeconfig --name=${clusterName} | sed "s|https://:${apiServerPort}|https://${clusterName}-control-plane:6443|g" > ${clusterName}-config
Create The Service Account argocd
# Connect to EDGE cluster
#!/bin/bash
echo "Create the Service Account"
kubectl create sa argocd-manager -n kube-system
cat<<EOF | kubectl create -f -
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: argocd-manager
namespace: kube-system
annotations:
kubernetes.io/service-account.name: "argocd-manager"
EOF
Create Cluster Role Binding argocd-cluster-admin
# Note Cluster Admin is a full permission (we can check alternative https://github.com/argoproj/argo-cd/issues/5389)
echo "Create the rolebinding"
kubectl create clusterrolebinding --clusterrole=cluster-admin --serviceaccount=kube-system:argocd-manager argocd-manager-role
caData=$(kubectl config view --raw -o jsonpath="{.clusters[0].cluster.certificate-authority-data}")
token=$(kubectl create token argocd-manager -n kube-system --duration=9999h)
server=$(kubectl config view --raw -o jsonpath="{.clusters[0].cluster.server}")
name=$(kubectl config view --raw -o jsonpath="{.clusters[0].name}")
Connect extra cluster and deploy application
Add the EDGE cluster
cat<<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: ${name}-cluster-secret
namespace: argocd
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: ${name}
server: ${server}
config: |
{
"bearerToken": "${token}",
"tlsClientConfig": {
"insecure": false,
"caData": "${caData}"
}
}
EOF
Deploy the Demo Argocd Application
Deploy the applicationcat<<EOF | kubectl apply -n argocd -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: 'demo-app'
spec:
destination:
server: $SERVER
namespace: default
source:
path: sample-app
repoURL: https://github.com/naren4b/demo-app.git
targetRevision: HEAD
project: default
syncPolicy:
automated: {}
EOF