使用
#
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和节点上运行。
目的
#
路由器上?或者某个主机上:
替换虚拟机内系统为 k3os(先在 debian10 上尝试安装 k3s)/ alpine
并添加 portainer, 将 debian10 内的
- nginx
- guacamole
- ddnsto(
或者在树莓派上?跟随硬盘)
&
raspberrypi
部署在两个 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 25678
、ListenAddress 0.0.0.0
和PermitRootLogin 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
#
方式一:通过 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
|
方式二:直接安装 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.yml
和dashboard.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+$' &
|
为了在其他机器上访问面板(面板默认只开放给 localhost
和 https
),我们需要使用 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
|
解压缩所有文件
此外, 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
。

这个面板包含了主机的所有内容。
k3s 监控面板
#
完成测试安装后开始将一整套监控面板部署至 k3s 内。首先添加用于安装监控的命名空间。
1
| kubectl create namespace monitoring
|
时空乱流记录