部署 K3S

部署 K3S

最后修改于 2022-5-8 ⋅ 共 2.1k 字 ⋅ 5分钟 / #Tutorial / #Kubernetes, #Docker, #树莓派

使用 #

https://zhuanlan.zhihu.com/p/125499493
10 分钟部署一个 Kubernetes 集群

3.1 和使用k8s一样使用k3s命令工具
k3s内置了一个kubectl命令行工具,通过k3s kubectl调用,为了与k8s的kubectl命令一致,可以设置alias别名:

区别 #

Rancher Labs是业界领先的容器软件提供商,其旗舰产品Rancher是一款开源的企业级Kubernetes管理平台,极为出色地管理和安装Kubernetes集群。他们发布了一系列产品,构成他们的生态,例如,Longhorn是一个轻量级并且可靠的容器化分布式块存储解决方案,可用于Kubernetes中,并在近期被收纳入CNCF沙箱项目中。闲杂让我们回到这篇文章的主题,Rancher Labs也是k3s这款轻量级Kubernetes发行版的创建者。

k3s将安装Kubernetes所需的一切打包进仅有60MB大小的二进制文件中,并且完全实现了Kubernetes API。为了减少运行Kubernetes所需的内存,Rancher删除了很多不必要的驱动程序,并用附加组件对其进行替换。

k3s是一款完全通过CNCF认证的Kubernetes发行版,这意味着你可以编写YAML来对完整版的Kubernetes进行操作,并且它们也将适用于k3s集群。

由于它只需要极低的资源就可以运行,因此它能够在任何512MB RAM以上的设备上运行集群,换言之,我们可以让pod在master和节点上运行。

目的 #

路由器上?或者某个主机上:

  • portainer

替换虚拟机内系统为 k3os(先在 debian10 上尝试安装 k3s)/ alpine

并添加 portainer, 将 debian10 内的

  • nginx
  • guacamole
  • ddnsto或者在树莓派上?跟随硬盘)

&

raspberrypi

  • docker
    • home-assistant
  • LED 显示(未确定?)

部署在两个 k3s 上

实际操作 #

安装 alpine #

下载 alpine 的 iso 镜像,导入 Hyper-v。完成初始化后进入系统,根据命令行中的提示输入setup-alpine对系统设置、密码等进行配置。在 alpine 中,使用apk命令安装add、删除del、更新软件源update和升级upgrade

1
2
3
4
# 安装 nano
apk add nano curl
# 修改 ssh 设置
nano /etc/ssh/sshd_config

在文件中添加或替换Port 25678ListenAddress 0.0.0.0PermitRootLogin yes。保存修改后,输入service ssh restart重启 ssh 服务。

解决问题:配置 cgroup #

https://d-heinrich.medium.com/k3s-bootstrap-on-alpine-linux-c207c85c3f3d
https://docs.rancher.cn/docs/k3s/installation/installation-requirements/_index

之后如果运行kubectl get node,如果返回

1
The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?

说明未配置 cgroup。在/var/log/k3s.log日志中同时也可以查询到

1
level=warning msg="Failed to find cpuset cgroup, you may need to add \"cgroup_enable=cpuset\" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi)"

需要配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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
echo 'default_kernel_opts="...  cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"' >> /etc/update-extlinux.conf
update-extlinux
reboot

安装 k3s #

1
curl -sfL https://get.k3s.io | sh -

https://documentation.portainer.io/v2.0/deploy/ceinstallk8s/

通过kubectl get sc查找名字,运行

1
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

安装 dashboard #

  1. 方式一:通过 helm
    根据系统架构下载 helm,解压文件并放入系统。

    1
    2
    3
    4
    
    tar xf helm-v2.16.9-linux-amd64.tar.gz
    mv linux-amd64/helm /usr/local/bin/helm
    chmod +x /usr/local/bin/helm
    rm linux-amd64/ -r
    

    通过 helm 安装 kubernetes-dashboard

    1
    2
    
    helm repo add k8s-dashboard https://kubernetes.github.io/dashboard
    helm install my-kubernetes-dashboard k8s-dashboard/kubernetes-dashboard
    
  2. 方式二:直接安装 dashboard

    1
    
    kubectl apply -f https://github.com/kubernetes/dashboard/raw/master/aio/deploy/recommended.yaml
    

配置 dashboard #

https://rancher.com/docs/k3s/latest/en/installation/kube-dashboard/

创建dashboard.admin-user-role.ymldashboard.admin-user.yml并写入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# dashboard.admin-user-role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
    name: admin-user
roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

# dashboard.admin-user.yml
apiVersion: v1
kind: ServiceAccount
metadata:
    name: admin-user
    namespace: kubernetes-dashboard

运行

1
2
3
4
# 创建账户?
kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml
# 生成 token
kubectl -n kubernetes-dashboard describe secret admin-user-token | grep ^token

获取之后登录要用到的 token

1
eyJhbGciOiJSUzI1NiIsImtpZCI6InowUTBVdG45SFJLR2RGQTdNNE94ejQ2dlRjUHV2em1OQW1zZVNHRlo3TU0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXNrNHdqIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5ZDBkNDNkNC1kYWYwLTRkNjgtODY4Ni0yNzkwNDIwY2QxM2IiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.lfTrVERgtkimYWcPXVtUjmm-j7WmQ5bmhsghCcX2En9Ifmm5X5DBryTyBzoZKbQRTw_2sGhiBNds-udfuvzZyFmyi0X5GGGqtScjKZZZdDjDVhryg1UclWZ9MiNM-lpRcdMKChRNUFOPn2erUlMHeH5UUGvXNciqNSLXwn3ucM29kDKjgExwg8fUFFRTzGGlLEboP00q8ze-obQpHRMu9zpmd0XARuxvvAuKoSACVLQobSlWvSe4L7gV3zKQZwLDOilq3KxXJkACs6tZTWWtqu1M-2xpDtyHlsjNgiQR2g6bW2GyIoHBQdjmon9QiayEr8T7PfJ4k7vlZ3k0frig3w

修改面板启动参数

1
kubectl edit deployment/kubernetes-dashboard --namespace=kubernetes-dashboard

参数列表 https://github.com/kubernetes/dashboard/blob/master/docs/common/dashboard-arguments.md

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
      - args:
        - --auto-generate-certificates
        - --namespace=kubernetes-dashboard
        - --enable-skip-login
        - --tls-cert-file=/root/alpine10_server.crt
        - --tls-key-file=/root/alpine10_server.key

远端机器上开启端口

1
nohup kubectl proxy --address localhost --accept-hosts='^localhost$,^127\.0\.0\.1$,^\[::1\]$,^192\.168\.\d+\.\d+$' &

为了在其他机器上访问面板(面板默认只开放给 localhosthttps),我们需要使用 ssh 来对端口进行转发。首先我们要在远端机器上修改/etc/ssh/sshd_config中的配置。

1
2
AllowTcpForwarding yes
PermitOpen any

本地电脑上开启转发通道

1
ssh -L localhost:8001:localhost:8001 -p 25678 -NT root@alpine10

现在,我们可以在本地浏览器中打开并登录面板界面。输入前面获取到的 token 登录。

设置监控面板 prometheus + grafana #

node_export 负责收集主机的性能数据,由 prometheus 整理读取存储,交给 grafana 来绘制显示图表。
为了测试可用性,这里先在主机上而不是 k3s 上安装调试。

下载文件 #

打开 prometheus 下载页面,分别下载最新版本的 node_exporter-1.1.2.linux-amd64.tar.gz 和 prometheus-2.26.0.linux-amd64.tar.gz。

1
2
3
cd
wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-amd64.tar.gz

打开 grafana 下载页面,根据页面提示系统架构下载。

1
2
wget https://dl.grafana.com/oss/release/grafana-7.5.4.linux-amd64.tar.gz
tar -zxvf grafana-7.5.4.linux-amd64.tar.gz

解压缩所有文件

1
tar xf *.tar.gz

此外, grafana 还需要安装其他依赖。

1
2
3
4
# 查看所需库
ldd grafana-7.5.4.linux-amd64/bin/grafana-server
# 安装需要的 ld-linux-x86-64.so.2
sudo apk add libc6-compat

配置 node_export #

1
2
cd node_exporter-1.1.2.linux-amd64/
nohup ./node_exporter &

配置 prometheus #

1
2
cd ~/prometheus-2.26.0.linux-amd64/
nano prometheus.yml

注意: 将 prometheus 默认的 yml 配置中对于 node_export 的端口从 9090 修改为 9100。

1
2
3
4
5
6
7
8
9
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9100']

运行

1
nohup ./prometheus  --config.file=prometheus.yml &

配置 grafana #

启动 grafana

1
nohup ./grafana-server &

访问 http://alpine10:3000 登录监控面板,默认账户为 admin/admin。完成登录后,会要求修改默认密码。在侧边栏齿轮图标Configuration中选择Data Source,点击添加数据来源Add data source,选择Prometheus,在URL输入框中填入http://localhost:9090,点击Sava & Test
接下来开始选择合适的显示样式。在面板合集中选择合适的面板,这里为了测试先选择了 Node Exporter Full。点击监控面板侧边栏加号图标Create中的导入Import,填入1860或者该面板的网址,点击加载Load
Node Full
这个面板包含了主机的所有内容。

k3s 监控面板 #

完成测试安装后开始将一整套监控面板部署至 k3s 内。首先添加用于安装监控的命名空间。

1
kubectl create namespace monitoring