Rootless kubernetes: различия между версиями
Kaf (обсуждение | вклад) Нет описания правки |
Kaf (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
= | |||
= Общее описание = | |||
Запуск <code>Kubernetes</code> в режиме <code>rootless</code> обеспечивает запуск <code>Pod</code>ов без системных <code>root</code>-привелегий в рамках <code>user namespace</code> системного пользователя <code>u7s-admin</code>. Работа в этом режиме практически не требует никаких модификаций, но обеспечивает повышенные уровень защищенности <code>kubernetes</code>, так как клиентские приложения даже при использовании уязвимостей не могут получить права пользователя <code>root</code> и нарушить работу узла. | Запуск <code>Kubernetes</code> в режиме <code>rootless</code> обеспечивает запуск <code>Pod</code>ов без системных <code>root</code>-привелегий в рамках <code>user namespace</code> системного пользователя <code>u7s-admin</code>. Работа в этом режиме практически не требует никаких модификаций, но обеспечивает повышенные уровень защищенности <code>kubernetes</code>, так как клиентские приложения даже при использовании уязвимостей не могут получить права пользователя <code>root</code> и нарушить работу узла. | ||
Строка 7: | Строка 7: | ||
Запуск <code>kubernetes</code> версии <code>1.26.3</code> и старше в режиме <code>rootless</code> обеспечивает пакет <code>podsec-k8s</code> версии <code>1.0.5</code> или выше. | Запуск <code>kubernetes</code> версии <code>1.26.3</code> и старше в режиме <code>rootless</code> обеспечивает пакет <code>podsec-k8s</code> версии <code>1.0.5</code> или выше. | ||
== | = Быстрый старт = | ||
== Установка master-узла == | |||
== | === Инициализация master-узла === | ||
Для запуска <code>kubernetes</code> в режиме <code>rootless</code> установите пакет <code>podsec-k8s</code> версии <code>1.0.5</code> или выше. | Для запуска <code>kubernetes</code> в режиме <code>rootless</code> установите пакет <code>podsec-k8s</code> версии <code>1.0.5</code> или выше. | ||
Строка 60: | Строка 47: | ||
kubeadm join xxx.xxx.xxx.xxx:6443 --token ... --discovery-token-ca-cert-hash sha256:... | kubeadm join xxx.xxx.xxx.xxx:6443 --token ... --discovery-token-ca-cert-hash sha256:... | ||
</pre> | </pre> | ||
=== | |||
=== Запуск сетевого маршрутизатора для контейенеров kube-flannel === | |||
Для перевода узла в состояние <code>Ready</code>, запуска <code>coredns</code> <code>Pod</code>’ов запустите <code>flannel</code>. | Для перевода узла в состояние <code>Ready</code>, запуска <code>coredns</code> <code>Pod</code>’ов запустите <code>flannel</code>. | ||
На <code>master-узле</code> под пользоваталем <code>root</code> выполните команду: | На <code>master-узле</code> под пользоваталем <code>root</code> выполните команду: | ||
Строка 79: | Строка 65: | ||
Connection to the local host terminated.</pre> | Connection to the local host terminated.</pre> | ||
После завершения скрипта в течении минуты настраиваются сервисы мастер-узла кластера. По ее истечении проверьте работу <code>usernetes</code> (<code>rootless kuber</code>) | После завершения скрипта в течении минуты настраиваются сервисы мастер-узла кластера. По ее истечении проверьте работу <code>usernetes</code> (<code>rootless kuber</code>) | ||
=== Проверка работы master-узла === | |||
На <code>master-узле</code> выполните команду: | На <code>master-узле</code> выполните команду: | ||
Строка 150: | Строка 139: | ||
<pre># kubectl taint nodes <host> node-role.kubernetes.io/control-plane:NoSchedule- | <pre># kubectl taint nodes <host> node-role.kubernetes.io/control-plane:NoSchedule- | ||
node/<host> untainted</pre> | node/<host> untainted</pre> | ||
== | == Инициализация и подключение worker-узла == | ||
Установите пакет <code>podsec-k8s</code>: | Установите пакет <code>podsec-k8s</code>: | ||
<pre> | |||
apt-get install podsec-k8s | |||
</pre> | |||
=== Подключение worker-узлов === | |||
=== Подключение worker- | |||
Скопируйте команду подключения <code>worker-узла</code>, полученную на этапе установки начального <code>master-узла</code>. Запустите ее: | Скопируйте команду подключения <code>worker-узла</code>, полученную на этапе установки начального <code>master-узла</code>. Запустите ее: | ||
Строка 170: | Строка 161: | ||
Run 'kubectl get nodes' on the control-plane to see this node join the cluster. | Run 'kubectl get nodes' on the control-plane to see this node join the cluster. | ||
</pre> | </pre> | ||
=== Проверка состояния процессов === | === Проверка состояния процессов === | ||
Строка 190: | Строка 182: | ||
Все остальные процессы <code>kube-proxy</code>, <code>kube-flannel</code> запускаются как контейнеры от соответствующих образов в <code>user namespace</code> процесса <code>rootlesskit</code>. | Все остальные процессы <code>kube-proxy</code>, <code>kube-flannel</code> запускаются как контейнеры от соответствующих образов в <code>user namespace</code> процесса <code>rootlesskit</code>. | ||
== Проверка готовности master и worker узлов kubernets === | |||
Зайдите на <code>master-узел</code> и проверьте подключение <code>worker-узла</code>:</li></ol> | |||
<pre># kubectl get nodes -o wide | <pre> | ||
# kubectl get nodes -o wide | |||
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME | ||
host-212 Ready control-plane 7h54m v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2 | host-212 Ready control-plane 7h54m v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2 | ||
host-226 Ready <none> 8m30s v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2</pre> | host-226 Ready <none> 8m30s v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2 | ||
... | |||
</pre> | |||
== Подключение дополнительных master-узлов == | |||
= Детальное описание = | |||
== Особенности разворачивания приложений kubernetes == | == Особенности разворачивания приложений kubernetes == | ||
Строка 205: | Строка 207: | ||
</pre> | </pre> | ||
Сервисы типа <code>NodePort</code> из за их небольшого диапазона и "нестабильности" портов при переносе решения в другой кластер довольно редко используются. Рекомендуется вместо них использовать сервисы типа <code>ClusterIP</code> c доступом к ним через <code>Ingress</code>-контроллеры. | Сервисы типа <code>NodePort</code> из за их небольшого диапазона и "нестабильности" портов при переносе решения в другой кластер довольно редко используются. Рекомендуется вместо них использовать сервисы типа <code>ClusterIP</code> c доступом к ним через <code>Ingress</code>-контроллеры. | ||
== Выбор регистратора образов == | |||
Пакет обеспечивает загрузку <code>kubernet-образов</code> с регистраторов различного уровня. Уровень регистратора определяется переменной среды <code>U7S_REGISTRY</code>. Переменная может принимать следующие основные значения: | |||
* Локальный регистратор: C локального регистраторе, как правило, устанавливается подписанные образы с ограничением политики доступа для различных категория пользователей, устанавливаемые скриптами пакета <code>podsec</code>. Это образы загружаются с регистратора <code>registry.local</code> пользователем группы <code>podsec_dev</code>, подписываются и загружаются в локальный регистратор <code>registry.local</code>. Подробности по установке <code>rootless kubernetes</code> в этом режиме описаны в документе [https://github.com/kafnevod/podsec/blob/master/usernetes/README.md Установка и настройка U7S (rootless kuber)]. | |||
** <code>registry.local/k8s-c10f1</code> - образы для сертфицированного дистрибутива <code>c10</code>; | |||
** <code>registry.local/k8s-p10</code> - образы для несертфицированного дистрибутива <code>p10</code>. | |||
* Регистратор <code>altlinux</code>: С регистратора <code>altlinux</code> устанавливаются образы для которых не требуются ограничения политики доступа для различных категория пользователей: | |||
** <code>registry.altlinux.org/k8s-c10f1</code> - образы для сертфицированного дистрибутива <code>c10</code>; | |||
** <code>registry.altlinux.org/k8s-p10</code> - образы для несертфицированного дистрибутива <code>p10</code>. | |||
* Native kubernetes регистратор: Если переменная <code>U7S_REGISTRY</code> установлена в пустое значение (<code>U7S_REGISTRY=</code>) образы загружаются со стандартного регистратора образов <code>kubernetes</code>. | |||
Если переменная <code>U7S_REGISTRY</code> не установлена, ее значения вычисляется автоматически по следующему алгоритму: | |||
* Если файл <code>/etc/hosts</code> содержит описание хоста <code>registry.local</code> префикс переменной <code>U7S_REGISTRY</code> принимает значение <code>registry.local/</code>, иначе <code>registry.altlinux.org/</code>. | |||
* Если переменная <code>CPE_NAME</code> файла <code>/etc/os-release</code> содержит значение <code>spserver</code> суффикс переменной <code>U7S_REGISTRY</code> принимает значение <code>k8s-c10f1</code>, иначе <code>k8s-p10</code>. |
Версия от 13:12, 26 июня 2023
Общее описание
Запуск Kubernetes
в режиме rootless
обеспечивает запуск Pod
ов без системных root
-привелегий в рамках user namespace
системного пользователя u7s-admin
. Работа в этом режиме практически не требует никаких модификаций, но обеспечивает повышенные уровень защищенности kubernetes
, так как клиентские приложения даже при использовании уязвимостей не могут получить права пользователя root
и нарушить работу узла.
Запуск kubernetes
версии 1.26.3
и старше в режиме rootless
обеспечивает пакет podsec-k8s
версии 1.0.5
или выше.
Быстрый старт
Установка master-узла
Инициализация master-узла
Для запуска kubernetes
в режиме rootless
установите пакет podsec-k8s
версии 1.0.5
или выше.
apt-get install podsec-k8s
Измените переменную PATH:
export PATH=/usr/libexec/podsec/u7s/bin/:$PATH
В каталоге /usr/libexec/podsec/u7s/bin/
находятся программы, обеспечивающие работы kubernetes
в rootless
-режиме.
Для разворачивания master-узла
запустите команду:
kubeadm init
По умолчанию уровень отладки устанавливается в
0
. Если необходимо увеличить уровень отладки укажите перед подкомандойinit
флаг-v n
. Гдеn
принимает значения от0
до9
-ти.
После:
- генерации сертификатов в каталоге
/etc/kuarnetes/pki
, - загрузки образов,
- генерации conf-файлов в каталоге
/etc/kubernetes/manifests/
,/etc/kubernetes/manifests/etcd/
- запуска сервиса
kubelet
иPod
’ов системныхkubernetes-образов
инициализируется kubernet-кластер
из одного узла.
По окончании скрипт выводит строки подключения master
(Control Plane
) и worker-узлов
:
You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join xxx.xxx.xxx.xxx:6443 --token ... --discovery-token-ca-cert-hash sha256:.. --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join xxx.xxx.xxx.xxx:6443 --token ... --discovery-token-ca-cert-hash sha256:...
Запуск сетевого маршрутизатора для контейенеров kube-flannel
Для перевода узла в состояние Ready
, запуска coredns
Pod
’ов запустите flannel
.
На master-узле
под пользоваталем root
выполните команду:
# kubectl apply -f /etc/kubernetes/manifests/kube-flannel.yml Connected to the local host. Press ^] three times within 1s to exit session. [INFO] Entering RootlessKit namespaces: OK namespace/kube-flannel created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created Connection to the local host terminated.
После завершения скрипта в течении минуты настраиваются сервисы мастер-узла кластера. По ее истечении проверьте работу usernetes
(rootless kuber
)
Проверка работы master-узла
На master-узле
выполните команду:
# kubectl get daemonsets.apps -A NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-flannel kube-flannel-ds 1 1 1 1 1 <none> 102s kube-system kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 8h
Число READY
каждого daemonset
должно быть равно числу DESIRED
и должно быть равно числу узлов кластера.
# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME <host> Ready control-plane 16m v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2
Проверьте работу usernetes
(rootless kuber
)
# kubectl get all -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system pod/coredns-c7df5cd6c-5pkkm 1/1 Running 0 19m kube-system pod/coredns-c7df5cd6c-cm6vf 1/1 Running 0 19m kube-system pod/etcd-host-212 1/1 Running 0 19m kube-system pod/kube-apiserver-host-212 1/1 Running 0 19m kube-system pod/kube-controller-manager-host-212 1/1 Running 0 19m kube-system pod/kube-proxy-lqf9c 1/1 Running 0 19m kube-system pod/kube-scheduler-host-212 1/1 Running 0 19m NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19m kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 19m NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 19m NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE kube-system deployment.apps/coredns 2/2 2 2 19m NAMESPACE NAME DESIRED CURRENT READY AGE kube-system replicaset.apps/coredns-c7df5cd6c 2 2 2 19m
Состояние всех Pod
’ов должны быть в 1/1
.
Проверьте состояние дерева процессов:
# pstree ... ├─systemd─┬─(sd-pam) │ ├─dbus-daemon │ ├─nsenter.sh───nsenter───_kubelet.sh───kubelet───11*[{kubelet}] │ └─rootlesskit.sh───rootlesskit─┬─exe─┬─conmon───kube-controller───7*[{kube-controller}] │ │ ├─conmon───kube-apiserver───8*[{kube-apiserver}] │ │ ├─conmon───kube-scheduler───7*[{kube-scheduler}] │ │ ├─conmon───etcd───8*[{etcd}] │ │ ├─conmon───kube-proxy───4*[{kube-proxy}] │ │ ├─2*[conmon───coredns───8*[{coredns}]] │ │ ├─rootlesskit.sh───crio───10*[{crio}] │ │ └─7*[{exe}] │ ├─slirp4netns │ └─8*[{rootlesskit}] ...
Процесс kubelet
запускается как сервис в user namespace
процесса rootlesskit
.
Все остальные процессы kube-controller
, kube-apiserver
, kube-scheduler
, kube-proxy
, etcd
, coredns
запускаются как контейнеры от соответствующих образов в user namespace
процесса rootlesskit
.
Обеспечение запуска обычных POD’ов на мастер-узле
По умолчанию на master-узле пользовательские Pod
ы не запускаются. Чтобы снять это ограничение наберите команду:
# kubectl taint nodes <host> node-role.kubernetes.io/control-plane:NoSchedule- node/<host> untainted
Инициализация и подключение worker-узла
Установите пакет podsec-k8s
:
apt-get install podsec-k8s
Подключение worker-узлов
Скопируйте команду подключения worker-узла
, полученную на этапе установки начального master-узла
. Запустите ее:
kubeadm join xxx.xxx.xxx.xxx:6443 --token ... --discovery-token-ca-cert-hash sha256:...
По умолчанию уровень отладки устанавливается в
0
. Если необходимо увеличить уровень отладки укажите перед подкомандойjoin
флаг-v n
. Гдеn
принимает значения от0
до9
-ти.
По окончании скрипт выводит текст:
This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Проверка состояния процессов
Проверьте состояние дерева процессов:
# pstree ... ├─systemd─┬─(sd-pam) │ ├─dbus-daemon │ ├─nsenter.sh───nsenter───_kubelet.sh───kubelet───10*[{kubelet}] │ └─rootlesskit.sh───rootlesskit─┬─exe─┬─conmon───kube-proxy───4*[{kube-proxy}] │ │ ├─rootlesskit.sh───crio───9*[{crio}] │ │ └─6*[{exe}] │ ├─slirp4netns │ └─8*[{rootlesskit}] ...
Процесс kubelet
запускается как сервис в user namespace
процесса rootlesskit
.
Все остальные процессы kube-proxy
, kube-flannel
запускаются как контейнеры от соответствующих образов в user namespace
процесса rootlesskit
.
Проверка готовности master и worker узлов kubernets =
Зайдите на master-узел
и проверьте подключение worker-узла
:
# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME host-212 Ready control-plane 7h54m v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2 host-226 Ready <none> 8m30s v1.26.3 10.96.0.1 <none> ALT SP Server 11100-01 5.15.105-un-def-alt1 cri-o://1.26.2 ...
Подключение дополнительных master-узлов
Детальное описание
Особенности разворачивания приложений kubernetes
При использовании сервисов типа NodePort
поднятые в рамках кластера порты в диапазоне 30000-32767
остаются в namespace
пользователя u7s-admin
. Для их проброса наружу необходимо в пользователе u7s-admin
запустить команду:
$ nsenter_u7s rootlessctl add-ports 0.0.0.0:<port>:<port>/tcp
Сервисы типа NodePort
из за их небольшого диапазона и "нестабильности" портов при переносе решения в другой кластер довольно редко используются. Рекомендуется вместо них использовать сервисы типа ClusterIP
c доступом к ним через Ingress
-контроллеры.
Выбор регистратора образов
Пакет обеспечивает загрузку kubernet-образов
с регистраторов различного уровня. Уровень регистратора определяется переменной среды U7S_REGISTRY
. Переменная может принимать следующие основные значения:
- Локальный регистратор: C локального регистраторе, как правило, устанавливается подписанные образы с ограничением политики доступа для различных категория пользователей, устанавливаемые скриптами пакета
podsec
. Это образы загружаются с регистратораregistry.local
пользователем группыpodsec_dev
, подписываются и загружаются в локальный регистраторregistry.local
. Подробности по установкеrootless kubernetes
в этом режиме описаны в документе Установка и настройка U7S (rootless kuber).registry.local/k8s-c10f1
- образы для сертфицированного дистрибутиваc10
;registry.local/k8s-p10
- образы для несертфицированного дистрибутиваp10
.
- Регистратор
altlinux
: С регистратораaltlinux
устанавливаются образы для которых не требуются ограничения политики доступа для различных категория пользователей:registry.altlinux.org/k8s-c10f1
- образы для сертфицированного дистрибутиваc10
;registry.altlinux.org/k8s-p10
- образы для несертфицированного дистрибутиваp10
.
- Native kubernetes регистратор: Если переменная
U7S_REGISTRY
установлена в пустое значение (U7S_REGISTRY=
) образы загружаются со стандартного регистратора образовkubernetes
.
Если переменная U7S_REGISTRY
не установлена, ее значения вычисляется автоматически по следующему алгоритму:
- Если файл
/etc/hosts
содержит описание хостаregistry.local
префикс переменнойU7S_REGISTRY
принимает значениеregistry.local/
, иначеregistry.altlinux.org/
. - Если переменная
CPE_NAME
файла/etc/os-release
содержит значениеspserver
суффикс переменнойU7S_REGISTRY
принимает значениеk8s-c10f1
, иначеk8s-p10
.