kubernetes - 如何从 POD A 执行 shell 脚本到另一个 POD B
问题描述
我有两个在 kubernetes 集群内运行的 pod。豆荚如下
- mongodb pod 类型:StatefulSet
- 脚本 pod 类型:Job
从script pod
我正在运行要在mongodb pod
.
bash 脚本包含以下代码,这些代码执行到 mongodb pod 并执行以下命令。
kubectl exec mongo-0 -c mongo -- mongo --eval 'rs.initiate({_id: "rs0", version: 1, members: [ {_id: 0, host: "mongo-0.mongo.default.svc.cluster.local:27017"}, {_id: 1, host: "mongo-1.mongo.default.svc.cluster.local:27017"}, {_id: 2, host: "mongo-2.mongo.default.svc.cluster.local:27017"} ]});'
但是当我运行时script pod
,出现以下错误
Error from server (Forbidden): pods "mongo-0" is forbidden: User "system:serviceaccount:default:default" cannot create resource "pods/exec" in API group "" in the namespace "default"
我应该怎么做才能为script pod
在 mongodb pod 中运行上述命令提供权限?
所以就像你说的,我创建了另一个 pod,它是 kind:job 并包含 script.sh。
在 script.sh 文件中,我对主 pod 运行“kubectl exec”以运行一些命令
脚本被执行,但我收到错误“无法在 API 组中创建资源“pods/exec”
所以我创建了一个带有资源的集群角色: ["pods/exec"] 并使用 ClusterRoleBinding 将其绑定到默认服务帐户
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: service-account-role-binding
namespace: default
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: ClusterRole
name: pod-reader
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
In the pod which is of kind:job, I include the service account like shown below
restartPolicy: Never
serviceAccountName: default
but I still get the same error. What am I doing wrong here ?
Error from server (Forbidden): pods "mongo-0" is forbidden: User "system:serviceaccount:default:default" cannot create resource "pods/exec" in API group "" in the namespace "default"
解决方案
如果这是需要定期运行以进行维护的东西,请查看 Kubernetes 守护程序集对象。
推荐阅读
- python - Telegram Bot - 在群聊中的所有用户中保留 Pickle 上下文
- python - 使用 python 的 onenote API:向页面添加更多文本
- java - Android Studio Java 根据下一个 Activity 中的条件从 Backstack 弹出一个 Activity
- c++ - 我想知道为什么我的 calc() 函数没有出现在输出中
- node.js - 如果匹配查询参数为空,则返回聚合的所有结果
- json - 如何使用 CloudFormation 覆盖容器环境变量运行 AWS ECS 任务
- amazon-web-services - AWS EKS - 创建负载均衡器控制器失败
- ocaml - 有更好的解决方案吗?
- android - 在加载数据之前显示其子级缩略图的 Android 组件
- ios - 在 SceneView 中加载 .ply