试图让 VM 与 Google 云中的 Kubernetes 对话时我失去了理智
Losing my mind trying to get the VM to talk to Kubernetes in Google Cloud
我为此纠结了好几个小时……我是 kubernetes 的新手,所以我知道我一定遗漏了一些东西。
"ERROR: Job failed (system failure): the server does not allow access to the requested resource (post pods)"
我们在一个虚拟机上设置了一个 GitLab 实例,另一个虚拟机安装了 GitLab 运行ner。两者都在 Google Cloud Compute Engine 中。
我们还在 Google 云上启动了一个 Kubernetes 集群。
当 运行 用户尝试 运行 时,结果如下:
Running with gitlab-runner 10.0.2 (a9a76a50)
on rd-002-optic-nexus (21590677)
Using Kubernetes namespace: gitlab
Using Kubernetes executor with image docker:git ...
ERROR: Job failed (system failure): the server does not allow access to the requested resource (post pods)
由于 Runner "external" 到集群,我唯一的选择是通过 "client certificate" 身份验证向 API 服务器进行身份验证。
我正在使用 Google Cloud Console 提供的集群 ca.crt,并已按照 Kubernetes guide 创建客户端证书。但是,我就是无法让它工作。
- 我可以从 (Runner) VM ping Kubernetes 服务器没有问题。
- GitLab 连接到 运行ner 并尝试使用它(因此是上面的输出)。
- 在 kubernetes 集群中,我们有:
- 创建了命名空间 "gitlab"。
- 在 "gitlab" 命名空间中创建了一个服务帐户 "gitlab-sa"。
- 生成并批准了客户端证书正常(csr 详细信息如下)。
- 运行ner 上的证书对每个人都有读取权限。
我一定是遗漏了什么地方。
GitLab 运行器配置
concurrent = 1
check_interval = 0
[[runners]]
name = "rd-002-optic-nexus"
url = "https://our.gitlab.instance.com/"
token = "21590677f31b57bce610ef3f4cb20d"
executor = "kubernetes"
[runners.kubernetes]
host = "https://111.222.x.xxx"
cert_file = "/usr/local/share/ca-certificates/kube-client.crt"
key_file = "/usr/local/share/ca-certificates/kube-client.key"
ca_file = "/usr/local/share/ca-certificates/kubernetes-ca.crt"
namespace = "gitlab"
namespace_overwrite_allowed = ""
privileged = false
cpu_limit = "1"
memory_limit = "1Gi"
service_cpu_limit = "1"
service_memory_limit = "1Gi"
helper_cpu_limit = "500m"
helper_memory_limit = "100Mi"
[runners.kubernetes.node_selector]
gitlab = "true"
Kubernetes 客户端 CSR
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: gitlab-sa.gitlab
spec:
groups:
- system:authenticated
request: $(cat server.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
有什么想法吗?有什么我想念的吗?
您的客户端证书用于服务器身份验证而不是客户端身份验证。为了使您的 TLS 客户端使用证书向 Kubernetes apiserver 进行身份验证,它需要提供具有客户端身份验证用法的证书。
The user account provided must have permission to create, list and attach to Pods in the specified namespace in order to function.
您需要创建一个角色并绑定到用户 gitlab-sa
。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: gitlab
name: gitlab-runner-executor
rules:
- apiGroups: [""]
resources: ["pods", "pods/attach"]
verbs: ["create", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-runner
namespace: gitlab
subjects:
- kind: User
name: gitlab-sa
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: gitlab-runner-executor
apiGroup: rbac.authorization.k8s.io
通常 ServiceAccount gitlab-sa
由 Kubernetes 集群中的 Gitlab Runner 使用。
当运行 Gitlab Runner 在Cluster 外部时可能没有必要,我不是很确定。
我为此纠结了好几个小时……我是 kubernetes 的新手,所以我知道我一定遗漏了一些东西。
"ERROR: Job failed (system failure): the server does not allow access to the requested resource (post pods)"
我们在一个虚拟机上设置了一个 GitLab 实例,另一个虚拟机安装了 GitLab 运行ner。两者都在 Google Cloud Compute Engine 中。
我们还在 Google 云上启动了一个 Kubernetes 集群。
当 运行 用户尝试 运行 时,结果如下:
Running with gitlab-runner 10.0.2 (a9a76a50)
on rd-002-optic-nexus (21590677)
Using Kubernetes namespace: gitlab
Using Kubernetes executor with image docker:git ...
ERROR: Job failed (system failure): the server does not allow access to the requested resource (post pods)
由于 Runner "external" 到集群,我唯一的选择是通过 "client certificate" 身份验证向 API 服务器进行身份验证。
我正在使用 Google Cloud Console 提供的集群 ca.crt,并已按照 Kubernetes guide 创建客户端证书。但是,我就是无法让它工作。
- 我可以从 (Runner) VM ping Kubernetes 服务器没有问题。
- GitLab 连接到 运行ner 并尝试使用它(因此是上面的输出)。
- 在 kubernetes 集群中,我们有:
- 创建了命名空间 "gitlab"。
- 在 "gitlab" 命名空间中创建了一个服务帐户 "gitlab-sa"。
- 生成并批准了客户端证书正常(csr 详细信息如下)。
- 运行ner 上的证书对每个人都有读取权限。
我一定是遗漏了什么地方。
GitLab 运行器配置
concurrent = 1
check_interval = 0
[[runners]]
name = "rd-002-optic-nexus"
url = "https://our.gitlab.instance.com/"
token = "21590677f31b57bce610ef3f4cb20d"
executor = "kubernetes"
[runners.kubernetes]
host = "https://111.222.x.xxx"
cert_file = "/usr/local/share/ca-certificates/kube-client.crt"
key_file = "/usr/local/share/ca-certificates/kube-client.key"
ca_file = "/usr/local/share/ca-certificates/kubernetes-ca.crt"
namespace = "gitlab"
namespace_overwrite_allowed = ""
privileged = false
cpu_limit = "1"
memory_limit = "1Gi"
service_cpu_limit = "1"
service_memory_limit = "1Gi"
helper_cpu_limit = "500m"
helper_memory_limit = "100Mi"
[runners.kubernetes.node_selector]
gitlab = "true"
Kubernetes 客户端 CSR
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: gitlab-sa.gitlab
spec:
groups:
- system:authenticated
request: $(cat server.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
有什么想法吗?有什么我想念的吗?
您的客户端证书用于服务器身份验证而不是客户端身份验证。为了使您的 TLS 客户端使用证书向 Kubernetes apiserver 进行身份验证,它需要提供具有客户端身份验证用法的证书。
The user account provided must have permission to create, list and attach to Pods in the specified namespace in order to function.
您需要创建一个角色并绑定到用户 gitlab-sa
。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: gitlab
name: gitlab-runner-executor
rules:
- apiGroups: [""]
resources: ["pods", "pods/attach"]
verbs: ["create", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-runner
namespace: gitlab
subjects:
- kind: User
name: gitlab-sa
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: gitlab-runner-executor
apiGroup: rbac.authorization.k8s.io
通常 ServiceAccount gitlab-sa
由 Kubernetes 集群中的 Gitlab Runner 使用。
当运行 Gitlab Runner 在Cluster 外部时可能没有必要,我不是很确定。