K3S 的安装部署,以及组件的简单介绍

安装部署

k3s安装本质上是生成 /etc/systemd/system/k3s.service文件,用户只在主机上运行k3s的单个二进制文件即完成该节点的所有部署工作。

通过官方提供的k3s_install.sh脚本,能够快速完成部署:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 下载二进制的k3s文件,保存到/usr/local/bin
chmod +x /usr/local/bin/k3s

# 部署Server节点:
K3S_TOKEN=<token> \
INSTALL_K3S_SKIP_DOWNLOAD=true \
INSTALL_K3S_EXEC="server --advertise-address <vip> --tls-san xx.xx.xx.xx" \
./k3s_install.sh

# 添加Agent节点:
K3S_TOKEN=<token> \
K3S_URL=https://<vip>:6443 \
K3S_NODE_NAME=nd-node \
INSTALL_K3S_EXEC="agent" \
INSTALL_K3S_SKIP_DOWNLOAD=true \
./k3s_install.sh 

安装部署参数:

以下是Master节点的启动配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server \

组件介绍

截至到1.20版本,k3s包含以下服务:

通过Addon机制部署了以下服务:

通过Helm部署了以下服务:

其他服务:

  • Kube-router:在官方文档明确提到了,但是却没有找到相关的说明

部署应用

K3S支持AddOnHelmChart两种额外的方式来部署应用:

1. AddOn

AddOn 模式下用户可以将Yaml文件保存到Server节点的 /var/lib/rancher/k3s/server/manifests/ 目录,K3S会自动apply这个文件。

1
2
3
4
# 查看集群内的AddOn资源
kubectl get addon -A
# 删除对应AddOn,但是不会删除文件和创建的资源
kubectl -n <ns> delete addon <name>

AddOn功能类似k8s的静态Pod(PS:k3s也支持静态Pod对应的目录是/var/lib/rancher/k3s/agent/pod-manifests/),有以下区别:

  • 支持任意类型的资源
  • 只能创建不会删除资源(即使删掉addon对应的CRD)

2. HelmChart

HelmChart是k3s自定义一个CRD,可以和AddOn配合使用实现自动部署Helm包,部署/更新/删除HelmChart会同步部署/更新/删除相应的Helm实例。

安装k3s附带的Traefik就是通过HelmChart+AddOn方式部署的,其中HelmChart文件如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
   # 从本地获取chart压缩包,对应存放路径为 /var/lib/rancher/k3s/server/static/charts/traefik-1.81.0.tgz
  chart: https://%{KUBERNETES_API}%/static/charts/traefik-1.81.0.tgz
   # valuesContent内容会覆盖helm的values.xml
  valuesContent: |-
    rbac:
      enabled: true
    ssl:
      enabled: true
    metrics:
      prometheus:
        enabled: true
    kubernetes:
      ingressEndpoint:
        useDefaultPublishedService: true
    priorityClassName: "system-cluster-critical"
    image: "rancher/library-traefik"
    tolerations:
      - key: "CriticalAddonsOnly"
        operator: "Exists"
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"    

HelmChart相关内容可以参考:https://docs.rancher.cn/docs/k3s/helm/_index/

HelmChartConfig可以覆盖HelmChart的配置

Service LB

K3S集成了一个非常简易的klipper-lb,该工具基于iptables工作。

  • Service LB 控制器会监听LoadBalancer请求 ,并为每一个Service创建一个DS

  • 对于每一个Service LB在所有节点上都有一个代理Pod,代理Pod运行在容器网络空间,仅仅只是一个BusyBox容器,作用是通过iptables将流量转发实际负载

  • Service LB 控制器会检查所有主机端口,如果Service中使用的端口号在某台主机上是空闲的,那么Service LB 会为改主机创建对应规则,将流量转发到代理容器,并且将该主机的IP作为Service LB的EXTERNAL-IP

  • 如果没有端口空闲的主机,Service LB状态会变为Pending

  • svccontroller.k3s.cattle.io/enablelb标签可以使主机成为备选LB节点

疑问:

  • 为啥要有代理Pod,直接转发到负载Pod上不就行了?