diff --git a/prepare-labs/konk.sh b/prepare-labs/konk.sh index 0ff218ac..fed6a466 100755 --- a/prepare-labs/konk.sh +++ b/prepare-labs/konk.sh @@ -6,7 +6,10 @@ # (See https://docs.google.com/document/d/1n0lwp6rQKQUIuo_A5LQ1dgCzrmjkDjmDtNj1Jn92UrI) # PRO2-XS = 4 core, 16 gb +set -e + PROVIDER=scaleway +STUDENTS=30 case "$PROVIDER" in linode) @@ -19,20 +22,26 @@ scaleway) ;; esac -./labctl create --mode mk8s --settings settings/konk.env --provider $PROVIDER --tag konk - # set kubeconfig file export KUBECONFIG=~/kubeconfig -cp tags/konk/stage2/kubeconfig.101 $KUBECONFIG + +if [ "$PROVIDER" = "kind" ]; then + kind create cluster --name konk + ADDRTYPE=InternalIP +else + ./labctl create --mode mk8s --settings settings/konk.env --provider $PROVIDER --tag konk + cp tags/konk/stage2/kubeconfig.101 $KUBECONFIG + ADDRTYPE=ExternalIP +fi # set external_ip labels -kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name} {.status.addresses[?(@.type=="ExternalIP")].address}{"\n"}{end}' | +kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name} {.status.addresses[?(@.type=="'$ADDRTYPE'")].address}{"\n"}{end}' | while read node address; do kubectl label node $node external_ip=$address done # vcluster all the things -./labctl create --settings settings/mk8s.env --provider vcluster --mode mk8s --students 50 +./labctl create --settings settings/mk8s.env --provider vcluster --mode mk8s --students $STUDENTS # install prometheus stack because that's cool helm upgrade --install --repo https://prometheus-community.github.io/helm-charts \ diff --git a/prepare-labs/lib/commands.sh b/prepare-labs/lib/commands.sh index 73c04409..df01d1cd 100644 --- a/prepare-labs/lib/commands.sh +++ b/prepare-labs/lib/commands.sh @@ -983,7 +983,7 @@ _cmd_logins() { need_tag $TAG cat tags/$TAG/logins.jsonl \ - | jq -r '"\(.password)\tssh -l \(.login)\(if .port then " -p \(.port)" else "" end)\t\(.ipaddrs)"' + | jq -r '"\(if .codeServerPort then "\(.codeServerPort)\t" else "" end )\(.password)\tssh -l \(.login)\(if .port then " -p \(.port)" else "" end)\t\(.ipaddrs)"' } _cmd maketag "Generate a quasi-unique tag for a group of instances" diff --git a/prepare-labs/terraform/many-kubernetes/stage2.tmpl b/prepare-labs/terraform/many-kubernetes/stage2.tmpl index 0381d3b4..843e0c76 100644 --- a/prepare-labs/terraform/many-kubernetes/stage2.tmpl +++ b/prepare-labs/terraform/many-kubernetes/stage2.tmpl @@ -14,6 +14,20 @@ provider "kubernetes" { config_path = "./kubeconfig.${index}" } +provider "helm" { + alias = "cluster_${index}" + kubernetes { + config_path = "./kubeconfig.${index}" + } +} + +# Password used for SSH and code-server access +resource "random_string" "shpod_${index}" { + length = 6 + special = false + upper = false +} + resource "kubernetes_namespace" "shpod_${index}" { provider = kubernetes.cluster_${index} metadata { @@ -21,120 +35,57 @@ resource "kubernetes_namespace" "shpod_${index}" { } } -resource "kubernetes_deployment" "shpod_${index}" { +data "kubernetes_service" "shpod_${index}" { + depends_on = [ helm_release.shpod_${index} ] provider = kubernetes.cluster_${index} metadata { name = "shpod" - namespace = kubernetes_namespace.shpod_${index}.metadata.0.name - } - spec { - selector { - match_labels = { - app = "shpod" - } - } - template { - metadata { - labels = { - app = "shpod" - } - } - spec { - service_account_name = "shpod" - container { - image = "jpetazzo/shpod" - name = "shpod" - env { - name = "PASSWORD" - value = random_string.shpod_${index}.result - } - lifecycle { - post_start { - exec { - command = [ "sh", "-c", "curl http://myip.enix.org/REMOTE_ADDR > /etc/HOSTIP || true" ] - } - } - } - resources { - limits = { - cpu = "2" - memory = "500M" - } - requests = { - cpu = "100m" - memory = "250M" - } - } - } - } - } - } -} - -resource "kubernetes_service" "shpod_${index}" { - provider = kubernetes.cluster_${index} - lifecycle { - # Folks might alter their shpod Service to expose extra ports. - # Don't reset their changes. - ignore_changes = [ spec ] - } - metadata { - name = "shpod" - namespace = kubernetes_namespace.shpod_${index}.metadata.0.name - } - spec { - selector = { - app = "shpod" - } - port { - name = "ssh" - port = 22 - target_port = 22 - } - type = "NodePort" - } -} - -resource "kubernetes_service_account" "shpod_${index}" { - provider = kubernetes.cluster_${index} - metadata { - name = "shpod" - namespace = kubernetes_namespace.shpod_${index}.metadata.0.name - } -} - -resource "kubernetes_cluster_role_binding" "shpod_${index}" { - provider = kubernetes.cluster_${index} - metadata { - name = "shpod" - } - role_ref { - api_group = "rbac.authorization.k8s.io" - kind = "ClusterRole" - name = "cluster-admin" - } - subject { - kind = "ServiceAccount" - name = "shpod" namespace = "shpod" } - subject { - api_group = "rbac.authorization.k8s.io" - kind = "Group" - name = "shpod-cluster-admins" +} + +resource "helm_release" "shpod_${index}" { + provider = helm.cluster_${index} + repository = "https://shpod.in" + chart = "shpod" + name = "shpod" + namespace = "shpod" + create_namespace = false + set { + name = "service.type" + value = "NodePort" } -} - -resource "random_string" "shpod_${index}" { - length = 6 - special = false - upper = false -} - -provider "helm" { - alias = "cluster_${index}" - kubernetes { - config_path = "./kubeconfig.${index}" + set { + name = "resources.requests.cpu" + value = "100m" + } + set { + name = "resources.requests.memory" + value = "500M" + } + set { + name = "resources.limits.cpu" + value = "1" + } + set { + name = "resources.limits.memory" + value = "1000M" + } + set { + name = "persistentVolume.enabled" + value = "true" + } + set { + name = "ssh.password" + value = random_string.shpod_${index}.result + } + set { + name = "rbac.cluster.clusterRoles" + value = "{cluster-admin}" + } + set { + name = "codeServer.enabled" + value = "true" } } @@ -234,7 +185,8 @@ output "logins_jsonl" { jsonencode({ login = "k8s", password = random_string.shpod_${index}.result, - port = kubernetes_service.shpod_${index}.spec[0].port[0].node_port, + port = data.kubernetes_service.shpod_${index}.spec[0].port[0].node_port, + codeServerPort = data.kubernetes_service.shpod_${index}.spec[0].port[1].node_port, ipaddrs = replace(file("./externalips.${index}"), " ", "\t"), }), %{ endfor ~}