1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-k0s

Клонировать/Скачать
k0s-in-docker.md 18 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 23.06.2025 17:30 f3833e7

Запуск k0s в Docker

Вы можете создать кластер 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 }}}.

Запуск k0s

1. Запуск контроллера

По умолчанию запуск 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, чтобы переопределить команду по умолчанию образа. Также обратите внимание, что узел только контроллера требует меньшего количества привилегий.

2. (Необязательно) Добавьте дополнительных рабочих узлов

Вы можете добавить несколько рабочих узлов в кластер и затем распределить контейнеры вашего приложения между отдельными рабочими узлами.

  1. Получите токен присоединения для рабочего узла:

    token=$(docker exec k0s-controller k0s token create --role=worker)
  2. Запустите контейнер для создания и присоединения нового рабочего узла:

    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

б) Использование kubectl локально

Чтобы настроить локальный доступ к вашему кластеру k0s, следуйте этим шагам:

  1. Создайте kubeconfig:

    docker exec k0s-controller k0s kubeconfig admin > ~/.kube/k0s.config
  2. Обновите 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-серверу с вашей машины.

  3. Установите переменную окружения KUBECONFIG:

    export KUBECONFIG=~/.kube/k0s.config
  4. Проверьте доступ к кластеру:

    kubectl get nodes

в) Использование Lens

Доступ к кластеру k0s с помощью Lens, следуя инструкциям по добавлению кластера.

Использование Docker Compose (альтернатива)

В качестве альтернативы вы можете запустить 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-k0s.git
git@api.gitlife.ru:oschina-mirror/mirrors-k0s.git
oschina-mirror
mirrors-k0s
mirrors-k0s
main