
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
面向Kubernetes的游戏化混沌工程工具
该项目是https://landscape.cncf.io/%E6%99%AF%E8%A7%82%E4%B8%AD%E2%80%9C%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7%E4%B8%8E%E5%88%86%E6%9E%90 - 混沌工程”类别的一部分。
由platformengineering.it和devopstribe.it团队提供支持,为Kubernetes基础设施提供企业级功能和认证弹性服务。
DevOpsTRibe博客中嵌入了演示版本,可直接试用该工具。
!Alt Text
此处为幻灯片,来自我为FOSDEM 2023准备的混沌工程演讲。遗憾的是我未能到场,但仍希望与社区分享这些内容。
通过k-inv,您可以以有趣的方式对K8s集群进行压力测试,验证其弹性和恢复能力。
开始前,需从具有https://github.com/lucky-sideburn/kubeinvaders/blob/master/helm-charts/kubeinvaders/templates/rbac-cluster.yaml%E7%9A%84%E6%9C%8D%E5%8A%A1%E8%B4%A6%E6%88%B7%E8%8E%B7%E5%8F%96%E4%BB%A4%E7%89%8C%E3%80%82
示例
创建所需组件(假设K8s版本v1.24+):
bashcat << '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
提取令牌:
bashTOKEN=$(k get secret -n kubeinvaders -o go-template='{{.data.token | base64decode}}' kinv-sa-token)
运行容器:
bashpodman 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
INSECURE_ENDPOINT=true。K8S_TOKEN所需的令牌。latest镜像标签,调试时可使用latest_debug。参数说明
K8S_TOKEN
服务账户需具备以下权限,可参考https://github.com/lucky-sideburn/kubeinvaders/blob/master/helm-charts/kubeinvaders/templates/rbac-cluster.yaml%EF%BC%9A
ENDPOINT
Web控制台的主机和端口。
INSECURE_ENDPOINT
为Web控制台选择HTTP或HTTPS。
KUBERNETES_SERVICE_HOST
控制平面的IP地址或DNS名称。
KUBERNETES_SERVICE_PORT_HTTPS
目标控制平面的TCP端口。
NAMESPACE
需进行压力测试或查看日志的命名空间列表(日志为测试功能,可能无法工作或导致浏览器卡顿)。
bashdocker 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=<需测试的命名空间列表,逗号分隔> \ docker.xuanyuan.run/luckysideburn/kubeinvaders:develop
如需测试用Kubernetes集群,可通过Make和Minikube搭建,参考此文档
https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/kubeinvaders](https://artifacthub.io/packages/search?repo=kubeinvaders)
bashhelm 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
bashcurl -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
bashhelm 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
bashoc adm policy add-scc-to-user anyuid -z kubeinvaders
bashapiVersion: route.openshift.io/v1 kind: Route metadata: name: kubeinvaders namespace: "kubeinvaders" spec: host: "kubeinvaders.io" to: name: kubeinvaders tls: termination: Edge
bashcat >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: docker.xuanyuan.run/nginx:1.24.0 ports: - containerPort: 81 EOF
在namespace1和namespace2中应用Nginx Deployment:
bashsudo kubectl apply -f deployment.yaml -n namespace1 sudo kubectl apply -f deployment.yaml -n namespace2
顶部将显示以下指标:
!Alt Text
当前副本状态延迟:表示集群恢复到期望Pod副本状态所需的时间。
控制平面可用于启用/禁用各种功能:
!Alt Text
点击“Start”按钮启动自动模式(按钮将变为“Stop”以禁用该功能)。
点击“Enable Shuffle”按钮随机重排Pod或K8s节点的位置(按钮将变为“Disable Shuffle”以停用)。
点击“Auto NS Switch”按钮随机切换命名空间(按钮将变为“Disable Auto NS Switch”以停用)。
点击“Hide Pods Name”按钮隐藏外星人下方的Pod名称(按钮将变为“Show Pods Name”以显示)。
游戏屏幕中飞船附近将显示当前集群、命名空间及配置详情:
!Alt Text
+/-按钮下方将显示最新游戏事件的进度条:
!Alt Text
按“h”或从菜单中选择“Show Special Keys”。
按+/-按钮放大或缩小游戏屏幕。
在混沌工程会话中,可监控Ingress暴露的HTTP调用行为。
使用“Add HTTP check & Chaos Report”标志并添加需监控的URL:
!Alt Text
实验期间可查看实时图表:
!Alt Text
K-inv使用Redis存储和管理数据,Redis配置为“appendonly”模式。
目前Helm图表暂不支持PersistentVolumes,该功能已在开发计划中。
curl "https://<kubeinvaders_url>/kube/pods?action=list&namespace=namespace1" -kKubeInvaders通过标准端点/metrics暴露Prometheus指标。
Prometheus配置示例:
bashscrape_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总数 |
下载Grafana仪表板
!Alt Text
!Alt Text
如需限制对Kubeinvaders端点的访问,可在ingress中添加以下注解:
yamlnginx.ingress.kubernetes.io/whitelist-source-range: <your_ip>/32
如需获取最新动态、报告漏洞、提出功能请求或其他问题,可通过以下方式联系:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务