如何 运行 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 或创建角色和角色绑定)时,它将使用默认服务帐户。默认情况下,此服务帐户无权执行这些操作。所以你需要

  1. 使用更高权限 account.You 创建服务帐户、角色和角色绑定应该有一个具有管理员权限或类似管理员权限的 kubeconfig 文件。使用 pod 外部的 kubeconfig 文件和 kubectl 来创建服务帐户、角色、角色绑定等。

  2. 完成后通过指定该服务帐户创建 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(特定角色,针对特定命名空间上的特定用户),您的工作角色范围是最佳实践。
  • 如果您将 ClusterRoleBindingcluster-admin 角色一起使用,它会起作用,但它的权限过多,不推荐使用,因为它会授予对整个集群的完全管理员控制权。

测试环境:

  • 我在 kubernetes 1.17.3 和 运行 上部署了您的配置 bitnami/kubectlbitnami/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
  • 然后我应用 jobServiceAccountRoleRoleBinding
$ 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 完成作业。

如果您对此案例还有其他疑问,请告诉我。