轻量级Kubernetes。易于安装,内存的一半,所有二进制文件都小于40mb。
非常适合* Edge * IoT * CI * ARM * k8s群集博士学位不可行的情况
k3s旨在成为完全兼容的Kubernetes发行版,具有以下更改:
k3s
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
由于代理会喷出大量日志,因此输出可能会更长。默认情况下,服务器将自己注册为节点(运行代理)。如今,控制平面成为集群的一部分是常见的并且几乎是必需的。要在默认情况下不运行代理,请使用--disable-agent标志
--disable-agent
k3s server --disable-agent
此时,您可以将代理作为单独的进程运行,或者根本不在此节点上运行代理。
如果您在启动k3时遇到类似"stream server error: listen tcp: lookup some-host on X.X.X.X:53: no such host"的错误,请确保/etc/hosts包含您当前的主机名(输出为hostname),设置为127.x.x.x地址。例如:
"stream server error: listen tcp: lookup some-host on X.X.X.X:53: no such host"
/etc/hosts
hostname
127.0.1.1 myhost
服务器启动时会创建文件/var/lib/rancher/k3s/server/node-token。使用该文件的内容为NODE_TOKEN,然后运行代理程序,如下所示
/var/lib/rancher/k3s/server/node-token
NODE_TOKEN
k3s agent --server https://myserver:6443 --token ${NODE_TOKEN}
就是这样。
将位于群集外部的计算机上的/etc/rancher/k3s/k3s.yaml复制为/etc/rancher/k3s/k3s.yaml。然后替换“localhost”使用您的k3s服务器的IP或名称。 kubectl现在可以管理您的k3s群集。
/etc/rancher/k3s/k3s.yaml
kubectl
在/var/lib/rancher/k3s/server/manifests中找到的任何文件都将以类似于kubectl apply的方式自动部署到Kubernetes。
/var/lib/rancher/k3s/server/manifests
kubectl apply
也可以部署Helm图表。 k3s支持CRD控制器来安装图表。 YAML文件规范可以如下所示(示例取自/var/lib/rancher/k3s/server/manifests/traefik.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"
请记住,HelmChart资源元数据部分中的namespace应始终为kube-system,因为k3s deploy controller配置为监视此命名空间以获取新的HelmChart资源。如果要为实际的helm版本指定命名空间,可以使用规范部分中的targetNamespace键来执行此操作:
namespace
kube-system
targetNamespace
apiVersion: k3s.cattle.io/v1 kind: HelmChart metadata: name: grafana namespace: kube-system spec: chart: stable/grafana targetNamespace: monitoring set: adminPassword: "NotVerySafePassword" valuesContent: |- image: tag: master env: GF_EXPLORE_ENABLED: true adminUser: admin sidecar: datasources: enabled: true
另请注意,除了set,您还可以在规格部分中使用valuesContent。并且可以同时使用它们。
set
valuesContent
如果您执行
git clone --depth 1 https://github.com/rancher/k3s.git
此回购包含Kubernetes的所有历史记录,因此--depth 1将避免其中的大部分内容。
--depth 1
对于开发,你只需要去1.12和理智的GOPATH。编译二进制文件运行
go build -o k3s go build -o kubectl ./cmd/kubectl go build -o hyperkube ./vendor/k8s.io/kubernetes/cmd/hyperkube
这将创建主可执行文件,但它不包括像containerd,CNI等依赖项。要运行具有开发所有依赖项的服务器和代理程序,请运行以下帮助程序脚本
# Server ./scripts/dev-server.sh # Agent ./scripts/dev-agent.sh
构建完整版本二进制运行make,这将创建./dist/artifacts/k3s
make
./dist/artifacts/k3s
从v0.3.0开始,可以使用额外的标志自定义以下任何进程:
可以通过将以下标志传递给服务器或代理来添加额外参数:
--kube-apiserver-arg value --kube-scheduler-arg value --kube-controller-arg value --kubelet-arg value --kube-proxy-arg value
例如,要将以下参数-v=9和log-file=/tmp/kubeapi.log添加到kube-apiserver,你应该传递以下内容:
-v=9
log-file=/tmp/kubeapi.log
k3s server --kube-apiserver-arg v=9 --kube-apiserver-arg log-file=/tmp/kubeapi.log
如果在根目录下使用install.sh脚本安装了k3s服务器,则可以使用安装期间生成的卸载脚本,该脚本将在服务器节点上创建,网址为/usr/local/bin/k3s-uninstall.sh
install.sh
/usr/local/bin/k3s-uninstall.sh
Kubernetes的源代码在vendor/,复制的位置在./vendor.conf。转到引用的repo / tag,您将找到应用于上游Kubernetes的所有补丁。
vendor/
./vendor.conf
服务器需要端口6443才能被节点访问。节点需要能够通过UDP端口8472到达其他节点。这用于法兰绒VXLAN。如果你不使用法兰绒并提供自己的定制CNI,则k3s不需要8472。节点不应该侦听任何其他端口。 k3s使用反向隧道,以便节点与服务器建立出站连接,并且所有kubelet流量都通过该隧道。
重要。节点上的VXLAN端口不应暴露给全世界,它会打开您的群集网络以供任何人访问。在防火墙/安全组后面运行节点,禁用对端口8472的访问.7
现在就不要了:)它目前已经坏了。
如果我无法在Docker中运行我的集群,我就不会是我。 rancher/k3s图像可用于从Docker运行k3s服务器和代理。 docker-compose.yml位于此repo的根目录中,作为如何从Docker运行k3s的示例。从此repo运行
rancher/k3s
docker-compose.yml
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
要仅在Docker中运行代理程序,请使用以下docker-compose-agent.yml作为此repo的根目录,作为如何从Docker运行k3s代理程序的示例。或者也可以使用Docker run命令;
docker-compose-agent.yml
sudo docker run -d --tmpfs /run --tmpfs /var/run -e K3S_URL=${SERVER_URL} -e K3S_TOKEN=${NODE_TOKEN} --privileged rancher/k3s:v0.5.0 sudo docker run -d --tmpfs /run --tmpfs /var/run -e K3S_URL=https://k3s.example.com:6443 -e K3S_TOKEN=K13849a67fc385fd3c0fa6133a8649d9e717b0258b3b09c87ffc33dae362c12d8c0::node:2e373dca319a0525745fd8b3d8120d9c --privileged rancher/k3s:v0.5.0
k3s捆绑在一个漂亮的包装器中,以消除运行k8s的大部分麻烦。如果你不想要那个包装器并且只想要一个更小的k8s发行版,那么这些发行版包含你可以使用的hyperkube二进制文件。然后由您决定如何使用hyperkube。如果您需要单独的二进制文件,则需要自己从源代码
hyperkube
k3s包含默认为containerd。为什么?因为它只是更好。如果你想先使用Docker运行并想一想,“真的吗?我真的想要更头疼吗?“如果仍然是,那么您只需要使用--docker标志
--docker
k3s agent -s ${SERVER_URL} -t ${NODE_TOKEN} --docker &
k3s将在/var/lib/rancher/k3s/agent/etc/containerd/config.toml中为containerd生成config.toml,对于此文件的高级自定义,您可以在同一目录中创建另一个名为config.toml.tmpl的文件,它将被替代使用。
/var/lib/rancher/k3s/agent/etc/containerd/config.toml
config.toml.tmpl
将config.toml.tmpl视为Golang模板文件,并将config.Node结构传递给模板,以下是如何使用该结构自定义配置文件的示例https://github.com/rancher/k3s /blob/master/pkg/agent/templates/templates.go#L16-L32
config.Node
如果你受到systemd的束缚(我们大多数人都是)的约束,那么这个repo k3s.service的根目录中有一个样本单元文件,如下所示
k3s.service
[Unit] Description=Lightweight Kubernetes Documentation=https://k3s.io After=network-online.target [Service] Type=notify EnvironmentFile=/etc/systemd/system/k3s.service.env ExecStart=/usr/local/bin/k3s server KillMode=process Delegate=yes LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity TimeoutStartSec=0 [Install] WantedBy=multi-user.target
k3s install.sh脚本还提供了一种方便的方法来安装到systemd,安装代理和服务器作为k3s服务运行:
curl -sfL https://get.k3s.io | sh -
安装脚本将尝试下载最新版本,以指定要下载的特定版本,我们可以使用INSTALL_K3S_VERSION环境变量,例如:
INSTALL_K3S_VERSION
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -
要仅安装没有代理的服务器,我们可以在命令中添加INSTALL_K3S_EXEC环境变量:
INSTALL_K3S_EXEC
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable-agent" sh -
要仅安装没有服务器的代理,我们应该通过K3S_URL以及K3S_TOKEN或K3S_CLUSTER_SECRET,例如:
K3S_URL
K3S_TOKEN
K3S_CLUSTER_SECRET
curl -sfL https://get.k3s.io | K3S_URL=https://example-url:6443 K3S_TOKEN=XXX sh -
也可以通过设置INSTALL_K3S_SKIP_DOWNLOAD=true运行安装程序而不执行下载,例如:
INSTALL_K3S_SKIP_DOWNLOAD=true
curl -sfL https://github.com/rancher/k3s/releases/download/vX.Y.Z/k3s -o /usr/local/bin/k3s chmod 0755 /usr/local/bin/k3s curl -sfL https://get.k3s.io -o install-k3s.sh chmod 0755 install-k3s.sh export INSTALL_K3S_SKIP_DOWNLOAD=true ./install-k3s.sh
安装脚本环境变量的完整帮助文本如下: - K3S_*
K3S_*
Environment variables which begin with `K3S_` will be preserved for the systemd service to use. Setting `K3S_URL` without explicitly setting a systemd exec command will default the command to "agent", and we enforce that `K3S_TOKEN` or `K3S_CLUSTER_SECRET` is also set.
INSTALL_K3S_SKIP_DOWNLOAD
如果设置为true则不会下载k3s哈希值或二进制值。
从github下载的k3s版本。如果未指定,将尝试下载最新版本。
INSTALL_K3S_BIN_DIR
用于安装k3s二进制文件,链接和卸载脚本的目录,或使用/ usr / local / bin作为默认值
INSTALL_K3S_SYSTEMD_DIR
用于安装systemd服务和环境文件的目录,或使用/ etc / systemd / system作为默认值
INSTALL_K3S_EXEC或脚本参数
带有用于在systemd服务中启动k3的标志的命令,如果未指定该命令,则默认为“agent”。如果设置了K3S_URL或“服务器”如果不。最终的systemd命令解析为EXEC和脚本args($ @)的组合。
以下命令导致相同的行为:
curl ... | INSTALL_K3S_EXEC="--disable-agent" sh -s - curl ... | INSTALL_K3S_EXEC="server --disable-agent" sh -s - curl ... | INSTALL_K3S_EXEC="server" sh -s - --disable-agent curl ... | sh -s - server --disable-agent curl ... | sh -s - --disable-agent
INSTALL_K3S_NAME
要创建的systemd服务的名称,如果未指定,将默认使用k3s exec命令。如果指定,名称将以'k3s-'为前缀。
INSTALL_K3S_TYPE
要创建的systemd服务的类型,如果未指定,将默认使用k3s exec命令。
要预先设置Alpine Linux,您必须执行以下步骤:
echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab cat >> /etc/cgconfig.conf <<EOF mount { cpuacct = /cgroup/cpuacct; memory = /cgroup/memory; devices = /cgroup/devices; freezer = /cgroup/freezer; net_cls = /cgroup/net_cls; blkio = /cgroup/blkio; cpuset = /cgroup/cpuset; cpu = /cgroup/cpu; } EOF
然后通过添加 /etc/update-extlinux.conf 更新:
default_kernel_opts="... cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
然后更新配置并重新启动
update-extlinux reboot
重启后:
对于服务器:
#!/sbin/openrc-run command=/usr/local/bin/k3s command_args="server" pidfile= name="k3s" description="Lightweight Kubernetes"
代理人:
#!/sbin/openrc-run command=/usr/local/bin/k3s command_args="agent --server https://myserver:6443 --token ${NODE_TOKEN}" pidfile= name="k3s" description="Lightweight Kubernetes"
默认情况下包含法兰绒,如果你不想法兰绒然后用--no-flannel运行代理如下
--no-flannel
k3s agent -u ${SERVER_URL} -t ${NODE_TOKEN} --no-flannel &
在此设置中,您仍然需要安装自己的CNI驱动程序。更多信息这里
CoreDNS部署在代理启动时,禁用将--no-deploy coredns添加到服务器
--no-deploy coredns
k3s server --no-deploy coredns
如果您未安装CoreDNS,则需要自行安装集群DNS提供程序。
启动服务器时默认部署Traefik;要禁用它,请像这样
--no-deploy traefik
k3s server --no-deploy traefik
k3s包括一个使用可用主机端口的基本服务负载平衡器。例如,如果您尝试创建侦听端口80的负载均衡器,它将尝试在群集中为端口80找到一个空闲主机。如果没有可用的端口,则负载均衡器将保持挂起状态。
要禁用嵌入式服务负载均衡器(如果您希望使用其他实现,如MetalLB),只需在启动时将--no-deploy=servicelb添加到服务器。
--no-deploy=servicelb
k3s支持在启动之前将容器映像预先加载到代理程序的images目录中,例如:
images
sudo mkdir -p /var/lib/rancher/k3s/agent/images/ sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
通过发布页面提供了基本安装所需的映像,可以使用docker save命令创建其他映像。
docker save
脱机Helm图表从/var/lib/rancher/k3s/server/static目录提供,Helm图表清单可以使用%{KUBERNETES_API}%模板化变量引用静态文件。例如,默认的traefik清单图表安装自https://%{KUBERNETES_API}%/static/charts/traefik-X.Y.Z.tgz。
/var/lib/rancher/k3s/server/static
%{KUBERNETES_API}%
https://%{KUBERNETES_API}%/static/charts/traefik-X.Y.Z.tgz
如果完全禁用网络,则k3可能无法启动(即以太网未插入或wifi断开连接),在这种情况下可能需要添加默认路由。例如:
sudo ip -c address add 192.168.123.123/24 dev eno1 sudo ip route add default via 192.168.123.1
k3s还为kubelet提供了--resolv-conf标志,这可能有助于在气隙网络中配置DNS。
--resolv-conf
已添加初始无根支持,但围绕它存在一系列重要的可用性问题。我们正在为那些对rootless感兴趣的人发布最初的支持,希望有些人可以帮助提高可用性。首先确保您对用户命名空间进行了适当的设置和支持。有关说明,请参阅rootlesskit中的要求部分。简而言之,最新的Ubuntu是您工作的最佳选择。
运行无根时,将创建新的网络命名空间。这意味着k3s实例正在运行,网络与主机分离。访问从主机以k3s运行的服务的唯一方法是将端口转发到k3s网络命名空间。我们有一个控制器,它将自动将6443和任何服务端口绑定到主机,偏移量为10000.这意味着服务端口80将在主机上变为10080。一旦你杀了k3s然后启动一个新的k3s实例就会创建一个新的网络命名空间,但它不会杀死旧的pod。所以你的设置相当破碎。这是目前的主要问题,如何处理网络命名空间。
只需将--rootless标志添加到服务器或代理。因此,请运行k3s server --rootless,然后查找消息Wrote kubeconfig [SOME PATH]以了解您的kubeconfig访问群集的位置。很奇怪,如果您使用-o将kubeconfig写入不同的目录,它可能无法正常工作。这是因为k3s实例在不同的mount命名空间中运行。
--rootless
k3s server --rootless
Wrote kubeconfig [SOME PATH]
-o
要从旧版本升级k3,如果已使用安装脚本运行k3s,则可以运行安装脚本,这可以使用:
如果要升级到特定版本,可以运行以下命令:
要使用openrc升级,您可以从最新的版本下载更新版本的k3s并替换/usr/local/bin/k3s中的二进制文件,然后重新启动该服务:
/usr/local/bin/k3s
service k3s restart
目前需要完成的破碎或其他东西被视为生产质量。
k3s server --kubelet-arg="address=0.0.0.0"
recipes/metrics-server