Установка и настройка Kubernetes, запуск приложения в кластере K8s

В этой статье мы вкратце пробежимся по процедуре подготовки сервера и развертывания простейшего кластера Kubernetes на одном хосте, рассмотрим пример запуска контейнера Nginx в Kubernetes окружении.

Вкратце о том, что такое kubernates. Kubernetes (часто используется сокращение k8s )— это ПО с открытым исходным кодом, созданное для управления конвейеризованными приложениями, автоматизации развертывание и масштабирования.

Kubernetes написано на языке Go инженерами Google. Google открыл исходный код Kubernetes в 2014 году.

Плюсы использования:

  • Наиболее оптимальное утилизация железа
  • Упрощает доставку приложения за счет интеграции с CI/CD
  • Позволяет быстро масштабировать приложения
  • Отказоустойчивость
  • Переносимость

Это одни из самых очевидных плюсов внедрения. Давайте установим Kubernetes в виртуальной машине с ОС Ubuntu Server 20.04 и посмотрим на практике, как это работает.

Параметры VM:

  • IP: 192.168.0.19
  • Hostname: k8s-master

Подключитесь к консоли сервера через SSH.

Для начала отключим Firewall

# sudo ufw disable

Firewall stopped and disabled on system startup

Затем нужно отключить файл подкачки swap. С ним kubernates не запустится:

# sudo swapoff -a
# sudo sed -i 's/^/swap/#/swap/' /etc/fstab

Установка Docker для kubernates

Дальше нужно установить систему контейнеров Docker.

Разработчики Kubernates официально обьявили, что начиная с версии Kubernates v1.23 они полностью откажутся от Docker в качестве исполняемой среды контейнеров. Вместо docker будет использоваться нативный Container Runtime Interface (CRI). Все старые версии k8s и текущая Kubernetes v1.21 продолжают использовать docker в качестве системы контейнеризации.

Установите пакеты, позволяющие получить доступ к apt репозиториям по протоколу https:

# sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2

Добавьте официальный ключ GPG Docker:

# sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Добавьте репозиторий Docker:

# sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"

Теперь можно установить сам Docker:

# sudo apt-get update && sudo apt-get install -y

containerd.io=1.2.13-2

docker-ce=5:19.03.11~3-0~ubuntu-$(lsb_release -cs)

docker-ce-cli=5:19.03.11~3-0~ubuntu-$(lsb_release -cs)

Создайте конфиг файл для демона докера:


# sudo mkdir /etc/docker/
# sudo nano /etc/docker/daemon.json

Укажите следующую конфигурацию:

{_x000D_ "exec-opts": ["native.cgroupdriver=systemd"],_x000D_ "log-driver": "json-file",_x000D_ "log-opts": {_x000D_ "max-size": "100m"_x000D_ },_x000D_ "storage-driver": "overlay2"_x000D_}_x000D_ 
  • exec-opts — параметр определяет, что будет управлять контрольными группами контейнера.
  • log-driver — будет писать лог в json
  • max-size — максимальный размер лог фала
  • storage-driver — драйвер для файловой системы образов.

Перезапустите сервис Docker и добавьте его в автозагрузку:

# sudo mkdir -p /etc/systemd/system/docker.service.d
# sudo systemctl daemon-reload
# sudo systemctl restart docker
# sudo systemctl enable docker

Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install._x000D_Executing: /lib/systemd/systemd-sysv-install enable docker

После, нужно добавить изменить параметры iptables:

# sudo nano /etc/sysctl.d/k8s.conf

Нужно добавить следующие параметры:

net.bridge.bridge-nf-call-ip6tables = 1_x000D_net.bridge.bridge-nf-call-iptables = 1
Данные параметры разрешают обрабатывать bridge трафик в netfilter.

Примените настройки:

# sudo sysctl --system

Настройка и запуск kubernetes кластера

Теперь, нужно установить утилиты, позволяющие развернуть, настроить и управлять кластером kubernetes .

  • kubeadm — это утилита, позволяющая упростить установку кластера kubernetes
  • kubelet — компонент, который запускается на всех нодах в кластере и управляет запуском подов, выполняет мониторинг и т.д..
  • kubectl — консольная утилита управления кластером k8s

Для их установки добавляем GPG ключ:

# sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Добавляем репозиторий:

# sudo cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

Обновляем список реп и устанавливаем утилиты k8s:

# sudo apt-get update
# sudo apt-get install -y kubelet kubeadm kubectl

Все подготовительный этап закончен, можно приступить к установке самого kubernetes.

Скачиваем нужные образы с репозитория. Запускаем команду и идем наливать кофе, процесс может быть не быстрым, все зависит от скорости вашего интернета.

# sudo kubeadm config images pull

Для инициализации кластера k8s выполните команду:

# sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Ключ —pod-network-cidr указывает, что внутренняя (разворачиваемая Kubernetes) сеть будет 10.244.0.0/16.

Первый раз, когда я запустил данную команду, я получил сообщение об ошибке:

[init] Using Kubernetes version: v1.21.2_x000D_[preflight] Running pre-flight checks_x000D_error execution phase preflight: [preflight] Some fatal errors occurred:_x000D_[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2_x000D_[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`_x000D_To see the stack trace of this error execute with --v=5 or higher

Нужно запустить с ключем --v=5 , который выведет подробную причину ошибки. В моем случае, ВМ на которой устанавливал Kubernetes было выделено всего одно ядро, а требовалось как минимум 2.

Я отключил ВМ, добавил дополнительный vCPU и все запустилось. При успешном запуске, мы должны получить следующий вывод:

[init] Using Kubernetes version: v1.21.2_x000D_[preflight] Running pre-flight checks_x000D_[preflight] Pulling images required for setting up a Kubernetes cluster_x000D_[preflight] This might take a minute or two, depending on the speed of your internet connection_x000D_[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'_x000D_[certs] Using certificateDir folder "/etc/kubernetes/pki"_x000D_[certs] Generating "ca" certificate and key_x000D_[certs] Generating "apiserver" certificate and key_x000D_[certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.0.19]_x000D_[certs] Generating "apiserver-kubelet-client" certificate and key_x000D_[certs] Generating "front-proxy-ca" certificate and key_x000D_[certs] Generating "front-proxy-client" certificate and key_x000D_[certs] Generating "etcd/ca" certificate and key_x000D_[certs] Generating "etcd/server" certificate and key_x000D_[certs] etcd/server serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.0.19 127.0.0.1 ::1]_x000D_[certs] Generating "etcd/peer" certificate and key_x000D_[certs] etcd/peer serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.0.19 127.0.0.1 ::1]_x000D_[certs] Generating "etcd/healthcheck-client" certificate and key_x000D_[certs] Generating "apiserver-etcd-client" certificate and key_x000D_[certs] Generating "sa" key and public key_x000D_[kubeconfig] Using kubeconfig folder "/etc/kubernetes"_x000D_[kubeconfig] Writing "admin.conf" kubeconfig file_x000D_[kubeconfig] Writing "kubelet.conf" kubeconfig file_x000D_[kubeconfig] Writing "controller-manager.conf" kubeconfig file_x000D_[kubeconfig] Writing "scheduler.conf" kubeconfig file_x000D_[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"_x000D_[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"_x000D_[kubelet-start] Starting the kubelet_x000D_[control-plane] Using manifest folder "/etc/kubernetes/manifests"_x000D_[control-plane] Creating static Pod manifest for "kube-apiserver"_x000D_[control-plane] Creating static Pod manifest for "kube-controller-manager"_x000D_[control-plane] Creating static Pod manifest for "kube-scheduler"_x000D_[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"_x000D_[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s_x000D_[apiclient] All control plane components are healthy after 12.505102 seconds_x000D_[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace_x000D_[kubelet] Creating a ConfigMap "kubelet-config-1.21" in namespace kube-system with the configuration for the kubelets in the cluster_x000D_[upload-certs] Skipping phase. Please see --upload-certs_x000D_[mark-control-plane] Marking the node k8s-master as control-plane by adding the labels: [node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]_x000D_[mark-control-plane] Marking the node k8s-master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]_x000D_[bootstrap-token] Using token: z689oj.pu0b5nxub3frdob6_x000D_[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles_x000D_[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes_x000D_[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials_x000D_[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token_x000D_[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster_x000D_[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace_x000D_[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key_x000D_[addons] Applied essential addon: CoreDNS_x000D_[addons] Applied essential addon: kube-proxy_x000D_Your Kubernetes control-plane has initialized successfully!_x000D_To start using your cluster, you need to run the following as a regular user:_x000D_mkdir -p $HOME/.kube_x000D_sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config_x000D_sudo chown $(id -u):$(id -g) $HOME/.kube/config_x000D_Alternatively, if you are the root user, you can run:_x000D_export KUBECONFIG=/etc/kubernetes/admin.conf_x000D_You should now deploy a pod network to the cluster._x000D_Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:_x000D_https://kubernetes.io/docs/concepts/cluster-administration/addons/_x000D_Then you can join any number of worker nodes by running the following on each as root:_x000D_kubeadm join 192.168.0.19:6443 --token z689oj.pu0b5nxub3frdob6 _x000D_--discovery-token-ca-cert-hash sha256:0c91b280545ca27699da492ee24ba0db2630f97d6fc3795e9bed7c585df56451_x000D_

Все кластер k8s запустился. Для того, чтобы выполнять команды от текущего пользователя нужно скопировать конфиг администратора кластера.

Создайте каталог в home директории текущего пользователя:

# mkdir -p $HOME/.kube

Скопируйте конфиг администратора кластера:

# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

Выставите права:

# sudo chown $(id -u):$(id -g) $HOME/.kube/config

Также этот конфиг можно скопировать напрямую на хост, с которого вы хотите управлять кластером k8s.

Кластер почти настроен, но нужно еще установить плагин, который будет управлять сетью (CNI — Container Networking Interface). Для этого выполняем следующую команду:

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+_x000D_podsecuritypolicy.policy/psp.flannel.unprivileged created_x000D_clusterrole.rbac.authorization.k8s.io/flannel created_x000D_clusterrolebinding.rbac.authorization.k8s.io/flannel created_x000D_serviceaccount/flannel created_x000D_configmap/kube-flannel-cfg created_x000D_daemonset.apps/kube-flannel-ds created

И так как у нас тестовый кластер и он состоит из одного узла. Поэтому нам нужно разрешить запуск контейнеров на мастер ноде.

# kubectl taint nodes --all node-role.kubernetes.io/master-node/k8s-master untainted

Для проверки, что все компоненты кластера запустились и работают, выполните команду:

# kubectl get pods --namespace kube-system

Данная команда выводит все запущенные поды в системном namespace.

Pod — это логическое объединение контейнеров или контейнера в единое приложение с общим IP адресом и дисковыми ресурсами. Pod может состоять из одного контейнера или из нескольких. Допустим на одном из проектов у нас есть под состоящий из nginx, gunicorn с django проектом и celery.

Запуск контейнера nginx в kubernetes

Кластер kubernates установлен и работает, можно попробовать запустить тестовый под, например с веб сервером nginx. Для этого выполните команду:

# kubectl run nginx --image=nginx

pod/nginx created

Данной командой, мы указали кластеру скачать образ nginx последней доступной версии и запустить pod с данным образом.

Чтобы проверить работу нашего pod, выполним:

# kubectl get pods -w

Ключ -w позволяет ожидать смену статуса.

Для просмотра логов pod:

# kubectl logs nginx -f

Чтобы подключится в виртуальную консоль pod используйте команду:

# kubectl exec -it nginx -- /bin/bash

Для удаления pod:

# kubectl delete pods nginx

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 месяца ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 месяца ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 месяца ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 месяца ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 месяца ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

2 месяца ago