简介
K3s 是 Rancher 公司开发维护的一套 K8s 发行版。
其他介绍请参阅 官网文档 或百度查阅。我这里就不多啰嗦了。
架构 & 运行机制
我们在真正部署 K3s 之前,至少要简单了解下架构图,不然真是懵圈中的懵圈。
单服务集群架构图:
HA高可用集群架构图:
通过上面两张图,相信大家都可以看出,单服务集群模式只有一个控制节点(在 K3s 叫做 Server Node,相当于 K8s 的 Master Node),而且 K3s 的数据库存储使用 SQLite 并内置到了控制节点中;HA高可用模式则是扩展了 Server Node 变为 3 个,并且需要外接存储(ETCD、MySQL等),保证集群的高可用。
再来看 K3s 的运行机制:
从图中直观可以看出,所有的控制面板组件最终都以进程的方式运行在 Server Node 上,不再以静态 Pod 的形式。数据库使用的 SQLite ,也没有 ETCD 那么重了。而且容器运行时也由 Docker 改为 Containerd ,当然我们部署的时候依然可以选择我们熟悉的 Docker 方式。
部署安装(单服务集群)
HA高可用模式搭建教程下期给大家奉上!
版本信息
K3s版本:v1.22.7+k3s1
由于本人财力不够雄厚,就暂时用两台云主机做演示。
主机名 | IP地址 |
---|---|
master | 152.136.181.95 |
node1 | 154.38.98.34 |
主机设置
关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld
更改主机名:两台主机名称一定要不一致!!!
hostnamectl set-hostname k3s-master
hostnamectl set-hostname k3s-node1
安装 Master 节点
安装 Docker 引擎
yum install docker* -y
systemctl restart docker
systemctl enable docker
设置国内镜像加速
# 没有/etc/docker/daemon.json文件自己创建一下
vim /etc/docker/daemon.json
# 添加如下内容
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# 保存重启docker
systemctl daemon-reload
systemctl restart docker
下载 K3s 资源包
依赖包:wget http://rancher-mirror.cnrancher.com/k3s/v1.22.7-k3s1/k3s-airgap-images-amd64.tar
二进制文件:wget http://rancher-mirror.cnrancher.com/k3s/v1.22.7-k3s1/k3s
安装脚本:wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh
部署(Docker方式)
mkdir -p /var/lib/rancher/k3s/agent/images/
cp k3s /usr/local/bin
cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
docker load -i k3s-airgap-images-amd64.tar
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644 --tls-san 152.136.181.95 --docker --node-ip 152.136.181.95' ./k3s-install.sh
部署成功后可以利用 systemctl status k3s
命令查看运行状态,显示 Running 即可。
使用 kubectl get nodes
查看集群节点信息如下:
NAME STATUS ROLES AGE VERSION
k3s-master Ready control-plane,master 31h v1.22.7+k3s1
安装时的一些参数解释
- --datastore-endpoint value:指定 etcd、Mysql、Postgres 或 Sqlite(默认)数据源名称
- --docker:用docker代替containerd
- --no-deploy value:不需要部署的组件 (有效选项: coredns, servicelb, traefik, local-storage, metrics-server)
- --write-kubeconfig value:将管理客户端的kubeconfig写入这个文件
- --write-kubeconfig-mode value:用这种模式编写kubeconfig,例如:644
- --tls-san value:在 TLS 证书中添加其他主机名或 IP 作为主题备用名称
- --node-ip value:为节点发布的 IP 地址
- --node-taint value:用一组污点注册kubelet(默认情况下,k3s 启动 master 节点也同时具有 worker 角色,是可调度的,因此可以在它们上启动工作,可以采用此方式解决)
参数对应使用示例:
export INSTALL_K3S_EXEC="server --datastore-endpoint mysql://root:root@tcp(k3s-mysql-server:3306)/k3s \
--docker \
--no-deploy traefik \
--write-kubeconfig ~/.kube/config \
--write-kubeconfig-mode 644 \
--tls-san 152.136.181.95 \
--node-ip 152.136.181.95 \
--node-taint k3s-controlplane=true:NoExecute
更多参数参考:K3s Server 配置参考的 K3s Server CLI 帮助
加入 Node 节点
下载资源
二进制文件:wget http://rancher-mirror.cnrancher.com/k3s/v1.22.7-k3s1/k3s
安装脚本:wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh
部署
1、将二进制文件放到bin目录下:cp k3s /usr/local/bin/k3s
2、获取 Master 节点 Token:K3S_TOKEN 是 Server 端的,位于 /var/lib/rancher/k3s/server/node-token
下。
cat /var/lib/rancher/k3s/server/node-token
3、获取到 Node 节点 Token之后,执行以下命令进行部署:
export INSTALL_K3S_SKIP_DOWNLOAD=true
export K3S_TOKEN=K10691102f29acbf38997c0f663b05a8bdec2e84b2d219db36b7d25c02b6486b93c::server:a4120caa6bc3be7d656c0aa22080a973
export K3S_URL=https://152.136.181.95:6443
INSTALL_K3S_EXEC='--docker --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 644' ./k3s-install.sh
4、查看 Node 节点状态:systemctl status k3s-agent -l
验证启动成功后,回到 Master 节点主机上执行 kubectl get nodes
,可以看到如下信息:
NAME STATUS ROLES AGE VERSION
k3s-master Ready control-plane,master 31h v1.22.7+k3s1
k3s-node1 Ready <none> 16s v1.22.7+k3s1
Traefik Dashborad
Traefik 是一个开源的边缘路由器,可以让你的服务发布变得轻松有趣。它负责接收你的系统请求,并使用合适的组件处理这些请求。
默认情况下,K3s 1.21 及更高版本默认安装 Traefik v2。出于安全考虑,默认是不公开 Traefik Dashboard 的,所以需要我们手动开启。
启用
我们利用创建 IngressRoute CRD
来启动Dahsboard。
在 Master 节点上创建 tradefik-dashaboard.yaml ,内容如下:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: dashboard
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.example`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
kind: Rule
services:
- name: api@internal
kind: TraefikService
执行 kubectl apply -f tradefik-dashaboard.yaml
执行完之后可以利用 kubectl get IngressRoute -A
查看到我们刚刚建立的 IngressRoute 如下:
NAMESPACE NAME AGE
kube-system traefik-dashboard 46h
default dashboard 45h
那么安装完之后我们如何访问呢?
我们首先在自己的电脑中加入 Host 解析:152.136.181.95 traefik.example
然后 Master 节点获取一下 Traefik 的 Svc NodePort 端口:
kubectl get svc -A | grep traefik
得到内容如下:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-system traefik LoadBalancer 10.43.20.131 152.136.181.95 80:30024/TCP,443:32309/TCP 46h
30024 即为我们想要的 NodePort端口。
然后我们在电脑浏览器通过地址 http://traefik.example:30024/dashboard/
即可访问页面如下:
这里访问的时候一定要注意 dashboard 后面一定要加 / ,不加访问不了哦,我就遇到了这个坑。
Traefik IngressRoute资源配置玩法
这里使用一个简单的 Nginx 应用来做展示。
nginx-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
resources:
requests:
cpu: 0.1
memory: 200Mi
limits:
cpu: 0.3
memory: 500Mi
执行 kubectl apply -f nginx-deployment.yaml
nginx-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-test
namespace: default
labels:
app: nginx-test
spec:
type: ClusterIP
selector:
app: nginx-test
ports:
- name: web
port: 8011
targetPort: http
执行 kubectl apply -f nginx-service.yaml
nginx-ingressroute.yaml:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-test
namespace: default
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`nginx.traefik.example`) && PathPrefix(`/test`)
services:
- name: nginx-test # kubernetes中的service对应的名称
kind: Service # kubernetes中的service
port: 8011
namespace: default # kubernetes中的service对应的名称空间。
执行 kubectl apply -f nginx-ingressroute.yaml
全部 Yaml 执行完毕之后,我们可以在 Traefik Dashboard 中看到配置的规则已经生效了:
同样需要在本机添加 Host 解析:152.136.181.95 nginx.traefik.example
然后浏览器访问 http://nginx.traefik.example:30024/test
会出现 404 页面说明 Nginx 应用服务搭建成功了。
Https 配置
使用openssl生成自签名证书:
# 要注意证书文件名称必须是 tls.crt 和 tls.key
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginx.traefik.example"
集群添加证书:
kubectl create secret -n default tls nginx-tls --cert=tls.crt --key=tls.key
修改之前的 nginx-ingressroute.yaml:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-test
namespace: default
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`nginx.traefik.example`) && PathPrefix(`/test`)
services:
- name: nginx-test # kubernetes中的service对应的名称
kind: Service # kubernetes中的service
port: 8011
namespace: default # kubernetes中的service对应的名称空间。
tls:
secretName: nginx-tls
重新 apply 一下 yaml。
然后页面访问 https://nginx.traefik.example:30024/test
会出现如下图所示,因为证书是自签的,所以访问不过去。
其他
本地电脑访问集群
获取Master节点kubeconfig文件:cat /etc/rancher/k3s/k3s.yaml
修改 kubeconfig 文件的 IP 地址内容来达到远程访问管理集群的目的。
server: https://152.136.181.95:6443
本地使用举例如下:
kubectl --kubeconfig=/Users/xiaoxuxuy/Desktop/VmWork/Kubernetes/kubeconfig/k3s.yaml get nodes
Master 节点 安装 Helm
wget http://rancher-mirror.cnrancher.com/helm/v3.8.1/helm-v3.8.1-linux-amd64.tar.gz
tar -zxvf helm-v3.8.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version
Master 节点 安装 Rancher
# 在宿主机上创建Rancher的挂载目录:
mkdir -p /docker_volume/rancher_home/rancher
mkdir -p /docker_volume/rancher_home/auditlog
# 运行Rancher
docker run --privileged -d -v /docker_volume/rancher_home/rancher:/var/lib/rancher -v /docker_volume/rancher_home/auditlog:/var/log/auditlog --restart=unless-stopped --name rancher -p 8080:80 -p 9443:443 rancher/rancher:v2.6-head
访问:http://{公网IP}:9443
卸载 K3s
# 要从 server 节点卸载 K3s,请运行:
sudo /usr/local/bin/k3s-uninstall.sh
# 要从 agent 节点卸载 K3s,请运行:
sudo /usr/local/bin/k3s-agent-uninstall.sh
# 删除文件目录
sudo rm -rf /var/lib/rancher/
清理 Docker
# 清理未使用镜像
docker image prune -a -f
# 清理未使用容器
docker container prune -f
# 查看容器占用
docker stats --no-stream
Node 污点操作
# 查看节点是否存在污点
kubectl describe nodes 节点 | grep -5 Tain
# 添加污点
kubectl taint nodes k3s-master k3s-controlplane=true:NoExecute
# 删除污点
kubectl taint nodes k3s-master k3s-controlplane-
污点解释:
NoSchedule: 不调度 PreferNoSchedule: 尽量不调度 NoExecute: 不调度并且立即驱逐节点上现存Pod
评论区