Центр настройки обнаружения регистрации микросервиса-консул

Микросервисы
Центр настройки обнаружения регистрации микросервиса-консул

Консул в деталях

Центр регистрации, который недавно использовался в бизнесе микросервисов, просто записывается здесь для последующего использования.

I. Обзор

1.1 Концепция

ConsulЭто инструмент с открытым исходным кодом, запущенный HashiCorp, который используется для обнаружения сервисов и настройки распределенных систем. Consul является распределенным, высокодоступным и горизонтально масштабируемым.

1.2 Особенности

  • Обнаружение службы: Consul предоставляет способ регистрации и обнаружения служб через интерфейсы DNS или HTTP. Некоторые внешние сервисы могут легко найти сервисы, от которых они зависят, через Consul.
  • Проверка работоспособности: клиент Consul предоставляет механизм проверки работоспособности, который можно использовать для предотвращения перенаправления трафика на неисправные службы.
  • Key/ValueХранилище: приложения могут использовать хранилище ключей/значений, предоставляемое Consul, в соответствии со своими потребностями. Consul предоставляет простой в использовании HTTP-интерфейс, который можно комбинировать с другими инструментами для достижения динамической конфигурации, маркировки функций, выбора лидера и многого другого.
  • Несколько центров обработки данных: Consul поддерживает несколько центров обработки данных по умолчанию, что означает, что пользователям не нужно беспокоиться о создании дополнительных уровней абстракции для масштабирования своего бизнеса в нескольких регионах.

1.3 Схема архитектуры и анализ

1.3.1 Внутренняя архитектура и принцип

1.3.1.1 Схема архитектуры

图片描述

1.2.1.2 Диаграмма

Во-первых, Consul поддерживает несколько дата-центров.На приведенном выше рисунке два дата-центра, и они связаны между собой через интернет.При этом, обратите внимание, что для повышения эффективности связи к связи присоединяется только серверный узел по центрам обработки данных.

В едином дата-центре Консул делится на две ноды: Клиент и Сервер (все ноды также называются Агентами), нода Сервер хранит данные, а Клиент отвечает за проверку работоспособности и пересылку запросов данных на Сервер, нода Сервер имеет Лидера и несколько Последователей, а узлы Лидер будут синхронизировать данные с Последователями.Рекомендуемое количество Серверов – 3 или 5. Когда Лидер умирает, активируется механизм выборов для создания нового Лидера.

Узлы Consul в кластере поддерживают членство через протокол сплетен (gossip protocol). Протокол сплетен для одного центра обработки данных использует для связи как TCP, так и UDP, и оба используют порт 8301. Протокол сплетен в центрах обработки данных также использует для связи как TCP, так и UDP, используя порт 8302.

Запросы на чтение и запись данных в кластере могут быть либо отправлены непосредственно на сервер, либо перенаправлены на сервер через клиент с использованием RPC.Запрос в конечном итоге достигнет ведущего узла.Если данные немного устарели, запрос на чтение также может быть выполнен на обычном серверном узле, чтение, запись и копирование данных в кластере выполняются через TCP-порт 8300.

Используется между кластерами ConsulGossipСвязь по протоколу и алгоритм согласования плотов

  • Gossip — протокол Gossip также называют Epidemic Protocol (эпидемический протокол). Роль этого протокола такова, как следует из его названия, его очень легко понять, и его путь на самом деле очень распространен в нашей повседневной жизни, например, при распространении компьютерных вирусов, лесных пожаров, пролиферации клеток и так далее.
  • Клиент. Клиент — это прокси, который перенаправляет все RPC на сервер. Этот клиент относительно не имеет гражданства. Единственное фоновое действие, выполняемое клиентом, — это присоединение к пулу сплетен в локальной сети. Это имеет минимальные накладные расходы на ресурсы и потребляет лишь небольшую часть пропускной способности сети.
  • Сервер — сервер — это прокси с набором расширенных функций, включая участие в выборах Raft, поддержание состояния кластера, ответ на запросы RPC, взаимодействие с другими центрами обработки данных через сплетни WAN и переадресацию запросов руководителям или удаленным центрам обработки данных.
  • Центр обработки данных. Хотя определение центра обработки данных очевидно, необходимо учитывать некоторые тонкие детали. Например, в EC2 считается, что несколько зон доступности составляют центр обработки данных. Мы определяем центр обработки данных как частную сетевую среду с низкой задержкой и высокой пропускной способностью. Сюда не входит доступ к общедоступной сети, но для нас несколько зон доступности в одном и том же EC2 можно считать частью центра обработки данных.
  • Консенсус — Согласованность, используйте Консенсус, чтобы указать на согласие в отношении порядка выборов лидера и транзакций. Чтобы достичь консенсуса отказоустойчивым образом, как правило, более половины консенсуса можно рассматривать как общий консенсус. Консул использует Raft для достижения согласованности и проведения выборов лидера.При использовании начальной загрузки в консуле ее можно выбрать самостоятельно, а начальную загрузку можно отменить после подключения других серверов.
  • LAN Gossip — содержит все узлы, расположенные в одной локальной сети или центре обработки данных.
  • WAN Gossip - содержит только сервер. Эти серверы в основном распределены в разных центрах обработки данных и обычно обмениваются данными через Интернет или глобальную сеть.
  • RPC — удаленный вызов процедур. Это механизм запроса/ответа, который позволяет клиенту запрашивать сервер.

1.3.2 Принцип обнаружения службы Consul

1.3.2.1 Схема

图片描述

1.3.2.2 Иллюстрация

В первую очередь нужно иметь нормальный кластер Консул с Сервером и Лидером. Здесь Consul Servers развернуты на Server1, Server2 и Server3 соответственно, при условии, что они выбирают узел Consul Server на Server2 в качестве лидера. Лучше всего развертывать на этих серверах только программы Consul, чтобы обеспечить максимальную стабильность Consul Server.

Затем зарегистрируйте службы A, B и C через Consul Client на серверах Server4 и Server5.Здесь каждая служба развертывается на двух серверах, что позволяет избежать проблемы с одной точкой службы. Сервисы могут быть зарегистрированы в Consul через HTTP API (порт 8500) или через файл конфигурации Consul. Consul Client можно считать не имеющим состояния, он пересылает регистрационную информацию на Consul Server через RPC, служебная информация хранится в каждом узле сервера, а с помощью Raft достигается строгая согласованность.

Наконец, на сервере Server6 программе D необходимо получить доступ к службе B. В это время программа D сначала обращается к HTTP API, предоставляемому локальным клиентом Consul.Локальный клиент пересылает запрос на сервер Consul, а сервер Consul запрашивает текущая информация службы B и возвращается, и, наконец, программа D получает IP-адреса и порты всех развертываний службы B, а затем может выбрать одно из развертываний службы B и инициировать запрос к нему. Если метод DNS используется для обнаружения службы, доменное имя службы обнаружения службы B используется непосредственно в программе D. Запрос разрешения доменного имени сначала достигает локального прокси-сервера DNS, а затем перенаправляет его локальному клиенту Consul, а локальный Клиент перенаправляет запрос на сервер Consul, сервер Consul запрашивает и возвращает текущую информацию о службе B, и, наконец, программа D получает IP-адрес и порт развертывания службы B.

Архитектура развертывания, описанная на рисунке, автор считает наиболее распространенным и простым решением.С точки зрения некоторой конфигурации или дизайна по умолчанию, это также решение, которое официальное лицо хочет, чтобы пользователи приняли.Например, порт 8500 прослушивает по умолчанию 127.0.0.1.Конечно, некоторые студенты не согласны.Другие варианты будут упомянуты позже.

1.4 Зачем использовать сервисное обнаружение

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

Общее утверждение связано с использованием архитектуры микросервисов. Традиционная монолитная архитектура недостаточно гибка, чтобы хорошо адаптироваться к изменениям, поэтому ее преобразуют в микросервисную архитектуру.С появлением большого количества сервисов управление и эксплуатация и обслуживание очень неудобны, поэтому были разработаны некоторые автоматизированные стратегии, и обнаружение услуг появилось, как того требует время. Поэтому, если вам нужно использовать обнаружение служб, у вас должны быть некоторые болевые точки для управления службами.

Однако внедрение обнаружения служб может привести к появлению некоторых технологических стеков и увеличению общей сложности системы.Если у вас всего несколько служб, например менее 10, и бизнес не сильно меняется, а пропускная способность, как ожидается, будет стабильной, возможно, в этом нет необходимости. Используйте обнаружение службы.

Два отличия консула от других фреймворков

название преимущество недостаток интерфейс алгоритм консенсуса
zookeeper 1. Мощные функции, а не только обнаружение сервисов. 2. Предоставление механизма наблюдения для получения статуса поставщиков услуг в режиме реального времени. 3. Такие платформы, как поддержка dubbo. 1. Нет проверки работоспособности 2. Необходимо интегрировать sdk в сервис, высокая сложность 3. Не поддерживает несколько центров обработки данных sdk Paxos
consul 1. Простота в использовании, нет необходимости интегрировать SDK 2. Поставляется с проверкой работоспособности 3. Поддерживает несколько центров обработки данных 4. Предоставляет веб-интерфейс управления 1. Уведомления об изменении служебной информации не могут быть получены в режиме реального времени http/dns Raft
etcd 1. Простота использования, нет необходимости интегрировать SDK. 2. Широкие возможности настройки. 1. Нет проверки работоспособности 2. Необходимо сотрудничать со сторонними инструментами для завершения обнаружения служб 3. Не поддерживает несколько центров обработки данных http Raft

Три установки и развертывания

3.1 Установка и развертывание физического сервера

3.1.1 установка линукса

wget https://releases.hashicorp.com/consul/1.5.1/consul_1.5.1_linux_amd64.zip
unzip consul_0.8.1_linux_amd64.zip
mv consul /usr/local/bin/

3.1.2 запуск супервизора

  • настроить
mkdir -p /data/consul/{data,logs}

cat < /etc/supervisord.d/consul.conf >EOF
[program:consul]
command=consul agent -server -bootstrap-expect 3 -data-dir /data/consul/data -bind=172.16.100.2 -ui -client 0.0.0.0 -advertise=172.16.100.2 -node=go2cloud-platform-test -rejoin
user=root
stdout_logfile=/data/consul/logs/consul.log
autostart=true
autorestart=true
startsecs=60
stopasgroup=true
ikillasgroup=true
startretries=1
redirect_stderr=true
EOF
  • ⚠️: После запуска вам нужно вручную присоединиться к двум другим узлам.consul join 172.16.100.2

  • Проверять

[root@go2cloud_platform_pord conf.d]# supervisorctl status consul
consul                           RUNNING   pid 11838, uptime 0:13:28
  • другие команды
# 查看集群成员
consul members

# 查看集群状态
consul info

# 帮助
consul agent -h

图片描述

3.2 Развертывание докера

# 拉取镜像
docker pull consul

Затем вы можете запустить кластер, Здесь вы запускаете 4 Consul Agents, 3 Сервера (будет избран один лидер) и 1 Клиент.

#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面
docker run -d --name=consul1 -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui
 
#启动第2个Server节点,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
 
#启动第3个Server节点,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
 
#启动第4个Client节点,并加入集群
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2

IP-адрес первого контейнера запуска обычно равен 172.17.0.2, а IP-адреса следующих контейнеров будут выстроены в ряд: 172.17.0.3, 172.17.0.4, 172.17.0.5.

Эти узлы Consul взаимодействуют друг с другом внутри контейнера Docker и взаимодействуют в режиме моста. Но если хост хочет получить доступ к сети внутри контейнера, ему необходимо выполнить сопоставление портов. При запуске первого контейнера порт 8500 Consul сопоставляется с портом 8900 хоста, чтобы информацию о кластере можно было легко просмотреть через браузер хоста.

图片描述

  • Служба регистрации файла конфигурации
# 编写service.json
{
  "services": [
    {
      "id": "hello1",
      "name": "hello",
      "tags": [
        "primary"
      ],
      "address": "172.17.0.5",
      "port": 5000,
      "checks": [
        {
        "http": "http://localhost:5000/",
        "tls_skip_verify": false,
        "method": "Get",
        "interval": "10s",
        "timeout": "1s"
        }
      ]
    }
  ]
}
# 将json文件拷贝进容器内
docker cp myservice.json consul1:/consul/config
# 重载配置文件
docker exec consul1 consul reload

На данный момент сервис уже есть, но сервис недоступен, а запрос, отправленный консулом в сервис, недоступен

图片描述

3.3 Развертывание в k8s

Вы можете написать файл списка ресурсов yaml самостоятельно или использовать официальные хелм-чарты для установки

  • Установить с рулем
# 查询helm 
[root@master opt]# helm search consul
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION                                                 
apphub/consul                           5.3.3           1.6.0           Highly available and distributed service discovery and ke...
apphub/prometheus-consul-exporter       0.1.4           0.4.0           A Helm chart for the Prometheus Consul Exporter             
bitnami/consul                          5.3.3           1.6.0           Highly available and distributed service discovery and ke...
incubator/ack-consul                    0.5.0           0.5.0           Install and configure Consul on Kubernetes.                 
stable/consul                           3.8.1           1.5.3           Highly available and distributed service discovery and ke...
stable/prometheus-consul-exporter       0.1.4           0.4.0           A Helm chart for the Prometheus Consul Exporter      
# 安装consul
[root@master opt]# helm install stable/consul -n consul
NAME:   consul
LAST DEPLOYED: Fri Nov 22 09:52:52 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME          DATA  AGE
consul-tests  1     3m4s

==> v1/Pod(related)
NAME      READY  STATUS             RESTARTS  AGE
consul-0  0/1    ContainerCreating  0         3m4s

==> v1/Secret
NAME               TYPE    DATA  AGE
consul-gossip-key  Opaque  1     3m4s

==> v1/Service
NAME       TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)                                                                           AGE
consul     ClusterIP  None            <none>       8500/TCP,8400/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP  3m4s
consul-ui  NodePort   10.107.180.193  <none>       8500:30082/TCP                                                                    3m4s

==> v1beta1/PodDisruptionBudget
NAME        MIN AVAILABLE  MAX UNAVAILABLE  ALLOWED DISRUPTIONS  AGE
consul-pdb  N/A            1                0                    3m4s

==> v1beta1/StatefulSet
NAME    READY  AGE
consul  0/3    3m4s


NOTES:
1. Watch all cluster members come up.
  $ kubectl get pods --namespace=default -w
2. Test cluster health using Helm test.
  $ helm test consul
3. (Optional) Manually confirm consul cluster is healthy.
  $ CONSUL_POD=$(kubectl get pods -l='release=consul' --output=jsonpath={.items[0].metadata.name})
  $ kubectl exec $CONSUL_POD consul members --namespace=default | grep server

  • Просмотр текущего статуса

Мы видим, что helm использует statefulset для установки консула, а сервис использует метод NodePort.

# 查看运行状态
[root@master opt]# kubectl get pods --show-labels -l release=consul
NAME       READY   STATUS    RESTARTS   AGE     LABELS
consul-0   1/1     Running   0          3m41s   chart=consul-3.8.1,component=consul-consul,controller-revision-hash=consul-6969c79b5c,heritage=Tiller,release=consul,statefulset.kubernetes.io/pod-name=consul-0
consul-1   1/1     Running   0          2m56s   chart=consul-3.8.1,component=consul-consul,controller-revision-hash=consul-6969c79b5c,heritage=Tiller,release=consul,statefulset.kubernetes.io/pod-name=consul-1
consul-2   1/1     Running   0          2m17s   chart=consul-3.8.1,component=consul-consul,controller-revision-hash=consul-6969c79b5c,heritage=Tiller,release=consul,statefulset.kubernetes.io/pod-name=consul-2

# 查看svc
[root@master opt]# kubectl  get svc -l release=consul
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                            AGE
consul      ClusterIP   None             <none>        8500/TCP,8400/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP   5m23s
consul-ui   NodePort    10.107.180.193   <none>        8500:30082/TCP                                                                     5m23s

# 查看server
[root@master opt]# CONSUL_POD=$(kubectl get pods -l='release=consul' --output=jsonpath={.items[0].metadata.name})
[root@master opt]# kubectl exec $CONSUL_POD consul members --namespace=default | grep server
consul-0  10.244.1.67:8301   alive   server  1.5.3  2         dc1  <all>
consul-1  10.244.2.193:8301  alive   server  1.5.3  2         dc1  <all>
consul-2  10.244.1.68:8301   alive   server  1.5.3  2         dc1  <all>
  • веб-страница для просмотра

图片描述
图片描述

четыре использования

В этой демонстрации python используется для использования обнаружения и регистрации сервера консула, который был простым центром конфигурации консула.

4.1 Обнаружение и регистрация услуг

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import json
import requests
from consul import Consul, Check
from random import randint


# consul 操作类
class ConsulClient():
    def __init__(self, host=None, port=None, token=None):  # 初始化,指定consul主机,端口,和token
        self.host = host  # consul 主机
        self.port = port  # consul 端口
        self.token = token
        self.consul = Consul(host=host, port=port)

    def register(self, name, service_id, local_ip, local_port, consul_health_url, tags=None, interval=None):  # 注册服务 注册服务的服务名  端口  以及 健康监测端口

        # 心跳检测url
        health_check_url = ''.join(["http://", local_ip, ":", str(local_port), consul_health_url])

        # 健康检查的ip,端口,检查时间
        http_check = Check.http(health_check_url, "10s")

        return self.consul.agent.service.register(name, service_id=service_id, address=local_ip, port=int(local_port),
                                           check=http_check, tags=tags, interval=interval)

    def deregister(self, service_id):
        # 此处有坑,源代码用的get方法是不对的,改成put,两个方法都得改
        de_result = self.consul.agent.service.deregister(service_id)
        check_result = self.consul.agent.check.deregister(service_id)

        return de_result, check_result

    def getService(self, name):  # 负债均衡获取服务实例
        self.port = str(self.port)
        url = 'http://' + self.host + ':' + self.port + '/v1/catalog/service/' + name  # 获取 相应服务下的DataCenter
        dataCenterResp = requests.get(url)
        if dataCenterResp.status_code != 200:
            raise Exception('can not connect to consul ')
        listData = json.loads(dataCenterResp.text)
        dcset = set()  # DataCenter 集合 初始化
        for service in listData:
            dcset.add(service.get('Datacenter'))
        serviceList = []  # 服务列表 初始化
        for dc in dcset:
            if self.token:
                url = 'http://' + self.host + ':' + self.port + '/v1/health/service/' + name + '?dc=' + dc + '&token=' + self.token
            else:
                url = 'http://' + self.host + ':' + self.port + '/v1/health/service/' + name + '?dc=' + dc + '&token='
            resp = requests.get(url)
            if resp.status_code != 200:
                raise Exception('can not connect to consul ')
            text = resp.text
            serviceListData = json.loads(text)

            for serv in serviceListData:
                status = serv.get('Checks')[1].get('Status')
                if status == 'passing':  # 选取成功的节点
                    address = serv.get('Service').get('Address')
                    port = serv.get('Service').get('Port')
                    serviceList.append({'port': port, 'address': address})
        if len(serviceList) == 0:
            raise Exception('no serveice can be used')
        else:
            service = serviceList[randint(0, len(serviceList) - 1)]  # 随机获取一个可用的服务实例
            return service['address'], int(service['port'])

    def getServices(self):
        return self.consul.agent.services()


if __name__ == '__main__':
    host = '10.234.2.204'
    port = '30082'
    server_name = 'myapp'
    server_id = server_name + '-8500'

    c = ConsulClient(host, port)

    # print(c.deregister(server_id))
    # print(c.register(server_name, server_id, 'x.x.x.x', 8012, '/ops-audit/health'))

    print(c.consul.agent.services())
    print(c.getService(server_name))

    from apps.jumpserver.conf import get_consul_server
    print(get_consul_server('cmp', 'SMARTOPS_API_URL'))

    # server_name2 = 'myconsulapp'
    # local_port = '8000'
    # server_id2 = server_name2 + '-' + local_port
    # print(c.register(server_name2, server_id2, '10.234.2.186', '8000', '/ops-audit/health'))

Обратите внимание, что его необходимо записать для регистрации при запуске службы и для запроса доступных внутренних серверов, на которых обнаружена служба, для получения IP-адреса и использования порта службы.

Отменить регистрацию службы, когда служба остановлена.

图片描述

4.2 Центр конфигурации

  • Конфигурация ключа/значения на странице консула
def get_config(CONSUL_HOST, CONSUL_PORT, KEY_NAME):
    c = consul.Consul(CONSUL_HOST, CONSUL_PORT)
    index = None
    index, data = c.kv.get(KEY_NAME, index=index)
    return yaml.safe_load(data.get("Value").decode(encoding='utf-8'))

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

Ссылка на ссылку

www.consul.io/

ELF Гуанчжоу П. Талант/2019/03/11/…

blog.51CTO.com/Tasly/1…

blog.brotherspace.com/consul-Sell V…