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 |
