本文参考了 极客网(GeekHours-Kubernetes) 的笔记, 配置环境采用 macOS Sequoia + m3 (Silicone) 如果电脑配置不同, 建议参考上述网址进行下载配置

环境配置及基本原理讲解

单节点 k8s 环境部署

1
2
brew install minikube
minikube start

多节点 k8s 环境部署

在单物理机上部署多个节点, 要么采用 docker 容器思路, 要么采用 虚拟机思路, 由于 kubernetes 本身并不是 docker 衍生品, 这里采用 虚拟机思路来实现 (想要利用 docker 实现的可以参考 kind 项目), 但是我们配置的虚拟机目的也应该是达到类似容器的轻量级, 命令行访问环境的条件即可, 因此我们采用 multipass 项目和 k3s 项目进行配置

multipass 轻量级虚拟机

这是由 Canonical 公司 (Ubuntu 母公司) 开发的一个项目, 支持通过命令行设置来进行控制虚拟机的配置和 vm 集群状态查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 下载这个指令
brew install multipass

# 注册虚拟机 (launch)
# 配置: 2 核 cpu, 4G 运行内存, 10G 硬盘空间
# network 为自动桥接主机网络, en0 为主要网卡, 在宿主机上通过 ifconfig 查看
multipass launch --name name_of_vm --cpus 2 --memory 4G --disk 10G --network en0

# 访问创建虚拟机的终端
multipass shell name_of_vm

# 在宿主机直接在虚拟机内执行一个指令 (此处以 ls -l 为例)
multipass exec name_of_vm -- ls -l

# 展示宿主机上所有的 multipass 注册的虚拟机信息, 包括 ip 分配的地址
multipass list

# 打开/关闭/删除虚拟机
multipass start name_of_vm
multipass stop name_of_vm
multipass delete name_of_vm

k3s 边缘环境小型集群实现 k8s 部署

k3s 是由 Rancher Lab 开发的一个轻量级 k8s 发行版, 主要目的是在受限的硬件资源中 (也叫 边缘环境, 例如 rasperberry-Pi) 实现 kubernetes 的部署, 往往部署的集群范围规模比较小

1
2
3
4
# 下载指令, 这一步执行在 master 机器上
curl -sfL https://get.k3s.io | sh -
# 下载验证
sudo kubectl get nodes

接下来需要在这个master节点上获取一个token, 用来作为创建worker节点时的一个认证凭证, 它保存在/var/lib/rancher/k3s/server/node-token这个文件里面, 我们可以使用sudo cat命令来查看一下这个文件中的内容,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 首先查看这个 token 是否存在且合理
# 输出应该形如 K10c02121fd...e4c6349::server:6f6a02ce8bc766552b694abb9397db07
sudo cat /var/lib/rancher/k3s/server/node-token
# 将内容保存到局部变量 (只会存在于当前 process-arena 内)
TOKEN=$(multipass exec k3s sudo cat /var/lib/rancher/k3s/server/node-token)
# 将 master node 的 ip 存储进来
# 校对方法是 echo $MASTER_IP 然后对比输出和进入 master 之后查看 ifconfig
MASTER_IP=$(multipass info k3s | grep IPv4 | awk '{print $2}')

# 创建两个虚拟机
multipass launch --name worker1 --cpus 2 --memory 8G --disk 10G
multipass launch --name worker2 --cpus 2 --memory 8G --disk 10G

# worker 机上安装 k3s 环境
# 这一步会用到上述的 MASTER_IP 和 TOKEN 的值, 确保提前完成了
for f in 1 2; do
multipass exec worker$f -- bash -c "curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=\"https://$MASTER_IP:6443\" K3S_TOKEN=\"$TOKEN\" sh -"
done

至此单 master + 2 worker nodes 部署完成

如果想在宿主机上查询是否部署成功, 可以执行以下指令:

1
2
3
4
5
6
multipass exec master -- sudo cat /etc/rancher/k3s/k3s.yaml > kubeconfig.yaml
# 更改本地的 kubeconfig.yaml 文件, 确保 server 键的值为本地以太网内对应虚拟机的 ip 地址, 由于复制出来得到的是指向 master 自身的 127.0.0.1 地址, 必须先改成形如 192.168.x.x 的地址再进行后续验证操作
# 下列步骤是读取生成的 k8s 配置来在宿主机生成对应的网络配置读取
export KUBECONFIG=$(pwd)/kubeconfig.yaml
kubectl get nodes
# 这里应该输出 3 行, 分别对应三个机器的信息

上述指令的执行目的大概是, 首先将 k3s 集群本身生成的 kubeconfig 拷贝到本地, 然后让 kubectl 去读它

helm k8s 包管理器

这个命令行工具能方便地管理 k8s 指令

1
brew install helm

helm 作为包管理器, 常常需要从网络上 add 一些网络源并且接着 update 到本地 helm 环境中, 然后下载到本地 (相当于部署好了)

1
2
3
4
helm repo add pfisterer-hadoop https://pfisterer.github.io/apache-hadoop-helm/

helm repo update
helm install my-hadoop pfisterer-hadoop/hadoop --namespace your_ns

配置 Chaos-Mesh 环境

使用 helm 辅助环境配置

第 1 步: 添加 Chaos Mesh 仓库

在 Helm 仓库中添加 Chaos Mesh 仓库:

1
helm repo add chaos-mesh https://charts.chaos-mesh.org

第 2 步: 查看可以安装的 Chaos Mesh 版本

执行如下命令显示可以安装的 charts:

1
helm search repo chaos-mesh

注意

上述命令会输出最新发布的 chart, 如需安装历史版本, 请执行如下命令查看所有的版本:

1
helm search repo chaos-mesh -l

在上述命令完成后, 接下来开始安装 Chaos Mesh;

第 3 步: 创建安装 Chaos Mesh 的命名空间

推荐将 Chaos Mesh 安装在 chaos-mesh 命名空间下, 也可以指定任意命名空间安装 Chaos Mesh:

1
kubectl create ns chaos-mesh

第 4 步: 在 k3s 环境下安装

1
helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-mesh --set chaosDaemon.runtime=containerd --set chaosDaemon.socketPath=/run/k3s/containerd/containerd.sock --version 2.7.2

验证安装

1
2
3
4
5
kubectl get pods -n chaos-mesh -l app.kubernetes.io/instance=chaos-mesh
# 预期输出大致如下
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-7b8c86cc9-44dzf 1/1 Running 0 17m
... # 会有很多行类似风格

使用 Chaos-Mesh 注入失效代码 (Pod-Failure)

此部分参考了官网上的信息

yaml 配置文件的写入

首先明确 yaml 文件在这里相当于是用新的 k8s 配置数据来更新网络, 更新 yaml 之后采用 kubectl apply -f cfg.yaml 来应用配置更新

这里的测试配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-failure-example
namespace: chaos-mesh
spec:
action: pod-failure # 可以改成 pod-kill 或者 container-kill 指令
mode: one # 只对一个 pod/container 生效
duration: '30s'
selector:
namespaces:
- chaos-mesh
labelSelectors:
'app.kubernetes.io/component': 'controller-manager'

如果部署成功, 会显示以下文字:

1
podchaos.chaos-mesh.org/pod-failure-example created

然后等待 30 s 之后 (即过了 duration 设定的时间之后) 再读取 k8s 下的 pod 集群数据, 得到部分主机重启 (RESTART)

1
2
3
4
5
kubectl get pods -n chaos-mesh
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-6cfd6765c5-cjnjw 1/1 Running 0 28m
chaos-controller-manager-6cfd6765c5-l94g5 1/1 Running 2 (3m15s ago) 28m
...

这就说明在官方给的 chaos 注入环境下试验成功

Troubleshoot

如果在 apply 一步执行之后会出现问题 ERROR from server (Forbidden)...admission webhook "vpodchaos.kb.io" denied the request: Cannot update chaos spec ... 就有可能是配置更新起冲突了, 应当先删除对应的配置环境然后重新 apply

1
kubectl -n chaos-mesh delete podchaos pod-failure-example

如果出现 STATUS==ImagePullBackOff 的情况, 登录到 master 节点上查看其是否连接互联网, 即 ping google.com 会不会丢包, 如果丢包再检查 ping 192.168.64.1 即对应以太网中宿主机的 ip 地址 (mac 中默认好像就是这个地址)
如果没有问题就是 宿主机发生了桥接 (NAT) 失败, 换个网络可能就好了, 或者手动配置一下 桥接网络来实现

Chaos Mesh 部署在本地 Kubernetes + HDFS 环境中

首先添加 hdfs 在 helm 中的源

1