我尝试在kubernetes集群上配置入口。我按照documentation安装入口控制器并运行了以下命令
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
在运行default-http-backend和nginx-ingress-controller之后:
ingress-nginx default-http-backend-846b65fb5f-6kwvp 1/1 Running 0 23h 192.168.2.28 node1
ingress-nginx nginx-ingress-controller-d658896cd-6m76j 1/1 Running 0 6m 192.168.2.31 node1
我尝试测试入口,并部署了以下服务:
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver-deploy
spec:
replicas: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: my-echo
image: gcr.io/google_containers/echoserver:1.8
---
apiVersion: v1
kind: Service
metadata:
name: echoserver-svc
spec:
selector:
app: echo
ports:
- protocol: TCP
port: 8080
targetPort: 8080
以及以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: happy-ingress
annotations:
INGRESS.kubernetes.io/rewrite-target: /
spec:
rules:
- host: happy.k8s.io
http:
paths:
- path: /echoserver
backend:
serviceName: echoserver-svc
servicePort: 8080
当我运行命令“ kubectl get ing”时,我收到了:
NAME HOSTS ADDRESS PORTS AGE
happy-ingress happy.k8s.io 80 14m
我没有解决ADDRESS,也无法弄清楚问题出在哪里,因为所有Pod都在运行。您能给我提示一下这个问题是什么吗?
谢谢
答案 0 :(得分:3)
我不知道这是否有帮助,但是我有同样的问题。 我没有安装入口控制器,也没有安装有人在Github上说的东西, 我刚刚创建了一个Ingress,以便能够将我的子域指向其他服务,但起初我的Ingress没有IP地址(该地址为空)。
NAME HOSTS ADDRESS PORTS AGE
ingress delivereo.tk,back.delivereo.tk 80 39s
我认为这是因为我为前端应用程序和后端api提供的2个服务都具有LoadBalancer类型。 我将其更改为NodePort,因为入口控制器将管理URL转到何处,因此它们不需要外部ip。
当我确实将服务类型更改为NodePort时,在2或3分钟后,就会出现Ingress的IP地址。 当我将Cloudflare DNS指向新的Ingress IP时,我测试了我的子域,它起作用了!
之前
apiVersion: v1
kind: Service
metadata:
name: delivereotk
spec:
ports:
- port: 80
selector:
app: delivereotk
type: LoadBalancer
之后
apiVersion: v1
kind: Service
metadata:
name: delivereotk
spec:
ports:
- port: 80
selector:
app: delivereotk
type: NodePort
入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: delivereo.tk
http:
paths:
- backend:
serviceName: delivereotk
servicePort: 80
- host: back.delivereo.tk
http:
paths:
- backend:
serviceName: backdelivereotk
servicePort: 80
答案 1 :(得分:3)
在创建入口规则之前,您必须通过以下命令启用ingress addons
。您还可以在执行任何其他命令之前启用它
$ minikube addons enable ingress
ingress was successfully enabled
等待,直到吊舱启动并运行。您可以通过执行以下命令来检查并等待类似的输出
kubectl get pods -n kube-system | grep nginx-ingress-controller
nginx-ingress-controller-5984b97644-jjng2 1/1 Running 2 1h
对于Deployment
,您必须指定containerPort
;对于Service
,您必须指定http
协议。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: echoserver-deploy
spec:
replicas: 2
selector:
matchLabels:
app: my-echo
template:
metadata:
labels:
app: my-echo
spec:
containers:
- name: my-echo
image: gcr.io/kubernetes-e2e-test-images/echoserver:2.1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echoserver-svc
spec:
selector:
app: my-echo
ports:
- protocol: TCP
port: 80
targetPort: 8080
name: http
对于进入规则,将端口servicePort
从默认的http端口8080更改为80。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: happy-ingress
annotations:
INGRESS.kubernetes.io/rewrite-target: /
spec:
rules:
- host: happy.k8s.io
http:
paths:
- path: /echoserver
backend:
serviceName: echoserver-svc
servicePort: 80
现在应用这些文件并创建您的pod,服务和入口规则。请稍等片刻,这将花费一些时间来获取您的入口规则的地址。
现在,您可以使用minikube ip
地址访问您的服务,但不能按主机名访问。为此,您必须在/etc/hosts
文件中添加主机和相应的IP地址。因此,请在您喜欢的编辑器中打开/etc/hosts
文件,并在以下行中添加您的minikube的实际IP地址
<minikube_ip> happy.k8s.io
现在,您可以使用主机名访问服务。验证是否遵循命令
curl http://happy.k8s.io/echoserver
答案 2 :(得分:2)
您的hostname happy.k8s.io
应该解析为nginx-ingress-controller的实际IP地址,该地址指向负载均衡器的前面。
您可以检查集群在哪个IP下工作:
bash-3.2$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.100:8443
KubeDNS is running at https://192.168.1.100:8443/api/v1/namespaces/kube-
system/services/kube-dns:dns/proxy
使用curl
bash-3.2$ curl http://192.168.1.100:8080
default backend - 404
最后,您应该将域条目添加到/etc/hosts
中:
192.168.1.100 happy.k8s.io
答案 3 :(得分:1)
官方document说:
因为NodePort Services没有获得由分配的LoadBalancerIP 定义,NGINX Ingress控制器不会更新状态 它管理的入口对象
您已按照安装指南中的说明部署了NGINX Ingress控制器,因此您的地址为空是正常的!
相反,外部客户端必须将分配给ingress-nginx服务的NodePort附加到HTTP请求。
ps。这个问题不是关于minikube
答案 4 :(得分:0)
我有一个类似的案例。我们编写的入口只是入口规则。为了使地址可用,我们还需要运行入口控制器容器。
只需检查控制器盒是否正在运行
kubectl get pods
您应该按照图中所示的方式运行控制器容器。如果没有,您可以使用头盔进行安装。
如果您使用的是helm2,只需使用以下命令:
helm install stable/nginx-ingress --name my-nginx
按照此文档了解不同的安装方式。 https://kubernetes.github.io/ingress-nginx/deploy/
在安装头盔时,如果未安装耕till机,则可能会遇到以下问题。
Error: could not find tiller
要对其进行修复,请按照以下说明安装分till:
kubectl -n kube-system create serviceaccount tiller
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller
要验证分till是否正常工作
kubectl get pods --namespace kube-system
答案 5 :(得分:0)
我遇到了类似的问题,意识到我需要:
启用NGINX Ingress控制器,运行以下命令:
minikube addons enable ingress
验证NGINX Ingress控制器正在运行
kubectl get pods -n kube-system
期望nginx-ingress-controller吊舱处于运行状态。
答案 6 :(得分:0)
我在GKE(Google Kubernetes Engine)上遇到了相同的问题。事实证明,入口设置存在问题,我为所需的服务使用了不正确的名称。您应该通过执行以下命令检查错误:
kubectl describe ingress <your-ingress-name>
答案 7 :(得分:0)
您正在寻找的是一种测试入口资源的方法。
您可以这样做: