侧边栏壁纸
博主头像
银河小徐博主等级

A Good Boy ⛵️⛵️⛵️

  • 累计撰写 42 篇文章
  • 累计创建 39 个标签
  • 累计收到 12 条评论

目 录CONTENT

文章目录
K3s

K3s完整版离线部署

银河小徐
2022-03-31 / 0 评论 / 15 点赞 / 680 阅读 / 7,650 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

简介

K3s 是 Rancher 公司开发维护的一套 K8s 发行版。

其他介绍请参阅 官网文档 或百度查阅。我这里就不多啰嗦了。

架构 & 运行机制

我们在真正部署 K3s 之前,至少要简单了解下架构图,不然真是懵圈中的懵圈。

单服务集群架构图:

单服务集群架构图

HA高可用集群架构图:

HA高可用集群架构图

通过上面两张图,相信大家都可以看出,单服务集群模式只有一个控制节点(在 K3s 叫做 Server Node,相当于 K8s 的 Master Node),而且 K3s 的数据库存储使用 SQLite 并内置到了控制节点中;HA高可用模式则是扩展了 Server Node 变为 3 个,并且需要外接存储(ETCD、MySQL等),保证集群的高可用。

再来看 K3s 的运行机制:

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/ 即可访问页面如下:

traefik-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 中看到配置的规则已经生效了:

nginx-traefik-rule

同样需要在本机添加 Host 解析:152.136.181.95 nginx.traefik.example

然后浏览器访问 http://nginx.traefik.example:30024/test 会出现 404 页面说明 Nginx 应用服务搭建成功了。

nginx-traefik-404

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 会出现如下图所示,因为证书是自签的,所以访问不过去。

nginx-traefik-secret

其他

本地电脑访问集群

获取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

15

评论区