added k3d test scripts

This commit is contained in:
James Wynn 2023-01-11 09:47:34 -06:00
parent 98ce0e8c2e
commit b724f520cd
12 changed files with 283 additions and 0 deletions

View File

@ -20,5 +20,7 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
**/.next
README.md
config/
k3d/

22
Dockerfile-tilt Normal file
View File

@ -0,0 +1,22 @@
# syntax = docker/dockerfile:latest
FROM docker.io/node:18-alpine
WORKDIR /app
COPY --link package.json pnpm-lock.yaml* ./
RUN <<EOF
set -xe
apk add libc6-compat
apk add --virtual .gyp python3 make g++
npm install -g pnpm
npm install -g next
EOF
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm install -r --offline
COPY . .
CMD ["npx", "next", "dev"]

2
k3d/.envrc Normal file
View File

@ -0,0 +1,2 @@
#shellcheck disable=SC2148,SC2155
export KUBECONFIG=$(readlink -f ./kubeconfig)

2
k3d/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
kubeconfig

64
k3d/README.md Normal file
View File

@ -0,0 +1,64 @@
# Kubernetes Development
These configs and scripts attempt to simplify spinning up a kubernetes cluster
for development and testing purposes. It leverages [k3d](https://k3d.io) to create
a [k3s](https://k3s.io) cluster in Docker. Homepage can then be deployed either via
the `k3d-deploy.sh` script, or [tilt](https://tilt.dev) can be used to spin up a
local CI loop that will automatically update the deployment.
All the commands in the document should be run from the `k3d` directory.
## Requisite Tools
| Tool | Description |
|-------------------------------------------------------------|----------------------------------------------------------|
| [docker](https://docker.io) | Docker container runtime |
| [kubectl](https://kubernetes.io/releases/download/#kubectl) | Kubernetes CLI |
| [helm](https://helm.sh) | Kubernetes package manager |
| [k3d](https://k3d.io) | Kubernetes on Docker - used to create the cluster |
| [k9s](https://k9scli.io) | (Optional) Command line view for kubernetes cluster |
| [tilt](https://tilt.dev) | (Optional) Local CI loop for kubernetes deployment |
| [direnv](https://direnv.net/) | (Optional) Automatically loads `kubeconfig` via `.envrc` |
## One-off Test Deployments
Create a cluster:
```sh
./k3d-up.sh
```
Build and deploy:
```sh
./k3d-deploy.sh
```
Open the Homepage deployment:
```sh
xdg-open http://homepage.k3d.localhost:8080/
```
## Continuous Deployment
Create a cluster:
```sh
./k3d-up.sh
```
Kick off tilt:
```sh
tilt up
```
Press space bar to open the tilt web UI, which is quite informative.
Open the Homepage deployment:
```sh
xdg-open http://homepage.k3d.localhost:8080/
```

24
k3d/Tiltfile Normal file
View File

@ -0,0 +1,24 @@
docker_build('k3d-registry.localhost:55000/homepage:local', '..',
dockerfile = "../Dockerfile-tilt",
build_args={'node_env': 'development'},
#entrypoint='pnpm run nodemon /app/server.js',
live_update=[
sync('.', '/app'),
run('cd /app && pnpm install', trigger=['.package.json', './pnpm-lock.yaml'])
]
)
load('ext://helm_resource', 'helm_resource', 'helm_repo')
helm_repo('jameswynn', 'https://jameswynn.github.io/helm-charts')
helm_resource('homepage', 'jameswynn/homepage',
image_deps=[
"k3d-registry.localhost:55000/homepage:local"
],
image_keys=[
("image.repository", "image.tag")
],
# image_selector= "k3d-registry.localhost:55000/homepage:local",
flags=[
"-f", "k3d-helm-values.yaml"
]
)

14
k3d/k3d-deploy.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
DOCKER_BUILDKIT=1 docker build -t k3d-registry.localhost:55000/homepage:local .
docker push k3d-registry.localhost:55000/homepage:local
HELM_REPO_NAME=jameswynn
HELM_REPO_URL=https://jameswynn.github.io/helm-charts
if ! helm repo list | grep $HELM_REPO_URL > /dev/null; then
helm repo add $HELM_REPO_NAME $HELM_REPO_URL
helm repo update
fi
helm upgrade --install homepage jameswynn/homepage -f k3d-helm-values.yaml

4
k3d/k3d-down.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
k3d cluster delete homepage
rm kubeconfig

77
k3d/k3d-helm-values.yaml Normal file
View File

@ -0,0 +1,77 @@
image:
repository: k3d-registry.localhost:55000/homepage
tag: local
pullPolicy: IfNotPresent
config:
bookmarks:
- Developer:
- Github:
- abbr: GH
href: https://github.com/
services:
- My First Group:
- My First Service:
href: http://localhost/
description: Homepage is awesome
- My Second Group:
- My Second Service:
href: http://localhost/
description: Homepage is the best
- My Third Group:
- My Third Service:
href: http://localhost/
description: Homepage is 😎
widgets:
# show the kubernetes widget, with the cluster summary and individual nodes
- kubernetes:
cluster:
show: true
cpu: true
memory: true
showLabel: true
label: "cluster"
nodes:
show: true
cpu: true
memory: true
showLabel: true
- search:
provider: duckduckgo
target: _blank
kubernetes:
mode: cluster
docker:
settings:
serviceAccount:
create: true
name: homepage
enableRbac: true
ingress:
main:
enabled: true
annotations:
gethomepage.dev/enabled: "true"
gethomepage.dev/name: "Homepage"
gethomepage.dev/description: "Dynamically Detected Homepage"
gethomepage.dev/group: "Dynamic"
gethomepage.dev/icon: "homepage.png"
hosts:
- host: homepage.k3d.localhost
paths:
- path: /
pathType: Prefix
persistence:
# this persists the .next directory which greatly improves successive pod startup times
dotnext:
enabled: true
type: pvc
accessMode: ReadWriteOnce
size: 1Gi
mountPath: /app/.next

9
k3d/k3d-up.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
k3d cluster create --config k3d.yaml --wait
k3d kubeconfig get homepage > kubeconfig
chmod 600 kubeconfig
export KUBECONFIG=$(pwd)/kubeconfig
echo "Waiting for traefik install job to complete (CTRL+C is safe if you're impatient)"
kubectl wait jobs/helm-install-traefik -n kube-system --for condition=complete --timeout 90s && echo "Completed" || echo "Timed out"

59
k3d/k3d.yaml Normal file
View File

@ -0,0 +1,59 @@
kind: Simple
apiVersion: k3d.io/v1alpha3
name: homepage
servers: 1
agents: 2
kubeAPI:
hostIP: 0.0.0.0
hostPort: "6443"
image: rancher/k3s:v1.25.5-k3s1
volumes:
- volume: /tmp:/tmp/k3d-homepage
nodeFilters:
- all
ports:
- port: 8080:80
nodeFilters:
- loadbalancer
- port: 0.0.0.0:8443:443
nodeFilters:
- loadbalancer
options:
k3d:
wait: true
timeout: 6m0s
disableLoadbalancer: false
disableImageVolume: false
disableRollback: false
k3s:
extraArgs:
- arg: --tls-san=127.0.0.1
nodeFilters:
- server:*
nodeLabels: []
kubeconfig:
updateDefaultKubeconfig: false
switchCurrentContext: false
runtime:
gpuRequest: ""
serversMemory: "1024Mi"
agentsMemory: "1024Mi"
labels:
- label: foo=bar
nodeFilters:
- server:0
- loadbalancer
env:
- envVar: bar=baz
nodeFilters:
- all
registries:
create:
name: k3d-registry
# host: 0.0.0.0
hostPort: "55000"
config: |
mirrors:
"k3d-registry.localhost:55000":
endpoint:
- http://k3d-registry:5000

View File

@ -141,3 +141,7 @@ Configure it from the `widgets.yaml`.
- node1
- node2
```
## Testing
Refer to the [k3d readme](k3d/README.md).