相关参考文档:https://docs.rancher.cn/k3s/
1 安装要求
1.1 先决条件
- 两个节点不能有相同的主机名
ps.:可通过以下命令查看主机名:
hostname
- 如果您的所有节点都有相同的主机名,请使用
--with-node-id
选项为每个节点添加一个随机后缀,或者为您添加到集群的每个节点设计一个独特的名称,用--node-name
或$K3S_NODE_NAME
传递。
1.2 操作系统
绝大多数现代Linux系统
1.3 硬件
硬件要求根据您部署的规模而变化。这里列出了最低建议。
- 内存:最低512MB (建议至少为1GB)
- CPU:最低1个
ps.:可通过以下命令查看系统CPU个数和内存
#查看CPU个数
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l
#查看内存
cat /proc/meminfo
1.4 磁盘
K3s 的性能取决于数据库的性能。为了确保最佳速度,我们建议尽可能使用 SSD。在使用 SD 卡或 eMMC 的 ARM 设备上,磁盘性能会有所不同。
ps.:可通过以下命令查看磁盘类型
# vda是你的磁盘名,可以通过df命令查看,然后修改成对应的信息
cat /sys/block/vda/queue/rotational
返回结果:
返回 0 SSD盘
返回 1 SATA盘
1.5 网络
K3s server 需要 6443 端口才能被所有节点访问。
当使用 Flannel VXLAN 时,节点需要能够通过 UDP 端口 8472 访问其他节点。节点不应该在其他端口上监听。K3s 使用反向隧道,这样节点与服务器建立出站连接,所有的 kubelet 流量都通过该隧道运行。然而,如果你不使用 Flannel 并提供自己的自定义 CNI,那么 K3s 就不需要 8472 端口。
如果要使用metrics server,则需要在每个节点上打开端口 10250 端口。
如果计划使用嵌入式 etcd 实现高可用性,则 server 节点必须在端口 2379 和 2380 上可以相互访问。
重要: 节点上的 VXLAN 端口不应暴露给全世界,因为它公开了集群网络,任何人都可以访问它。应在禁止访问端口 8472 的防火墙/安全组后面运行节点。
K3s Server节点的入站规则:
协议 | 端口 | 源 | 描述 |
---|---|---|---|
TCP | 6443 | K3s agent 节点 | Kubernetes API Server |
UDP | 8472 | K3s server 和 agent 节点 | 仅对 Flannel VXLAN 需要 |
TCP | 10250 | K3s server 和 agent 节点 | Kubelet metrics |
TCP | 2379-2380 | K3s server 节点 | 只有嵌入式 etcd 高可用才需要 |
1.6 防火墙
master 服务器和 worker 服务器的防火墙都需要关闭,具体操作如下:
1.6.1 检查防火墙状态(以 CentOS Linux release 7.7.1908 (Core) 为例)
sudo firewall-cmd --state
sudo systemctl status firewalld.service
1.6.2 关闭防火墙服务
sudo systemctl stop firewalld.service
1.6.3 关闭防火墙自动启动服务
sudo systemctl disable firewalld.service
1.6.4 检查防火墙是否关闭
sudo systemctl status firewalld.service
1.7 安装iptable
服务器通常不携带 iptable 服务,因此需要执行以下命令安装 iptable:
yum -y install iptable
2 Docker安装
2.1 初步安装
Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上
查看当前版本:
uname -an
下载安装docker:
yum -y install docker
启动docker服务:
service docker start
检查docker是否安装成功
docker version
2.2 配置镜像网站
进入 /etc/docker,没有daemon.json文件就自己新建一个:
cd /etc/docker
编辑daemon.json文件:
加入这段代码:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
然后重启docker
systemctl restart docker.service
2.3 更新 Docker 版本
使用以下命令升级 Docker 到最新版本:
curl -fsSL https://get.docker.com/ | sh
systemctl restart docker.service
3 K3s安装
ps.:安装方式为通过脚本安装,如需使用其他安装方式请参阅官方文档
3.1 K3s server 安装
3.1.1 安装脚本
K3s 提供了一个安装脚本,可以方便的在 systemd 和 openrc 的系统上将其作为服务安装。这个脚本可以在 https://get.k3s.io 获得。要使用这种方法安装K3s,只需要运行:
curl -sfL https://get.k3s.io | sh -
ps.:中国境内用户,可以使用以下方法加速安装:
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=ch sh -s - --docker
ps.:每台计算机必须具有唯一的主机名。如果不存在唯一的主机名,请添加 K3S_NODE_NAME
环境变量,并为每一个节点提供一个有效且唯一的主机名。
ps.:若采用步骤 3.1.1的命令,可直接跳转到步骤 3.1.4;若采用官方文档的命令,则需要执行步骤 3.1.2及 3.1.3
3.1.2 修改配置
修改配置文件,具体修改要求如下:
- 把默认的容器引擎由 Containerd 切换到 Docker;
- 修改配置文件权限,使执行 kubectl 命令不需要root权限。
具体修改命令如下:
sudo vim /etc/systemd/system/multi-user.target.wants/k3s.service
修改文件中的 ExecStart的值,修改为:
ExecStart=/usr/local/bin/k3s \
server \
'--docker' \
3.1.3 重启服务
通过以下命令重启服务:
sudo systemctl daemon-reload
sudo systemctl restart k3s
3.1.4 检查 server 节点是否启动正常
通过以下命令检查节点是否正常启动:
sudo kubectl get nodes -o wide
如下输出对应的 control-plane,master 节点,表明 server 节点正常启动,注意到最后一个容器类型属性已经修改成了docker:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
izwz995sygwab19zrn726wz Ready control-plane,master 109m v1.20.4+k3s1 172.31.13.60 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://20.10.5
ps.:如果显示权限不够,可以通过更改/etc/rancher/k3s/k3s.yaml
文件的权限解决
sudo chmod 777 /etc/rancher/k3s/k3s.yaml
3.1.5 配置环境变量,为后续helm安装打基础
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
3.1.6 卸载server节点的k3s(如有需要)
/usr/local/bin/k3s-uninstall.sh
3.2 K3s agent 安装
3.2.1 安装脚本
与 server 安装相似,工作节点上的 K3s 安装同样是从 https://get.k3s.io 上获得脚本。但在安装过程中,需要使用 K3S_URL 和 K3S_TOKEN 环境变量来运行安装脚本。这样可以在脚本安装的过程中,将工作节点之间注册添加到 K3s 集群当中。:
在 server 节点(master 节点)执行如下命令:注意从服务器的k3s.yaml
的文件中获取端口号
echo /usr/local/bin/k3s agent --server https://172.31.13.60:6443 --token `sudo cat /var/lib/rancher/k3s/server/node-token`
获取输出结果,此结果即为token的值:
/usr/local/bin/k3s agent --server https://172.31.13.60:6443 --token K10fcbce86112a339eb83da520a2111b2f5c64659dc5467afa53498fb85c71be658::server:6ea0462849af2b81a0dee13c7ca664e4
agent上的k3s安装命令
# K3S_URL 是 K3S server 或 K3s 集群的IP地址及端口号
# K3S_TOKEN 是用于 server 或 agent 加入集群的共享 secret,通常被存储在 K3s server 服务器节点上的 /var/lib/rancher/k3s/server/nod-token 文件中
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -s - --docker
ps.:每台计算机必须具有唯一的主机名。如果不存在唯一的主机名,请添加 K3S_NODE_NAME
环境变量,并为每一个节点提供一个有效且唯一的主机名。
ps.:若采用步骤 3.2.1的命令,可直接跳转到步骤 3.2.3;若采用官方文档的命令,则需要执行步骤 3.2.2
3.2.2 修改配置,重启服务
进入agent服务配置文件
sudo vim /etc/systemd/system/multi-user.target.wants/k3s-agent.service
将配置文件中 ExecStart 的值修改为:
ExecStart=/usr/local/bin/k3s \
agent \
'--docker' \
修改保存后执行以下命令重启K3s:
sudo systemctl daemon-reload
sudo systemctl restart k3s-agent
3.2.3 修改 k3s.yaml 文件
使用 scp 命令,将 master 服务器上的 /etc/rancher/k3s/k3s.yaml
文件发送到 worker 服务器上的对应位置,并通过 vi 命令修改文件中的 server 地址为 master 服务器IP。
修改完成后,执行以下命令重启 K3s agent 服务器:
sudo systemctl daemon-reload
sudo systemctl restart k3s-agent
3.2.3 检查 agent 节点是否启动正常
在 server 节点(maser 节点)执行以下命令,查看 agent 节点是否正常启动:
sudo kubectl get node -o wide
如下输出对应 worker 节点表明正常启动:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
izwz995sygwab19zrn726wz Ready control-plane,master 127m v1.20.4+k3s1 172.31.13.60 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://20.10.5
izwz9fa0nvt6vfrz8ncbouz Ready worker 110m v1.20.4+k3s1 172.31.13.61 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://20.10.5
worker的默认角色为none
,需要执行以下命令更改为worker
,${node}
改为自己node的名称
kubectl label node ${node} node-role.kubernetes.io/worker=worker
3.2.4 卸载agent上的k3s(如有需要)
/usr/local/bin/k3s-agent-uninstall.sh
4 Dashboard 相关
4.1 在所有节点下载好docker镜像
标准yaml文件下载地址
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yam
此dashboard.yaml内容如下(只有一处需要更改,就是将kubernetes-dashboard
这个service,增加一个Nodeport,本例为31001):
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: v1
kind: Namespace
metadata:
name: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 31001
selector:
k8s-app: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
type: Opaque
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-csrf
namespace: kubernetes-dashboard
type: Opaque
data:
csrf: ""
---
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-key-holder
namespace: kubernetes-dashboard
type: Opaque
---
kind: ConfigMap
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
rules:
# Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
verbs: ["get", "update", "delete"]
# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["kubernetes-dashboard-settings"]
verbs: ["get", "update"]
# Allow Dashboard to get metrics.
- apiGroups: [""]
resources: ["services"]
resourceNames: ["heapster", "dashboard-metrics-scraper"]
verbs: ["proxy"]
- apiGroups: [""]
resources: ["services/proxy"]
resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
verbs: ["get"]
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
rules:
# Allow Metrics Scraper to get metrics from the Metrics server
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubernetes-dashboard
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0
imagePullPolicy: Always
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
livenessProbe:
httpGet:
scheme: HTTPS
path: /
port: 8443
initialDelaySeconds: 30
timeoutSeconds: 30
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: kubernetes-dashboard-certs
- name: tmp-volume
emptyDir: {}
serviceAccountName: kubernetes-dashboard
nodeSelector:
"kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
ports:
- port: 8000
targetPort: 8000
selector:
k8s-app: dashboard-metrics-scraper
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: dashboard-metrics-scraper
name: dashboard-metrics-scraper
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: dashboard-metrics-scraper
template:
metadata:
labels:
k8s-app: dashboard-metrics-scraper
annotations:
seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
spec:
containers:
- name: dashboard-metrics-scraper
image: kubernetesui/metrics-scraper:v1.0.4
ports:
- containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
serviceAccountName: kubernetes-dashboard
nodeSelector:
"kubernetes.io/os": linux
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
volumes:
- name: tmp-volume
emptyDir: {}
2,上面的rbac的serviceaccount
是没有什么权限的,为了能管理整个k8s集群,加入一个cluster admin
的角色,dashborad-admin-rabc.yaml内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
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
4.2 在master节点应用yaml文件
kubectl apply -f dashboard.yaml
kubectl apply -f dashborad-admin-rabc.yaml
4.3 获取访问的token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
4.4 通过web访问dashbaord
访问https://172.31.13.60:31001/#/login
输入得到的TOKEN
出现以上界面即表示部署dashboard成功
5 相关检测
5.1 网络检测
5.1.1 检测
在根目录下建立 busybox.yaml 文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28.4
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
在命令行执行以下命令,创建名为 busybox 的 pod 容器:
kubectl apply -f busybox.yaml
在命令行依次执行以下命令,获取 K3s 集群中的全部 pod 容器信息和全部 service 服务信息:
#获取全部 pod 容器详细信息
kubectl get pod -A -o wide
#获取全部 service 服务详细信息
kubectl get svc -A -o wide
在命令行执行以下命令,进入 busybox 容器,或在 dashboard 控制台进入 busybox 容器的命令行界面:
kubectl exec -it busybox -- sh
在 busybox 容器的命令行界面,依次使用 ping
命令,测试 busybox 容器与其他容器、服务、节点的 ip地址,务必保证全部都可以联通(ping 通)
5.1.2 问题与解决方案
问题:
pod ping pod 或 pod ping service无响应:K3s 网络服务插件不完整。
解决:
安装ipvs 请参考
https://blog.csdn.net/ShaoFuQiJie/article/details/80426402
修改master节点的service文件
sudo vim /etc/systemd/system/multi-user.target.wants/k3s.service
加入以下参数
修改worker节点的service文件
sudo vim /etc/systemd/system/multi-user.target.wants/k3s-agent.service
同理加入上述参数
重启k3s集群。
Master 节点:
sudo systemctl daemon-reload
sudo systemctl restart k3s
worker 节点:
sudo systemctl daemon-reload
sudo systemctl restart k3s-agent