From 414feb48ee23a9fabd8d08d7f7cb39e5922cf361 Mon Sep 17 00:00:00 2001 From: Tamas Kiss Date: Thu, 26 May 2022 00:40:29 +0200 Subject: [PATCH] init: copied modules from lawndale-infra --- 9p-persistent-volume/outputs.tf | 23 ++++ 9p-persistent-volume/providers.tf | 9 ++ 9p-persistent-volume/variables.tf | 15 +++ 9p-persistent-volume/volume.tf | 37 +++++++ kubernetes/flannel/configmap.tf | 39 +++++++ kubernetes/flannel/daemonset.tf | 167 +++++++++++++++++++++++++++++ kubernetes/flannel/outputs.tf | 23 ++++ kubernetes/flannel/pod_security.tf | 65 +++++++++++ kubernetes/flannel/provider.tf | 8 ++ kubernetes/flannel/rbac.tf | 52 +++++++++ kubernetes/flannel/variables.tf | 52 +++++++++ kubernetes/kube-proxy/configmap.tf | 26 +++++ kubernetes/kube-proxy/daemonset.tf | 145 +++++++++++++++++++++++++ kubernetes/kube-proxy/outputs.tf | 13 +++ kubernetes/kube-proxy/provider.tf | 8 ++ kubernetes/kube-proxy/rbac.tf | 22 ++++ kubernetes/kube-proxy/service.tf | 17 +++ kubernetes/kube-proxy/variables.tf | 34 ++++++ lawndale-vm-ipam/dns.tf | 13 +++ lawndale-vm-ipam/locals.tf | 18 ++++ lawndale-vm-ipam/outputs.tf | 35 ++++++ lawndale-vm-ipam/providers.tf | 8 ++ lawndale-vm-ipam/variables.tf | 21 ++++ lawndale-vm/compute.tf | 119 ++++++++++++++++++++ lawndale-vm/locals.tf | 4 + lawndale-vm/outputs.tf | 0 lawndale-vm/providers.tf | 13 +++ lawndale-vm/variables.tf | 112 +++++++++++++++++++ remote-state-access/outputs.tf | 9 ++ remote-state-access/policy.tf | 59 ++++++++++ remote-state-access/provider.tf | 8 ++ remote-state-access/variables.tf | 35 ++++++ remote-state/bucket.tf | 55 ++++++++++ remote-state/dynamo.tf | 23 ++++ remote-state/locals.tf | 14 +++ remote-state/outputs.tf | 19 ++++ remote-state/policy.tf | 48 +++++++++ remote-state/provider.tf | 8 ++ remote-state/variables.tf | 59 ++++++++++ 39 files changed, 1435 insertions(+) create mode 100644 9p-persistent-volume/outputs.tf create mode 100644 9p-persistent-volume/providers.tf create mode 100644 9p-persistent-volume/variables.tf create mode 100644 9p-persistent-volume/volume.tf create mode 100644 kubernetes/flannel/configmap.tf create mode 100644 kubernetes/flannel/daemonset.tf create mode 100644 kubernetes/flannel/outputs.tf create mode 100644 kubernetes/flannel/pod_security.tf create mode 100644 kubernetes/flannel/provider.tf create mode 100644 kubernetes/flannel/rbac.tf create mode 100644 kubernetes/flannel/variables.tf create mode 100644 kubernetes/kube-proxy/configmap.tf create mode 100644 kubernetes/kube-proxy/daemonset.tf create mode 100644 kubernetes/kube-proxy/outputs.tf create mode 100644 kubernetes/kube-proxy/provider.tf create mode 100644 kubernetes/kube-proxy/rbac.tf create mode 100644 kubernetes/kube-proxy/service.tf create mode 100644 kubernetes/kube-proxy/variables.tf create mode 100644 lawndale-vm-ipam/dns.tf create mode 100644 lawndale-vm-ipam/locals.tf create mode 100644 lawndale-vm-ipam/outputs.tf create mode 100644 lawndale-vm-ipam/providers.tf create mode 100644 lawndale-vm-ipam/variables.tf create mode 100644 lawndale-vm/compute.tf create mode 100644 lawndale-vm/locals.tf create mode 100644 lawndale-vm/outputs.tf create mode 100644 lawndale-vm/providers.tf create mode 100644 lawndale-vm/variables.tf create mode 100644 remote-state-access/outputs.tf create mode 100644 remote-state-access/policy.tf create mode 100644 remote-state-access/provider.tf create mode 100644 remote-state-access/variables.tf create mode 100644 remote-state/bucket.tf create mode 100644 remote-state/dynamo.tf create mode 100644 remote-state/locals.tf create mode 100644 remote-state/outputs.tf create mode 100644 remote-state/policy.tf create mode 100644 remote-state/provider.tf create mode 100644 remote-state/variables.tf diff --git a/9p-persistent-volume/outputs.tf b/9p-persistent-volume/outputs.tf new file mode 100644 index 0000000..3da3496 --- /dev/null +++ b/9p-persistent-volume/outputs.tf @@ -0,0 +1,23 @@ +output "namespace" { + value = var.namespace +} + +output "host_path" { + value = local.host_path +} + +output "pv_name" { + value = kubernetes_persistent_volume.this.metadata.0.name +} + +output "pvc_name" { + value = kubernetes_persistent_volume_claim.this.metadata.0.name +} + +output "persistent_volume" { + value = kubernetes_persistent_volume.this +} + +output "persistent_volume_claim" { + value = kubernetes_persistent_volume_claim.this +} diff --git a/9p-persistent-volume/providers.tf b/9p-persistent-volume/providers.tf new file mode 100644 index 0000000..7990369 --- /dev/null +++ b/9p-persistent-volume/providers.tf @@ -0,0 +1,9 @@ +terraform { + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 2.11" + } + } +} + diff --git a/9p-persistent-volume/variables.tf b/9p-persistent-volume/variables.tf new file mode 100644 index 0000000..3bfef20 --- /dev/null +++ b/9p-persistent-volume/variables.tf @@ -0,0 +1,15 @@ +variable "name" { + type = string + description = "The name of the volume" +} + +variable "namespace" { + type = string + description = "The namespace for the persistent volume claim" +} + +variable "volume_storage_capacity" { + type = string + description = "Size of the persistent volume reported to Kubernetes" + default = "1Gi" +} diff --git a/9p-persistent-volume/volume.tf b/9p-persistent-volume/volume.tf new file mode 100644 index 0000000..de17571 --- /dev/null +++ b/9p-persistent-volume/volume.tf @@ -0,0 +1,37 @@ +locals { + pv_name = "pv-p9hostpath-${var.name}" + host_path = "/mnt/datastore/${var.name}" +} + +resource "kubernetes_persistent_volume" "this" { + metadata { + name = local.pv_name + } + spec { + capacity = { + storage = var.volume_storage_capacity + } + access_modes = ["ReadWriteMany"] + persistent_volume_source { + host_path { + path = local.host_path + } + } + } +} + +resource "kubernetes_persistent_volume_claim" "this" { + metadata { + name = var.name + namespace = var.namespace + } + spec { + access_modes = ["ReadWriteMany"] + resources { + requests = { + storage = var.volume_storage_capacity + } + } + volume_name = kubernetes_persistent_volume.this.metadata.0.name + } +} diff --git a/kubernetes/flannel/configmap.tf b/kubernetes/flannel/configmap.tf new file mode 100644 index 0000000..1415911 --- /dev/null +++ b/kubernetes/flannel/configmap.tf @@ -0,0 +1,39 @@ +resource "kubernetes_config_map" "this" { + metadata { + namespace = var.namespace + name = "kube-flannel-cfg" + labels = { + app = "flannel" + "k8s-app" = "cni" + } + } + data = { + "cni-conf.json" = jsonencode({ + name = "cbr0", + cniVersion = "0.3.1", + plugins = [ + { + type = "flannel", + delegate = { + hairpinMode = true, + isDefaultGateway = true, + } + }, + { + type = "portmap", + capabilities = { + portMappings = true, + } + }, + ] + }) + "net-conf.json" = jsonencode({ + Network = var.cluster_cidr, + Backend = { + Type = "vxlan", + VNI = var.vxlan_id, + Port = var.vxlan_port, + } + }) + } +} diff --git a/kubernetes/flannel/daemonset.tf b/kubernetes/flannel/daemonset.tf new file mode 100644 index 0000000..05eea57 --- /dev/null +++ b/kubernetes/flannel/daemonset.tf @@ -0,0 +1,167 @@ +resource "kubernetes_daemonset" "this" { + metadata { + name = var.daemonset_name + namespace = var.namespace + labels = { + app = var.daemonset_name + "k8s-app" = "cni" + } + } + spec { + selector { + match_labels = { + app = var.daemonset_name + "k8s-app" = "cni" + } + } + + template { + metadata { + labels = { + app = var.daemonset_name + "k8s-app" = "cni" + } + } + spec { + affinity { + node_affinity { + required_during_scheduling_ignored_during_execution { + node_selector_term { + match_expressions { + key = "kubernetes.io/os" + operator = "In" + values = var.node_selector_os + } + } + } + } + } + + host_network = true + priority_class_name = "system-node-critical" + + toleration { + operator = "Exists" + effect = "NoSchedule" + } + + service_account_name = kubernetes_service_account.this.metadata.0.name + + init_container { + name = "install-cni-plugin" + image = var.flannel_cni_plugin_image + command = ["cp"] + args = ["-f", "/flannel", "/opt/cni/bin/flannel"] + volume_mount { + name = "cni-plugin" + mount_path = "/opt/cni/bin" + } + } + + init_container { + name = "install-cni" + image = var.flannel_image + command = ["cp"] + args = ["-f", "/etc/kube-flannel/cni-conf.json", "/etc/cni/net.d/10-flannel.conflist"] + volume_mount { + name = "cni" + mount_path = "/etc/cni/net.d" + } + volume_mount { + name = "flannel-cfg" + mount_path = "/etc/kube-flannel/" + } + } + + container { + name = "kube-flannel" + image = var.flannel_image + command = ["/opt/bin/flanneld"] + args = ["--ip-masq", "--kube-subnet-mgr"] + resources { + requests = { + cpu = "100m" + memory = "50Mi" + } + limits = { + cpu = "100m" + memory = "50Mi" + } + } + security_context { + privileged = false + capabilities { + add = ["NET_ADMIN", "NET_RAW"] + } + } + + env { + name = "POD_NAME" + value_from { + field_ref { + field_path = "metadata.name" + } + } + } + + env { + name = "POD_NAMESPACE" + value_from { + field_ref { + field_path = "metadata.namespace" + } + } + } + env { + name = "EVENT_QUEUE_DEPTH" + value = "5000" + } + volume_mount { + name = "run" + mount_path = "/run/flannel" + } + volume_mount { + name = "flannel-cfg" + mount_path = "/etc/kube-flannel/" + } + volume_mount { + name = "xtables-lock" + mount_path = "/run/xtables.lock" + } + } + + volume { + name = "run" + host_path { + path = "/run/flannel" + } + } + volume { + name = "cni-plugin" + host_path { + path = "/opt/cni/bin" + } + } + volume { + name = "cni" + host_path { + path = "/etc/cni/net.d" + } + } + volume { + name = "flannel-cfg" + config_map { + name = kubernetes_config_map.this.metadata.0.name + } + } + volume { + name = "xtables-lock" + host_path { + path = "/run/xtables.lock" + type = "FileOrCreate" + } + } + } + } + } +} \ No newline at end of file diff --git a/kubernetes/flannel/outputs.tf b/kubernetes/flannel/outputs.tf new file mode 100644 index 0000000..a571bf1 --- /dev/null +++ b/kubernetes/flannel/outputs.tf @@ -0,0 +1,23 @@ +output "service_account" { + value = kubernetes_service_account.this +} + +output "cluster_role" { + value = kubernetes_cluster_role.this +} + +output "cluster_role_binding" { + value = kubernetes_cluster_role_binding.this +} + +output "pod_security_policy" { + value = kubernetes_pod_security_policy.this +} + +output "daemonset" { + value = kubernetes_daemonset.this +} + +output "configmap" { + value = kubernetes_config_map.this +} diff --git a/kubernetes/flannel/pod_security.tf b/kubernetes/flannel/pod_security.tf new file mode 100644 index 0000000..98c7893 --- /dev/null +++ b/kubernetes/flannel/pod_security.tf @@ -0,0 +1,65 @@ +resource "kubernetes_pod_security_policy" "this" { + metadata { + name = "psp.flannel.unprivileged" + annotations = { + "seccomp.security.alpha.kubernetes.io/allowedProfileNames" : "docker/default", + "seccomp.security.alpha.kubernetes.io/defaultProfileName" : "docker/default", + "apparmor.security.beta.kubernetes.io/allowedProfileNames" : "runtime/default", + "apparmor.security.beta.kubernetes.io/defaultProfileName" : "runtime/default", + } + } + spec { + # Privilege Escalation + allow_privilege_escalation = false + default_allow_privilege_escalation = false + privileged = false + + volumes = [ + "configMap", + "secret", + "emptyDir", + "hostPath", + ] + allowed_host_paths { + path_prefix = "/etc/cni/net.d" + } + allowed_host_paths { + path_prefix = "/etc/kube-flannel" + } + allowed_host_paths { + path_prefix = "/run/flannel" + } + + read_only_root_filesystem = false + + # Users and groups + run_as_user { + rule = "MustRunAsNonRoot" + } + supplemental_groups { + rule = "RunAsAny" + } + fs_group { + rule = "RunAsAny" + } + + # Capabilities + allowed_capabilities = ["NET_ADMIN", "NET_RAW"] + default_add_capabilities = [] + required_drop_capabilities = [] + + # Host namespaces + host_pid = false + host_ipc = false + host_network = true + host_ports { + min = 0 + max = 65535 + } + # SELinux + se_linux { + # SELinux is unused in CaaSP + rule = "RunAsAny" + } + } +} diff --git a/kubernetes/flannel/provider.tf b/kubernetes/flannel/provider.tf new file mode 100644 index 0000000..5d93fc8 --- /dev/null +++ b/kubernetes/flannel/provider.tf @@ -0,0 +1,8 @@ +terraform { + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 2.11" + } + } +} diff --git a/kubernetes/flannel/rbac.tf b/kubernetes/flannel/rbac.tf new file mode 100644 index 0000000..0e2e2ce --- /dev/null +++ b/kubernetes/flannel/rbac.tf @@ -0,0 +1,52 @@ + +resource "kubernetes_cluster_role" "this" { + count = var.create_cluster_role ? 1 : 0 + + metadata { + name = var.cluster_role_name + } + rule { + api_groups = ["extensions"] + resources = ["podsecuritypolicies"] + verbs = ["use"] + resource_names = [kubernetes_pod_security_policy.this.metadata.0.name] + } + rule { + api_groups = [""] + resources = ["pods"] + verbs = ["get"] + } + rule { + api_groups = [""] + resources = ["nodes"] + verbs = ["list", "watch"] + } + rule { + api_groups = [""] + resources = ["nodes/status"] + verbs = ["patch"] + } +} + +resource "kubernetes_service_account" "this" { + metadata { + name = "flannel" + namespace = var.namespace + } +} + +resource "kubernetes_cluster_role_binding" "this" { + metadata { + name = "flannel" + } + role_ref { + api_group = "rbac.authorization.k8s.io" + kind = "ClusterRole" + name = var.cluster_role_name + } + subject { + kind = "ServiceAccount" + name = kubernetes_service_account.this.metadata.0.name + namespace = kubernetes_service_account.this.metadata.0.namespace + } +} diff --git a/kubernetes/flannel/variables.tf b/kubernetes/flannel/variables.tf new file mode 100644 index 0000000..c164520 --- /dev/null +++ b/kubernetes/flannel/variables.tf @@ -0,0 +1,52 @@ +variable "namespace" { + type = string + description = "namespace for resources" + default = "kube-system" +} + +variable "vxlan_id" { + type = number + description = "VXLAN ID (VNI)" +} + +variable "vxlan_port" { + type = number + description = "UDP port to use for sending encapsulated packets" +} + +variable "flannel_image" { + type = string + default = "rancher/mirrored-flannelcni-flannel:v0.17.0" +} + +variable "flannel_cni_plugin_image" { + type = string + default = "rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1" +} + +variable "cluster_role_name" { + type = string + description = "Name of the cluster role flannel will use" + default = "flannel" +} +variable "create_cluster_role" { + type = bool + description = "Weather or not to create a suitable cluster role or use an already exisiting specified by cluster_role_name variable" + default = true +} + +variable "daemonset_name" { + type = string + description = "Name of the daeomonset" + default = "flannel" +} +variable "node_selector_os" { + type = list(string) + description = "Which kubernetes.io/os node-label to match for execution" + default = ["linux"] +} + +variable "cluster_cidr" { + type = string + description = "ClusterCIDR" +} \ No newline at end of file diff --git a/kubernetes/kube-proxy/configmap.tf b/kubernetes/kube-proxy/configmap.tf new file mode 100644 index 0000000..47726bf --- /dev/null +++ b/kubernetes/kube-proxy/configmap.tf @@ -0,0 +1,26 @@ + +resource "kubernetes_config_map" "this" { + metadata { + name = "${var.daemonset_name}-config" + namespace = var.namespace + } + + data = { + "kube-proxy-config.yaml" = yamlencode(merge({ + kind = "KubeProxyConfiguration" + apiVersion = "kubeproxy.config.k8s.io/v1alpha1" + clientConnection = { + kubeconfig = "/kubeconfig/kubeconfig" + } + mode = var.mode + clusterCIDR = var.cluster_cidr + }, var.additional_config)) + "kubeconfig.sh" : <