【问题标题】:Getting an Kubernetes Ingress endpoint/IP address获取 Kubernetes Ingress 端点/IP 地址
【发布时间】:2018-09-25 11:13:35
【问题描述】:
Base OS : CentOS (1 master 2 minions)
K8S version : 1.9.5 (deployed using KubeSpray)

我是 Kubernetes Ingress 的新手,正在设置 2 个不同的服务,每个服务都有自己的路径。

我创建了 2 个部署:

kubectl run nginx --image=nginx --port=80
kubectl run echoserver --image=gcr.io/google_containers/echoserver:1.4 --port=8080

我也创建了他们相应的服务:

kubectl expose deployment nginx --target-port=80 --type=NodePort
kubectl expose deployment echoserver --target-port=8080 --type=NodePort

我的svc 是:

[root@node1 kubernetes]# kubectl get svc
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
echoserver   NodePort   10.233.48.121   <none>        8080:31250/TCP   47m
nginx        NodePort   10.233.44.54    <none>        80:32018/TCP     1h

我的 NodeIP 地址是 172.16.16.2,我可以使用访问两个 pod

http://172.16.16.2:31250 &
http://172.16.16.2:32018

现在,除此之外,我想部署一个 Ingress,这样我就可以访问两个 pod,而不是使用 2 个 IP 和 2 个不同的端口,而是使用不同路径的 1 个 IP 地址。

所以我的 Ingress 文件是:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: fanout-nginx-ingress
spec:
  rules:
  - http:
      paths:
      - path: /nginx
        backend:
          serviceName: nginx
          servicePort: 80
      - path: /echo
        backend:
          serviceName: echoserver
          servicePort: 8080

这会产生:

[root@node1 kubernetes]# kubectl describe  ing fanout-nginx-ingress
Name:             fanout-nginx-ingress
Namespace:        development
Address:          
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *     
        /nginx   nginx:80 (<none>)
        /echo    echoserver:8080 (<none>)
Annotations:
Events:  <none>

现在,当我尝试使用 NodeIP 地址 (172.16.16.2) 访问 Pod 时,我什么也得不到。

http://172.16.16.2/echo
http://172.16.16.2/nginx

我的配置中有什么遗漏吗?

【问题讨论】:

  • 我是一个 kubernetes 菜鸟,所以对此持保留态度。我注意到入口缺少“地址”。这可能是问题吗?
  • 你是对的。它不见了。
  • 您是如何修复丢失地址的。我有同样的问题。控制器和应用程序在同一个名称空间.. 我 catn 访问它们

标签: kubernetes kubernetes-ingress


【解决方案1】:

我在裸机安装中遇到了同样的问题——或者更确切地说是类似的问题(kubernetes 虚拟集群——通过 Host-Only-Adapter 连接的一组虚拟机)。这是我的kubernetes vlab的链接。

首先确保您已安装入口控制器。目前有两个入口控制器值得尝试kubernetes nginx ingress controllernginx kubernetes ingress controller -我安装了第一个。

安装

转到installation instructions并执行第一步

# prerequisite-generic-deployment-command
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

接下来获取集群节点的IP地址。

$ kubectl get nodes -o wide
NAME     STATUS   ROLES    ...   INTERNAL-IP    
master   Ready    master   ...   192.168.121.110
node01   Ready    <none>   ...   192.168.121.111
node02   Ready    <none>   ...   192.168.121.112

此外,crate ingress-nginx 类型为 LoadBalancer 的服务。我通过从安装教程下载NodePort模板服务并在svc-ingress-nginx-lb.yaml文件中进行以下调整来做到这一点。

$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml > svc-ingress-nginx-lb.yaml

# my changes svc-ingress-nginx-lb.yaml
type: LoadBalancer
externalIPs:
  - 192.168.121.110
  - 192.168.121.111
  - 192.168.121.112
externalTrafficPolicy: Local

# create ingress- service
$ kubectl apply -f svc-ingress-nginx-lb.yaml

验证

检查ingress-nginx 服务是否已创建。

$ kubectl get svc -n ingress-nginx
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP                                                       PORT(S)                      AGE
ingress-nginx   LoadBalancer   10.110.127.9   192.168.121.110,192.168.121.111,192.168.121.112   80:30284/TCP,443:31684/TCP   70m

检查nginx-ingress-controller 部署是否已创建。

$ kubectl get deploy -n ingress-nginx
NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-ingress-controller   1         1         1            1           73m

检查nginx-ingress pod 是否正在运行。

$ kubectl get pods --all-namespaces -l 

app.kubernetes.io/name=ingress-nginx
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx   nginx-ingress-controller-5cd796c58c-lg6d4   1/1     Running   0          75m

最后,检查入口控制器版本。 别忘了更改 pod 名称!

$ kubectl exec -it nginx-ingress-controller-5cd796c58c-lg6d4 -n ingress-nginx -- /nginx-ingress-controller --version
-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:    0.21.0
  Build:      git-b65b85cd9
  Repository: https://github.com/aledbf/ingress-nginx
-------------------------------------------------------------------------------

测试

通过执行此tutorial 中的步骤来测试入口控制器是否正常工作-当然,您将省略minikube 部分。

成功后,所有步骤的执行将创建如下所示的入口控制器资源。

$ kubectl get ing
NAME               HOSTS                                ADDRESS                                          PORTS    AGE
ingress-tutorial   myminikube.info,cheeses.all          192.168.121.110,192.168.121.111,192.168.121.112   80      91m

还有看起来像这样的 pod。

$ kubectl get pods 
NAME                              READY   STATUS             RESTARTS   AGE
cheddar-cheese-6f94c9dbfd-cll4z   1/1     Running            0          110m
echoserver-55dcfbf8c6-dwl6s       1/1     Running            0          104m
stilton-cheese-5f6bbdd7dd-8s8bf   1/1     Running            0          110m

最后,测试对myminikube.info 的请求通过入口负载均衡器传播。

$ curl myminikube.info
CLIENT VALUES:
client_address=10.44.0.7
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://myminikube.info:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=myminikube.info
user-agent=curl/7.29.0
x-forwarded-for=10.32.0.1
x-forwarded-host=myminikube.info
x-forwarded-port=80
x-forwarded-proto=http
x-original-uri=/
x-real-ip=10.32.0.1
x-request-id=b2fb3ee219507bfa12472c7d481d4b72
x-scheme=http
BODY:

让 ingress 在类似熊金属的环境中工作是一段漫长的旅程。因此,我将包含对我有帮助的相关链接。

【讨论】:

  • 我已经设法通过更新svc-ingress-nginx-lb.yaml 使其工作。但是主机网络中的机器只能访问EXTERNAL-IP 之一。你介意解释一下它是如何工作的吗?
  • 忘了说我没有为ingress设置hostname,所以直接通过EXTERNAL-IP 访问。
【解决方案2】:

检查您的集群中是否有入口控制器:

$ kubectl get po --all-namespaces

您应该会看到如下内容:

kube-system nginx-ingress-controller-gwts0   1/1  Running   0    18d

只能在 Ingress 所在的命名空间内创建 Ingress 来寻址服务。 出于安全原因,未实现跨命名空间入口。

【讨论】:

  • 谢谢。这就是问题所在(这里是 Ingress noob)。我使用以下步骤 (github.com/kubernetes/ingress-nginx/tree/master/deploy) 部署了 Ingress 控制器。我只有一个问题。 Ingress 控制器和我想要由 Ingress 控制器控制的应用程序是否必须在同一个名称空间中?
  • 我在答案中添加了对您问题的回复。
【解决方案3】:

您的集群似乎缺少 Ingress 控制器。

一般来说,Ingress 控制器的工作方式如下: 1.在集群中搜索某类对象(ingress,"nginx") 2. 解析该对象并为特定的入口 pod 创建配置部分。 3. 更新该 pod 对象(使用更新的配置重新启动它)

该特定 pod 负责处理从传入端口(通常是节点上的几个专用端口)到集群中配置的流量目标的流量。

您可以从两个受支持和维护的控制器中进行选择 - NginxGCE

入口控制器由您在安装过程中创建的几个组件组成。 这是来自Nginx Ingress 文档的安装部分:

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml              | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml        | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml              | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml | kubectl apply -f -

如果您在集群中配置了RBAC 授权:

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml      | kubectl apply -f -
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml | kubectl apply -f -

如果没有配置 RBAC:

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/without-rbac.yaml | kubectl apply -f -

如果您从头开始创建集群:

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml | kubectl apply -f -

验证您的安装:

kubectl get pods --all-namespaces -l app=ingress-nginx --watch

您应该会看到如下内容:

NAMESPACE       NAME                                       READY     STATUS    RESTARTS   AGE
ingress-nginx   nginx-ingress-controller-699cdf846-nj2rw   1/1       Running   0          1h

检查可用服务及其参数:

kubectl get services --all-namespaces

如果您使用自定义服务提供商部署(minikube、AWS、Azure、GKE),请关注Nginx Ingress documentation 了解安装详情。

Ingress 详情请见官方Kubernetes Ingress documentation

【讨论】:

  • 谢谢。这正是我现在所做的,并且在 ingress-nginx 命名空间中有一个 Ingress 控制器。但是我将我的应用程序及其服务部署在不同的命名空间中。原来我不能那样做。所以我现在在命名空间 ingress-nginx 中重新部署它的服务和 Pod,看看它是怎么回事。
  • 您不必将所有服务都放在 ingress-controller 命名空间中。您只需要让 Ingress 对象与提到的 Service 在同一个命名空间中。 Ingress 对象可以在任何命名空间中,ingress-controller 有权从任何命名空间读取该类型的对象。
【解决方案4】:

我在更高版本的 k8s (> 1.18) 上使用 microk8s 默认的 nginx 入口控制器,我注意到这个特定的注释给我带来了一个问题:

kubernetes.io/ingress.class: "nginx"

它存在于许多较旧的文档和示例中,但显然已被弃用(请参阅https://kubernetes.io/docs/concepts/services-networking/ingress/),我还使用较新的注释定义了“public”的 ingressClassName。我不确定是否是两者之间的冲突导致了问题,但是一旦我删除了已弃用的注释,我的地址就会出现。

【讨论】:

    【解决方案5】:
    1. 为了使用您的入口资源(fanout-nginx-ingress),您需要首先部署默认情况下不在本地 kubernetes 集群中的入口控制器。您需要自己部署。
    2. 有很多解决方案,您可以使用其中任何一个,但 nginx 入口控制器很好。
    3. 有关详细信息,您可以在此处参考 Mumshad Mannambeth 的精彩视频: https://www.youtube.com/watch?v=GhZi4DxaxxE

    【讨论】:

    • 总结视频中的内容比指向某天可能无法播放的视频要好。
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2019-01-14
    • 2010-09-28
    • 2010-12-26
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多