圆咕噜咕噜 发表于 2024-9-19 06:10:30

Kubernetes Ingress

目录

[*]一、为什么须要 Ingress
[*]二、什么是Ingress,Ingress Controller
[*]三、Ingress 的工作原理
[*]四、Ingress 配置资源模版
[*]五、实例

[*]1、搭建 Ingress 情况

[*]1.1、Ingress-Nginx官网地点
[*]1.2、master 节点下载 deploy.yaml
[*]1.3、所有节点提前 pull 必须的镜像
[*]1.4、修改并应用 deploy.yaml 文件
[*]1.5、查看 ingress-nginx
[*]1.6、查看 service

[*]2、准备 service 和 pod

[*]2.1、创建 nginx 和 tomcat 的 Deployment
[*]2.2、创建并查看对应 svc,pod

[*]3、HTTP代理

[*]3.1、创建 ingress-http.yaml
[*]3.2、应用并查看
[*]3.3、本地电脑配置 hosts 解析
[*]3.4、通过域名+端口号查看

[*]4、HTTPS代理

[*]4.1、生成证书
[*]4.2、创建密钥
[*]4.3、创建ingress-https.yaml
[*]4.4、应用并查看
[*]4.5、通过 https://域名+端口号 访问



一、为什么须要 Ingress

我们利用传统的NodePort类型的Service的确能将集群内的服务袒露给集群外部客户端去访问,但是利用这种类型的Service存在以下问题:

[*]一个端口只能利用一个服务,所有通过NodePort袒露的端口都须要提前规划;
[*]如果集群上的Service的数量太多的话,袒露的NodePort端口不具有一连性。后期维护本钱太大,且不宜于管理;
[*]无论是Iptables大概是Ipvs模型的Service都配置在Linux内核中的Netfilter之上进行四层调度。是一种比较通用的调度器。支持调度HTTP、Mysql等应用层服务,不过,也正是工作于传输层从而使得它无法做到雷同卸载HTTPS中的SSL会话,也不支持基于URL的哀求调度机制,因为它工作在传输层。kubernetes也不支持为此类负载均衡配置任何类型的康健状态检测机制。
为相识决这种需求,提供了一种高级的流量管理,也就Ingress和Ingress Controller,kubernetes利用Ingress Controller来接收所有入口的流量,然后通过Ingress资源来定义流量如何区分,以及如何转发的规则。有了Ingress和Ingress控制器。我们就可以直接定义流量转发规则来发布服务,而无需创建许多的NodePort和LoadBalancer类型的Service。
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141819802-2137530861.png
二、什么是Ingress,Ingress Controller

Ingress 是 Kubernetes 中的一个 API 对象,用于定义集群内部服务的外部可访问性。简而言之,Ingress 是用来描述如何将外部哀求路由到集群内部的服务的规则聚集。Ingress 提供了一种定义 HTTP 路由规则的方式,使得外部客户端可以通过一个同一的入口点访问集群内部的服务。
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141819425-766344262.png
Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类 似于Nginx,可以理解成在Ingress里创建诸多映射规则,Ingress Controller通过监听这些配置规则并 转化成Nginx的反向代理配置 , 然后对外部提供服务。
在这里有两个核心概念:

[*]ingress:kubernetes中的一个对象,作用是定义哀求如何转发到service的规则
[*]ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现哀求转发,实现方式有许多,比如Nginx, Contour, Haproxy等等
三、Ingress 的工作原理

Ingress(以Nginx为例)的工作原理如下:

[*]用户编写Ingress规则,说明哪个域名对应kubernetes集群中的哪个Service
[*]Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置
[*]Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新
[*]到此为止,其实真正在工作的就是一个Nginx了,内部配置了用户定义的哀求转发规则
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141818980-1233938294.png
四、Ingress 配置资源模版

apiVersion: networking.k8s.io/v1   # 资源所属的API群组和版本
kind: Ingress   # 资源类型
metadata:   # 元数据
   name:<string>   # 资源名称
namespace: <string># 命名空间
spec:   
   ingressClassName: "nginx"   # 适用的Ingress控制器类别,须明确指明
   rules: <[]object>    # Ingress规则列表
   - host: <string>      # 虚拟主机的FQDN,俗称域名
   http: <object>
   paths: <[]object>      # 虚拟主机的PATH定义列表
   - path: <string>    # 匹配以什么开头类似于nginx中的location
pathType: <string>    # Prefix前缀匹配,不区分大小写 Exact。精确匹配URL,区分大小写
backend: <object>   # 后端
      service: <object>   #关联后端的Service
      name: <string>   # 后端Service的名称
port: <object>   #后端Service的端口
   name:      # 端口名称
number:   # 端口号
五、实例

1、搭建 Ingress 情况

1.1、Ingress-Nginx官网地点

#Ingress-Nginx 官网地址
https://kubernetes.github.io/ingress-nginx/

#Ingress-Nginx GitHub地址
https://github.com/kubernetes/ingress-nginx1.2、master 节点下载 deploy.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/baremetal/deploy.yamlhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141818545-2011750952.png
1.3、所有节点提前 pull 必须的镜像

docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresswebhook111

docker tag c41e9fcadf5a k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1

docker pull registry.cn-hangzhou.aliyuncs.com/eagleslab/service:ingresscontroller104

docker tag a9f76bcccfb5 k8s.gcr.io/ingress-nginx/controller:v1.0.41.4、修改并应用 deploy.yaml 文件

如果是提前pull的镜像,要删除掉deploy.yaml中对镜像sha256的查抄,在image标签中,删除 @sha256到行尾
sed -i 's/@sha256:.*//g' deploy.yaml

kubectl apply -f deploy.yamlhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141818110-890468203.png
1.5、查看 ingress-nginx

kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginxhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141817637-435714005.png
1.6、查看 service

kubectl get svc -n ingress-nginxhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141817251-914135224.png
2、准备 service 和 pod

https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141816888-2078804076.png
2.1、创建 nginx 和 tomcat 的 Deployment

apiVersion: v1
kind: Namespace
metadata:
name: dev

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: dev
spec:
replicas: 3
selector:
    matchLabels:
      app: nginx-pod
template:
    metadata:
      labels:
      app: nginx-pod
    spec:
      containers:
      - name: nginx
      image: nginx:1.17.1
      ports:
      - containerPort: 80

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
namespace: dev
spec:
replicas: 3
selector:
    matchLabels:
      app: tomcat-pod
template:
    metadata:
      labels:
      app: tomcat-pod
    spec:
      containers:
      - name: tomcat
      image: tomcat:8.5-jre10-slim
      ports:
      - containerPort: 8080

---

apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: dev
spec:
selector:
    app: nginx-pod
clusterIP: None
type: ClusterIP
ports:
- port: 80
    targetPort: 80

---

apiVersion: v1
kind: Service
metadata:
name: tomcat-service
namespace: dev
spec:
selector:
    app: tomcat-pod
clusterIP: None
type: ClusterIP
ports:
- port: 8080
    targetPort: 80802.2、创建并查看对应 svc,pod

kubectl apply -f tomcat-nginx.yaml

kubectl get pods,svc -n devhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141816474-2119770186.png
3、HTTP代理

3.1、创建 ingress-http.yaml

ingressClassName: nginx
利用 nginx 的 IngressClass(关联的 ingress-nginx 控制器)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
namespace: dev
spec:
rules:
- host: nginx.bbj1030.cn
    http:
      paths:
      - path: /
      pathType: Prefix
      backend:
          service:
            name: nginx-service
            port:
            number: 80
ingressClassName: nginx
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-tomcat
namespace: dev
spec:
rules:
- host: tomcat.bbj1030.cn
    http:
      paths:
      - path: /
      pathType: Prefix
      backend:
          service:
            name: tomcat-service
            port:
            number: 8080
ingressClassName: nginx3.2、应用并查看

kubectl get ing -n devhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141816012-491889789.png
kubectl describe ing -n devhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141815579-1416759563.png
3.3、本地电脑配置 hosts 解析

将以上 nginx.bbj1030.cn 和 tomcat.bbj1030.cn 解析到 master 节点 192.168.112.10上
192.168.112.10 nginx.bbj1030.cn
192.168.112.10 tomcat.bbj1030.cnhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141815110-446810781.png
3.4、通过域名+端口号查看

nginx.bbj1030.cn:32596

tomcat.bbj1030.cn:32596https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141814662-961124762.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141814247-467150424.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141813752-1679846520.png
4、HTTPS代理

4.1、生成证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=bbj1030.cn"4.2、创建密钥

kubectl create secret tls tls-secret --key tls.key --cert tls.crthttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141813267-987094263.png
4.3、创建ingress-https.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: https-nginx
namespace: dev
spec:
tls:
    - hosts:
      - nginx.bbj1030.cn
      secretName: tls-secret # 指定秘钥
rules:
- host: nginx.bbj1030.cn
    http:
      paths:
      - path: /
      pathType: Prefix
      backend:
          service:
            name: nginx-service
            port:
            number: 80
ingressClassName: nginx
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tomcat-https
namespace: dev
spec:
tls:
    - hosts:
      - tomcat.bbj1030.cn
      secretName: tls-secret # 指定秘钥
rules:
- host: tomcat.bbj1030.cn
    http:
      paths:
      - path: /
      pathType: Prefix
      backend:
          service:
            name: tomcat-service
            port:
            number: 8080
ingressClassName: nginx4.4、应用并查看

须要先删除之前创建的 ingress 否则会报错
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141812918-1274337809.png
kubectl delete -f ingress-http.yaml

kubectl apply -f ingress-https.yamlhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141812558-341073708.png
kubectl get ing -n dev

kubectl describe ing -n devhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141812064-1876270144.png
4.5、通过 https://域名+端口号 访问

https://nginx.bbj1030.cn:31563

https://tomcat.bbj1030.cn:31563https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141811465-1590608592.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240918141810663-827248063.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Kubernetes Ingress