Что необходимо для того, чтобы вход был развернут как демонсет, прослушивающий порт 80 в кластере raspberrypi kubernetes - PullRequest
0 голосов
/ 29 августа 2018

Здравствуйте, эксперты kubernetes,

У меня есть кластер kubernetes, работающий на 4 малиновых письмах с докером 18.04ce и kubernetes 1.9.7.

Я развернул службу, и к ней можно обращаться из кластера через IP-адрес кластера. Я также развернул вход, как описано в https://docs.traefik.io/user-guide/kubernetes/ и в Как заставить входной порт Kubernetes 80 работать на одноузловом кластере в виде единого узла как DaemonSet на основе службы контроллера входа. DaemonSet также имеет набор NET_BIND_SERVICE, который должен обеспечить, чтобы хост прослушивал тот же порт, что и служба.

Все работает, как описано, но мой вход не прослушивает порт 80 хостов. Каким-то образом настройка NET_BIND_SERVICE не работает должным образом. Кто-нибудь знает, как это исправить?

Если я развертываю входной контроллер как развертывание с NodePort, а не как DaemonSet, он работает, но это ограничивает меня портами, которые kubernetes позволяет назначать для NodePorts.

https://hackernoon.com/kubernetes-ingress-controllers-and-traefik-a32648a4ae95 сообщает, что hostPort входящего DaemonSet не работает с сетевым плагином CNI (я тестировал с фланелью и переплетением), но сайты Kubernetes @ RaspberryPI (например, https://blog.hypriot.com/post/setup-kubernetes-raspberry-pi-cluster/) говорят, что это работает, так что эта проблема должна быть решена.

Заранее спасибо Хайнц

1 Ответ

0 голосов
/ 29 августа 2018

Я нашел конфигурацию, как работает вход, основанный на traefik, на моем кластере Raspberry Pi с докером 18.04CE, kubernetes 1.9.7 и 2018-06-27-raspbian-stretch-lite.img:

Используйте определение DaemonSet из https://docs.traefik.io/user-guide/kubernetes/ и, в частности, файл yaml https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-ds.yaml

но ты должен добавить hostNetwork: соответствует спецификации DaemonSet а также Тип: ClusterIP к спецификации Сервиса.

Мой рабочий ямл выглядит следующим образом:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      hostNetwork: true
      containers:
      - image: traefik
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8080
          hostPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=DEBUG
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  type: ClusterIP
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

Согласно документации kubernetes ClusterIP является значением по умолчанию для типа службы. Но мой пример работает, только если я явно добавлю тип: ClusterIP к службе, которая поддерживает входной контроллер.

Я также проверил, работает ли он, если я добавляю либо «hostNetwork: true» в spec.template.spec для DeamonSet, либо «type: ClusterIP» в спецификацию службы, но он работает только в том случае, если я добавляю оба.

...