всем привет
встала задача возможно слегка надуманная, но из отсутствия опыта мучаю жопу уже целый день
географически распределенный кластер 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 errorsERRO[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 k3sapiVersion: 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
всем большое спасибо