假如公司有一个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:: 定义了路径规则列表,允许将特定路径的请求转发到后端Service
  • backend: 路径规则的后端定义。指定了后端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配置界面

Ingress Nginx 入门使用-1

如果不生效,可能DNS解析未缓存。可参考以下步骤:

按Win键+R,打开cmd视图,执行ipconfig /flushdns命令进行刷新 DNS 解析缓存

C:\Users\ASUS>ipconfig /flushdns

Windows IP 配置

已成功刷新 DNS 解析缓存。