【问题标题】:Gitlab deploy to Kubernetes namespace not allowed不允许 Gitlab 部署到 Kubernetes 命名空间
【发布时间】:2021-08-11 07:35:21
【问题描述】:

使用 Gitlab+Kubernetes,如何将某些东西部署到特定的(例如 test)命名空间?我已经关注了 Gitlab 文档,但是我在部署时找不到如何选择特定的命名空间。

这个.gitlab-ci.yml 文件...

stages:
  - deploy
deploy:
  stage: deploy
  tags: [local]
  environment:
    name: test
    kubernetes:
      namespace: test
  script:
    - kubectl config get-contexts
    - kubectl apply -f nginx.yaml
    - kubectl get pods --namespace deploy-2-test
    - kubectl apply -f nginx.yaml --namespace test

...产生这个结果:

  on rap N37D1QxB
Preparing the "shell" executor 00:00
Using Shell executor...
Preparing environment 00:00
... [everything fine until here]

Executing "step_script" stage of the job script 00:00

$ kubectl config get-contexts
CURRENT   NAME            CLUSTER         AUTHINFO        NAMESPACE
*         gitlab-deploy   gitlab-deploy   gitlab-deploy   deploy-2-test

$ kubectl apply -f nginx.yaml
deployment.apps/nginx-deployment created

$ kubectl get pods --namespace deploy-2-test
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-66b6c48dd5-4lx4s   0/1     ContainerCreating   0          0s
nginx-deployment-66b6c48dd5-dcpcr   0/1     ContainerCreating   0          0s

$ kubectl apply -f nginx.yaml --namespace test
Error from server (Forbidden): error when retrieving current configuration of:
Resource: "apps/v1, Resource=deployments", GroupVersionKind: "apps/v1, Kind=Deployment"
Name: "nginx-deployment", Namespace: "test"
from server for: "nginx.yaml": deployments.apps "nginx-deployment" is forbidden: User "system:serviceaccount:deploy-2-test:deploy-2-test-service-account" cannot get resource "deployments" in API group "apps" in the namespace "test"
Cleaning up file based variables 00:00
ERROR: Job failed: exit status 1
  • 请注意,部署是在 deploy-2-test 命名空间上完成的,即使 .gitlab-ci.yml 文件指向 test 命名空间;如果在部署命令中包含--namespace,则无权部署。
  • 按照 Gitlab 文档,我添加了 cluster-admin 集群角色 到 gitlab ServiceAccount,应该是万能的……

nginx 部署是classic one。如何部署到 test 命名空间?为什么以及如何生成命名空间deploy-2-test

【问题讨论】:

  • gitlab runner 是自托管的还是共享的?。您还需要提供运行程序以通过 RBAC 角色访问 EKS 集群。我所做的是部署了一个自托管 EC2 运行器,其 IAM 角色配置为访问 EKS(AWS Kubernetes),并在 Kubernetes RBAC 规范中添加了 iam 角色
  • @Prashanna 这是一个共享跑步者。但我认为你没有抓住重点。目标是使用 Gitlab 机制进行部署,而不仅仅是使用 gitlab 运行命令来执行调整后的部署。我已经创建了 Gitlab 建议的 RBAC 角色(授予 gitlab 服务帐户主题具有 cluster-admin ClusterRole,这可能甚至过度)。

标签: kubernetes gitlab


【解决方案1】:

找到解决方案:只需在 Gitlab 集群定义页面中禁用选项 GitLab-managed cluster 即可。

输出摘录:

...
$ kubectl config get-contexts
CURRENT   NAME            CLUSTER         AUTHINFO        NAMESPACE
*         gitlab-deploy   gitlab-deploy   gitlab-deploy   test

$ kubectl apply -f nginx.yaml
deployment.apps/nginx-deployment created

$ kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-66b6c48dd5-55m6p   0/1     ContainerCreating   0          0s
nginx-deployment-66b6c48dd5-vbhtc   0/1     ContainerCreating   0          0s
Cleaning up file based variables
Job succeeded

实际上,deploy.environment.kubernetes.namespace 是定义最终 k8s 命名空间的那个。

【讨论】:

    【解决方案2】:

    我不能 100% 确定,但是设置 environment:kubernetes:namespace 设置可能不会改变您当前的上下文。它只将该值应用于KUBE_NAMESPACE 环境变量。

    如果您想确保始终可以在脚本中使用--namespace $KUBE_NAMESPACE。这也是我们所做的,以防止我们的脚本出现任何上下文问题。

    【讨论】:

    • 正如您在 OP 中看到的那样,--namespace 已使用,但没有任何效果。 environment:kubernetes:namespace 确实改变了上下文。看我的回答。
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2021-07-08
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多