diff --git a/examples/default.nix b/examples/default.nix new file mode 100644 index 0000000..3b705b7 --- /dev/null +++ b/examples/default.nix @@ -0,0 +1,5 @@ +{ kubenix ? import ./.. {} }: + +{ + nginx-deployment = import ./nginx-deployment { inherit kubenix; }; +} diff --git a/examples/nginx-deployment/README.md b/examples/nginx-deployment/README.md new file mode 100644 index 0000000..bc57e51 --- /dev/null +++ b/examples/nginx-deployment/README.md @@ -0,0 +1,18 @@ +# Example: kubernetes nginx deployment + +A simple example creating kubernetes nginx deployment and associated docker +image + +## Usage + +### Building and applying kubernetes yaml file + +``` +nix-instantiate --eval --strict --json -A listObject | kubectl apply -f - +``` + +### Building and pushing docker images + +``` +nix run -f ./. pushDockerImages -c copy-docker-images +``` diff --git a/examples/nginx-deployment/default.nix b/examples/nginx-deployment/default.nix new file mode 100644 index 0000000..d9bfbc9 --- /dev/null +++ b/examples/nginx-deployment/default.nix @@ -0,0 +1,33 @@ +{ kubenix ? import ../.. {} }: + +with kubenix.lib; + +let + registy = "docker.io/gatehub"; +in rec { + # evaluated configuration + config = (kubenix.evalModules { + modules = [ + ./module.nix + { docker.registry.url = registy; } + ]; + }).config; + + # list of kubernetes objects + objects = config.kubernetes.objects; + + # hashed kubernetes List object + listObject = k8s.mkHashedList { items = config.kubernetes.objects; }; + + # YAML file you can deploy to kubernetes + yaml = toYAML listObject; + + # Exported docker images + images = config.docker.export; + + # script to push docker images to registry + pushDockerImages = docker.copyDockerImages { + inherit images; + dest = "docker://${registy}"; + }; +} diff --git a/examples/nginx-deployment/image.nix b/examples/nginx-deployment/image.nix new file mode 100644 index 0000000..8fb0fc3 --- /dev/null +++ b/examples/nginx-deployment/image.nix @@ -0,0 +1,18 @@ +{ dockerTools, nginx }: + +dockerTools.buildLayeredImage { + name = "nginx"; + contents = [ nginx ]; + extraCommands = '' + mkdir etc + chmod u+w etc + echo "nginx:x:1000:1000::/:" > etc/passwd + echo "nginx:x:1000:nginx" > etc/group + ''; + config = { + Cmd = ["nginx" "-c" "/etc/nginx/nginx.conf"]; + ExposedPorts = { + "80/tcp" = {}; + }; + }; +} diff --git a/examples/nginx-deployment/module.nix b/examples/nginx-deployment/module.nix new file mode 100644 index 0000000..645fd4c --- /dev/null +++ b/examples/nginx-deployment/module.nix @@ -0,0 +1,64 @@ +{ config, lib, pkgs, test, kubenix, ... }: + +with lib; + +let + nginx = pkgs.callPackage ./image.nix { }; +in { + imports = [ kubenix.module ]; + + docker.images.nginx.image = nginx; + + kubernetes.api.deployments.nginx = { + spec = { + replicas = 10; + selector.matchLabels.app = "nginx"; + template = { + metadata.labels.app = "nginx"; + spec = { + securityContext.fsGroup = 1000; + containers.nginx = { + image = config.docker.images.nginx.path; + imagePullPolicy = "IfNotPresent"; + volumeMounts."/etc/nginx".name = "config"; + volumeMounts."/var/lib/html".name = "static"; + }; + volumes.config.persistentVolumeClaim.claimName = "config"; + volumes.static.persistentVolumeClaim.claimName = "static"; + }; + }; + }; + }; + + kubernetes.api.configmaps.nginx-config.data."nginx.conf" = '' + user nginx nginx; + daemon off; + error_log /dev/stdout info; + pid /dev/null; + events {} + http { + access_log /dev/stdout; + server { + listen 80; + index index.html; + location / { + root /var/lib/html; + } + } + } + ''; + + kubernetes.api.configmaps.nginx-static.data."index.html" = '' +