假如公司有一个Web服务的容器,需要为其添加一个域名,此时可以使用Ingress实现该功能。
1.创建一个用于学习 Ingress 的 Namespace
[root@k8s-master01 ingress-nginx]# kubectl create ns study-ingress
2.创建一个简单的 Nginx 模拟 Web 服务
[root@k8s-master01 ingress-nginx]# kubectl create deploy nginx --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 -n study-ingress
[root@k8s-master01 ingress-nginx]# kubectl get po -n study-ingress
NAME READY STATUS RESTARTS AGE
nginx-556dd4f789-jgghc 1/1 Running 0 33s
3.创建该Web容器的Service
[root@k8s-master01 ~]# kubectl expose deploy nginx --port 80 -n study-ingress
针对该服务进行访问测试,观察到服务正常
[root@k8s-master01 ingress-nginx]# kubectl get svc -n study-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.0.33.180 <none> 80/TCP 47s
[root@k8s-master01 ingress-nginx]# curl 10.0.33.180
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
4.创建 Ingress 指向上面创建的 Service
[root@k8s-master01 ~]# vim web-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: study-ingress
spec:
rules:
- host: nginx.test.com
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
上面参数说明:
(1)apiVersion: networking.k8s.io/v1: 指定使用的Kubernetes API版本,这里是Networking API的版本
(2)kind: Ingress: 表示这是一个Ingress资源对象
(3)metadata: 包含Ingress资源的元数据信息,包括名称和所属的命名空间。
name: nginx-ingress: Ingress资源的名称,这里命名为nginx-ingress。namespace: study-ingress: Ingress资源所属的命名空间,这里是study-ingress。
(4)spec: 指定了Ingress资源的规则和配置
(5)rules: 定义了Ingress资源的规则列表。每个规则指定了如何将请求路由到后端服务
- host: nginx.test.com: 这个规则适用于主机名为nginx.test.com的请求。http:: 表示这个规则适用于HTTP流量。paths:: 定义了路径规则列表,允许将特定路径的请求转发到后端Servicebackend: 路径规则的后端定义。指定了后端Service的信息。service:: 后端Service的名称为nginx。port:: Service的端口号为80。path: /: 定义了将匹配的请求转发到后端Service的路径。这里设置为根路径/,表示所有请求都会匹配。pathType: ImplementationSpecific: 定义了路径类型,表示Kubernetes根据实现来选择路径类型。在这里设置为ImplementationSpecific,由Ingress控制器特定的实现来决定路径类型
如果k8s版本在1.19以下,apiVersion是networking.k8s.io/v1beta1,对应的配置如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
namespace: study-ingress
spec:
rules:
- host: nginx.test.com
http:
paths:
- backend:
servicename: nginx
serviceport: 80
path: /
pathType: ImplementationSpecific
5.创建该 Ingress
[root@k8s-master01 ~]# kubectl create -f web-ingress.yaml
6.查看创建的ingress和svc
[root@k8s-master01 ~]# kubectl get svc,ingress -n study-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx ClusterIP 10.0.33.180 <none> 80/TCP 2m9s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/nginx-ingress nginx nginx.test.com 80 10s
我们也可以进入容器查看配置,观察到配置已生效
[root@k8s-master01 ~]# kubectl get po -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-gp6n9 1/1 Running 0 43m
[root@k8s-master01 ~]# kubectl exec -it ingress-nginx-controller-gp6n9 -n ingress-nginx -- bash
bash-5.1$ grep "nginx.test.com" nginx.conf
## start server nginx.test.com
server_name nginx.test.com ;
## end server nginx.test.com
bash-5.1$ exit
7.测试是否可以访问nginx.test.com,观察到可以正常访问
[root@k8s-master01 ~]# kubectl get po -n ingress-nginx -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-nginx-controller-gp6n9 1/1 Running 0 124m 192.168.1.35 k8s-node02 <none> <none>
[root@k8s-master01 ~]# curl -H "Host:nginx.test.com" 192.168.1.35
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
8.在windows主机上修改hosts文件,文件路径为:C:\Windows\System32\drivers\etc\hosts。修改完成后,打开浏览器,输入nginx.test.com即可打开nginx配置界面

如果不生效,可能DNS解析未缓存。可参考以下步骤:
按Win键+R,打开cmd视图,执行ipconfig /flushdns命令进行刷新 DNS 解析缓存
C:\Users\ASUS>ipconfig /flushdns
Windows IP 配置
已成功刷新 DNS 解析缓存。