获取Kubernetes入口端点/IP地址

获取Kubernetes入口端点/IP地址,kubernetes,kubernetes-ingress,Kubernetes,Kubernetes Ingress,我是Kubernetes Ingress的新手,正在设置2个不同的服务,每个服务都可以通过自己的路径访问 我创建了两个部署: Base OS : CentOS (1 master 2 minions) K8S version : 1.9.5 (deployed using KubeSpray) 我还创建了相应的服务: kubectl run nginx --image=nginx --port=80 kubectl run echoserver --image=gcr.io/google_co

我是Kubernetes Ingress的新手,正在设置2个不同的服务,每个服务都可以通过自己的路径访问

我创建了两个部署:

Base OS : CentOS (1 master 2 minions)
K8S version : 1.9.5 (deployed using KubeSpray)
我还创建了相应的服务:

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

kubectl expose deployment nginx --target-port=80 --type=NodePort
kubectl expose deployment echoserver --target-port=8080 --type=NodePort
现在最重要的是,我想部署一个入口,这样我就可以到达两个吊舱,而不是使用2个IP和2个不同的端口,而是使用1个具有不同路径的IP地址

因此,我的入口文件是:

http://172.16.16.2:31250 &
http://172.16.16.2:32018
这将产生:

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

我的配置中有什么遗漏吗

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

http://172.16.16.2/echo
http://172.16.16.2/nginx
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 -
您应该看到如下内容:

$ kubectl get po --all-namespaces
kubectl get pods --all-namespaces -l app=ingress-nginx --watch
只能在入口所在的命名空间内创建入口来寻址服务。
出于安全原因,未实现跨命名空间入口。

您的群集似乎缺少入口控制器

一般来说,入口控制器的工作原理如下: 1.在集群中搜索特定类型的对象(入口,“nginx”) 2.解析该对象并为特定入口吊舱创建配置部分。 3.更新pod对象(使用更新的配置重新启动)

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

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

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

kube-system nginx-ingress-controller-gwts0   1/1  Running   0    18d
如果在群集中配置了授权:

http://172.16.16.2/echo
http://172.16.16.2/nginx
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 -
如果您从头开始创建集群:

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 po --all-namespaces
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
如果您正在使用自定义服务提供商部署(minikube、AWS、Azure、GKE),请按照以下步骤了解安装详细信息


有关Ingress的详细信息,请参阅official。

我的裸机安装也遇到了相同的问题,或者更确切地说是类似的问题(kubernetes虚拟集群—通过仅主机适配器连接的一组虚拟机)。这里是我的链接

首先,确保已安装入口控制器。目前有两个入口控制器值得尝试,我安装了第一个

装置 转到并执行第一步

kubectl get services --all-namespaces
接下来获取集群节点的IP地址

# prerequisite-generic-deployment-command
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
验证 检查是否创建了
ingress nginx
服务

$ 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
$ 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入口控制器
部署

$ 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
$ 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入口
pod是否正在运行

$ kubectl get deploy -n ingress-nginx
NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-ingress-controller   1         1         1            1           73m
最后,检查入口控制器版本别忘了更改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
测试 通过执行本文中的步骤来测试入口控制器是否正常工作-当然,您将省略
minikube
部分

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

$ 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
-------------------------------------------------------------------------------
还有看起来像这样的豆荚

$ 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
最后,测试对
myminikube.info
的请求通过入口负载平衡器传播

$ 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
这是一个漫长的旅程,使安格尔工作在熊金属般的环境。因此,我将包括相关的链接,帮助我沿着

  • 为了使用入口资源(fanout nginx ingress),您需要首先部署入口控制器,默认情况下,入口控制器不在本地kubernetes群集中。您需要自己部署它
  • 有很多解决方案,您可以使用其中的任何一个,但nginx入口控制器很好
  • 有关详细信息,您可以参考Mumshad Mannambeth关于ingress的精彩视频:

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

    $ 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:
    

    它出现在许多较旧的文档和示例中,但它显然已被弃用(请参阅),我还使用较新的注释定义了“public”的ingressClassName。我不确定是不是两者之间的冲突导致了问题,但一旦我删除了不推荐的注释,我的地址就会出现。

    我是kubernetes noob,所以对此持保留态度。我注意到入口缺少“地址”。这可能是问题所在吗?你是对的。它不见了。你是如何修复丢失的地址的。我也有同样的问题。控制器和应用程序位于同一名称APCE。。我不能接近他们,谢谢。这就是问题所在(这里是Ingress noob)。我使用以下步骤部署了入口控制器()。我只有一个问题。Ingress controller和我希望由Ingress controller控制的应用程序是否必须位于同一名称空间?我在回答中添加了对您问题的答复。谢谢。这正是我现在所做的,在
    ingresnginx
    名称空间中有一个入口控制器。但我在另一个命名空间中部署了我的应用程序及其服务。事实证明我做不到。因此,我现在将在名称空间
    ingress nginx
    中重新部署其服务和POD,看看它是如何运行的。您不必将所有服务都放在ingress controller名称空间中。您只需要让Ingress对象与所提到的服务位于同一命名空间中。Ingress对象可以位于任何名称空间中,Ingress controller有权从任何名称空间读取此类对象。我已通过更新
    svc-Ingress-nginx-lb.yaml
    使其正常工作。但是,主机网络中的计算机只能访问
    外部IP
    中的一个。你介意解释一下它是如何工作的吗?忘了提到我没有为入口设置主机名,所以它是通过
    EXTERNAL-IP
    直接访问的。与其指向某一天可能不可用的视频,不如总结视频中的内容。