blob: 463087e9f746f6ec496fb6ebbe811e27adafdf07 [file] [log] [blame]
vuko6c678e32020-05-22 22:02:22 +02001# this is libjsonnet library for kubernetes related things
2local kube = import '../../../kube/kube.libsonnet';
3
4{
5 local shells = self,
6 local cfg = shells.cfg,
7
8 # namespace defining parameters used by other functions
9 # double colon "::" prevents it from appearing in output file
10 cfg:: {
11 namespace: "personal-vuko",
12 appName: "three-shell-system",
13 domain: "shells.vuko.pl",
14
15 nginx_tag: "latest",
16 nginx_image: "nginxinc/nginx-unprivileged:stable-alpine",
17
18 storageClassName: "waw-hdd-redundant-2",
19
20 resources: {
21 requests: {
22 cpu: "25m",
23 memory: "50Mi",
24 },
25 limits: {
26 cpu: "100m",
27 memory: "200Mi",
28 },
29 },
30 },
31
32 # kubernete namespace personal-${name} for personal usage
33 namespace: kube.Namespace(cfg.namespace),
34
35 # function used for configuring components metatada
36 metadata(component):: {
37 namespace: cfg.namespace,
38 labels: {
39 "app.kubernetes.io/name": cfg.appName,
40 "app.kubernetes.io/managed-by": "kubecfg",
41 "app.kubernetes.io/component": component,
42 },
43 },
44
45 # component - persistant (non volatile) memory
46 # https://kubernetes.io/docs/concepts/storage/persistent-volumes/
47 dataVolume: kube.PersistentVolumeClaim("html-data") {
48 # override default PersistentVolumeClaim metatada with values defined
49 # in medadata function prevoiusly created
50 # "+" sign before means override
51 metadata+: shells.metadata("html-data"),
52 spec+: {
53 storageClassName: cfg.storageClassName,
54 # can be connected to multiple containers
55 accessModes: [ "ReadWriteMany" ],
56 resources: {
57 requests: {
58 # amount of storage space: 500Mb
59 storage: "500Mi",
60 },
61 },
62 },
63 },
64
65 # deployment declares pods
66 # https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
67 deployment: kube.Deployment("shells") {
68 metadata+: shells.metadata("shells"),
69 spec+: {
70 replicas: 1,
71 template+: {
72 spec+: {
73 # names ending with _ have special meaning in this context
74 # this is specified in ../../../kube/kube.upstream.jsonnet
75 # volumes_ { key: { ... } } is converted to volumes [{ name: key, ... }]
76 volumes_: {
77 # sftp container host keys secrets saved to kubernetes semi-manually using create-secrets.py
78 # https://kubernetes.io/docs/concepts/configuration/secret/
79 host_keys: { secret: { secretName: "shells-ssh-host-key-bd65mg4gbt" } },
80 # sftp container authorized_keys saved to kubernetes using command:
81 # kubectl -n personal-vuko create secret generic shells-ssh-authorized-keys --from-file="authorized_keys=${HOME}/.ssh/id_ed25519.pub"
82 authorized_keys: { secret: { secretName: "shells-ssh-authorized-keys", defaultMode: 256 } },
83 # to use created volume in deployment we need to claim it
84 html: kube.PersistentVolumeClaimVolume(shells.dataVolume),
85 },
86 # here are containers defined
87 # when they are defined in one deployment
88 containers_: {
89 shells: kube.Container("nginx") {
90 image: cfg.nginx_image,
91 ports_: {
92 http: { containerPort: 80 },
93 },
94 resources: cfg.resources,
95 volumeMounts_: {
96 html: { mountPath: "/usr/share/nginx/html" },
97 },
98 },
99 sftp: kube.Container("sftp") {
100 image: "registry.k0.hswaw.net/vuko/hs-shells-sftp:latest",
101 ports_: {
102 sftp: { containerPort: 2222 },
103 },
104 command: [ "/bin/start" ],
105 resources: cfg.resources,
106 securityContext: {
107 # specify uid of user running command
108 runAsUser: 1,
109 },
110 volumeMounts_: {
111 # here volumes defined in volumes_ can be mounted
112 host_keys: { mountPath: "/etc/ssh/host" },
113 authorized_keys: { mountPath: "/etc/ssh/auth" },
114 html: { mountPath: "/data" },
115 },
116 },
117 },
118 },
119 },
120 },
121 },
122
123 # defining a service of type LoadBancer gives you acces from internet
124 # run: kubectl -n personal-${user} get services to see ip address
125 svc: kube.Service("shells") {
126 metadata+: shells.metadata("shells"),
127 target_pod:: shells.deployment.spec.template,
128 spec+: {
129 ports: [
130 { name: "http", port: 80, targetPort: 8080, protocol: "TCP" },
131 { name: "sftp", port: 22, targetPort: 2222, protocol: "TCP" },
132 ],
133 type: "LoadBalancer",
134 externalTrafficPolicy: "Local",
135 },
136 },
137
138 # ingress creates VirtualHost on ingress.k0.hswaw.net forwaring http(s)
139 # requests to your domain to specified Pod/container
140 ingress: kube.Ingress("frontend") {
141 metadata+: shells.metadata("frontend") {
142 annotations+: {
143 "kubernetes.io/tls-acme": "true",
144 "certmanager.k8s.io/cluster-issuer": "letsencrypt-prod",
145 },
146 },
147 spec+: {
148 tls: [
149 { hosts: [cfg.domain], secretName: "shells-frontend-tls"}
150 ],
151 rules: [
152 {
153 host: cfg.domain,
154 http: {
155 paths: [
156 { path: "/", backend: shells.svc.name_port },
157 ],
158 },
159 },
160 ],
161 },
162 },
163}