kubeinvaders :space_invader: 又名 k-inv :joystick:
K8s 的游戏化混沌工程工具
该项目是云原生计算基金会观察和分析 - 混沌工程部分的一部分。
- 在此链接启动演示 https://kubeinvaders.platformengineering.it
- 在此处监控 pod 状态 https://kubeopsview.platformengineering.it
由 platformengineering.it 和 devopstribe.it 团队支持,为您的 Kubernetes 基础设施提供企业级功能和认证的弹性服务。
我们在 DevOpsTRibe 博客上嵌入了一个演示,供您试用该工具。
这里是幻灯片,是我为 FOSDEM 2023 准备的混沌工程演讲。虽然我未能出席演讲,但我仍想与社区分享这些内容。
目录
描述
使用 k-inv,您可以以有趣的方式压测 K8s 集群,并检查其弹性程度。
安装
通过 Docker 或 Podman 运行
开始之前,您需要一个具有此集群角色的服务账户令牌。
示例
创建所需组件(假设 k8s v1.24+):
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: kubeinvaders
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kinv-cr
rules:
- apiGroups:
- ""
resources:
- pods
- pods/log
verbs:
- delete
- apiGroups:
- batch
- extensions
resources:
- jobs
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- "*"
resources:
- "*"
verbs:
- get
- watch
- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: kinv-sa
namespace: kubeinvaders
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kinv-crb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kinv-cr
subjects:
- kind: ServiceAccount
name: kinv-sa
namespace: kubeinvaders
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: kinv-sa-token
namespace: kubeinvaders
annotations:
kubernetes.io/service-account.name: kinv-sa
EOF
提取令牌:
TOKEN=$(k get secret -n kubeinvaders -o go-template='{{.data.token | base64decode}}' kinv-sa-token)
运行容器:
podman run -p 3131:8080 \
--env K8S_TOKEN=$TOKEN \
--env ENDPOINT=localhost:3131 \
--env INSECURE_ENDPOINT=true \
--env KUBERNETES_SERVICE_HOST=10.10.10.4 \
--env KUBERNETES_SERVICE_PORT_HTTPS=6443 \
--env NAMESPACE=namespace1,namespace2 \
luckysideburn/kubeinvaders:latest
根据此示例,您可以在以下地址访问 k-inv:http://localhost:3131
- 请注意命令 "podman run -p 3131:8080"。转发端口 8080 很重要。
- 我们建议在本地开发环境中使用
INSECURE_ENDPOINT=true
。 - 按照上述说明为
K8S_TOKEN
创建令牌。 - 在示例中,我们使用镜像标签
latest
,调试时使用latest_debug
。
参数
K8S_TOKEN
这些是您的服务账户必须具有的权限。您可以参考此集群角色的示例。
- apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["delete"]
- apiGroups: ["batch", "extensions"] resources: ["jobs"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""] resources: [""] verbs: ["get", "watch", "list"]
ENDPOINT
Web 控制台的主机和端口。
INSECURE_ENDPOINT
为 Web 控制台选择 HTTP 或 HTTPS。
KUBERNETES_SERVICE_HOST
您的控制平面的 IP 地址或 DNS 名称。
KUBERNETES_SERVICE_PORT_HTTPS
目标控制平面的 TCP 端口。
NAMESPACE
列出您想要压测或查看日志的命名空间(日志是 beta 功能,可能无法正常工作或可能会降低浏览器速度...)。
docker run -p 8080:8080 \
--env K8S_TOKEN=<k8s_service_account_token> \
--env ENDPOINT=localhost:8080 \
--env INSECURE_ENDPOINT=true \
--env KUBERNETES_SERVICE_HOST=<k8s_controlplane_host> \
--env KUBERNETES_SERVICE_PORT_HTTPS=<k8s_controlplane_port> \
--env NAMESPACE=<comma_separated_namespaces_to_stress> \
luckysideburn/kubeinvaders:develop
使用 Helm (v3+) 安装到 Kubernetes
如果您需要一个实验性的 Kubernetes 集群,可以通过 Make 和 Minikube 使用此设置。请参阅此 readme
helm repo add kubeinvaders https://lucky-sideburn.github.io/helm-charts/
helm repo update
kubectl create namespace kubeinvaders
helm install kubeinvaders --set-string config.target_namespace="namespace1\,namespace2" \
-n kubeinvaders kubeinvaders/kubeinvaders --set ingress.enabled=true --set ingress.hostName=kubeinvaders.io --set deployment.image.tag=latest
K3S 示例
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik" sh -s -
cat >/tmp/ingress-nginx.yaml <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
---
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: ingress-nginx
namespace: kube-system
spec:
chart: ingress-nginx
repo: https://kubernetes.github.io/ingress-nginx
targetNamespace: ingress-nginx
version: v4.9.0
set:
valuesContent: |-
fullnameOverride: ingress-nginx
controller:
kind: DaemonSet
hostNetwork: true
hostPort:
enabled: true
service:
enabled: false
publishService:
enabled: false
metrics:
enabled: false
serviceMonitor:
enabled: false
config:
use-forwarded-headers: "true"
EOF
kubectl create -f /tmp/ingress-nginx.yaml
kubectl create ns namespace1
kubectl create ns namespace2
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
helm install kubeinvaders --set-string config.target_namespace="namespace1\,namespace2" \
-n kubeinvaders kubeinvaders/kubeinvaders --set ingress.enabled=true --set ingress.hostName=kubeinvaders.io --set deployment.image.tag=latest
使用 Helm (v3+) 安装到 Kubernetes - LoadBalancer / HTTP(在 GKE 上测试)
helm install kubeinvaders --set-string config.target_namespace="namespace1\,namespace2" -n kubeinvaders kubeinvaders/kubeinvaders --set ingress.enabled=true --set ingress.hostName=kubeinvaders.local --set deployment.image.tag=latest --set service.type=LoadBalancer --set service.port=80
kubectl set env deployment/kubeinvaders INSECURE_ENDPOINT=true -n kubeinvaders
Openshift 的 SCC
oc adm policy add-scc-to-user anyuid -z kubeinvaders
Openshift 的路由
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: kubeinvaders
namespace: "kubeinvaders"
spec:
host: "kubeinvaders.io"
to:
name: kubeinvaders
tls:
termination: Edge
添加简单的 nginx Deployment 作为攻击目标 Pod
cat >deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 20 # 告诉 deployment 运行 20 个匹配模板的 pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24.0
ports:
- containerPort: 81
EOF
在 namespace1 和 namespace2 中应用 Nginx Deployment
sudo kubectl apply -f deployment.yaml -n namespace1
sudo kubectl apply -f deployment.yaml -n namespace2
使用
在顶部,您会看到一些指标,如下所述:
Current Replicas State Delay 是一个指标,显示集群恢复到所需 pod 副本状态所需的时间。
这是一个控制面板,您可以用它来开启和关闭各种功能。
开始混沌实验
按下"Start"按钮启动自动驾驶(按钮变为"Stop"以禁用此功能)。
启用洗牌 :joystick:
按下"Enable Shuffle"按钮随机重新排列 pod 或 K8s 节点的位置(按钮变为"Disable Shuffle"以停用此功能)。
启用自动在命名空间之间跳转 :joystick:
按下"Auto NS Switch"按钮在命名空间之间随机切换(按钮变为"Disable Auto NS Switch"以停用此功能)。
显示/隐藏 Pod 名称 :joystick:
按下"Hide Pods Name"按钮隐藏外星人下方的 pod 名称(按钮变为"Show Pods Name"以停用此功能)。
当前状态和事件信息 :joystick:
如下所述,在游戏屏幕上靠近飞船的地方,有关于当前集群、命名空间和一些配置的详细信息。
在 + 和 - 按钮下方,会出现一个显示最新游戏事件的栏。
显示特殊按键 :joystick:
按"h"键或从菜单中选择"Show Special Keys"。
放大/缩小 :joystick:
按 + 或 - 按钮增大或减小游戏屏幕。
主节点和工作节点的混沌容器
- 从菜单中选择"Show Current Chaos Container for Nodes"以查看攻击工作节点(不是外星人,它们是 pod)时启动的容器。
- 从菜单中选择"为节点设置自定义混沌容器",以对节点使用您首选的镜像或配置。
混沌会话期间的 URL 监控
在混沌工程会话期间,您可以监控 Ingress 公开的 HTTP 调用的行为。
使用"添加 HTTP 检查和混沌报告"标志,并添加要监控的 URL
在实验期间关注实时图表
持久性
K-inv 使用 Redis 来保存和管理数据。Redis 配置为"appendonly"。
目前,Helm chart 不支持持久卷,但这个任务在待办事项列表中...
通用故障排除和已知问题
- 似乎由于 ServiceAccount 问题,KubeInvaders 无法与 EKS 一起使用。
- 目前不支持将 KubeInvaders 安装到非"kubeinvaders"命名的命名空间中。
- 我只在通过 KubeSpray 安装的 Kubernetes 集群上测试过 KubeInvaders。
- 如果您看不到外星人,请按以下步骤操作:
- 打开终端并运行 "kubectl logs <pod_of_kubeinvader> -n kubeinvaders -f"
- 从另一个终端执行以下命令:
curl "https://<your_kubeinvaders_url>/kube/pods?action=list&namespace=namespace1" -k
- 附加日志并打开一个问题。
未知命名空间故障排除
- 检查用 helm config.target_namespace 声明的命名空间(例如 config.target_namespace="namespace1,namespace2")是否存在并包含一些 pod。
- 检查浏览器的开发者控制台是否有任何失败的 HTTP 请求(将它们发送到 luckysideburn[at]gmail[dot]com 或在此存储库上打开一个问题)。
- 尝试使用 latest_debug 并将日志发送到 luckysideburn[at]gmail[dot]com 或在此存储库上打开一个问题。
Prometheus 指标
KubeInvaders 通过标准端点 /metrics 公开 Prometheus 的指标。
以下是 Prometheus 配置示例:
scrape_configs:
- job_name: kubeinvaders
static_configs:
- targets:
- kubeinvaders.kubeinvaders.svc.cluster.local:8080
指标示例:
指标 | 描述 |
---|---|
chaos_jobs_node_count{node=workernode01} | 每个节点执行的混沌作业总数 |
chaos_node_jobs_total | 对所有工作节点执行的混沌作业总数 |
deleted_pods_total 16 | 删除的 pod 总数 |
deleted_namespace_pods_count{namespace=myawesomenamespace} | 每个命名空间删除的 pod 总数 |
安全性
为了限制对 Kubeinvaders 端点的访问,请在 ingress 中添加此注释。
nginx.ingress.kubernetes.io/whitelist-source-range: <your_ip>/32
社区
请通过以下方式获取新闻、报告错误、提出功能请求和其他问题:
- Twitter: @kubeinvaders 和 @luckysideburn
- 新功能也会在 这个频道 上发布到 YouTube
社区博客和视频
- Kubernetes 生态系统是一个糖果店
- AdaCon 挪威直播
- LILiS - Linux Day 2023 Benevento
- Kubernetes.io 博客: KubeInvaders - Kubernetes 的游戏化混沌工程工具
- acloudguru: cncf-state-of-the-union
- DevNation RedHat Developer: Twitter
- Flant: Kubernetes 中混沌工程的开源解决方案
- Reeinvent: KubeInvaders - 游戏化混沌工程
- Adrian Goins: 使用 KubeInvaders 进行 K8s 混沌工程
- dbafromthecold: 使用 KubeInvaders 对 AKS 上运行的 SQL Server 进行混沌工程
- Pklinker: Kubernetes 混沌测试的游戏化
- Openshift Commons Briefings: OpenShift Commons 简报 KubeInvaders: Kubernetes 的混沌工程工具
- GitHub: awesome-kubernetes 存储库
- William Lam: 有趣的 Kubernetes 应用程序演示
- The Chief I/O: 使用 Kubernetes 的 5 种有趣方式
- LuCkySideburn: Codemotion 演讲
- Chaos Carnival: 混沌工程很有趣!
- Kubeinvaders(旧版本) + OpenShift 4 演示: YouTube_视频
- KubeInvaders(旧版本)对抗 Openshift 4.1: YouTube_视频
- SQL Server 混沌工程 | Andrew Pruski | Conf42: 混沌工程: YouTube_视频
- nicholaschangblog: Azure Chaos Studio 简介
- bugbug: 混沌测试:您需要知道的一切
许可证
KubeInvaders 根据 Apache License, Version 2.0 获得许可。完整的许可证文本请参见 LICENSE。