https://www.altlinux.org/api.php?action=feedcontributions&user=37.146.69.23&feedformat=atomALT Linux Wiki - Вклад [ru]2024-03-28T23:45:33ZВкладMediaWiki 1.38.2https://www.altlinux.org/index.php?title=Kubernetes&diff=53733Kubernetes2021-04-09T07:34:32Z<p>37.146.69.23: /* Подготовка */</p>
<hr />
<div>= Kubernetes =<br />
<br />
Инструкция по работе с kubernetes.<br />
<br />
== Подготовка ==<br />
Нужны несколько машин (nodes). Одна из которых будет мастером.<br />
Системные требования:<br />
* 2Gb ОЗУ или больше;<br />
* 2 ядра процессора или больше<br />
* Все машины должны быть доступны по сети друг для друга;<br />
* Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts).<br />
* Своп должен быть выключен;<br />
<br />
Следует выбрать один из двух интерфейсов запуска контейнеров docker или crio.<br />
<br />
===Docker===<br />
Для разворачивания кластера с использованием docker,<br />
* Должны быть установлены следующие пакеты:<br />
: <code># apt-get install docker-ce kubernetes-kubeadm kubernetes-kubelet cri-tools</code>;<br />
* И запущены сервисы docker, kubelet и kube-proxy:<br />
: <code># systemctl enable --now docker kubelet kube-proxy</code>.<br />
<br />
===Crio===<br />
А для разворачивания кластера с использованием crio,<br />
* Должны быть установлены следующие пакеты:<br />
: <code># apt-get install cri-o kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools</code>;<br />
* Отредактирован конфиг для использования crio<br />
: <code># sed -i 's|KUBELET_CRI_ARGS=|KUBELET_CRI_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///var/run/crio/crio.sock|' /etc/systemd/system/kubelet.service.d/kubeadm.conf</code>;<br />
* И запущены сервисы crio, kubelet и kube-proxy:<br />
: <code># systemctl enable --now crio kubelet kube-proxy</code>.<br />
<br />
== Разворачивание кластера ==<br />
<ol><br />
<li><br />
На мастере нужно запустить команду для запуска кластера:<br />
: <code># kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification</code>.<br />
: Пояснение флагов:<br />
:: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>;<br />
:: <code>--ignore-preflight-errors=SystemVerification</code> - говорит не считать версию docker слишком новой.<br />
: В конце вывода будет строка вида:<br />
: <code>kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш></code>.<br />
</li><br />
<li><br />
Настройка <tt>kubernetes</tt> для работы от пользователя<br />
<ol><br />
<li><br />
Создать каталог {{path|~/.kube}}:<br />
: <code>$ mkdir ~/.kube</code>;<br />
</li><br />
<li><br />
Скопировать конфиг:<br />
: <code># cp /etc/kubernetes/admin.conf ~<пользователь>/.kube/config</code>;<br />
</li><br />
<li><br />
Изменить владельца конфига:<br />
: <code># chown <пользователь>: ~<пользователь>/.kube/config</code>.<br />
</li><br />
</ol><br />
</li><br />
<li><br />
После этого все остальные ноды нужно подключить к мастеру:<br />
: <code># kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> --ignore-preflight-errors=SystemVerification</code>.<br />
: Проверить наличие нод можно так:<br />
:: <code>$ kubectl get nodes -o wide</code><br />
: Вывод примерно следующий:<br />
<pre><br />
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME<br />
docker1 Ready <none> 4h v1.11.2 10.10.3.23 <none> ALT Regular 4.17.14-un-def-alt1 docker://Unknown<br />
docker2 Ready <none> 4h v1.11.2 10.10.3.120 <none> ALT Regular 4.17.14-un-def-alt1 docker://Unknown<br />
docker3 Ready <none> 4h v1.11.2 10.10.3.157 <none> ALT Regular 4.17.14-un-def-alt1 docker://Unknown<br />
k8s Ready master 4h v1.11.2 10.10.3.227 <none> ALT Regular 4.17.14-un-def-alt1 docker://Unknown<br />
</pre><br />
</li><br />
<li><br />
Далее следует развернуть сеть. Для этого можно запустить команду:<br />
: <code>$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</code>.<br />
: Проверить, что всё работает можно так:<br />
:: <code>$ kubectl get pods --namespace kube-system</code>.<br />
: Вывод должен быть похож на это:<br />
<pre><br />
NAME READY STATUS RESTARTS AGE<br />
coredns-78fcdf6894-6trk7 1/1 Running 0 2h<br />
coredns-78fcdf6894-nwt5l 1/1 Running 0 2h<br />
etcd-k8s 1/1 Running 0 2h<br />
kube-apiserver-k8s 1/1 Running 0 2h<br />
kube-controller-manager-k8s 1/1 Running 0 2h<br />
kube-flannel-ds-894bt 1/1 Running 0 2h<br />
kube-flannel-ds-kbngw 1/1 Running 0 2h<br />
kube-flannel-ds-n7h45 1/1 Running 0 2h<br />
kube-flannel-ds-tz2rc 1/1 Running 0 2h<br />
kube-proxy-6f4lm 1/1 Running 0 2h<br />
kube-proxy-f92js 1/1 Running 0 2h<br />
kube-proxy-qkh54 1/1 Running 0 2h<br />
kube-proxy-szvlt 1/1 Running 0 2h<br />
kube-scheduler-k8s 1/1 Running 0 2h<br />
</pre><br />
</li><br />
</ol><br />
<br />
Следует обратить внимание, что <tt>coredns</tt> находятся в состоянии <tt>Running</tt>.<br />
Количество <tt>kube-flannel</tt> и <tt>kube-proxy</tt> зависит от общего числа нод (в данном случае их четыре).<br />
<br />
== Тестовый запуск <tt>nginx</tt> ==<br />
<ol><br />
<li><br />
Для начала создадим Deployment:<br />
: <code>$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml</code>;<br />
</li><br />
<li><br />
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети.<br />
: Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию:<br />
<pre><br />
apiVersion: v1<br />
kind: Service<br />
metadata:<br />
name: nginx<br />
labels:<br />
app: nginx<br />
spec:<br />
type: NodePort<br />
ports:<br />
- port: 80<br />
targetPort: 80<br />
selector:<br />
app: nginx<br />
</pre><br />
</li><br />
<li><br />
Запустим новый сервис:<br />
: <code>$ kubectl apply -f nginx-service.yaml</code>.<br />
</li><br />
<li><br />
Теперь можно узнать его порт:<br />
: <code>$ kubectl get svc nginx</code><br />
: Возможный вывод:<br />
<pre><br />
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE<br />
nginx NodePort 10.108.199.141 <none> 80:32336/TCP 4h<br />
</pre><br />
</li><br />
<li><br />
Проверим, что всё работает:<br />
: <code>$ curl <ip адрес>:<порт></code>, где<br />
: ip адрес - это адрес любой из нод, а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>.<br />
</li><br />
</ol><br />
<br />
[[Категория:Виртуализация]]<br />
{{Category navigation|title=Виртуализация|category=Виртуализация|sortkey={{SUBPAGENAME}}}}</div>37.146.69.23