ПРОГРАММИРОВАНИЕ

Knative Service с Kubernetes и Spring Boot

Установите knative сервис поверх kubernetes и разверните бессерверный весенний загрузочный образ.

Что такое Кнатив

Цитировать

Knativeпредоставляет открытый API и среду выполнения, которая позволяет запускать бессерверные рабочие нагрузки в любом месте по вашему выбору: полностью управляемое в Google Cloud, в Anthos на Google Kubernetes Engine (GKE) или на вашем собственный кластер Kubernetes

Из https://cloud.google.com/knative

Что такое бессерверное

Чистейшая идея бессерверных технологий заключается в том, что вы пишете код, затем что-то берет этот код, создает, развертывает и запускает его, не беспокоясь о том, как и где.
Другая идея заключается в том, что никакие ресурсы не используются до тех пор, пока они не будут запрошены. Вы открываете кран только тогда, когда вам нужно пить. Таким образом, вы платите по мере использования ресурсов. Ресурсы увеличиваются или уменьшаются в зависимости от спроса, что называется эластичным использованием ресурсов.

Подробнее о бессерверных вычислениях см.:
https://en.wikipedia.org/wiki/Serverless_computing

Кнатив

Мы смотрим на Knative, который пытается выполнить некоторые из вышеперечисленных действий, создавая pod только при наличии запроса (хотя это тоже настраивается).

Мы запустим сервер Knative в нашем локальном кластере K8s и развернем существующий образ в качестве сервиса Knative.

Настраивать

MacOs
Desktop для Docker: v 2.3.0.3
k8s: v 1.16.5

Установите Knative Serving

Knative зависит от Istio, который мы установили ранее.

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/serving-crds.yaml

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/serving-core.yaml

пространство имен kubectl label knative-serving istio-injection=enabled

Добавить собственное соединение istio

kubectl apply --filename https://github.com/knative/net-istio/releases/download/v0.16.0/release.yaml

kubectl --namespace istio-system get service istio-ingressgateway

КН CLI

Перейдите по ссылке ниже, чтобы установить:

https://knative.dev/docs/install/install-kn/

Создайте тестовый сервис Knative с помощью Knative CLI kn

kn service create helloworld-go — image gcr.io/knative-samples/helloworld-go — env TARGET="Go Sample v1"

kn service description helloworld-go
Имя: helloworld-go
Пространство имен: default
Возраст: 4 м
URL: http://helloworld-go.default.example .com
Редакции:
100% @latest (helloworld-go-yljzr-1) [1] (4m)
Изображение: gcr.io/knative-samples/helloworld-go ( прикреплен к 5ea96b)
Условия:
OK ТИП ВОЗРАСТ ПРИЧИНА
++ Готов 3 мес.
++ Готов конфигураций 3 мес.
++ Готов 3 мес.

Запустите его, подов нет, если нет запросов, поэтому первый запрос будет медленным.

curl -H Хост: helloworld-go.default.example.com http://localhost:80
Пример Hello Go v1!

Необходимые модули были созданы по запросу. Если в течение определенного времени (по умолчанию 30 секунд) запросов нет, модули будут удалены. Хорошо, вы используете ресурс только тогда, когда это необходимо, если у вас все в порядке с начальной задержкой.

Удалите тестовую службу.

kn service удалить helloworld-go

Разверните наш локальный образ

У нас есть существующий локальный образ докера, vadal-echo, который мы построили ранее.

В отличие от наших предыдущих блогов, где мы можем развернуть наши локальные образы докеров непосредственно на K8s, для Knative необходим реестр докеров.

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

Ретегируйте так:

тег docker vadal-echo:0.0.1-SNAPSHOT dev.local/vadal-echo

Но это все еще дало отказ:

`..ошибка с сообщением: отложить загрузку изображения «dev.local/vadal-echo»

Итак, план Б. Добавить локальный реестр и нажать на него, а также добавить в конфиг (см. ниже):

docker run -d -p 5007:5000 --name реестр --restart=всегда реестр:2

Порт 5007 произвольный.

Изменить Knative Config:

kubectl -n knative-serving edit configmap config-deployment

Добавьте следующее после строки данных:

data:
registriesSkippingTagResolving: ko.local,dev.local,localhost:5007

Теперь пометьте и нажмите:

тег докера vadal-echo:0.0.1-SNAPSHOT localhost:5007/vadal-echo

docker push localhost:5007/vadal-echo

Проверьте наш реестр докеров:

curl localhost:5007/v2/_catalog
{"репозитории":["vadal-echo"]}

Развернуть с помощью Kn:

kn service create vecho --image localhost:5007/vadal-echo
Создание службы vecho в пространстве имен default:

0,053 с Конфигурация все еще работает, чтобы отразить последнюю требуемую спецификацию.
0,176 с Маршрут все еще работает, чтобы отразить последнюю требуемую спецификацию.
0,227 с Конфигурация «vecho» ожидает пересмотра чтобы стать готовым.
12,893 с …
13,330 с. Входящие данные еще не согласованы.
13,456 с. Ожидание готовности балансировщика нагрузки
13,750 с. Готов к работе.

Служба vecho, созданная для последней версии vecho-jvjfg-1, доступна по адресу:
http://vecho.default.example.com

Проверьте это:

curl -i -H «Хост: vecho.default.example.com» localhost:80
HTTP/1.1 200 OK
тип содержимого: application/json
дата: Вт, 21 июля 2020 г., 01:15:22 по Гринвичу
сервер: istio-envoy
x-envoy-upstream-service-time: 16
transfer-encoding: chunked

{«отметка времени»: «2020–07–21T01:15:22.624», «заголовки»: {«хост»: «vecho.default.example.com», «пользовательский агент»: «curl/7.64. 1', "принять": "/", "принять кодировку": "gzip", "переадресовать": "for=192.168.65.3;proto=http, for=10.1.0.35', «k-proxy-request»: «активатор», «x-b3-parentspanid»: «884680e6f10832a3», «x-b3-sampled»: «1», «x-b3-spanid»: «f74293af107c73eb», «x -b3-traceid":"62d4adff218c6fe6884680e6f10832a3", "x-request-id": "0ce4f3b5-ea69–9bd4–87bf-3aef0dfa52e1", "x-forwarded-proto": "http"}

Хорошо, доменное имя API, балансировка нагрузки, сервисы и конфигурация развертывания — все в одной строке. Вы можете видеть, как модуль создается, а затем удаляется по истечении тайм-аута.

Список услуг КН:

kn service list
ИМЯ URL ПОСЛЕДНИЙ ВОЗРАСТ УСЛОВИЯ ГОТОВНОСТЬ ПРИЧИНА
vecho http://vecho.default.example.com vecho-jvjfg-1 7m9s 3 OK / 3 True

Удалить сервис Knative:

kn service удалить вечо

Удалите грубую силу, если что-то запуталось:

прокси kubectl

тогда

curl -X УДАЛИТЬ http://localhost:8001/apis/serving.knative.dev/v1alpha1/namespaces/default/services/vecho

Тайм-аут службы по умолчанию составляет 30 секунд, после чего он удаляется до следующего запроса.

Время выселения пода, количество реплик и т. д. являются предметом автомасштабирования и обсуждаются здесь https://knative.dev/v0.15-docs/serving/configuring-autoscaling/.

Когда нет подов, где логи? Для этого нам нужно добавить логирование.

Наблюдаемость

Здесь мы рассмотрим ведение журнала, трассировку и метрики для knative слоя в нашем кластере k8s.

логирование

На основании следующего:

https://knative.dev/docs/serving/installing-logging-metrics-traces/

узлы меток kubectl --all beta.kubernetes.io/fluentd-ds-ready="true"

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/monitoring-core.yaml

Изменения конфигурации сервера Knative:

kubectl edit cm -n knative-serving config-observability

И добавьте следующее, если вам также нужны журналы запросов/доступа:

data:
metrics.request-metrics-backend-destination: prometheus
logging.request-log-template: '{"httpRequest": {"requestMethod": "{{.Request.Method }}», «requestUrl»: «{{js .Request.RequestURI}}», «requestSize»: «{{.Request.ContentLength}}», «status»: {{.Response.Code}}, «responseSize ”: “{{.Response.Size}}”, “userAgent”: “{{js .Request.UserAgent}}”, “remoteIp”: “{{js .Request.RemoteAddr}}”, “serverIp”: “ {{.Revision.PodIP}}», «referer»: «{{js .Request.Referer}}», «latency»: «{{.Response.Latency}}s», «protocol»: «{{. Request.Proto}}"}, "traceId": "{{index .Request.Header "X-B3-Traceid"}}"}'

Журналы:

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/monitoring-logs-elasticsearch.yaml

Убедитесь, что все в порядке (настольный компьютер для докера может потребовать увеличения количества используемых ЦП, если какие-либо модули зависли в ожидании).

kubectl get po -n knative-monitoring

ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ
elasticsearch-logging-0 1/1 Выполняется 0 34 м
elasticsearch-logging-1 1/1 Выполняется 0 32 м
fluentd-ds-l6mgg 1/1 Бег 0 105 с
kibana-logging-669968b8d4-nc4b2 1/1 Бег 0 34 м

Ознакомьтесь с пользовательским интерфейсом Kibana:

http://localhost:8001/api/v1/namespaces/knative-monitoring/services/kibana-logging/proxy/app/kibana

Настройка, как показано ниже, и создание.

Отслеживание

http://localhost:8001/api/v1/namespaces/istio-system/services/zipkin:9411/proxy/zipkin/

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/monitoring-tracing-zipkin.yaml

Метрики

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.16.0/monitoring-metrics-prometheus.yaml

kubectl port-forward --namespace knative-monitoring
$(kubectl get pods --namespace knative-monitoring
--selector=app=grafana --output=jsonpath=”{.items. .metadata.name}")
3000

Вывод

Мы установили компонент Knative Serving, добавили локальный реестр докеров и развернули существующий сервис с помощью Kn. Поскольку pod’ы эфемерны, журналы Istio бесполезны, но мы можем использовать Kibana для просмотра журналов. Мы также добавили трассировку и метрики.

Первоначально опубликовано на https://blog.ramjee.uk 3 августа 2020 г.