{"id":499103,"date":"2026-10-18T13:10:28","date_gmt":"2026-10-18T10:10:28","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=499103"},"modified":"2026-10-18T13:10:28","modified_gmt":"2026-10-18T10:10:28","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=499103","title":{"rendered":"Cilium \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 Load Balancer \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e Kind-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 Gateway API"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u2014 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 Gateway API \u0438 Cilium, \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0433\u043e \u0432 \u0440\u043e\u043b\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043d\u0434, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Cilium \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.<\/p>\n<hr\/>\n<blockquote>\n<p><strong>\u26a0\ufe0f \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430:<\/strong><\/p>\n<p>\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 Linux-\u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438\u0437 9 \u043d\u043e\u0434 (1 control-plane + 8 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 4 \u0426\u041f\u0423 \u0438 16 \u0413\u0431 \u041e\u0417\u0423.<\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kind. \u0412 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 CNI \u0438 kube-proxy, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Cilium. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438 \u0432\u043e\u0440\u043a\u0435\u0440-\u043d\u043e\u0434\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u043f\u0443\u043b\u044b \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u0440\u043e\u043b\u044f\u043c (\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, MLflow, SeaweedFS \u0438 Web). \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 (taints) \u0438 \u043c\u0435\u0442\u043e\u043a (labels). \u0422\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<h3>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h3>\n<pre><code class=\"bash\">kind create cluster --name testlb --config infrastructure\/kind\/kind-config.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f Kind &#8212; <\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/infrastructure\/kind\/kind-config.yaml?rev=main\" rel=\"noopener nofollow\"><strong>infrastructure\/kind\/kind-config.yaml<\/strong><\/a><\/p>\n<pre><code class=\"yaml\">kind: ClusterapiVersion: kind.x-k8s.io\/v1alpha4 networking:  disableDefaultCNI: true # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 Kindnet  kubeProxyMode: \"none\" # \u0423\u0431\u0438\u0440\u0430\u0435\u043c kube-proxynodes:- role: control-plane# systempool- role: worker# DATABASES - jupyterhub &amp; mlflow- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"databasesnode=yesnaff\"          register-with-taints: \"databasetaint=yestaint:NoSchedule\"- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"databasesnode=yesnaff\"          register-with-taints: \"databasetaint=yestaint:NoSchedule\"- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"databasesnode=yesnaff\"          register-with-taints: \"databasetaint=yestaint:NoSchedule\"# mlflow- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"mlflownode=yesnaff\"          register-with-taints: \"mlflowtaint=yestaint:NoSchedule\"# seaweedfs- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"seaweedfsnode=yesnaff\"          register-with-taints: \"seaweedfstaint=yestaint:NoSchedule\"# WEB- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"webnode=yesnaff\"          register-with-taints: \"webtaint=yestaint:NoSchedule\"- role: worker  kubeadmConfigPatches:    - |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: \"webnode=yesnaff\"          register-with-taints: \"webtaint=yestaint:NoSchedule\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e Kind \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/strong><\/p>\n<p>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a Kind \u0441 \u0444\u043b\u0430\u0433\u043e\u043c &#8212;retain<\/p>\n<pre><code class=\"bash\">kind create cluster --name testlb --config infrastructure\/kind\/kind-config.yaml --retain<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \/etc\/kubernetes\/admin.conf \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 testlb-control-plane<\/p>\n<pre><code class=\"bash\">docker exec -it testlb-control-plane cat \/etc\/kubernetes\/admin.conf &gt; ~\/.kube\/config<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c control-plane<\/p>\n<pre><code class=\"bash\">kubectl get noOutput:NAME                   STATUS     ROLES           AGE     VERSIONtestlb-control-plane   NotReady   control-plane   2m59s   v1.37.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0434 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c &#8212;print-join-command \u0447\u0435\u0440\u0435\u0437 docker exec<\/p>\n<pre><code class=\"bash\">docker exec -it testlb-control-plane kubeadm token create --print-join-command<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>Output:<\/p>\n<p>\u00a0\u00a0kubeadm join testlb-control-plane:6443 &#8212;token uvukvj.40pf1jzlosjffgar &#8212;discovery-token-ca-cert-hash sha256:ee6183fc29377ab060e9e5ff01b2956611ea9b8a153cd2696dd5b3da4316d644  <\/p>\n<p>\u041a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043b\u0430\u0433 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8212;ignore-preflight-errors=SystemVerification,Swap<\/p>\n<pre><code class=\"bash\">docker ps --format '{{.Names}}' | grep testlb-worker | xargs -I {} docker exec -t {} kubeadm join testlb-control-plane:6443 --token uvukvj.40pf1jzlosjffgar --discovery-token-ca-cert-hash sha256:ee6183fc29377ab060e9e5ff01b2956611ea9b8a153cd2696dd5b3da4316d644  --ignore-preflight-errors=SystemVerification,Swap<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u00a0\u00a0docker ps &#8212;format &#8216;{{.Names}}&#8217; | grep testlb-worker | xargs -I {} docker exec -t {} kubeadm join testlb-control-plane:6443 &#8212;token uvukvj.40pf1jzlosjffgar &#8212;discovery-token-ca-cert-hash sha256:ee6183fc29377ab060e9e5ff01b2956611ea9b8a153cd2696dd5b3da4316d644  &#8212;ignore-preflight-errors=SystemVerification,Swap <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<pre><code class=\"bash\">kubectl get no# Output:NAME                   STATUS     ROLES           AGE     VERSIONtestlb-control-plane   NotReady   control-plane   17m     v1.37.0testlb-worker          NotReady   &lt;none&gt;          2m31s   v1.37.0testlb-worker2         NotReady   &lt;none&gt;          2m23s   v1.37.0testlb-worker3         NotReady   &lt;none&gt;          2m27s   v1.37.0testlb-worker4         NotReady   &lt;none&gt;          2m22s   v1.37.0testlb-worker5         NotReady   &lt;none&gt;          2m30s   v1.37.0testlb-worker6         NotReady   &lt;none&gt;          2m26s   v1.37.0testlb-worker7         NotReady   &lt;none&gt;          2m29s   v1.37.0testlb-worker8         NotReady   &lt;none&gt;          2m24s   v1.37.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u201cK8s in Docker\u201d \u0447\u0435\u0440\u0435\u0437 kubeadm join, \u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u0438 \u0442\u0435\u0439\u043d\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 kubectl label \u0438 kubectl taint.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u2014 testlb, \u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439<\/p>\n<pre><code class=\"bash\">w_idx=1; while read -r line; do if [[ \"$line\" =~ \"role: worker\" ]]; \\then [ $w_idx -eq 1 ] &amp;&amp; name=\"testlb-worker\" || name=\"testlb-worker$w_idx\"; num=$(echo \"$line\" | cut -d: -f1); \\labels=$(sed -n \"$num,\/role:\/p\" infrastructure\/kind\/kind-config.yaml | grep \"node-labels:\" | \\sed -E 's\/.*node-labels:[[:space:]]*\"([^\"]+)\".*\/\\1\/'); taints=$(sed -n \"$num,\/role:\/p\" infrastructure\/kind\/kind-config.yaml | grep \"register-with-taints:\" | \\sed -E 's\/.*register-with-taints:[[:space:]]*\"([^\"]+)\".*\/\\1\/'); [ -n \"$labels\" ] &amp;&amp; kubectl label node \"$name\" \"$labels\" --overwrite; [ -n \"$taints\" ] \\&amp;&amp; kubectl taint node \"$name\" \"$taints\" --overwrite; ((w_idx++)); fi; done &lt; &lt;(grep -n \"role:\" infrastructure\/kind\/kind-config.yaml)# Output:node\/testlb-worker2 labelednode\/testlb-worker2 modifiednode\/testlb-worker3 labelednode\/testlb-worker3 modifiednode\/testlb-worker4 labelednode\/testlb-worker4 modifiednode\/testlb-worker5 labelednode\/testlb-worker5 modifiednode\/testlb-worker6 labelednode\/testlb-worker6 modifiednode\/testlb-worker7 labelednode\/testlb-worker7 modifiednode\/testlb-worker8 labelednode\/testlb-worker8 modified<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c taints \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043d\u043e\u0434 \u0432 Kind<\/p>\n<pre><code class=\"bash\">kubectl get no -o custom-columns=\"NAME:.metadata.name,TAINTS:.spec.taints[*].key\"# Output:NAME                   TAINTStestlb-control-plane   node-role.kubernetes.io\/control-planetestlb-worker          &lt;none&gt;testlb-worker2         databasetainttestlb-worker3         databasetainttestlb-worker4         databasetainttestlb-worker5         mlflowtainttestlb-worker6         seaweedfstainttestlb-worker7         webtainttestlb-worker8         webtaint<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043c\u0435\u0442\u043a\u0438<\/p>\n<pre><code class=\"bash\">kubectl get no --show-labels | awk 'NR==1 {printf \"%-25s %s\\n\", \"NAME\", \"YESNAFF_LABELS\"} NR&gt;1 {labels=\"\"; \\for(i=1;i&lt;=NF;i++) if($i ~ \/=yesnaff\/) {split($i, a, \",\"); for(j in a) if(a[j] ~ \/=yesnaff\/) labels=labels a[j] \" \"}; \\if(labels==\"\") labels=\"&lt;none&gt;\"; printf \"%-25s %s\\n\", $1, labels}'# Output:NAME                      YESNAFF_LABELStestlb-control-plane      &lt;none&gt;testlb-worker             &lt;none&gt;testlb-worker2            databasesnode=yesnaff testlb-worker3            databasesnode=yesnaff testlb-worker4            databasesnode=yesnaff testlb-worker5            mlflownode=yesnaff testlb-worker6            seaweedfsnode=yesnaff testlb-worker7            webnode=yesnaff testlb-worker8            webnode=yesnaff <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c StorageClasses<\/p>\n<pre><code class=\"bash\">kubectl get storageclasses.storage.k8s.io# Output:No resources found<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b SC \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<pre><code class=\"bash\">kubectl apply -f https:\/\/raw.githubusercontent.com\/rancher\/local-path-provisioner\/v0.0.37\/deploy\/local-path-storage.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 StorageClass \u201cstandard\u201d. Kind \u0441\u043e\u0437\u0434\u0430\u0451\u0442 SC \u0441 \u0438\u043c\u0435\u043d\u0435\u043c standard \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<pre><code class=\"bash\">kubectl apply -f - &lt;&lt;EOFapiVersion: storage.k8s.io\/v1kind: StorageClassmetadata:  name: standardprovisioner: rancher.io\/local-pathvolumeBindingMode: WaitForFirstConsumerreclaimPolicy: DeleteallowVolumeExpansion: falseEOF<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c SC<\/p>\n<pre><code class=\"bash\">kubectl get storageclasses.storage.k8s.io# Output:NAME         PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGElocal-path   rancher.io\/local-path   Delete          WaitForFirstConsumer   false                  2m14sstandard     rancher.io\/local-path   Delete          WaitForFirstConsumer   false                  2m7s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong><\/p>\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u0443\u043b\u0430\u043c \u043d\u043e\u0434. \u0412 \u043d\u0430\u0448\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 Kind \u043c\u044b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0441\u044b\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0443 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0443\u044e \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044e. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432 (Scheduling), \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Cilium.<\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a:<\/p>\n<ul>\n<li>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0443\u043b (System \u043d\u043e\u0434\u0430) \u2014 \u043e\u0434\u043d\u0430 \u043d\u043e\u0434\u0430 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a \u0438 \u0442\u0435\u0439\u043d\u0442\u043e\u0432. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (JupyterHub DB + MLflow DB) \u2014 \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0411\u0414 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u043d\u043e\u0434\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430\u0448\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043c\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f JupyterHub \u0438 MLflow \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u043f\u0443\u043b\u0435 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043d\u043e\u0434. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u0434\u044b \u0442\u0443\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438, \u043c\u044b \u0437\u0430\u043a\u0440\u043e\u0435\u043c \u044d\u0442\u0438 \u043d\u043e\u0434\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0439\u043d\u0442\u043e\u043c (Taint) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0435\u0439\u0431\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (JupyterHub + MLflow) \u2014 \u0441\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u044b JupyterHub \u0438 MLflow \u043c\u044b \u043f\u043e\u0441\u0435\u043b\u0438\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u043e\u0434\u0435. \u042d\u0442\u043e \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>SeaweedFS \u2014 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043e\u0434\u043d\u0443 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u043d\u043e\u0434\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0443\u043b (Web-\u043d\u043e\u0434\u044b) \u2014 \u0434\u0432\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u043e\u0434\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0432\u0435\u0431-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u043b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0438 High Availability (HA) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Cilium LoadBalancer.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0433\u0438\u0431\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f nodeAffinity \u0438 tolerations, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a Cilium \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0448\u0443\u044e \u0432\u0435\u0431-\u043d\u043e\u0434\u0443 \u043f\u0440\u0438 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0430\u0432\u0430\u0440\u0438\u0438 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0443\u0437\u043b\u043e\u0432.<\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Gateway API CRD<\/h3>\n<pre><code class=\"bash\"># \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f CRDGW_API=\"https:\/\/raw.githubusercontent.com\/kubernetes-sigs\/gateway-api\/v1.6.1\/config\/crd\/standard\"kubectl apply --server-side -f ${GW_API}\/gateway.networking.k8s.io_gatewayclasses.yaml \\  -f ${GW_API}\/gateway.networking.k8s.io_gateways.yaml \\  -f ${GW_API}\/gateway.networking.k8s.io_httproutes.yaml \\  -f ${GW_API}\/gateway.networking.k8s.io_referencegrants.yaml \\  -f ${GW_API}\/gateway.networking.k8s.io_grpcroutes.yaml \\  -f ${GW_API}\/gateway.networking.k8s.io_backendtlspolicies.yaml \\  -f ${GW_API}\/gateway.networking.k8s.io_tlsroutes.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Cilium<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 Gateway API \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u0441\u0430\u043c\u043e\u0433\u043e Cilium.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Kind-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0440\u0435\u0437\u0430\u043b\u0438 kube-proxy, Cilium \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0430\u0440\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0431\u0435\u0440\u044f \u043d\u0430 \u0441\u0435\u0431\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439.<\/p>\n<p><strong>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0434\u0435\u043f\u043b\u043e\u0439<\/strong><\/p>\n<pre><code class=\"bash\"># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Ciliumhelm repo add cilium https:\/\/helm.cilium.io\/helm repo update# \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438helm upgrade --install cilium -f infrastructure\/cilium\/values.yaml -n kube-system cilium\/cilium --create-namespace --version 1.20.2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>*<em>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 values-\u0444\u0430\u0439\u043b\u0430 \u2014 <\/em><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/infrastructure\/cilium\/values.yaml?rev=main\" rel=\"noopener nofollow\"><em>infrastructure\/cilium\/values.yaml*<\/em><\/a><\/p>\n<pre><code class=\"yaml\">k8sServiceHost: \"testlb-control-plane\"k8sServicePort: \"6443\"l2announcements:  enabled: truegatewayAPI:  enabled: truekubeProxyReplacement: \"true\"hubble:  enabled: true  relay:    enabled: true  ui:    enabled: true<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>k8sServiceHost \u0438 k8sServicePort \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 Cilium \u0438\u043c\u044f Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u043d\u043e\u0434\u044b (testlb-control-plane) \u0438 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Cilium \u043a API-\u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<\/li>\n<li>\n<p>kubeProxyReplacement: \u201ctrue\u201d \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 kube-proxy \u043d\u0430 eBPF \u0434\u043b\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>l2announcements.enabled: true \u2014 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Layer 2 \u0430\u043d\u043e\u043d\u0441\u043e\u0432 (ARP), \u0447\u0442\u043e\u0431\u044b Cilium \u043c\u043e\u0433 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0442\u0438\u043f\u0430 LoadBalancer \u0432 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 Docker.<\/p>\n<\/li>\n<li>\n<p>gatewayAPI.enabled: true \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Kubernetes Gateway API \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><code>hubble.enabled<\/code>, <code>relay.enabled<\/code> \u0438 <code>ui.enabled<\/code> \u2014 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u044e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 Hubble \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (Hubble UI).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0426\u0435\u043b\u044c \u0441\u0442\u0435\u043d\u0434\u0430 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/h3>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0432\u0435\u0431-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 MLOps-\u0441\u0442\u0435\u043a. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>JupyterHub \u2014 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>MLflow \u2014 \u0434\u043b\u044f \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>CloudNativePG (CNPG) \u2014 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 PostgreSQL \u0434\u043b\u044f \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>SeaweedFS \u2014 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/h2>\n<pre><code class=\"bash\"># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439helm repo add cnpg https:\/\/cloudnative-pg.github.io\/chartshelm repo add jupyterhub https:\/\/hub.jupyter.org\/helm-chart\/helm repo add seaweedfs https:\/\/seaweedfs.github.io\/seaweedfs\/helm# \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448 \u0447\u0430\u0440\u0442\u043e\u0432helm repo update<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 CloudNativePG (\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 PostgreSQL)<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 CloudNativePG (CNPG). \u041e\u043d \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0421\u0423\u0411\u0414 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c\u044e \u0438 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u041c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 Helm \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d cnpg-system.<\/p>\n<p><strong>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/strong> \u0414\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432\u0435\u0440\u0441\u0438\u0438 v0.29.1 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code class=\"bash\">helm upgrade --install cnpg -f infrastructure\/operators\/cnpg\/values.yaml -n cnpg-system    --create-namespace cnpg\/cloudnative-pg --version 0.29.1 <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/infrastructure\/operators\/cnpg\/values.yaml?rev=main\" rel=\"noopener nofollow\">values &#8212; infrastructure\/operators\/cnpg\/values.yaml <\/a><\/p>\n<p>\u0416\u0434\u0451\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/p>\n<pre><code class=\"bash\">kubectl -n cnpg-system rollout status deployment\/cnpg-cloudnative-pg --timeout=5m# Output:deployment \"cnpg-cloudnative-pg\" successfully rolled out<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410 \u0434\u0432\u0443\u0445 PG \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0434\u043b\u044f JupyterHub \u0438 mlflow<\/h3>\n<p><strong>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f namespace \u0438 CR \u0434\u043b\u044f \u0411\u0414 JupyterHub \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043f\u043e \u043f\u0443\u0442\u0438 &#8212; <\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/database\/jupyter\/postgres-cluster.yaml?rev=main\" rel=\"noopener nofollow\"><strong>platform\/database\/jupyter\/postgres-cluster.yaml<\/strong><\/a><\/p>\n<pre><code class=\"bash\">kubectl apply -f platform\/database\/jupyter\/postgres-cluster.yaml# Output:namespace\/jnhdb configuredcluster.postgresql.cnpg.io\/cluster-jnhdb created<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/database\/jupyter\/postgres-cluster.yaml?rev=main\" rel=\"noopener nofollow\">platform\/database\/jupyter\/postgres-cluster.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: v1kind: Namespacemetadata:  labels:  name: jnhdb---apiVersion: postgresql.cnpg.io\/v1kind: Clustermetadata:  name: cluster-jnhdb  namespace: jnhdbspec:  instances: 3  # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u043d\u043e\u0434\u044b  affinity:    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        nodeSelectorTerms:        - matchExpressions:          - key: databasesnode            operator: In            values:            - \"yesnaff\"    # \u0414\u043e\u043f\u0443\u0441\u043a \u043d\u0430 \u043d\u043e\u0434\u044b \u0441 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0439\u043d\u0442\u043e\u043c    tolerations:    - key: \"databasetaint\"      operator: \"Equal\"      value: \"yestaint\"      effect: \"NoSchedule\"  # \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  bootstrap:    initdb:      database: jupyterhub  storage:    size: 5Gi    storageClass: standard<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f namespace \u0438 CR \u0434\u043b\u044f \u0411\u0414 MLflow \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043f\u043e \u043f\u0443\u0442\u0438 \u2014 <\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/database\/mlflow\/postgres-cluster.yaml?rev=main\" rel=\"noopener nofollow\"><strong>platform\/database\/mlflow\/postgres-cluster.yaml<\/strong><\/a><\/p>\n<pre><code class=\"bash\">kubectl apply -f platform\/database\/mlflow\/postgres-cluster.yaml# Output:namespace\/mlflowdb createdcluster.postgresql.cnpg.io\/cluster-mlflowdb created<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/database\/mlflow\/postgres-cluster.yaml?rev=main\" rel=\"noopener nofollow\">platform\/database\/mlflow\/postgres-cluster.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: v1kind: Namespacemetadata:  labels:  name: mlflowdb---apiVersion: postgresql.cnpg.io\/v1kind: Clustermetadata:  name: cluster-mlflowdb  namespace: mlflowdbspec:  instances: 3  # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u043d\u043e\u0434\u044b  affinity:    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        nodeSelectorTerms:        - matchExpressions:          - key: databasesnode            operator: In            values:            - \"yesnaff\"    # \u0414\u043e\u043f\u0443\u0441\u043a \u043d\u0430 \u043d\u043e\u0434\u044b \u0441 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u044e\u0449\u0438\u043c \u0442\u0435\u0439\u043d\u0442\u043e\u043c    tolerations:    - key: \"databasetaint\"      operator: \"Equal\"      value: \"yestaint\"      effect: \"NoSchedule\"  # \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  bootstrap:    initdb:      database: mlflow  # \u0412\u043c\u0435\u0441\u0442\u043e \"app\" \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0411\u0414 \"mlflow\"  storage:    size: 5Gi    storageClass: standard<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 SeaweedFS (S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435)<\/h3>\n<p>\u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432, \u043b\u043e\u0433\u043e\u0432 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u0437 MLflow \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f SeaweedFS, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Helm \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d seaweedfs \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 API.<\/p>\n<p><strong>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/strong><\/p>\n<pre><code class=\"bash\">helm upgrade --install seaweedfs -f platform\/seaweedfs\/values.yaml -n seaweedfs --create-namespace seaweedfs\/seaweedfs<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0432 <\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/seaweedfs\/values.yaml?rev=main\" rel=\"noopener nofollow\"><strong>platform\/seaweedfs\/values.yaml<\/strong><\/a><strong> \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0441\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c nodeAffinity \u0438 tolerations \u043d\u0438\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e values<\/strong><\/p>\n<pre><code class=\"yaml\">master:  enabled: true  affinity: |    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        nodeSelectorTerms:        - matchExpressions:          - key: seaweedfsnode            operator: In            values:            - \"yesnaff\"    podAntiAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        - labelSelector:            matchLabels:              app.kubernetes.io\/name: {{ template \"seaweedfs.name\" . }}              app.kubernetes.io\/instance: {{ .Release.Name }}              app.kubernetes.io\/component: master          topologyKey: kubernetes.io\/hostname  tolerations: |    - key: \"seaweedfstaint\"      operator: \"Equal\"      value: \"yestaint\"      effect: \"NoSchedule\"volume:  enabled: true  affinity: |    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        nodeSelectorTerms:        - matchExpressions:          - key: seaweedfsnode            operator: In            values:            - \"yesnaff\"    podAntiAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        - labelSelector:            matchLabels:              app.kubernetes.io\/name: {{ template \"seaweedfs.name\" . }}              app.kubernetes.io\/instance: {{ .Release.Name }}              app.kubernetes.io\/component: {{ $volumeName }}          topologyKey: kubernetes.io\/hostname  tolerations: |    - key: \"seaweedfstaint\"      operator: \"Equal\"      value: \"yestaint\"      effect: \"NoSchedule\"filer:  enabled: true  affinity: |    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        nodeSelectorTerms:        - matchExpressions:          - key: seaweedfsnode            operator: In            values:            - \"yesnaff\"    podAntiAffinity:      requiredDuringSchedulingIgnoredDuringExecution:        - labelSelector:            matchLabels:              app.kubernetes.io\/name: {{ template \"seaweedfs.name\" . }}              app.kubernetes.io\/instance: {{ .Release.Name }}              app.kubernetes.io\/component: filer          topologyKey: kubernetes.io\/hostname  tolerations: |    - key: \"seaweedfstaint\"      operator: \"Equal\"      value: \"yestaint\"      effect: \"NoSchedule\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u0438\u043c\u0451\u043d \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0434\u043b\u044f JupyterHub \u0438 MLflow<\/h3>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u0438\u043c\u0451\u043d:<\/strong><\/p>\n<pre><code class=\"bash\">kubectl create ns jupyterhub; kubectl create ns  mlflow <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0411\u0414 \u0434\u043b\u044f JupyterHub:<\/strong><\/p>\n<pre><code class=\"bash\">kubectl -n jnhdb get secret cluster-jnhdb-app -o json | jq '.type = \"Opaque\" | {apiVersion: .apiVersion, kind: .kind, type: .type, metadata: {name: \"jupyterhub-db-secret\"}, data: {\"hub.db.password\": .data.password}}' | kubectl apply -f - -n jupyterhub<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u043c \u0441\u0442\u0440\u043e\u043a<\/p>\n<p>kubectl -n jnhdb get secret cluster-jnhdb-app -o json | jq &#8216;.type = &#171;Opaque&#187; | {apiVersion: .apiVersion, kind: .kind, type: .type, metadata: {name: &#171;jupyterhub-db-secret&#187;}, data: {&#171;hub.db.password&#187;: .data.password}}&#8217; | kubectl apply -f &#8212; -n jupyterhub <\/p>\n<p><strong>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (URI) \u0411\u0414 \u0434\u043b\u044f MLflow:<\/strong><\/p>\n<pre><code class=\"bash\">kubectl -n mlflowdb get secret cluster-mlflowdb-app -o json | jq '.type = \"Opaque\" | {apiVersion: .apiVersion, kind: .kind, type: .type, metadata: {name: \"mlflow-db-secret\"}, data: {\"uri\": .data.uri}}' | kubectl apply -f - -n mlflow<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u043c \u0441\u0442\u0440\u043e\u043a<\/p>\n<p>kubectl -n mlflowdb get secret cluster-mlflowdb-app -o json | jq &#8216;.type = &#171;Opaque&#187; | {apiVersion: .apiVersion, kind: .kind, type: .type, metadata: {name: &#171;mlflow-db-secret&#187;}, data: {&#171;uri&#187;: .data.uri}}&#8217; | kubectl apply -f &#8212; -n mlflow <\/p>\n<p><strong>\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 S3 SeaweedFS \u0434\u043b\u044f MLflow:<\/strong><\/p>\n<pre><code class=\"bash\">kubectl -n seaweedfs get secret seaweedfs-s3-secret -o json | jq '.type = \"Opaque\" | {apiVersion: .apiVersion, kind: .kind, type: .type, metadata: {name: \"mlflow-s3-env-secret\"}, data: {\"AWS_ACCESS_KEY_ID\": .data.admin_access_key_id, \"AWS_SECRET_ACCESS_KEY\": .data.admin_secret_access_key}}' | kubectl apply -f - -n mlflow<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u043c \u0441\u0442\u0440\u043e\u043a<\/p>\n<p>kubectl -n seaweedfs get secret seaweedfs-s3-secret -o json | jq &#8216;.type = &#171;Opaque&#187; | {apiVersion: .apiVersion, kind: .kind, type: .type, metadata: {name: &#171;mlflow-s3-env-secret&#187;}, data: {&#171;AWS_ACCESS_KEY_ID&#187;: .data.admin_access_key_id, &#171;AWS_SECRET_ACCESS_KEY&#187;: .data.admin_secret_access_key}}&#8217; | kubectl apply -f &#8212; -n mlflow <\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 JupyterHub<\/h3>\n<p>\u0414\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>JupyterHub<\/code>. \u041c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 Helm \u0432 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d <code>jupyterhub<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0435\u0440\u0441\u0438\u044e 4.4.2.<\/p>\n<p><strong>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:<\/strong><\/p>\n<pre><code class=\"bash\">helm upgrade --cleanup-on-fail --install jupyterhub jupyterhub\/jupyterhub --namespace jupyterhub --version 4.4.2  --values platform\/jupyter\/values.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f values-\u0444\u0430\u0439\u043b\u0430 JupyterHub (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b tolerations \u0438 nodeAffinity) \u2014 <\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/jupyter\/values.yaml?rev=main\" rel=\"noopener nofollow\"><strong>platform\/jupyter\/values.yam<\/strong><\/a><strong>l<\/strong><\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043c\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e <a href=\"https:\/\/zero-to-jupyterhub-k8s.readthedocs.io\/reference.html#scheduling-corepods-nodeaffinity\" rel=\"noopener nofollow\">Zero to JupyterHub K8s<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430\u0439\u0434\u0451\u043c \u043d\u043e\u0434\u0443 \u0441 \u0442\u0435\u0439\u043d\u0442\u043e\u043c <code>mlflowtaint<\/code><\/p>\n<pre><code class=\"bash\">kubectl get no -o custom-columns=\"NAME:.metadata.name,TAINTS:.spec.taints[*].key\"# Output:NAME                   TAINTStestlb-control-plane   node-role.kubernetes.io\/control-plane...testlb-worker5         mlflowtaint...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043a\u0443 hub.jupyter.org\/node-purpose=core \u0434\u043b\u044f \u043d\u043e\u0434\u044b testlb-worker5<\/strong><\/p>\n<pre><code class=\"bash\">kubectl label nodes testlb-worker5 hub.jupyter.org\/node-purpose=core<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 values-\u0444\u0430\u0439\u043b (<\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/jupyter\/values.yaml?rev=main\" rel=\"noopener nofollow\"><strong>platform\/jupyter\/values.yaml<\/strong><\/a><strong>), \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0432 \u043d\u0451\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/strong><\/p>\n<pre><code class=\"yaml\">hub:  # tolerations: []  tolerations:  - key: \"mlflowtaint\"    operator: \"Equal\"    value: \"yestaint\"    effect: \"NoSchedule\"  db:    # type: sqlite-pvc    # upgrade:    # pvc:    #   annotations: {}    #   selector: {}    #   accessModes:    #     - ReadWriteOnce    #   storage: 1Gi    #   subPath:    #   storageClassName:    # url:    # password:    type: postgres    url: postgresql+psycopg2:\/\/jupyterhub@cluster-jnhdb-rw.jnhdb:5432\/jupyterhub  # existingSecret:  existingSecret: \"jupyterhub-db-secret\"singleuser:  extraNodeAffinity:    required:      - matchExpressions:        - key: mlflownode          operator: In          values:          - \"yesnaff\"    # required: []    # preferred: []scheduling:  corePods:    tolerations:      - key: hub.jupyter.org\/dedicated        operator: Equal        value: core        effect: NoSchedule      - key: hub.jupyter.org_dedicated        operator: Equal        value: core        effect: NoSchedule      - key: \"mlflowtaint\"        operator: \"Equal\"        value: \"yestaint\"        effect: \"NoSchedule\"    nodeAffinity:      matchNodePurpose: prefer  userPods:    tolerations:      - key: hub.jupyter.org\/dedicated        operator: Equal        value: user        effect: NoSchedule      - key: hub.jupyter.org_dedicated        operator: Equal        value: user        effect: NoSchedule      - key: \"mlflowtaint\"        operator: \"Equal\"        value: \"yestaint\"        effect: \"NoSchedule\"    nodeAffinity:      matchNodePurpose: ignore # prefer<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MLflow<\/h3>\n<p><strong>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 Helm:<\/strong><\/p>\n<pre><code class=\"bash\">helm upgrade --install mlflow oci:\/\/ghcr.io\/mlflow\/charts\/mlflow --version 3.17.0 --namespace mlflow  --values platform\/mlflow\/values.yaml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <\/strong><a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/mlflow\/values.yaml?rev=main\" rel=\"noopener nofollow\"><strong>platform\/mlflow\/values.yaml<\/strong><\/a><\/p>\n<pre><code class=\"yaml\">mlflow:  backendStoreUriFrom:    secretKeyRef:      name: mlflow-db-secret      key: uri  defaultArtifactRoot: \"mlflow-artifacts:\/\"   artifactsDestination: \"s3:\/\/mlflow\"env:  - name: MLFLOW_S3_ENDPOINT_URL    value: \"http:\/\/seaweedfs-s3.seaweedfs.svc.cluster.local:8333\"  - name: AWS_DEFAULT_REGION    value: \"us-east-1\"  - name: MLFLOW_SERVER_ALLOWED_HOSTS    value: \"172.18.255.240,mlflow-mlflow.mlflow.svc.cluster.local,mlflow-mlflow.mlflow.svc.cluster.local:5000,localhost,127.0.0.1\"  - name: MLFLOW_SERVER_CORS_ALLOWED_ORIGINS    value: \"http:\/\/172.18.255.240\"envFrom:  - secretRef:      name: mlflow-s3-env-secretserver:  staticPrefix: \"\/mlflow\"tolerations:- key: \"mlflowtaint\"  operator: \"Equal\"  value: \"yestaint\"  effect: \"NoSchedule\"affinity:  nodeAffinity:    requiredDuringSchedulingIgnoredDuringExecution:      nodeSelectorTerms:      - matchExpressions:        - key: mlflownode          operator: In          values:          - \"yesnaff\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 CiliumLoadBalancerIPPool<\/h3>\n<pre><code class=\"bash\">docker network inspect kind -f '{{range .IPAM.Config}}{{.Subnet}} {{end}}'# Output:fc00:f853:ccd:e793::\/64 172.18.0.0\/16<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u0441\u043a\u0443 \/28<\/strong> \u0427\u0442\u043e\u0431\u044b \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430\u0448\u0438\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 IP-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u043d\u043e\u0434 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0449\u0451 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0432\u043e\u0440\u043a\u0435\u0440-\u043d\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 <code>kubeadm join<\/code>), \u043c\u044b \u0443\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u0441\u0435\u0442\u0438 \u2014 \u043d\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d <code>172.18.255.X<\/code>.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u0430\u0441\u043a\u0430 <strong>\/28<\/strong> \u0438 \u0430\u0434\u0440\u0435\u0441 <strong>172.18.255.240<\/strong>? \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 \u0441 JupyterHub \u0438 MLflow \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0441\u043e\u0442\u043d\u0438 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u0441\u0435\u0442\u044c: <code>172.18.255.240\/28<\/code><\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432: \u043e\u0442 <code>172.18.255.241<\/code> \u0434\u043e <code>172.18.255.254<\/code><\/p>\n<\/li>\n<li>\n<p>Broadcast-\u0430\u0434\u0440\u0435\u0441: <code>172.18.255.255<\/code><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"bash\">ipcalc 172.18.255.240\/28# Output:Address:   172.18.255.240       10101100.00010010.11111111.1111 0000Netmask:   255.255.255.240 = 28 11111111.11111111.11111111.1111 0000Wildcard:  0.0.0.15             00000000.00000000.00000000.0000 1111=&gt;Network:   172.18.255.240\/28    10101100.00010010.11111111.1111 0000HostMin:   172.18.255.241       10101100.00010010.11111111.1111 0001HostMax:   172.18.255.254       10101100.00010010.11111111.1111 1110Broadcast: 172.18.255.255       10101100.00010010.11111111.1111 1111Hosts\/Net: 14                    Class B, Private Internet<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/cilium\/clb.yaml?rev=main\" rel=\"noopener nofollow\">platform\/gateway\/cilium\/clb.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: cilium.io\/v2kind: CiliumLoadBalancerIPPoolmetadata:  name: kind-pool  namespace: kube-system  labels:    pool: kindspec:  blocks:  - cidr: 172.18.255.240\/28---apiVersion: cilium.io\/v2alpha1kind: CiliumL2AnnouncementPolicymetadata:  name: kind-l2-policy  namespace: kube-systemspec:  interfaces:  - ^eth[0-9]+  loadBalancerIPs: true  nodeSelector:    matchLabels:      webnode: \"yesnaff\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u043d\u043e\u043d\u0441\u044b \u0437\u0430\u0432\u044f\u0437\u044b\u0432\u0435\u043c \u043f\u043e matchLabels \u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0430 \u043d\u043e\u0434\u044b \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 webnode, \u044d\u0442\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u043e\u0434.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u0438\u043f\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/p>\n<pre><code>kubectl get svc -A# Output:NAMESPACE     NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                AGEcnpg-system   cnpg-webhook-service     ClusterIP   10.96.81.40     &lt;none&gt;        443\/TCP                                4h26mdefault       kubernetes               ClusterIP   10.96.0.1       &lt;none&gt;        443\/TCP                                8hjnhdb         cluster-jnhdb-r          ClusterIP   10.96.214.15    &lt;none&gt;        5432\/TCP                               4h18mjnhdb         cluster-jnhdb-ro         ClusterIP   10.96.97.73     &lt;none&gt;        5432\/TCP                               4h18mjnhdb         cluster-jnhdb-rw         ClusterIP   10.96.192.167   &lt;none&gt;        5432\/TCP                               4h18mjupyterhub    hub                      ClusterIP   10.96.53.24     &lt;none&gt;        8081\/TCP                               3h14mjupyterhub    proxy-api                ClusterIP   10.96.231.137   &lt;none&gt;        8001\/TCP                               3h14mjupyterhub    proxy-public             ClusterIP   10.96.61.233    &lt;none&gt;        80\/TCP                                 3h14mkube-system   cilium-envoy             ClusterIP   None            &lt;none&gt;        9964\/TCP                               4h36mkube-system   hubble-peer              ClusterIP   10.96.115.63    &lt;none&gt;        443\/TCP                                4h36mkube-system   kube-dns                 ClusterIP   10.96.0.10      &lt;none&gt;        53\/UDP,53\/TCP,9153\/TCP                 8hmlflow        mlflow-mlflow            ClusterIP   10.96.186.249   &lt;none&gt;        5000\/TCP                               36mmlflowdb      cluster-mlflowdb-r       ClusterIP   10.96.241.117   &lt;none&gt;        5432\/TCP                               3h31mmlflowdb      cluster-mlflowdb-ro      ClusterIP   10.96.82.54     &lt;none&gt;        5432\/TCP                               3h31mmlflowdb      cluster-mlflowdb-rw      ClusterIP   10.96.111.65    &lt;none&gt;        5432\/TCP                               3h31mseaweedfs     seaweedfs-filer          ClusterIP   None            &lt;none&gt;        8888\/TCP,18888\/TCP,8333\/TCP,9327\/TCP   3h18mseaweedfs     seaweedfs-filer-client   ClusterIP   None            &lt;none&gt;        8888\/TCP,18888\/TCP,9327\/TCP            3h18mseaweedfs     seaweedfs-master         ClusterIP   None            &lt;none&gt;        9333\/TCP,19333\/TCP,9327\/TCP            3h18mseaweedfs     seaweedfs-s3             ClusterIP   10.96.105.179   &lt;none&gt;        8333\/TCP                               3h18mseaweedfs     seaweedfs-volume         ClusterIP   None            &lt;none&gt;        8080\/TCP,18080\/TCP,9327\/TCP            3h18m<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 IP-\u0430\u0434\u0440\u0435\u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 (LoadBalancer) \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Gateway.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c namespace \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u201cinfra-gw-jml\u201d \u0432 \u043d\u0451\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u201cGateway\u201d<\/p>\n<pre><code class=\"bash\">kubectl create ns infra-gw-jml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0448\u043b\u044e\u0437\u0430 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/mlflow\/gateway.yaml?rev=main\" rel=\"noopener nofollow\">platform\/gateway\/mlflow\/gateway.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: gateway.networking.k8s.io\/v1kind: Gatewaymetadata:  name: jml-cilium-gateway  namespace: infra-gw-jml  annotations:    io.cilium\/lb-ipam-pool: kind-poolspec:  gatewayClassName: cilium  listeners:  - name: http    protocol: HTTP    port: 80    allowedRoutes:      namespaces:        from: All<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0442\u0438\u043f\u0430 LoadBalancer<\/p>\n<pre><code class=\"bash\">kubectl get svc -A|grep -E LoadBalancer\\|TYPE# Output:NAMESPACE      NAME                                TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                AGEinfra-gw-jml   cilium-gateway-jml-cilium-gateway   LoadBalancer   10.96.107.1     172.18.255.240   80:31109\/TCP                           5m11s<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 EXTERNAL-IP \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043b\u0441\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b IP 172.18.255.240.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430<\/p>\n<pre><code class=\"bash\">curl -I http:\/\/172.18.255.240\/# Output:HTTP\/1.1 404 Not Founddate: Mon, 15 Oct 2026 17:23:46 GMTserver: envoytransfer-encoding: chunked<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c HTTPRoute \u2014 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/mlflow\/HTTPRoute-jupyterhub.yaml?rev=main\" rel=\"noopener nofollow\">platform\/gateway\/mlflow\/HTTPRoute-jupyterhub.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: gateway.networking.k8s.io\/v1kind: HTTPRoutemetadata:  name: web-route  namespace: jupyterhub # \u041f\u0415\u0420\u0415\u041d\u0415\u0421\u041b\u0418 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044fspec:  parentRefs:  - name: jml-cilium-gateway    namespace: infra-gw-jml # \u042f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0448\u043b\u044e\u0437 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c ns  rules:  - matches:    - path:        type: PathPrefix        value: \/    backendRefs:    - name: proxy-public # \u0427\u0438\u0441\u0442\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0435\u0437 \u0442\u043e\u0447\u0435\u043a      namespace: jupyterhub # \u042f\u0412\u041d\u041e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430      port: 80<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0438\u0449\u0435\u043c \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u201cHTTP\/1.1 200 OK\u201d<\/p>\n<pre><code class=\"bash\">curl -o \/dev\/null -s -v http:\/\/172.18.255.240\/hub\/login# Output:*   Trying 172.18.255.240:80...* Established connection to 172.18.255.240 (172.18.255.240 port 80) from 172.18.0.2 port 52214 * using HTTP\/1.x&gt; GET \/hub\/login HTTP\/1.1&gt; Host: 172.18.255.240&gt; User-Agent: curl\/8.18.0&gt; Accept: *\/*&gt; * Request completely sent off&lt; HTTP\/1.1 200 OK&lt; server: envoy&lt; content-type: text\/html&lt; date: Mon, 17 Oct 2026 17:45:59 GMT&lt; x-jupyterhub-version: 5.3.0&lt; access-control-allow-headers: accept, content-type, authorization&lt; content-security-policy: frame-ancestors 'none'; report-uri \/hub\/security\/csp-report&lt; etag: \"df589664a25d5c3eb4c091fcadd7ea94f9add5f3\"&lt; content-length: 7870&lt; set-cookie: _xsrf=MnwxOjB8MTA6MTc5MTgyNzE1OXw1Ol94c3JmfDY4OlRtOXVaVHBZTlVwSVMySkRlbVZmUWtVek9GTnNlRFpsWlY5d2NrZHhMVkJLYW5WZlkyOVlNek5ZZFZwaU1HZzRQUT09fGU4YWJlMjc3ZDA2M2MzZTU3NjllYWZjZTMxNGIzNjNiMmNkZTljZWUxOGI1ZmUzMGQzZjNkMjQ1MzZiMjdkNTk; Max-Age=3600; Path=\/hub\/&lt; x-envoy-upstream-service-time: 7&lt; { [7870 bytes data]* Connection #0 to host 172.18.255.240:80 left intact<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c HTTPRoute \u0434\u043b\u044f mlflow \u2014 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/mlflow\/HTTPRoute-mlflow.yaml?rev=main\" rel=\"noopener nofollow\">platform\/gateway\/mlflow\/HTTPRoute-mlflow.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: gateway.networking.k8s.io\/v1kind: HTTPRoutemetadata:  name: web-route-mlflow  namespace: mlflow # \u041f\u0415\u0420\u0415\u041d\u0415\u0421\u041b\u0418 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044fspec:  parentRefs:  - name: jml-cilium-gateway    namespace: infra-gw-jml # \u042f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0448\u043b\u044e\u0437 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c ns  rules:  - matches:    - path:        type: PathPrefix        value: \/mlflow    backendRefs:    - name: mlflow-mlflow # \u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0435\u0437 \u0442\u043e\u0447\u0435\u043a      namespace: mlflow # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430      port: 5000<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c gateway \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u201chubble-cilium-gateway\u201d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e LB \u0434\u043b\u044f hubble-ui \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/hubble\/gateway.yaml?rev=main\" rel=\"noopener nofollow\">hubble-cilium-gateway<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: gateway.networking.k8s.io\/v1kind: Gatewaymetadata:  name: hubble-cilium-gateway  namespace: infra-gw-jml  annotations:    io.cilium\/lb-ipam-pool: kind-poolspec:  gatewayClassName: cilium  listeners:  - name: http    protocol: HTTP    port: 80    allowedRoutes:      namespaces:        from: All<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 LB<\/p>\n<pre><code class=\"bash\">kubectl get svc -A|grep -E LoadBalancer\\|TYPE# Output:NAMESPACE      NAME                                   TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                AGEinfra-gw-jml   cilium-gateway-hubble-cilium-gateway   LoadBalancer   10.96.67.14     172.18.255.241   80:30556\/TCP                           15sinfra-gw-jml   cilium-gateway-jml-cilium-gateway      LoadBalancer   10.96.107.1     172.18.255.240   80:31109\/TCP                           4d18h<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 IP 172.18.255.241<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c HTTPRoute \u0434\u043b\u044f Hubble UI \u2014 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/hubble\/HTTPRoute-hubble.yaml?rev=main\" rel=\"noopener nofollow\">platform\/gateway\/hubble\/HTTPRoute-hubble.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: gateway.networking.k8s.io\/v1kind: HTTPRoutemetadata:  name: web-route-hubble-ui  namespace: kube-system # \u041f\u0415\u0420\u0415\u041d\u0415\u0421\u041b\u0418 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044fspec:  parentRefs:  - name: hubble-cilium-gateway # \u0417\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f gateway \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0434\u043b\u044f hubble-ui    namespace: infra-gw-jml # \u042f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0448\u043b\u044e\u0437 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c ns  rules:  - matches:    - path:        type: PathPrefix        value: \/    backendRefs:    - name: hubble-ui # \u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0435\u0437 \u0442\u043e\u0447\u0435\u043a      namespace: kube-system # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430      port: 80<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0438\u0449\u0435\u043c \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 \u201cHTTP\/1.1 200 OK\u201d<\/p>\n<pre><code class=\"bash\">curl -o \/dev\/null -sv \"http:\/\/172.18.255.241\"# Output:*   Trying 172.18.255.241:80...* Established connection to 172.18.255.241 (172.18.255.241 port 80) from 172.18.0.2 port 55256 * using HTTP\/1.x&gt; GET \/ HTTP\/1.1&gt; Host: 172.18.255.241&gt; User-Agent: curl\/8.18.0&gt; Accept: *\/*&gt; * Request completely sent off&lt; HTTP\/1.1 200 OK&lt; server: envoy&lt; date: Sat, 17 Oct 2026 11:43:10 GMT&lt; content-type: text\/html&lt; content-length: 642&lt; last-modified: Tue, 08 Sep 2026 12:41:20 GMT&lt; etag: \"6aa00270-282\"&lt; accept-ranges: bytes&lt; x-envoy-upstream-service-time: 0&lt; { [642 bytes data]* Connection #0 to host 172.18.255.241:80 left intact<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 Hubble UI<\/h3>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 <code>py\/test.py<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 JupyterHub, \u0441\u043e\u0437\u0434\u0430\u0432 \u043d\u043e\u0432\u044b\u0439 \u043d\u043e\u0443\u0442\u0431\u0443\u043a, \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 Hubble UI.<\/p>\n<h3>1. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d jupyterhub<\/h3>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 <code>jupyterhub<\/code>. \u0417\u0434\u0435\u0441\u044c \u043e\u0442\u0447\u0435\u0442\u043b\u0438\u0432\u043e \u0432\u0438\u0434\u043d\u0430 \u0432\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: \u0442\u0440\u0430\u0444\u0438\u043a \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>Ingress<\/code>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 JupyterHub, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0438\u0440 (<code>world<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 <code>mlflow<\/code>:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4d\/a7\/eb\/4da7eb96733747ef85ce364da836e3bd.png\" alt=\"Hubble UI: namespace jupyterhub&quot;&gt;\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/4d\/a7\/eb\/4da7eb96733747ef85ce364da836e3bd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/4d\/a7\/eb\/4da7eb96733747ef85ce364da836e3bd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Hubble UI: namespace jupyterhub&#187;&gt;<\/figcaption><\/div>\n<\/figure>\n<h3>2. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0435\u043d mlflow<\/h3>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d <code>mlflow<\/code>, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 <code>mlflow<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442 <code>jupyterhub<\/code> \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438: \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 <code>postgresql<\/code> (\u043f\u043e\u0440\u0442 5432) \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c <code>seaweedfs<\/code> (\u043f\u043e\u0440\u0442 8333):<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/d6\/2e\/9c\/d62e9c1a53e2efbb09432849f06a4406.png\" alt=\"Hubble UI: namespace mlflow\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/d6\/2e\/9c\/d62e9c1a53e2efbb09432849f06a4406.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/d6\/2e\/9c\/d62e9c1a53e2efbb09432849f06a4406.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Hubble UI: namespace mlflow<\/figcaption><\/div>\n<\/figure>\n<h3>3. \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 (\u0422\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f)<\/h3>\n<p>\u041f\u0440\u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043b\u043e\u0433\u043e\u0432 \u0432 Hubble UI \u043c\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0430\u0440\u0443\u0436\u0443 \u0443\u0445\u043e\u0434\u044f\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412 \u043b\u043e\u0433\u0430\u0445 \u0447\u0435\u0442\u043a\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 <code>api.mlflow-telemetry.io<\/code> \u043d\u0430 \u043f\u043e\u0440\u0442 443 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c <strong>forwarded<\/strong> (\u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e). \u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/d8\/e3\/35\/d8e335acb0eced17191a9100a71948f2.png\" alt=\"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/d8\/e3\/35\/d8e335acb0eced17191a9100a71948f2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/d8\/e3\/35\/d8e335acb0eced17191a9100a71948f2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d<\/figcaption><\/div>\n<\/figure>\n<hr\/>\n<h4>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (CiliumNetworkPolicy)<\/h4>\n<p>\u0414\u043b\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u0434\u043e\u0432 JupyterHub \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 <a href=\"https:\/\/sourcecraft.dev\/featsci-1\/clb\/browse\/platform\/gateway\/cilium\/cnp.yaml?rev=main\" rel=\"noopener nofollow\">platform\/gateway\/cilium\/cnp.yaml<\/a><\/p>\n<pre><code class=\"yaml\">apiVersion: \"cilium.io\/v2\"kind: CiliumNetworkPolicymetadata:  name: jupyterhub-isolation  namespace: jupyterhubspec:  endpointSelector:    matchLabels:      app.kubernetes.io\/component: singleuser-server   egress:    # 1. \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 (\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u044b \u043c\u043e\u0433\u043b\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u0430)    - toEndpoints:        - matchLabels:            \"k8s:io.kubernetes.pod.namespace\": kube-system            k8s-app: kube-dns      toPorts:        - ports:            - port: \"53\"              protocol: UDP          rules:            dns:              - matchPattern: \"*\"    # 2. \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a \u043a\u043e \u0412\u0421\u0415\u041c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043f\u043e\u0434\u0430\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (Kube-DNS, MLflow, SeaweedFS)    - toEndpoints:        - matchExpressions:            - key: \"k8s:io.kubernetes.pod.namespace\"              operator: Exists    # \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0441\u0435\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \"reserved:world\" \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442,     # \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<hr\/>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 Hubble UI<\/h4>\n<h3>4. \u0424\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (Dropped Flows)<\/h3>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0441\u0438\u043b\u0443, eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Cilium \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412 \u043f\u0430\u043d\u0435\u043b\u0438 Hubble \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u043c \u043c\u0430\u0440\u043a\u0435\u0440\u044b <strong>dropped<\/strong> (\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u044b \u043a\u0440\u0430\u0441\u043d\u044b\u043c) \u043f\u0440\u0438 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 <code>api.mlflow-telemetry.io<\/code>.<\/p>\n<p>\u041a\u043b\u0438\u043a\u043d\u0443\u0432 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u0433\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430: \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0435\u0440\u0434\u0438\u043a\u0442, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 (<code>egress<\/code>), TCP-\u0444\u043b\u0430\u0433\u0438 (<code>RST<\/code>) \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u0434 (<code>jupyter-admin<\/code>), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043d\u0430\u0448\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ca\/01\/00\/ca0100e11f8ec24a62e28efc4247de94.png\" alt=\"Hubble UI: \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f CNP\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/ca\/01\/00\/ca0100e11f8ec24a62e28efc4247de94.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/ca\/01\/00\/ca0100e11f8ec24a62e28efc4247de94.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Hubble UI: \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f CNP<\/figcaption><\/div>\n<\/figure>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0432 SeaweedFS S3<\/h4>\n<p>\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0441\u0435\u0442\u044c, \u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e JupyterHub \u0438 MLflow \u0431\u0435\u0441\u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0430\u043a\u0435\u0442\u0430 <code>mlflow<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API <strong>SeaweedFS S3<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0432 <code>curl<\/code> \u043f\u043e\u0434\u043f\u0438\u0441\u044c <strong>AWS SigV4<\/strong><\/p>\n<p>\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0441\u0435\u0442\u044c, \u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0442\u0435\u043a <strong>JupyterHub \u2794 MLflow<\/strong> \u0431\u0435\u0441\u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0430\u043a\u0435\u0442\u0430 <code>mlflow<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043c credentials \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 Kubernetes \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>jq<\/code><\/p>\n<pre><code class=\"bash\">kubectl -n seaweedfs get secret seaweedfs-s3-secret -o json | jq -r '\"\\(.data.read_access_key_id | @base64d):\\(.data.read_secret_access_key | @base64d)\"'# OutputTzk74FVIQAOnPbqfOc6z:uVSXdFcpTOwxjoj8PeRIUPvDN5tCzakFhnfNmTBY<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>username:password<\/code>, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a <strong>SeaweedFS S3<\/strong> \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 <strong>AWS SigV4<\/strong>, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432<\/p>\n<pre><code class=\"bash\">curl --user \"Tzk74FVIQAOnPbqfOc6z:uVSXdFcpTOwxjoj8PeRIUPvDN5tCzakFhnfNmTBY\" --aws-sigv4 \"aws:amz:us-east-1:s3\" -s \"http:\/\/seaweedfs-s3.seaweedfs.svc.cluster.local:8333\/mlflow\"| grep -o '&lt;Key&gt;[^&lt;]*&lt;\/Key&gt;' | sed 's|&lt;Key&gt;||g; s|&lt;\/Key&gt;||g'# Output:1\/13229738f0f644de80a412e89cd284f4\/artifacts\/check-status.txt1\/2d38b8d475d545d199a71a502bcedd4c\/artifacts\/check-status.txt1\/757d5f747aad4059b1396933ecab5654\/artifacts\/check-status.txt1\/b460b792eaeb489fbc1b7a2bc2b8668d\/artifacts\/check-status.txt1\/c04b8b16cee74e52a4918adc712db8ea\/artifacts\/check-status.txt1\/d802426e487c40898a0e62c9d7605bfc\/artifacts\/check-status.txt<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0418\u0442\u043e\u0433 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430:<\/strong> \u0412\u0441\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b (\u0444\u0430\u0439\u043b\u044b <code>check-status.txt<\/code>) \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 MLflow \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043b\u043e\u0433\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 S3-\u0431\u0430\u043a\u0435\u0442\u0435. \u0421\u0435\u0442\u0435\u0432\u0430\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u0430 \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<h4>\u041b\u043e\u0433 \u0445\u0430\u043e\u0441-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0424\u0430\u0439\u043b\u043e\u0432\u0435\u0440 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438)<\/h4>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0438\u0432\u043e\u0439 \u043b\u043e\u0433 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b <code>testlb-worker7<\/code> \u0438 <code>testlb-worker8<\/code> (\u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043b\u0441\u044f \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f Docker):<\/p>\n<pre><code class=\"bash\">while true; do echo -n \"$(date +%T) -&gt; HTTP Code: \"; curl -o \/dev\/null -s -w \"%{http_code}\\n\" http:\/\/172.18.255.240\/hub\/login; sleep 10; done &amp;[1] 6015214:36:37 -&gt; HTTP Code: 200# \u0428\u0430\u0433 1: \u0413\u0430\u0441\u0438\u043c \u041e\u0411\u0415 \u043d\u043e\u0434\u044b, \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437$ docker stop testlb-worker7$ docker stop testlb-worker814:56:13 -&gt; HTTP Code: 00014:57:02 -&gt; HTTP Code: 000  # \u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043b\u0435\u0436\u0438\u0442, \u0448\u043b\u044e\u0437 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d# \u0428\u0430\u0433 2: \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a \u0436\u0438\u0437\u043d\u0438 \u043f\u0435\u0440\u0432\u0443\u044e \u043d\u043e\u0434\u0443$ docker start testlb-worker714:57:15 -&gt; HTTP Code: 000  # \u0418\u0434\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Cilium \u0430\u0433\u0435\u043d\u0442\u0430...14:57:28 -&gt; HTTP Code: 00014:57:41 -&gt; HTTP Code: 200  # L2-\u0430\u043d\u043e\u043d\u0441\u044b \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u0448\u043b\u044e\u0437 \u041e\u0416\u0418\u041b!14:58:12 -&gt; HTTP Code: 200# \u0428\u0430\u0433 3: \u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u043d\u043e\u0434\u0443 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f HA$ docker start testlb-worker814:58:42 -&gt; HTTP Code: 200  #  \u0434\u0432\u0435 \u043d\u043e\u0434\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0441\u0442\u0440\u043e\u044e# \u0428\u0430\u0433 4: \u0422\u0435\u0441\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u0435\u0440\u0430. \u0412\u044b\u0431\u0438\u0432\u0430\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043d\u043e\u0434\u0443 worker7$ docker stop testlb-worker714:59:23 -&gt; HTTP Code: 200  #  \u0442\u0440\u0430\u0444\u0438\u043a \u0443\u0448\u0435\u043b \u043d\u0430 worker8!14:59:34 -&gt; HTTP Code: 20014:59:44 -&gt; HTTP Code: 200# \u0428\u0430\u0433 5: \u0414\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u043e\u0434\u0443$ docker stop testlb-worker814:59:53 -&gt; HTTP Code: 000  # \u0412\u0441\u0435 \u043d\u043e\u0434\u044b \u0441 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 webnode \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0418 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Kubernetes (\u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u043e\u0434\u044b worker7 \u0438 worker8 \u043f\u0435\u0440\u0435\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439):<\/p>\n<pre><code class=\"bash\"># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u0430\u043a\u0430\u044f \u043d\u043e\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043akubectl -n kube-system get lease | grep -E jml-cilium-gateway\\|HOLDERNAME                                                                  HOLDER                                                                      AGEcilium-l2announce-infra-gw-jml-cilium-gateway-hubble-cilium-gateway   testlb-worker8                                                              25mcilium-l2announce-infra-gw-jml-cilium-gateway-jml-cilium-gateway      testlb-worker8                                                              25m# \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u043e\u0434\u0443 \u0438\u0437 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 HOLDER - testlb-worker8docker stop testlb-worker8testlb-worker8# \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u0430\u043a\u0430\u044f \u043d\u043e\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043akubectl -n kube-system get lease | grep -E jml-cilium-gateway\\|HOLDERNAME                                                                  HOLDER                                                                      AGEcilium-l2announce-infra-gw-jml-cilium-gateway-hubble-cilium-gateway   testlb-worker7                                                              26mcilium-l2announce-infra-gw-jml-cilium-gateway-jml-cilium-gateway      testlb-worker7# \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u043d\u043e\u0434\u0443 \u0438\u0437 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 HOLDER - testlb-worker7docker stop testlb-worker7testlb-worker7# \u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0430\u0440\u0435\u043d\u0434\u044b \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b \u0438 \u043b\u0438\u0434\u0435\u0440\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 (\u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432)kubectl -n kube-system get lease | grep -E jml-cilium-gateway\\|HOLDERNAME                                   HOLDER                                                                      AGEkubectl -n kube-system get lease | grep -E jml-cilium-gateway\\|HOLDER|wc -l1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong> \u0422\u0435\u0441\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u043e\u0434 (<code>worker7<\/code>) Cilium \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 <code>worker8<\/code>. \u041a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442 \u0430\u0432\u0430\u0440\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u043d\u043e\u0434 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0437\u0430 ~20-30 \u0441\u0435\u043a\u0443\u043d\u0434 (\u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0434\u0430 <code>cilium-agent<\/code>).<\/p>\n<\/li>\n<\/ol>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f KinD \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h3>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u044f\u0436\u0435\u043b\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (JupyterHub, MLflow, SeaweedFS, PostgreSQL) \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0445\u043e\u0441\u0442\u0430. \u041d\u0438\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0446\u0435\u043f\u0442\u044b \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 KinD.<\/p>\n<h4>1. \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u0441\u0442\u0430\u0440\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 testlb<\/h4>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e KinD \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u043e\u0434 \u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Docker-\u0434\u0435\u043c\u043e\u043d\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0430\u0432\u0442\u043e\u0441\u0442\u0430\u0440\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">docker update --restart=no $(docker ps -a -q --filter name=testlb)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>2. \u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 testlb<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u00ab\u0441\u043f\u0430\u0442\u044c\u00bb \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0435 \u0435\u0433\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e:<\/p>\n<pre><code class=\"bash\">docker start $(docker ps -a -q --filter name=testlb)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h4>3. \u0420\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u044f\u0434\u0440\u0430 (Inotify)<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u0432 KinD \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0432\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0434\u0440\u0430 \u0445\u043e\u0441\u0442-\u0441\u0438\u0441\u0442\u0435\u043c\u044b (Linux\/WSL2): <code>fs.inotify.max_user_watches<\/code>, <code>fs.inotify.max_user_instances<\/code> \u0438 <code>fs.inotify.max_queued_events<\/code>. \u0411\u0435\u0437 \u0438\u0445 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u043e\u0439 \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b <code>inotify<\/code>.<\/p>\n<h4>4. \u041b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0432 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u201cUnknown\u201d<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043f\u0430\u0434\u0435\u043d\u0438\u044f Docker \u0438\u043b\u0438 \u0443\u0445\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0432 \u0441\u043e\u043d, \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 <strong>Unknown<\/strong>. \u041b\u0435\u0447\u0438\u043c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"bash\">kubectl get pods --all-namespaces | grep -i \"Unknown\" | awk '{print \\$1, \\$2}' | xargs -n2 kubectl delete pod --grace-period 0 --force -n<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\ud83c\udfc1 \u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043d\u0435\u043c\u043d\u043e\u0433\u0443. \u041c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Hubble.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043f\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435:<\/p>\n<ul>\n<li>\n<p><strong>CiliumNetworkPolicy:<\/strong> \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 eBPF-\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c L7-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c HTTP-\u043f\u0443\u0442\u044f\u043c \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c) \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u0441\u043f\u0443\u0444\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Gateway API:<\/strong> \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 Cilium \u0438 Gateway API \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e, \u0438 \u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 KinD \u2014 \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u0445 Kubernetes.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1095700\/\">https:\/\/habr.com\/ru\/articles\/1095700\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u2014 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 Gateway API \u0438 Cilium, \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0433\u043e \u0432 \u0440\u043e\u043b\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043d\u0434, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Cilium \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.\u26a0\ufe0f \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430:\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 Linux-\u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438\u0437 9 \u043d\u043e\u0434 (1 control-plane + 8 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 4 \u0426\u041f\u0423 \u0438 16 \u0413\u0431 \u041e\u0417\u0423.\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Kind. \u0412 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 CNI \u0438 kube-proxy, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Cilium. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0438 \u0432\u043e\u0440\u043a\u0435\u0440-\u043d\u043e\u0434\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u043f\u0443\u043b\u044b \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u0440\u043e\u043b\u044f\u043c (\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, MLflow, SeaweedFS \u0438 Web). \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 (taints) \u0438 \u043c\u0435\u0442\u043e\u043a (labels). \u0422\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430kind create cluster &#8212;name testlb &#8212;config infrastructure\/kind\/kind-config.yaml\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f Kind &#8212; infrastructure\/kind\/kind-config.yamlkind: ClusterapiVersion: kind.x-k8s.io\/v1alpha4 networking:  disableDefaultCNI: true # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 Kindnet  kubeProxyMode: &#171;none&#187; # \u0423\u0431\u0438\u0440\u0430\u0435\u043c kube-proxynodes:- role: control-plane# systempool- role: worker# DATABASES &#8212; jupyterhub &amp; mlflow- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;databasesnode=yesnaff&#187;          register-with-taints: &#171;databasetaint=yestaint:NoSchedule&#187;- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;databasesnode=yesnaff&#187;          register-with-taints: &#171;databasetaint=yestaint:NoSchedule&#187;- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;databasesnode=yesnaff&#187;          register-with-taints: &#171;databasetaint=yestaint:NoSchedule&#187;# mlflow- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;mlflownode=yesnaff&#187;          register-with-taints: &#171;mlflowtaint=yestaint:NoSchedule&#187;# seaweedfs- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;seaweedfsnode=yesnaff&#187;          register-with-taints: &#171;seaweedfstaint=yestaint:NoSchedule&#187;# WEB- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;webnode=yesnaff&#187;          register-with-taints: &#171;webtaint=yestaint:NoSchedule&#187;- role: worker  kubeadmConfigPatches:    &#8212; |      kind: JoinConfiguration      nodeRegistration:        kubeletExtraArgs:          node-labels: &#171;webnode=yesnaff&#187;          register-with-taints: &#171;webtaint=yestaint:NoSchedule&#187;\u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e Kind \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a Kind \u0441 \u0444\u043b\u0430\u0433\u043e\u043c &#8212;retainkind create cluster &#8212;name testlb &#8212;config infrastructure\/kind\/kind-config.yaml &#8212;retain\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \/etc\/kubernetes\/admin.conf \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 testlb-control-planedocker exec -it testlb-control-plane cat \/etc\/kubernetes\/admin.conf &gt; ~\/.kube\/config\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c control-planekubectl get noOutput:NAME                   STATUS     ROLES           AGE     VERSIONtestlb-control-plane   NotReady   control-plane   2m59s   v1.37.0\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0434 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c &#8212;print-join-command \u0447\u0435\u0440\u0435\u0437 docker execdocker exec -it testlb-control-plane kubeadm token create &#8212;print-join-commandOutput:\u00a0\u00a0kubeadm join testlb-control-plane:6443 &#8212;token uvukvj.40pf1jzlosjffgar &#8212;discovery-token-ca-cert-hash sha256:ee6183fc29377ab060e9e5ff01b2956611ea9b8a153cd2696dd5b3da4316d644  \u041a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043b\u0430\u0433 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#8212;ignore-preflight-errors=SystemVerification,Swapdocker ps &#8212;format &#8216;{{.Names}}&#8217; | grep testlb-worker | xargs -I {} docker exec -t {} kubeadm join testlb-control-plane:6443 &#8212;token uvukvj.40pf1jzlosjffgar &#8212;discovery-token-ca-cert-hash sha256:ee6183fc29377ab060e9e5ff01b2956611ea9b8a153cd2696dd5b3da4316d644  &#8212;ignore-preflight-errors=SystemVerification,Swap\u00a0\u00a0docker ps &#8212;format &#8216;{{.Names}}&#8217; | grep testlb-worker | xargs -I {} docker exec -t {} kubeadm join testlb-control-plane:6443 &#8212;token uvukvj.40pf1jzlosjffgar &#8212;discovery-token-ca-cert-hash sha256:ee6183fc29377ab060e9e5ff01b2956611ea9b8a153cd2696dd5b3da4316d644  &#8212;ignore-preflight-errors=SystemVerification,Swap \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430kubectl get no# Output:NAME                   STATUS     ROLES           AGE     VERSIONtestlb-control-plane   NotReady   control-plane   17m     v1.37.0testlb-worker          NotReady   &lt;none&gt;          2m31s   v1.37.0testlb-worker2         NotReady   &lt;none&gt;          2m23s   v1.37.0testlb-worker3         NotReady   &lt;none&gt;          2m27s   v1.37.0testlb-worker4         NotReady   &lt;none&gt;          2m22s   v1.37.0testlb-worker5         NotReady   &lt;none&gt;          2m30s   v1.37.0testlb-worker6         NotReady   &lt;none&gt;          2m26s   v1.37.0testlb-worker7         NotReady   &lt;none&gt;          2m29s   v1.37.0testlb-worker8         NotReady   &lt;none&gt;          2m24s   v1.37.0\u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u201cK8s in Docker\u201d \u0447\u0435\u0440\u0435\u0437 kubeadm join, \u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u0438 \u0442\u0435\u0439\u043d\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 kubectl label \u0438 kubectl taint.\u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u2014 testlb, \u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439w_idx=1; while read -r line; do if [[ &#171;$line&#187; =~ &#171;role: worker&#187; ]]; \\then [ $w_idx -eq 1 ] &amp;&amp; name=&#187;testlb-worker&#187; || name=&#187;testlb-worker$w_idx&#187;; num=$(echo &#171;$line&#187; | cut -d: -f1); \\labels=$(sed -n &#171;$num,\/role:\/p&#187; infrastructure\/kind\/kind-config.yaml | grep &#171;node-labels:&#187; | \\sed -E &#8216;s\/.*node-labels:[[:space:]]*&#187;([^&#187;]+)&#187;.*\/\\1\/&#8217;); taints=$(sed -n &#171;$num,\/role:\/p&#187; infrastructure\/kind\/kind-config.yaml | grep &#171;register-with-taints:&#187; | \\sed -E &#8216;s\/.*register-with-taints:[[:space:]]*&#187;([^&#187;]+)&#187;.*\/\\1\/&#8217;); [ -n &#171;$labels&#187; ] &amp;&amp; kubectl label node &#171;$name&#187; &#171;$labels&#187; &#8212;overwrite; [ -n &#171;$taints&#187; ] \\&amp;&amp; kubectl taint node &#171;$name&#187; &#171;$taints&#187; &#8212;overwrite; ((w_idx++)); fi; done &lt; &lt;(grep -n &#171;role:&#187; infrastructure\/kind\/kind-config.yaml)# Output:node\/testlb-worker2 labelednode\/testlb-worker2 modifiednode\/testlb-worker3 labelednode\/testlb-worker3 modifiednode\/testlb-worker4 labelednode\/testlb-worker4 modifiednode\/testlb-worker5 labelednode\/testlb-worker5 modifiednode\/testlb-worker6 labelednode\/testlb-worker6 modifiednode\/testlb-worker7 labelednode\/testlb-worker7 modifiednode\/testlb-worker8 labelednode\/testlb-worker8 modified\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c taints \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043d\u043e\u0434 \u0432 Kindkubectl get no -o custom-columns=&#187;NAME:.metadata.name,TAINTS:.spec.taints[*].key&#187;# Output:NAME                   TAINTStestlb-control-plane   node-role.kubernetes.io\/control-planetestlb-worker          &lt;none&gt;testlb-worker2         databasetainttestlb-worker3         databasetainttestlb-worker4         databasetainttestlb-worker5         mlflowtainttestlb-worker6         seaweedfstainttestlb-worker7         webtainttestlb-worker8         webtaint\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043c\u0435\u0442\u043a\u0438kubectl get no &#8212;show-labels | awk &#8216;NR==1 {printf &#171;%-25s %s\\n&#187;, &#171;NAME&#187;, &#171;YESNAFF_LABELS&#187;} NR&gt;1 {labels=&#187;&#187;; \\for(i=1;i&lt;=NF;i++) if($i ~ \/=yesnaff\/) {split($i, a, &#171;,&#187;); for(j in a) if(a[j] ~ \/=yesnaff\/) labels=labels a[j] &#187; &#171;}; \\if(labels==&#187;&#187;) labels=&#187;&lt;none&gt;&#187;; printf &#171;%-25s %s\\n&#187;, $1, labels}&#8217;# Output:NAME                      YESNAFF_LABELStestlb-control-plane      &lt;none&gt;testlb-worker             &lt;none&gt;testlb-worker2            databasesnode=yesnaff testlb-worker3            databasesnode=yesnaff testlb-worker4            databasesnode=yesnaff testlb-worker5            mlflownode=yesnaff testlb-worker6            seaweedfsnode=yesnaff testlb-worker7            webnode=yesnaff testlb-worker8            webnode=yesnaff \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c StorageClasseskubectl get storageclasses.storage.k8s.io# Output:No resources found\u0415\u0441\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b SC \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043ckubectl apply -f https:\/\/raw.githubusercontent.com\/rancher\/local-path-provisioner\/v0.0.37\/deploy\/local-path-storage.yaml\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 StorageClass \u201cstandard\u201d. Kind \u0441\u043e\u0437\u0434\u0430\u0451\u0442 SC \u0441 \u0438\u043c\u0435\u043d\u0435\u043c standard \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044ekubectl apply -f &#8212; &lt;&lt;EOFapiVersion: storage.k8s.io\/v1kind: StorageClassmetadata:  name: standardprovisioner: rancher.io\/local-pathvolumeBindingMode: WaitForFirstConsumerreclaimPolicy: DeleteallowVolumeExpansion: falseEOF\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c SCkubectl get storageclasses.storage.k8s.io# Output:NAME         PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGElocal-path   rancher.io\/local-path   Delete          WaitForFirstConsumer   false                  2m14sstandard     rancher.io\/local-path   Delete          WaitForFirstConsumer   false                  2m7s\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u0443\u043b\u0430\u043c \u043d\u043e\u0434. \u0412 \u043d\u0430\u0448\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 Kind \u043c\u044b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0441\u044b\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0443 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0443\u044e \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044e. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0432 (Scheduling), \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Cilium.\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a:\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0443\u043b (System \u043d\u043e\u0434\u0430) \u2014 \u043e\u0434\u043d\u0430 \u043d\u043e\u0434\u0430 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a \u0438 \u0442\u0435\u0439\u043d\u0442\u043e\u0432. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.\u0411\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (JupyterHub DB + MLflow DB) \u2014 \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0411\u0414 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u043d\u043e\u0434\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430\u0448\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043c\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f JupyterHub \u0438 MLflow \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u043f\u0443\u043b\u0435 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043d\u043e\u0434. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u0434\u044b \u0442\u0443\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-499103","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/499103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=499103"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/499103\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=499103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=499103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=499103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}