Skip to content

Instantly share code, notes, and snippets.

@mvladev
Last active February 1, 2019 08:29
Show Gist options
  • Select an option

  • Save mvladev/324109f0e9bb09ed53cf28351fbff8eb to your computer and use it in GitHub Desktop.

Select an option

Save mvladev/324109f0e9bb09ed53cf28351fbff8eb to your computer and use it in GitHub Desktop.
Virtual K8S
apiVersion: v1
kind: Secret
metadata:
name: virtual
namespace: federated
type: Opaque
data:
kubeconfig: YXBpVmVyc2lvbjogdjEKa2luZDogQ29uZmlnCmNsdXN0ZXJzOgotIGNsdXN0ZXI6CiAgICBpbnNlY3VyZS1za2lwLXRscy12ZXJpZnk6IHRydWUKICAgIHNlcnZlcjogaHR0cHM6Ly9ub3QtdXNlZDoyNDQzCiAgbmFtZTogZHVtbXkKY29udGV4dHM6Ci0gY29udGV4dDoKICAgIGNsdXN0ZXI6IGR1bW15CiAgICB1c2VyOiBkdW1teQogIG5hbWU6IGR1bW15CmN1cnJlbnQtY29udGV4dDogZHVtbXkKdXNlcnM6Ci0gbmFtZTogZHVtbXkKICB1c2VyOgogICAgcGFzc3dvcmQ6IGFkbWluCiAgICB1c2VybmFtZTogYWRtaW4K
# The kubeconfig is more or less
# apiVersion: v1
# kind: Config
# clusters:
# - cluster:
# insecure-skip-tls-verify: true
# server: https://not-used:2443
# name: dummy
# contexts:
# - context:
# cluster: dummy
# user: dummy
# name: dummy
# current-context: dummy
# users:
# - name: dummy
# user:
# password: admin
# username: admin
---
apiVersion: v1
kind: ConfigMap
metadata:
name: basic-auth
namespace: federated
data:
basic_auth.csv: admin,admin,3,"cluster-admin,system:masters"
#!/bin/bash
OPERATION=${1:-create}
CLUSTER_NUMBER=${2:-30}
cat <<EOF | kubectl ${OPERATION} -f -
apiVersion: v1
kind: Service
metadata:
name: etcd
namespace: federated
spec:
selector:
app: etcd
ports:
- port: 2379
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: etcd
name: etcd
namespace: federated
spec:
containers:
- name: etcd
image: quay.io/coreos/etcd:v3.3.2
command:
- etcd
- -advertise-client-urls=http://127.0.0.1:2379
- -listen-client-urls=http://0.0.0.0:2379
terminationGracePeriodSeconds: 1
EOF
for i in $(seq 1 ${CLUSTER_NUMBER}); do
cat <<EOF | kubectl ${OPERATION} -f -
apiVersion: clusterregistry.k8s.io/v1alpha1
kind: Cluster
metadata:
name: virtual-${i}
namespace: federated
labels:
type: virtual
spec:
authInfo: {}
kubernetesApiEndpoints:
serverEndpoints:
- clientCIDR: 0.0.0.0/0
serverAddress: https://virtual-${i}.federated
---
apiVersion: core.federation.k8s.io/v1alpha1
kind: FederatedCluster
metadata:
name: virtual-${i}
namespace: federated
labels:
type: virtual
spec:
clusterRef:
name: virtual-${i}
secretRef:
name: virtual
---
apiVersion: v1
kind: Pod
metadata:
labels:
apiserver: virtual-${i}
name: virtual-${i}
namespace: federated
spec:
containers:
- name: kube-apiserver
image: k8s.gcr.io/hyperkube:v1.13.1
imagePullPolicy: IfNotPresent
command:
- /hyperkube
- apiserver
- --basic-auth-file=/srv/kubernetes/auth/basic_auth.csv
- "--disable-admission-plugins=AlwaysAdmit,AlwaysDeny,AlwaysPullImages,DefaultStorageClass,DefaultTolerationSeconds,DenyEscalatingExec,DenyExecOnPrivileged,EventRateLimit,ExtendedResourceToleration,ImagePolicyWebhook,Initializers,LimitPodHardAntiAffinityTopology,LimitRanger,MutatingAdmissionWebhook,NamespaceAutoProvision,NamespaceExists,NamespaceLifecycle,NodeRestriction,OwnerReferencesPermissionEnforcement,PersistentVolumeClaimResize,PersistentVolumeLabel,PodNodeSelector,PodPreset,PodSecurityPolicy,PodTolerationRestriction,Priority,ResourceQuota,SecurityContextDeny,ServiceAccount,StorageObjectInUseProtection,ValidatingAdmissionWebhook"
- "--runtime-config=admissionregistration.k8s.io/v1beta1=false,apps/v1=false,apps/v1beta1=false,apps/v1beta2=false,authentication.k8s.io/v1=false,authentication.k8s.io/v1beta1=false,authorization.k8s.io/v1=false,authorization.k8s.io/v1beta1=false,autoscaling/v1=false,autoscaling/v2beta1=false,autoscaling/v2beta2=false,batch/v1=false,batch/v1beta1=false,certificates.k8s.io/v1beta1=false,coordination.k8s.io/v1beta1=false,events.k8s.io/v1beta1=false,extensions/v1beta1=false,networking.k8s.io/v1=false,policy/v1beta1=false,rbac.authorization.k8s.io/v1=false,rbac.authorization.k8s.io/v1beta1=false,scheduling.k8s.io/v1beta1=false,storage.k8s.io/v1=false,storage.k8s.io/v1beta1=false"
- --watch-cache=false
- --enable-aggregator-routing=false
- --enable-garbage-collector=false
- --enable-bootstrap-token-auth=false
- --enable-logs-handler=false
- --enable-swagger-ui=false
- --default-watch-cache-size=0
- --etcd-servers=http://etcd:2379
- --target-ram-mb=2
- --secure-port=443
- --endpoint-reconciler-type=none
- --service-account-lookup=false
- --profiling=false
- --etcd-prefix=/registry-${i}
- --v=2
volumeMounts:
- mountPath: /srv/kubernetes/auth
name: basic-auth
terminationGracePeriodSeconds: 1
volumes:
- configMap:
name: basic-auth
name: basic-auth
---
apiVersion: v1
kind: Service
metadata:
name: virtual-${i}
namespace: federated
spec:
selector:
apiserver: virtual-${i}
ports:
- port: 443
EOF
done
@mvladev

mvladev commented Jan 31, 2019

Copy link
Copy Markdown
Author

How to create many virtual K8S clusters.

First create the common resources first with

kubectl create namespace federated
kubectl create -f 01-common.yaml

and then create X amount of clusters with:

./create.sh create 70

For removal run:

./create.sh "delete --wait=false" 70

@llarsson

Copy link
Copy Markdown

Great idea! Looking forward to reading your blog post!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment