12 Commits

Author SHA1 Message Date
leonnicolas
b749def837 Prepare move to kilo-io
This commit changes all package paths from squat/kilo to kilo-io/kilo
and the docker image name from squat/kilo to kiloio/squat.
The API name and comments regarding the website kilo.squat.ai are
unchanged.

Signed-off-by: leonnicolas <leonloechner@gmx.de>
2021-08-18 14:53:00 +02:00
Steffen Vogel
1b5ad035d9 kg: add new handler for rendering the topology graph
docker: add missing fonts for rasterized graphviz  output formats

add missing license header

kg: do not export handlers

use http package for status codes

keep checks for errors in a single line

simplify error message about failed invocation of dot

pass node hostname and subnet to graph handler

use SVG as default format for graph handler

register health handler with HandleFunc

add option for selecting layout to graph handler and using circo as new default

e2e: add tests for HTTP handlers

e2e: fix and simplify handler tests

add should comments to assertions

e2s: use assert_fail instead of assert _not

add missing mime-type header for graph handler

use switch/case statements for validating formats / layouts

e2e: fix handlers tests

Co-authored-by: leonnicolas <60091705+leonnicolas@users.noreply.github.com>

graph-handler: add missing font to Dockerfile

Dockerfile: remove unnecessary font

This commit leaves Noto as the only font package, as one font package is
sufficient for the container.

Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
2021-08-18 14:04:44 +02:00
Lucas Servén Marín
ee5300db4c docs: regenerate (#220)
Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
2021-08-07 12:42:36 +02:00
dependabot[bot]
6309529a3f build(deps): bump prismjs from 1.23.0 to 1.24.1 in /website (#207)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.23.0 to 1.24.1.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.23.0...v1.24.1)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-07-16 14:59:11 +02:00
Lucas Servén Marín
2c74a560c4 pkg/wireguard: allow configuring MTU (#215)
This commit makes it possible to configure the MTU for the WireGuard
interface created by Kilo.

Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
2021-07-16 14:23:11 +02:00
leonnicolas
daecc2a0bc Merge pull request #212 from stv0g/k3s-kubeconfig
k3s: Dynamically generate kubeconfig
2021-07-15 16:18:18 +02:00
Steffen Vogel
7c8905f10d k3s: add missing ServiceAccountName to nkml DaemonSet 2021-07-15 15:24:00 +02:00
leonnicolas
3a7e0908bd Merge pull request #213 from squat/update_docusaurus
website: update docusaurus
2021-07-15 15:01:19 +02:00
Steffen Vogel
d1f7c32760 k3s: generate kubeconfig based on token from ServiceAccount and master address & cacert from kubelet kubeconfig (closes #49) 2021-07-15 14:01:38 +02:00
Lucas Servén Marín
8306d92c79 website: update docusaurus
Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
2021-07-14 16:33:45 +02:00
Lucas Servén Marín
abecadf707 manifests,e2e: reduce cluster role permissions (#211)
Since Kilo now uses the `kilo.squat.ai/discovered-endpoints` annotation
for Peer discovery, Kilo no longer needs to update Peer resources, so we
can remove this permission from the ClusterRole. Note, the RBAC in the
manifests is not used today, but we eventually want to migrate to this.

Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
2021-07-14 13:20:05 +02:00
Lucas Servén Marín
e9d1ba88a8 e2e: update adjacency tool
This commit updates the reference to the adjacency tool used in the e2e
tests.

Signed-off-by: Lucas Servén Marín <lserven@gmail.com>
2021-07-13 13:16:34 +02:00
61 changed files with 2197 additions and 1715 deletions

View File

@@ -11,7 +11,7 @@ ARG GOARCH
ARG ALPINE_VERSION=v3.12 ARG ALPINE_VERSION=v3.12
LABEL maintainer="squat <lserven@gmail.com>" LABEL maintainer="squat <lserven@gmail.com>"
RUN echo -e "https://alpine.global.ssl.fastly.net/alpine/$ALPINE_VERSION/main\nhttps://alpine.global.ssl.fastly.net/alpine/$ALPINE_VERSION/community" > /etc/apk/repositories && \ RUN echo -e "https://alpine.global.ssl.fastly.net/alpine/$ALPINE_VERSION/main\nhttps://alpine.global.ssl.fastly.net/alpine/$ALPINE_VERSION/community" > /etc/apk/repositories && \
apk add --no-cache ipset iptables ip6tables wireguard-tools apk add --no-cache ipset iptables ip6tables wireguard-tools graphviz font-noto
COPY --from=cni bridge host-local loopback portmap /opt/cni/bin/ COPY --from=cni bridge host-local loopback portmap /opt/cni/bin/
COPY bin/linux/$GOARCH/kg /opt/bin/ COPY bin/linux/$GOARCH/kg /opt/bin/
ENTRYPOINT ["/opt/bin/kg"] ENTRYPOINT ["/opt/bin/kg"]

View File

@@ -12,9 +12,9 @@ else
endif endif
RELEASE_BINS := $(addprefix bin/release/kgctl-, $(addprefix linux-, $(ALL_ARCH)) darwin-amd64 darwin-arm64 windows-amd64) RELEASE_BINS := $(addprefix bin/release/kgctl-, $(addprefix linux-, $(ALL_ARCH)) darwin-amd64 darwin-arm64 windows-amd64)
PROJECT := kilo PROJECT := kilo
PKG := github.com/squat/$(PROJECT) PKG := github.com/kilo-io/$(PROJECT)
REGISTRY ?= index.docker.io REGISTRY ?= index.docker.io
IMAGE ?= squat/$(PROJECT) IMAGE ?= kiloio/$(PROJECT)
FULLY_QUALIFIED_IMAGE := $(REGISTRY)/$(IMAGE) FULLY_QUALIFIED_IMAGE := $(REGISTRY)/$(IMAGE)
TAG := $(shell git describe --abbrev=0 --tags HEAD 2>/dev/null) TAG := $(shell git describe --abbrev=0 --tags HEAD 2>/dev/null)
@@ -209,7 +209,7 @@ $(BASH_UNIT):
chmod +x $@ chmod +x $@
e2e: container $(KIND_BINARY) $(KUBECTL_BINARY) $(BASH_UNIT) bin/$(OS)/$(ARCH)/kgctl e2e: container $(KIND_BINARY) $(KUBECTL_BINARY) $(BASH_UNIT) bin/$(OS)/$(ARCH)/kgctl
KILO_IMAGE=$(IMAGE):$(ARCH)-$(VERSION) KIND_BINARY=$(KIND_BINARY) KUBECTL_BINARY=$(KUBECTL_BINARY) KGCTL_BINARY=$(shell pwd)/bin/$(OS)/$(ARCH)/kgctl $(BASH_UNIT) $(BASH_UNIT_FLAGS) ./e2e/setup.sh ./e2e/full-mesh.sh ./e2e/location-mesh.sh ./e2e/multi-cluster.sh ./e2e/teardown.sh KILO_IMAGE=$(IMAGE):$(ARCH)-$(VERSION) KIND_BINARY=$(KIND_BINARY) KUBECTL_BINARY=$(KUBECTL_BINARY) KGCTL_BINARY=$(shell pwd)/bin/$(OS)/$(ARCH)/kgctl $(BASH_UNIT) $(BASH_UNIT_FLAGS) ./e2e/setup.sh ./e2e/full-mesh.sh ./e2e/location-mesh.sh ./e2e/multi-cluster.sh ./e2e/handlers.sh ./e2e/teardown.sh
header: .header header: .header
@HEADER=$$(cat .header); \ @HEADER=$$(cat .header); \

View File

@@ -4,8 +4,8 @@
Kilo is a multi-cloud network overlay built on WireGuard and designed for Kubernetes. Kilo is a multi-cloud network overlay built on WireGuard and designed for Kubernetes.
[![Build Status](https://github.com/squat/kilo/workflows/CI/badge.svg)](https://github.com/squat/kilo/actions?query=workflow%3ACI) [![Build Status](https://github.com/kilo-io/kilo/workflows/CI/badge.svg)](https://github.com/kilo-io/kilo/actions?query=workflow%3ACI)
[![Go Report Card](https://goreportcard.com/badge/github.com/squat/kilo)](https://goreportcard.com/report/github.com/squat/kilo) [![Go Report Card](https://goreportcard.com/badge/github.com/kilo-io/kilo)](https://goreportcard.com/report/github.com/kilo-io/kilo)
[![Docker Pulls](https://img.shields.io/docker/pulls/squat/kilo)](https://hub.docker.com/r/squat/kilo) [![Docker Pulls](https://img.shields.io/docker/pulls/squat/kilo)](https://hub.docker.com/r/squat/kilo)
[![Slack](https://img.shields.io/badge/join%20slack-%23kilo-brightgreen.svg)](https://slack.k8s.io/) [![Slack](https://img.shields.io/badge/join%20slack-%23kilo-brightgreen.svg)](https://slack.k8s.io/)
@@ -72,29 +72,29 @@ Kilo can be installed by deploying a DaemonSet to the cluster.
To run Kilo on kubeadm: To run Kilo on kubeadm:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-kubeadm.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-kubeadm.yaml
``` ```
To run Kilo on bootkube: To run Kilo on bootkube:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-bootkube.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-bootkube.yaml
``` ```
To run Kilo on Typhoon: To run Kilo on Typhoon:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-typhoon.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-typhoon.yaml
``` ```
To run Kilo on k3s: To run Kilo on k3s:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-k3s.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-k3s.yaml
``` ```
## Add-on Mode ## Add-on Mode
@@ -106,11 +106,11 @@ Kilo currently supports running on top of Flannel.
For example, to run Kilo on a Typhoon cluster running Flannel: For example, to run Kilo on a Typhoon cluster running Flannel:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-typhoon-flannel.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-typhoon-flannel.yaml
``` ```
[See the manifests directory for more examples](https://github.com/squat/kilo/tree/main/manifests). [See the manifests directory for more examples](https://github.com/kilo-io/kilo/tree/main/manifests).
## VPN ## VPN

145
cmd/kg/handlers.go Normal file
View File

@@ -0,0 +1,145 @@
// Copyright 2019 the Kilo authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"bytes"
"fmt"
"io"
"mime"
"net"
"net/http"
"os"
"os/exec"
"github.com/kilo-io/kilo/pkg/mesh"
)
type graphHandler struct {
mesh *mesh.Mesh
granularity mesh.Granularity
hostname *string
subnet *net.IPNet
}
func (h *graphHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ns, err := h.mesh.Nodes().List()
if err != nil {
http.Error(w, fmt.Sprintf("failed to list nodes: %v", err), http.StatusInternalServerError)
return
}
ps, err := h.mesh.Peers().List()
if err != nil {
http.Error(w, fmt.Sprintf("failed to list peers: %v", err), http.StatusInternalServerError)
return
}
nodes := make(map[string]*mesh.Node)
for _, n := range ns {
if n.Ready() {
nodes[n.Name] = n
}
}
if len(nodes) == 0 {
http.Error(w, "did not find any valid Kilo nodes in the cluster", http.StatusInternalServerError)
return
}
peers := make(map[string]*mesh.Peer)
for _, p := range ps {
if p.Ready() {
peers[p.Name] = p
}
}
topo, err := mesh.NewTopology(nodes, peers, h.granularity, *h.hostname, 0, []byte{}, h.subnet, nodes[*h.hostname].PersistentKeepalive, nil)
if err != nil {
http.Error(w, fmt.Sprintf("failed to create topology: %v", err), http.StatusInternalServerError)
return
}
dot, err := topo.Dot()
if err != nil {
http.Error(w, fmt.Sprintf("failed to generate graph: %v", err), http.StatusInternalServerError)
}
buf := bytes.NewBufferString(dot)
format := r.URL.Query().Get("format")
switch format {
case "":
format = "svg"
case "dot", "gv":
// If the raw dot data is requested, return it as string.
// This allows client-side rendering rather than server-side.
w.Write(buf.Bytes())
return
case "svg", "png", "bmp", "fig", "gif", "json", "ps":
// Accepted format
default:
http.Error(w, "unsupported format", http.StatusInternalServerError)
return
}
layout := r.URL.Query().Get("layout")
switch layout {
case "":
layout = "circo"
case "circo", "dot", "neato", "twopi", "fdp":
// Accepted layout
default:
http.Error(w, "unsupported layout", http.StatusInternalServerError)
return
}
command := exec.Command("dot", "-K"+layout, "-T"+format)
command.Stderr = os.Stderr
stdin, err := command.StdinPipe()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if _, err = io.Copy(stdin, buf); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if err = stdin.Close(); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
output, err := command.Output()
if err != nil {
http.Error(w, "unable to render graph", http.StatusInternalServerError)
return
}
mimeType := mime.TypeByExtension("." + format)
if mimeType == "" {
mimeType = "application/octet-stream"
}
w.Header().Add("content-type", mimeType)
w.Write(output)
}
func healthHandler(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
}

View File

@@ -35,11 +35,12 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
"github.com/squat/kilo/pkg/encapsulation" "github.com/kilo-io/kilo/pkg/encapsulation"
"github.com/squat/kilo/pkg/k8s" "github.com/kilo-io/kilo/pkg/k8s"
kiloclient "github.com/squat/kilo/pkg/k8s/clientset/versioned" kiloclient "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
"github.com/squat/kilo/pkg/mesh" "github.com/kilo-io/kilo/pkg/mesh"
"github.com/squat/kilo/pkg/version" "github.com/kilo-io/kilo/pkg/version"
"github.com/kilo-io/kilo/pkg/wireguard"
) )
const ( const (
@@ -94,6 +95,7 @@ func Main() error {
local := flag.Bool("local", true, "Should Kilo manage routes within a location?") local := flag.Bool("local", true, "Should Kilo manage routes within a location?")
logLevel := flag.String("log-level", logLevelInfo, fmt.Sprintf("Log level to use. Possible values: %s", availableLogLevels)) logLevel := flag.String("log-level", logLevelInfo, fmt.Sprintf("Log level to use. Possible values: %s", availableLogLevels))
master := flag.String("master", "", "The address of the Kubernetes API server (overrides any value in kubeconfig).") master := flag.String("master", "", "The address of the Kubernetes API server (overrides any value in kubeconfig).")
mtu := flag.Uint("mtu", wireguard.DefaultMTU, "The MTU of the WireGuard interface created by Kilo.")
topologyLabel := flag.String("topology-label", k8s.RegionLabelKey, "Kubernetes node label used to group nodes into logical locations.") topologyLabel := flag.String("topology-label", k8s.RegionLabelKey, "Kubernetes node label used to group nodes into logical locations.")
var port uint var port uint
flag.UintVar(&port, "port", mesh.DefaultKiloPort, "The port over which WireGuard peers should communicate.") flag.UintVar(&port, "port", mesh.DefaultKiloPort, "The port over which WireGuard peers should communicate.")
@@ -180,7 +182,7 @@ func Main() error {
return fmt.Errorf("backend %v unknown; possible values are: %s", *backend, availableBackends) return fmt.Errorf("backend %v unknown; possible values are: %s", *backend, availableBackends)
} }
m, err := mesh.New(b, enc, gr, *hostname, uint32(port), s, *local, *cni, *cniPath, *iface, *cleanUpIface, *createIface, *resyncPeriod, log.With(logger, "component", "kilo")) m, err := mesh.New(b, enc, gr, *hostname, uint32(port), s, *local, *cni, *cniPath, *iface, *cleanUpIface, *createIface, *mtu, *resyncPeriod, log.With(logger, "component", "kilo"))
if err != nil { if err != nil {
return fmt.Errorf("failed to create Kilo mesh: %v", err) return fmt.Errorf("failed to create Kilo mesh: %v", err)
} }
@@ -196,9 +198,8 @@ func Main() error {
{ {
// Run the HTTP server. // Run the HTTP server.
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("/health", func(w http.ResponseWriter, _ *http.Request) { mux.HandleFunc("/health", healthHandler)
w.WriteHeader(http.StatusOK) mux.Handle("/graph", &graphHandler{m, gr, hostname, s})
})
mux.Handle("/metrics", promhttp.HandlerFor(r, promhttp.HandlerOpts{})) mux.Handle("/metrics", promhttp.HandlerFor(r, promhttp.HandlerOpts{}))
l, err := net.Listen("tcp", *listen) l, err := net.Listen("tcp", *listen)
if err != nil { if err != nil {

View File

@@ -18,7 +18,8 @@ import (
"fmt" "fmt"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/squat/kilo/pkg/mesh"
"github.com/kilo-io/kilo/pkg/mesh"
) )
func graph() *cobra.Command { func graph() *cobra.Command {

View File

@@ -26,10 +26,10 @@ import (
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
"github.com/squat/kilo/pkg/k8s" "github.com/kilo-io/kilo/pkg/k8s"
kiloclient "github.com/squat/kilo/pkg/k8s/clientset/versioned" kiloclient "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
"github.com/squat/kilo/pkg/mesh" "github.com/kilo-io/kilo/pkg/mesh"
"github.com/squat/kilo/pkg/version" "github.com/kilo-io/kilo/pkg/version"
) )
const ( const (

View File

@@ -28,9 +28,9 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer/json" "k8s.io/apimachinery/pkg/runtime/serializer/json"
"github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
"github.com/squat/kilo/pkg/mesh" "github.com/kilo-io/kilo/pkg/mesh"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
const ( const (

View File

@@ -14,7 +14,7 @@ To follow along, you need to install the following utilities:
Clone the Repository and `cd` into it. Clone the Repository and `cd` into it.
```shell ```shell
git clone https://github.com/squat/kilo.git git clone https://github.com/kilo-io/kilo.git
cd kilo cd kilo
``` ```

View File

@@ -8,7 +8,7 @@ It performs several key functions, including:
* maintaining routing table entries and iptables rules. * maintaining routing table entries and iptables rules.
`kg` is typically installed on all nodes of a Kubernetes cluster using a DaemonSet. `kg` is typically installed on all nodes of a Kubernetes cluster using a DaemonSet.
Example manifests can be found [in the manifests directory](https://github.com/squat/kilo/tree/main/manifests). Example manifests can be found [in the manifests directory](https://github.com/kilo-io/kilo/tree/main/manifests).
## Usage ## Usage
@@ -32,6 +32,7 @@ Usage of bin//linux/amd64/kg:
--log-level string Log level to use. Possible values: all, debug, info, warn, error, none (default "info") --log-level string Log level to use. Possible values: all, debug, info, warn, error, none (default "info")
--master string The address of the Kubernetes API server (overrides any value in kubeconfig). --master string The address of the Kubernetes API server (overrides any value in kubeconfig).
--mesh-granularity string The granularity of the network mesh to create. Possible values: location, full (default "location") --mesh-granularity string The granularity of the network mesh to create. Possible values: location, full (default "location")
--mtu uint The MTU of the WireGuard interface created by Kilo. (default 1420)
--port uint The port over which WireGuard peers should communicate. (default 51820) --port uint The port over which WireGuard peers should communicate. (default 51820)
--resync-period duration How often should the Kilo controllers reconcile? (default 30s) --resync-period duration How often should the Kilo controllers reconcile? (default 30s)
--subnet string CIDR from which to allocate addresses for WireGuard interfaces. (default "10.4.0.0/16") --subnet string CIDR from which to allocate addresses for WireGuard interfaces. (default "10.4.0.0/16")

View File

@@ -6,20 +6,20 @@ This tool can be used to understand a mesh's topology, get the WireGuard configu
## Installation ## Installation
The `kgctl` binary is automatically compiled for Linux, macOS, and Windows for every release of Kilo and can be downloaded from [the GitHub releases page](https://github.com/squat/kilo/releases/latest). The `kgctl` binary is automatically compiled for Linux, macOS, and Windows for every release of Kilo and can be downloaded from [the GitHub releases page](https://github.com/kilo-io/kilo/releases/latest).
### Building from Source ### Building from Source
Kilo is written in Golang and as a result the [Go toolchain must be installed](https://golang.org/doc/install) in order to build the `kgctl` binary. Kilo is written in Golang and as a result the [Go toolchain must be installed](https://golang.org/doc/install) in order to build the `kgctl` binary.
To download the Kilo source code and then build and install `kgctl` using the latest commit all with a single command, run: To download the Kilo source code and then build and install `kgctl` using the latest commit all with a single command, run:
```shell ```shell
go install github.com/squat/kilo/cmd/kgctl@latest go install github.com/kilo-io/kilo/cmd/kgctl@latest
``` ```
Alternatively, `kgctl` can be built and installed based on specific version of the code by specifying a Git tag or hash, e.g.: Alternatively, `kgctl` can be built and installed based on specific version of the code by specifying a Git tag or hash, e.g.:
```shell ```shell
go install github.com/squat/kilo/cmd/kgctl@0.2.0 go install github.com/kilo-io/kilo/cmd/kgctl@0.2.0
``` ```
When working on Kilo locally, it can be helpful to build and test the `kgctl` binary as part of the development cycle. When working on Kilo locally, it can be helpful to build and test the `kgctl` binary as part of the development cycle.

View File

@@ -10,7 +10,7 @@ Support for [Kubernetes network policies](https://kubernetes.io/docs/concepts/se
The following command adds network policy support by deploying kube-router to work alongside Kilo: The following command adds network policy support by deploying kube-router to work alongside Kilo:
```shell ```shell
kubectl apply -f kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kube-router.yaml kubectl apply -f kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kube-router.yaml
``` ```
## Examples ## Examples

View File

@@ -18,8 +18,8 @@ This DaemonSet creates a WireGuard interface that Kilo will manage.
An example configuration for a K3s cluster with [BoringTun] can be applied with: An example configuration for a K3s cluster with [BoringTun] can be applied with:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-k3s-userspace.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-k3s-userspace.yaml
``` ```
> **Note**: even if some nodes have the WireGuard kernel module, this configuration will cause all nodes to use the userspace implementation of WireGuard. > **Note**: even if some nodes have the WireGuard kernel module, this configuration will cause all nodes to use the userspace implementation of WireGuard.
@@ -30,8 +30,8 @@ In a heterogeneous cluster where some nodes are missing the WireGuard kernel mod
An example of such a configuration for a K3s cluster can by applied with: An example of such a configuration for a K3s cluster can by applied with:
```shell ```shell
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/crds.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/crds.yaml
kubectl apply -f https://raw.githubusercontent.com/squat/kilo/main/manifests/kilo-k3s-userspace-heterogeneous.yaml kubectl apply -f https://raw.githubusercontent.com/kilo-io/kilo/main/manifests/kilo-k3s-userspace-heterogeneous.yaml
``` ```
This configuration will deploy [nkml](https://github.com/leonnicolas/nkml) as a DaemonSet to label all nodes according to the presence of the WireGuard kernel module. This configuration will deploy [nkml](https://github.com/leonnicolas/nkml) as a DaemonSet to label all nodes according to the presence of the WireGuard kernel module.

26
e2e/handlers.sh Normal file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# shellcheck disable=SC1091
. lib.sh
setup_suite() {
# shellcheck disable=SC2016
block_until_ready_by_name kube-system kilo-userspace
_kubectl wait pod -l app.kubernetes.io/name=adjacency --for=condition=Ready --timeout 3m
}
test_graph_handler() {
assert "curl_pod 'http://10.4.0.1:1107/graph?format=svg&layout=circo' | grep -q '<svg'" "graph handler should produce SVG output"
assert "curl_pod http://10.4.0.1:1107/graph?layout=circo | grep -q '<svg'" "graph handler should default to SVG output"
assert "curl_pod http://10.4.0.1:1107/graph | grep -q '<svg'" "graph handler should default to SVG output"
assert_fail "curl_pod http://10.4.0.1:1107/graph?layout=fake | grep -q '<svg'" "graph handler should reject invalid layout"
assert_fail "curl_pod http://10.4.0.1:1107/graph?format=fake | grep -q '<svg'" "graph handler should reject invalid format"
}
test_health_handler() {
assert "curl_pod http://10.4.0.1:1107/health" "health handler should return a status code of 200"
}
test_metrics_handler() {
assert "curl_pod http://10.4.0.1:1107/metrics" "metrics handler should return a status code of 200"
assert "(( $(curl_pod http://10.4.0.1:1107/metrics | grep -E ^kilo_nodes | cut -d " " -f 2) > 0 ))" "metrics handler should provide metric: kilo_nodes > 0"
}

View File

@@ -57,7 +57,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io
@@ -102,7 +101,7 @@ spec:
hostNetwork: true hostNetwork: true
containers: containers:
- name: kilo - name: kilo
image: squat/kilo:test image: kiloio/kilo:test
imagePullPolicy: Never imagePullPolicy: Never
args: args:
- --hostname=$(NODE_NAME) - --hostname=$(NODE_NAME)
@@ -150,7 +149,7 @@ spec:
readOnly: false readOnly: false
initContainers: initContainers:
- name: install-cni - name: install-cni
image: squat/kilo:test image: kiloio/kilo:test
imagePullPolicy: Never imagePullPolicy: Never
command: command:
- /bin/sh - /bin/sh

View File

@@ -4,7 +4,7 @@ KIND_CLUSTER="kind-cluster-kilo"
KIND_BINARY="${KIND_BINARY:-kind}" KIND_BINARY="${KIND_BINARY:-kind}"
KUBECTL_BINARY="${KUBECTL_BINARY:-kubectl}" KUBECTL_BINARY="${KUBECTL_BINARY:-kubectl}"
KGCTL_BINARY="${KGCTL_BINARY:-kgctl}" KGCTL_BINARY="${KGCTL_BINARY:-kgctl}"
KILO_IMAGE="${KILO_IMAGE:-squat/kilo}" KILO_IMAGE="${KILO_IMAGE:-kiloio/kilo}"
retry() { retry() {
local COUNT="${1:-10}" local COUNT="${1:-10}"
@@ -118,9 +118,9 @@ create_cluster() {
# Create the kind cluster. # Create the kind cluster.
_kind create cluster --name $KIND_CLUSTER --config <(echo "$CONFIG") _kind create cluster --name $KIND_CLUSTER --config <(echo "$CONFIG")
# Load the Kilo image into kind. # Load the Kilo image into kind.
docker tag "$KILO_IMAGE" squat/kilo:test docker tag "$KILO_IMAGE" kiloio/kilo:test
# This command does not accept the --kubeconfig flag, so call the command directly. # This command does not accept the --kubeconfig flag, so call the command directly.
$KIND_BINARY load docker-image squat/kilo:test --name $KIND_CLUSTER $KIND_BINARY load docker-image kiloio/kilo:test --name $KIND_CLUSTER
# Create the kubeconfig secret. # Create the kubeconfig secret.
_kubectl create secret generic kubeconfig --from-file=kubeconfig="$KUBECONFIG" -n kube-system _kubectl create secret generic kubeconfig --from-file=kubeconfig="$KUBECONFIG" -n kube-system
# Apply Kilo the the cluster. # Apply Kilo the the cluster.
@@ -134,7 +134,7 @@ create_cluster() {
_kubectl apply -f helper-curl.yaml _kubectl apply -f helper-curl.yaml
block_until_ready_by_name default curl block_until_ready_by_name default curl
_kubectl taint node $KIND_CLUSTER-control-plane node-role.kubernetes.io/master:NoSchedule- _kubectl taint node $KIND_CLUSTER-control-plane node-role.kubernetes.io/master:NoSchedule-
_kubectl apply -f https://raw.githubusercontent.com/heptoprint/adjacency/master/example.yaml _kubectl apply -f https://raw.githubusercontent.com/kilo-io/adjacency/main/example.yaml
block_until_ready_by_name adjacency adjacency block_until_ready_by_name adjacency adjacency
} }

2
go.mod
View File

@@ -1,4 +1,4 @@
module github.com/squat/kilo module github.com/kilo-io/kilo
go 1.15 go 1.15

View File

@@ -12,7 +12,7 @@ spec:
listKind: PeerList listKind: PeerList
plural: peers plural: peers
singular: peer singular: peer
scope: Cluster scope: Namespaced
versions: versions:
- name: v1alpha1 - name: v1alpha1
schema: schema:

View File

@@ -23,7 +23,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io

View File

@@ -57,7 +57,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io

View File

@@ -23,7 +23,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io
@@ -45,6 +44,35 @@ subjects:
name: kilo name: kilo
namespace: kube-system namespace: kube-system
--- ---
apiVersion: v1
kind: ConfigMap
metadata:
name: kilo-scripts
namespace: kube-system
data:
init.sh: |
#!/bin/sh
cat > /etc/kubernetes/kubeconfig <<EOF
apiVersion: v1
kind: Config
name: kilo
clusters:
- cluster:
server: $(sed -n 's/.*server: \(.*\)/\1/p' /var/lib/rancher/k3s/agent/kubelet.kubeconfig)
certificate-authority: /var/lib/rancher/k3s/agent/server-ca.crt
users:
- name: kilo
user:
token: $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
contexts:
- name: kilo
context:
cluster: kilo
namespace: ${NAMESPACE}
user: kilo
current-context: kilo
EOF
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: DaemonSet kind: DaemonSet
metadata: metadata:
@@ -89,7 +117,7 @@ spec:
- name: kilo-dir - name: kilo-dir
mountPath: /var/lib/kilo mountPath: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
mountPath: /etc/kubernetes/kubeconfig mountPath: /etc/kubernetes
readOnly: true readOnly: true
- name: lib-modules - name: lib-modules
mountPath: /lib/modules mountPath: /lib/modules
@@ -97,6 +125,28 @@ spec:
- name: xtables-lock - name: xtables-lock
mountPath: /run/xtables.lock mountPath: /run/xtables.lock
readOnly: false readOnly: false
initContainers:
- name: generate-kubeconfig
image: squat/kilo
command:
- /bin/sh
args:
- /scripts/init.sh
imagePullPolicy: Always
volumeMounts:
- name: kubeconfig
mountPath: /etc/kubernetes
- name: scripts
mountPath: /scripts/
readOnly: true
- name: k3s-agent
mountPath: /var/lib/rancher/k3s/agent/
readOnly: true
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
tolerations: tolerations:
- effect: NoSchedule - effect: NoSchedule
operator: Exists operator: Exists
@@ -107,11 +157,13 @@ spec:
hostPath: hostPath:
path: /var/lib/kilo path: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
hostPath: emptyDir: {}
# Since kilo runs as a daemonset, it is recommended that you copy the - name: scripts
# k3s.yaml kubeconfig file from the master node to all worker nodes configMap:
# with the same path structure. name: kilo-scripts
path: /etc/rancher/k3s/k3s.yaml - name: k3s-agent
hostPath:
path: /var/lib/rancher/k3s/agent
- name: lib-modules - name: lib-modules
hostPath: hostPath:
path: /lib/modules path: /lib/modules

View File

@@ -58,7 +58,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io
@@ -80,6 +79,35 @@ subjects:
name: kilo name: kilo
namespace: kube-system namespace: kube-system
--- ---
apiVersion: v1
kind: ConfigMap
metadata:
name: kilo-scripts
namespace: kube-system
data:
init.sh: |
#!/bin/sh
cat > /etc/kubernetes/kubeconfig <<EOF
apiVersion: v1
kind: Config
name: kilo
clusters:
- cluster:
server: $(sed -n 's/.*server: \(.*\)/\1/p' /var/lib/rancher/k3s/agent/kubelet.kubeconfig)
certificate-authority: /var/lib/rancher/k3s/agent/server-ca.crt
users:
- name: kilo
user:
token: $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
contexts:
- name: kilo
context:
cluster: kilo
namespace: ${NAMESPACE}
user: kilo
current-context: kilo
EOF
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: DaemonSet kind: DaemonSet
metadata: metadata:
@@ -126,7 +154,7 @@ spec:
- name: kilo-dir - name: kilo-dir
mountPath: /var/lib/kilo mountPath: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
mountPath: /etc/kubernetes/kubeconfig mountPath: /etc/kubernetes
readOnly: true readOnly: true
- name: lib-modules - name: lib-modules
mountPath: /lib/modules mountPath: /lib/modules
@@ -135,6 +163,27 @@ spec:
mountPath: /run/xtables.lock mountPath: /run/xtables.lock
readOnly: false readOnly: false
initContainers: initContainers:
- name: generate-kubeconfig
image: squat/kilo
command:
- /bin/sh
args:
- /scripts/init.sh
imagePullPolicy: Always
volumeMounts:
- name: kubeconfig
mountPath: /etc/kubernetes
- name: scripts
mountPath: /scripts/
readOnly: true
- name: k3s-agent
mountPath: /var/lib/rancher/k3s/agent/
readOnly: true
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: install-cni - name: install-cni
image: squat/kilo image: squat/kilo
command: command:
@@ -175,11 +224,13 @@ spec:
hostPath: hostPath:
path: /var/lib/kilo path: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
hostPath: emptyDir: {}
# Since kilo runs as a daemonset, it is recommended that you copy the - name: scripts
# k3s.yaml kubeconfig file from the master node to all worker nodes configMap:
# with the same path structure. name: kilo-scripts
path: /etc/rancher/k3s/k3s.yaml - name: k3s-agent
hostPath:
path: /var/lib/rancher/k3s/agent
- name: lib-modules - name: lib-modules
hostPath: hostPath:
path: /lib/modules path: /lib/modules
@@ -235,7 +286,7 @@ spec:
- name: kilo-dir - name: kilo-dir
mountPath: /var/lib/kilo mountPath: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
mountPath: /etc/kubernetes/kubeconfig mountPath: /etc/kubernetes
readOnly: true readOnly: true
- name: lib-modules - name: lib-modules
mountPath: /lib/modules mountPath: /lib/modules
@@ -259,6 +310,27 @@ spec:
mountPath: /var/run/wireguard mountPath: /var/run/wireguard
readOnly: false readOnly: false
initContainers: initContainers:
- name: generate-kubeconfig
image: squat/kilo
command:
- /bin/sh
args:
- /scripts/init.sh
imagePullPolicy: Always
volumeMounts:
- name: kubeconfig
mountPath: /etc/kubernetes
- name: scripts
mountPath: /scripts/
readOnly: true
- name: k3s-agent
mountPath: /var/lib/rancher/k3s/agent/
readOnly: true
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: install-cni - name: install-cni
image: squat/kilo image: squat/kilo
command: command:
@@ -299,11 +371,13 @@ spec:
hostPath: hostPath:
path: /var/lib/kilo path: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
hostPath: emptyDir: {}
# Since kilo runs as a daemonset, it is recommended that you copy the - name: scripts
# k3s.yaml kubeconfig file from the master node to all worker nodes configMap:
# with the same path structure. name: kilo-scripts
path: /etc/rancher/k3s/k3s.yaml - name: k3s-agent
hostPath:
path: /var/lib/rancher/k3s/agent
- name: lib-modules - name: lib-modules
hostPath: hostPath:
path: /lib/modules path: /lib/modules
@@ -332,6 +406,7 @@ spec:
app.kubernetes.io/name: nkml app.kubernetes.io/name: nkml
spec: spec:
hostNetwork: true hostNetwork: true
serviceAccountName: kilo
containers: containers:
- name: nkml - name: nkml
image: leonnicolas/nkml image: leonnicolas/nkml
@@ -349,13 +424,36 @@ spec:
containerPort: 8080 containerPort: 8080
volumeMounts: volumeMounts:
- name: kubeconfig - name: kubeconfig
mountPath: /etc/kubernetes/kubeconfig mountPath: /etc/kubernetes
readOnly: true readOnly: true
initContainers:
- name: generate-kubeconfig
image: squat/kilo
command:
- /bin/sh
args:
- /scripts/init.sh
imagePullPolicy: Always
volumeMounts:
- name: kubeconfig
mountPath: /etc/kubernetes
- name: scripts
mountPath: /scripts/
readOnly: true
- name: k3s-agent
mountPath: /var/lib/rancher/k3s/agent/
readOnly: true
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumes: volumes:
- name: kubeconfig - name: kubeconfig
hostPath: emptyDir: {}
# since the above DaemonSets are dependant on the labels - name: scripts
# and nkml would need a cni to start configMap:
# it needs run on the hostnetwork and use the kubeconfig name: kilo-scripts
# to label the nodes - name: k3s-agent
path: /etc/rancher/k3s/k3s.yaml hostPath:
path: /var/lib/rancher/k3s/agent

View File

@@ -57,7 +57,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io
@@ -79,6 +78,36 @@ subjects:
name: kilo name: kilo
namespace: kube-system namespace: kube-system
--- ---
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kilo-scripts
namespace: kube-system
data:
init.sh: |
#!/bin/sh
cat > /etc/kubernetes/kubeconfig <<EOF
apiVersion: v1
kind: Config
name: kilo
clusters:
- cluster:
server: $(sed -n 's/.*server: \(.*\)/\1/p' /var/lib/rancher/k3s/agent/kubelet.kubeconfig)
certificate-authority: /var/lib/rancher/k3s/agent/server-ca.crt
users:
- name: kilo
user:
token: $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
contexts:
- name: kilo
context:
cluster: kilo
namespace: ${NAMESPACE}
user: kilo
current-context: kilo
EOF
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: DaemonSet kind: DaemonSet
metadata: metadata:
@@ -124,7 +153,7 @@ spec:
- name: kilo-dir - name: kilo-dir
mountPath: /var/lib/kilo mountPath: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
mountPath: /etc/kubernetes/kubeconfig mountPath: /etc/kubernetes
readOnly: true readOnly: true
- name: lib-modules - name: lib-modules
mountPath: /lib/modules mountPath: /lib/modules
@@ -148,6 +177,27 @@ spec:
mountPath: /var/run/wireguard mountPath: /var/run/wireguard
readOnly: false readOnly: false
initContainers: initContainers:
- name: generate-kubeconfig
image: squat/kilo
command:
- /bin/sh
args:
- /scripts/init.sh
imagePullPolicy: Always
volumeMounts:
- name: kubeconfig
mountPath: /etc/kubernetes
- name: scripts
mountPath: /scripts/
readOnly: true
- name: k3s-agent
mountPath: /var/lib/rancher/k3s/agent/
readOnly: true
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: install-cni - name: install-cni
image: squat/kilo image: squat/kilo
command: command:
@@ -188,11 +238,13 @@ spec:
hostPath: hostPath:
path: /var/lib/kilo path: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
hostPath: emptyDir: {}
# Since kilo runs as a daemonset, it is recommended that you copy the - name: scripts
# k3s.yaml kubeconfig file from the master node to all worker nodes configMap:
# with the same path structure. name: kilo-scripts
path: /etc/rancher/k3s/k3s.yaml - name: k3s-agent
hostPath:
path: /var/lib/rancher/k3s/agent
- name: lib-modules - name: lib-modules
hostPath: hostPath:
path: /lib/modules path: /lib/modules

View File

@@ -57,7 +57,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io
@@ -79,6 +78,35 @@ subjects:
name: kilo name: kilo
namespace: kube-system namespace: kube-system
--- ---
apiVersion: v1
kind: ConfigMap
metadata:
name: kilo-scripts
namespace: kube-system
data:
init.sh: |
#!/bin/sh
cat > /etc/kubernetes/kubeconfig <<EOF
apiVersion: v1
kind: Config
name: kilo
clusters:
- cluster:
server: $(sed -n 's/.*server: \(.*\)/\1/p' /var/lib/rancher/k3s/agent/kubelet.kubeconfig)
certificate-authority: /var/lib/rancher/k3s/agent/server-ca.crt
users:
- name: kilo
user:
token: $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
contexts:
- name: kilo
context:
cluster: kilo
namespace: ${NAMESPACE}
user: kilo
current-context: kilo
EOF
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: DaemonSet kind: DaemonSet
metadata: metadata:
@@ -122,7 +150,7 @@ spec:
- name: kilo-dir - name: kilo-dir
mountPath: /var/lib/kilo mountPath: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
mountPath: /etc/kubernetes/kubeconfig mountPath: /etc/kubernetes
readOnly: true readOnly: true
- name: lib-modules - name: lib-modules
mountPath: /lib/modules mountPath: /lib/modules
@@ -131,6 +159,27 @@ spec:
mountPath: /run/xtables.lock mountPath: /run/xtables.lock
readOnly: false readOnly: false
initContainers: initContainers:
- name: generate-kubeconfig
image: squat/kilo
command:
- /bin/sh
args:
- /scripts/init.sh
imagePullPolicy: Always
volumeMounts:
- name: kubeconfig
mountPath: /etc/kubernetes
- name: scripts
mountPath: /scripts/
readOnly: true
- name: k3s-agent
mountPath: /var/lib/rancher/k3s/agent/
readOnly: true
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: install-cni - name: install-cni
image: squat/kilo image: squat/kilo
command: command:
@@ -171,11 +220,13 @@ spec:
hostPath: hostPath:
path: /var/lib/kilo path: /var/lib/kilo
- name: kubeconfig - name: kubeconfig
hostPath: emptyDir: {}
# Since kilo runs as a daemonset, it is recommended that you copy the - name: scripts
# k3s.yaml kubeconfig file from the master node to all worker nodes configMap:
# with the same path structure. name: kilo-scripts
path: /etc/rancher/k3s/k3s.yaml - name: k3s-agent
hostPath:
path: /var/lib/rancher/k3s/agent
- name: lib-modules - name: lib-modules
hostPath: hostPath:
path: /lib/modules path: /lib/modules

View File

@@ -23,7 +23,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io

View File

@@ -57,7 +57,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io

View File

@@ -23,7 +23,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io

View File

@@ -57,7 +57,6 @@ rules:
- peers - peers
verbs: verbs:
- list - list
- update
- watch - watch
- apiGroups: - apiGroups:
- apiextensions.k8s.io - apiextensions.k8s.io

View File

@@ -17,7 +17,7 @@ package encapsulation
import ( import (
"net" "net"
"github.com/squat/kilo/pkg/iptables" "github.com/kilo-io/kilo/pkg/iptables"
) )
// Strategy identifies which packets within a location should // Strategy identifies which packets within a location should

View File

@@ -19,8 +19,9 @@ import (
"net" "net"
"sync" "sync"
"github.com/squat/kilo/pkg/iptables"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
"github.com/kilo-io/kilo/pkg/iptables"
) )
const flannelDeviceName = "flannel.1" const flannelDeviceName = "flannel.1"

View File

@@ -18,8 +18,8 @@ import (
"fmt" "fmt"
"net" "net"
"github.com/squat/kilo/pkg/iproute" "github.com/kilo-io/kilo/pkg/iproute"
"github.com/squat/kilo/pkg/iptables" "github.com/kilo-io/kilo/pkg/iptables"
) )
type ipip struct { type ipip struct {

View File

@@ -17,7 +17,7 @@ package encapsulation
import ( import (
"net" "net"
"github.com/squat/kilo/pkg/iptables" "github.com/kilo-io/kilo/pkg/iptables"
) )
// Noop is an encapsulation that does nothing. // Noop is an encapsulation that does nothing.

View File

@@ -48,7 +48,6 @@ var PeerShortNames = []string{"peer"}
// +genclient:nonNamespaced // +genclient:nonNamespaced
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +k8s:openapi-gen=true // +k8s:openapi-gen=true
// +kubebuilder:resource:scope=Cluster
// Peer is a WireGuard peer that should have access to the VPN. // Peer is a WireGuard peer that should have access to the VPN.
type Peer struct { type Peer struct {

View File

@@ -37,12 +37,12 @@ import (
v1listers "k8s.io/client-go/listers/core/v1" v1listers "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
kiloclient "github.com/squat/kilo/pkg/k8s/clientset/versioned" kiloclient "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
v1alpha1informers "github.com/squat/kilo/pkg/k8s/informers/kilo/v1alpha1" v1alpha1informers "github.com/kilo-io/kilo/pkg/k8s/informers/kilo/v1alpha1"
v1alpha1listers "github.com/squat/kilo/pkg/k8s/listers/kilo/v1alpha1" v1alpha1listers "github.com/kilo-io/kilo/pkg/k8s/listers/kilo/v1alpha1"
"github.com/squat/kilo/pkg/mesh" "github.com/kilo-io/kilo/pkg/mesh"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
const ( const (

View File

@@ -21,9 +21,9 @@ import (
"github.com/kylelemons/godebug/pretty" "github.com/kylelemons/godebug/pretty"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
"github.com/squat/kilo/pkg/mesh" "github.com/kilo-io/kilo/pkg/mesh"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
func TestTranslateNode(t *testing.T) { func TestTranslateNode(t *testing.T) {

View File

@@ -19,7 +19,7 @@ package versioned
import ( import (
"fmt" "fmt"
kilov1alpha1 "github.com/squat/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1" kilov1alpha1 "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1"
discovery "k8s.io/client-go/discovery" discovery "k8s.io/client-go/discovery"
rest "k8s.io/client-go/rest" rest "k8s.io/client-go/rest"
flowcontrol "k8s.io/client-go/util/flowcontrol" flowcontrol "k8s.io/client-go/util/flowcontrol"

View File

@@ -17,9 +17,9 @@
package fake package fake
import ( import (
clientset "github.com/squat/kilo/pkg/k8s/clientset/versioned" clientset "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
kilov1alpha1 "github.com/squat/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1" kilov1alpha1 "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1"
fakekilov1alpha1 "github.com/squat/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1/fake" fakekilov1alpha1 "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1/fake"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/discovery" "k8s.io/client-go/discovery"

View File

@@ -17,7 +17,7 @@
package fake package fake
import ( import (
kilov1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" kilov1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema" schema "k8s.io/apimachinery/pkg/runtime/schema"

View File

@@ -17,7 +17,7 @@
package scheme package scheme
import ( import (
kilov1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" kilov1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema" schema "k8s.io/apimachinery/pkg/runtime/schema"

View File

@@ -17,7 +17,7 @@
package fake package fake
import ( import (
v1alpha1 "github.com/squat/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned/typed/kilo/v1alpha1"
rest "k8s.io/client-go/rest" rest "k8s.io/client-go/rest"
testing "k8s.io/client-go/testing" testing "k8s.io/client-go/testing"
) )

View File

@@ -19,7 +19,7 @@ package fake
import ( import (
"context" "context"
v1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
labels "k8s.io/apimachinery/pkg/labels" labels "k8s.io/apimachinery/pkg/labels"
schema "k8s.io/apimachinery/pkg/runtime/schema" schema "k8s.io/apimachinery/pkg/runtime/schema"

View File

@@ -17,8 +17,8 @@
package v1alpha1 package v1alpha1
import ( import (
v1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
"github.com/squat/kilo/pkg/k8s/clientset/versioned/scheme" "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned/scheme"
rest "k8s.io/client-go/rest" rest "k8s.io/client-go/rest"
) )

View File

@@ -20,8 +20,8 @@ import (
"context" "context"
"time" "time"
v1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
scheme "github.com/squat/kilo/pkg/k8s/clientset/versioned/scheme" scheme "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned/scheme"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types" types "k8s.io/apimachinery/pkg/types"
watch "k8s.io/apimachinery/pkg/watch" watch "k8s.io/apimachinery/pkg/watch"

View File

@@ -21,9 +21,9 @@ import (
sync "sync" sync "sync"
time "time" time "time"
versioned "github.com/squat/kilo/pkg/k8s/clientset/versioned" versioned "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
internalinterfaces "github.com/squat/kilo/pkg/k8s/informers/internalinterfaces" internalinterfaces "github.com/kilo-io/kilo/pkg/k8s/informers/internalinterfaces"
kilo "github.com/squat/kilo/pkg/k8s/informers/kilo" kilo "github.com/kilo-io/kilo/pkg/k8s/informers/kilo"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema" schema "k8s.io/apimachinery/pkg/runtime/schema"

View File

@@ -19,7 +19,7 @@ package informers
import ( import (
"fmt" "fmt"
v1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
schema "k8s.io/apimachinery/pkg/runtime/schema" schema "k8s.io/apimachinery/pkg/runtime/schema"
cache "k8s.io/client-go/tools/cache" cache "k8s.io/client-go/tools/cache"
) )

View File

@@ -19,7 +19,7 @@ package internalinterfaces
import ( import (
time "time" time "time"
versioned "github.com/squat/kilo/pkg/k8s/clientset/versioned" versioned "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
cache "k8s.io/client-go/tools/cache" cache "k8s.io/client-go/tools/cache"

View File

@@ -17,8 +17,8 @@
package kilo package kilo
import ( import (
internalinterfaces "github.com/squat/kilo/pkg/k8s/informers/internalinterfaces" internalinterfaces "github.com/kilo-io/kilo/pkg/k8s/informers/internalinterfaces"
v1alpha1 "github.com/squat/kilo/pkg/k8s/informers/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/informers/kilo/v1alpha1"
) )
// Interface provides access to each of this group's versions. // Interface provides access to each of this group's versions.

View File

@@ -17,7 +17,7 @@
package v1alpha1 package v1alpha1
import ( import (
internalinterfaces "github.com/squat/kilo/pkg/k8s/informers/internalinterfaces" internalinterfaces "github.com/kilo-io/kilo/pkg/k8s/informers/internalinterfaces"
) )
// Interface provides access to all the informers in this group version. // Interface provides access to all the informers in this group version.

View File

@@ -20,10 +20,10 @@ import (
"context" "context"
time "time" time "time"
kilov1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" kilov1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
versioned "github.com/squat/kilo/pkg/k8s/clientset/versioned" versioned "github.com/kilo-io/kilo/pkg/k8s/clientset/versioned"
internalinterfaces "github.com/squat/kilo/pkg/k8s/informers/internalinterfaces" internalinterfaces "github.com/kilo-io/kilo/pkg/k8s/informers/internalinterfaces"
v1alpha1 "github.com/squat/kilo/pkg/k8s/listers/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/listers/kilo/v1alpha1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
watch "k8s.io/apimachinery/pkg/watch" watch "k8s.io/apimachinery/pkg/watch"

View File

@@ -17,7 +17,7 @@
package v1alpha1 package v1alpha1
import ( import (
v1alpha1 "github.com/squat/kilo/pkg/k8s/apis/kilo/v1alpha1" v1alpha1 "github.com/kilo-io/kilo/pkg/k8s/apis/kilo/v1alpha1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"

View File

@@ -18,7 +18,7 @@ import (
"net" "net"
"time" "time"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
const ( const (

View File

@@ -20,7 +20,8 @@ import (
"strings" "strings"
"github.com/awalterschulze/gographviz" "github.com/awalterschulze/gographviz"
"github.com/squat/kilo/pkg/wireguard"
"github.com/kilo-io/kilo/pkg/wireguard"
) )
// Dot generates a Graphviz graph of the Topology in DOT fomat. // Dot generates a Graphviz graph of the Topology in DOT fomat.

View File

@@ -30,11 +30,11 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
"github.com/squat/kilo/pkg/encapsulation" "github.com/kilo-io/kilo/pkg/encapsulation"
"github.com/squat/kilo/pkg/iproute" "github.com/kilo-io/kilo/pkg/iproute"
"github.com/squat/kilo/pkg/iptables" "github.com/kilo-io/kilo/pkg/iptables"
"github.com/squat/kilo/pkg/route" "github.com/kilo-io/kilo/pkg/route"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
const ( const (
@@ -86,7 +86,7 @@ type Mesh struct {
} }
// New returns a new Mesh instance. // New returns a new Mesh instance.
func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularity, hostname string, port uint32, subnet *net.IPNet, local, cni bool, cniPath, iface string, cleanUpIface bool, createIface bool, resyncPeriod time.Duration, logger log.Logger) (*Mesh, error) { func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularity, hostname string, port uint32, subnet *net.IPNet, local, cni bool, cniPath, iface string, cleanUpIface bool, createIface bool, mtu uint, resyncPeriod time.Duration, logger log.Logger) (*Mesh, error) {
if err := os.MkdirAll(kiloPath, 0700); err != nil { if err := os.MkdirAll(kiloPath, 0700); err != nil {
return nil, fmt.Errorf("failed to create directory to store configuration: %v", err) return nil, fmt.Errorf("failed to create directory to store configuration: %v", err)
} }
@@ -111,7 +111,7 @@ func New(backend Backend, enc encapsulation.Encapsulator, granularity Granularit
} }
var kiloIface int var kiloIface int
if createIface { if createIface {
kiloIface, _, err = wireguard.New(iface) kiloIface, _, err = wireguard.New(iface, mtu)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create WireGuard interface: %v", err) return nil, fmt.Errorf("failed to create WireGuard interface: %v", err)
} }

View File

@@ -19,7 +19,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
func TestReady(t *testing.T) { func TestReady(t *testing.T) {

View File

@@ -22,8 +22,8 @@ import (
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"github.com/squat/kilo/pkg/encapsulation" "github.com/kilo-io/kilo/pkg/encapsulation"
"github.com/squat/kilo/pkg/iptables" "github.com/kilo-io/kilo/pkg/iptables"
) )
const kiloTableIndex = 1107 const kiloTableIndex = 1107

View File

@@ -21,7 +21,7 @@ import (
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"github.com/squat/kilo/pkg/encapsulation" "github.com/kilo-io/kilo/pkg/encapsulation"
) )
func TestRoutes(t *testing.T) { func TestRoutes(t *testing.T) {

View File

@@ -22,7 +22,7 @@ import (
"github.com/go-kit/kit/log" "github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level" "github.com/go-kit/kit/log/level"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
const ( const (

View File

@@ -22,7 +22,7 @@ import (
"github.com/go-kit/kit/log" "github.com/go-kit/kit/log"
"github.com/kylelemons/godebug/pretty" "github.com/kylelemons/godebug/pretty"
"github.com/squat/kilo/pkg/wireguard" "github.com/kilo-io/kilo/pkg/wireguard"
) )
func allowedIPs(ips ...string) string { func allowedIPs(ips ...string) string {

View File

@@ -24,6 +24,9 @@ import (
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
) )
// DefaultMTU is the the default MTU used by WireGuard.
const DefaultMTU = 1420
type wgLink struct { type wgLink struct {
a netlink.LinkAttrs a netlink.LinkAttrs
t string t string
@@ -41,7 +44,7 @@ func (w wgLink) Type() string {
// If the interface exists, its index is returned. // If the interface exists, its index is returned.
// Otherwise, a new interface is created. // Otherwise, a new interface is created.
// The function also returns a boolean to indicate if the interface was created. // The function also returns a boolean to indicate if the interface was created.
func New(name string) (int, bool, error) { func New(name string, mtu uint) (int, bool, error) {
link, err := netlink.LinkByName(name) link, err := netlink.LinkByName(name)
if err == nil { if err == nil {
return link.Attrs().Index, false, nil return link.Attrs().Index, false, nil
@@ -51,6 +54,7 @@ func New(name string) (int, bool, error) {
} }
wl := wgLink{a: netlink.NewLinkAttrs(), t: "wireguard"} wl := wgLink{a: netlink.NewLinkAttrs(), t: "wireguard"}
wl.a.Name = name wl.a.Name = name
wl.a.MTU = int(mtu)
if err := netlink.LinkAdd(wl); err != nil { if err := netlink.LinkAdd(wl); err != nil {
return 0, false, fmt.Errorf("failed to create interface %s: %v", name, err) return 0, false, fmt.Errorf("failed to create interface %s: %v", name, err)
} }

View File

@@ -9,8 +9,8 @@
"deploy": "docusaurus deploy" "deploy": "docusaurus deploy"
}, },
"dependencies": { "dependencies": {
"@docusaurus/core": "^2.0.0-beta.0", "@docusaurus/core": "^2.0.0-beta.3",
"@docusaurus/preset-classic": "^2.0.0-beta.0", "@docusaurus/preset-classic": "^2.0.0-beta.3",
"classnames": "^2.3.1", "classnames": "^2.3.1",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2" "react-dom": "^17.0.2"
@@ -26,9 +26,5 @@
"last 1 firefox version", "last 1 firefox version",
"last 1 safari version" "last 1 safari version"
] ]
},
"resolutions": {
"minimist": "^1.2.3",
"node-fetch": "^2.6.1"
} }
} }

File diff suppressed because it is too large Load Diff