Задать вопрос
@23ceriv

Шифрование между нодами kubernetes кластера?

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

географически распределенный кластер k3s, почти 50 нод, некоторые сервисы общаются друг с другом по plain http, плюс много самописных сервисов администрирования тупо торчит наружу по NodePort, что совсем не дело

необходимо сделать так, чтоб:
- на мастер ноде Pod - какой-то условный VPN сервер (ниже перечислю что пробовал и что не получилось)
- на воркер нодах перед запуском k3s-agent запускается впн клиент, и агентам соотв. сообщается ип мастера внутри впн
- соответственно на мастер ноде открыт во внешнюю сеть только порт впн сервера, а внутри виртуальной сети уже доступны сервисы (просто посредством iptables отрежу, естественно)
- независимость от чужой коммерческой инфраструктуры (так бы давно везде zerotier запустил)

идея очень нравится, логически вроде бы более чем возможно, однако, может сегодня просто совсем не мой день, но что я сегодня только ни пробовал:
- zerotier - уже подошел к настройке moon (условный self hosted сервер в их понятиях), как наткнулся на github issue где однозначно понятно что вряд ли оно будет поддерживаться и работать - в итоге так и не удалось достичь moon, только leaf, при абсолютно правильных конфигах, это при том что в целом полного self hosted от него ждать смысла нет, только частичный
- headscale + tailscale - очень капризен в настройке, клиент тупо молчит, там даже таймаутов на неуспешное подключение как будто бы нет
- nebula - звучит очень серьезно, кажется единственное что удалось хоть как то настроить. правда документация рода "один конфиг файл и для сервера и для клиента, но десять строк поменяй" как-то очень несерьезной показалась. даже очевидного mode: server / mode: client было бы шикарно, однако, если не получу ответов то продолжу мучать его, вот что получил по итогу на сегодня с ним:
some shitty nebula errors
ERRO[0003] Refusing to handshake with myself             certName=laptop fingerprint=1418e35d9ead2b4726dbb9b24976a0ce891b3a15004188b56aa3 handshake="map[stage:1 style:ix_psk0]" issuer=92fe075d812fe8a6aad127ce09fa62774bbcaac16e97a5c69 udpAddr="127.0.0.1:443" vpnIp=10.250.0.100
INFO[0004] Handshake message sent                        handshake="map[stage:1 style:ix_psk0]" initiatorIndex=4269599873 udpAddrs="[127.0.0.1:443]" vpnIp=10.250.0.1
ERRO[0004] Refusing to handshake with myself             certName=laptop fingerprint=1418e35d9ead2b4726dbb9b24976a0ce891b3a15004188b56aa3 handshake="map[stage:1 style:ix_psk0]" issuer=92fe075d812fe8a6aad127ce09fa62774bbcaac16e97a5c69 udpAddr="127.0.0.1:443" vpnIp=10.250.0.100
INFO[0005] Handshake message sent                        handshake="map[stage:1 style:ix_psk0]" initiatorIndex=4269599873 udpAddrs="[127.0.0.1:443]" vpnIp=10.250.0.1
ERRO[0005] Refusing to handshake with myself             certName=laptop fingerprint=1418e35d9ead2b4726dbb9b24976a0ce891b3a15004188b56aa3 handshake="map[stage:1 style:ix_psk0]" issuer=92fe075d812fe8a6aad127ce09fa62774bbcaac16e97a5c69 udpAddr="127.0.0.1:443" vpnIp=10.250.0.100
INFO[0007] Handshake message sent                        handshake="map[stage:1 style:ix_psk0]" initiatorIndex=4269599873 udpAddrs="[127.0.0.1:443]" vpnIp=10.250.0.1

не спорю что может приготовил неправильно.

почему я не хочу православное решение по типу wireguard:
- сложность настройки. имеется ввиду что не хочу вручную лезть в сетевые интерфейсы, особенно после того как все аналоги это делают сами, а так то после сегодняшнего хоть еще 3-5 огромных конфиг файлов перекопаю
- оверкилл для меня. мне нужно по сути только чтоб мои сервисы были доступны в этой private network, и шифрование между нодами. больше ну вот вообще ничего не нужно
- пугает что через годик в рф он окончательно отвалится, даже не знаю что сейчас с ним.

собственно вопросы простые:
- кто что использует
- что могло бы лучше всего мне подойти
- надежнее/легковеснее/проще по функционалу и настройке
- если вдруг небула окажется по итогам ответов норм, может кто скажет мне что может быть не так в конфиге его (тут полный набор сущностей кубера):
nebula in yaml k3s
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nebula-certs-pv
  labels:
    app: nebula-lighthouse
    type: nebula-certs
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data/nebula-certs
    type: DirectoryOrCreate

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nebula-certs-pvc
  labels:
    app: nebula-lighthouse
    type: nebula-certs
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nebula-lighthouse-config
data:
  lighthouse.yaml: |-
    pki:
      ca: /ca.crt
      cert: /lighthouse.crt
      key: /lighthouse.key

    listen:
      host: 0.0.0.0
      port: 443

    static_host_map:
      "10.250.0.1": ["10.250.0.1:443"]

    am_lighthouse: true
    lighthouse:
      hosts:
        - 10.250.0.1

    relay:
      enabled: false

    logging:
      level: "info"
      format: "text"

    firewall:
      inbound:
        - port: "any"
          proto: "any"
          host: "any"
          hostnets: ["10.250.0.0/16"]
      outbound:
        - port: "any"
          proto: "any"
          host: "any"
          hostnets: ["10.250.0.0/16", "0.0.0.0/0"]

    tun:
      dev: nebula0
      disabled: false
      mtu: 1400
      drop_local_broadcast: true
      routes: []
      unsafe_routes: []
      tx_queue_len: 500
      use_raw_sockets: false
      mss_clamp: 1350
      cidr: 10.250.0.1/16

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nebula-lighthouse
  labels:
    app: nebula-lighthouse
spec:
  selector:
    matchLabels:
      app: nebula-lighthouse
  template:
    metadata:
      labels:
        app: nebula-lighthouse
    spec:
      containers:
      - name: nebula-lighthouse
        securityContext:
          capabilities:
            add: ["NET_ADMIN"] # Add NET_ADMIN capability to allow tun/tap device creation
          privileged: true
        image: alpine:latest
        command: ["/bin/sh", "-c"]
        args:
        - |
          set -e
          echo "[0] Install nebula and dependencies"
          apk add nebula

          echo "[1] Generate CA"
          nebula-cert ca -name my-k3s-nebula-ca

          echo "[2] Sign Lighthouse Cert"
          nebula-cert sign -name lighthouse -ip 10.250.0.1/16 -ca-crt ca.crt -ca-key ca.key

          echo "[3] Run Nebula Lighthouse"
          nebula -config /nebula-conf/lighthouse.yaml
        ports:
        - containerPort: 443
        volumeMounts:
        - name: nebula-config
          mountPath: /nebula-conf
        - name: nebula-certs-volume
          mountPath: /nebula-conf/certs
      volumes:
      - name: nebula-config
        configMap:
          name: nebula-lighthouse-config
      - name: nebula-certs-volume
        persistentVolumeClaim:
          claimName: nebula-certs-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: nebula-lighthouse-svc
spec:
  selector:
    app: nebula-lighthouse
  ports:
  - protocol: TCP
    port: 443
    targetPort: 443


всем большое спасибо
  • Вопрос задан
  • 22 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Может посмотреть в сторону istio
притом mTLS - это будет только одной маленькой изюминкой помимо остальных

на хабре есть кучка иллюстрированного, например вот с множеством картинок
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы