Использование Curl с Kubernetes nginx Ingress # 5116 - PullRequest
0 голосов
/ 19 февраля 2020

Я настроил аутентификацию через nginx для конкретной c службы в k8s.

Она отлично работает с WUI.

Я видел несколько примеров

Это работает тоже хорошо:

curl -v http://10.2.29.4/ -H 'Host: foo.bar.com' -u 'foo:bar'

Но мне нужно закрыть ту же часть моего URL.

Например / api / v1 / upload

I Deployd 2-й вход с путем:

spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: service
          servicePort: 8000
        path: /api/v1/upload

Без nginx я набрал:

curl -XPOST 'file=@/file' http://10.2.29.4:8000/api/v1/upload -H "Authorization:key"

Как мне нужно попробовать использовать curl для скрытия реального IP или порт и получить хороший результат?

Я был бы очень признателен, если бы вы могли помочь мне разобраться.

ingress1:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mobsf
  namespace: default
  labels:
    app: mobsf
#    env: dev
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: mobsf-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
spec:
  rules:
  - host: worker1.mydomain.local
    http:
      paths:
      - path: /
      - backend:
          serviceName: mobsf
          servicePort: 8000

Ingress 2:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mobsf2
  namespace: default
  labels:
    app: mobsf2
#    env: dev
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: mobsf-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
spec:
  rules:
  - host: worker1.mydomain.local
    http:
      paths:
      - backend:
          serviceName: mobsf2
          servicePort: 8000
        path: /api/v1/

Проверка DNS (правильная):

 nslookup worker1.mydomain.local
Server:         10.2.67.10
Address:        10.2.67.10#53

Name:   worker1.mydomain.local
Address: 10.2.67.203

Услуги:

kubectl get svc
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP      10.233.0.1      <none>        443/TCP          159d
minio-service   LoadBalancer   10.233.32.19    <pending>     9001:30809/TCP   104d
mobsf           NodePort       10.233.18.34    <none>        8000:30426/TCP   8d
vault           NodePort       10.233.43.134   <none>        8200:30820/TCP   69

Ing:

 kubectl get ing
NAME     HOSTS                  ADDRESS   PORTS   AGE
mobsf    worker1.dev002.local             80      2d1h
mobsf2   worker1.dev002.local             80      23h

1 Ответ

0 голосов
/ 20 февраля 2020

В голых металлических установках невозможно использовать сервисы Ingress и LoadBalancer по умолчанию. Вы не можете получить EXTERNAL-IP, как показано в предоставленных вами выходах.

Первая указанная вами команда curl показывает, что вы используете свой сервис mobsf как NodePort, это означает, что вы можете достичь своего приложения, набрав IP-адрес вашего узла + порта, например http://<NODE_IP>:8080 , но без аутентификации, поскольку вы не получаете доступ к серверу через вход.

Вот все типы служб и как это работает:

  • ClusterIP: Предоставляет Службу по внутреннему IP-адресу кластера. Выбор этого значения делает Сервис доступным только из кластера. Это значение по умолчанию ServiceType.
  • NodePort: Предоставляет Сервис для IP-адреса каждого узла через порт c (NodePort). Служба ClusterIP, к которой автоматически создается маршрут службы NodePort. Вы сможете связаться со службой NodePort из-за пределов кластера, запросив <NodeIP>:<NodePort>.
  • LoadBalancer: извещение службы извне с использованием балансировщика нагрузки облачного провайдера , NodePort и ClusterIP Службы, для которых автоматически создаются внешние маршруты балансировщика нагрузки.

Как использовать LoadBalancer и Ingress в установках с «голым железом»?

В Nginx документах показано, как настроить MetalLB , чтобы разрешить вашему сервису «Чистый металл» использовать службы LoadBalancer.

MetalLB предоставляет реализацию балансировщика сетевой нагрузки для кластеров Kubernetes, которые не работают на поддерживаемом облачном провайдере, что позволяет эффективно использовать службы LoadBalancer в любом кластере.

В принципе, настройка проста:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

А затем создайте ConfigMap для настройки: - отредактируйте диапазон ip в соответствии с вашей сетью

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.1.240-192.168.1.250 <= EDIT IP RANGE

Проверьте установку, набрав kubectl get pods -n metallb-system, это ожидаемый вывод :

$ kubectl get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS   AGE
controller-65895b47d4-6wzfr   1/1     Running   0          9d
speaker-v52xj                 1/1     Running   0          9d

После того, как MetalLB установлен и настроен, вы сможете использовать сервисы Ingress и Loadbalancer.

Вот пример того, как настроить службу (ClusterIP) и вход:

apiVersion: v1
kind: Service
metadata:
  name: mobsf
spec:
  selector:
    app: mobsf
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mobsf-ing
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
  rules:
  - host: worker1.mydomain.local
    http:
      paths:
      - path: "/"
        backend:
          serviceName: mobsf
          servicePort: 8000
      - path: "/api/v1"
        backend:
          serviceName: mobsf
          servicePort: 8080

Проверьте вход с помощью команды kubectl get ing и найдите в столбце EXTERNAL-IP.

После этого убедитесь, что вы настроили в своем локальный DNS запись для worker1.mydomain.local, указывающая на ip выше.

Пожалуйста, дайте мне знать, если это помогло

...