环境搭建

  1. 快速搭建k3s环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 关闭防火墙
    systemctl disable firewalld --now

    # 下载 k3s 安装脚本:
    curl -sfL https://get.k3s.io -o install.sh

    # 运行安装脚本:
    sudo sh install.sh

    # 等待安装完成后,通过以下命令检查 k3s 是否已成功安装:
    sudo systemctl status k3s

    # 若要将当前用户添加到 Kubernetes 集群的 kubeconfig 文件中,以便能够使用 kubectl 命令行工具连接到集群,运行以下命令:
    sudo cat /etc/rancher/k3s/k3s.yaml >> ~/.kube/config

    # 确认是否已成功添加到 kubeconfig 文件中,运行以下命令:
    kubectl get nodes
  2. 将其他节点加入到kubernetes集群中

    1
    2
    3
    4
    5
    # 查看 Kubernetes 集群主节点的 token 
    cat /var/lib/rancher/k3s/server/node-token

    # 当前节点加入到主节点的集群中
    sudo k3s agent --server https://<MASTER_IP>:6443 --token <NODE_TOKEN>

创建好部署文件

项目分为三个部分:master(主体), account(账户系统),rabbitmq(消息队列)
以account为例,创建account-deploy.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息
labels: # 标签
app: account-deploy # 具体的 key: value 配置形式
name: account-deploy # deployment 的名字
namespace: disk # 所在的命名空间
spec:
replicas: 1 # 期望副本数
revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数
selector: # 选择器,用于找到匹配的 RS
matchLabels: # 按照标签匹配
app: account-deploy # 匹配的标签key/value
strategy: # 更新策略
rollingUpdate: # 滚动更新配置
maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
type: RollingUpdate # 更新类型,采用滚动更新
template: # pod 模板
metadata: # pod 的元信息
labels: # pod 的标签
app: account-deploy
spec: # pod 期望信息
containers:
- image: jiapengcheng/disk-account-image:v3-amd64 # 镜像
imagePullPolicy: IfNotPresent # 拉取策略
name: account # 容器名称
resources:
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
ports:
- containerPort: 18081
restartPolicy: Always # 重启策略
terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间

主要信息:容器端口18081,限制使用资源
创建account-service.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
name: account-svc
labels:
app: account-svc
namespace: disk # 所在的命名空间
spec:
ports:
- name: http # service 端口配置的名称
protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCP
port: 18081 # service 自己的端口
targetPort: 18081 # 目标 pod 的端口
selector: # 选中当前 service 匹配哪些 pod,对哪些 pod 的东西流量进行代理
app: account-deploy
type: NodePort

主要信息,service端口18081与目标pod端口做映射,并且选择器选择匹配account-deploy。
因为是部署阶段,可以暂时先用NodePort服务类型作为调试,测试account服务是否可用。

最终看到我们所有的endpoints跟pod都做到一一对应基本已经没什大问题了。
图一
最后检查一下各个接口调用
图二

部署过程遇到的坑

  1. 如果是一台机器,机器一定要有足够的剩余磁盘空间,部署时注意配置的内存限制。(否则master要是有磁盘或者内存压力就会自动产生污点无法调度,这种污点去除不掉,采用pod配置容忍依旧会因磁盘或者内存原因导致部署失败)所以建议两台虚拟机。
  2. 注意镜像打包时 —platform linux/amd64 指定镜像平台,不然也会因平台不一致导致container crash。
  3. 及时检查coreDNS pod的状态,否则就会出现容器内dns解析失败的问题,导致pod内连接我的mysql服务连接不上 pod内dns解析失败问题