【问题标题】:Gitlab CI - K8s - DeploymentGitlab CI - K8s - 部署
【发布时间】:2017-01-07 05:29:43
【问题描述】:

只是在 gitlab 和 k8s gitlab-k8s-cd 上浏览本指南,但我的构建在这部分一直失败:

- kubectl delete secret registry.gitlab.com
- kubectl create secret docker-registry registry.gitlab.com --docker-server=https://registry.gitlab.com --docker-username=<my_username> --docker-password=$REGISTRY_PASSWD --docker-email=<my_email>

虽然我不完全确定 --docker-password 需要什么密码,但我在 gitlab 中为我的用户创建了一个 API 令牌,并在安全变量中使用它。

这是错误:

$ gcloud container clusters get-credentials deployment
Fetching cluster endpoint and auth data.
kubeconfig entry generated for deployment.
$ kubectl delete secret registry.gitlab.com
Error from server: secrets "registry.gitlab.com" not found
ERROR: Build failed: exit code 1

任何帮助将不胜感激。

编辑

从最初的帖子开始,通过删除最初的kubectl delete secret 并重新构建工作,因此在没有以前的秘密的情况下删除失败。

二次编辑

我的 K8s 的 deployment.yml 有问题,谁能解释我为什么会收到这个错误:

error validating "deployment.yml": error validating data: field spec.template.spec.containers[0].ports[0]: expected object of type map[string]interface{},

有了这个 yml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: <app>
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: <app>
    spec:
      containers:
      - name: deployment
        image: registry.gitlab.com/<username>/<app>
        imagePullPolicy: Always
        ports:
        - "80:8080"
        env:
        - name: PORT
          value: "8080"
      imagePullSecrets:
        - name: registry.gitlab.com

还有这个错误:

error validating "deployment.yml": error validating data: found invalid field imagePullSecrets for v1.Container; if you choose to ignore these errors, turn validation off with --validate=false

有了这个 yml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: <app>
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: <app>
    spec:
      containers:
      - name: <app>
        image: registry.gitlab.com/<project>/<app>
        imagePullPolicy: Always
        ports:
        - "80:8080"
        env:
        - name: PORT
          value: "8080"
      imagePullSecrets:
        - name: registry.gitlab.com

最新的 YAML

apiVersion: v1
kind: Service
metadata:
  name: <app_name>
  labels:
    app: <app_name>
spec:
  ports:
    - port: 80
  selector:
    app: <app_name>
    tier: frontend
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: <app_name>
  labels:
    app: <app_name>
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: <app_name>
        tier: frontend
    spec:
      containers:
      - image: registry.gitlab.com/<project>/<app>
        imagePullPolicy: Always
        name: <app_name>
        env:
        - name: PORT
          value: "8080"
        imagePullSecrets:
        - name: registry.gitlab.com
        ports:
          - containerPort: 8080
            hostPort: 80

【问题讨论】:

    标签: kubernetes gitlab-ci gitlab-ci-runner


    【解决方案1】:

    关于您的第一个错误:

    端口在 Kubernetes 中的定义与在 Docker 或 Docker Compose 中不同。端口规范应该是这样的:

    ports:
      - containerPort: 8080
        hostPort: 80
    

    请参阅reference 了解更多信息。

    关于您的第二个错误:

    根据 PodSpecs 上的 referenceimagePullSecrets 属性正确放置在您的示例中。但是,通过阅读错误消息,您似乎实际上将 imagePullSecrets 属性包含在 ContainerSpec 中,而不是 PodSpec 中。

    在这种情况下,您问题中的 YAML 似乎是正确的。确保您的实际清单与您的问题中的示例相匹配,并且您没有意外缩进 imagePullSecrets 属性超出必要的范围。

    【讨论】:

    • 谢谢,我认为是我的 YAML 文件的问题导致了这些问题,对于 Kubernetes 来说仍然是新的,因此试图了解不同的组件。这就是我现在想要开始的工作(将提出主要问题)。
    【解决方案2】:

    这是适用于 K8s 的 YAML 文件:

    apiVersion: v1
    kind: Service
    metadata:
      name: <app_name>
      labels:
        app: <app_name>
    spec:
      ports:
        - port: 80
      selector:
        app: <app_name>
        tier: frontend
      type: LoadBalancer
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: <app_name>
      labels:
        app: <app_name>
    spec:
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: <app_name>
            tier: frontend
        spec:
          containers:
          - image: registry.gitlab.com/<project>/<app>:latest
            imagePullPolicy: Always
            name: <app_name>
            env:
            - name: PORT
              value: "8080"
            ports:
              - containerPort: 8080
                hostPort: 80
          imagePullSecrets:
            - name: registry.gitlab.com
    

    这也是工作的 gitlab-ci 文件:

    image: docker:latest
    services:
      - docker:dind
    
    variables:
      DOCKER_DRIVER: overlay
    
    stages:
      - package
      - deploy
    
    docker-build:
      stage: package
      script:
      - docker build -t registry.gitlab.com/<project>/<app> .
      - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
      - docker push registry.gitlab.com/<project>/<app>
    
    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 <zone>
      - gcloud config set project <project>
      - gcloud config set container/use_client_certificate True
      - gcloud container clusters get-credentials <container-name>
      - 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=<user-email>
      - kubectl apply -f deployment.yml
    

    只需要弄清楚如何更改脚本以允许回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-04
      • 2020-06-14
      • 2022-01-11
      • 1970-01-01
      • 2020-12-13
      • 2016-08-08
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多