Kubernetes: запуск одного контейнера внутри существующего кластера для выполнения заданий cron - PullRequest
0 голосов
/ 30 января 2020

Я работаю в кластере Kubernetes, где я хочу запустить один контейнер, который выполняет задания cron. В том же кластере я развертываю 3 других контейнера, в которых выполняется код приложения. Какие изменения необходимы для добавления контейнера другого типа в тот же кластер?

service.yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: supplier-service
    app.kubernetes.io/instance: supplier-service-instance
    app.kubernetes.io/version: "1.0.0"
    app.kubernetes.io/component: backend
    app.kubernetes.io/managed-by: kubectl
  annotations:
      # Note that the backend talks over HTTP.
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
       # TODO: Fill in with the ARN of your certificate.
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: OUR_ARN
       # Only run SSL on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
    service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https: "true"
    service.beta.kubernetes.io/do-loadbalancer-tls-ports: "443"
  name: supplier-service

spec:
  selector:
    app: supplier-service
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443

deploy.yaml - этот файл Yaml запускает код приложения

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: supplier-service
    app.kubernetes.io/instance: supplier-service-instance
    app.kubernetes.io/version: '1.0.0'
    app.kubernetes.io/managed-by: kubectl
  name: supplier-service-deployment
spec:
  replicas: 3
  strategy:
     type: RollingUpdate
     rollingUpdate:
        maxUnavailable: 25%
        maxSurge: 1
  selector:
    matchLabels: 
      app: supplier-service
  template: 
    metadata:
      labels: 
        app: supplier-service
    spec:
      containers:
        - image: IMAGE-FROM-ECR/supplier-service:latest
          imagePullPolicy: Always
          name: supplier-service
          ports: 
            - containerPort: 80
            - containerPort: 443
            - containerPort: 6379

У меня есть новый готовый DockerFile, который устанавливает задания cron внутри контейнера.

deploy-cron.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: supplier-service
    app.kubernetes.io/instance: supplier-service-instance
    app.kubernetes.io/version: '1.0.0'
    app.kubernetes.io/managed-by: kubectl
  name: supplier-service-deployment
spec:
  replicas: 1
  strategy:
     type: RollingUpdate
     rollingUpdate:
        maxUnavailable: 25%
        maxSurge: 1
  selector:
    matchLabels: 
      app: supplier-service
  template: 
    metadata:
      labels: 
        app: supplier-service
    spec:
      containers:
        - image: AWS-ECR/supplier-service-cron:latest
          imagePullPolicy: Always
          name: supplier-service
          ports: 
            - containerPort: 80
            - containerPort: 443
            - containerPort: 6379

Это правильный способ запуска отдельного контейнера внутри существующего кластера, или требуются какие-либо другие изменения? Спасибо. : -)

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Имена и метки должны быть изменены по сравнению с исходным yaml развертывания.

Если вы оставите metadata.name неизменным, вы измените существующее развертывание на kubectl apply -f вместо создания нового развертывания.

Не думаю, что вам нужны порты, если все вы запускаете cron, если только он не запускает полный экземпляр supplier-service

. Существующий селектор Service запутается, если вы оставите метку app: supplier-service в контейнере cron.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: supplier-service
    app.kubernetes.io/instance: supplier-service-instance
    app.kubernetes.io/version: '1.0.0'
    app.kubernetes.io/managed-by: kubectl
  name: supplier-service-cron-deployment
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: supplier-service-cron
  template: 
    metadata:
      labels: 
        app: supplier-service-cron
    spec:
      containers:
        - image: AWS-ECR/supplier-service-cron:latest
          imagePullPolicy: Always
          name: supplier-service-cron

Также kubernetes предоставляет автономную функциональность cronjob на тот случай, если вы этого не знали.

0 голосов
/ 30 января 2020

При вышеуказанном подходе вы получите ошибку при попытке развернуть два развертывания с одинаковыми именами в одном и том же пространстве имен.

Пример того, что вы пытаетесь сделать, приведен ниже

$ cat deploy1.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    deployment1: One
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      deployment1: One
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        deployment1: One
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

$ cat deploy2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    deployment2: Two
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      deployment2: Two
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        deployment2: Two
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

Создать первое развертывание.

$ kubectl create -f deploy1.yaml
deployment.apps/nginx created

Создать второе в том же пространстве имен и вы должны увидеть эту ошибку .

$ kubectl create -f deploy2.yaml
Error from server (AlreadyExists): error when creating "deploy2.yaml": deployments.apps "nginx" already exists
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...