Загрузка данных
li class="breadcrumb-item"><span>13. Настройка инициализации кластера Kubernetes</span></li>
</ol>
</nav>
</div>
</div>
</header>
<div class="main-inner" id="topofscroll">
<div class="drawer-toggles d-flex">
<div class="drawer-toggler drawer-left-toggle open-nav d-print-none">
<button class="btn icon-no-margin" data-action="toggle" data-placement="right" data-target="theme_boost-drawers-courseindex" data-toggle="tooltip" data-toggler="drawers" title="Открыть оглавление курса">
<span class="sr-only">Открыть оглавление курса</span>
<i aria-hidden="true" class="icon fa fa-list fa-fw"></i>
</button>
</div>
</div>
<div class="d-print-block" id="page-content">
<div id="region-main-box">
<section aria-label="Содержимое" id="region-main">
<span class="notifications" id="user-notifications"></span>
<span id="maincontent"></span>
<div class="activity-header" data-for="page-activity-header">
<span class="sr-only">Требуемые условия завершения</span>
<div class="activity-information" data-activityname="13. Настройка инициализации кластера Kubernetes" data-region="activity-information">
</div>
</div>
<div role="main"><div class="box py-3 generalbox center clearfix"><div class="no-overflow"><h3>Задание:</h3>
<ul>
<li>a. На k8s-srv1 для инициализации кластера подготовьте конфигурационный файл kubeadm-config.yaml и разместите его в директории /etc/kubernetes/, с соблюдением ряда обязательных параметров</li>
<li>b. InitConfiguration — настройки процесса инициализации
<ul>
<li>i. criSocket — путь к сокету CRI (containerd)</li>
</ul>
</li>
<li>c. ClusterConfiguration — настройки кластера
<ul>
<li>i. kubernetesVersion: "1.35.0"</li>
<li>ii. controlPlaneEndpoint — адрес и порт для подключения к API серверу (в соответствии с Схема доступа к K8s-API в HA кластере Kubernetes)</li>
<li>iii. podSubnet — подсеть для подов. Должна совпадать с CIDR в настройках CNI (Calico)</li>
<li>iv. serviceSubnet — подсеть для сервисов</li>
</ul>
</li>
<li>d. KubeProxyConfiguration — настройки kube-proxy
<ul>
<li>i. mode: "ipvs" — режим работы</li>
</ul>
</li>
<li>e. KubeletConfiguration — настройки kubelet
<ul>
<li>i. clusterDNS — адрес DNS сервера кластера. Указать необходимо 169.254.25.10 — это адрес NodeLocalDNS</li>
</ul>
</li>
<li>f. Выполните инициализацию кластера Kubernetes на ноде k8s-srv1</li>
</ul>
<h3>Вариант реализации:</h3>
<h4>k8s-srv1:</h4>
<pre class="language-markup"><code>sudo su -</code></pre>
<p><!-- obsidian --></p>
<ul>
<li>Для инициализации кластера подготовим конфигурационный файл <code>kubeadm-config.yaml</code>:</li>
</ul>
<pre class="language-markup"><code>cat <<EOF > /etc/kubernetes/kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: "1.35.0"
controlPlaneEndpoint: "192.168.0.253:7443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 169.254.25.10
systemReserved:
cpu: "500m"
memory: "512Mi"
EOF</code></pre>
<p><!-- obsidian --></p>
<h5 data-heading="Разбор параметров"> </h5>
<h5 data-heading="Разбор параметров">Разбор параметров</h5>
<p>Используйте последнюю версию API для вашей текущей версии kubernetes. Посмотреть все варианты можно в <a aria-label="https://kubernetes.io/docs/reference/config-api/" class="external-link" data-tooltip-position="top" href="https://kubernetes.io/docs/reference/config-api/" rel="noopener nofollow" target="_blank">документации</a>.</p>
<p><strong>InitConfiguration</strong> — настройки процесса инициализации:</p>
<ul>
<li><code>criSocket</code> — путь к сокету CRI (containerd).</li>
</ul>
<p><strong>ClusterConfiguration</strong> — настройки кластера:</p>
<ul>
<li><code>kubernetesVersion</code> — версия Kubernetes.</li>
<li><code>controlPlaneEndpoint</code> — адрес и порт для подключения к API серверу. Указываем floating IP и порт haproxy (<code>192.168.0.252:7443</code>). Это обеспечивает высокую доступность — клиенты подключаются через балансировщик, а не напрямую к конкретной ноде.</li>
<li><code>podSubnet</code> — подсеть для подов. Должна совпадать с CIDR в настройках CNI (Calico).</li>
<li><code>serviceSubnet</code> — подсеть для сервисов.</li>
</ul>
<p><strong>KubeProxyConfiguration</strong> — настройки kube-proxy:</p>
<ul>
<li><code>mode: "ipvs"</code> — режим работы. IPVS обеспечивает лучшую производительность по сравнению с iptables при большом количестве сервисов.</li>
<li><code>strictARP: true</code> — необходим для корректной работы некоторых балансировщиков (например, MetalLB).</li>
</ul>
<p><strong>KubeletConfiguration</strong> — настройки kubelet:</p>
<ul>
<li><code>clusterDNS</code> — адрес DNS сервера кластера. Указываем <code>169.254.25.10</code> — это адрес NodeLocalDNS, который будет установлен позже. NodeLocalDNS кэширует DNS запросы на каждой ноде, снижая нагрузку на CoreDNS и уменьшая задержки.</li>
<li><code>systemReserved</code> — ресурсы, зарезервированные для системных процессов ОС. Kubelet не будет отдавать их подам.</li>
</ul>
<h5> </h5>
<h5>Инициализация кластера</h5>
<ul>
<li>Выполняем инициализацию на ноде k8s-srv1:
<ul>
<li>флаг <code>--upload-certs</code> загружает сертификаты в Secret кластера, что позволяет другим control нодам присоединиться без ручного копирования сертификатов</li>
</ul>
</li>
</ul>
<pre class="language-markup"><code>kubeadm init --config /etc/kubernetes/kubeadm-config.yaml --upload-certs</code></pre>
<ul>
<li style="list-style-type: none;">
<ul>
<li>ожидаемый результат (процесс не быстрый, так как происходит загрузка необходимых образов):</li>
</ul>
</li>
</ul>
<pre class="language-markup"><code>...
Your Kubernetes control-plane has initialized successfully!
...</code></pre>
<ul>
<li>Для удобства настроем kubectl на текущей ноде, а на ADM-PC в соответствующем разделе задания:</li>
</ul>
<pre class="language-markup"><code>mkdir -p $HOME/.kube</code></pre>
<pre class="language-markup"><code>ln -s /etc/kubernetes/admin.conf $HOME/.kube/config</code></pre>
<ul>
<li>Проверяем:
<ul>
<li><!-- obsidian -->
<p>нода в статусе <code>NotReady</code> — это нормально, пока не установлена сетевая подсистема (CNI)</p>
</li>
</ul>
</li>
</ul>
<pre class="language-markup"><code>[root@k8s-srv1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-srv1.au-team.cloud NotReady control-plane 41s v1.35.0
[root@k8s-srv1 ~]# </code></pre></div></div><div class="modified">Последнее изменение: понедельник, 23 марта 2026, 15:57</div></div>
</section>
</div>
</div>
</div>
<div class="moove-container-fluid p-0 mb-4">
<div class="card activity-navigation mdl-bottom">
<div class="card-body">
<div class="row">
<div class="col-md-4"> <div id="prev-activity">
<div class="larrow">
<i class="icon-arrow-left"></i>
</div>
<div class="tex