k8s--Ingress 介绍、ingress-nginx(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: k8s--Ingress 介绍、ingress-nginx

定义 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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 应用服务中间件 nginx
百度搜索:蓝易云【使用Kubernetes部署Nginx应用教程】
现在,你已经成功在Kubernetes集群上部署了Nginx应用。通过访问Service的外部IP地址,你可以访问Nginx服务。
67 4
|
13天前
|
缓存 Kubernetes 应用服务中间件
使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟
使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟
13 3
|
1月前
|
Kubernetes Java 应用服务中间件
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
23 0
|
3月前
|
Kubernetes 搜索推荐 应用服务中间件
通过keepalived+nginx实现 k8s apiserver节点高可用
通过keepalived+nginx实现 k8s apiserver节点高可用
202 17
|
3月前
|
Kubernetes 应用服务中间件 网络安全
kubernetes中Ingress Nginx 常用规则使用
kubernetes中Ingress Nginx 常用规则使用
51 0
|
3月前
|
Kubernetes 应用服务中间件 nginx
K8S Pod Sidecar 应用场景之一 - 加入 NGINX Sidecar 做反代和 web 服务器
K8S Pod Sidecar 应用场景之一 - 加入 NGINX Sidecar 做反代和 web 服务器
|
3月前
|
Kubernetes Cloud Native Java
云原生|kubernetes|ingress-nginx插件部署(kubernetes-1.23和最新版controller-1.6.4)
云原生|kubernetes|ingress-nginx插件部署(kubernetes-1.23和最新版controller-1.6.4)
808 0
|
3月前
|
Kubernetes 容器
Kubernetes—安装2022新版ingress-nginx步骤
Kubernetes—安装2022新版ingress-nginx步骤
180 0
|
3月前
|
Kubernetes Cloud Native 开发工具
云原生|kubernetes|helm3 自定义离线安装部署ingress-nginx
云原生|kubernetes|helm3 自定义离线安装部署ingress-nginx
351 0
|
3月前
|
弹性计算 应用服务中间件 文件存储
容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站
本文介绍如何在半小时内,通过阿里云容器ACK服务和CNFS容器网络文件系统服务搭建一个简单的弹性、高可用NGINX网站。在完成本文的所有操作后,您将获得一个单网页的网站,用户的请求将会被打散到多个容器节点上,并且根据业务负载自动扩缩容,即使某个容器节点宕机也不会影响用户访问。另外您还可以将本地编辑的网页快速更新到网站上。
145 0
容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站