Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes k8s在不同名称空间中的入口配置_Kubernetes_Kubernetes Ingress_Nginx Ingress - Fatal编程技术网

Kubernetes k8s在不同名称空间中的入口配置

Kubernetes k8s在不同名称空间中的入口配置,kubernetes,kubernetes-ingress,nginx-ingress,Kubernetes,Kubernetes Ingress,Nginx Ingress,我需要在azure k8s上配置Ingress Nginx,我的问题是是否可以在一个命名空间et中配置Ingress。Ingress Nginx和其他命名空间(如资源)中的一些服务? 我的文件看起来是这样的: # ingress-nginx.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-ingress-controller namespace: ingress-nginx spec:

我需要在azure k8s上配置Ingress Nginx,我的问题是是否可以在一个命名空间et中配置Ingress。Ingress Nginx和其他命名空间(如资源)中的一些服务? 我的文件看起来是这样的:

# ingress-nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ingress-nginx
  template:
    metadata:
      labels:
        app: ingress-nginx
      annotations:
        prometheus.io/port: '10254'
        prometheus.io/scrape: 'true' 
    spec:
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.12.0
          args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --annotations-prefix=nginx.ingress.kubernetes.io
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
          - name: http
            containerPort: 80
          - name: https
            containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
然后我在资源名称空间中运行了一些应用程序,问题是我遇到了以下错误

error obtaining service endpoints: error getting service resources/api-sand from the cache: service resources/api-sand was not found


如果我在ingress所在的同一名称空间中部署api sand,则此服务可以正常工作。

而不是在
ingress nginx
名称空间中创建ingress
应用程序ingress
,您应该在您拥有服务
api sand
和pod的名称空间中创建它

或者,有一种方法可以通过
externalName
在一个名称空间中实现入口,在另一个名称空间中实现服务

下面是一个参考的例子



实际上,您可以使用命名空间a中的ExternalName类型定义入口和服务,而ExternalName指向命名空间B中服务的DNS。有关详细信息,请参考此答案:

对于那些不熟悉Kubernetes及其入口选项的人,我想进一步简化答案。 入口工作需要有两个单独的东西:

  • 入口控制器(基本上是一个单独的吊舱/部署以及 可用于利用路由和代理的服务。基于 nginx容器等)
  • 入口规则(单独的Kubernetes 带有
    种类:入口的资源
    。只有在入口 控制器(已安装)
  • 现在,入口控制器可以部署在任何名称空间中,事实上,通常部署在与应用程序服务分离的名称空间中。它可以开箱即用地查看集群中所有名称空间中的入口规则,并将获取它们。
    但是,入口规则必须位于它们配置的应用所在的命名空间中。

    有一些解决方法,但这是最常见的方法。

    每个入口资源都有一个默认后端,尽管文档中说它通常在入口控制器级别配置

    例如:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingress
      namespace: myns
    spec: 
      defaultBackend:
        service:
          name: default-http-backend
          port: 
            number: 80
    ...
    

    这里,默认http后端必须在与入口资源相同的命名空间中定义。

    回答很好:我可以问一下,在创建入口规则时,它们是否都需要在单个入口规则中定义,还是每个命名空间中都有多个入口规则,每个入口规则都映射到该命名空间中的服务?txWell,这并不像网络策略那么简单。并不是说NPs很简单,而是有一种相对简单的方法来合并它们。对于Ingress,它不能这么简单,因为它更难标准化底层的Ingress控制器实现,特别是因为它们构建在Kubernetes成立之前很久就存在的完全独立的组件之上,比如Nginx。说了你不是第一个,乔科,他有这样的想法:你是怎么让它工作的?我不断得到
    服务“默认/我的服务”类型为“ExternalName”,预期为“NodePort”或“LoadBalancer”我也无法让它工作。我想知道这是否是提供商和/或版本问题?我在EKS 1.14…()中描述入口时,显示此错误。有解决的线索吗?
    
            # app-ingress.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: app-ingress
      namespace: ingress-nginx
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      tls:
        - hosts:
          - api-sand.fake.com
      rules:
      - host: api-sand.fake.com
        http:
          paths:
          - backend:
              serviceName: api-sand
              servicePort: 80
            path: /
    
    
    error obtaining service endpoints: error getting service resources/api-sand from the cache: service resources/api-sand was not found
    
    
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      type: ExternalName
      externalName: test-service.namespacename.svc.cluster.local
    
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            backend:
              serviceName: my-service
              servicePort: 80
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingress
      namespace: myns
    spec: 
      defaultBackend:
        service:
          name: default-http-backend
          port: 
            number: 80
    ...