高级设置与配置


本节包含有关在各种配置下使用k3s的说明。

1. 设置kubeconfig文件

kubeconfig文件用于配置对Kubernetes集群的访问。为了访问Kubernetes API(例如使用kubectl)或使用Helm安装应用程序,必须正确设置它。您可以通过导出KUBECONFIG环境变量或为kubectl和helm指定参数来设置kubeconfig。有关详细信息,请参见以下示例。 利用KUBECONFIG环境变量:

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pods --all-namespaces
helm ls --all-namespaces
1
2
3

或通过命令指定kubeconfig文件的位置:

kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods --all-namespaces
helm --kubeconfig /etc/rancher/k3s/k3s.yaml ls --all-namespaces
1
2

2. 使用Helm 3

K3s版本v1.17.0 + k3s.1添加了对Helm 3的支持。您可以在此处访问Helm 3文档。请注意,Helm 3不再区分tiller和helm init命令。有关详细信息,请参阅官方文档。

K3s不需要任何特殊配置即可开始使用Helm3。只需确保已按照上述设置kubeconfig文件部分正确设置了kubeconfig 。

2.1. Helm升级

如果您在K3S的早期版本中使用了Helm v2,则可以升级到v1.17.0 + k3s.1或更高版本,并且Helm 2仍然可以运行。如果您希望迁移到Helm 3,Helm的这篇博客文章介绍了如何使用插件成功迁移。有关更多信息,请参阅此处的官方Helm 3文档。从v1.17.0 + k3s.1起,K3S可以处理Helm v2或Helm v3。只需确保按照上面设置kubeconfig文件部分中的示例正确设置了kubeconfig

3. Helm CRD

可以使用以下示例部署第三方Helm chart:

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: nginx
  namespace: kube-system
spec:
  chart: nginx
  repo: https://charts.bitnami.com/bitnami
  targetNamespace: default
1
2
3
4
5
6
7
8
9

可以使用以下示例安装特定版本的Helm chart:

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: stable/nginx-ingress
  namespace: kube-system
spec:
  chart: nginx-ingress
  version: 1.24.4
  targetNamespace: default
1
2
3
4
5
6
7
8
9

4. 自动部署清单

/var/lib/rancher/k3s/server/manifests中找到的任何YAML文件,将以类似于kubectl apply的方式自动部署到Kubernetes 。也可以部署Helm Chart,k3s支持CRD控制器来安装Chart。YAML文件规范如下所示(示例取自/var/lib/rancher/k3s/server/manifests/traefik.yaml):

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
  chart: stable/traefik
  set:
    rbac.enabled: "true"
    ssl.enabled: "true"
1
2
3
4
5
6
7
8
9
10

请记住,Helm Chart资源元数据部分中的namespace应该总是kube-system,因为k3s部署控制器被配置为监视这个命名空间以获取新的Helm Chart资源。如果您想为Helm Chart指定命名空间,您可以在spec部分使用targetNamespace键:

apiVersion: helm.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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

提示

除了set之外,您还可以在spec部分使用valuesContent。两者都可以用。

对于helmcharts api group,在k3s版本小于或者等于v0.5.0时使用k3s.cattle.io ,以后的版本将修改为helm.cattle.io

5. 从外部访问K3S集群

/etc/rancher/k3s/k3s.yaml 为具有管理员权限的kubecfg配置文件,复制此文件到能够访问K3S SERVER的主机或者笔记本上,建议保存文件为~/.kube/config。接着使用编辑器打开~/.kube/config,替换server字段中的localhost为k3s server的IP或域名。接着就可以使用kubectl访问K3S集群了。

6. 开放端口/网络安全

k3s server需要6443端口可供节点访问,这些节点需要能够通过UDP 8472端口来相互访问组建Flannel VXLAN网络。如果您不使用Flannel VXLAN并提供自己的自定义CNI,则k3s不需要8472端口。k3s使用反向隧道,以便节点建立与服务器的出站连接,并且所有kubelet流量都通过该隧道通信。

重要提示

安全起见,UDP 8472端口应该只允许集群中的主机能访问,禁止其他主机访问。

7. 节点注册

Agents将使用节点集群密钥以及存储在/var/lib/rancher/k3s/agent/node-password.txt的节点随机密码来向server注册。server将在/var/lib/rancher/k3s/server/cred/node-passwd存储单个节点密码,后续任何尝试都必须使用相同的密码。如果删除了agent的数据目录,则应该为该agent重新创建密码文件,或者从服务器中删除该agent。

8. Containerd 和 Docker

k3s包含并默认为containerd。如果您想使用Docker而不是containerd,那么您只需要在运行agent的时候添加--docker参数。`

K3S将在/var/lib/rancher/k3s/agent/etc/containerd/config.toml中为containerd生成config.toml配置文件。您可以在/var/lib/rancher/k3s/agent/etc/containerd目录中创建config.toml.tmpl来自定义配置文件,自定义配置文件将覆盖原始配置。

config.toml.tmpl是一个Golang模板文件,config.Node结构将被传递给模板。下面是关于如何使用该结构来定制配置文件的示例:https://github.com/rancher/k3s/blob/master/pkg/agent/templates/templates.go#L16-L32

9. Rootless (实验)

警告 实验功能

基本的rootless支持已经完成,但是围绕它存在一系列重大的可用性问题。首先,请确保您对用户命名空间具有正确的设置和支持。请参考RootlessKit中的 需求 部分。简而言之,最新的Ubuntu是您最好的选择。

9.1. Rootless 问题

  • Ports

运行rootless时,将创建一个新的网络命名空间,这意味着k3s实例正在使用的网络与主机完全隔离。要从主机访问在k3s中运行的服务的惟一方法,是把端口映射到k3s网络命名空间。有一个控制器,它将自动把6443和低于1024的服务端口映射到主机,偏移量为10000。这意味着服务端口80将成为主机上的10080,但8080保持不变

提示

目前,只有LoadBalancer服务是自动绑定的。

  • Daemon lifecycle

一旦kill k3s,然后启动一个新的k3s实例,它将创建一个新的网络命名空间,但它不会KILL旧的pods。这样您就得到了一个相当混乱的结构。如何处理网络命名空间是当前的主要问题。

问题追踪: https://github.com/rootless-containers/rootlesskit/issues/65

  • Cgroups

不支持Cgroups

9.2. Rootless 运行

只需将--rootless参数添加到serveragent即可。因此,运行k3s server --rootless,然后查找日志信息: Wrote kubeconfig [SOME PATH],将显示kubeconfig访问集群的地址等信息。请注意,如果您习惯使用-o将kubeconfig写入其他目录,则可能无法使用,因为k3s在不同的命名空间运行。

10. 节点Labels和Taints

k3s agents能够使用--node-label--node-taint添加Labels和Taints到kubelet,这两个选项只能在注册时添加,并且只能添加一次,之后不能更改。以下是添加标签选项的一个示例:

--node-label foo=bar \
--node-label hello=world \
--node-taint key1=value1:NoExecute
1
2
3

11. Flannel

默认将安装Flannel网络驱动, 如果您不想使用flannel,在添加agent的时候添加--no-flannel 参数禁止。

但是,您仍然需要安装自己的CNI驱动程序。了解更多信息

12. CoreDNS

运行agent的时候默认将部署CoreDNS,可以添加--no-deploy coredns 参数去禁止。

如果不安装CoreDNS,则需要自己安装集群DNS服务。

13. Traefik

当运行server的时候默认部署Traefik,可以通过添加 --no-deploy traefik参数禁止。

14. Service Load Balancer

K3S包含使用可用主机端口的基础服务负载均衡器,如果尝试创建一个监听80端口的负载均衡,它将去寻找集群中80端口可用的主机,如果没有可用的主机,那么负载均衡将处于等待中。

可通过在运行server时,添加 --no-deploy servicelb 参数去禁用内置负载均衡服务。 如果您想运行其他负载平衡器(例如MetalLB),则内置负载均衡必需启用。

15. 指标服务器(Metrics Server)

要添加例如k3s kubectl top nodes之类的命令功能,metrics-server则必须安装。更多安装信息请查看 https://github.com/kubernetes-incubator/metrics-server/.

提示

metrics-server-deployment.yaml 中的默认镜像仅对amd64设备有效,应该编辑这个文件,根据当前设备架构修改相应的镜像版本。当前可用的版本有: amd64:v0.3.3, arm64:v0.3.2, arm:v0.3.2. 更多gcr.io镜像请访问:https://console.cloud.google.com/gcr/images/google-containers/GLOBAL.

16. Alpine Linux安装程序的其他准备工作

为了设置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
1
2
3
4
5
6
7
8
9
10
11
12
13
14

然后通过添加以下内容来更新 /etc/update-extlinux.conf

default_kernel_opts="...  cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
1

然后更新配置并重新启动:

update-extlinux
reboot
1
2

重启后:

  • k3s下载到 /usr/local/bin/k3s
  • /etc/init.d中 创建一个openrc文件

17. 运行K3d(Docker中的K3)和docker-compose

k3d是一个实用程序,旨在轻松在Docker中运行K3S

可以通过MacOS上的brew工具安装它:

brew install k3d
1

rancher/k3s镜像也可用于从Docker运行K3s server和agent。

docker-compose.yml位于K3s repo的根目录中,K3s repo是如何从Docker运行K3s的示例。docker-compose从这个repo运行:

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
1
2
3
4
5
6
7
8
9

要仅在Docker中运行agent,请使用docker-compose up node

docker run也可以使用以下命令:

sudo docker run \
  -d --tmpfs /run \
  --tmpfs /var/run \
  -e K3S_URL=${SERVER_URL} \
  -e K3S_TOKEN=${NODE_TOKEN} \
  --privileged rancher/k3s:vX.Y.Z
1
2
3
4
5
6