Kubernetes k8s在不同名称空间中的入口配置
我需要在azure k8s上配置Ingress Nginx,我的问题是是否可以在一个命名空间et中配置Ingress。Ingress Nginx和其他命名空间(如资源)中的一些服务? 我的文件看起来是这样的: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:
# 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及其入口选项的人,我想进一步简化答案。 入口工作需要有两个单独的东西:
种类:入口的资源
。只有在入口
控制器(已安装)但是,入口规则必须位于它们配置的应用所在的命名空间中。 有一些解决方法,但这是最常见的方法。每个入口资源都有一个默认后端,尽管文档中说它通常在入口控制器级别配置 例如:
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
...