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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
2月前
|
Kubernetes 监控 测试技术
k8s学习--基于Ingress-nginx实现灰度发布系统
k8s学习--基于Ingress-nginx实现灰度发布系统
125 2
k8s学习--基于Ingress-nginx实现灰度发布系统
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
353 0
|
2月前
|
Kubernetes 应用服务中间件 nginx
k8s基础使用--使用k8s部署nginx服务
本文介绍了Kubernetes中核心概念Deployment、Pod与Service的基本原理及应用。Pod作为最小调度单元,用于管理容器及其共享资源;Deployment则负责控制Pod副本数量,确保其符合预期状态;Service通过标签选择器实现Pod服务的负载均衡与暴露。此外,还提供了具体操作步骤,如通过`kubectl`命令创建Deployment和Service,以及如何验证其功能。实验环境包括一台master节点和两台worker节点,均已部署k8s-1.27。
215 1
|
4月前
|
缓存 Kubernetes 应用服务中间件
使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟
使用Kubernetes中的Nginx来改善第三方服务的可靠性和延迟
36 3
|
5月前
|
Kubernetes Java 应用服务中间件
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
95 0
|
7月前
|
Kubernetes 搜索推荐 应用服务中间件
通过keepalived+nginx实现 k8s apiserver节点高可用
通过keepalived+nginx实现 k8s apiserver节点高可用
454 17
|
7月前
|
弹性计算 应用服务中间件 文件存储
容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站
本文介绍如何在半小时内,通过阿里云容器ACK服务和CNFS容器网络文件系统服务搭建一个简单的弹性、高可用NGINX网站。在完成本文的所有操作后,您将获得一个单网页的网站,用户的请求将会被打散到多个容器节点上,并且根据业务负载自动扩缩容,即使某个容器节点宕机也不会影响用户访问。另外您还可以将本地编辑的网页快速更新到网站上。
218 0
容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站
|
1月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
79 7
|
2月前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解