Балансировка нагрузки стручков K8s с рамкой оператора - PullRequest
0 голосов
/ 25 июня 2018

Я построил простой оператор, настроив пример memcached. Единственное существенное отличие состоит в том, что мне нужны два изображения докера в моих модулях. Развертывание запущено. Мой test.yaml использовался для развертывания с kubectl.

apiVersion: "cache.example.com/v1alpha1"
kind: "Memcached"
metadata:
  name: "solar-demo"
spec:
  size: 3
  group: cache.example.com
  names:
    kind: Memcached
    listKind: MemcachedList
    plural: solar-demos
    singular: solar-demo
  scope: Namespaced
  version: v1alpha1

Мне все еще не хватает одной части - балансировки нагрузки. В настоящее время в Docker мы используем образ nginx, работающий как обратный прокси-сервер, настроенный как:

upstream api_microservice {
  server api:3000;
}
upstream solar-svc_microservice {
  server solar-svc:3001;
}
server {
  listen $NGINX_PORT default;

  location /city {
    proxy_pass http://api_microservice;
  }

  location /solar {
    proxy_pass http://solar-svc_microservice;
  }

  root /html;
  location / {
    try_files /$uri /$uri/index.html /$uri.html /index.html=404;
  }
}

Я хочу, чтобы мой кластер выставлял порт 8080 и переадресовывал на порты 3000 и 3001 для моих образов, работающих внутри Pods.

Мое развертывание:

dep := &appsv1.Deployment{
    TypeMeta: metav1.TypeMeta{
        APIVersion: "apps/v1",
        Kind:       "Deployment",
    },
    ObjectMeta: metav1.ObjectMeta{
        Name:      m.Name,
        Namespace: m.Namespace,
    },
    Spec: appsv1.DeploymentSpec{
        Replicas: &replicas,
        Selector: &metav1.LabelSelector{
            MatchLabels: ls,
        },
        Template: v1.PodTemplateSpec{
            ObjectMeta: metav1.ObjectMeta{
                Labels: ls,
            },
            Spec: v1.PodSpec{
                Containers: []v1.Container{
                    {
                        Image:   "shmukler/docker_solar-svc",
                        Name:    "solar-svc",
                        Command: []string{"npm", "run", "start-solar-svc"},
                        Ports: []v1.ContainerPort{{
                            ContainerPort: 3001,
                            Name:          "solar-svc",
                        }},
                    },
                    {
                        Image:   "shmukler/docker_solar-api",
                        Name:    "api",
                        Command: []string{"npm", "run", "start-api"},
                        Ports: []v1.ContainerPort{{
                            ContainerPort: 3000,
                            Name:          "solar-api",
                        }},
                    },
                },
            },
        },
    }

Что мне нужно добавить, чтобы ingress или что-то работало перед моими стручками?

Спасибо

1 Ответ

0 голосов
/ 26 июня 2018

Что мне нужно добавить, чтобы вход или что-то работало перед моими стручками?

Да, Вход предназначен для такого рода задач.

Ingress имеет path-based маршрутизацию, которая сможет настроить ту же конфигурацию, что вы упоминали в своем примере с Nginx. Кроме того, одна из самых популярных реализаций Ingress - это Nginx в качестве прокси.

Ingress - это в основном набор правил, которые позволяют трафику, в противном случае отбрасываемому или перенаправляемому в другое место, достигать служб кластера.
Вот пример конфигурации Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app
spec:
  rules:
  - host: '' # Empty value means ‘any host’
    http:
      paths:
      - path: /city
        backend:
          serviceName: myapp
          servicePort: 3000
      - path: /solar
        backend:
          serviceName: myapp
          servicePort: 3001

Кроме того, поскольку Pod не является статичным, вы должны создать Service объект, который будет статической точкой входа вашего приложения для Ingress.

Вот пример Service:

kind: Service
apiVersion: v1
metadata:
  name: myapp
spec:
  selector:
    app: "NAME_OF_YOUR_DEPLOYMENT"
  ports:
  - name: city
    protocol: TCP
    port: 3000
    targetPort: 3000
  - name: solar
    protocol: TCP
    port: 3001
    targetPort: 3001
...