你遇到的错误非常明确:

Error creating: pods "jenkins-6b8d7fb9f4-" is forbidden: error looking up service account jenkins/jenkins: serviceaccount "jenkins" not found

👉 这说明:Deployment 中指定了 serviceAccountName: jenkins,但 Kubernetes 在 jenkins 命名空间中找不到名为 jenkins 的 ServiceAccount。


✅ 解决方案:先创建 ServiceAccount,再部署 Jenkins

你的 jenkins-master.yaml 文件里 没有包含 ServiceAccount 定义,所以即使你在 Deployment 中写了 serviceAccountName: jenkins,Kubernetes 也会报错说找不到这个账号。


✅ 步骤 1:创建 ServiceAccount

运行以下命令创建 jenkins ServiceAccount(如果还没创建):

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
meta
  name: jenkins
  namespace: jenkins
EOF

⚠️ 确保命名空间是 jenkins,且名字也是 jenkins

验证是否创建成功:

kubectl get serviceaccount jenkins -n jenkins

✅ 输出应类似:

NAME      SECRETS   AGE
jenins    1         30s

✅ 步骤 2:更新你的 YAML 文件,添加 serviceAccountName

修改你的 jenkins-master.yaml,在 spec.template.spec 下添加这一行:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-master
  template:
    metadata:
      labels:
        app: jenkins-master
      annotations:
        pod.beta.kubernetes.io/hostname: jenkins-0
    spec:
      serviceAccountName: jenkins   # ✅ 添加这一行(关键!)
      hostname: jenkins-0
      nodeSelector:
        kubernetes.io/hostname: k8s-node1
      tolerations:
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
          effect: NoSchedule
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
      containers:
        - name: jenkins
          image: swr.cn-east-3.myhuaweicloud.com/bocheng-test/jenkins-master:v1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: http
          volumeMounts:
            - name: jenkins-home
              mountPath: /var/jenkins_home
      volumes:
        - name: jenkins-home
          persistentVolumeClaim:
            claimName: jenkins-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-master
  namespace: jenkins
spec:
  selector:
    app: jenkins-master
  ports:
    - name: http
      port: 8080
      targetPort: 8080

✅ 步骤 3:应用配置

kubectl apply -f jenkins-master.yaml

✅ 步骤 4:绑定权限(让 Jenkins 能访问 Kubernetes API)

你现在有了 ServiceAccount,但还没有权限。我们使用 cluster-admin 快速授权(仅用于测试环境):

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
meta
  name: jenkins-cluster-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: jenkins
EOF

✅ 验证一切正常

查看 Pod 是否启动:

kubectl get pods -n jenkins

查看日志:

kubectl logs -f jenkins-xxxxx -n jenkins

进入 Jenkins 页面 → Manage Jenkins → Configure System → Kubernetes → Test Connection
👉 应该显示连接成功!


🛑 注意事项(重要)

项目 建议
🔐 生产环境 不要用 cluster-admin,应使用最小权限 RBAC
💾 持久化 确保 jenkins-pvc 已存在并绑定 PV
🔄 更新后 如果之前失败过,删除旧 ReplicaSet 可触发重建:
kubectl delete replicaset -l app=jenkins-master -n jenkins

✅ 总结

你之前的报错是因为:

❌ 指定了 serviceAccountName: jenkins,但没创建这个 SA

解决方法就是三步:

  1. ✅ 创建 ServiceAccount:kubectl create sa jenkins -n jenkins
  2. ✅ 在 Deployment 的 spec.template.spec 中加上 serviceAccountName: jenkins
  3. ✅ 绑定权限:ClusterRoleBindingcluster-admin(临时用)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐