Я пытаюсь выполнить развертывание в 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
.