定义 Ingress 规则(编写 ingress 的 yaml 文件)
创建一个 ingress-demo.yaml 文件,代码如下
apiVersion: extensions/v1beta1 kind: Ingress # 类型为 Ingress metadata: name: test-ingress namespace: zouzou # ns 为 zouzou annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: www.test01.com # 这里写你的域名 http: paths: - path: / # 访问 / 路径时转发给 httpd-svc 的 service,端口为 80 backend: serviceName: httpd-svc # svc 的名称 servicePort: 80 # svc 的端口 - path: /tomcat backend: serviceName: tomcat-svc # 访问 /tomcat 路径时转发给 tomcat-svc 的 service,端口为 8080 servicePort: 8080
执行 ingress 规则的 yaml文件
kubectl apply -f ingress-demo.yaml
查看 ingress 规则资源对象
# 查看 ingresses [root@dce-10-6-215-215 ingress-controller]# kubectl get ingresses -n zouzou NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress <none> www.test01.com 80 31m
至此已经实现了我们想要的功能,现在就可以通过 www.test01.com 来访问到我们后端 httpd 容器提供的服务,通过 www.test01.com/tomcat 来访问我们后端 tomcat 提供的服务
在访问之前,需要配置 dns 解析,修改你的 hosts 文件,将 www.test01.com 加进去
liufujia@zou ~ % sudo vim /etc/hosts 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 127.0.0.1 kubernetes.docker.internal 10.6.215.200 www.test01.com # 对应你的服务器地址
注意,上面的 10.6.215.200 为你 Ingress-nginx 容器所在的节点 IP
# 可以看到 ingress-nginx 的 pod 是在 node 为 dce-10-6-215-200 的节点上,这个节点的 ip 就是 10.6.215.200 [root@dce-10-6-215-215 ingress-controller]# kubectl get pod -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ingress-controller-5fc65f5fd7-tcskb 1/1 Running 0 39m 10.6.215.200 dce-10-6-215-200 <none> <none>
然后我们去访问两个地址
为 Ingress 规则创建一个 service
在上面的访问测试中,虽然访问到了对应的服务,但是有一个弊端,就是在做 DNS 解析的时候,只能指定 Ingress-nginx 容器所在的节点 IP。而指定 k8s 集群内部的其他节点 IP(包括master)都是不可以访问到的,如果这个节点一旦宕机,Ingress-nginx 容器被转移到其他节点上运行(不考虑节点标签的问题)。随之还要我们手动去更改 DNS 解析的 IP(要更改为Ingress-nginx 容器所在节点的 IP,通过命令 “kubectl get pod -n ingress-nginx -o wide” 可以查看到其所在节点),很是麻烦。
有没有更简单的一种方法呢?答案是肯定的,就是我们为 Ingress-nginx 规则再创建一个类型为 nodePort 的 Service,这样,在配置 DNS 解析时,就可以使用 www.test01.com 绑定所有node 节点,包括 master 节点的 IP了,很是灵活。
在前面我们还下载了一个 service-nodeport.yaml 的文件,还没有用到,这里就可以用到了
# 查看内容,不需要修改 [root@dce-10-6-215-215 ingress-controller]# cat service-nodeport.yaml apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP - name: https port: 443 targetPort: 443 protocol: TCP selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx ---
执行 yaml 文件
[root@dce-10-6-215-215 ingress-controller]# kubectl apply -f service-nodeport.yaml service/ingress-nginx created
查看运行的 service
# 可以看到 service 分别将 80 和 443 端口映射到了节点的 31162 和 35493 端口(随机映射的,也可以修改 yaml 文件指定端口) [root@dce-10-6-215-215 ingress-controller]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 172.31.195.202 <none> 80:31162/TCP,443:35493/TCP 4m16s
然后我们将我们本地的 DNS 解析成 master 的 ip
liufujia@zou ~ % sudo vim /etc/hosts 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 127.0.0.1 kubernetes.docker.internal 10.6.215.215 www.test01.com # 对应你的 master 的地址
然后使用域名+端口去访问,这里我使用 http,端口就是 31162
基于虚拟主机的 Ingress 规则
如果现在是另一种需求,我需要将 www.test01.com 和 www.test02.com 都对应上我后端的 httpd 容器提供的服务,那么此时应该怎么配置?
修改 ingress-demo.yaml 文件规则,如下
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ingress namespace: zouzou annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: www.test02.com # 增加 www.test02.com 配置 http: paths: - path: / backend: serviceName: httpd-svc # 绑定和 www.test01 相同的service名称 servicePort: 80 - host: www.test01.com # 增加 www.test01.com 配置 http: paths: - path: / backend: serviceName: httpd-svc # 绑定和 www.test01 相同的service名称 servicePort: 80 - path: /tomcat backend: serviceName: tomcat-svc servicePort: 8080
从上面的 yaml 文件里我们可以得到下面信息
- 当访问 www.test02.com 时,只有一个根路由 /
- 当访问 www.test01.com 时,有两个路由,一个是 /,还有一个是 /tomcat
改完 yaml 后重新配置 ingress-demo.yaml 文件
[root@dce-10-6-215-215 ingress-controller]# kubectl apply -f ingress-demo.yaml ingress.extensions/test-ingress configured
在本地的 hosts 文件里添加上 www.test02.com 的映射关系
查看 svc 的地址
# 因为我删除过,重新改了,所以这里的 端口就不一样了 [root@dce-10-6-215-215 ingress-controller]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 172.31.116.17 <none> 80:38750/TCP,443:36490/TCP 23m
然后访问 www.test01.com
访问 www.test02.com
可以查看 ingress 的规则
[root@dce-10-6-215-215 ingress-controller]# kubectl describe ingresses No resources found in default namespace. [root@dce-10-6-215-215 ingress-controller]# kubectl describe ingresses -n zouzou Name: test-ingress Namespace: zouzou Address: 172.31.116.17 Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>) Rules: Host Path Backends ---- ---- -------- www.test02.com # www.test02.com 只有一个路由 / httpd-svc:80 (172.29.190.191:80,172.29.34.227:80,172.29.34.40:80) www.test01.com # www.test01.com 有两个路由 / httpd-svc:80 (172.29.190.191:80,172.29.34.227:80,172.29.34.40:80) /tomcat tomcat-svc:8080 (172.29.190.172:8080,172.29.35.135:8080,172.29.38.17:8080) Annotations: nginx.ingress.kubernetes.io/rewrite-target: / Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal UPDATE 45m nginx-ingress-controller Ingress zouzou/test-ingress Normal CREATE 29m nginx-ingress-controller Ingress zouzou/test-ingress Normal UPDATE 9m43s (x3 over 28m) nginx-ingress-controller Ingress zouzou/test-ingress