Kubernetes (3) Как получить доступ к сервисам извне

Kubernetes
Kubernetes (3) Как получить доступ к сервисам извне

Учебное пособие по внешним службам в Kubernetes

Адрес статьи:blog.Park Ruiqing.com/2019/10/20/…

предисловие

Благодаря предыдущему объяснению,"Сборка K8S с нуля с официальной документацией",«Развертывание приложений»Я полагаю, что читатели имеют определенное представление об установке и развертывании приложений Kubernetes.Далее в этой статье объясняется, как предоставлять службы внешнему миру.

Прочитав эту статью, вы получите:

  • Узнайте о нескольких вариантах представления сервисов в Kubernetes, их плюсах и минусах.

Для прочтения этой статьи вам понадобится:

  • Узнайте об основных командах Kubernetes.
  • Иметь среду Kubernetes

Несколько способов предоставления услуг внешним клиентам

  • пройти черезport-forwardПереадресация, о которой говорилось в предыдущей статье, проста в эксплуатации и подходит для отладки,Не подходит для производственных сред.
  • пройти черезNodePort, в это время каждый узел (Node) в кластере будет слушать указанный порт, и мы сможем получить доступ к указанному сервису через порт любого узла, однако слишком много сервисов откроют большое количество портов и их будет сложно поддерживать.
  • пройти черезLoadBalanceвыставить услугу.LoadBalance(负载均衡 LB)Обычно предоставляется поставщиком облачных услуг, если услуга LB не предоставляется в облачной среде, мы обычно используем ее напрямую.Ingressили используйтеMetalLBНастройте ЛБ самостоятельно.
  • пройти черезIngressВыставляйте несколько сервисов.IngressРазоблачение из-за пределов кластера внутри кластераservicesМаршрутизация HTTP и HTTPS.IngressПравила, определенные на ресурсе, контролируются.В случае, если поставщик облачных услуг не предоставляет услуги LB, мы можем напрямую использоватьIngressдля предоставления услуги. (В качестве альтернативы используйтеLB + IngressСхема развертывания позволяет избежать затрат, вызванных слишком большим количеством LB-приложений).

Подготовить

Прежде чем начать, автор создал тестовое приложение, и его код слишком длинный, чтобы его здесь опустить.Приложение 1]иПриложение[2]

мы проходимkubectl get podsСм. список подов.

Упоминается, что мы можем пройти--namespaceПараметр для просмотра списка подов в указанном пространстве имён, также можно передать--all-namespacesчтобы увидеть список модулей во всех пространствах имен.

Поскольку пространство имен не указано, приложение помещается вdefaultбинго.

[root@nas-centos1 k8s-test]# kubectl get pods --namespace default
NAME                        READY   STATUS    RESTARTS   AGE
k8s-test-578b77cd47-sw5pd   1/1     Running   0          6m29s
k8s-test-578b77cd47-v6kmp   1/1     Running   0          6m29s

port-forward

port-forwardПолучая доступ к модулям таким образом, вы можете указать экземпляры модулей, это просто и удобно и очень подходит для отладки.

пройти черезkubectl port-forwardЧтобы настроить переадресацию:

[root@nas-centos1 k8s-test]# kubectl port-forward --address 0.0.0.0 k8s-test-578b77cd47-sw5pd 9999:8080
Forwarding from 0.0.0.0:9999 -> 8080

На этом этапе мы можем получить доступ к хосту9999порт для доступа кk8s-test-578b77cd47-sw5pdиз8080порт.

/k8s-test/timestampЭто единственный API в примере приложения, который получает текущую временную метку.

[root@nas-centos1 k8s-test]# curl http://10.33.30.95:9999/k8s-test/timestamp
1571151584224
[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.

NodePort

Каждый узел (Node) в кластере будет слушать указанный порт, и мы сможем получить доступ к указанному сервису через порт любого узла, но слишком много сервисов откроют большое количество портов и будут сложны в обслуживании.

Справочная документация:Какой особенный. IO/docs/con обзор…

СоздаватьService, и укажите его тип какNodePort.

k8s-test-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: k8s-test-service
spec:
  selector:
    app: k8s-test
    env: test
  ports:
    - port: 80			# 服务端口, 内部可访问
      targetPort: 8080		# 目标端口, 此处指的是pod的8080端口
      nodePort: 30080		# 节点端口, 外部可访问
      protocol: TCP
  type: NodePort

воплощать в жизньkubectl apply -f k8s-test-service.yamlОпубликовать эту услугу.

пройти черезkubectl get servicesСписок услуг, которые можно просмотреть, выглядит следующим образом:

[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   NodePort    10.244.234.143   <none>        80:30080/TCP   8s
kubernetes         ClusterIP   10.244.0.1       <none>        443/TCP        32d

Мы видим, что порт 30080 привязан к порту 80 службы.

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

[root@nas-centos3 ~]# curl http://10.33.30.94:30080/k8s-test/timestamp
1571152525336

LoadBalance

Справочная документация:

  1. metallb.universe.tf/
  2. Какой особенный. IO/docs/con обзор…

LoadBalance(负载均衡 LB)Обычно предоставляется поставщиком облачных услуг. Если среда не поддерживает LB, созданный LoadBalance всегда будет в<pending>государство:

[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   LoadBalancer   10.244.29.126   <pending>     80:32681/TCP   13s
kubernetes         ClusterIP      10.244.0.1      <none>        443/TCP        33d

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

Когда наша среда поддерживает LB, мы можем создать следующую службу для предоставления службы:

apiVersion: v1
kind: Service
metadata:
  name: k8s-test-service
spec:
  selector:
    app: k8s-test
    env: test
  ports:
    - port: 80	        # 服务端口
      targetPort: 8080	# 目标端口, 此处指的是pod的8080端口
      protocol: TCP
  type: LoadBalancer

воплощать в жизньkubectl apply -f k8s-test-lb.yamlНа этом этапе вы можете просмотреть команду конфигурации, выданную службе EXTERNAL-IP (10.33.30.2), следующим образом:

[root@nas-centos1 k8s-test]# kubectl get services
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
k8s-test-service   LoadBalancer   10.244.151.128   10.33.30.2    80:31277/TCP   2s
kubernetes         ClusterIP      10.244.0.1       <none>        443/TCP        33d

Попробуйте получить доступ к приложению через IP-адрес LB следующим образом:

[root@nas-centos1 k8s-test]# curl http://10.33.30.2/k8s-test/timestamp
1571235898264

Ingress

IngressРазоблачение из-за пределов кластера внутри кластераservicesМаршрутизация HTTP и HTTPS.IngressПравила, определенные в элементе управления ресурсами.

Справочная документация:Это особенное GitHub.IO/ingress-что я…

Мы используем контроллер входа nginx для тестирования, сначала загрузите файл развертывания:

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

редактировать файлvim mandatory.yaml, добавьте следующее:

template:
  spec:
    hostNetwork: true
  • hostNetwork: Включите hostNetwork, что позволяет привязывать вход к портам 80 и 443 хоста.

  • Есть много способов получить доступ к входу: (1) напрямую привязаться к портам 80 и 443 через hostNetwork, (2) открыть порты на узле через NodePort (но этот метод может привязывать только фиксированный диапазон портов, значение по умолчанию — 30000). -32767), (3) Через LoadBalance этот метод и NodePort фактически предоставляются через Сервис, но это разные типы Сервиса.

  • обязательный.yamltemplateЕсть только один, легко найти (советы: можно использовать в vim/искать).

  • Ingress Controller: это программа обратного прокси, которая отвечает за разбор правил обратного прокси Ingress.

  • Ingress:Ingress это правило обратного прокси.Не путайтеIngress ControllerиIngressКонцепция чего-либо.

После публикации мы создаемIngressТест, содержание следующее:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /k8s-test
spec:
  rules:
    - http:
        paths:
          - path: /k8s-test
            backend:
              serviceName: k8s-test-service
              servicePort: 80

Попробуйте получить доступ:

[root@nas-centos1 ingress]# curl http://10.33.30.94/k8s-test/timestamp
1571321623058

резюме

Обычно мы будем рассматриватьLoadBalanceиIngressИспользуйте вместе.С одной стороны, простое использование LB приведет к большим затратам, а с другой стороны, большое количество LB также увеличит затраты на обслуживание.Когда LB используется в сочетании с Ingress, он может достичь отличных результатов за счет различать сервисы по разным путям (здесь и принцип предоставления нескольких сервисов через Nginx в основном одинаков)

Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"

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

приложение

[1] Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-test
  labels:
    app: k8s-test
spec:
  replicas: 2
  template:
    metadata:
      name: k8s-test
      labels:
        app: k8s-test
        env: test
    spec:
      containers:
        - name: k8s-test
          image: registry.cn-hangzhou.aliyuncs.com/piaoruiqing/k8s-test:0.0.1
          imagePullPolicy: IfNotPresent
          ports:
            - name: http-port
              containerPort: 8080
      imagePullSecrets:
        - name: docker-registry-secret
      restartPolicy: Always
  selector:
    matchLabels:
      app: k8s-test

[2] K8sTestApplication.java

/**
 * @author piaoruiqing
 * @description: k8s test
 * @date: 2019/09/22 10:01
 * @since JDK 1.8
 */
@RestController
@RequestMapping(value = "/k8s-test")
@SpringBootApplication
public class K8sTestApplication {
    /**
     * get timestamp
     * @return
     */
    @GetMapping(value = "/timestamp")
    public ResponseEntity<?> getTimestamp() {
        return ResponseEntity.ok(System.currentTimeMillis() + "\n");
    }
  
    public static void main(String[] args) {
        SpringApplication.run(K8sTestApplication.class, args);
    }
}

серия статей

Добро пожаловать в публичный аккаунт (код как поэзия):

[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.