Kubernetes: различия между версиями
(не показано 15 промежуточных версий 4 участников) | |||
Строка 2: | Строка 2: | ||
Инструкция по работе с kubernetes. | Инструкция по работе с kubernetes. | ||
== Подготовка == | == Подготовка == | ||
Нужны несколько машин (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 | : <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> - внутренняя сеть, данное значение | :: <code>--pod-network-cidr=10.244.0.0/16</code> - внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы <tt>Flannel</tt>; | ||
:: <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> для работы от пользователя | |||
<ol> | <ol> | ||
<li> | <li> | ||
Строка 44: | Строка 60: | ||
<li> | <li> | ||
После этого все остальные ноды нужно подключить к мастеру: | После этого все остальные ноды нужно подключить к мастеру: | ||
: <code># kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> | : <code># kubeadm join <ip адрес>:<порт> --token <токен> --discovery-token-ca-cert-hash sha256:<хэш> --ignore-preflight-errors=SystemVerification</code>. | ||
: Проверить наличие нод можно так: | : Проверить наличие нод можно так: | ||
:: <code>$ kubectl get nodes -o wide</code> | :: <code>$ kubectl get nodes -o wide</code> | ||
Строка 92: | Строка 108: | ||
</li> | </li> | ||
<li> | <li> | ||
Затем сервис, с помощью которого | Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети. | ||
: Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию: | : Сохраним в файл {{path|nginx-service.yaml}} следующую кофигурацию: | ||
<pre> | <pre> | ||
Строка 111: | Строка 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> | ||
: Возможный вывод: | : Возможный вывод: | ||
Строка 126: | Строка 142: | ||
Проверим, что всё работает: | Проверим, что всё работает: | ||
: <code>$ curl <ip адрес>:<порт></code>, где | : <code>$ curl <ip адрес>:<порт></code>, где | ||
: ip адрес - это адрес любой из нод, а порт | : ip адрес - это адрес любой из нод, а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда: <code>curl 10.10.3.120:32336</code>. | ||
</li> | </li> | ||
</ol> | </ol> | ||
[[ | [[Категория:Виртуализация]] | ||
{{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
.
Разворачивание кластера
-
На мастере нужно запустить команду для запуска кластера:
# 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:<хэш>
.
-
Настройка kubernetes для работы от пользователя
-
Создать каталог ~/.kube:
$ mkdir ~/.kube
;
-
Скопировать конфиг:
# cp /etc/kubernetes/admin.conf ~<пользователь>/.kube/config
;
-
Изменить владельца конфига:
# chown <пользователь>: ~<пользователь>/.kube/config
.
-
Создать каталог ~/.kube:
-
После этого все остальные ноды нужно подключить к мастеру:
# 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
-
Далее следует развернуть сеть. Для этого можно запустить команду:
$ 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
-
Для начала создадим Deployment:
$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml
;
-
Затем создадим сервис, с помощью которого можно получить доступ к нашему приложению из внешней сети.
- Сохраним в файл nginx-service.yaml следующую кофигурацию:
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: type: NodePort ports: - port: 80 targetPort: 80 selector: app: nginx
-
Запустим новый сервис:
$ kubectl apply -f nginx-service.yaml
.
-
Теперь можно узнать его порт:
$ kubectl get svc nginx
- Возможный вывод:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.108.199.141 <none> 80:32336/TCP 4h
-
Проверим, что всё работает:
$ curl <ip адрес>:<порт>
, где- ip адрес - это адрес любой из нод, а порт - это порт сервиса, полученный с помощью предыдущей команды. Если использовать данные из примеров, то возможная команда:
curl 10.10.3.120:32336
.