繁体   English   中英

在 Kubernetes nginx Ingress 中使用 Curl #5116

[英]Using Curl with Kubernetes nginx Ingress #5116

我通过 nginx 配置了对 k8s 中特定服务的身份验证。

它适用于 WUI。

我看到了一些例子

这也很好用:

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

但我需要关闭我的 url 的其他部分。

例如 /api/v1/upload

我使用路径部署了第二个入口:

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 或端口并获得良好的结果?

如果您能帮我弄清楚,我将不胜感激。

入口1:

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

入口 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

英:

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

在裸机安装中,默认情况下无法使用IngressLoadBalancer服务。 您无法获得EXTERNAL-IP ,如您提供的输出中所示。

您提供的第一个curl命令表明您正在使用您的服务mobsf作为NodePort ,这意味着您可以访问您的应用程序,输入您的节点的 IP + 端口,如http://<NODE_IP>:8080 ,但由于您没有身份验证不通过入口访问服务器。

以下是所有服务类型及其工作原理:

  • ClusterIP :在集群内部 IP 上公开服务。 选择此值会使服务只能从集群内部访问。 这是默认的ServiceType
  • NodePort :在静态端口( NodePort )的每个节点的 IP 上公开服务。 NodePort服务路由到的ClusterIP服务会自动创建。 您将能够通过请求<NodeIP>:<NodePort>从集群外部联系NodePort服务。
  • LoadBalancer :使用云提供商的负载均衡器在外部公开服务。 外部负载均衡器路由到的NodePortClusterIP服务是自动创建的。

如何在裸机安装中使用 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之后,您应该能够使用您的入口和负载均衡器服务。

这里有一个如何设置服务 (ClusterIP) 和 Ingress 的示例:

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 的条目。

请让我知道这是否有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM