Научите вас шаг за шагом писать сайдкар для Kubernetes.

Эта статья опубликована сообществом Huawei Cloud « Научим вас шаг за шагом писать вспомогательную программу Kubernetes », автор: Чжан Цзянь.

Что такое коляска?

kubernetes-sidecar-what-is.png

коляска, дословно переводится как коляска. Как показано на рисунке выше, рядом с мотоциклом устанавливается коляска для расширения его функций. Например, езда более стабильна, он может тянуть больше людей и грузов, а человек, сидящий в коляске, может указывать дорогу водителю. , и т. д. Модель коляски обеспечивает разделение управления и логики за счет добавления «коляски» к сервису приложения .

Для микросервисов мы можем использовать дополнительную модель для реализации функций панели управления, которые не требуют реализации бизнес-сервисов, таких как сбор журналов, регистрация сервисов, обнаружение сервисов, текущее ограничение и аутентификация. Обычно по сравнению с моделью коляски это модель SDK, такая как Spring-cloud Все упомянутые выше возможности реализуются через SDK.

kubernetes-sidecar-что-может-делать.png

Оба режима реализации имеют свои преимущества и недостатки. Режим сопровождения приведет к дополнительным потерям производительности и задержкам, но традиционный режим SDK сделает код раздутым и усложнит обновления. Возможности плоскости управления и возможности бизнес-плоскости не могут быть обновлены отдельно.

Код этой статьи загружен на gitee.

принцип реализации коляски

Было введено множество функций коляски, но как коляска обеспечивает эти возможности?

Оказывается, в Kubernetes модуль — это наименьшая единица развертывания, но внутри модуля разрешено запускать несколько контейнеров, а тома хранения и сетевые стеки распределяются между несколькими контейнерами. Таким образом, мы можем использовать несколько контейнеров в качестве дополнительных модулей или init-container (инициализировать контейнер) для настройки разрешений смонтированного тома.

kubernetes-sidecar-inside.png

Коляска для сбора бревен

Принцип сайдкара сбора журналов реализован с использованием принципа, согласно которому несколько контейнеров могут совместно использовать подключенные тома. Сбор журналов достигается путем вывешивания пути журналов приложения и использования другой программы для доступа к журналам в этом пути. Здесь используется 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
{{o.name}}
{{м.имя}}

рекомендация

отmy.oschina.net/u/4526289/blog/10456195
рекомендация