podsec-u7s-kubeadm(1)

PODSEC-U7S-KUBEADM(1) PODSEC-U7S-KUBEADM(1)

NAME

podsec-u7s-kubeadm - инициализация master- или worker-узла в rootless-kubernetes (alt usernetes)

SYNOPSIS

podsec-u7s-kubeadm init| join <ApiServer>:6443 --token ... --discovery-token-ca-cert-hash ...

DESCRIPTION

Установка master-узла

1.
Измените переменную PATH:
export PATH=/usr/libexec/podsec/u7s/bin/:$PATH
1.
Запустите команду:
# kubeadm init

После:

  • генерации сертификатов в каталоге /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:...
1.
После завершения скрипта проверьте работу usernetes (rootless kuber)
# 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 запускаются как контейнеры от соответствующих образов registry.local/k8s-c10f1/kube-controller-manager:v1.26.3, registry.local/k8s-c10f1/kube-apiserver:v1.26.3, registry.local/k8s-c10f1/kube-scheduler:v1.26.3, registry.local/k8s-c10f1/kube-proxy:v1.26.3, registry.local/k8s-c10f1/etcd:3.5.6-0, registry.local/k8s-c10f1/coredns:v1.9.3.

1.
По умолчанию на master-узле пользовательские Podы не запускаются. Чтобы снять это ограничение наберите команду:
# kubectl taint nodes <host> node-role.kubernetes.io/control-plane:NoSchedule-
node/<host> untainted
1.
Проверьте загрузку deployment nginx:
# kubectl apply -f https://k8s.io/examples/application/deployment.yaml

После загрузки образов nginx проверьте состояние deployment и Podов: ```NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 5m34s

NAME READY STATUS RESTARTS AGE pod/nginx-deployment-85996f8dbd-2dw9h 1/1 Running 0 5m34s pod/nginx-deployment-85996f8dbd-r5dt4 1/1 Running 0 5m34s ```

1.
Проверьте загрузку образа registry.local/alt/alt:
# kubectl run -it --image=registry.local/alt/alt -- bash
If you don´t see a command prompt, try pressing enter.
[root@bash /]# pwd

Подключение worker-узла

1.
Измените переменную PATH:
export PATH=/usr/libexec/podsec/u7s/bin/:$PATH
1.
Скопируйте команду подключния worker-узла, полученную на этапе установки начального master-узла. Запустите ее:
kubeadm join xxx.xxx.xxx.xxx:6443 --token ... --discovery-token-ca-cert-hash sha256:...

По окончании скрипт выводит текст:

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.
1.
Проверьте состояние дерева процессов:
# 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 запускаются как контейнеры от соответствующих образов registry.local/k8s-c10f1/kube-proxy:v1.26.3, registry.local/k8s-c10f1/flannel:v0.19.2.

4 Зайдите на master-узел и проверьте подключение worker-узла: ```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 ```

1.
На master-узле под пользоваталем root выполните команду:
# machinectl shell u7s-admin@ ~u7s-admin/usernetes/boot/nsenter.sh \

kubectl apply -f ~u7s-admin/usernetes/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.
1.
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-flannel kube-flannel-ds 2 2 2 2 1 none 102s kube-system kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 8h `` ЧислоREADYкаждогоdaemonsetдолжно быть равно числуDESIRED` и должно быть равно числу узлов кластера.

EXAMPLES

podsec-u7s-kubeadm init podsec-u7s-kubeadm join 102.168.122.32:6443 --token ... --discovery-token-ca-cert-hash ...

SECURITY CONSIDERATIONS

Так как все работа с кластером производится по REST-интерфейсу, то для обеспечения повышенных мер безопасности следует заводить ВСЕХ пользователей, включая администратора безопасности средства контейнеризации ВНЕ узлов кластера. Для работы с кластером достаточно команды kubectl, входящую в пакет kubernetes-client.

SEE ALSO

  • Kubernetes https://www.altlinux.org/Kubernetes;
  • Usernetes: Kubernetes without the root privileges https://github.com/rootless-containers/usernetes;
  • Настройка аудита API-сервиса https://github.com/alt-cloud/podsec/blob/master/k8s/RBAC/addUser/clusterroleBinding.md;

AUTHOR

Костарев Алексей, Базальт СПО kaf@basealt.ru

July 2023