当前位置: 首页 > news >正文

Ingress详解

Ingress

Service对集群外暴露端口两种方式,这两种方式都有一定的缺点:

  • NodePort :会占用集群集群端口,当集群服务变多时,缺点明显
  • LoadBalancer:每个Service都需要一个LB,并且需要k8s之外设备支持

基于现状,k8s提供了Ingress资源对象,Ingresss只需要一个NodePort或一个LB就能满足多个Service的需求。

在这里插入图片描述

可以在Ingress建立规则,Ingress Controller通过监听这些配置规则并转化成Nignx反向代理配置,对外提供服务。

核心概念:

  • ingress:k8s对象,作用定义请求如何转发service规则
  • ingress controller:具体实现反向代理及负载均衡的程序,对ingress汇总进行解析,根据规则实现请求转发

工作原理:

  • 编写Ingress规则,说明域名对应k8s集群中那个Service
  • Ingress控制器动态感知Ingress服务规则变化,然后生成一段对应Nginx反向代理配置
  • Ingress控制器将生成Nginx配置写入运行的Nginx服务中,并动态更新

在这里插入图片描述

环境准备

搭建Ingress环境

#创建文件夹
[root@master ~]# mkdir ingress-controller
[root@master ~]# cd ingress-controller/
#获取资源 (需要科学上网)也可以github直接下载再上传上去
[root@master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
[root@master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml[root@master ingress-controller]# ls
mandatory.yaml  service-nodeport.yaml
# 修改mandatory.yaml文件中的仓库
# 修改quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
# 为quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0#创建ingress-nginx
[root@master ingress-controller]# kubectl apply -f ./
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx created
service/ingress-nginx created#查看Pod
[root@master ingress-controller]# kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-7f74f657bd-rjpgn   1/1     Running   0          81s
#查看Service
[root@master ingress-controller]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.109.45.51   <none>        80:30291/TCP,443:30946/TCP   2m15s

在这里插入图片描述

准备Service和Pod

创建tomcat-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80---apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: tomcat-podtemplate:metadata:labels:app: tomcat-podspec:containers:- name: tomcatimage: tomcat:8.5-jre10-slimports:- containerPort: 8080---apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: dev
spec:selector:app: nginx-podclusterIP: Nonetype: ClusterIPports:- port: 80targetPort: 80---apiVersion: v1
kind: Service
metadata:name: tomcat-servicenamespace: dev
spec:selector:app: tomcat-podclusterIP: Nonetype: ClusterIPports:- port: 8080targetPort: 8080
#创建名称空间
[root@master tmp]# kubectl create ns dev
namespace/dev created
[root@master tmp]# vim tomcat-nginx.yaml
#创建svc和pod
[root@master tmp]#  kubectl create -f tomcat-nginx.yaml
deployment.apps/nginx-deployment created
deployment.apps/tomcat-deployment created
service/nginx-service created
service/tomcat-service created
[root@master tmp]# kubectl get svc -n dev
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
nginx-service    ClusterIP   None         <none>        80/TCP     8s
tomcat-service   ClusterIP   None         <none>        8080/TCP   8s

HTTP代理

创建ingress-http.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ingress-httpnamespace: dev
spec:rules:- host: nginx.rkun18.comhttp:paths:- path: /backend:serviceName: nginx-serviceservicePort: 80 - host: tomcat.rkun18.comhttp:paths:- path: /backend:serviceName: tomcat-serviceservicePort: 8080

配置两个对应的规则

[root@master tmp]# vim ingress-http.yaml
[root@master tmp]# kubectl create -f ingress-http.yaml
ingress.extensions/ingress-http created
[root@master tmp]# kubectl get ing -n dev
NAME           HOSTS                                ADDRESS   PORTS   AGE
ingress-http   nginx.rkun18.com,tomcat.rkun18.com             80      9s[root@master tmp]# kubectl describe ing ingress-http  -n dev
Name:             ingress-http
Namespace:        dev
Address:          10.109.45.51
Default backend:  default-http-backend:80 (<none>)
Rules:Host               Path  Backends----               ----  --------nginx.rkun18.com/   nginx-service:80 (10.244.1.10:80,10.244.1.9:80,10.244.2.6:80)tomcat.rkun18.com/   tomcat-service:8080 (10.244.1.11:8080,10.244.2.7:8080,10.244.2.8:8080)
Annotations:
Events:Type    Reason  Age   From                      Message----    ------  ----  ----                      -------Normal  CREATE  59s   nginx-ingress-controller  Ingress dev/ingress-httpNormal  UPDATE  0s    nginx-ingress-controller  Ingress dev/ingress-http

由于无法解析地址,仅作测试使用,我们需要更改主机hosts文件:

在这里插入图片描述

将你的master主机IP和你设置的域名进行绑定

你的master节点IP nginx.rkun18.com
你的master节点IP tomcat.rkun18.com
#查看ingress对外暴露的端口
[root@master tmp]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.109.45.51   <none>        80:30291/TCP,443:30946/TCP   28m

HTTPS代理

创建证书

[root@master ~]# 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=rkun18.com"
Generating a 2048 bit RSA private key
.............+++
.............................................................................+++
writing new private key to 'tls.key'
-----
#创建密钥
[root@master ~]# kubectl create secret tls tls-secret --key tls.key --cert tls.crt
secret/tls-secret created
[root@master ~]#

创建ingress-https.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ingress-httpsnamespace: dev
spec:tls:- hosts:- nginx.rkun18.com- tomcat.rkun18.comsecretName: tls-secret # 指定秘钥rules:- host: nginx.rkun18.comhttp:paths:- path: /backend:serviceName: nginx-serviceservicePort: 80- host: tomcat.rkun18.comhttp:paths:- path: /backend:serviceName: tomcat-serviceservicePort: 8080
[root@master tmp]# kubectl create -f ingress-https.yaml
ingress.extensions/ingress-https created
[root@master tmp]# kubectl get ing ingress-https -n dev
NAME            HOSTS                                ADDRESS        PORTS     AGE
ingress-https   nginx.rkun18.com,tomcat.rkun18.com   10.109.45.51   80, 443   23s

访问第二个端口30946

[root@master tmp]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.109.45.51   <none>        80:30291/TCP,443:30946/TCP   110m
http://www.lryc.cn/news/92211.html

相关文章:

  • 【递归算法的Java实现及其应用】
  • 2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)
  • 如何用PHP获取各大电商平台的数据
  • 一站式完成车牌识别任务:从模型优化到端侧部署
  • Linux4.8Nginx Rewrite
  • DHT11温湿度传感器
  • RestTemplate超简单上手
  • 监控系统设计原则及实现目标
  • VulnHub项目:MONEYHEIST: CATCH US IF YOU CAN
  • 对象存储OSS简介,一分钟了解对象存储OSS
  • SpringCloud_微服务基础day2(Eureka简介与依赖导入,服务注册与发现)
  • #tmux# #终端# 常用工具tmux
  • 后端服务架构高性能设计之道
  • Python中的Time和DateTime
  • UNIX网络编程卷一 学习笔记 第十九章 密钥管理套接字
  • excel如何实现识别文本在对应单元格填上数据?
  • Groovy 基本语法
  • 系统学习IT技术的方法与实践
  • 聊聊TCP协议的粘包、拆包以及http是如何解决的?
  • 一百二十、Kettle——用kettle把Hive数据同步到ClickHouse
  • PyTorch 提示和技巧:从张量到神经网络
  • 第五期:字符串的一些有意思的操作
  • 使用Anaconda3结合vscode来实现django项目的建立(绝好的介绍)20230608
  • 【软件测试】软件测试的基本概念和开发模型
  • 接口测试 —— 接口测试定义
  • 2015 年一月联考逻辑真题
  • 基于GD32的定时器不完全详解--定时、级联
  • Clion开发STM32之ESP8266系列(四)
  • 降本增效,StarRocks 在同程旅行的实践
  • INTP型人格适合选择哪些专业?