Scaleway Kapsule Overview
May 4, 2020
kubernetes
scaleway
cloud
Kapsule is the Managed Kubernetes distribution of Scaleway (formerly Online Labs), a french cloud provider akin to Digital Ocean.
This article is an architecture review of the technical and design choice that were made. It goes fast and try to shred some light on the major intresting points skipping the basic stuff.
TLDR; If you are only intrested by the technical part, jump to the end
Provisionning
Cluster are provisionned though the Scaleway web console or api.
The control-plane services (kube-api-server
, kube-scheduler
, etcd
) are not part of the cluster and so are not billed (directly) to the user. This is the same approach as the one used by GCP (before they annonced they will bill users for control-plane services starting june 2020)
Interface
Screenshot of the deployment interface. Only the PARIS region is available for Kubernetes.
The minimal cost of a cluster is €8/month (€0.016/hour) excluding taxes, using a single node with a DEV1-M
instance composed of 3 cores (amd64
), 4GB RAM and 40GB of local NVMe storage.
This a basically the same price as deploying the instance itself. You really get the k8s control-plane for free. Compute-wise at least.
Velocity
A few nodes cluster (1-3) takes under 5min to deploy, from button press to kubeconfig.
Kubernetes versions
At the time of this writing, the latest upstream version is v1.18.2 (with v1.19.0 being in alpha2). The following versions are available from Scaleway:
- v1.15.11
- v1.16.9
- v1.17.5
- v1.18.2
No unmaintained versions here like 1.12 or 1.13, only the latest patches, which can be an issue sometime when a feature you use is broken upstream. People looking to port old workloads are supposed to upgrade.
Autoscaling and resiliency
Scaleway allow automatic autoscaling of the cluster within a node limit, and auto-healing of nodes.
This is a basic check performed on the node that will reboot them if the kubelet
is unhealthy for more than 15min, and replace them after 30min by spinning up a new node.
CNI and optional features
Available CNI are Cilium, Calico, Weave and flannel. You can choose to deploy an ingress on top, ingress-nginx
or traefik
.
Architecture and overall design
This is an out-of-cluster master design, meaning:
- you don’t have to manage
etcd
(that one could be a relief) - you don’t have to manage certificates
- you don’t gave access to master nodes parameters (feature gates for example)
SSH is disabled on the worker nodes instances, but they are provisioned with an attached IPv4 and IPv6 /64.
CSI, PV and PVC
A block storage out-of-tree CSI driver is provided, along with two storage classes. The default reclaim policy is Delete. Be careful when deleting pods and deployments!
% kc get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEEXPANSION
scw-bssd (default) csi.scaleway.com Delete false
scw-bssd-retain csi.scaleway.com Retain false
Sadly the is no volume expansion.
Technical details
Everything here is based on a v1.18.2, 2-worker-nodes cluster with ingress-nginx
and cilium
.
Default daemonsets
% kc get ds
NAMESPACE NAME DESIRED CURRENT NODE SELECTOR
kube-system cilium 2 2 <none>
kube-system csi-node 2 2 <none>
kube-system kube-proxy 2 2 <none>
kube-system nginx-ingress 2 2 <none>
kube-system node-problem-detector 2 2 <none>
Default pods
% kc get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS
kube-system cilium-jnljw 1/1 Running 0
kube-system cilium-mmjvk 1/1 Running 0
kube-system cilium-operator-84b66df75c-prqvp 1/1 Running 0
kube-system coredns-7489757d7-tlpkp 1/1 Running 0
kube-system csi-node-4g2gd 2/2 Running 0
kube-system csi-node-qr9zc 2/2 Running 0
kube-system kube-proxy-4zgvl 1/1 Running 0
kube-system kube-proxy-59clk 1/1 Running 0
kube-system metrics-server-9d5bcc584-hph7m 1/1 Running 0
kube-system nginx-ingress-nnxvn 1/1 Running 0
kube-system nginx-ingress-twtkt 1/1 Running 0
kube-system node-problem-detector-44dgp 1/1 Running 0
kube-system node-problem-detector-njgbb 1/1 Running 0
Service accounts and PSP
% kc get sa --all-namespaces -o wide
NAMESPACE NAME SECRETS AGE
default default 1 10m
kube-node-lease default 1 10m
kube-public default 1 10m
kube-system cilium 1 10m
kube-system cilium-operator 1 10m
kube-system coredns 1 10m
kube-system csi-node-sa 1 10m
kube-system default 1 10m
kube-system kube-proxy 1 10m
kube-system metrics-server 1 10m
kube-system nginx-ingress 1 10m
kube-system node-problem-detector 1 10m
% kc get psp --all-namespaces
No resources found.
Metrics and nodes
% kc top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
scw-k8s-clever-wright-234 109m 3% 721Mi 24%
scw-k8s-clever-wright-fa7 117m 4% 674Mi 23%
on a four node cluster, the kernel
+ kubelet
+ daemonset
tax is nearly ~700Mio, or more than 20% of the allocated memory.
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
scw-k8s-clever-wright-default-234d104f0e2045da 166m 5% 992Mi 34%
scw-k8s-clever-wright-default-7317726a5df64669 102m 3% 669Mi 23%
scw-k8s-clever-wright-default-c821de8a86da47b3 102m 3% 671Mi 23%
scw-k8s-clever-wright-default-ec5259561f334432 89m 3% 672Mi 23%
% kc describe nodes
[...]
System Info:
Machine ID: 17733faa521042f8921d458f918a5539
System UUID: 17733faa-5210-42f8-921d-458f918a5539
Boot ID: 02b6453d-6a74-43f2-814d-008887799706
Kernel Version: 5.3.0-42-generic
OS Image: Ubuntu 18.04.3 LTS 0d484f1faf
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://19.3.5
Kubelet Version: v1.18.2
Kube-Proxy Version: v1.18.2
PodCIDR: 100.64.1.0/24
Ingress configuration
The default ingress instances binds the ports http/80
and https/443
on each nodes.
% kc describe -n kube-system pod nginx-ingress-twtkt
[...]
Ports: 80/TCP, 443/TCP
Host Ports: 80/TCP, 443/TCP
We are going to use that to setup ingress-nginx
in a next post.