Назад | Перейти на главную страницу

Модули обновления Kubernetes в контроллере репликации за службой

У нас есть развернутый API в Kubernetes. API развертывается через контроллер репликации в поды и управляющий rc. Я хотел бы обновить конфигурацию модулей API с помощью скользящего обновления. Я могу это сделать, однако единственный способ заставить команду непрерывного обновления не выводить ошибку - это изменить имя RC. Но при этом разрывается связь с моей службой (представленной как балансировщик нагрузки) на RC, и он больше не может находить мои модули. Есть ли у кого-нибудь пример конфигурации для обновления контроллера репликации без изменения имени?

apiVersion: v1
kind: ReplicationController
metadata:
    name: my-api
    labels:
        name: my-api
spec:
    replicas: 4
    selector:
        name: my-api
    template:
        metadata:
            labels:
                name: my-api
        spec:
            containers:
              - name: my-api
                image: docker-registry.example.com/mynamespace/my-api
                command: [ "sh", "-c", "/do/the/thing/run"]
                resources:
                    limits:
                        cpu: 0
                ports:
                  - name: web
                    containerPort: 80
                env:
                  - name: "HELLO"
                    value: "WORLD"

И я хотел бы, например, изменить env var "HELLO" на "Bob" или что-то в этом роде.

Итак, я придумал стратегию, которая могла сработать. В большей части документации, над которой я работал, был селектор служб, основанный на имени модуля. Это не работает, потому что имя ДОЛЖНО измениться при выполнении непрерывного обновления. Лучше всего сделать service.spec.selector чем-то вроде "type = api-server" или какой-нибудь другой меткой метаданных, а затем добавить type = api-server к вашим модулям. (Помните, что службы указывают непосредственно на модули, а не на RC)

Контроллер репликации:

apiVersion: v1
kind: ReplicationController
metadata:
    name: my-api-{{randomDigits}}
    labels:
        name: my-api-{{randomDigits}}
spec:
    replicas: 4
    selector:
        name: my-api-{{randomDigits}}
    template:
        metadata:
            labels:
                name: my-api-{{randomDigits}}
                type: api-server
        spec:
            containers:
              - name: my-api
                image: docker-registry.example.com/mynamespace/my-api
                command: [ "sh", "-c", "/do/the/thing/run"]
                resources:
                    limits:
                        cpu: 0
                ports:
                  - name: web
                    containerPort: 80
                env:
                  - name: "HELLO"
                    value: "WORLD"

Обслуживание:

apiVersion: v1
kind: Service
metadata:
    name: my-api-service
    labels:
        name: my-api-service
spec:
    type: LoadBalancer
    ports:
      - port: 80
    selector:
        type: api-server

Затем, если вы хотите обновить конфигурацию вашего модуля, вы просто измените {{randomDigits}} на что-то новое, и вы можете выполнить последовательное обновление, не разрывая связь между вашим Сервисом и вашими модулями.