Как изменить / установить внутренний IP-адрес или общедоступный IP-адрес главного узла k8s?
Я установил k3s на облачную виртуальную машину. (k3s очень похож на k8s.)
Сервер k3s запускается как главный узел.
И метка главного узла показывает, что internal-ip равен 192.168.xxx.xxx. Аннотации главного узла показывают, что public-ip тоже 192.168.xxx.xxx.
Но настоящий публичный IP-адрес Cloud VM - 49.xx.xx.xx. Таким образом, агент с другой машины не может подключиться к этому главному узлу. Потому что агент всегда пытается подключить прокси "wss://192.168.xxx.xxx:6443/...".
Если я запускаю ifconfig на облачной виртуальной машине, public-ip(49.xx.xx.xx) не отображается. Таким образом, k3s не может найти правильный внутренний или публичный IP.
Я пытаюсь запустить k3s с --bind-address=49.xx.xx.xx, но запустить не удалось. Я думаю, с этим ip-адресом нет привязки NIC.
Как решить эту проблему, если я попытаюсь создать виртуальную сетевую карту с адресом 49.xx.xx.xx?
2 ответа
Лучший вариант для подключения мастера и узлов Kubernetes - использование частной сети.
Как настроить мастер K3S и одноузловой кластер:
Предпосылки:
- Все машины должны находиться в одной частной сети. Например 192.168.0.0/24
- Все машины должны общаться друг с другом. Вы можете пинговать их с помощью:
$ ping IP_ADDRESS
В этом примере есть 2 виртуальные машины:
- Главный узел (k3s) с частным IP 10.156.0.13
- Рабочий узел (k3s-2) с частным ip 10.156.0.8
Установите соединение между виртуальными машинами
Самое главное - проверить, могут ли машины подключаться друг к другу. Как я уже сказал, лучший способ - просто пропинговать их.
Подготовить главный узел
Чтобы установить K3S на главном узле, вам нужно вызвать команду от пользователя root:
$ curl -sfL https://get.k3s.io | sh -
Результат этой команды должен быть таким:
[INFO] Finding latest release
[INFO] Using v0.10.2 as release
[INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v0.10.2/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v0.10.2/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Creating /usr/local/bin/ctr symlink to k3s
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s
Проверьте, работает ли главный узел:
$ kubectl get nodes
Вывод вышеуказанной команды должен быть таким:
NAME STATUS ROLES AGE VERSION
k3s Ready master 2m14s v1.16.2-k3s.1
Получите IMPORTANT_TOKEN с главного узла с помощью команды:
$ cat /var/lib/rancher/k3s/server/node-token
Этот токен будет использоваться для подключения узла агента к главному узлу. Скопируйте это
Подключить узел агента к главному узлу
Убедитесь, что узел может связываться с мастером. После этого вы можете вызвать команду от пользователя root:
$ curl -sfL https://get.k3s.io | K3S_URL=https://MASTER_NODE_IP:6443 K3S_TOKEN=IMPORTANT_TOKEN sh -
Вставьте свой IMPORTANT_TOKEN в эту команду.
В этом случае MASTER_NODE_IP - это 10.156.0.13.
Вывод этой команды должен выглядеть так:
[INFO] Finding latest release
[INFO] Using v0.10.2 as release
[INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v0.10.2/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v0.10.2/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Creating /usr/local/bin/ctr symlink to k3s
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO] systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
[INFO] systemd: Starting k3s-agent
Контрольная работа
Вызов команды на главном узле, чтобы проверить, успешно ли подключился агент:
$ kubectl get nodes
Здесь должен быть виден добавленный ранее узел:
NAME STATUS ROLES AGE VERSION
k3s Ready master 15m v1.16.2-k3s.1
k3s-2 Ready <none> 3m19s v1.16.2-k3s.1
Из приведенных выше выходных данных следует, что подготовка прошла правильно.
РЕДАКТИРОВАТЬ1: с этого момента вы можете развертывать модули и предоставлять их в общедоступное IP-пространство.
РЕДАКТИРОВАТЬ2:
Вы можете подключить главный и рабочий узлы K3S к общедоступной IP-сети, но для этого есть некоторые предварительные условия.
Предварительные требования:
- На главном узле должен быть открыт порт 6443/TCP.
- Убедитесь, что главный узел зарезервировал статический IP-адрес
- Убедитесь, что правила брандмауэра настроены так, чтобы разрешать доступ только по IP-адресу рабочих узлов (в этом могут помочь статические IP-адреса узлов)
Подготовка главного узла
Развертывание главного узла такое же, как указано выше. Единственная разница в том, что вам нужно получить его публичный IP-адрес.
Вашему главному узлу не нужно отображать ваш общедоступный IP-адрес в таких командах, как:
$ ip a
$ ifconfig
Подготовка рабочих узлов
Развертывание рабочих узлов отличается только способом изменения IP-адреса главного узла с частного на общедоступный. Вызовите эту команду из учетной записи root:
curl -sfL https://get.k3s.io | K3S_URL=https://PUBLIC_IP_OF_MASTER_NODE:6443 K3S_TOKEN=IMPORTANT_TOKEN sh -
Тестирование кластера
Чтобы убедиться, что узлы подключены правильно, вам нужно вызвать команду:
$ kubectl get nodes
Результат должен быть примерно таким:
NAME STATUS ROLES AGE VERSION
k3s-4 Ready <none> 68m v1.16.2-k3s.1
k3s-1 Ready master 69m v1.16.2-k3s.1
k3s-3 Ready <none> 69m v1.16.2-k3s.1
k3s-2 Ready <none> 68m v1.16.2-k3s.1
Здесь должны быть видны все узлы.
У меня тоже была такая же проблема, и я наконец нашел решение. Вы можете запустить свой сервер с помощью--node-external-ip
, как это sudo k3s server --node-external-ip 49.xx.xx.xx
, а агенту нужно настроить env или начать с sudo k3s agent --server https://49.xx.xx.xx:6443 --token ${K3S_TOKEN}
, то ваше локальное устройство (граничный узел) с частного IP-адреса может подключиться к общедоступному облаку.
Использование флага (listener) IP address that apiserver uses to advertise to members of the cluster (default: node-external-ip/node-ip)
На этом рисунке показан мой компьютер, подключенный к удаленному серверу, я тестирую его, raspberry 4B тоже успешно.
Балансировщик нагрузки не переключает общедоступный IP-адрес на частный, и когда я использую git blame, время добавления функции флага - 2019.10.26