Эта статья опубликована сообществом Huawei Cloud « Научим вас шаг за шагом писать вспомогательную программу Kubernetes », автор: Чжан Цзянь.
Что такое коляска?
коляска, дословно переводится как коляска. Как показано на рисунке выше, рядом с мотоциклом устанавливается коляска для расширения его функций. Например, езда более стабильна, он может тянуть больше людей и грузов, а человек, сидящий в коляске, может указывать дорогу водителю. , и т. д. Модель коляски обеспечивает разделение управления и логики за счет добавления «коляски» к сервису приложения .
Для микросервисов мы можем использовать дополнительную модель для реализации функций панели управления, которые не требуют реализации бизнес-сервисов, таких как сбор журналов, регистрация сервисов, обнаружение сервисов, текущее ограничение и аутентификация. Обычно по сравнению с моделью коляски это модель SDK, такая как Spring-cloud Все упомянутые выше возможности реализуются через SDK.
Оба режима реализации имеют свои преимущества и недостатки. Режим сопровождения приведет к дополнительным потерям производительности и задержкам, но традиционный режим SDK сделает код раздутым и усложнит обновления. Возможности плоскости управления и возможности бизнес-плоскости не могут быть обновлены отдельно.
Код этой статьи загружен на gitee.
принцип реализации коляски
Было введено множество функций коляски, но как коляска обеспечивает эти возможности?
Оказывается, в Kubernetes модуль — это наименьшая единица развертывания, но внутри модуля разрешено запускать несколько контейнеров, а тома хранения и сетевые стеки распределяются между несколькими контейнерами. Таким образом, мы можем использовать несколько контейнеров в качестве дополнительных модулей или init-container (инициализировать контейнер) для настройки разрешений смонтированного тома.
Коляска для сбора бревен
Принцип сайдкара сбора журналов реализован с использованием принципа, согласно которому несколько контейнеров могут совместно использовать подключенные тома. Сбор журналов достигается путем вывешивания пути журналов приложения и использования другой программы для доступа к журналам в этом пути. Здесь используется cat вместо этого. Для сбора журналов разверните шаблон yaml следующим образом.
apiVersion: v1 вид: Метаданные модуля: имя: спецификация веб-сервера: тома: - имя: общие журналы пустойDir: {} контейнеры: - имя: образ nginx : ttbb/nginx:mate VolumeMounts: - имя: общие журналы mountPath: /opt /sh/openresty/nginx/logs — имя: образ бокового контейнера : ttbb/base команда: ["sh","-c","пока true; выполните cat /opt/sh/openresty/nginx/logs/nginx. pid; Sleep 30; Done"] VolumeMounts: - имя: общие журналы MountPath: /opt/sh/openresty/nginx/logs
Используйте kubectl create -f для создания модуля и используйте команду kubectl logs, чтобы просмотреть выходные данные журнала, напечатанные Sidecar-Container.
Kubectl регистрирует боковой контейнер веб-сервера
Боковая часть запроса вперед
В этом разделе мы реализуем сайдкар, который пересылает запросы приложению.Код приложения выглядит следующим образом.
используйте std::io::prelude::*; используйте std::net::{TcpListener, TcpStream}; fn main() { let Listener = TcpListener::bind("127.0.0.1:7878").unwrap(); для потока в Listener.incoming() { letstream =stream.unwrap(); handle_connection (поток); } println!("Привет, мир!"); } fn handle_connection (mutstream: TcpStream) { let mutuffer = [0; 1024]; поток.read(&mutuffer).unwrap(); пусть содержимое = «Привет»; let ответ = формат!( "HTTP/1.1 200 OK\r\nContent-Length: {}\r\n\r\n{}", content.len(), contents ); println!("получить запрос!"); stream.write(response.as_bytes()).unwrap(); поток.flush().unwrap(); }
Давайте напишем еще один сайдкар, который будет делать запросы к приложению каждые 15 секунд.
используйте std::thread; используйте std::time::Duration; fn main() { цикл { thread::sleep(Duration::from_secs(15)); let ответ = reqwest::blocking::get("http://localhost:7878").unwrap(); println!("{}", response.text().unwrap()) } }
Создайте образ с помощью скрипта под хранилищем intput/build.sh
и запустите yaml следующим образом.
apiVersion: вид v1: Метаданные модуля: имя: спецификация веб-сервера: контейнеры: - имя: изображение сервера ввода: Sidecar-examples: input-http-server - имя: изображение input-sidecar : Sidecar-examples: Sidecar-input
Посмотрев журналы kubectl input-http-server, вы увидите, что input-http-server получил запрос.
получить заявку! получить заявку!
Дополнительная информация о перехвате запроса
код приложения, который каждые 15 секунд будет localhost
делать запрос к
пакет com.shoothzj.sidecar import akka.actor.typed.ActorSystem import akka.actor.typed.scaladsl.Behaviors import akka.http.scaladsl.Http import akka.http.scaladsl.model._ import scala.concurrent.{ExecutionContextExecutor, Будущее} import scala.util.{Failure, Success} object HttpClient { def main(args: Array[String]): Unit = { while (true) { Thread.sleep(15_000L) неявная система значений: ActorSystem[Nothing] = ActorSystem (Behaviors.empty, "SingleRequest") // необходимо для будущего FlatMap/onComplete в конце неявного значения ExecutionContext: ExecutionContextExecutor = system.executionContext val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "http) : //localhost:7979/hello")) responseFuture .onComplete { case Success(res) => println(res) caseError(_) => sys.error("что-то не так") } } } }
Напишем еще один сайдкар, который будет перехватывать http-запросы и печатать логи.
пакет com.shoothzj.sidecar import akka.actor.typed.ActorSystem import akka.actor.typed.scaladsl.Behaviors import akka.http.scaladsl.Http import akka.http.scaladsl.model._ import akka.http.scaladsl.server .Directives._ import scala.concurrent.ExecutionContextExecutor import scala.io.StdIn object HttpServer { def main(args: Array[String]): Unit = { неявная система значений: ActorSystem[Nothing] = ActorSystem(Behaviors.empty, "my -system") // необходимо для будущего FlatMap/onComplete в конце неявного val ExecutionContext: ExecutionContextExecutor = system.executionContext val Route = path("hello") { get { println("получить запрос") Complete(HttpEntity(ContentTypes) .`text/html(UTF-8)`, "<h1>Передайте привет akka-http</h1>")) } } valbindingFuture = Http().newServerAt("localhost", 7979).bind(route ) while (true) { Thread.sleep(15_000L) } } }
Создайте образ с помощью скрипта под хранилищем output/build.sh
и запустите yaml следующим образом.
apiVersion: v1 вид: Метаданные модуля: имя: спецификация вывода: тома: - имя: общие журналы пустойDir: {} контейнеры: - имя: изображение выходной рабочей нагрузки : Sidecar-examples: выходная рабочая нагрузка imagePullPolicy: Никогда - имя: Sidecar- выходное изображение: Sidecar-examples:sidecar-output imagePullPolicy: Никогда
Посмотрев журналы вывода выходной рабочей нагрузки kubectl, вы можете увидеть, что выходной сайдкар получил запрос.
HttpResponse(200 OK,List(Сервер: akka-http/10.2.9, Дата: вторник, 29 марта 2022 г., 00:15:47 по Гринвичу), HttpEntity.Strict(text/html; charset=UTF-8,31 байт всего) ,HttpProtocol(HTTP/1.1)) HttpResponse(200 OK,List(Сервер: akka-http/10.2.9, дата: вторник, 29 марта 2022 г., 00:16:02 по Гринвичу),HttpEntity.Strict(text/html; charset= UTF-8,31 байт всего), HttpProtocol (HTTP/1.1)) HttpResponse (200 OK, List (Сервер: akka-http/10.2.9, дата: вторник, 29 марта 2022 г., 00:16:17 GMT), HttpEntity. Strict(text/html; charset=UTF-8,31 байт всего),HttpProtocol(HTTP/1.1)) HttpResponse(200 OK,List(Server: akka-http/10.2.9, Дата: вторник, 29 марта 2022 г. 00: 16:32 GMT),HttpEntity.Strict(text/html; charset=UTF-8,31 байт всего),HttpProtocol(HTTP/1.1)) HttpResponse(200 OK,List(Сервер: akka-http/10.2.9, Дата) : Вт, 29 марта 2022 г., 00:16:47 по Гринвичу),HttpEntity.Strict(text/html; charset=UTF-8,31 байт всего),HttpProtocol(HTTP/1.1)) HttpResponse(200 OK,List(Сервер: akka) -http/10.2.9, Дата: вторник, 29 марта 2022 г., 00:17:02 по Гринвичу), HttpEntity.Strict (text/html; charset = UTF-8, всего 31 байт), HttpProtocol (HTTP/1.1)) HttpResponse ( 200 ОК, список (сервер: akka-http/10.2.9, дата: вторник, 29 марта 2022 г., 00:17:17 по Гринвичу), HttpEntity.Strict (text/html; charset = UTF-8,31 байт всего), HttpProtocol (HTTP/1.1)) HttpResponse (200 ОК, список (сервер: akka-http/10.2.9, дата: вторник, 29 марта 2022 г., 00:17:32 по Гринвичу), HttpEntity.Strict(text/html; charset=
Нажмите, чтобы подписаться и узнать о новых технологиях Huawei Cloud как можно скорее~
Broadcom объявила о прекращении обновления версии Deepin-IDE существующей партнерской программы VMware, новый внешний вид. WAVE SUMMIT отмечает свое 10-е издание. Вэнь Синьиян получит последнее раскрытие! Чжоу Хунъи: Уроженец Хунмэна обязательно добьется успеха. Полный исходный код GTA 5 стал достоянием общественности. Линус: Я не буду читать код в канун Рождества. Я выпущу новую версию набора инструментов Java Hutool-5.8.24. в следующем году. Давайте вместе жаловаться на Furion. Коммерческая разведка: лодка прошла. Ван Чжуншань, v4.9.1.15 Apple выпускает мультимодальную модель большого языка с открытым исходным кодом Компания Ferret Yakult подтверждает утечку данных 95G