Gitlab CI管道:无法在名称空间中创建容器

时间:2018-11-20 13:16:17

标签: kubernetes continuous-integration gitlab pipeline

我有一个kubernetes集群(rancherOS&RKE),该集群具有一个正在运行的gitlab运行程序容器。 与我的GitLab实例的连接正常。

如果我激活管道,它会直接失败并显示以下错误:

HashSet<T>

这是我的gitlab-runner部署yaml:

Running with gitlab-runner 11.4.2 (cf91d5e1)
  on Kubernetes Runner e5e25776
Using Kubernetes namespace: gitlab-managed-apps
Using Kubernetes executor with image ubuntu:latest ...
ERROR: Job failed (system failure): pods is forbidden: User "system:serviceaccount:gitlab-managed-apps:default" cannot create pods in the namespace "gitlab-managed-apps"

我尝试添加带有参数“ privileged:true”的安全上下文,但这无济于事。

有人对如何授予gitlab-runner部署以正确的权限在名称空间“ gitlab-managed-apps”中创建其他Pod的想法吗?

非常感谢:)

2 个答案:

答案 0 :(得分:2)

在部署Yaml中,您没有添加spec.template.spec.serviceAccountName,这意味着它在名为default的部署命名空间中使用了名为gitlab-managed-apps的默认服务帐户。而且它没有rbac规则,无法根据您指定的错误创建广告连播。

有关详细信息,请参见https://kubernetes.io/docs/reference/access-authn-authz/rbac/

有多种解决方法。这是一个:

首先创建一个rbac规则,并将其绑定到服务帐户。波纹管就是一个例子:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab
  namespace: gitlab-managed-apps
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: gitlab-managed-apps
  name: gitlab
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["create"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: gitlab
  namespace: gitlab-managed-apps
subjects:
- kind: ServiceAccount
  name: gitlab # Name is case sensitive
  apiGroup: ""
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: gitlab # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

然后编辑您的部署Yaml以添加以下serviceaccount

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: gitlab-runner
  namespace: gitlab-managed-apps
spec:
  replicas: 1
  selector:
    matchLabels:
      name: gitlab-runner
  template:
    metadata:
      labels:
        name: gitlab-runner
    spec:
      serviceAccountName: gitlab
      containers:
      - args:
        - run
        image: gitlab/gitlab-runner:latest
        imagePullPolicy: Always
        name: gitlab-runner
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /etc/gitlab-runner
          name: config
        - mountPath: /etc/ssl/certs
          name: cacerts
          readOnly: true
      restartPolicy: Always
      volumes:
      - configMap:
          name: gitlab-runner
        name: config
      - hostPath:
          path: /usr/share/ca-certificates/mozilla
        name: cacerts
      hostNetwork: true

然后部署您的gitlab实例和其他所需的东西。

答案 1 :(得分:2)

您的服务帐户缺少权限。创建秘密期间,我也遇到了类似的问题。

您可以仅借助kubectl来授予访问权限,而不必填写任何其他文件。您应该创建角色绑定,即,将角色授予名称空间中的default服务帐户。 here提供了完整的说明。

在您的情况下,命令将如下所示:

kubectl create rolebinding default-view --clusterrole=edit --serviceaccount=gitlab-managed-apps:default --namespace=gitlab-managed-apps