diff --git a/helm/coder/templates/httproute.yaml b/helm/coder/templates/httproute.yaml index fb4c967c41..68582d049a 100644 --- a/helm/coder/templates/httproute.yaml +++ b/helm/coder/templates/httproute.yaml @@ -1,3 +1,7 @@ +{{- if and .Values.coder.httproute.enable .Values.coder.httproute.httpsRedirect.enable (empty .Values.coder.httproute.httpsRedirect.parentRefs) -}} +{{- fail "coder.httproute.httpsRedirect.parentRefs is required when coder.httproute.httpsRedirect.enable=true" -}} +{{- end -}} + {{- if .Values.coder.httproute.enable }} --- apiVersion: gateway.networking.k8s.io/v1 @@ -24,4 +28,36 @@ spec: {{- with .Values.coder.httproute.wildcardHost }} - {{ . | quote }} {{- end }} + {{- if .Values.coder.httproute.httpsRedirect.enable }} +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder-https-redirect + namespace: {{ .Release.Namespace }} + labels: + {{- include "coder.labels" . | nindent 4 }} + annotations: + {{- toYaml .Values.coder.httproute.httpsRedirect.annotations | nindent 4 }} +spec: + parentRefs: + {{- with .Values.coder.httproute.httpsRedirect.parentRefs }} + {{- toYaml . | nindent 4 }} + {{- end }} + rules: + - filters: + - requestRedirect: + scheme: https + statusCode: 308 + type: RequestRedirect + matches: + - path: + type: PathPrefix + value: / + hostnames: + - {{ .Values.coder.httproute.host | quote }} + {{- with .Values.coder.httproute.wildcardHost }} + - {{ . | quote }} + {{- end }} + {{- end }} {{- end }} diff --git a/helm/coder/templates/listenerset.yaml b/helm/coder/templates/listenerset.yaml new file mode 100644 index 0000000000..617578bd01 --- /dev/null +++ b/helm/coder/templates/listenerset.yaml @@ -0,0 +1,29 @@ +{{- if and .Values.coder.listenerset.enable (empty .Values.coder.listenerset.parentRef) -}} +{{- fail "coder.listenerset.parentRef is required when coder.listenerset.enable=true" -}} +{{- end -}} + +{{- if and .Values.coder.listenerset.enable (empty .Values.coder.listenerset.listeners) -}} +{{- fail "coder.listenerset.listeners is required when coder.listenerset.enable=true" -}} +{{- end -}} + +{{- if .Values.coder.listenerset.enable -}} +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: ListenerSet +metadata: + name: coder + namespace: {{ .Release.Namespace }} + labels: + {{- include "coder.labels" . | nindent 4 }} + annotations: + {{- toYaml .Values.coder.listenerset.annotations | nindent 4 }} +spec: + parentRef: + {{- with .Values.coder.listenerset.parentRef }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.coder.listenerset.listeners }} + listeners: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/helm/coder/tests/chart_test.go b/helm/coder/tests/chart_test.go index 48e03ded73..9e6f82c5db 100644 --- a/helm/coder/tests/chart_test.go +++ b/helm/coder/tests/chart_test.go @@ -157,6 +157,14 @@ var testCases = []testCase{ name: "host_aliases", expectedError: "", }, + { + name: "listenerset", + expectedError: "", + }, + { + name: "listenerset_redirect", + expectedError: "", + }, } type testCase struct { diff --git a/helm/coder/tests/testdata/listenerset.golden b/helm/coder/tests/testdata/listenerset.golden new file mode 100644 index 0000000000..808ad7d18e --- /dev/null +++ b/helm/coder/tests/testdata/listenerset.golden @@ -0,0 +1,251 @@ +--- +# Source: coder/templates/coder.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: default +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: coder-workspace-perms + namespace: default +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "coder" + namespace: default +subjects: + - kind: ServiceAccount + name: "coder" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: coder-workspace-perms +--- +# Source: coder/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: LoadBalancer + sessionAffinity: None + ports: + - name: "http" + port: 80 + targetPort: "http" + protocol: TCP + nodePort: + externalTrafficPolicy: "Cluster" + selector: + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name +--- +# Source: coder/templates/coder.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/name: coder + template: + metadata: + annotations: + app.kubernetes.io/component: coderd + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - coder + topologyKey: kubernetes.io/hostname + weight: 1 + containers: + - args: + - server + command: + - /opt/coder + env: + - name: CODER_HTTP_ADDRESS + value: 0.0.0.0:8080 + - name: CODER_PROMETHEUS_ADDRESS + value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 + - name: CODER_ACCESS_URL + value: http://coder.default.svc.cluster.local + - name: KUBE_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CODER_DERP_SERVER_RELAY_URL + value: http://$(KUBE_POD_IP):8080 + image: ghcr.io/coder/coder:latest + imagePullPolicy: IfNotPresent + lifecycle: {} + name: coder + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + resources: + limits: + cpu: 2000m + memory: 4096Mi + requests: + cpu: 2000m + memory: 4096Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: null + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + volumeMounts: [] + restartPolicy: Always + serviceAccountName: coder + terminationGracePeriodSeconds: 60 + volumes: [] +--- +# Source: coder/templates/httproute.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRefs: + - name: fake-gateway + namespace: fake-ns + rules: + - backendRefs: + - name: coder + # gateway api does not support named ports + port: 80 + hostnames: + - "coder.example.com" +--- +# Source: coder/templates/listenerset.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: ListenerSet +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRef: + name: fake-gateway + namespace: fake-ns + listeners: + - name: https + port: 443 + protocol: HTTPS diff --git a/helm/coder/tests/testdata/listenerset.yaml b/helm/coder/tests/testdata/listenerset.yaml new file mode 100644 index 0000000000..e64dd0274c --- /dev/null +++ b/helm/coder/tests/testdata/listenerset.yaml @@ -0,0 +1,18 @@ +coder: + image: + tag: latest + httproute: + enable: true + parentRefs: + - name: fake-gateway + namespace: fake-ns + host: coder.example.com + listenerset: + enable: true + parentRef: + name: fake-gateway + namespace: fake-ns + listeners: + - name: https + port: 443 + protocol: HTTPS diff --git a/helm/coder/tests/testdata/listenerset_coder.golden b/helm/coder/tests/testdata/listenerset_coder.golden new file mode 100644 index 0000000000..d88d3eaa56 --- /dev/null +++ b/helm/coder/tests/testdata/listenerset_coder.golden @@ -0,0 +1,251 @@ +--- +# Source: coder/templates/coder.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: coder +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: coder-workspace-perms + namespace: coder +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "coder" + namespace: coder +subjects: + - kind: ServiceAccount + name: "coder" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: coder-workspace-perms +--- +# Source: coder/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: LoadBalancer + sessionAffinity: None + ports: + - name: "http" + port: 80 + targetPort: "http" + protocol: TCP + nodePort: + externalTrafficPolicy: "Cluster" + selector: + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name +--- +# Source: coder/templates/coder.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: coder +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/name: coder + template: + metadata: + annotations: + app.kubernetes.io/component: coderd + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - coder + topologyKey: kubernetes.io/hostname + weight: 1 + containers: + - args: + - server + command: + - /opt/coder + env: + - name: CODER_HTTP_ADDRESS + value: 0.0.0.0:8080 + - name: CODER_PROMETHEUS_ADDRESS + value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 + - name: CODER_ACCESS_URL + value: http://coder.coder.svc.cluster.local + - name: KUBE_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CODER_DERP_SERVER_RELAY_URL + value: http://$(KUBE_POD_IP):8080 + image: ghcr.io/coder/coder:latest + imagePullPolicy: IfNotPresent + lifecycle: {} + name: coder + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + resources: + limits: + cpu: 2000m + memory: 4096Mi + requests: + cpu: 2000m + memory: 4096Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: null + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + volumeMounts: [] + restartPolicy: Always + serviceAccountName: coder + terminationGracePeriodSeconds: 60 + volumes: [] +--- +# Source: coder/templates/httproute.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRefs: + - name: fake-gateway + namespace: fake-ns + rules: + - backendRefs: + - name: coder + # gateway api does not support named ports + port: 80 + hostnames: + - "coder.example.com" +--- +# Source: coder/templates/listenerset.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: ListenerSet +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRef: + name: fake-gateway + namespace: fake-ns + listeners: + - name: https + port: 443 + protocol: HTTPS diff --git a/helm/coder/tests/testdata/listenerset_redirect.golden b/helm/coder/tests/testdata/listenerset_redirect.golden new file mode 100644 index 0000000000..3443a4898d --- /dev/null +++ b/helm/coder/tests/testdata/listenerset_redirect.golden @@ -0,0 +1,286 @@ +--- +# Source: coder/templates/coder.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: default +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: coder-workspace-perms + namespace: default +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "coder" + namespace: default +subjects: + - kind: ServiceAccount + name: "coder" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: coder-workspace-perms +--- +# Source: coder/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: LoadBalancer + sessionAffinity: None + ports: + - name: "http" + port: 80 + targetPort: "http" + protocol: TCP + nodePort: + externalTrafficPolicy: "Cluster" + selector: + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name +--- +# Source: coder/templates/coder.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/name: coder + template: + metadata: + annotations: + app.kubernetes.io/component: coderd + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - coder + topologyKey: kubernetes.io/hostname + weight: 1 + containers: + - args: + - server + command: + - /opt/coder + env: + - name: CODER_HTTP_ADDRESS + value: 0.0.0.0:8080 + - name: CODER_PROMETHEUS_ADDRESS + value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 + - name: CODER_ACCESS_URL + value: http://coder.default.svc.cluster.local + - name: KUBE_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CODER_DERP_SERVER_RELAY_URL + value: http://$(KUBE_POD_IP):8080 + image: ghcr.io/coder/coder:latest + imagePullPolicy: IfNotPresent + lifecycle: {} + name: coder + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + resources: + limits: + cpu: 2000m + memory: 4096Mi + requests: + cpu: 2000m + memory: 4096Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: null + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + volumeMounts: [] + restartPolicy: Always + serviceAccountName: coder + terminationGracePeriodSeconds: 60 + volumes: [] +--- +# Source: coder/templates/httproute.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRefs: + - name: fake-gateway + namespace: fake-ns + rules: + - backendRefs: + - name: coder + # gateway api does not support named ports + port: 80 + hostnames: + - "coder.example.com" +--- +# Source: coder/templates/httproute.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder-https-redirect + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRefs: + - name: fake-gateway + port: 80 + rules: + - filters: + - requestRedirect: + scheme: https + statusCode: 308 + type: RequestRedirect + matches: + - path: + type: PathPrefix + value: / + hostnames: + - "coder.example.com" +--- +# Source: coder/templates/listenerset.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: ListenerSet +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRef: + name: fake-gateway + namespace: fake-ns + listeners: + - name: https + port: 443 + protocol: HTTPS + - name: http + port: 80 + protocol: HTTP diff --git a/helm/coder/tests/testdata/listenerset_redirect.yaml b/helm/coder/tests/testdata/listenerset_redirect.yaml new file mode 100644 index 0000000000..0897dc47c6 --- /dev/null +++ b/helm/coder/tests/testdata/listenerset_redirect.yaml @@ -0,0 +1,26 @@ +coder: + image: + tag: latest + httproute: + enable: true + parentRefs: + - name: fake-gateway + namespace: fake-ns + host: coder.example.com + httpsRedirect: + enable: true + parentRefs: + - name: fake-gateway + port: 80 + listenerset: + enable: true + parentRef: + name: fake-gateway + namespace: fake-ns + listeners: + - name: https + port: 443 + protocol: HTTPS + - name: http + port: 80 + protocol: HTTP diff --git a/helm/coder/tests/testdata/listenerset_redirect_coder.golden b/helm/coder/tests/testdata/listenerset_redirect_coder.golden new file mode 100644 index 0000000000..aa8b700a24 --- /dev/null +++ b/helm/coder/tests/testdata/listenerset_redirect_coder.golden @@ -0,0 +1,286 @@ +--- +# Source: coder/templates/coder.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: coder +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: coder-workspace-perms + namespace: coder +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "coder" + namespace: coder +subjects: + - kind: ServiceAccount + name: "coder" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: coder-workspace-perms +--- +# Source: coder/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: LoadBalancer + sessionAffinity: None + ports: + - name: "http" + port: 80 + targetPort: "http" + protocol: TCP + nodePort: + externalTrafficPolicy: "Cluster" + selector: + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name +--- +# Source: coder/templates/coder.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: coder +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/name: coder + template: + metadata: + annotations: + app.kubernetes.io/component: coderd + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - coder + topologyKey: kubernetes.io/hostname + weight: 1 + containers: + - args: + - server + command: + - /opt/coder + env: + - name: CODER_HTTP_ADDRESS + value: 0.0.0.0:8080 + - name: CODER_PROMETHEUS_ADDRESS + value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 + - name: CODER_ACCESS_URL + value: http://coder.coder.svc.cluster.local + - name: KUBE_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CODER_DERP_SERVER_RELAY_URL + value: http://$(KUBE_POD_IP):8080 + image: ghcr.io/coder/coder:latest + imagePullPolicy: IfNotPresent + lifecycle: {} + name: coder + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + resources: + limits: + cpu: 2000m + memory: 4096Mi + requests: + cpu: 2000m + memory: 4096Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: null + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + volumeMounts: [] + restartPolicy: Always + serviceAccountName: coder + terminationGracePeriodSeconds: 60 + volumes: [] +--- +# Source: coder/templates/httproute.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRefs: + - name: fake-gateway + namespace: fake-ns + rules: + - backendRefs: + - name: coder + # gateway api does not support named ports + port: 80 + hostnames: + - "coder.example.com" +--- +# Source: coder/templates/httproute.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: coder-https-redirect + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRefs: + - name: fake-gateway + port: 80 + rules: + - filters: + - requestRedirect: + scheme: https + statusCode: 308 + type: RequestRedirect + matches: + - path: + type: PathPrefix + value: / + hostnames: + - "coder.example.com" +--- +# Source: coder/templates/listenerset.yaml +apiVersion: gateway.networking.k8s.io/v1 +kind: ListenerSet +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + parentRef: + name: fake-gateway + namespace: fake-ns + listeners: + - name: https + port: 443 + protocol: HTTPS + - name: http + port: 80 + protocol: HTTP diff --git a/helm/coder/values.yaml b/helm/coder/values.yaml index 366ec5dd38..a1c0c40cca 100644 --- a/helm/coder/values.yaml +++ b/helm/coder/values.yaml @@ -437,6 +437,46 @@ coder: # use for the wildcard host. wildcardSecretName: "" + # coder.listenerset -- The ListenerSet object to expose for Coder. + # ListenerSet graduated to the Standard channel in Gateway API v1.5.0. + # Ensure Gateway API v1.5.0+ CRDs are installed, your Gateway controller + # supports ListenerSet, and the parent Gateway has allowedListeners configured. + listenerset: + # coder.listenerset.enable -- Whether to create the ListenerSet object. + enable: false + # coder.listenerset.annotations -- The ListenerSet annotations. + annotations: {} + # coder.listenerset.parentRef -- the parentRef to bind the ListenerSet to + # name: my-gateway + # namespace: gateway-namespace + parentRef: {} + # coder.listenerset.listeners -- logical endpoints that are bound on the Gateway's addresses + # - name: http + # hostname: "chart-example.local" + # port: 80 + # protocol: HTTP + # - name: http-wildcard + # hostname: "*.chart-example.local" + # port: 80 + # protocol: HTTP + # - name: https + # hostname: "*.chart-example.local" + # port: 443 + # protocol: HTTPS + # tls: + # mode: Terminate + # certificateRefs: + # - name: chart-example-tls + # - name: https-wildcard + # hostname: "chart-example.local" + # port: 443 + # protocol: HTTPS + # tls: + # mode: Terminate + # certificateRefs: + # - name: chart-example-tls + listeners: [] + # coder.httproute -- The HTTPRoute object to expose for Coder. httproute: # coder.httproute.enable -- Whether to create the HTTPRoute object. If using a @@ -448,6 +488,12 @@ coder: # namespace: gateway-namespace # # sectionName is optional to fix to a specific listener # sectionName: listener-name + # - kind: ListenerSet + # name: coder + # port: 80 + # - kind: ListenerSet + # name: coder + # port: 443 parentRefs: [] # coder.httproute.host -- The hostname to match on. # Be sure to also set CODER_ACCESS_URL within coder.env[] @@ -461,6 +507,17 @@ coder: wildcardHost: "" # coder.httproute.annotations -- The HTTPRoute annotations. annotations: {} + # coder.httproute.httpsRedirect -- Create an HTTPRoute object to request redirect to https + httpsRedirect: + # coder.httproute.httpsRedirect.enable -- Whether to create the redirect HTTPRoute object. + enable: false + # coder.httproute.httpsRedirect.annotations -- The redirect HTTPRoute annotations. + annotations: {} + # coder.httproute.httpsRedirect.parentRefs -- the parentRefs to bind the route to + # - kind: ListenerSet + # name: coder + # port: 80 + parentRefs: [] # coder.command -- The command to use when running the Coder container. Used # for customizing the location of the `coder` binary in your image.