Add vcluster-multi-env stack (#44)
Signed-off-by: Greg Haynes <greg.haynes@autodesk.com>
This commit is contained in:
parent
2ed8e1d37f
commit
80d62e30a4
6 changed files with 236 additions and 0 deletions
41
vcluster-multi-env/README.md
Normal file
41
vcluster-multi-env/README.md
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# IDP Builder Multi-Environment
|
||||||
|
|
||||||
|
Multi-environment emulation on top of CNOE.
|
||||||
|
|
||||||
|
# Configuring Clusters
|
||||||
|
|
||||||
|
By default, this stack creates two vclusters (staging and production). If you
|
||||||
|
desire a different configuration you can edit the following list in
|
||||||
|
`vclusters.yaml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
generators:
|
||||||
|
- list:
|
||||||
|
elements:
|
||||||
|
- name: staging
|
||||||
|
- name: production
|
||||||
|
```
|
||||||
|
|
||||||
|
# Running
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create CNOE deployment with vcluster-multi-env stack
|
||||||
|
idpbuilder create -p vcluster-multi-env
|
||||||
|
|
||||||
|
# Enroll vclusters in ArgoCD
|
||||||
|
./vcluster-multi-env/add-vclusters.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
# Using
|
||||||
|
|
||||||
|
Your CNOE ArgoCD should now have a cluster enrolled for each configured
|
||||||
|
vcluster (staging and production by default). These clusters will have the
|
||||||
|
following labels for your use:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
cnoe.io/vclusterMultiEnv/clusterClass: "app-runtime"
|
||||||
|
cnoe.io/vclusterMultiEnv/clusterName: "${cluster_name}"
|
||||||
|
```
|
||||||
|
|
||||||
|
You may now target them using, for example, an ArgoCD ApplicationSet cluster
|
||||||
|
generator which matches these labels.
|
48
vcluster-multi-env/add-vclusters.sh
Executable file
48
vcluster-multi-env/add-vclusters.sh
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
vcluster_app_names=$(kubectl get application -A -l cnoe.io/applicationName=vcluster-package,cnoe.io/stackName=vcluster-multi-env --no-headers -o custom-columns=":metadata.name")
|
||||||
|
environments=$(echo "$vcluster_app_names" | cut -f 1 -d '-')
|
||||||
|
|
||||||
|
for env in $environments; do
|
||||||
|
cluster_name=$env
|
||||||
|
|
||||||
|
echo "Checking readiness for ${cluster_name} vcluster..."
|
||||||
|
|
||||||
|
until kubectl get secret -n ${cluster_name}-vcluster vc-${cluster_name}-vcluster-helm &> /dev/null; do
|
||||||
|
echo "Waiting for ${cluster_name} vcluster secret to be ready..."
|
||||||
|
sleep 10
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "${cluster_name} vcluster is ready. Retrieving credentials..."
|
||||||
|
client_key=$(kubectl get secret -n ${cluster_name}-vcluster vc-${cluster_name}-vcluster-helm --template='{{index .data "client-key" }}')
|
||||||
|
client_certificate=$(kubectl get secret -n ${cluster_name}-vcluster vc-${cluster_name}-vcluster-helm --template='{{index .data "client-certificate" }}')
|
||||||
|
certificate_authority=$(kubectl get secret -n ${cluster_name}-vcluster vc-${cluster_name}-vcluster-helm --template='{{index .data "certificate-authority" }}')
|
||||||
|
|
||||||
|
kubectl apply -f - <<EOF
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: ${cluster_name}-vcluster-secret
|
||||||
|
namespace: argocd
|
||||||
|
labels:
|
||||||
|
argocd.argoproj.io/secret-type: cluster
|
||||||
|
cnoe.io/vclusterMultiEnv/clusterClass: "app-runtime"
|
||||||
|
cnoe.io/vclusterMultiEnv/clusterName: "${cluster_name}"
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
name: ${cluster_name}-vcluster
|
||||||
|
server: https://${cluster_name}-vcluster.cnoe.localtest.me:443
|
||||||
|
config: |
|
||||||
|
{
|
||||||
|
"tlsClientConfig": {
|
||||||
|
"insecure": false,
|
||||||
|
"caData": "${certificate_authority}",
|
||||||
|
"certData": "${client_certificate}",
|
||||||
|
"keyData": "${client_key}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
done
|
39
vcluster-multi-env/vcluster/application-vcluster.yaml
Normal file
39
vcluster-multi-env/vcluster/application-vcluster.yaml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
apiVersion: argoproj.io/v1alpha1
|
||||||
|
kind: Application
|
||||||
|
metadata:
|
||||||
|
name: unpatched-vcluster
|
||||||
|
namespace: argocd
|
||||||
|
labels:
|
||||||
|
cnoe.io/stackName: vcluster-multi-env
|
||||||
|
cnoe.io/applicationName: vcluster-helm
|
||||||
|
spec:
|
||||||
|
project: default
|
||||||
|
source:
|
||||||
|
chart: vcluster
|
||||||
|
repoURL: https://charts.loft.sh
|
||||||
|
targetRevision: 0.20.0
|
||||||
|
helm:
|
||||||
|
valuesObject:
|
||||||
|
sync:
|
||||||
|
fromHost:
|
||||||
|
nodes:
|
||||||
|
enabled: true # Required for virtualScheduler
|
||||||
|
controlPlane:
|
||||||
|
advanced:
|
||||||
|
virtualScheduler: # For Keptn support: https://keptn.sh/stable/docs/installation/configuration/vcluster/
|
||||||
|
enabled: true
|
||||||
|
proxy:
|
||||||
|
extraSANs:
|
||||||
|
- unpatched-vcluster-hostname.cnoe.localtest.me
|
||||||
|
statefulSet:
|
||||||
|
scheduling:
|
||||||
|
podManagementPolicy: OrderedReady
|
||||||
|
exportKubeConfig:
|
||||||
|
server: https://unpatched-vcluster-hostname.cnoe.localtest.me:443
|
||||||
|
destination:
|
||||||
|
server: https://kubernetes.default.svc
|
||||||
|
namespace: unpatched-vcluster
|
||||||
|
syncPolicy:
|
||||||
|
automated: {}
|
||||||
|
syncOptions:
|
||||||
|
- CreateNamespace=true
|
27
vcluster-multi-env/vcluster/ingress.yaml
Normal file
27
vcluster-multi-env/vcluster/ingress.yaml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
# We need the ingress to pass through ssl traffic to the vCluster
|
||||||
|
# This only works for the nginx-ingress (enable via --enable-ssl-passthrough
|
||||||
|
# https://kubernetes.github.io/ingress-nginx/user-guide/tls/#ssl-passthrough )
|
||||||
|
# for other ingress controllers please check their respective documentation.
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
|
||||||
|
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
name: vcluster-ingress
|
||||||
|
labels:
|
||||||
|
cnoe.io/stackName: vcluster-multi-env
|
||||||
|
spec:
|
||||||
|
ingressClassName: nginx # use your ingress class name
|
||||||
|
rules:
|
||||||
|
- host: unpatched-vcluster-hostname.cnoe.localtest.me
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: unpatched-vcluster-services
|
||||||
|
port:
|
||||||
|
number: 443
|
||||||
|
path: /
|
||||||
|
pathType: ImplementationSpecific
|
3
vcluster-multi-env/vcluster/kustomization.yaml
Normal file
3
vcluster-multi-env/vcluster/kustomization.yaml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
resources:
|
||||||
|
- application-vcluster.yaml
|
||||||
|
- ingress.yaml
|
78
vcluster-multi-env/vclusters.yaml
Normal file
78
vcluster-multi-env/vclusters.yaml
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
apiVersion: argoproj.io/v1alpha1
|
||||||
|
kind: ApplicationSet
|
||||||
|
metadata:
|
||||||
|
name: vclusters
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
goTemplate: true
|
||||||
|
goTemplateOptions: ["missingkey=error"]
|
||||||
|
generators:
|
||||||
|
- list:
|
||||||
|
elements:
|
||||||
|
- name: staging
|
||||||
|
- name: production
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
name: '{{.name}}-vcluster'
|
||||||
|
labels:
|
||||||
|
cnoe.io/stackName: vcluster-multi-env
|
||||||
|
cnoe.io/applicationName: vcluster-package
|
||||||
|
finalizers:
|
||||||
|
- resources-finalizer.argocd.argoproj.io # enabling cascading deletion
|
||||||
|
spec:
|
||||||
|
project: 'default'
|
||||||
|
source:
|
||||||
|
repoURL: cnoe://
|
||||||
|
targetRevision: HEAD
|
||||||
|
path: vcluster
|
||||||
|
kustomize:
|
||||||
|
patches:
|
||||||
|
- target:
|
||||||
|
labelSelector: cnoe.io/stackName=vcluster-multi-env
|
||||||
|
kind: Ingress
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /spec/rules/0/host
|
||||||
|
value: {{.name}}-vcluster.cnoe.localtest.me
|
||||||
|
- target:
|
||||||
|
labelSelector: cnoe.io/stackName=vcluster-multi-env
|
||||||
|
kind: Ingress
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /spec/rules/0/http/paths/0/backend/service/name
|
||||||
|
value: {{.name}}-vcluster-helm
|
||||||
|
- target:
|
||||||
|
labelSelector: cnoe.io/stackName=vcluster-multi-env
|
||||||
|
kind: Application
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /metadata/name
|
||||||
|
value: {{.name}}-vcluster-helm
|
||||||
|
- target:
|
||||||
|
labelSelector: cnoe.io/stackName=vcluster-multi-env
|
||||||
|
kind: Application
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /spec/source/helm/valuesObject/controlPlane/proxy/extraSANs/0
|
||||||
|
value: {{.name}}-vcluster.cnoe.localtest.me
|
||||||
|
- target:
|
||||||
|
labelSelector: cnoe.io/stackName=vcluster-multi-env
|
||||||
|
kind: Application
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /spec/source/helm/valuesObject/exportKubeConfig/server
|
||||||
|
value: https://{{.name}}-vcluster.cnoe.localtest.me:443
|
||||||
|
- target:
|
||||||
|
labelSelector: cnoe.io/stackName=vcluster-multi-env
|
||||||
|
kind: Application
|
||||||
|
patch: |-
|
||||||
|
- op: replace
|
||||||
|
path: /spec/destination/namespace
|
||||||
|
value: {{.name}}-vcluster
|
||||||
|
destination:
|
||||||
|
server: "https://kubernetes.default.svc"
|
||||||
|
namespace: '{{.name}}-vcluster'
|
||||||
|
syncPolicy:
|
||||||
|
automated: {}
|
||||||
|
syncOptions:
|
||||||
|
- CreateNamespace=true
|
Loading…
Reference in a new issue