183 lines
6.1 KiB
Nix
183 lines
6.1 KiB
Nix
# This test runs two node kubernetes cluster and checks if simple redis pod works
|
|
|
|
import ./make-test.nix ({ pkgs, ...} : rec {
|
|
name = "kubernetes";
|
|
meta = with pkgs.stdenv.lib.maintainers; {
|
|
maintainers = [ offline ];
|
|
};
|
|
|
|
redisMaster = builtins.toFile "redis-master-pod.yaml" ''
|
|
id: redis-master-pod
|
|
kind: Pod
|
|
apiVersion: v1beta1
|
|
desiredState:
|
|
manifest:
|
|
version: v1beta1
|
|
id: redis-master-pod
|
|
containers:
|
|
- name: master
|
|
image: master:5000/nix
|
|
cpu: 100
|
|
ports:
|
|
- name: redis-server
|
|
containerPort: 6379
|
|
hostPort: 6379
|
|
volumeMounts:
|
|
- name: nix-store
|
|
mountPath: /nix/store
|
|
readOnly: true
|
|
volumeMounts:
|
|
- name: system-profile
|
|
mountPath: /bin
|
|
readOnly: true
|
|
command:
|
|
- /bin/redis-server
|
|
volumes:
|
|
- name: nix-store
|
|
source:
|
|
hostDir:
|
|
path: /nix/store
|
|
- name: system-profile
|
|
source:
|
|
hostDir:
|
|
path: /run/current-system/sw/bin
|
|
labels:
|
|
name: redis
|
|
role: master
|
|
'';
|
|
|
|
nodes = {
|
|
master =
|
|
{ config, pkgs, lib, nodes, ... }:
|
|
{
|
|
virtualisation.memorySize = 768;
|
|
services.kubernetes = {
|
|
roles = ["master" "node"];
|
|
dockerCfg = ''{"master:5000":{}}'';
|
|
controllerManager.machines = ["master" "node"];
|
|
apiserver.address = "0.0.0.0";
|
|
verbose = true;
|
|
};
|
|
virtualisation.docker.extraOptions = "--iptables=false --ip-masq=false -b cbr0 --insecure-registry master:5000";
|
|
|
|
services.etcd = {
|
|
listenPeerUrls = ["http://0.0.0.0:7001"];
|
|
initialAdvertisePeerUrls = ["http://master:7001"];
|
|
initialCluster = ["master=http://master:7001" "node=http://node:7001"];
|
|
};
|
|
services.dockerRegistry.enable = true;
|
|
services.dockerRegistry.host = "0.0.0.0";
|
|
services.dockerRegistry.port = 5000;
|
|
|
|
virtualisation.vlans = [ 1 2 ];
|
|
networking.bridges = {
|
|
cbr0.interfaces = [ "eth2" ];
|
|
};
|
|
networking.interfaces = {
|
|
cbr0 = {
|
|
ipAddress = "10.10.0.1";
|
|
prefixLength = 24;
|
|
};
|
|
eth2.ip4 = lib.mkOverride 0 [ ];
|
|
};
|
|
networking.localCommands = ''
|
|
ip route add 10.10.0.0/16 dev cbr0
|
|
ip route flush cache
|
|
'';
|
|
networking.extraHosts = "127.0.0.1 master";
|
|
|
|
networking.firewall.enable = false;
|
|
#networking.firewall.allowedTCPPorts = [ 4001 7001 ];
|
|
|
|
environment.systemPackages = [ pkgs.redis ];
|
|
};
|
|
|
|
node =
|
|
{ config, pkgs, lib, nodes, ... }:
|
|
{
|
|
services.kubernetes = {
|
|
roles = ["node"];
|
|
dockerCfg = ''{"master:5000":{}}'';
|
|
kubelet.apiServers = ["master:8080"];
|
|
verbose = true;
|
|
};
|
|
virtualisation.docker.extraOptions = "--iptables=false --ip-masq=false -b cbr0 --insecure-registry master:5000";
|
|
services.etcd = {
|
|
listenPeerUrls = ["http://0.0.0.0:7001"];
|
|
initialAdvertisePeerUrls = ["http://node:7001"];
|
|
initialCluster = ["master=http://master:7001" "node=http://node:7001"];
|
|
};
|
|
|
|
virtualisation.vlans = [ 1 2 ];
|
|
networking.bridges = {
|
|
cbr0.interfaces = [ "eth2" ];
|
|
};
|
|
networking.interfaces = {
|
|
cbr0 = {
|
|
ipAddress = "10.10.1.1";
|
|
prefixLength = 24;
|
|
};
|
|
eth2.ip4 = lib.mkOverride 0 [ ];
|
|
};
|
|
networking.localCommands = ''
|
|
ip route add 10.10.0.0/16 dev cbr0
|
|
ip route flush cache
|
|
'';
|
|
networking.extraHosts = "127.0.0.1 node";
|
|
|
|
networking.firewall.enable = false;
|
|
#networking.firewall.allowedTCPPorts = [ 4001 7001 ];
|
|
|
|
environment.systemPackages = [ pkgs.redis ];
|
|
};
|
|
|
|
client =
|
|
{ config, pkgs, nodes, ... }:
|
|
{
|
|
virtualisation.docker.enable = true;
|
|
virtualisation.docker.extraOptions = "--insecure-registry master:5000";
|
|
environment.systemPackages = [ pkgs.kubernetes ];
|
|
environment.etc."test/redis-master-pod.yaml".source = redisMaster;
|
|
environment.etc."test/pause".source = "${pkgs.kubernetes}/bin/kube-pause";
|
|
environment.etc."test/Dockerfile".source = pkgs.writeText "Dockerfile" ''
|
|
FROM scratch
|
|
ADD pause /
|
|
ENTRYPOINT ["/pause"]
|
|
'';
|
|
};
|
|
};
|
|
|
|
testScript = ''
|
|
startAll;
|
|
|
|
$master->waitForUnit("kubernetes-apiserver.service");
|
|
$master->waitForUnit("kubernetes-scheduler.service");
|
|
$master->waitForUnit("kubernetes-controller-manager.service");
|
|
$master->waitForUnit("kubernetes-kubelet.service");
|
|
$master->waitForUnit("kubernetes-proxy.service");
|
|
|
|
$node->waitForUnit("kubernetes-kubelet.service");
|
|
$node->waitForUnit("kubernetes-proxy.service");
|
|
|
|
$master->waitUntilSucceeds("kubectl get minions | grep master");
|
|
$master->waitUntilSucceeds("kubectl get minions | grep node");
|
|
|
|
$client->waitForUnit("docker.service");
|
|
$client->succeed("tar cv --files-from /dev/null | docker import - nix");
|
|
$client->succeed("docker tag nix master:5000/nix");
|
|
$master->waitForUnit("docker-registry.service");
|
|
$client->succeed("docker push master:5000/nix");
|
|
$client->succeed("mkdir -p /root/pause");
|
|
$client->succeed("cp /etc/test/pause /root/pause/");
|
|
$client->succeed("cp /etc/test/Dockerfile /root/pause/");
|
|
$client->succeed("cd /root/pause && docker build -t master:5000/pause .");
|
|
$client->succeed("docker push master:5000/pause");
|
|
|
|
subtest "simple pod", sub {
|
|
$client->succeed("kubectl create -f ${redisMaster} -s http://master:8080");
|
|
$client->waitUntilSucceeds("kubectl get pods -s http://master:8080 | grep redis-master | grep -i running");
|
|
}
|
|
|
|
'';
|
|
})
|