Skaffold dev просто зависает при сбое первого сообщения о развертывании

#kubernetes #skaffold

#kubernetes #skaffold

Вопрос:

Я добавляю интерфейс NextJS в свой кластер Kubernetes. Я добавил следующий файл:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client
  template:
    metadata:
      labels:
        app: client
    spec:
      containers:
        - name: client
          image: ldco2016/client
---
apiVersion: v1
kind: Service
metadata:
  name: client-srv
spec:
  selector:
    app: client
  ports:
    - name: client
      protocol: TCP
      port: 3000
      targetPort: 3000
  

в мой infra/k8s/ каталог, а затем перенастроен ingress-srv.yml следующим образом:

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: ticketing.dev
      http:
        paths:
          - path: /api/users/?(.*)
            backend:
              serviceName: auth-srv
              servicePort: 3000
          - path: /?(.*)
            backend:
              serviceName: client-srv
              servicePort: 3000
  

и skaffold.yml файл:

 apiVersion: skaffold/v2alpha3
kind: Config
deploy:
  kubectl:
    manifests:
      - ./infra/k8s*
build:
  local:
    push: false
  artifacts:
    - image: ldco2016/auth
      context: auth
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "src/**/*.ts"
            dest: .
    - image: ldco2016/client
      context: client
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "**/*.js"
            dest: .
  

Когда я запускаю skaffold dev , он зависает примерно здесь:

 starting deploy...
 - deployment.apps/auth-depl created
 - service/auth-srv created
 - deployment.apps/auth-mongo-depl created
 - service/auth-mongo-srv created
 - deployment.apps/client-depl created
 - service/client-srv created
 - ingress.extensions/ingress-service created
Waiting for deployments to stabilize...
 - deployment/auth-depl: waiting for rollout to finish: 0 of 1 updated replicas are available...
 - deployment/auth-mongo-depl: waiting for rollout to finish: 0 of 1 updated replicas are available...
 - deployment/client-depl: waiting for rollout to finish: 0 of 1 updated replicas are available...
 - deployment/client-depl is ready. [2/3 deployment(s) still pending]
 - deployment/auth-mongo-depl is ready. [1/3 deployment(s) still pending]
  

Есть идеи?

Я также использую Docker desktop и Kubernetes. Поскольку это приложение для микросервисов, я подумал, что, возможно, Kubernetes требуется больше ресурсов. Я попытался добавить больше ресурсов, но это не решило проблему.

Комментарии:

1. Он ожидает, пока будут готовы несколько развертываний. Каков статус для тех «все еще ожидающих» развертываний в кластере? Это проблема с развертыванием или с Skaffold?

2. @Jonas, я считаю, что проблема может быть в Skaffold, потому что я получаю эту ошибку: exiting dev mode because first deploy failed: 1/3 deployment(s) failed

3. @Jonas, я пытался увеличить ресурсы, но это не помогло.

4. Проверки состояния Skaffold подавляют журналы, пока состояние системы не стабилизируется. Вы можете попробовать skaffold dev --status-check=false отключить проверки состояния и просматривать журналы в режиме реального времени.

Ответ №1:

Я подозревал, что проблема связана с одним из моих модулей, поэтому я побежал: kubectl get pods

 NAME                               READY   STATUS                       RESTARTS   AGE
auth-depl-5867ffb6bd-n5s6w         0/1     CreateContainerConfigError   0          2m7s
auth-depl-669fc8fd66-qr8kj         0/1     CreateContainerConfigError   0          6m11s
auth-mongo-depl-585f5f978c-tnc9w   1/1     Running                      0          2m7s
  

Итак, проблема, похоже, была в моем auth-depl , и поэтому я просмотрел его yaml файл и заподозрил, что проблема заключается в секретном ключе, который я добавил, поэтому я прокомментировал это так:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      containers:
        - name: auth
          image: ldco2016/auth
          # env:
          #   - name: JWT_KEY
          #     valueFrom:
          #       secretKeyRef:
          #         name: jwt-secret
          #         key: JWT_KEY
---
apiVersion: v1
kind: Service
metadata:
  name: auth-srv
spec:
  selector:
    app: auth
  ports:
    - name: auth
      protocol: TCP
      port: 3000
      targetPort: 3000
  

К которому затем я побежал skaffold dev --cleanup=false и увидел:

 Listing files to watch...
 - ldco2016/auth
Generating tags...
 - ldco2016/auth -> ldco2016/auth:latest
Some taggers failed. Rerun with -vdebug for errors.
Checking cache...
 - ldco2016/auth: Found Locally
Tags used in deployment:
 - ldco2016/auth -> ldco2016/auth:367e6b2171c5c8477a3f3458d23dd73030f35716df45a290aa54baa5f4dcdaa1
Starting deploy...
 - deployment.apps/auth-depl configured
 - service/auth-srv configured
 - deployment.apps/auth-mongo-depl configured
 - service/auth-mongo-srv configured
 - ingress.extensions/ingress-service configured
Waiting for deployments to stabilize...
 - deployment/auth-depl: waiting for rollout to finish: 1 old replicas are pending termination...
 - deployment/auth-mongo-depl: waiting for rollout to finish: 1 old replicas are pending termination...
 - deployment/auth-depl is ready. [1/2 deployment(s) still pending]
 - deployment/auth-mongo-depl is ready.
Deployments stabilized in 3.633465001s
Watching for changes...
[auth-depl-5c59699679-tnzk2 auth]
[auth-depl-5c59699679-tnzk2 auth] > auth@1.0.0 start /app
[auth-depl-5c59699679-tnzk2 auth] > nodemon ./src/index.ts
[auth-depl-5c59699679-tnzk2 auth]
[auth-depl-5c59699679-tnzk2 auth] [nodemon] 2.0.5
[auth-depl-5c59699679-tnzk2 auth] [nodemon] to restart at any time, enter `rs`
[auth-depl-5c59699679-tnzk2 auth] [nodemon] watching path(s): *.*
[auth-depl-5c59699679-tnzk2 auth] [nodemon] watching extensions: ts,json
[auth-depl-5c59699679-tnzk2 auth] [nodemon] starting `ts-node ./src/index.ts`
[auth-depl-5c59699679-tnzk2 auth] (node:40) UnhandledPromiseRejectionWarning: Error: JWT must be defined
  

Это послужило большой подсказкой, потому что, когда я зашел, kubectl get secrets я обнаружил, что мой JWT больше не находится в секрете Kubernetes, и я полагаю, это потому, что недавно моя машина была случайно перезапущена, что означает, что я забыл нажать «выше» до более позднего времени, и он перезапустился позже в тот же вечер, что перезапустило мою локальную копиюрабочего стола Docker с Kubernetes.

Итак, я kubectl create secret... снова запустил команду, а затем снова запустил kubectl get secrets и снова увидел там свой секретный ключ.

Я добавил обратно в эти переменные среды секретный ключ или значение из этого секретного ключа внутри моего auth-depl.yml файла, а затем skaffold dev --cleanup=false снова запустил и:

 Listing files to watch...
 - ldco2016/auth
Generating tags...
 - ldco2016/auth -> ldco2016/auth:latest
Some taggers failed. Rerun with -vdebug for errors.
Checking cache...
 - ldco2016/auth: Found Locally
Tags used in deployment:
 - ldco2016/auth -> ldco2016/auth:367e6b2171c5c8477a3f3458d23dd73030f35716df45a290aa54baa5f4dcdaa1
Starting deploy...
 - deployment.apps/auth-depl configured
 - service/auth-srv configured
 - deployment.apps/auth-mongo-depl configured
 - service/auth-mongo-srv configured
 - ingress.extensions/ingress-service configured
Waiting for deployments to stabilize...
 - deployment/auth-depl: waiting for rollout to finish: 1 old replicas are pending termination...
 - deployment/auth-mongo-depl: waiting for rollout to finish: 1 old replicas are pending termination...
 - deployment/auth-depl is ready. [1/2 deployment(s) still pending]
 - deployment/auth-mongo-depl is ready.
Deployments stabilized in 3.612848017s
Watching for changes...
[auth-depl-5c59699679-tnzk2 auth] Error from server (BadRequest): container "auth" in pod "auth-depl-5c59699679-tnzk2" is terminated
[auth-depl-7d9bf44d9f-n9rcq auth]
[auth-depl-7d9bf44d9f-n9rcq auth] > auth@1.0.0 start /app
[auth-depl-7d9bf44d9f-n9rcq auth] > nodemon ./src/index.ts
[auth-depl-7d9bf44d9f-n9rcq auth]
[auth-depl-7d9bf44d9f-n9rcq auth] [nodemon] 2.0.5
[auth-depl-7d9bf44d9f-n9rcq auth] [nodemon] to restart at any time, enter `rs`
[auth-depl-7d9bf44d9f-n9rcq auth] [nodemon] watching path(s): *.*
WARN[0004] exit status 1
[auth-depl-7d9bf44d9f-n9rcq auth] [nodemon] watching extensions: ts,json
[auth-depl-7d9bf44d9f-n9rcq auth] [nodemon] starting `ts-node ./src/index.ts`
[auth-depl-7d9bf44d9f-n9rcq auth] Connected to MongoDB
[auth-depl-7d9bf44d9f-n9rcq auth] Listening on port 3000!!!!!
  

Снова в деле.

Ответ №2:

Измените все yaml конфигурационные файлы, аналогичные этим изменениям. Мы должны добавить ограничения ресурсов для каждого yaml файла:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-depl
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: client
  template: 
    metadata:
      labels:
        app: client
    spec:
      containers:
        - name: client
          image: ldco2016/client
          resources:
            limits:
              memory: 512Mi
              cpu: "1"
            requests:
              memory: 256Mi
              cpu: "0.2"
---
apiVersion: v1
kind: Service
metadata:
  name: client-srv
spec:
  type: ClusterIP
  selector:
    app: client
  ports: 
    - name: client
      protocol: TCP
      port: 3000
      targetPort: 3000