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

Материал из ALT Linux Wiki
Перейти к: навигация, поиск
м (Kubernetes)
(Подготовка)
 
(не показано 17 промежуточных версий 4 участников)
Строка 2: Строка 2:
  
 
Инструкция по работе с kubernetes.
 
Инструкция по работе с kubernetes.
Описанные здесь действия можно выплнить с помощью <tt>ansible</tt> и следующих репозиториев:
 
http://git.altlinux.org/people/obirvalger/public/ansible-k8s.git,
 
http://git.altlinux.org/people/obirvalger/public/ansible-test-nginx.git.
 
  
 
== Подготовка ==
 
== Подготовка ==
 
Нужны несколько машин (nodes). Одна из которых будет мастером.
 
Нужны несколько машин (nodes). Одна из которых будет мастером.
На них должны быть установлены следующие пакеты:
+
Системные требования:
<code># apt-get install docker-ce kubernetes-kubeadm kubernetes-kubelet</code>.
+
* 2Gb ОЗУ или больше;
Все машины должны быть доступны по сети друг для друга.
+
* 2 ядра процессора или больше
 +
* Все машины должны быть доступны по сети друг для друга;
 +
* Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts).
 +
* Своп должен быть выключен;
 +
 
 +
Следует выбрать один из двух интерфейсов запуска контейнеров docker или crio.
 +
 
 +
===Docker===
 +
Для разворачивания кластера с использованием docker,
 +
* Должны быть установлены следующие пакеты:
 +
: <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===
 +
А для разворачивания кластера с использованием crio,
 +
* Должны быть установлены следующие пакеты:
 +
: <code># apt-get install cri-o kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools</code>;
 +
* Отредактирован конфиг для использования 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>.
  
 
== Разворачивание кластера ==
 
== Разворачивание кластера ==
Строка 16: Строка 34:
 
<li>
 
<li>
 
На мастере нужно запустить команду для запуска кластера:
 
На мастере нужно запустить команду для запуска кластера:
: <code># kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=FileExisting-crictl --ignore-preflight-errors=SystemVerification</code>.
+
: <code># kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification</code>.
 
: Пояснение флагов:
 
: Пояснение флагов:
:: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя сеть, данное значение нужно для работы <tt>Flannel</tt>;
+
:: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>;
:: Следующие флаги нужны для игнорирования ошибок (делают их warning'ами):
+
:: <code>--ignore-preflight-errors=SystemVerification</code> - говорит не считать версию docker слишком новой.
::: <code>--ignore-preflight-errors=FileExisting-crictl</code> - нужна так как пока не пакета crictl;
 
::: <code>--ignore-preflight-errors=SystemVerification</code> - говорит не считать версию docker слишком новой.
 
 
: В конце вывода будет строка вида:
 
: В конце вывода будет строка вида:
 
: <code>kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш></code>.
 
: <code>kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш></code>.
 
</li>
 
</li>
 
<li>
 
<li>
После этого все остальные ноды нужно подключить к мастеру:
+
Настройка <tt>kubernetes</tt> для работы от пользователя
: <code># kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> --ignore-preflight-errors=FileExisting-crictl --ignore-preflight-errors=SystemVerification</code>.
 
: Проверить наличие нод можно так:
 
:: <code>$ kubectl get nodes -o wide</code>
 
: Вывод примерно следующий:
 
<pre>
 
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
 
docker2  Ready    <none>    4h        v1.11.2  10.10.3.120  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
 
docker3  Ready    <none>    4h        v1.11.2  10.10.3.157  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
 
k8s      Ready    master    4h        v1.11.2  10.10.3.227  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
 
</pre>
 
</li>
 
<li>
 
Настроить <tt>kubernetes</tt> для работы от пользователя
 
 
<ol>
 
<ol>
 
<li>
 
<li>
Строка 55: Строка 57:
 
</li>
 
</li>
 
</ol>
 
</ol>
 +
</li>
 +
<li>
 +
После этого все остальные ноды нужно подключить к мастеру:
 +
: <code># kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>  --ignore-preflight-errors=SystemVerification</code>.
 +
: Проверить наличие нод можно так:
 +
:: <code>$ kubectl get nodes -o wide</code>
 +
: Вывод примерно следующий:
 +
<pre>
 +
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
 +
docker2  Ready    <none>    4h        v1.11.2  10.10.3.120  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
 +
docker3  Ready    <none>    4h        v1.11.2  10.10.3.157  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
 +
k8s      Ready    master    4h        v1.11.2  10.10.3.227  <none>        ALT Regular  4.17.14-un-def-alt1  docker://Unknown
 +
</pre>
 +
</li>
 
<li>
 
<li>
 
Далее следует развернуть сеть. Для этого можно запустить команду:
 
Далее следует развернуть сеть. Для этого можно запустить команду:
Строка 91: Строка 108:
 
</li>
 
</li>
 
<li>
 
<li>
Затем сервис, с помощью которого и можно получить доступ к нашему приложению из внешней сети;
+
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети.
 
: Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию:
 
: Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию:
 
<pre>
 
<pre>
Строка 110: Строка 127:
 
</li>
 
</li>
 
<li>
 
<li>
Запутим новый сервис:
+
Запустим новый сервис:
 
: <code>$ kubectl apply -f nginx-service.yaml</code>.
 
: <code>$ kubectl apply -f nginx-service.yaml</code>.
 
</li>
 
</li>
 
<li>
 
<li>
Теперь можно узнать, его порт:
+
Теперь можно узнать его порт:
 
: <code>$ kubectl get svc nginx</code>
 
: <code>$ kubectl get svc nginx</code>
 
: Возможный вывод:
 
: Возможный вывод:
Строка 125: Строка 142:
 
Проверим, что всё работает:
 
Проверим, что всё работает:
 
: <code>$ curl <ip адрес>:<порт></code>, где
 
: <code>$ curl <ip адрес>:<порт></code>, где
: ip адрес - это адрес любой из нод, а порт от сервиса. Если использовать данные из примеров, то возможная каоманда: <code>curl 10.10.3.120:32336</code>.
+
: ip адрес - это адрес любой из нод, а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>.
 
</li>
 
</li>
 
</ol>
 
</ol>
  
[[Category:Виртуализация]]
+
[[Категория:Виртуализация]]
 
{{Category navigation|title=Виртуализация|category=Виртуализация|sortkey={{SUBPAGENAME}}}}
 
{{Category navigation|title=Виртуализация|category=Виртуализация|sortkey={{SUBPAGENAME}}}}

Текущая версия на 07:34, 9 апреля 2021

Kubernetes[править]

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

Подготовка[править]

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

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

Следует выбрать один из двух интерфейсов запуска контейнеров docker или crio.

Docker[править]

Для разворачивания кластера с использованием docker,

  • Должны быть установлены следующие пакеты:
# apt-get install docker-ce kubernetes-kubeadm kubernetes-kubelet cri-tools;
  • И запущены сервисы docker, kubelet и kube-proxy:
# systemctl enable --now docker kubelet kube-proxy.

Crio[править]

А для разворачивания кластера с использованием crio,

  • Должны быть установлены следующие пакеты:
# apt-get install cri-o kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools;
  • Отредактирован конфиг для использования crio
# 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;
  • И запущены сервисы crio, kubelet и kube-proxy:
# systemctl enable --now crio kubelet kube-proxy.

Разворачивание кластера[править]

  1. На мастере нужно запустить команду для запуска кластера:
    # kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification.
    Пояснение флагов:
    --pod-network-cidr=10.244.0.0/16 - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы Flannel;
    --ignore-preflight-errors=SystemVerification - говорит не считать версию docker слишком новой.
    В конце вывода будет строка вида:
    kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш>.
  2. Настройка kubernetes для работы от пользователя
    1. Создать каталог ~/.kube:
      $ mkdir ~/.kube;
    2. Скопировать конфиг:
      # cp /etc/kubernetes/admin.conf ~<пользователь>/.kube/config;
    3. Изменить владельца конфига:
      # chown <пользователь>: ~<пользователь>/.kube/config.
  3. После этого все остальные ноды нужно подключить к мастеру:
    # kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> --ignore-preflight-errors=SystemVerification.
    Проверить наличие нод можно так:
    $ kubectl get nodes -o wide
    Вывод примерно следующий:
    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
    docker2   Ready     <none>    4h        v1.11.2   10.10.3.120   <none>        ALT Regular   4.17.14-un-def-alt1   docker://Unknown
    docker3   Ready     <none>    4h        v1.11.2   10.10.3.157   <none>        ALT Regular   4.17.14-un-def-alt1   docker://Unknown
    k8s       Ready     master    4h        v1.11.2   10.10.3.227   <none>        ALT Regular   4.17.14-un-def-alt1   docker://Unknown
    
  4. Далее следует развернуть сеть. Для этого можно запустить команду:
    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml.
    Проверить, что всё работает можно так:
    $ 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 зависит от общего числа нод (в данном случае их четыре).

Тестовый запуск 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.