最近因为毕业设计的原因需要精简以及裁剪k8s使其能够在树莓派上运行,于是找到了k3s。
k3s官网
github
因为文档以后很有可能会有变动,故留下翻译日期:
2019.3.14
k3s使轻量班的kubernetes.比起k8s,它方便安装,只占用一半的内存,所有组件都在一个小于40mb的二进制文件里
对于以下5方面更加优异:
k3s是一个完全兼容k8s的分布式集群,相比k8s,它有以下的改变:
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"
如果用以下指令,代码克隆会快很多
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
如何你使用了install.sh
脚本来安装你的k3s,你可以使用在安装时产生的卸载脚本来卸载,该脚本将创建于server节点的/usr/local/bin/k3s-uninstall.sh
Kubernetes的源码在vendor/
目录下,而其代码来源在./vendor.conf
文件中,去到相应的仓库/文件你会发现所有的kubernetes源
server需要6443端口来被其他节点连接。节点之间需要通过UDP的4789端口来连接。这用于flannel VXLAN。如果你的CNI组件使用的不是flannel,那么4789端口就不再被k3s所需要。节点不应该再听其他端口。k3s使用反向隧道使节点连接到server以及所有的kubelet都会流经该隧道。
重要的是,节点中的VXLAN端口不应该暴露于公网,这将会使你的集群被任何人访问到,使你的节点在关闭了4789端口的防火墙下运行。
别现在说,目前处于崩溃状态
如果我不能使我的集群在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 11s v1.13.2-k3s2
d54c8b17c055 Ready 11s v1.13.2-k3s2
db7a5a5a5bdd Ready 12s v1.13.2-k3s2
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。如果你想要分开的二进制文件,你需要从源码中自己编译它们。
k3s包含并且默认的容器是containerd。为什么?因为它就是更好。如果你想使用docker那么先停下来想想,“真的吗?我真的需要更多的头痛吗?”如果还是回答yes,那么你只需要使用–docker参数即可:
k3s agent -u ${SERVER_URL} -t ${NODE_TOKEN} --docker &
如果你被限制在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则运行时使用–no-flannel
k3s agent -u ${SERVER_URL} -t ${NODE_TOKEN} --no-flannel &
这将需要你安装你自己的CNI驱动。
CoreDNS在agent一开始便被部署,在server使用–no-deploy coredns 来取消
k3s server --no-deploy coredns
如果你不安装CoreDNS则需要你自己提供集群的DNS
Traefik是在server开始是被部署的,需要取消运行以下指令
k3s server --no-deploy traefik
k3s包含基本的服务负载均衡器,比如说,如果你试着创建监听80端口的负载均衡器,它将会在集群中尝试寻找80端口空闲的主机,若 不存在,则负载均衡器将保持pending状态。
如果需要取消内置的负载均衡器(如果你想要使用其他的比如说MetalLB)只需要在server启动时添加 --no-deploy=servicelb
目前还处于崩溃状态或者是为了产品质量需要被完善的事情
(不想翻译了,如果需要提交commit给rancher应该能看得懂)