如何 运行 kubectl 在命名空间中的作业中?
How to run kubectl within a job in a namespace?
嗨,我看到 this documentation kubectl 可以 运行 在默认 pod 中的 pod 内。
是否可以在指定命名空间的作业资源中 运行 kubectl?
没有看到任何相同的文档或示例..
当我尝试将 serviceAccounts 添加到容器时出现错误:
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:my-namespace:internal-kubectl" cannot list resource "pods" in API group "" in the namespace "my-namespace"
这是我尝试通过 sshing 进入容器并运行连接 kubctl 的时候。
正在编辑问题......
正如我之前提到的,根据文档我添加了服务帐户,下面是 yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: internal-kubectl
namespace: my-namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: modify-pods
namespace: my-namespace
rules:
- apiGroups: [""]
resources:
- pods
verbs:
- get
- list
- delete
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: modify-pods-to-sa
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: internal-kubectl
roleRef:
kind: Role
name: modify-pods
apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1
kind: Job
metadata:
name: testing-stuff
namespace: my-namespace
spec:
template:
metadata:
name: testing-stuff
spec:
serviceAccountName: internal-kubectl
containers:
- name: tester
image: bitnami/kubectl
command:
- "bin/bash"
- "-c"
- "kubectl get pods"
restartPolicy: Never
在 运行 作业中,我收到错误:
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:my-namespace:internal-kubectl" cannot list resource "pods" in API group "" in the namespace "my-namespace"
像这样创建服务帐户。
apiVersion: v1
kind: ServiceAccount
metadata:
name: internal-kubectl
使用这个创建 ClusterRoleBinding。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: modify-pods-to-sa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: internal-kubectl
现在使用文档中提供的相同配置创建 pod。
当您从 pod 使用 kubectl 进行任何操作(例如获取 pod 或创建角色和角色绑定)时,它将使用默认服务帐户。默认情况下,此服务帐户无权执行这些操作。所以你需要
使用更高权限 account.You 创建服务帐户、角色和角色绑定应该有一个具有管理员权限或类似管理员权限的 kubeconfig 文件。使用 pod 外部的 kubeconfig 文件和 kubectl 来创建服务帐户、角色、角色绑定等。
完成后通过指定该服务帐户创建 pod,您应该能够使用 kubectl 和服务帐户从该 pod 中执行角色中定义的操作。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: internal-kubectl
Is it possible to run kubectl inside a Job resource in a specified namespace? Did not see any documentation or examples for the same..
A Job 创建一个或多个 Pods 并确保指定数量的它们成功终止。这意味着权限方面与普通 pod 相同,这意味着 是的,可以 运行 kubectl 在作业资源中。
TL;DR:
- 你的yaml文件是正确的,也许你的集群中有其他东西,我建议删除并重新创建这些资源,然后重试。
- 还要检查您的 Kubernetes 安装版本和作业映像的 kubectl 版本,如果它们相差超过 1 个次要版本,you may have unexpected incompatibilities
安全注意事项:
- 根据documentation(特定角色,针对特定命名空间上的特定用户),您的工作角色范围是最佳实践。
- 如果您将
ClusterRoleBinding
与 cluster-admin
角色一起使用,它会起作用,但它的权限过多,不推荐使用,因为它会授予对整个集群的完全管理员控制权。
测试环境:
- 我在 kubernetes 1.17.3 和 运行 上部署了您的配置
bitnami/kubectl
和 bitnami/kubectl:1:17.3
。它适用于这两种情况。
- 为避免不兼容,请使用与您的服务器匹配的
kubectl
版本。
复制:
$ cat job-kubectl.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: testing-stuff
namespace: my-namespace
spec:
template:
metadata:
name: testing-stuff
spec:
serviceAccountName: internal-kubectl
containers:
- name: tester
image: bitnami/kubectl:1.17.3
command:
- "bin/bash"
- "-c"
- "kubectl get pods -n my-namespace"
restartPolicy: Never
$ cat job-svc-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: internal-kubectl
namespace: my-namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: modify-pods
namespace: my-namespace
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: modify-pods-to-sa
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: internal-kubectl
roleRef:
kind: Role
name: modify-pods
apiGroup: rbac.authorization.k8s.io
- 我创建了两个 pods 只是为了将输出添加到
get pods
的日志中。
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty --namespace my-namespace
the pod is running
$ kubectl run ubuntu --generator=run-pod/v1 --image=ubuntu -n my-namespace
pod/ubuntu created
- 然后我应用
job
、ServiceAccount
、Role
和 RoleBinding
$ kubectl get pods -n my-namespace
NAME READY STATUS RESTARTS AGE
curl-69c656fd45-l5x2s 1/1 Running 1 88s
testing-stuff-ddpvf 0/1 Completed 0 13s
ubuntu 0/1 Completed 3 63s
- 现在让我们检查 testing-stuff pod 日志,看看它是否记录了命令输出:
$ kubectl logs testing-stuff-ddpvf -n my-namespace
NAME READY STATUS RESTARTS AGE
curl-69c656fd45-l5x2s 1/1 Running 1 76s
testing-stuff-ddpvf 1/1 Running 0 1s
ubuntu 1/1 Running 3 51s
如您所见,它已成功 运行使用自定义 ServiceAccount
完成作业。
如果您对此案例还有其他疑问,请告诉我。
嗨,我看到 this documentation kubectl 可以 运行 在默认 pod 中的 pod 内。 是否可以在指定命名空间的作业资源中 运行 kubectl? 没有看到任何相同的文档或示例..
当我尝试将 serviceAccounts 添加到容器时出现错误:
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:my-namespace:internal-kubectl" cannot list resource "pods" in API group "" in the namespace "my-namespace"
这是我尝试通过 sshing 进入容器并运行连接 kubctl 的时候。
正在编辑问题......
正如我之前提到的,根据文档我添加了服务帐户,下面是 yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: internal-kubectl
namespace: my-namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: modify-pods
namespace: my-namespace
rules:
- apiGroups: [""]
resources:
- pods
verbs:
- get
- list
- delete
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: modify-pods-to-sa
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: internal-kubectl
roleRef:
kind: Role
name: modify-pods
apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1
kind: Job
metadata:
name: testing-stuff
namespace: my-namespace
spec:
template:
metadata:
name: testing-stuff
spec:
serviceAccountName: internal-kubectl
containers:
- name: tester
image: bitnami/kubectl
command:
- "bin/bash"
- "-c"
- "kubectl get pods"
restartPolicy: Never
在 运行 作业中,我收到错误:
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:my-namespace:internal-kubectl" cannot list resource "pods" in API group "" in the namespace "my-namespace"
像这样创建服务帐户。
apiVersion: v1
kind: ServiceAccount
metadata:
name: internal-kubectl
使用这个创建 ClusterRoleBinding。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: modify-pods-to-sa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: internal-kubectl
现在使用文档中提供的相同配置创建 pod。
当您从 pod 使用 kubectl 进行任何操作(例如获取 pod 或创建角色和角色绑定)时,它将使用默认服务帐户。默认情况下,此服务帐户无权执行这些操作。所以你需要
使用更高权限 account.You 创建服务帐户、角色和角色绑定应该有一个具有管理员权限或类似管理员权限的 kubeconfig 文件。使用 pod 外部的 kubeconfig 文件和 kubectl 来创建服务帐户、角色、角色绑定等。
完成后通过指定该服务帐户创建 pod,您应该能够使用 kubectl 和服务帐户从该 pod 中执行角色中定义的操作。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: internal-kubectl
Is it possible to run kubectl inside a Job resource in a specified namespace? Did not see any documentation or examples for the same..
A Job 创建一个或多个 Pods 并确保指定数量的它们成功终止。这意味着权限方面与普通 pod 相同,这意味着 是的,可以 运行 kubectl 在作业资源中。
TL;DR:
- 你的yaml文件是正确的,也许你的集群中有其他东西,我建议删除并重新创建这些资源,然后重试。
- 还要检查您的 Kubernetes 安装版本和作业映像的 kubectl 版本,如果它们相差超过 1 个次要版本,you may have unexpected incompatibilities
安全注意事项:
- 根据documentation(特定角色,针对特定命名空间上的特定用户),您的工作角色范围是最佳实践。
- 如果您将
ClusterRoleBinding
与cluster-admin
角色一起使用,它会起作用,但它的权限过多,不推荐使用,因为它会授予对整个集群的完全管理员控制权。
测试环境:
- 我在 kubernetes 1.17.3 和 运行 上部署了您的配置
bitnami/kubectl
和bitnami/kubectl:1:17.3
。它适用于这两种情况。 - 为避免不兼容,请使用与您的服务器匹配的
kubectl
版本。
复制:
$ cat job-kubectl.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: testing-stuff
namespace: my-namespace
spec:
template:
metadata:
name: testing-stuff
spec:
serviceAccountName: internal-kubectl
containers:
- name: tester
image: bitnami/kubectl:1.17.3
command:
- "bin/bash"
- "-c"
- "kubectl get pods -n my-namespace"
restartPolicy: Never
$ cat job-svc-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: internal-kubectl
namespace: my-namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: modify-pods
namespace: my-namespace
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: modify-pods-to-sa
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: internal-kubectl
roleRef:
kind: Role
name: modify-pods
apiGroup: rbac.authorization.k8s.io
- 我创建了两个 pods 只是为了将输出添加到
get pods
的日志中。
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty --namespace my-namespace
the pod is running
$ kubectl run ubuntu --generator=run-pod/v1 --image=ubuntu -n my-namespace
pod/ubuntu created
- 然后我应用
job
、ServiceAccount
、Role
和RoleBinding
$ kubectl get pods -n my-namespace
NAME READY STATUS RESTARTS AGE
curl-69c656fd45-l5x2s 1/1 Running 1 88s
testing-stuff-ddpvf 0/1 Completed 0 13s
ubuntu 0/1 Completed 3 63s
- 现在让我们检查 testing-stuff pod 日志,看看它是否记录了命令输出:
$ kubectl logs testing-stuff-ddpvf -n my-namespace
NAME READY STATUS RESTARTS AGE
curl-69c656fd45-l5x2s 1/1 Running 1 76s
testing-stuff-ddpvf 1/1 Running 0 1s
ubuntu 1/1 Running 3 51s
如您所见,它已成功 运行使用自定义 ServiceAccount
完成作业。
如果您对此案例还有其他疑问,请告诉我。