Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Публикация сервисов и приложений

Публикация сервисов и приложений

Evgenii Terechkov

February 02, 2019
Tweet

More Decks by Evgenii Terechkov

Other Decks in Technology

Transcript

  1. 2 2 slurm.io План • Обзор методов публикации сервисов: NodePort

    vs LoadBalancer vs Ingress • Ingress controller (Nginx): балансируем входящий трафик • Автоматически получаем сертификаты SSL/TLS
  2. 3 3 slurm.io Проблематика • Поды смертны и эфемерны, их

    надо отслеживать • Под(ы) в кластере - «вещь в себе», без подачи входящих данных/запросов они бесполезны • Если подов много, надо балансировать между ними нагрузку • Есть сервисы, но по умолчанию они не работают вне кластера • Хотим кнопку "Сделать хорошо" для разработчиков :-) • Хотим, чтобы пользователи были счастливы (без 5xx)
  3. 5 5 slurm.io ClusterIP Не работает вне кластера Но есть

    kubectl proxy: $ kubectl proxy —port=8080 http://localhost:8080/api/v1/proxy/namespaces/default/ services/my-internal-service:http/ Использовать для разработки/отладки Документация
  4. 6 6 slurm.io NodePort Открывает порт на каждой ноде, балансируя

    оттуда трафик по подам: apiVersion: v1 kind: Service metadata: name: my-nodeport-service selector: app: my-app spec: type: NodePort ports: - name: http port: 80 targetPort: 80 nodePort: 30036 protocol: TCP Использовать когда есть белые адреса на нодах и хочется простоты (за счёт доступности) Документация
  5. 7 7 slurm.io LoadBalancer Работает совместно с облачным провайдером, интегрируясь

    с его API для балансировщика. Получает «белый» IP от провайдера. Позволяет получить любой трафик . Каждому сервису нужен свой облачный балансер :-( Использовать в облаках для простых приложений (или нет: MetalLB). Документация
  6. 9 9 slurm.io Что есть Ingress? • Объект API k8s,

    который управляет внешним доступом к сервисам кластера (обычно, HTTP/HTTPS) • Комплект реверс-прокси плюс контроллер • Балансировщик трафика • Терминирование SSL/TLS • Виртуальный хостинг по именам хостов
  7. 10 10 slurm.io Разнообразие • Стандартный на базе nginx •

    От Nginx Inc • На базе Haproxy • На базе Envoy: 1, 2 • Traefik • Kong • тысячи их! • и можно использовать несколько сразу!
  8. 11 11 slurm.io Определение apiVersion: extensions/v1beta1 kind: Ingress metadata: name:

    my-ingress spec: backend: serviceName: other servicePort: 8080 rules: - host: foo.mydomain.com http: paths: - backend: serviceName: foo servicePort: 8080 - host: mydomain.com http: paths: - path: /bar/* backend: serviceName: bar ServicePort: 8080 Маршрут по умолчанию на other Вхост foo.mydomain.com маршрутизировать на сервис foo Пути вида /bar/ вхоста mydomain.com маршрутизировать на сервис bar
  9. 12 12 slurm.io Настройка поведения • При развёртывании: аргументы командной

    строки • Глобально: ConfigMap – kubectl -n ingress-nginx get cm ingress-nginx -o yaml • data: – load-balance: ip_hash • На каждый ресурс: Annotations – kubectl annotate ing my-ingress nginx.ingress.kubernetes.io/canary="true" • Редко: Custom template
  10. 13 13 slurm.io Дополнительно • Методы балансировки • Поддержка canary-деплоев

    • Трассировка (метки запросов) • Аутентификация • Лимиты, circuit breaker • Healthchecks
  11. 14 14 slurm.io Шифрование трафика • Создаём секрет apiVersion: v1

    data: tls.crt: base64 encoded cert tls.key: base64 encoded key kind: Secret metadata: name: foo-secret type: kubernetes.io/tls • Подключаем секрет apiVersion: extensions/v1beta1 kind: Ingress metadata: name: foobar spec: tls: - hosts: - foo.bar.com secretName: foo-secret
  12. 15 15 slurm.io cert-manager • Автоматизирует получение SSL/TLS-сертификатов от CA

    (LE/Vault/selfhosted), интегрируясь с ингрессом • Автоматизирует продление сертификатов • CRD: Issuer, ClusterIssuer, Certificate • RBAC: certmanager.k8s.io
  13. 16 16 slurm.io Развёртывание cert- manager • kubectl create ns

    cert-manager • kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true • kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.6/deploy/manifests/00- crds.yaml • helm upgrade --wait --install cert-manager --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer --namespace cert-manager --version v0.6.0 stable/cert-manager • kubectl apply -f - << EOF apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: [email protected] privateKeySecretRef: name: letsencrypt-staging http01: {} EOF
  14. 17 17 slurm.io Эксплуатация cert- manager apiVersion: extensions/v1beta1 kind: Ingress

    metadata: annotations: kubernetes.io/tls-acme: "true" spec: tls: - hosts: - foo.bar.com secretName: foo-secret
  15. 18 18 slurm.io Материалы • Термины и определения ингресса •

    Документация на стандартный ингресс- контроллер • Kubernetes NodePort vs LoadBalancer vs In gress? When should I use what? • Kubedex ingress comparison • Интеграция с DNS-провайдером