11.Ingress资源
11.Ingress资源?
对于负载均衡和外网代理的解决方案,云上环境,我们使用SLB;传统环境,我们会选Haproxy、LVS,但在kubernetes体系中,我只会选择ingress(controllers)!
1.什么是Ingress?
ingress是一个管理kubernetes集群南北流量的api 对象,典型的有HTTP。
并且可以提供:LB负载均衡的能力。
注意:
1)南北流量和东西流量是服务网格中的经常描述网络流量的术语。
南北流量(NORTH-SOUTH traffic):集群外部->集群内部
东西流量(EAST-WEST traffic):集群内部相互访问2)ingress仅是一段配置,你可以理解为SLB的配置信息片段。
实例化SLB能力的话,你还需要一个ingress controller。
2.什么是IngressController?
Ingress Controller是一种能读懂ingress配置,并将其翻译成自己配置文件的应用程序。
比较常见的有ingress-nginx、kong、traefik、istio、envoy等
Ingress Controller:
将ingress配置信息转换为自身配置的应用程序
Ingress:
只定义流量转发和调度的通用格式的配置信息
如果你刚接触kubernetes,并且只是为了学习,建议直接使用ingress-nginx。
3.Ingress代理逻辑
这张图我画的是基于ingress-nginx的技术栈,并通过nodeport类型的service,将ingress服务暴露到集群外,供客户端的访问。
你需要记住的是:
1.ingress controllers是实际的应用程序
2.ingress只是转发的配置信息,通过ingress controllers实例化,并且通过lua语言,在ingress-nginx的pod中,实例化成一个基础的nginx配置文件而已,和传统的nginx并无太大的差异。
4.Ingress-Nginx部署和测试
1.首先,下载ingress-nginx的配置清单,修改images地址为阿里云(否则会被墙):registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
2.使用apply -f mandatory.yaml启动配置清单,并查看Pod是否运行成功
[root@centos-1 dingqishi]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-dc55d4998-zxnrd 1/1 Running 0 20m
3.接着,编辑nginx-ingress-service.yaml配置文件
apiVersion: v1
kind: Service
metadata:name: nginx-ingress-controllernamespace: ingress-nginx
spec:type: NodePortports:- port: 80 #Service端口name: httpnodePort: 30080 #本机端口- port: 443name: httpsnodePort: 30443selector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
4.然后,apply -f配置文件,并观察。
你可以对比我上面的图,此时基于nodeport类型的nginx-ingress-controller的service已经部署成功。
[root@centos-1 dingqishi]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller NodePort 10.108.188.111 <none> 80:30080/TCP,443:30443/TCP 12m
此时,你可以通过访问任意一台虚拟机的30080端口,便能够访问到Nginx404页面
5.接下来,我们编辑myapp-svc.yaml和myapp-ingress.yaml,并通过apply -f创建。
我们期望将Deployment暴露到集群外,供客户端进行访问。
提示:
当你使用多个ingress-controllers的时候,可以通过kubernetes.io/ingress.class: "nginx"来申明使用哪一个controller
#myapp-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: myappnamespace: myns
spec:replicas: 2selector:matchLabels:app: myapprel: betatemplate:metadata:namespace: mynslabels:app: myapprel: betaspec:containers:- name: myappimage: registry.cn-hangzhou.aliyuncs.com/aaron89/myapp:v1---
apiVersion: v1
kind: Service
metadata:name: myappnamespace: myns
spec:selector:app: myapprel: betaports:- name: httpport: 80targetPort: 80#myapp-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: myappnamespace: mynsannotations:nginx.ingress.kubernetes.io/rewrite-target: /kubernetes.io/ingress.class: "nginx" #当有多种ingress-controller的时候,用这个参数区分使用哪个controller
spec:rules:- host: foo.bar.comhttp:paths:- path: /backend:serviceName: myappservicePort: 80
6.此时,修改本机hosts并访问foo.bar.com:30080`,可以成功
192.168.0.104 foo.bar.com
5.tomcat部署实战
1.首先,编辑tomcat-svc-ingress.yaml,并apply -f生成。配置文件中的信息,应该可以一目了然。
apiVersion: v1
kind: Namespace
metadata:name: eshop---
apiVersion: apps/v1
kind: Deployment
metadata:name: tomcatnamespace: eshop
spec:replicas: 2selector:matchLabels:app: tomcatrel: betatemplate:metadata:namespace: eshoplabels:app: tomcatrel: betaspec:containers:- name: tomcatimage: tomcat:alpine---
apiVersion: v1
kind: Service
metadata:name: tomcatnamespace: eshop
spec:selector:app: tomcatrel: betaports:- name: httpport: 8080targetPort: 8080 #tomcat(Pod)端口- name: ajpport: 8009targetPort: 8009 #tomcat(Pod)端口---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: tomcatnamespace: eshopannotations:nginx.ingress.kubernetes.io/rewrite-target: /kubernetes.io/ingress.class: "nginx" #当有多种ingress-controller的时候,用这个参数区分使用哪个controller
spec:rules:- host: eshop.foo.comhttp:paths:- path: /backend:serviceName: tomcatservicePort: 8080
2.观察集群资源生成情况
[root@centos-1 dingqishi]# kubectl get all -n eshop
NAME READY STATUS RESTARTS AGE
pod/tomcat-6b6fb9c8f6-jq9w2 1/1 Running 0 4m33s
pod/tomcat-6b6fb9c8f6-qz8z6 1/1 Running 0 4m33sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/tomcat ClusterIP 10.110.148.61 <none> 8080/TCP,8009/TCP 4m33sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tomcat 2/2 2 2 4m33sNAME DESIRED CURRENT READY AGE
replicaset.apps/tomcat-6b6fb9c8f6 2 2 2 4m33s
3.观察ingress条目生成情况
[root@centos-1 dingqishi]# kubectl get ingress -n eshop
NAME HOSTS ADDRESS PORTS AGE
tomcat eshop.foo.com 80 5m23s[root@centos-1 dingqishi]#kubectl describe ingress tomcat -n eshop
Name: tomcat
Namespace: eshop
Address:
Default backend: default-http-backend:80 (<none>)
Rules:Host Path Backends---- ---- --------eshop.foo.com / tomcat:8080 (10.244.1.51:8080,10.244.2.34:8080)
4.进入ingress-nginx,查看配置文件生成情况。你会发现lua脚本已经将相关配置信息,读取了进来。
kubectl exec -it pod/nginx-ingress-controller-dc55d4998 -zxnrd -n ingress-nginx -- /bin/shmore /etc/nginx/nginx.conf## start server eshop.foo.comserver {server_name eshop.foo.com ;listen 80;set $proxy_upstream_name "-";location / {set $namespace "eshop";set $ingress_name "tomcat";set $service_name "tomcat";set $service_port "8080";set $location_path "/";rewrite_by_lua_block {balancer.rewrite()}
5.新增Mac本机Hosts文件,并测试,至此部署已经完成
192.168.0.11 eshop.foo.comdingqishideMacBook-Pro:~ dingqishi$ curl -I eshop.foo.com:30080
HTTP/1.1 200
Server: nginx/1.15.5
Date: Tue, 03 Dec 2019 10:47:23 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
最新的安装地址请看:https://kubernetes.github.io/ingress-nginx/deploy/
11.Ingress资源相关推荐
- 无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源
Kubernetes Ingress 介绍 通常情况下,Kubernetes 集群内的网络环境与外部是隔离的,也就是说 Kubernetes 集群外部的客户端无法直接访问到集群内部的服务,这属于不同网 ...
- Ingress 资源与 networking.k8s.io/v1 问题
1 no matches for kind "Ingress" in version "networking.k8s.io/v1" 在 kubernetes v ...
- Kubernetes集群服务发现之Ingress资源详解(三十)
Ingress-nginx资源介绍及详细配置 文章目录 Ingress-nginx资源介绍及详细配置 1.Ingress原理总结 2.部署Ingress环境 2.1.部署Ingress 2.2.准备两 ...
- ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法...
在ubuntu系统的termial下,用apt-get install 安装软件的时候,如果在未完成下载的情况下将terminal close.此时 apt-get进程可能没有结束.结果,如果再次运行 ...
- python小型编程_学习Python编程的11个资源
用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因 ...
- 11个资源强大的网站!知乎超20万人强烈推荐,再也不怕资源难找
在我们日常工作学习中难免就需要在网站搜索资料,这时候一定需要一个能够帮你搜索一切你想要的资源,从而为你剩下一大半时间,那么今天为大家整理了11个超级好用的黑科技资源搜索网站,帮你解决因为上网找不到合适 ...
- 11个资源强大的网站!
在我们日常工作学习中难免就需要在网站搜索资料,这时候一定需要一个能够帮你搜索一切你想要的资源,从而为你剩下一大半时间,那么今天为大家整理了11个超级好用的黑科技资源搜索网站,帮你解决因为上网找不到合适 ...
- L-Edit 11.1-附资源包
软件介绍: L-edit 是一款由tanner推出的 集成路设计软件 (版图设计).该软件拥有易用.易学的特点,主要适用于集成电路的设计.微纳器件操作. 软件下载: TannerL-Edit11.1- ...
- 11. K8S资源限制,多账户管理及网络实现
1. Kubernetes pod.container与namespace资源限制 CPU 以核心(毫核,1核=1000毫核,500m=0.5核)为单位. memory 以字节为单位. request ...
最新文章
- 段式存储、页式存储。
- Java-Web JSP指令、javabean和EL表达式
- mysql uroot e_批量 kill mysql 连接
- #CSP 201909-1 小明种苹果
- daocloud创建mysql_DaoCloud体验-使用node构建应用程序
- 如何在Eclipse中如何自动添加注释和自定义注释风格
- 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别
- 部门开始做技术talk
- 类似c语言sizeof,sizeof()与strlen()在C语言中有什么不同
- 计算机在网络通信方面的应用,分析计算机技术在通信中的应用
- docker安装speedtest和宝塔面板
- 模拟实现求字符串长度函数strlen
- catia 二次开发:环境变量路径,检查路径存在,关闭文件,对象为空,获取pad对象,err,part的product,全局变量,常量,SystemService,input,选择文件 时间,函数调用
- Python拉宾米勒(判断素数)
- 多媒体一体机计算机打不开,多媒体教学一体机突然打不开PPT是怎么回事?
- 教你如何设置电脑保护色来保护眼睛
- 大学生生涯规划1000字计算机专业,计算机大学生职业生涯规划书1000字
- PC微信逆向HOOK消息之快速更新找到HOOK地址
- tomcat 运行提示The background cache eviction process was unable to free
- mpp文件能转换成PDF