фронтПоделиться, мы упомянули, что по соображениям производительности и стабильности мы не использовалиistioВ качестве представленной технологии Service Mesh второго поколения Envoy напрямую используется с собственной службой xDS.
Тем не менее, нам еще нужно понятьIstio
, в конце концов, это будущее Service Mesh. Неудивительно, что в ближайшем будущем гребешки также перейдут на платформу Service Mesh второго поколения.
Эта статья направлена наIstio
Простой анализ архитектуры будет включать в себя анализ части исходного кода.
1. Архитектура Истио
мы представляемEnvoy
при упоминании,Envoy
Динамическая конфигурация дает нам возможность: мы можем следоватьEnvoy
Спецификация для управления путем реализации службы, предоставляющей определенный API.Envoy
маршрутизация, правила трафика, ограничения скорости, журналы и т. д.
существуетIstio
в концепции,Envoy
Этот тип прокси, который фактически выполняет пересылку и управление трафиком, называетсяпанель данных. И те, которые обеспечивают управление APIEnvoy
Поведенческие службы называютсяпанель управления.
Теперь позаимствуйте картинку с официального сайта, чтобы объяснитьIstio
Схема:
Панель данных начинается сsidecar
Форма и микросервисы развертываются вместе, и каждый экземпляр микросервиса развертывается через собственныйsidecar
Чтобы добиться отправки и получения запросов, микросервисы и микросервисы взаимодействуют не напрямую, а черезsidecar
прокси (форвардинг) для осуществления связи.sidecar
Сформируйте сеть вызовов напрямую, как «сетку».
панель управленияPilot
, Mixer
, Istio-Auth
сочинение. мы начинаем сkubernetes
Развернуть с помощьюEnvoy
для панели данныхIstio
Представить в качестве примера.
Pilot
является ядром панели управления и имеет важное значение. будетkubernetes
информация о ресурсах переведена наEnvoy
Соответствующие API-интерфейсы xDS (CDS, SDS/EDS, RDS), необходимые для обеспечения обнаружения служб, в том числе определяемых пользователем.Istio
Соответствующая конфигурация, переведенная вEnvoy
Понятные правила маршрутизации (RDS).
Mixer
Реализовать сбор данных и некоторое дополнительное управление потоком. Сначала панель данныхMixer
Данные запроса отчета, которые основаны наIstio
Спецификация структурирована.Mixer
Эти отчетные данные можно обрабатывать различными способами, например, распечатывать журналы, преобразовывать их в метрики, необходимые Prometheus для удобного сбора данных для мониторинга производительности, ограничивать скорость и т. д.Mixer
Это подключаемый модуль, и эта обработка данных осуществляется путем настройки одного за другим подключаемых модулей.
2. Pilot
Возьмем в качестве примера среду Kubernetes:Pilot
Каждый Pod на самом деле содержит два «контейнера»:discovery
а такжеistio-proxy
2.1 discovery
discovery
Соответствующее изображениеdocker.io/istio/pilot:0.4.0
,ДаPilot
Реальный поставщик функций, его адрес прослушивания:tcp://127.0.0.1:8080
, основная задача — пропускать ресурсы Kubernetes черезxDS
Форма обслуживания означаетEnvoy
понятная конфигурация.
в:
xDS
Основной код:pilot/proxy/envoy/discovery.go
// Struct,核心数据结构
type DiscoveryService struct {
proxy.Environment
server *http.Server
sdsCache *discoveryCache
cdsCache *discoveryCache
rdsCache *discoveryCache
ldsCache *discoveryCache
}
// Register adds routes a web service container
func (ds *DiscoveryService) Register(container *restful.Container) {
ws := &restful.WebService{}
ws.Produces(restful.MIME_JSON)
// 例如: List all known services (informational, not invoked by Envoy)
ws.Route(ws.
GET("/v1/registration").
To(ds.ListAllEndpoints).
Doc("Services in SDS"))
// 其他 xDS ...
}
Основной код для перевода ресурсов Kubernetes:pilot/platform/kube/controller.go
// 例如: list services
func (c *Controller) Services() ([]*model.Service, error) {
list := c.services.informer.GetStore().List()
out := make([]*model.Service, 0, len(list))
for _, item := range list {
if svc := convertService(*item.(*v1.Service), c.domainSuffix); svc != nil {
out = append(out, svc)
}
}
return out, nil
}
2.2 istio-proxy
istio-proxy
Соответствующее изображениеdocker.io/istio/proxy:0.4.0
,ДаPilot
Услугиsidecar
, ответственный за обратный прокси-сервер для отправкиdiscovery
просить, слушатьtcp://0.0.0.0:15003
. ЭтоEnvoy
Базовая конфигурация выглядит следующим образом:
{
"listeners": [
{
"address": "tcp://0.0.0.0:15003",
"name": "tcp_0.0.0.0_15003",
"filters": [
{
"type": "read",
"name": "tcp_proxy",
"config": {
"stat_prefix": "tcp",
"route_config": {
"routes": [
{
"cluster": "in.8080"
}
]
}
}
}
],
"bind_to_port": true
}
],
"admin": {
"access_log_path": "/dev/stdout",
"address": "tcp://127.0.0.1:15000"
},
"cluster_manager": {
"clusters": [
{
"name": "in.8080",
"connect_timeout_ms": 1000,
"type": "static",
"lb_type": "round_robin",
"hosts": [
{
"url": "tcp://127.0.0.1:8080"
}
]
}
]
}
}
3. Sidecar
Возьмем в качестве примера среду Kubernetes: как плоскость данныхSidecar
, по сути, в каждый Pod микросервиса будет вставлено два контейнера:proxy-init
а такжеistio-proxy
3.1 istio-proxy
istio-proxy
Соответствующее изображениеdocker.io/istio/proxy:0.4.0
, является фактическим носителем функции Sidecar, мониторингtcp://0.0.0.0:15003
, принимает весь TCP-трафик, предназначенный для Pod, и распределяет весь TCP-трафик от Pod. Фактически прокси состоит из двух частей: процесс управленияagent
и процесс реального агентаEnvoy
.
agent
ответственный за созданиеEnvoy
конфигурации и должным образом контролироватьEnvoy
рабочее состояние, будет проводиться при необходимостиEnvoy
Управление процессами (например, перезагрузка Envoy после изменения конфигурации). Также отвечает заMixer
Взаимодействие компонентов (включая отчетные данные и т. д.).
agent
О генерацииEnvoy
Основной код конфигурации находится по адресу:pilot/proxy/envoy/config.go
func buildConfig(config meshconfig.ProxyConfig, pilotSAN []string) *Config {
listeners := Listeners{}
clusterRDS := buildCluster(config.DiscoveryAddress, RDSName, config.ConnectTimeout)
clusterLDS := buildCluster(config.DiscoveryAddress, LDSName, config.ConnectTimeout)
clusters := Clusters{clusterRDS, clusterLDS}
out := &Config{
Listeners: listeners,
LDS: &LDSCluster{
Cluster: LDSName,
RefreshDelayMs: protoDurationToMS(config.DiscoveryRefreshDelay),
},
Admin: Admin{
AccessLogPath: DefaultAccessLog,
Address: fmt.Sprintf("tcp://%s:%d", LocalhostAddress, config.ProxyAdminPort),
},
ClusterManager: ClusterManager{
Clusters: clusters,
SDS: &DiscoveryCluster{
Cluster: buildCluster(config.DiscoveryAddress, SDSName, config.ConnectTimeout),
RefreshDelayMs: protoDurationToMS(config.DiscoveryRefreshDelay),
},
CDS: &DiscoveryCluster{
Cluster: buildCluster(config.DiscoveryAddress, CDSName, config.ConnectTimeout),
RefreshDelayMs: protoDurationToMS(config.DiscoveryRefreshDelay),
},
},
StatsdUDPIPAddress: config.StatsdUdpAddress,
}
// 其他相关逻辑 ...
}
Примечательно,
istio-proxy
Он может работать в различных «ролях» и будет генерировать разные конфигурации в соответствии с разными ролями. Например2.2 节
в, какPilot
прокси, его конфигурация такая же, какSidecar
разные.
3.2 proxy-init
proxy-init
Соответствующее изображениеdocker.io/istio/proxy_init:0.4.0
. существует3.1 节
, Мы говорим о:istio-proxy
Он будет принимать весь tcp-трафик, отправленный в под, и распределять весь tcp-трафик, отправленный из пода, но нам не нужно учитывать это, когда мы на самом деле пишем код, тогдаIstio
Как это делается? Ответ черезproxy-init
!Конкретный подход: путем инъекцииiptables
Правила, которые переписывают входящий и исходящий трафик пода таким образом, чтобы входящий и исходящий трафик перенаправлялся в подistio-proxy
разные порты прослушивания.
Например, правило перенаправления для входящего трафика:
iptables -t nat -N ISTIO_REDIRECT -m comment --comment "istio/redirect-common-chain"
iptables -t nat -A ISTIO_REDIRECT -p tcp -j REDIRECT --to-port ${ENVOY_PORT} -m comment --comment "istio/redirect-to-envoy-port"
iptables -t nat -A PREROUTING -j ISTIO_REDIRECT -m comment --comment "istio/install-istio-prerouting"
4. Резюме
Istio, инфраструктура Service Mesh следующего поколения, еще не доступна для производства, но ее идеи и архитектура заслуживают изучения. Есть надежда, что эта статья будетIstio
Заинтересованные студенты полезны.