feat(examples): add nginx deployment

This commit is contained in:
Jaka Hudoklin 2019-03-07 18:03:51 +01:00
parent 5d8b66f8a0
commit 432cc9e347
No known key found for this signature in database
GPG key ID: 6A08896BFD32BD95
6 changed files with 140 additions and 0 deletions

5
examples/default.nix Normal file
View file

@ -0,0 +1,5 @@
{ kubenix ? import ./.. {} }:
{
nginx-deployment = import ./nginx-deployment { inherit kubenix; };
}

View file

@ -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
```

View file

@ -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}";
};
}

View file

@ -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" = {};
};
};
}

View file

@ -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" = ''
<html><body><h1>Hello from NGINX</h1></body></html>
'';
kubernetes.api.services.nginx = {
spec = {
ports = [{
name = "http";
port = 80;
}];
selector.app = "nginx";
};
};
}

View file

@ -82,4 +82,6 @@ in {
tests = import ./tests {
inherit pkgs lib kubenix;
};
examples = import ./examples {};
}