前言

最近因为毕业设计的原因需要精简以及裁剪k8s使其能够在树莓派上运行,于是找到了k3s。
k3s官网
github

因为文档以后很有可能会有变动,故留下翻译日期:
2019.3.14

正文

K3s-比k8s少5个方面

k3s使轻量班的kubernetes.比起k8s,它方便安装,只占用一半的内存,所有组件都在一个小于40mb的二进制文件里
对于以下5方面更加优异:

  • Edge
  • IoT
  • CI
  • ARM(这正是我所需要的)
  • 一些精通k8s集群的人也无法解决的情况

它是什么

k3s是一个完全兼容k8s的分布式集群,相比k8s,它有以下的改变:

  1. 一些弃用的,测试性的,非默认的特性被删除,你不应该关注那些已经被删除的东西
  2. 删除了大部分能够被tree以外的插件替换的in-tree插件(比如说云提供商以及存储插件)
  3. 将sqlite3作为默认的存储机制,etcd3仍可用,但不是默认的
  4. 包装进了一个简单的启动脚本,该脚本可以处理大量的复杂的工作。
  5. 无操作系统依赖(一个正常的内核和cgroup挂载即可),k3s依赖包:
  • containerd
    (一种容器)
  • flannel
  • CoreDNS
  • CNI
  • 一些主机的设施(iptables,socat等)

快速开始

  1. 下载最新版本k3s,x86_64,armhf,arm64都是被支持的
  2. 启动服务器
sudo k3s server &
# Kubeconfig is written to /etc/rancher/k3s/k3s.yaml
sudo k3s kubectl get node

# On a different node run the below. NODE_TOKEN comes from /var/lib/rancher/k3s/server/node-token 
# on your server
sudo k3s agent --server https://myserver:6443 --token ${NODE_TOKEN}

启动服务器

需要启动服务器只需要:
k3s server
你将得到类似于以下输出:

INFO[2019-01-22T15:16:19.908493986-07:00] Starting k3s dev                             
INFO[2019-01-22T15:16:19.908934479-07:00] Running kube-apiserver --allow-privileged=true --authorization-mode Node,RBAC --service-account-signing-key-file /var/lib/rancher/k3s/server/tls/service.key --service-cluster-ip-range 10.43.0.0/16 --advertise-port 6445 --advertise-address 127.0.0.1 --insecure-port 0 --secure-port 6444 --bind-address 127.0.0.1 --tls-cert-file /var/lib/rancher/k3s/server/tls/localhost.crt --tls-private-key-file /var/lib/rancher/k3s/server/tls/localhost.key --service-account-key-file /var/lib/rancher/k3s/server/tls/service.key --service-account-issuer k3s --api-audiences unknown --basic-auth-file /var/lib/rancher/k3s/server/cred/passwd --kubelet-client-certificate /var/lib/rancher/k3s/server/tls/token-node.crt --kubelet-client-key /var/lib/rancher/k3s/server/tls/token-node.key 
Flag --insecure-port has been deprecated, This flag will be removed in a future version.
INFO[2019-01-22T15:16:20.196766005-07:00] Running kube-scheduler --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --port 0 --secure-port 0 --leader-elect=false 
INFO[2019-01-22T15:16:20.196880841-07:00] Running kube-controller-manager --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --service-account-private-key-file /var/lib/rancher/k3s/server/tls/service.key --allocate-node-cidrs --cluster-cidr 10.42.0.0/16 --root-ca-file /var/lib/rancher/k3s/server/tls/token-ca.crt --port 0 --secure-port 0 --leader-elect=false 
Flag --port has been deprecated, see --secure-port instead.
INFO[2019-01-22T15:16:20.273441984-07:00] Listening on :6443                           
INFO[2019-01-22T15:16:20.278383446-07:00] Writing manifest: /var/lib/rancher/k3s/server/manifests/coredns.yaml 
INFO[2019-01-22T15:16:20.474454524-07:00] Node token is available at /var/lib/rancher/k3s/server/node-token 
INFO[2019-01-22T15:16:20.474471391-07:00] To join node to cluster: k3s agent -s https://10.20.0.3:6443 -t ${NODE_TOKEN} 
INFO[2019-01-22T15:16:20.541027133-07:00] Wrote kubeconfig /etc/rancher/k3s/k3s.yaml
INFO[2019-01-22T15:16:20.541049100-07:00] Run: k3s kubectl    

因为代理将输出大量的Logs,所以输出有可能会更长。默认的设置是服务器会将它自己注册为一个节点(去运行代理)。控制部分成为集群的一部分在最近是非常常见的一种用法。如果不想让服务器成为代理,可以运行以下指令:
k3s server --disable-agent
这样,你可以将agent作为独立的进程来运行或根本不去运行agent。

加入节点

服务器启动后会创建一个文件/var/lib/rancher/k3s/server/node-token,将该文件中的内容作为NODE_TOKEN并在agent节点执行以下指令:

k3s agent --server https://myserver:6443 --token ${NODE_TOKEN}

从集群外连接集群

/etc/rancher/k3s/k3s.yaml复制到你集群外的机器上的~/.kube/config这一位置,然后将“localhost”用你k3s服务器的ip来代替,之后就可以在该机器上用kubectl来管理你的k3s集群了。

组件自动部署

任何从/var/lib/rancher/k3s/server/manifests找到的文件都可以用以类似于kubetl apply的指令自动的被部署到kubernetes上
甚至可以部署Helm charts(是k8s的包管理工具)。
k3s支持CRD controller (用户自定义组件控制器)来安装 charts。
一个YAML文件可以如下配置(样例取自/var/lib/rancher/k3s/server/manifests/traefik.yaml

apiVersion: k3s.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
  chart: stable/traefik
  set:
    rbac.enabled: "true"
    ssl.enabled: "true"

用源码build

如果用以下指令,代码克隆会快很多
git clone --depth 1 https://github.com/rancher/k3s.git
因为该仓库包含了所有Kubernetes的历史文件,所以--depth 1会避免重复下载
为了编译安装,你需要go 1.11和一个正常的GOPATH,使用以下指令来编译:

go build -o k3s
go build -o kubectl ./cmd/kubectl
go build -o hyperkube ./vendor/k8s.io/kubernetes/cmd/hyperkube

这将创建主要的执行文件,但不包含containerd,CNI等等的依赖,要运行一个拥有所有依赖的server和agent,执行以下脚本。

# Server
./scripts/dev-server.sh

# Agent
./scripts/dev-agent.sh

卸载server

如何你使用了install.sh脚本来安装你的k3s,你可以使用在安装时产生的卸载脚本来卸载,该脚本将创建于server节点的/usr/local/bin/k3s-uninstall.sh

kubernetes 源码

Kubernetes的源码在vendor/目录下,而其代码来源在./vendor.conf文件中,去到相应的仓库/文件你会发现所有的kubernetes源

需要开放的端口/网络安全

server需要6443端口来被其他节点连接。节点之间需要通过UDP的4789端口来连接。这用于flannel VXLAN。如果你的CNI组件使用的不是flannel,那么4789端口就不再被k3s所需要。节点不应该再听其他端口。k3s使用反向隧道使节点连接到server以及所有的kubelet都会流经该隧道。

重要的是,节点中的VXLAN端口不应该暴露于公网,这将会使你的集群被任何人访问到,使你的节点在关闭了4789端口的防火墙下运行。

Server HA(我也没搞懂这是什么)

别现在说,目前处于崩溃状态

使用Docker(以及Docker组件)

如果我不能使我的集群在Docker上跑我将不是我。rancher/k3s镜像是可以将k3s server 和 agent用docker容器跑起来的,一个 docker-compose.yml在该仓库的根目录下,这是一个k3s server 如何跑在docker下的例子。要使用docker-compose,执行

docker-compose up --scale node=3
# kubeconfig is written to current dir
kubectl --kubeconfig kubeconfig.yaml get node

NAME           STATUS   ROLES    AGE   VERSION
497278a2d6a2   Ready    <none>   11s   v1.13.2-k3s2
d54c8b17c055   Ready    <none>   11s   v1.13.2-k3s2
db7a5a5a5bdd   Ready    <none>   12s   v1.13.2-k3s2

Hyperkube

k3s被包装在了一个文件中来简化使用K8s时的大量的令人头疼的工作,如果你不想使用该包装,而只是想要一个精简版的k8s发行版,那么我们的发行版中包含了hyperkube
(译者注:Kubernetes is a set of binaries
kube-apiproxy
kube-scheduler
kube-control-manager
kubelet
kube-proxy
hyperkube is a wrapper for all these binaries. So once you deploy hyperkube, it will install all the binaries. No need to install those binary individually.)
二进制文件你可以使用.这取决于你如何去使用hyperkube。如果你想要分开的二进制文件,你需要从源码中自己编译它们。

containerd和Docker

k3s包含并且默认的容器是containerd。为什么?因为它就是更好。如果你想使用docker那么先停下来想想,“真的吗?我真的需要更多的头痛吗?”如果还是回答yes,那么你只需要使用–docker参数即可:
k3s agent -u ${SERVER_URL} -t ${NODE_TOKEN} --docker &

systemd工具

如果你被限制在systemd工具的桎梏下(正如我们大多数人一样),在这个仓库的根目录下有一个样例unit文件k3s.service如下:

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network.target

[Service]
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity

[Install]
WantedBy=multi-user.target

k3s的install.sh脚本同样提供了在systemd下的方便的安装方法,安装agent和server作为k3s的服务只需要:
curl -sfL https://get.k3s.io | sh -
这一行脚本将尝试下载最新发行版,若要规定下载版本可以用INSTALL_K3S_VERSION环境变量:
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -
若只需要安装server不装agent
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable-agent" sh -
只装agent不装server
curl -sfL https://get.k3s.io | K3S_URL=https://example-url:6443 K3S_TOKEN=XXX sh -
……
剩下的是一堆关于安装脚本的帮助说明,没什么帮助,便不再翻译

Flannel

Flannel被默认包含,如果你不想要flannel则运行时使用–no-flannel
k3s agent -u ${SERVER_URL} -t ${NODE_TOKEN} --no-flannel &
这将需要你安装你自己的CNI驱动。

CoreDNS

CoreDNS在agent一开始便被部署,在server使用–no-deploy coredns 来取消
k3s server --no-deploy coredns
如果你不安装CoreDNS则需要你自己提供集群的DNS

Traefik

Traefik是在server开始是被部署的,需要取消运行以下指令
k3s server --no-deploy traefik

Service load balancer

k3s包含基本的服务负载均衡器,比如说,如果你试着创建监听80端口的负载均衡器,它将会在集群中尝试寻找80端口空闲的主机,若 不存在,则负载均衡器将保持pending状态。
如果需要取消内置的负载均衡器(如果你想要使用其他的比如说MetalLB)只需要在server启动时添加 --no-deploy=servicelb

TODO

目前还处于崩溃状态或者是为了产品质量需要被完善的事情
(不想翻译了,如果需要提交commit给rancher应该能看得懂)

  1. Metrics API due to kube aggregation not being setup
  2. HA
  3. Work on e2e, sonobouy.
  4. etcd doesn’t actually work because args aren’t exposed
Logo

开源、云原生的融合云平台

更多推荐