问题描述
希望将一个 Kubernetes 集群添加到现有的 Jenkins 服务器,并迁移从 Docker 到 Kubernetes 的作业,使用命名代理。他已经设置了 Kubernetes 集群,并为在同一 Kubernetes 上运行的 Jenkins 实例添加了一个 serviceaccount(服务账户),但在设置作业时一直出现 401 unauthorized 错误。用户想知道是否需要在服务账户中添加其他内容,以便在集群外部使用令牌。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案 1 – 创建外部 Jenkins 的身份验证令牌
- 创建 serviceAccount(服务账户):
shell
kubectl create serviceaccount jenkins -n devops-tools - 创建角色(role)的 YAML 文件(jenkins-role.yaml):
“`yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: jenkins
rules: - apiGroups: [“”]
resources: [“pods”]
verbs: [“create”,”delete”,”get”,”list”,”patch”,”update”,”watch”] - apiGroups: [“”]
resources: [“pods/exec”]
verbs: [“create”,”delete”,”get”,”list”,”patch”,”update”,”watch”] - apiGroups: [“”]
resources: [“pods/log”]
verbs: [“get”,”list”,”watch”] - apiGroups: [“”]
resources: [“secrets”]
verbs: [“get”]
“` - 应用角色:
shell
kubectl apply -f jenkins-role.yaml -n devops-tools - 创建 RoleBinding 的 YAML 文件(jenkins-rolebinding.yaml):
“`yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jenkins
namespace: devops-tools
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: jenkins
subjects: - kind: ServiceAccount
name: jenkins
“` - 应用 RoleBinding:
shell
kubectl apply -f jenkins-rolebinding.yaml -n devops-tools -
在相同的命名空间中创建令牌(token)(注意可能出现名称冲突):
shell
kubectl create token jenkins -n devops-tools
(将此 JWT 令牌复制以备后用) -
在外部 Jenkins 中创建一个新的凭据(credential),类型为
secret text
,将令牌粘贴到最后一步中复制的令牌。
解决方案 2 – 验证令牌
令牌是 JWT,您可以对其进行 base64 解码,或使用 https://jwt.io 来验证它。以下是一个 curl 示例(适用于 Linux)来测试它(根据需要替换命名空间和 URL):
export JENKINS_TOKEN=PASTE.TOKEN.HERE
curl --location --request GET 'https://localhost:6443/api/v1/namespaces/devops-tools/pods' \
--header 'Authorization: Bearer $JENKINS_TOKEN'
参考链接
以上是解决您问题的两种方案,您可以根据实际情况选择其中之一来解决 (401 unauthorized) 错误。
正文完