Kubernetes
Kubernetes
Инструкция по работе с kubernetes.
Подготовка
Нужны несколько машин (nodes), одна из которых будет мастером. Системные требования:
- 2GB ОЗУ или больше;
- 2 ядра процессора или больше;
- Все машины должны быть доступны по сети друг для друга;
- Все машины должны успешно разрешать имена hostname друг друга (через DNS или hosts);
- Своп должен быть выключен
Пакеты и сервисы
1. Нужно установить следующие пакеты:
# apt-get install kubernetes-kubeadm kubernetes-kubelet kubernetes-crio cri-tools
;
2. Удалить настройку сети в crio по умолчанию:
# rm -f /etc/cni/net.d/100-crio-bridge.conf /etc/cni/net.d/200-loopback.conf
;
3. Добавить симлинк на плагин для настройки сети:
# ln -s /opt/cni/bin/flannel /usr/libexec/cni/flannel
;
4. И запустить сервисы crio и kubelet:
# systemctl enable --now crio kubelet
.
Разворачивание кластера
Предварительно:
- отключите подкачку:
swapoff -a
- включите пересылку пакетов:
sysctl net.ipv4.ip_forward=1
- загружаем модуль сетевого фильтра:
modprobe br_netfilter
-
На мастере нужно запустить одну из двух следующих команд для запуска кластера:
- Для настройки сети с использованием Flannel:
# kubeadm init --pod-network-cidr=10.244.0.0/16
.
- Для настройки сети с использованием Calico
# kubeadm init --pod-network-cidr=192.168.0.0/16
.
- Пояснение флагов:
--pod-network-cidr=10.244.0.0/16
- внутренняя (разворачиваемая Kubernetes) сеть, данное значение рекомендуется оставить для правильной работы Flannel;
- В конце вывода будет строка вида:
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:<хэш>
.- Проверить наличие нод можно так:
$ 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
-
Далее следует развернуть сеть. Для этого можно запустить один из двух наборов команд:
- Для Flannel:
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
.
- Для Calico:
$ kubectl apply -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
.$ kubectl apply -f https://projectcalico.docs.tigera.io/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 зависит от общего числа нод (в данном случае их четыре).
Тестовый запуск 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
.