Kubernetes Ingress со статическим IPv4-адресом

Я установил Kubernetes с помощью kubeadm, голого металла на экземплярах Ubuntu Linux. Это экземпляры на GCE, но я не использую конкретную собственную кластерную службу GKE. Каждый экземпляр (как узел) имеет статический внешний IPv4-адрес. Я пытаюсь сделать сервис доступным извне, используя вход. Я пробовал MetalLB или перенаправление портов, но не могу заставить его работать. В первом случае, похоже, требуется ввод адресов по запросу, чего у меня нет.

Есть ли рекомендуемый способ заставить LoadBalancing работать со статическими внешними IP-адресами?

1
задан 15 November 2020 в 11:43
1 ответ

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

Предположим, что кластер Kubernetes настроен правильно (с CNI, Docker, Kubeadmbootstrap, taints и т. д.).

Вы можете использовать приведенный ниже пример для создания модулей hello-app, которые будут реагировать на ваш трафик:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  replicas: 1
  selector:
    matchLabels:
      key: application-1
  template:
    metadata:
      labels:
        key: application-1
    spec:
      containers:
      - name: hello1
        image: gcr.io/google-samples/hello-app:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Использование типа сервиса NodePort.

Вы используете экземпляр GCE, поэтому ваша виртуальная машина уже имеет статический ExternalIP.

Hello-appбыло развернуто на предыдущем шаге, теперь вам нужно предоставить его с помощью serviceтипа NodePort

apiVersion: v1
kind: Service
metadata:
  name: service-one
spec:
  type: NodePort
  selector:
    key: application-1
  ports:
    - port: 80
      targetPort: 8080

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

Вы можете сделать это по следующему пути: Меню навигации> Сеть VPC> Брандмауэр> Создать правило брандмауэра.

Вы можете создать правило, которое разрешает:

  • один порт для NodePortнапример 31085
  • весь диапазон 30000-32767
$ kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP        50m
service-one   NodePort    10.110.184.238   <none>        80:31085/TCP   5m53s

Для доступа к вашему кластеру вы можете используйте

$ curl ExternalNodeIP:NodePort

$ curl 35.246.148.237:31085
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-v5826

Если вы не создадите FirewallRule для этого NodePort, вывод curl будет следующим:

curl: (7) Failed to connect to 35.246.148.237 port 31085: Connection refused

Использование Ngin Ingress Controllerв качестве исходного кода

При использовании Nginx Ingressвы можете использовать:

  • Через службу NodePort
  • хост-сеть

Вы можете развернуть Nginx BareMetal, используя:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml

Он создаст службу Nginx как тип NodePort. Это очень похоже на предыдущий метод, но разница в том, что ваши сервисы могут быть типа ClusterIPи NodePort.

С помощью этого метода можно применить Ingress для предоставления доступа к более чем 1 службе.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"      
spec:
  rules:
  - http:
      paths:
      - path: /one
        backend:
          serviceName: service-one
          servicePort: 80
      - path: /two
        backend:
          serviceName: service-two
          servicePort: 80
$ kubectl get svc -A
NAMESPACE       NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
default         service-one                          ClusterIP   10.106.21.3      <none>        80/TCP                       2m4s
default         service-two                          ClusterIP   10.105.161.86    <none>        80/TCP                       2m2s
ingress-nginx   ingress-nginx-controller             NodePort    10.110.149.194   <none>        80:31337/TCP,443:30417/TCP   6m31s
ingress-nginx   ingress-nginx-controller-admission   ClusterIP   10.98.15.73      <none>        443/TCP                      6m31s

### Output:
$ curl 35.246.148.237:31337/one
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-v5826
curl 35.246.148.237:31337/two
Hello, world!
Version: 2.0.0
Hostname: deployment-2-fb984955c-8pfls 
0
ответ дан 27 November 2020 в 14:55

Теги

Похожие вопросы