Схема контейнеров посол направлена на то, чтобы скрыть сложность первичного контейнера и предоставить унифицированный интерфейс, через который основной контейнер может получить доступ к услугам за пределами POD.
Эти внешние или внешние службы могут представить разные интерфейсы и имеют другие API. Вместо того, чтобы написать код внутри основного контейнера, который может иметь дело с несколькими интерфейсами и API на следующих внешних службах, вы реализуете его в контейнере посла. Контейнер послов знает, как поговорить и интерпретировать ответы с разных конечных точек и передавать их в основной контейнер. Основной контейнер должен только знать, как поговорить с контейнером посла. Затем вы можете повторно использовать контейнер посола с любым другим контейнером, который необходимо поговорить с этими сервисами, сохраняя при этом тот же внутренний интерфейс.
Другой пример будет там, где ваши основные контейнеры должны делать вызова к защищенному API. Вы можете разработать контейнер своего посла для обработки аутентификации с защищенным API. Ваш главный контейнер приведет к контейнеру посол. Посол прикрепит любую необходимую информацию о аутентификации к запросу и пропустите аутентифицированный запрос на внешнюю службу.
Чтобы продемонстрировать, как работает посол Pattern, мы будем использовать Фильм БД (TMBD) Отказ Перейдите на сайт и зарегистрируйтесь (это бесплатно), чтобы получить ключ API.
Сайт Movie DB предлагает API отдыха, где вы можете получить информацию о фильмах. Мы внедрили контейнер посла, который слушает на пути /фильмы
И всякий раз, когда он получает запрос, он сделает аутентифицированный запрос на API фильма БД.
Вот фрагмент из кода контейнера посла:
func TheMovieDBServer(w http.ResponseWriter, r *http.Request) { apiKey := os.Getenv("API_KEY") resp, err := http.Get(fmt.Sprintf("https://api.themoviedb.org/3/discover/movie?api_key=%s", apiKey)) // ... // Return the response }
Мы читаем API_KEY
Переменная среды, а затем сделайте запрос на получение URL. Примечание. Если вы попытаетесь запросить URL без клавиши API, вы получите следующую ошибку:
$ curl https://api.themoviedb.org/3/discover/movie {"status_code":7,"status_message":"Invalid API key: You must be granted a valid key.","success":false}
Я подтолкнул образа докера посла на Startkubernetes/Посол: 0.1.0
Отказ
Как и с контейнером Sidecar, контейнер посола — это просто другой контейнер, который работает в POD. Мы проверим контейнер послов, позвонив Curl
от основного контейнера.
Вот как выглядит файл yaml:
apiVersion: v1 kind: Pod metadata: name: themoviedb spec: containers: - name: main image: radial/busyboxplus:curl args: - sleep - "600" - name: ambassador image: startkubernetes/ambassador:0.1.0 env: - name: API_KEY valueFrom: secretKeyRef: name: themoviedb key: apikey ports: - name: http containerPort: 8080
Прежде чем мы сможем создать POD, нам нужно создать секрет с ключом API. Давайте сделаем это первым:
$ kubectl create secret generic themoviedb --from-literal=apikey=secret/themoviedb created
Теперь вы можете хранить POD YAML в Посол-контейнер. YAML
Файл и создать его с Kubectl Apply Printe -F посол-контейнер. YAML
Отказ
Когда Kubernetes создает POD (вы можете использовать Kubectl Получить Po
Чтобы увидеть статус), вы можете использовать Exec
Команда для запуска Curl
Команда внутри Главная
контейнер:
$ kubectl exec -it themoviedb -c main -- curl localhost:8080/movies {"page":1,"total_results":10000,"total_pages":500,"results":[{"popularity":2068.491,"vote_count": ...
Поскольку контейнеры в том же POD имеют сеть, мы можем сделать запрос против localhost: 8080
, что соответствует порту на контейнере посла.
Вы можете представить себе запуск приложения или веб-сервера в основном контейнере, а вместо того, чтобы сделать запросы на API.themoviedb.org
Прямой, вы делаете запросы на контейнер посола.
Аналогичным образом, если у вас была другая служба, необходимый доступ к API.themoviedb.org
Вы можете добавить контейнер послов на POD и решить доступ таким образом.
Оригинал: «https://dev.to/peterj/ambassador-container-pattern-5pp»