卷“kube-api-access-fcz9j”的 MountVolume.SetUp 失败:对象“default”/“kube-root-ca.crt”未注册

问题描述 投票:0回答:4

我有一个本地 kubernetes 集群 v1.22.1(1 个主节点和 2 个工作节点),并希望使用 jenkins 上的 kubernetes 插件在此 kubernetes 集群上运行 jenkins 从属代理。 Jenkins 目前托管在 K8s 集群外部,运行 2.289.3。对于 Jenkins Cloud 中的 Kubernetes 凭证,我使用集群角色 cluster-admin 创建了新的服务帐户,并向 Jenkins 提供了令牌秘密文本。 Jenkins 和 Kubernetes 之间的连接已成功建立,但是当我运行 jenkins 作业在 kubernetes 中创建 pod 时,pod 显示错误并且未上线。

以下是 Kubernetes 日志。

詹金斯日志 从安装在 kubernetes 集群外部的 Jenkins master 连接时是否遇到过此类问题?

jenkins kubernetes jenkins-plugins
4个回答
3
投票

我了解 rootCAConfigMap 在默认服务帐户的每个命名空间中发布 kube-root-ca.crt。从 kubernetes 版本 1.22 开始,RootCAConfigMap 默认设置为 true,因此在创建 pod 时,将使用默认帐户的此证书。请查找有关基于绑定服务帐户令牌的预计交易量的更多信息 - https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/

要停止使用默认服务帐户或已用于创建 Pod 的特定服务帐户创建自动卷,只需在 serviceaccount 配置下将“automountServiceAccountToken”设置为“false”,然后允许 jenkins 在 Kubernetes 集群上创建从属 Pod。我已经在我的本地集群中成功测试了这一点。


3
投票

在您的 Pod 规格下,您可以添加

automountServiceAccountToken: false
。 如此处

所述
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot
  automountServiceAccountToken: false
  ...

如果您需要访问帐户凭据,这将不起作用。


0
投票

我为这个问题苦苦挣扎了很长一段时间。对我来说,问题更简单。 首先,我需要正确的权限。该服务帐户的角色需要在我的案例中

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: build-autoscaler
  name: autoscaler-pod-read-writer
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods", "pods/exec", "pods/logs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""] # "" indicates the core API group
  resources: ["configmaps", "secrets"]
  verbs: ["get"]

(特别要注意pods/exec)

除此之外,请记住云配置中的服务帐户和 Pod 的服务帐户需要相同(我在 Pod 中使用默认值以及为云配置创建的 SA)


0
投票

我们遇到了类似的问题,我们的 Pod 无法启动,因为它们找不到用于卷安装的指定 ConfigMap。这似乎与 Kubernetes 服务帐户令牌处理的变化有关,这导致我们在清单中显式设置服务帐户令牌。

解决方案:

您可能需要在 Pod 规范中包含显式服务帐户令牌才能解决此问题。 Kubernetes 文档此处详细介绍了如何管理服务帐户令牌。

这是一个演示这一点的快速片段:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-service-account
  automountServiceAccountToken: false # disable auto-mount
  volumes:
    - name: manual-token
      projected:
        sources:
          - serviceAccountToken:
              path: "token"
  containers:
    - name: my-container
      volumeMounts:
      - name: manual-token
        mountPath: "/var/run/secrets/kubernetes.io/serviceaccount"
        readOnly: true

我们采用这种方法是为了确保卷安装不会由于令牌丢失或延迟到达而失败。这样,令牌就成为 Pod 环境的显式部分,服务帐户可以从那里提取它。

希望这能像为我们解决问题一样解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.