将Curl与Kubernetes nginx Ingress#5116一起使用

将Curl与Kubernetes nginx Ingress#5116一起使用,curl,kubernetes,nginx-ingress,Curl,Kubernetes,Nginx Ingress,我通过nginx配置了对k8s中特定服务的身份验证 它与WUI配合得很好 我看到了一些例子 这也很好: curl-vhttp://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: servic

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

它与WUI配合得很好

我看到了一些例子

这也很好:

curl-vhttp://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“授权:密钥”

我需要如何尝试使用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检查(正确):

服务:

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

在裸机安装中,默认情况下无法使用
入口
负载平衡器
服务。您无法获取您提供的输出中显示的
外部IP

您提供的第一个
curl
命令显示您正在将服务
mobsf
用作
NodePort
,这意味着您可以通过输入节点+端口的IP来访问应用程序,就像这样
http://:8080
,但不需要身份验证,因为您不是通过入口访问服务器

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

  • ClusterIP
    :在群集内部IP上公开服务。选择此值将使服务只能从集群内访问。这是默认的
    ServiceType
  • :在静态端口(节点端口)的每个节点的IP上公开服务。自动创建
    节点端口
    服务路由的
    集群
    服务。您可以通过请求
    ,从集群外部联系
    节点端口
    服务
  • :使用云提供商的负载平衡器在外部公开服务<自动创建外部负载平衡器路由到的代码>节点端口和
    群集IP
    服务
如何在裸机安装中使用负载平衡器和入口? Nginx展示了如何设置metalb以允许裸机集群使用负载平衡器服务

为不在受支持的云提供商上运行的Kubernetes群集提供网络负载平衡器实现,有效地允许在任何群集内使用负载平衡器服务

基本上,设置很简单:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml
然后创建一个ConfigMap来配置: -根据您的网络编辑ip范围

安装和配置MetalLB后,您应该能够使用入口和负载平衡器服务

这里有一个如何设置服务(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中为指向上述ip的
worker1.mydomain.local
配置一个条目


请让我知道这是否有帮助

您想对路径“/”和“/api/v1/upload”使用身份验证吗?请发布所有入口yaml,并详细说明两个入口的身份验证。我做到了,plz CHECK是的,我想对两个路径/和/api/v1/UPLOADE使用auth。在这种情况下,您不需要有两个入口,您可以使用两个路径配置一个入口。但它是有效的,真正的问题是什么?无法为您的请求使用
worker1.mydomain.local
?如果您尝试使用nslooup或dig解析
worker1.mydomain.local
,它是否正确并指向您的入口ip?请共享命令
kubectl get svc
kubectl get ing
的结果。我知道,我可以在一个yml文件中创建两个路径。这只是一次尝试,我加了一句!谢谢你的反馈!小的改进,第一次卷曲没有信誉是不行的。我用worker1.domain.local获得的应用程序的auth也太正确了!也许这改变了什么?@cryptoparty,可以更详细地解释一下吗?你是否尝试了我发布的步骤,但没有成功?不,这只是澄清,可能你误解了我,我没有尝试添加配置映射。是的,相同的结果:-(
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml
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
NAME                          READY   STATUS    RESTARTS   AGE
controller-65895b47d4-6wzfr   1/1     Running   0          9d
speaker-v52xj                 1/1     Running   0          9d
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