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部署了以下服务:
其他服务:
部署应用
K3S支持AddOn和HelmChart两种额外的方式来部署应用:
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上不就行了?