Оркестрация .NET Core + K8S Play Container

вставьте сюда описание изображения
Оркестрация контейнеров производственного уровня — автоматическое развертывание, масштабирование и управление контейнерами
Оркестрация контейнеров производственного уровня — автоматизированное развертывание, масштабирование и управление контейнерами.

  1. Введение
    Поскольку я недавно изучаю микросервисы, я буду играть с k8s (Kubernetes) на основе предыдущего докера, чтобы понять основные концепции и основные функции.

  2. Что такое к8с?
    k8s включает в себя множество базовых концепций, вы можете потратить десять минут, чтобы быстро понять основные концепции Kubernetes.
    На следующем рисунке показаны основные компоненты k8s:
    Кластер K8S
    вставьте сюда описание изображения

Вот простой список:

k8s Master: главный узел k8s, в основном включает:
Сервер API: предоставляет конечную точку REST, которую можно использовать для взаимодействия с кластером.
Контроллер репликации: используется для создания и репликации модулей.
Узел: узел k8s, который может быть виртуальной или физической машиной. Он, в свою очередь, содержит следующие компоненты:
Kubelet: агент главного узла.
Kube-proxy: используется Службой для маршрутизации ссылок на модули, как описано выше.
Docker или Rocket: технология контейнеров, используемая Kubernetes для создания контейнеров.
Pod: используется для размещения экземпляров приложений, в том числе:
Container: запущенный контейнер
Volume: общее хранилище (том)
IP Address: IP-адрес
Labels: метки, используемые для маркировки pod’ов
Service: сервисы, состоящие из группы pod'ов с одинаковыми метками, стратегия, используемая для управления доступом к модулям
3. Подготовка среды
Разобравшись с основными понятиями, давайте поиграем с ней. Есть три способа игры: один — следовать официальной онлайн-лаборатории k8s для практических занятий; второй — играть на основе k8s, интегрированного в Docker For Windows; третий — установить MiniKube для экспериментов. Здесь для пояснения выбран второй вариант.

PS: Многие новички сдаются сразу же после того, как столкнулись с неудачами на этапе подготовки среды.Автор также потратил много времени на создание этой среды k8s, включая переустановку системы один раз, пот! Я надеюсь, что следующие шаги помогут вам хорошо начать свое путешествие по k8s.

3.1 Включите Kubernetes в Docker для Windows
Сначала убедитесь, что вы установили Docker для Windows.
Из-за этой стены включение Kubernetes в Docker For Windows Client прошло не так гладко, как ожидалось. Наконец, обратитесь к этой статье, чтобы успешно включить его: Включить Kubernetes в Docker для Mac/Windows для китайских пользователей.
Если вы установили последнюю версию докера для клиента Windows (v2.0.0.3), вы можете выполнить следующие шаги:

Настройте официальное ускорение образов Docker Hub на китайском языке для демона Docker https://registry.docker-cn.com
git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
cd k8s-for-docker-desktop
git checkout v2.0.0.2 (этот шаг очень важен!!!)
Выполняется оболочка Powell ./load_images.ps1
Включить Kubernetes
выполняет kubectl cluster-info, следующий вывод указывает на нормальный запуск.
Мастер Kubernetes работает по адресу https://localhost:6445.
KubeDNS работает по адресу https://localhost:6445/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy.

Для дальнейшей отладки и диагностики проблем с кластером используйте дамп информации о кластере kubectl.
После успешного создания среды вы находитесь на полпути к успеху. Приложите настойчивые усилия для завершения следующих экспериментов!

  1. Запустите первый модуль
    4.1. Создайте начальный образ
    1. Сначала мы выполняем dotnet new mvc -n K8s.NET.Demo, чтобы создать приложение ASP.NET Core Mvc K8s.NET.Demo,
    и модифицируем HomeController следующим образом:

общедоступный класс HomeController: Controller { public IActionResult Index () { var hostname = Dns.GetHostName (); ViewBag.HostName = имя хоста; ViewBag.HostIp = Dns.GetHostAddresses(hostname).FirstOrDefault (ip => ip.AddressFamily == AddressFamily.InterNetwork); вернуть вид(); } публичной конфиденциальности IActionResult () { return View (); } public IActionResult CheckHealth() { if (new Random().Next (100) > 50) { return Ok ("ОК"); } еще { вернуть BadRequest(); } } [ResponseCache (Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error () {


















return View (new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
Измените Index.cshtml следующим образом:

@{ ViewData["Title"] = "Домашняя страница"; }

Добро пожаловать

Имя хоста:@ViewBag.HostName

IP хоста:@ViewBag.HostIp

Узнайте о создании веб-приложений с помощью ASP.NET Core .

2: Затем добавьте Dockerfile:

ОТ Microsoft/dotnet:sdk AS build-env
WORKDIR/app

Скопируйте csproj и восстановите как отдельные слои

КОПИРОВАТЬ *.csproj ./
ВЫПОЛНИТЬ восстановление dotnet

Скопируйте все остальное и создайте

КОПИРОВАТЬ . ./
RUN dotnet publish -c Release -o out

Построить образ среды выполнения

ИЗ microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out
ТОЧКА ВХОДА ["dotnet", "K8s.NET.Demo.dll"]
3: Затем выполните docker build -t k8s. net.demo Создайте зеркальное изображение. После успешного построения запустите образы докеров, чтобы просмотреть образ с именем k8s.net.demo.

4.2 Создайте файл описания модуля
Добавьте файл k8s-web-pod.yaml следующим образом:

apiVersion: v1
kind: Pod # Определить тип ресурса Kubernetes как
метаданные Pod:
name: k8s-net-pod # Определить имя
метки ресурса: # Пометить Pod, и его полезность будет представлена ​​позже
app: k8s-net -pod
spec : # Определить состояние ресурсов. Для пода наиболее важным атрибутом являются контейнеры containers
: # containers — это тип массива. Если вы хотите развернуть несколько контейнеров, вы можете добавить несколько элементов
— name: web # Определить имя контейнера в этом
образе пода: k8s.net.demo # Определить адрес образа контейнера, который запускает
под image, установив
порты IfNotPresent или Never:
- containerPort: 80 # Определить порт, на котором прослушивается контейнер (аналогично EXPOSE в Dockerfile, только для предоставления информации о документе) livenessProbe
: # Определение пробы живости
httpGet:
path: /Home/CheckHealth # Проба живости порт запроса пути
: 80 # Порт запроса зонда Liveness
4.3 Используйте kubectl create для создания модуля
Выполните следующую команду, чтобы завершить создание модуля:

$ kubectl create -f k8s-web-pod.yaml Под «
k8s-web-pod.yaml» создан
$ kubectl get под чтобы контейнер мог общаться с подом, это можно сделать, настроив переадресацию портов через kubectl port-forward.



$ kubectl port-forward k8s-net-pod 8090:80
Пересылка с 127.0.0.1:8090 -> 80
Пересылка с [::1]:8090 -> 80
Доступ к браузеру http://localhost:8090/, эффект такой показано ниже
вставьте сюда описание изображения

На данный момент мы успешно запустили первый модуль.

На этом этапе вы можете спросить, в чем разница между этим и запуском контейнера напрямую с помощью docker run -d -p 8091:80 k8s.net.demo? Не видел, где k8s такой мощный? !
Не волнуйтесь, вы можете снова запустить kubectl get pod, и я дам вам ответ.

$ kubectl get po
ИМЯ ГОТОВНОСТЬ СТАТУС ПЕРЕЗАПУСКИ ВОЗРАСТ
k8s-net-pod 1/1 Выполняется 17 1h
Если столбец RESTARTS отсутствует, он используется для указания того, сколько раз модуль был перезапущен. Используйте докер для запуска контейнера.Если контейнер зависнет, докер не будет нести ответственность за перезапуск контейнера для вас.
В k8s вам нужно только настроить зонд выживания, и k8s автоматически обнаружит рабочий статус контейнера и автоматически перезапустит его. Тест живучести должен только указать узел livenessProbe в файле yaml. (PS: /home/checkhealth использует случайные числа для имитации рабочего состояния контейнерных приложений. Когда случайное число меньше 50, возвращается BadRequest.)

И это только верхушка айсберга k8s.

  1. Запустите первый Service
    Pod для запуска внутри кластера. Хотя вы можете использовать kubect port-forward для сопоставления порта для локального доступа, он по-прежнему недоступен снаружи. Если вам нужно открыть его для прямого внешнего доступа, вам нужно создать сервис.

5.1 Использование kubectl expose для создания сервиса
Мы можем напрямую выставить запущенный в данный момент экземпляр модуля через модуль kubectl expose.

$ kubectl expose pod k8s- net -pod --name k8s-net-service --type=NodePort
сервис «k8s-net-service »
открыт net-service NodePort 10.98.62.192 80:30942/TCP 7m Как и выше, он имеет CLUSTER-IP 10.98.62.192, поэтому мы можем использовать 10.98.62.192:80 в кластере для доступа к службе, если она находится за пределами кластера. , вы можете использовать NodeIP:30942 (IP-адрес сервера, на котором расположен узел) для доступа.


5.2 Используйте файл описания сервива для создания
Другой способ — создать файл описания, добавив файл k8s-net-service.yaml:

apiVersion: v1
kind: Service # Определить тип ресурса Kubernetes как
метаданные Service:
name: k8s-net-service # Определить имя спецификации ресурса
:
selector: # Указать соответствующее
приложение Pod: k8s-net-pod # Указать пометить Pod как
порты k8s-net-pod:

  • протокол: TCP # Тип протокола
    port: 80 # Укажите порт для доступа к службе
    targetPort: 80 # Укажите порт для запросов на переадресацию службы
    nodePort: 30000
    type: NodePort # Укажите тип службы, здесь используйте NodePort для внешнего доступа
    выполнить kubectl create - f k8s -net-service.yaml для создания службы.

$ kubectl create -f k8s-net-service.yaml
сервис «k8s-net-service» создан
$ kubectl get service
ИМЯ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
k8s-net-service NodePort 10.98.62.192 80:30942 /TCP 23m
k8s-net-service NodePort 10.97.110.150 80:30000/TCP 34s
kubernetes ClusterIP 10.96.0.1 443/TCP 1d
6. Попробуйте бесплатное масштабирование k8s
Пришло время испытать мощную функцию автоматического масштабирования k8s. В k8s управление модулями осуществляется путем создания ReplicaSet или Deployment, а затем выполняется автоматическое расширение и управление.
PS: ReplicaController также можно использовать, но ReplicaSet рекомендуется, поскольку его функция сопоставления меток более мощная.

6.1 Запуск первого набора реплик
Сначала определите файл описания набора реплик k8s-net-replicaset.yaml:

apiVersion: apps/v1beta2 # Номер версии rs — apps/v1beta2
kind: ReplicaSet # Определить тип ресурса Kubernetes как
метаданные ReplicaSet:
name: k8s-net-replicaset # Определить имя спецификации ресурса
:
replicas: 3 # Указать число экземпляров модуля
Селектор числа: # селектор модуля
matchLabels: # Укажите соответствующую метку
app: k8s-net-pod # Укажите метку модуля как k8s-net-pod
template: # Создайте новый
метаданные конфигурации шаблона модуля:
labels :
app: k8s-net -pod # Укажите, какой модуль использовать
spec:
container:
- name: k8s-net-replicaset
image: k8s.net.demo # Укажите образ для использования
imagePullPolicy: IfNotPresent # Значение k8s по умолчанию — Always , который всегда извлекает образ с удаленного конца. Используйте локальный образ, задав параметр IfNotPresent или Never
Execute для создания ReplicaSet и наблюдайте за автоматически созданным экземпляром pod.

$ kubectl create -f k8s-net-replicaset.yaml
replicaset.apps «k8s-net-replicaset» создан
$ kubectl get rs
ИМЯ ЖЕЛАЕМЫЙ ТЕКУЩИЙ ВОЗРАСТ ГОТОВНОСТИ
k8s-net-replicaset 3 3 3 8s
$ kubectl get pod
ИМЯ ГОТОВ СТАТУС ВОЗРАСТ ПЕРЕЗАПУСКА
k8s-net-pod 1/1 Работает 61 12h
k8s-net-replicaset-bxw9c 1/1 Работает 0 35 с
k8s-net-replicaset-k6kf7 1/1 Работает 0 35 с
$ kubectl delete po k8s-net-replicaset-bxw9c
pod “ k8s-net-replicaset-bxw9c” удален
$ kubectl get po
ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКИ ВОЗРАСТ
k8s-net-pod 1/1 Выполняется 61 12h
k8s-net-replicaset-bxw9c 0/1 Завершается 0 2m
k8s-net-replicaset-k6kf7 1 /1 Работает 0 2 м
k8s-net-replicaset-xvb9l 1/1 Работает 0 6 с
Как видно из вышеизложенного, k8s-net-replicaset создал две дополнительные копии пода, используя k8s-net-pod в качестве шаблона.Когда мы попытаемся удалить одну из копий и снова проверим список подов, replicaset автоматически пересоздаст под для нас.
Затем давайте попробуем представить только что созданный набор k8s-net-replicaset как службу, чтобы увидеть, на что похожа фактическая операция. Выполните последовательно следующие команды:

$ kubectl expose replicaset k8s-net-replicaset --type=LoadBalancer --port=8091 --target-port=80 --name k8s-net-rs
-service
сервис «k8s-net-rs-service» выставлен
$ kubectl get service
ИМЯ ТИП КЛАСТЕРА-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
k8s-net-rs-service LoadBalancer 10.99.134.237 localhost 8091:32641/TCP 8s
k8s-net-service NodePort 10.104.21.80 80:30000/TCP 12h
kubernetes ClusterIP 10.96 .0.1 443/TCP 12h
Затем браузер посещает http://localhost:8091/, попробуйте обновить браузер несколько раз, эффект отображения выглядит следующим образом, мы обнаружили, что ReplicaSet помог нам хорошо справиться с балансировкой нагрузки .
эффект балансировки нагрузки
вставьте сюда описание изображения

Если количество посещений сайта сейчас резко возрастает, а три инстанса все еще не могут его эффективно поддерживать, можно ли добиться горизонтального масштабирования без остановки приложения? Конечно, да!
Просто выполните команду масштабирования kubectl для расширения.

$ kubectl get pod
НАЗВАНИЕ СТАТУС ГОТОВ ПЕРЕЗАПУСКИ ВОЗРАСТ
k8s-net-replicaset-g4n6g 1/1 Работает 0 13m
k8s-net-replicaset-lkrf7 1/1 Работает 0 13m
k8s-net-replicaset-tf992 1/1 Работает 0 13m
$ kubectl масштабировать набор реплик k8s-net-replicaset --replicas=6 replicaset.extensions «k8s-net- replicaset
» масштабировать
$ kubectl получить под -g4n6g 1/1 Работает 0 13m k8s-net-replicaset-lkrf7 1/1 Работает 0 13m k8s-net-replicaset-pjl9m 0/1 ContainerCreating 0 3s k8s-net-replicaset-qpn2l 0/1 ContainerCreating 0 3s k8s-net -replicaset-tf992 1/1 Бег 0 13м







Из приведенного выше вывода мы видим, что мы можем расширить экземпляр модуля до 6 с помощью одной команды, не правда ли, это очень просто? !

Вы спросите еще раз, сейчас я прошел пик посещений, как мне быстро масштабировать приложение? Ах, как и выше, вам просто нужно изменить параметр --replicas на меньшую точку, как этот kubectl scale replicaset k8s-net-replicaset --replicas=3.

Supongo que te gusta

Origin blog.csdn.net/weixin_43214644/article/details/127627490
Recomendado
Clasificación