Kubernetes: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 29 промежуточных версий 7 участников)
Строка 4: Строка 4:


== Подготовка ==
== Подготовка ==
Нужны несколько машин (nodes). Одна из которых будет мастером.
Нужны несколько машин (nodes), одна из которых будет мастером.
Системные требования:
Системные требования:
* 2Gb ОЗУ или больше;
* 2GB ОЗУ или больше;
* 2 ядра процессора или больше
* 2 ядра процессора или больше;
* Все машины должны быть доступны по сети друг для друга;
* Все машины должны быть доступны по сети друг для друга;
* Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts).
* Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts);
* Своп должен быть выключен;
* Своп должен быть выключен


Следует выбрать один из двух интерфейсов запуска контейнеров docker или crio.
=== Пакеты и сервисы ===
<ol>
<li>
Нужно установить следующие пакеты:
<syntaxhighlight lang="console">
# apt-get install kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools
</syntaxhighlight>
</li>
<li>
И запустить сервисы crio и kubelet:
<syntaxhighlight lang="console">
# systemctl enable --now crio kubelet
</syntaxhighlight>
</li>
</ol>
 
== Разворачивание кластера ==
=== Подготовка ===
Отключите подкачку:
<syntaxhighlight lang="console">
# swapoff -a
</syntaxhighlight>
 
=== Разворачивание ===
<ol>
<li> На мастере нужно запустить одну из двух следующих команд для запуска кластера:


===Docker===
<ul>
Для разворачивания кластера с использованием docker,
<li>
* Должны быть установлены следующие пакеты:
: <code># apt-get install docker-ce kubernetes-kubeadm kubernetes-kubelet cri-tools</code>;
* И запущены сервисы docker, kubelet и kube-proxy:
: <code># systemctl enable --now docker kubelet kube-proxy</code>.


===Crio===
Для настройки сети с использованием '''Flannel''':
А для разворачивания кластера с использованием crio,
<syntaxhighlight lang="console">
* Должны быть установлены следующие пакеты:
# kubeadm init --pod-network-cidr=10.244.0.0/16
: <code># apt-get install cri-o kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools</code>;
</syntaxhighlight>
* Отредактирован конфиг для использования crio
: <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>;
* И запущены сервисы crio, kubelet и kube-proxy:
: <code># systemctl enable --now crio kubelet kube-proxy</code>.


== Разворачивание кластера ==
Для использования control plane образов на базе ALT вместо образов по умолчанию:
<ol>
<syntaxhighlight lang="console">
# kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.26.9 --image-repository=registry.altlinux.org/k8s-p10
</syntaxhighlight>
 
</li>
<li>
<li>
На мастере нужно запустить команду для запуска кластера:
 
: <code># kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification</code>.
Для настройки сети с использованием '''Calico'''
: Пояснение флагов:
<syntaxhighlight lang="console">
:: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>;
# kubeadm init --pod-network-cidr=192.168.0.0/16
:: <code>--ignore-preflight-errors=SystemVerification</code> - говорит не считать версию docker слишком новой.
</syntaxhighlight>
: В конце вывода будет строка вида:
 
: <code>kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш></code>.
Для использования control plane образов на базе ALT вместо образов по умолчанию:
<syntaxhighlight lang="console">
# kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.26.9 --image-repository=registry.altlinux.org/k8s-p10
</syntaxhighlight>
 
</li>
</ul>
 
Пояснение флагов:
 
: <code>--pod-network-cidr=10.244.0.0/16</code> внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>;
 
: <code>--image-repository=registry.altlinux.org/k8s-p10</code> — переопределение реестра, откуда будут скачиваться control plane образы.
 
: <code>--kubernetes-version=1.26.9</code> — использовать версию kubernetes 1.26.9 для компонентов control plane.
 
В конце вывода будет строка вида:
<syntaxhighlight lang="console">
kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>
</syntaxhighlight>
 
</li>
</li>
<li>
<li>
Настройка <tt>kubernetes</tt> для работы от пользователя
Настройка <tt>kubernetes</tt> для работы от пользователя
<ol>
<ol>
<li>
<li>
Создать каталог {{path|~/.kube}}:
Создать каталог {{path|~/.kube}}:
: <code>$ mkdir ~/.kube</code>;
<syntaxhighlight lang="console">
$ mkdir ~/.kube
</syntaxhighlight>
</li>
</li>
<li>
<li>
Скопировать конфиг:
Скопировать конфиг:
: <code># cp /etc/kubernetes/admin.conf ~<пользователь>/.kube/config</code>;
<syntaxhighlight lang="console">
# cp /etc/kubernetes/admin.conf /home/<пользователь>/.kube/config
</syntaxhighlight>
</li>
</li>
<li>
<li>
Изменить владельца конфига:
Изменить владельца конфига:
: <code># chown <пользователь>: ~<пользователь>/.kube/config</code>.
<syntaxhighlight lang="console">
# chown <пользователь>: /home/<пользователь>/.kube/config
</syntaxhighlight>
</li>
</li>
</ol>
</ol>
Строка 60: Строка 108:
<li>
<li>
После этого все остальные ноды нужно подключить к мастеру:
После этого все остальные ноды нужно подключить к мастеру:
: <code># kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> --ignore-preflight-errors=SystemVerification</code>.
<syntaxhighlight lang="console">
# kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>
</syntaxhighlight>
: Проверить наличие нод можно так:
: Проверить наличие нод можно так:
:: <code>$ kubectl get nodes -o wide</code>
: <syntaxhighlight lang="console">
$ kubectl get nodes -o wide
</syntaxhighlight>
: Вывод примерно следующий:
: Вывод примерно следующий:
<pre>
<syntaxhighlight lang="console">
NAME     STATUS   ROLES     AGE       VERSION  INTERNAL-IP  EXTERNAL-IP  OS-IMAGE      KERNEL-VERSION       CONTAINER-RUNTIME
NAME     STATUS     ROLES           AGE   VERSION  INTERNAL-IP  EXTERNAL-IP  OS-IMAGE      KERNEL-VERSION         CONTAINER-RUNTIME
docker1   Ready    <none>    4h        v1.11.2   10.10.3.23   <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
master  NotReady  control-plane  19m   v1.24.8   172.16.0.8   <none>        ALT Regular  5.15.90-std-def-alt1  cri-o://1.24.3
docker2   Ready    <none>   4h        v1.11.2   10.10.3.120  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
node    NotReady   <none>         19m  v1.24.8   172.16.0.9    <none>        ALT Regular  5.15.90-std-def-alt1  cri-o://1.24.3
docker3  Ready    <none>   4h        v1.11.2  10.10.3.157  <none>       ALT Regular  4.17.14-un-def-alt1  docker://Unknown
</syntaxhighlight>
k8s      Ready    master    4h        v1.11.2  10.10.3.227  <none>       ALT Regular  4.17.14-un-def-alt1  docker://Unknown
Обратите внисание, что ноды находятся в состоянии <tt>'''NotReady'''</tt>. Они перейдут в состояние <tt>Ready</tt> после настройки сети.
</pre>
</li>
</li>
<li>
<li>
Далее следует развернуть сеть. Для этого можно запустить команду:
Далее следует развернуть сеть. Для этого можно запустить один из следующих наборов команд:
: <code>$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</code>.
:* Для Flannel:
: <syntaxhighlight lang="console">
$ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
</syntaxhighlight>
:* Для Flannel с использованием образов на базе ALT:
:: Манифесты находятся по адресу https://gitea.basealt.ru/alt/flannel-manifests/<платформа>.
:: Где  <платформа> на текущий момент (25.10.2024): <code>sisyphus</code>, <code>p10</code>, <code>c10f2</code>.
:: Каждый каталог платформы содержит каталоги
:: <syntaxhighlight lang="console">
├── <major>
│   ├── <minor>
│   │   └── <patch>
│   │      └── kube-flannel.yml
...
└── latest
    └── kube-flannel.yml
</syntaxhighlight>
:: Выберите для Вашей платформы (например <code>sisyphus</code>) установленной версии <code>kubernetes</code> необходимую версию <code>flannel</code> (например <code>0.25.7</code>) и наберите команду разворачивания:
:: <syntaxhighlight lang="console">
$ kubectl apply -f https://gitea.basealt.ru/alt/flannel-manifests/raw/branch/main/sisyphus/0/25/7/kube-flannel.yml
</syntaxhighlight>
:: Для последних версий <code>kubernetes</code> можно использовать последнюю версию <code>flannel</code> (тег <code>latest</code>):
:: <syntaxhighlight lang="console">
$ kubectl apply -f https://gitea.basealt.ru/alt/flannel-manifests/raw/branch/main/sisyphus/latest/kube-flannel.yml
</syntaxhighlight>
 
:* Для Calico:
::Перед запуском <code>calico-манифестов</code> перейдите в каталог <code>/etc/cni/net.d/</code>:
: <syntaxhighlight lang="console">
# cd /etc/cni/net.d/
</syntaxhighlight>
::и создайте файл <code>100-crio-bridge.conflist</code>
: <syntaxhighlight lang="console">
# cp 100-crio-bridge.conflist.sample 100-crio-bridge.conflist
</syntaxhighlight>
::Запустите POD'ы из <code>calico-манифестов</code>:
: <syntaxhighlight lang="console">
$ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/master/manifests/tigera-operator.yaml
</syntaxhighlight>
: <syntaxhighlight lang="console">
$ kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/master/manifests/custom-resources.yaml
</syntaxhighlight>
: Проверить, что всё работает можно так:
: Проверить, что всё работает можно так:
:: <code>$ kubectl get pods --namespace kube-system</code>.
<syntaxhighlight lang="console">
: Вывод должен быть похож на это:
$ kubectl get pods --namespace kube-system
<pre>
</syntaxhighlight>
: Вывод должен быть примерно таким:
<syntaxhighlight lang="console">
NAME                          READY    STATUS    RESTARTS  AGE
NAME                          READY    STATUS    RESTARTS  AGE
coredns-78fcdf6894-6trk7      1/1      Running  0          2h
coredns-78fcdf6894-6trk7      1/1      Running  0          2h
Строка 94: Строка 188:
kube-proxy-szvlt              1/1      Running  0          2h
kube-proxy-szvlt              1/1      Running  0          2h
kube-scheduler-k8s            1/1      Running  0          2h
kube-scheduler-k8s            1/1      Running  0          2h
</pre>
</syntaxhighlight>
</li>
</li>
</ol>
</ol>


Следует обратить внимание, что <tt>coredns</tt> находятся в состоянии <tt>Running</tt>.
Следует обратить внимание, что <tt>coredns</tt> находятся в состоянии <tt>'''Running'''</tt>.
Количество <tt>kube-flannel</tt> и <tt>kube-proxy</tt> зависит от общего числа нод (в данном случае их четыре).
Количество <tt>kube-flannel</tt> и <tt>kube-proxy</tt> зависит от общего числа нод (в данном случае их четыре).
Если coredns находится в состоянии "crashloopbackoff", то проверьте содержимое файла {{path|/etc/resolv.conf}}. Для каждой ноды в резолвере должны быть указаны реальные адреса (например 192.168.3.30, при развертывании в локальной сети  на виртуальных машинах)


== Тестовый запуск <tt>nginx</tt> ==
== Тестовый запуск <tt>nginx</tt> ==
Строка 105: Строка 200:
<li>
<li>
Для начала создадим Deployment:
Для начала создадим Deployment:
: <code>$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml</code>;
<syntaxhighlight lang="console">
$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml
</syntaxhighlight>
</li>
</li>
<li>
<li>
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети.
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети.
: Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию:
Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию:
<pre>
<syntaxhighlight lang="yaml">
apiVersion: v1
apiVersion: v1
kind: Service
kind: Service
Строка 124: Строка 221:
   selector:
   selector:
     app: nginx
     app: nginx
</pre>
</syntaxhighlight>
</li>
</li>
<li>
<li>
Запустим новый сервис:
Запустим новый сервис:
: <code>$ kubectl apply -f nginx-service.yaml</code>.
<syntaxhighlight lang="console">
$ kubectl apply -f nginx-service.yaml
</syntaxhighlight>
</li>
</li>
<li>
<li>
Теперь можно узнать его порт:
Теперь можно узнать его порт:
: <code>$ kubectl get svc nginx</code>
<syntaxhighlight lang="console">
: Возможный вывод:
$ kubectl get svc nginx
<pre>
</syntaxhighlight>
Возможный вывод:
<syntaxhighlight lang="console">
NAME      TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)        AGE
NAME      TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)        AGE
nginx    NodePort  10.108.199.141  <none>        80:32336/TCP  4h
nginx    NodePort  10.108.199.141  <none>        80:32336/TCP  4h
</pre>
</syntaxhighlight>
</li>
</li>
<li>
<li>
Проверим, что всё работает:
Проверим, что всё работает:
: <code>$ curl <ip адрес>:<порт></code>, где
<syntaxhighlight lang="console">
: ip адрес - это адрес любой из нод, а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>.
$ curl <ip адрес>:<порт>
</syntaxhighlight>
где
: ip адрес - это адрес любой из нод (не мастера), а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>.
</li>
</li>
</ol>
</ol>

Текущая версия от 16:48, 29 октября 2024

Kubernetes

Инструкция по работе с kubernetes.

Подготовка

Нужны несколько машин (nodes), одна из которых будет мастером. Системные требования:

  • 2GB ОЗУ или больше;
  • 2 ядра процессора или больше;
  • Все машины должны быть доступны по сети друг для друга;
  • Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts);
  • Своп должен быть выключен

Пакеты и сервисы

  1. Нужно установить следующие пакеты:
    # apt-get install kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools
    
  2. И запустить сервисы crio и kubelet:
    # systemctl enable --now crio kubelet
    

Разворачивание кластера

Подготовка

Отключите подкачку:

# swapoff -a

Разворачивание

  1. На мастере нужно запустить одну из двух следующих команд для запуска кластера:
    • Для настройки сети с использованием Flannel:
      # kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Для использования control plane образов на базе ALT вместо образов по умолчанию:

      # kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.26.9 --image-repository=registry.altlinux.org/k8s-p10
      
    • Для настройки сети с использованием Calico
      # kubeadm init --pod-network-cidr=192.168.0.0/16
      

      Для использования control plane образов на базе ALT вместо образов по умолчанию:

      # kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.26.9 --image-repository=registry.altlinux.org/k8s-p10
      

    Пояснение флагов:

    --pod-network-cidr=10.244.0.0/16 — внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы Flannel;
    --image-repository=registry.altlinux.org/k8s-p10 — переопределение реестра, откуда будут скачиваться control plane образы.
    --kubernetes-version=1.26.9 — использовать версию kubernetes 1.26.9 для компонентов control plane.

    В конце вывода будет строка вида:

    kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>
    
  2. Настройка kubernetes для работы от пользователя
    1. Создать каталог ~/.kube:
      $ mkdir ~/.kube
      
    2. Скопировать конфиг:
      # cp /etc/kubernetes/admin.conf /home/<пользователь>/.kube/config
      
    3. Изменить владельца конфига:
      # chown <пользователь>: /home/<пользователь>/.kube/config
      
  3. После этого все остальные ноды нужно подключить к мастеру:
    # kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>
    
    Проверить наличие нод можно так:
    $ kubectl get nodes -o wide
    
    Вывод примерно следующий:
    NAME     STATUS     ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE      KERNEL-VERSION         CONTAINER-RUNTIME
    master   NotReady   control-plane   19m   v1.24.8   172.16.0.8    <none>        ALT Regular   5.15.90-std-def-alt1   cri-o://1.24.3
    node     NotReady   <none>          19m   v1.24.8   172.16.0.9    <none>        ALT Regular   5.15.90-std-def-alt1   cri-o://1.24.3
    

    Обратите внисание, что ноды находятся в состоянии NotReady. Они перейдут в состояние Ready после настройки сети.

  4. Далее следует развернуть сеть. Для этого можно запустить один из следующих наборов команд:
    • Для Flannel:
    $ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
    
    • Для Flannel с использованием образов на базе ALT:
    Манифесты находятся по адресу https://gitea.basealt.ru/alt/flannel-manifests/<платформа>.
    Где <платформа> на текущий момент (25.10.2024): sisyphus, p10, c10f2.
    Каждый каталог платформы содержит каталоги
     
    ├── <major>
    │   ├── <minor>
    │   │   └── <patch>
    │   │       └── kube-flannel.yml
    ...
    └── latest
        └── kube-flannel.yml
    
    Выберите для Вашей платформы (например sisyphus) установленной версии kubernetes необходимую версию flannel (например 0.25.7) и наберите команду разворачивания:
    $ kubectl apply -f https://gitea.basealt.ru/alt/flannel-manifests/raw/branch/main/sisyphus/0/25/7/kube-flannel.yml
    
    Для последних версий kubernetes можно использовать последнюю версию flannel (тег latest):
    $ kubectl apply -f https://gitea.basealt.ru/alt/flannel-manifests/raw/branch/main/sisyphus/latest/kube-flannel.yml
    
    • Для Calico:
    Перед запуском calico-манифестов перейдите в каталог /etc/cni/net.d/:
    # cd /etc/cni/net.d/
    
    и создайте файл 100-crio-bridge.conflist
    # cp 100-crio-bridge.conflist.sample 100-crio-bridge.conflist
    
    Запустите POD'ы из calico-манифестов:
    $ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/master/manifests/tigera-operator.yaml
    
    $ kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/master/manifests/custom-resources.yaml
    
    Проверить, что всё работает можно так:
    $ kubectl get pods --namespace kube-system
    
    Вывод должен быть примерно таким:
    NAME                          READY     STATUS    RESTARTS   AGE
    coredns-78fcdf6894-6trk7      1/1       Running   0          2h
    coredns-78fcdf6894-nwt5l      1/1       Running   0          2h
    etcd-k8s                      1/1       Running   0          2h
    kube-apiserver-k8s            1/1       Running   0          2h
    kube-controller-manager-k8s   1/1       Running   0          2h
    kube-flannel-ds-894bt         1/1       Running   0          2h
    kube-flannel-ds-kbngw         1/1       Running   0          2h
    kube-flannel-ds-n7h45         1/1       Running   0          2h
    kube-flannel-ds-tz2rc         1/1       Running   0          2h
    kube-proxy-6f4lm              1/1       Running   0          2h
    kube-proxy-f92js              1/1       Running   0          2h
    kube-proxy-qkh54              1/1       Running   0          2h
    kube-proxy-szvlt              1/1       Running   0          2h
    kube-scheduler-k8s            1/1       Running   0          2h
    

Следует обратить внимание, что coredns находятся в состоянии Running. Количество kube-flannel и kube-proxy зависит от общего числа нод (в данном случае их четыре). Если coredns находится в состоянии "crashloopbackoff", то проверьте содержимое файла /etc/resolv.conf. Для каждой ноды в резолвере должны быть указаны реальные адреса (например 192.168.3.30, при развертывании в локальной сети на виртуальных машинах)

Тестовый запуск nginx

  1. Для начала создадим Deployment:
    $ kubectl apply -f https://k8s.io/examples/application/deployment.yaml
    
  2. Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети. Сохраним в файл nginx-service.yaml следующую кофигурацию:
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
      selector:
        app: nginx
    
  3. Запустим новый сервис:
    $ kubectl apply -f nginx-service.yaml
    
  4. Теперь можно узнать его порт:
    $ kubectl get svc nginx
    

    Возможный вывод:

    NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    nginx     NodePort   10.108.199.141   <none>        80:32336/TCP   4h
    
  5. Проверим, что всё работает:
    $ curl <ip адрес>:<порт>
    

    где

    ip адрес - это адрес любой из нод (не мастера), а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: curl 10.10.3.120:32336.