获取 Kubernetes Ingress endpoint/IP 地址
Getting an Kubernetes Ingress endpoint/IP address
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
,我可以使用
访问这两个 pods
http://172.16.16.2:31250 &
http://172.16.16.2:32018
现在最重要的是,我想部署一个 Ingress,这样我就可以到达 pods 不使用 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) 访问 Pods 时,我什么也得不到。
http://172.16.16.2/echo
http://172.16.16.2/nginx
我的配置中是否遗漏了什么?
检查您的集群中是否有入口控制器:
$ kubectl get po --all-namespaces
您应该会看到如下内容:
kube-system nginx-ingress-controller-gwts0 1/1 Running 0 18d
只能创建入口以在入口所在的命名空间内寻址服务。
出于安全原因,未实现跨命名空间入口。
您的集群似乎缺少 Ingress 控制器。
一般来说,Ingress控制器的工作原理如下:
1.在集群中搜索某类对象(ingress,"nginx")
2. 解析该对象并为特定入口 pod 创建配置部分。
3. 更新那个 pod 对象(用更新后的配置重启它)
该特定 pod 负责处理从传入端口(通常是节点上的几个专用端口)到集群中配置的流量目的地的流量。
您可以从两个受支持和维护的控制器中进行选择 - Nginx and GCE
入口控制器由您在安装过程中创建的几个组件组成。
这是 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。
我在我的裸机安装上遇到了同样的问题 - 或者更接近于那个问题(kubernetes 虚拟集群 - 通过 Host-Only-Adapter 连接的一组虚拟机)。这是 link 我的 kubernetes vlab.
首先确保您安装了入口控制器。目前有两个入口控制器值得尝试 kubernetes nginx ingress controller and nginx 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
此外,包装 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
最后,检查入口控制器版本。 别忘了更改广告连播名称!
$ 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
pods 看起来像这样。
$ 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 像 environment.Thus 一样在 bear metal 上工作是一段漫长的旅程,我将包括相关的 link 对我有所帮助。
- 为了使用入口资源 (fanout-nginx-ingress),您需要首先部署入口控制器,默认情况下它不在您的本地 kubernetes 集群中。需要自己部署。
- 有很多解决方案,您可以使用其中任何一个,但 nginx ingress controller 没问题。
- 有关详细信息,您可以在此处参考 Mumshad Manambeth 关于 ingress 的精彩视频:
https://www.youtube.com/watch?v=GhZi4DxaxxE
我在更高版本的 k8s(> 1.18)上使用 microk8s 默认的 nginx 入口控制器,我注意到这个特定的注释给我带来了问题:
kubernetes.io/ingress.class: "nginx"
它出现在许多旧文档和示例中,但显然已弃用(请参阅 https://kubernetes.io/docs/concepts/services-networking/ingress/),我还使用较新的注释定义了“public”的 ingressClassName。我不确定是否是两者之间的冲突导致了这个问题,但是一旦我删除了已弃用的注释,我的地址就出现了。
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
,我可以使用
http://172.16.16.2:31250 &
http://172.16.16.2:32018
现在最重要的是,我想部署一个 Ingress,这样我就可以到达 pods 不使用 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) 访问 Pods 时,我什么也得不到。
http://172.16.16.2/echo
http://172.16.16.2/nginx
我的配置中是否遗漏了什么?
检查您的集群中是否有入口控制器:
$ kubectl get po --all-namespaces
您应该会看到如下内容:
kube-system nginx-ingress-controller-gwts0 1/1 Running 0 18d
只能创建入口以在入口所在的命名空间内寻址服务。 出于安全原因,未实现跨命名空间入口。
您的集群似乎缺少 Ingress 控制器。
一般来说,Ingress控制器的工作原理如下: 1.在集群中搜索某类对象(ingress,"nginx") 2. 解析该对象并为特定入口 pod 创建配置部分。 3. 更新那个 pod 对象(用更新后的配置重启它)
该特定 pod 负责处理从传入端口(通常是节点上的几个专用端口)到集群中配置的流量目的地的流量。
您可以从两个受支持和维护的控制器中进行选择 - Nginx and GCE
入口控制器由您在安装过程中创建的几个组件组成。 这是 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。
我在我的裸机安装上遇到了同样的问题 - 或者更接近于那个问题(kubernetes 虚拟集群 - 通过 Host-Only-Adapter 连接的一组虚拟机)。这是 link 我的 kubernetes vlab.
首先确保您安装了入口控制器。目前有两个入口控制器值得尝试 kubernetes nginx ingress controller and nginx 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
此外,包装 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
最后,检查入口控制器版本。 别忘了更改广告连播名称!
$ 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
pods 看起来像这样。
$ 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 像 environment.Thus 一样在 bear metal 上工作是一段漫长的旅程,我将包括相关的 link 对我有所帮助。
- 为了使用入口资源 (fanout-nginx-ingress),您需要首先部署入口控制器,默认情况下它不在您的本地 kubernetes 集群中。需要自己部署。
- 有很多解决方案,您可以使用其中任何一个,但 nginx ingress controller 没问题。
- 有关详细信息,您可以在此处参考 Mumshad Manambeth 关于 ingress 的精彩视频: https://www.youtube.com/watch?v=GhZi4DxaxxE
我在更高版本的 k8s(> 1.18)上使用 microk8s 默认的 nginx 入口控制器,我注意到这个特定的注释给我带来了问题:
kubernetes.io/ingress.class: "nginx"
它出现在许多旧文档和示例中,但显然已弃用(请参阅 https://kubernetes.io/docs/concepts/services-networking/ingress/),我还使用较新的注释定义了“public”的 ingressClassName。我不确定是否是两者之间的冲突导致了这个问题,但是一旦我删除了已弃用的注释,我的地址就出现了。