我设置了Ingress
对象,根据网址路径将流量路由到相应的Service
。我想在另一个Ingress
中访问/公开此Pod
个对象。我想知道这是否可行?
我尝试在Service
上设置Ingress
,但这似乎无效。
答案 0 :(得分:2)
如果已分配主机名,则还必须在/ etc / hosts文件中提供群集的域名和IP地址。当您从群集外部通过Ingress访问服务时,将使用该文件进行主机名解析。
但是,在集群中运行的Pod无法访问此/ etc / hosts文件。它具有自己的/ etc / hosts文件。要使用入口,吊舱需要在其自己的/ etc / hosts文件中具有相同的域名和IP地址条目。
要实现此目的,您必须使用 hostAliases 。这是一个工作原理的示例:
apiVersion: v1
kind: Pod
metadata:
...
spec:
hostAliases:
- ip:<IP address>
hostnames:
- <host name>
有关hostAliases的更多详细信息,请转到this link
答案 1 :(得分:1)
因此,无论出于何种原因(ssr,大量微服务等),您都希望使用其入口路径映射来访问k8s资源,而不是通过其内部名称来调用每个服务。 例如,您有一个这样的入口配置:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
rules:
- host: example.com
http:
paths:
- path: /api/users/?(.*)
backend:
serviceName: auth-service
servicePort: 80
- path: /api/cart/?(.*)
backend:
serviceName: cart-service
servicePort: 80
,您想使用auth-service
而不是http://example.com/api/auth
访问http://auth-service
。
您要做的就是用入口服务网址替换域部分(在我们的情况下为example.com
)。它取决于您的配置和环境,但是通常看起来像http://[SERVICE_NAME].[NAMESPACE]
,例如:
http://ingress-nginx-controller.ingress-nginx
http://my-release-ingress-nginx-controller
(在这里
仅使用服务名称部分,因为头盔将入口安装在
默认名称空间)获取名称空间:kubectl get namespaces
在名称空间kubectl get services -n [NAMESPACE]
中获取服务名称。
答案 2 :(得分:0)
在群集中,您的群组使用services
来访问其他群组。
从外部群集,客户端可以使用ingress
来获取服务。
Ingress资源允许连接到服务。 因此,您的pod需要通过服务(以下示例中的my-svc-N)访问,您将在入口定义中使用该服务。
看一下这个例子:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
backend:
serviceName: default-http-backend
servicePort: 80
rules:
- host: my-kube.info
http:
paths:
- path: /
backend:
serviceName: my-svc-1
servicePort: 80
- host: cheeses.all
http:
paths:
- path: /aaa
backend:
serviceName: my-svc-2
servicePort: 80
- path: /bbb
backend:
serviceName: my-svc-3
servicePort: 80
答案 3 :(得分:0)
正如fiunchinho在评论中提到的,Ingress旨在管理到集群的外部流量。要连接同一群集中的不同pod,您应该使用Service。
在您的情况下,您可以将pod连接到支持Ingress对象的服务。
答案 4 :(得分:0)
我在这个问题上花了很多时间。我找到了非常简单的解决方案。我正在使用 Mac Docker Desktop 3.3.1
。
我的 Kubernetes 版本:1.19.7
我正在尝试从集群中运行的另一个 Pod 访问 UI URL。
apiVersion: v1
kind: Service
metadata:
name: my-ui-service
spec:
type: LoadBalancer
selector:
app: my-ui
ports:
- protocol: TCP
port: 8080
targetPort: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my-site.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: my-ui-service
port:
number: 8080
我用过 NGINX Ingress Controller
。
运行入口控制器的命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.48.1/deploy/static/provider/cloud/deploy.yaml
一旦控制器准备就绪,运行命令以查看入口状态。
kubectl get ingress
现在查看入口的描述:
kubectl describe ingress my-ingress
在这里你会发现
Rules:
Host Path Backends
---- ---- --------
my-site.com
/ my-ui-service:8080 (10.1.2.198:8080)
在集群中的任何 Pod 中,您都可以使用 my-site.com
访问域 my-ui-service:8080
。