kubectl apply -f работает на P C, но не на Gitlab Runner - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь выполнить развертывание в kubernetes с помощью Gitlab CICD. Независимо от того, что я делаю, kubectl apply -f helloworld-deployment.yml --record в моем .gitlab-ci.yml всегда возвращает, что развертывание не изменилось:

$ kubectl apply -f helloworld-deployment.yml --record
 deployment.apps/helloworld-deployment unchanged

Даже если я изменяю тег на образе или если развертывание не существует в все. Однако, если я запускаю kubectl apply -f helloworld-deployment.yml --record со своего собственного компьютера, он работает нормально и обновляется при изменении тега и создает развертывание при отсутствии развертывания. Ниже мой .gitlab-ci.yml, с которым я тестирую:

image: docker:dind
services:
    - docker:dind

stages:
    - deploy

deploy-prod:
    stage: deploy
    image: google/cloud-sdk
    environment: production
    script:
        - kubectl apply -f helloworld-deployment.yml --record

Ниже helloworld-deployment.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: helloworld-deployment
spec:
    replicas: 2
    selector:
        matchLabels:
            app: helloworld
    template:
        metadata:
            labels:
                app: helloworld
        spec:
            containers:
                - name: helloworld
                  image: registry.gitlab.com/repo/helloworld:test
                  imagePullPolicy: Always
                  ports:
                  - containerPort: 3000
            imagePullSecrets:
                - name: regcred

Обновление:

Это то, что я вижу, если я запускаю kubectl rollout history deployments/helloworld-deployment и нет существующего развертывания:

Error from server (NotFound): deployments.apps "helloworld-deployment" not found

Если развертывание уже существует, я вижу это:

REVISION  CHANGE-CAUSE
1         kubectl apply --filename=helloworld-deployment.yml --record=true

Только с одним revision.

На этот раз я заметил, что когда я менял тег, вывод из моего Gitlab Runner был:

deployment.apps/helloworld-deployment configured

Однако новых модулей не было. Когда я запустил его с моего P C, то увидел, что были созданы новые модули.

Обновление:

Запуск kubectl get pods показывает два разных модуля в Gitlab Runner чем я вижу на своем P C.

У меня определенно есть только один кластер kubernetes, но kubectl config view показывает некоторые различия (URL сервера одинаков). Выходные данные для contexts показывают разные пространства имен. Означает ли это, что мне нужно установить пространство имен в файле yml или передать его в команде? Вот вывод от бегуна Gitlab:

 apiVersion: v1
 clusters:
 - cluster:
     certificate-authority-data: DATA+OMITTED
     server: URL
   name: gitlab-deploy
 contexts:
 - context:
     cluster: gitlab-deploy
     namespace: helloworld-16393682-production
     user: gitlab-deploy
   name: gitlab-deploy
 current-context: gitlab-deploy
 kind: Config
 preferences: {}
 users:
 - name: gitlab-deploy
   user:
     token: [MASKED]

А вот вывод от моего P C:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: URL
contexts:
- context:
    cluster: do-nyc3-helloworld
    user: do-nyc3-helloworld-admin
  name: do-nyc3-helloworld
current-context: do-nyc3-helloworld
kind: Config
preferences: {}
users:
- name: do-nyc3-helloworld-admin
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - kubernetes
      - cluster
      - kubeconfig
      - exec-credential
      - --version=v1beta1
      - --context=default
      - VALUE
      command: doctl
      env: null

Похоже, Gitlab добавляет свои собственные default для пространства имен :

<project_name>-<project_id>-<environment>

Из-за этого я поместил это в раздел метаданных helloworld-deploy.yml:

namespace: helloworld-16393682-production

И тогда все заработало как положено. Он развертывался раньше, но kubectl get pods не показывал его, так как эта команда использовала пространство имен default.

1 Ответ

3 голосов
/ 22 января 2020

Поскольку Gitlab использует настраиваемое пространство имен, вам необходимо добавить к команде флаг пространства имен для отображения ваших модулей:

kubectl get pods -n helloworld-16393682-production

Вы можете установить пространство имен по умолчанию для команд kubectl. См. здесь .

Вы можете навсегда сохранить пространство имен для всех последующих команд kubectl в этом контексте

В вашем случае это может быть:

kubectl config set-context --current --namespace=helloworld-16393682-production

Или, если вы используете кратный кластер , вы можете переключаться между пространствами имен, используя:

kubectl config use-context helloworld-16393682-production

В этой ссылке вы можете увидеть много полезных команд и настроек.

Надеюсь, это поможет! =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...