Gitlab CI在线中Kubernetes持续部署阶段失败

67次阅读
没有评论

问题描述

正在使用Gitlab CI在线、Kubernetes和Docker设置云DevOps部署流水线。他正在按照一个示例文章和一个Stack Overflow问题的解答进行操作。他的问题是在部署阶段出现了错误。
以下是用户的.gitlab-ci.yml文件的源代码:

image: docker:latest
services:
  - docker:dind
variables:
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: gitlab-ci
stages:
  - build
  - package
  - deploy
maven-build:
  image: maven:3-jdk-8
  stage: build
  script: "mvn package -B"
  artifacts:
    paths:
      - target/*.jar
docker-build:
  stage: package
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
    - docker build -t registry.gitlab.com/username/mta-hosting-optimizer .
    - docker push registry.gitlab.com/username/mta-hosting-optimizer
k8s-deploy:
  image: google/cloud-sdk
  stage: deploy
  script:
    - echo "$GOOGLE_KEY" > key.json
    - gcloud auth activate-service-account --key-file key.json
    - gcloud config set compute/zone europe-west1-c
    - gcloud config set project mta-hosting-optimizer
    - gcloud config unset container/use_client_certificate
    - gcloud config set container/use_client_certificate True
    - gcloud container clusters get-credentials mta-hosting-optimizer
    - kubectl create -f admin.yaml --validate=false
    - kubectl create clusterrolebinding serviceaccounts-cluster-admin--clusterrole=cluster-admin --group=system:serviceaccounts
    - kubectl delete secret registry.gitlab.com
    - kubectl create secret docker-registry registry.gitlab.com --docker-server=https://registry.gitlab.com --docker-username=username --docker-password=$REGISTRY_PASSWD --docker-email=email@email.com
    - kubectl apply -f deployment.yml

用户在部署阶段的以下行出现了错误:

- kubectl create -f admin.yaml --validate=false

错误信息如下:

error: error converting YAML to JSON: yaml: mapping values are not allowed in this context
ERROR: Job failed: exit code 1

用户提供的admin.yaml文件的源代码如下:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

用户还提到他遇到了以下错误:

Error from server (Forbidden): error when creating "admin.yaml": clusterrolebindings.rbac.authorization.k8s.io is forbidden: User "client" cannot create clusterrolebindings.rbac.authorization.k8s.io at the cluster scope: Unknown user "client"
ERROR: Job failed: exit code 1

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据错误信息,您的admin.yaml文件中的格式可能有问题。请确保文件的格式正确,每个字段都应该单独一行。以下是一个修复后的admin.yaml文件的示例:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

请将您的admin.yaml文件替换为上述修复后的版本,并重新运行部署流水线,看看问题是否解决。

方案2

根据错误信息,您的CI凭据可能受到限制,您可能需要调整权限。以下是一些可能的解决方法:
1. 检查您的CI凭据是否具有足够的权限来创建clusterrolebindings.rbac.authorization.k8s.io。您可以尝试使用具有更高权限的凭据来运行部署流水线。
2. 检查您的Kubernetes集群的RBAC配置,确保允许创建clusterrolebindings.rbac.authorization.k8s.io。
3. 如果您使用的是云托管的Kubernetes服务(如Google Kubernetes Engine),请确保您的凭据具有足够的权限来执行所需的操作。
请根据您的具体情况尝试上述解决方法,并重新运行部署流水线,看看问题是否解决。

方案3

如果以上解决方法都无法解决您的问题,您可以尝试使用其他方法来部署您的应用程序。例如,您可以尝试使用Helm来管理Kubernetes部署,或者使用其他CI/CD工具来自动化部署过程。
请根据您的具体需求和环境选择适合您的解决方案,并重新运行部署流水线,看看问题是否解决。

正文完