试图让 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 创建客户端证书。但是,我就是无法让它工作。

我一定是遗漏了什么地方。

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.

-- Connecting to the Kubernetes API

您需要创建一个角色并绑定到用户 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 外部时可能没有必要,我不是很确定。