Вы можете создать кластер k0s поверх Docker.
Вам потребуется окружение Docker, работающее на Mac, Windows или Linux системах.
OCI-образы k0s публикуются как на Docker Hub, так и на GitHub Container registry. Для простоты примеры здесь используют Docker Hub (GitHub требует отдельной аутентификации, что не рассматривается здесь). Имена образов следующие:
docker.io/k0sproject/k0s:{{{ k0s_docker_version }}}
ghcr.io/k0sproject/k0s:{{{ k0s_docker_version }}}
Примечание: Из-за схемы проверки тегов Docker вместо обычного +
используется -
как разделитель версий k0s. Например, версия k0s {{{ k0s_version }}}
имеет тег docker.io/k0sproject/k0s:{{{ k0s_docker_version }}}
.
По умолчанию запуск OCI-образа k0s запустит контроллер с включенными рабочими нагрузками (то есть контроллер с флагом --enable-worker
) для обеспечения удобного локального тестового "кластера":
docker run -d --name k0s-controller --hostname k0s-controller \
-v /var/lib/k0s -v /var/log/pods `# это место, где k0s хранит свои данные` \
--tmpfs /run `# это место, где k0s хранит данные выполнения` \
--privileged `# самый простой способ включения контейнеров в контейнерах` \
-p 6443:6443 `# публикация порта сервера Kubernetes API` \
docker.io/k0sproject/k0s:{{{ k0s_docker_version }}}
Объяснение аргументов командной строки:- -d
запускает контейнер в режиме демонизации, то есть в фоновом режиме.
--name k0s-controller
назначает имя контейнеру "k0s-controller".--hostname k0s-controller
устанавливает имя хоста контейнера на "k0s-controller".-v /var/lib/k0s -v /var/log/pods
создаёт два Docker-объёма и монтирует их в /var/lib/k0s
и /var/log/pods
соответственно внутри контейнера, обеспечивая сохранность данных кластера при перезапуске контейнера.--tmpfs /run
TODO
--privileged
предоставляет контейнеру повышенные привилегии, необходимые для правильной работы k0s внутри Docker. Подробнее об этом см. раздел добавление дополнительных рабочих узлов.-p 6443:6443
открывает порт сервера Kubernetes API контейнера 6443 для хоста, позволяя взаимодействовать с кластером извне.docker.io/k0sproject/k0s:{{{ k0s_docker_version }}}
— это имя образа k0s для запуска. По умолчанию образ k0s запускает контроллер k0s с включенными компонентами worker внутри одного контейнера, создавая кластер с одним узлом контроллер-и-работник с помощью следующей команды:```Dockerfile
{% include "../Dockerfile" start="# Start CMD" end="# End CMD" %}
В качестве альтернативы можно запустить узел только контроллера следующим образом:
```sh
docker run -d --name k0s-controller --hostname k0s-controller \
--read-only `# k0s не будет записывать данные вне указанных ниже путей` \
-v /var/lib/k0s `# здесь k0s хранит свои данные` \
--tmpfs /run `# здесь k0s хранит временные данные` \
--tmpfs /tmp `# позволяет записи временных файлов` \
-p 6443:6443 `# публикует порт API сервера Kubernetes` \
docker.io/k0sproject/k0s:{{{ k0s_docker_version }}} \
k0s controller
Обратите внимание на добавление k0s controller
, чтобы переопределить команду по умолчанию образа. Также обратите внимание, что узел только контроллера требует меньшего количества привилегий.
Вы можете добавить несколько рабочих узлов в кластер и затем распределить контейнеры вашего приложения между отдельными рабочими узлами.
Получите токен присоединения для рабочего узла:
token=$(docker exec k0s-controller k0s token create --role=worker)
Запустите контейнер для создания и присоединения нового рабочего узла:
docker run -d --name k0s-worker1 --hostname k0s-worker1 \
-v /var/lib/k0s -v /var/log/pods `# здесь k0s хранит свои данные` \
--tmpfs /run `# здесь k0s хранит временные данные` \
--privileged `# это самый простой способ включения контейнеров внутри контейнера` \
docker.io/k0sproject/k0s:{{{ k0s_docker_version }}} \
k0s worker $token
``` В качестве альтернативы с более тонкими привилегиями:
<!--
Эта конфигурация частично повторяется в compose.yaml. Поэтому если что-то изменится здесь, то это должно быть отражено в compose.yaml.
Идеально было бы показать пример с установкой с читаемым корневым файловой системой. К сожалению, исправление DNS в точке входа требует изменения /etc/resolv.conf, поэтому это невозможно в данный момент. Точка входа могла бы попытаться перезаписать /etc/resolv.conf, но эта задача оставлена на будущее.
Дополнительные пути, которые должны быть добавлены как tmpfs:
- /tmp
- /etc/cni/net.d
- /opt/cni/bin
-->```sh
docker run -d --name k0s-worker1 --hostname k0s-worker1
-v /var/lib/k0s -v /var/log/pods # здесь хранятся данные k0s
--tmpfs /run # здесь хранятся временные данные k0s
--security-opt seccomp=unconfined
--device /dev/kmsg
--cap-add sys_admin
--cap-add net_admin
--cap-add sys_ptrace
--cap-add sys_resource
--cap-add syslog
docker.io/k0sproject/k0s:{{{ k0s_docker_version }}}
k0s worker "$token"
Примечания к флагам безопасности:
- `--security-opt seccomp=unconfined` необходим для доступа `runc` к
[сессионному ключрингу].
- `--device /dev/kmsg` делает `/dev/kmsg` видимым внутри контейнера.
Варнинг OOM kubelet использует это.
<!--
Примечание, что ранее это работало через `-v /dev/kmsg:/dev/kmsg:ro --device-cgroup-rule='c 1:11 r'` также.
Верхний уровень ссылка: https://github.com/euank/go-kmsg-parser/blob/v2.0.0/kmsgparser/kmsgparser.go#L60
Также относительно: флаг-gate KubeletInUserNamespace (альфа с версии v1.22)
https://kubernetes.io/docs/tasks/administer-cluster/kubelet-in-userns/
-->Примечания к [Linux возможностям]:
- `CAP_SYS_ADMIN` позволяет выполнять различные административные задачи,
включая монтирование файловых систем и управление пространствами имен,
что необходимо для создания и конфигурации вложенных контейнеров.
- `CAP_NET_ADMIN` позволяет манипулировать сетевыми настройками, такими как
интерфейсы и маршруты, позволяя контейнерам создавать изолированные или
мостовые сети и т.д.
- `CAP_SYS_PTRACE` позволяет проверять и изменять процессы, используется для
мониторинга других контейнеров в вложенной среде.
<!--
Отсутствие этого приводит к невозможности запуска контейнеров
("RunContainerError")
-->
- `CAP_SYS_RESOURCE` позволяет контейнерам переопределять ограничения ресурсов
для таких вещей, как память или файловые дескрипторы, используется для управления
и корректировки распределения ресурсов в вложенных контейнерных средах.
<!--
Отсутствие этого приводит к "runc create failed: unable to start container
process: can't get final child's PID from pipe: EOF: unknown"
-->
- `CAP_SYSLOG` позволяет контейнерам выполнять привилегированные операции syslog.
Это необходимо для чтения `/dev/kmsg`. Обратите внимание, что в зависимости от конфигурации вашего кластера и рабочих нагрузок могут потребоваться дополнительные привилегии. Повторите этот шаг для каждого дополнительного узла-работника и скорректируйте имена контейнеров и хостов соответственно. Убедитесь, что узлы-работники могут получить доступ к контроллеру по [необходимым портам]. Если вы используете стандартную мостовую сеть Docker, это должно быть так.[session keyring]: https://www.man7.org/linux/man-pages/man7/session-keyring.7.html
[Linux capabilities]: https://www.man7.org/linux/man-pages/man7/capabilities.7.html
[required ports]: networking.md#controller-worker-communication
### 3. Доступ к вашему кластеру
#### а) Использование kubectl внутри контейнера
Чтобы проверить статус кластера и вывести список узлов, используйте:
```sh
docker exec k0s-controller k0s kubectl get nodes
Чтобы настроить локальный доступ к вашему кластеру k0s, следуйте этим шагам:
Создайте kubeconfig:
docker exec k0s-controller k0s kubeconfig admin > ~/.kube/k0s.config
Обновите kubeconfig для доступа через Localhost:
Чтобы автоматически заменить IP-адрес сервера на localhost в ~/.kube/k0s.config
, используйте следующую команду:
sed -i '' -e "$(awk '/server:/ {print NR; exit}' ~/.kube/k0s.config)s|https://.*:6443|https://localhost:6443|" ~/.kube/k0s.config
Эта команда обновляет kubeconfig для указания на localhost, что позволяет получить доступ к API-серверу с вашей машины.
Установите переменную окружения KUBECONFIG:
export KUBECONFIG=~/.kube/k0s.config
Проверьте доступ к кластеру:
kubectl get nodes
Доступ к кластеру k0s с помощью Lens, следуя инструкциям по добавлению кластера.
В качестве альтернативы вы можете запустить k0s с помощью Docker Compose:
{% include "compose.yaml" %}
```Вот более сложный пример, использующий Traefik в качестве балансера нагрузки, а также три узла-контроллера и три узла-работника:
<!-- Сохранено в отдельном файле для удобства локального тестирования. -->
```yaml
{% include "compose-cluster.yaml" %}
Запуск вышеуказанного:
❯ docker compose up -d
[+] Running 11/11
✔ Network compose-cluster_k0s-net Created 0.1s
✔ Volume "compose-cluster_k0s-token-secrets" Created 0.0s
✔ Volume "compose-cluster_k0s-controller-token" Created 0.0s
✔ Volume "compose-cluster_k0s-worker-token" Created 0.0s
✔ Container k0s-lb Started 0.5s
✔ Container k0s-controller-1 Started 11.8s
✔ Container k0s-controller-2 Started 12.2s
✔ Container k0s-worker-1 Started 12.4s
✔ Container k0s-worker-2 Started 12.3s
✔ Container k0s-worker-3 Started 12.1s
✔ Container k0s-controller-3 Started 12.5s
После короткого времени:
$ docker exec k0s-controller-1 k0s kc get node,po -A
NAME STATUS ROLES AGE VERSION
node/k0s-worker-1 Ready <none> 1m36s {{{ k8s_version }}}+k0s
node/k0s-worker-2 Ready <none> 1m36s {{{ k8s_version }}}+k0s
node/k0s-worker-3 Ready <none> 1m36s {{{ k8s_version }}}+k0s
```NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/coredns-7d4f7fbd5c-54lxp 1/1 Running 0 1m27s
kube-system pod/coredns-7d4f7fbd5c-pwbck 1/1 Running 0 1m27s
kube-system pod/konnectivity-agent-5g8pn 1/1 Running 0 1m22s
kube-system pod/konnectivity-agent-6rp7r 1/1 Running 0 1m22s
kube-system pod/konnectivity-agent-zx9fn 1/1 Running 0 1m22s
kube-system pod/kube-proxy-9m77t 1/1 Running 0 1m36s
kube-system pod/kube-proxy-v5vs6 1/1 Running 0 1m36s
kube-system pod/kube-proxy-xfw2h 1/1 Running 0 1m36s
kube-system pod/kube-router-6c62v 1/1 Running 0 1m36s
kube-system pod/kube-router-98ss8 1/1 Running 0 1m36s
kube-system pod/kube-router-lr46f 1/1 Running 0 1m36s
kube-system pod/metrics-server-7778865875-fzhx6 1/1 Running 0 1m37s
```## Знанные ограничения```### Отсутствие пользовательских Docker сетей
В настоящее время узлы k0s не могут быть запущены, если контейнеры настроены для использования пользовательских сетей (например, с помощью `--net=my-net`). Это связано с тем, что Docker настраивает специализированную службу DNS внутри сети, что создает проблемы с CoreDNS. Полностью надежных обходных путей нет, однако никаких проблем не должно возникнуть при запуске кластера(ов) k0s на мостовой сети.
## Следующие шаги
- [Установка с помощью k0sctl](k0sctl-install.md): Развертывание многоузловых кластеров с помощью одной команды
- [Параметры конфигурации управления кластером](configuration.md): Настройка сети и хранилища
- [Параметры конфигурации рабочего узла](worker-node-config.md): Метки узлов и аргументы kubelet
- [Поддержка провайдеров облачных сервисов](cloud-providers.md): Настройка балансировщика нагрузки или хранилища
- [Установка контроллера входящих соединений Traefik](examples/traefik-ingress.md): Информация о развертывании входящих соединений
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )