Skip to content

Pulse via GitOps

Pulse
Sample app in this lab — HTTP service monitor with dashboard, API, and Kubernetes health probes.
is not installed with raw kubectl apply on the Deployment. Managed Argo CD
Argo CD — GitOps controller that syncs cluster state from Git repositories.
syncs pulse-deploy from CodeCommit
AWS managed Git hosting — GitHub alternative used for app source and deploy manifests in this lab.
— same Application pattern as kpack via GitOps and Kueue via GitOps.

This page is stage 3 · App from the architecture overview stages diagram: Application pulse (path: .) — Deployment, Service, and pods. Not the kpack Image CR also named pulse.

Work from the repository root (paths below use demo/…).

  • kpack via GitOps — cluster registered for Argo CD, Application kpack Synced/Healthy, pulse:main in ECR
    Amazon Elastic Container Registry — stores OCI images built by kpack; EKS pulls from here.
    (or expect ImagePullBackOff until the build finishes)
  • CodeCommit publishpulse-deploy has main (root Kustomize: base/ only)

Cluster registration (in-cluster secret + access policy) was completed on the kpack page. Re-apply those steps only if you skipped that page.

Terminal window
export AWS_PROFILE=sandbox
export AWS_PAGER=""
export AWS_REGION=ap-southeast-2
export CLUSTER_NAME=cluster-1
export CODECOMMIT_DEPLOY=pulse-deploy
export CLUSTER_ARN=$(aws eks describe-cluster \
--name "$CLUSTER_NAME" \
--region "$AWS_REGION" \
--query 'cluster.arn' \
--output text)
export CODECOMMIT_DEPLOY_URL="https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${CODECOMMIT_DEPLOY}"
echo "CLUSTER_ARN=$CLUSTER_ARN"

Destination server must be the EKS cluster ARN. Do not use destination.name: in-cluster alone (managed Argo CD will not sync that way):

Terminal window
mkdir -p demo/.generated/argocd
cat > demo/.generated/argocd/application.yaml <<EOF
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: pulse
namespace: argocd
spec:
project: default
source:
repoURL: ${CODECOMMIT_DEPLOY_URL}
targetRevision: main
path: .
destination:
server: ${CLUSTER_ARN}
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
EOF
kubectl apply -f demo/.generated/argocd/application.yaml
kubectl -n argocd get application pulse

Right after create, SYNC STATUS / HEALTH STATUS may be blank for a few seconds while Argo CD reconciles.

Terminal window
kubectl -n argocd get application pulse -o wide
kubectl -n argocd get applications -o wide
kubectl -n default get deploy,svc,pods -l app.kubernetes.io/name=pulse

Typical sequence (often under a minute when pulse:main is already in ECR):

  1. Application Synced / Progressing, then Healthy — revision matches Application kpack (same pulse-deploy main)
  2. In default: Deployment pulse, LoadBalancer Service pulse, ConfigMap pulse-config, pod Ready
  3. You have two Applications on pulse-deploy: kpack (path: kpack) and pulse (path: .)

Optional wait:

Terminal window
kubectl -n default wait deploy/pulse --for=condition=available --timeout=5m
kubectl -n argocd get applications -o wide

Confirm in the Argo CD UI: cluster cluster-1 → Capabilities → lab-argocd → Applications kpack and pulse.

LoadBalancer hostname (for Verify the service):

Terminal window
kubectl -n default get svc pulse -o jsonpath='{.status.loadBalancer.ingress[0].hostname}{"\n"}'

CNB lifecycle — then Verify the service.