Kubernetes helm charts and support tools.
.
├── helm/
│ ├── charts/
│ │ ├── api/ # API service chart
│ │ ├── echo/ # Echo server chart
│ │ ├── ingress/ # Ingress controller chart
│ │ ├── teams-auth/ # Teams authentication chart
│ │ └── vue-web/ # Vue web frontend chart
├── index.yaml # Helm repository index file
├── update-helm-repo.sh # Script to update the Helm repository
├── architecture-diagram.md # High-level architecture diagram
├── detailed-architecture-diagram.md # Detailed architecture diagram
├── kubernetes-resources-diagram.md # Kubernetes resources diagram
├── helm-chart-tdd.md # Test-Driven Development approach for Helm charts
└── tests/ # Test scripts for Helm charts
├── unit/ # Unit tests for Helm charts
└── integration/ # Integration tests for Helm charts
The architecture consists of:
-
MetalLB Layer 2 Load Balancers:
- Primary API Load Balancer
- Secondary API Load Balancer
- Admin Load Balancer
-
Nginx Ingress Controllers:
- These receive traffic from the load balancers
-
Ingress Resources:
- API Ingress (routes to API services)
- Admin Ingress (routes to Admin services)
- Vue-Web Ingress (routes to frontend)
-
Services:
- Curri API Service
- Admin Service
- Traceroute Service
- Vue-Web Service
-
Deployments/Pods:
- API Worker Pods
- Admin Pods
- Traceroute Pods
- Vue-Web Pods
For more detailed diagrams, see:
The ingress chart integrates with MetalLB to provide external IP addresses for LoadBalancer services. This integration has been designed to work with MetalLB's admission webhook, which requires that IPAddressPool and L2Advertisement resources be created in the metallb-system
namespace.
- Namespace-Specific Resources: The chart creates MetalLB resources in the
metallb-system
namespace with namespace-specific names to avoid conflicts. - Multi-Namespace Support: The chart can be installed in multiple namespaces without conflicts.
- Skip CRDs Flag: When installing the chart in a cluster with MetalLB already installed, use the
--skip-crds
flag to avoid CRD ownership conflicts.
# Install MetalLB first (if not already installed)
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
# Install the ingress chart with the --skip-crds flag
helm install -n your-namespace ingress ./helm/charts/ingress -f ./your-values.yaml --skip-crds
For more details, see the Detailed Architecture Diagram.
This repository follows a test-driven development (TDD) approach for Helm charts. The tests/
directory contains unit and integration tests for the charts.
# Run unit tests for the MetalLB namespace integration
./tests/unit/test-metallb-namespace.sh -f ./your-values.yaml
# Run integration tests for multi-namespace deployment
./tests/integration/test-multi-namespace.sh
For more details on the TDD approach, see the Helm Chart TDD document.
> helm repo add ct-charts https://calltelemetry.github.io/k8s/helm
> helm repo update
> helm repo list
NAME URL
ct-charts https://calltelemetry.github.io/k8s/helm
> helm install -n ct ct-charts/ingress
> helm install -n ct ct-charts/api
> helm install -n ct ct-charts/vue-web
This repository includes a production-ready GitHub Actions workflow that automatically:
- Detects Changes: Precisely identifies which charts have been modified in each commit
- Semantic Versioning: Automatically increments the patch version of modified charts following semver principles
- Dependency Management: Updates chart dependencies before packaging
- Packages Charts: Creates .tgz packages for all charts
- Updates Index: Regenerates the index.yaml file with the new chart versions
- Publishes: Commits and pushes all changes to the repository
The workflow runs whenever changes are pushed to the main branch and affect files in the helm/charts/
directory. This ensures your chart versions are always properly incremented when changes are made, and the repository index is kept up-to-date.
When you push changes to any chart in the helm/charts/
directory:
- The workflow detects exactly which charts were modified
- For each modified chart, it increments the patch version (e.g., 0.11.4 → 0.11.5)
- It commits these version changes first
- Then it packages all charts (with updated dependencies)
- Finally, it updates the index.yaml file and pushes the packaged charts
This approach ensures proper versioning and maintains a clean Git history.
- Go to your GitHub repository settings
- Scroll down to the "GitHub Pages" section
- Select the branch you want to publish from (usually
main
ormaster
) - Select the root directory as the source
- Click "Save"
GitHub will provide you with a URL for your GitHub Pages site (e.g., https://username.github.io/repo-name
).
- The
update-helm-repo.sh
script is already configured with the correct GitHub Pages URL:
REPO_URL="https://calltelemetry.github.io/k8s/helm"
- Make the script executable:
chmod +x update-helm-repo.sh
- Run the script to package your charts and update the index.yaml file:
./update-helm-repo.sh
- Commit and push the changes to your GitHub repository:
git add .
git commit -m "Update Helm repository"
git push
Once your GitHub Pages site is set up and the index.yaml file is available, you can add the repository to Helm:
helm repo add ct-charts https://calltelemetry.github.io/k8s/helm
helm repo update
Then you can install charts from your repository:
helm install my-release ct-charts/chart-name
If you prefer to manually update the repository:
- Package each chart:
helm package helm/charts/api -d .
helm package helm/charts/echo -d .
helm package helm/charts/ingress -d .
helm package helm/charts/teams-auth -d .
helm package helm/charts/vue-web -d .
- Update the index.yaml file:
helm repo index . --url https://calltelemetry.github.io/k8s/helm
- Commit and push the changes to your GitHub repository.