范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

谈谈Service与Ingress

  你好,我是张磊。今天我和你分享的主题是:谈谈Service与Ingress。
  在上一篇文章中,我为你详细讲解了将Service暴露给外界的三种方法。其中有一个叫作LoadBalancer类型的Service,它会为你在Cloud Provider(比如:Google Cloud或者OpenStack)里创建一个与该Service对应的负载均衡服务。
  但是,相信你也应该能感受到,由于每个 Service 都要有一个负载均衡服务,所以这个做法实际上既浪费成本又高。作为用户,我其实更希望看到Kubernetes为我内置一个全局的负载均衡器。然后,通过我访问的URL,把请求转发给不同的后端Service。
  这种全局的、为了代理不同后端Service而设置的负载均衡服务,就是Kubernetes里的Ingress服务。
  所以,Ingress的功能其实很容易理解:所谓Ingress,就是Service的"Service"。
  举个例子,假如我现在有这样一个站点:https://cafe.example.com。其中,https://cafe.example.com/coffee,对应的是"咖啡点餐系统"。而,https://cafe.example.com/tea,对应的则是"茶水点餐系统"。这两个系统,分别由名叫coffee和tea这样两个Deployment来提供服务。
  那么现在,[strong_begin]我如何能使用Kubernetes的Ingress来创建一个统一的负载均衡器,从而实现当用户访问不同的域名时,能够访问到不同的Deployment呢?[strong_end]
  上述功能,在Kubernetes里就需要通过Ingress对象来描述,如下所示:
  apiVersion: extensions/v1beta1kind: Ingressmetadata: name: cafe-ingressspec: tls: - hosts: - cafe.example.com secretName: cafe-secret rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80 - path: /coffee backend: serviceName: coffee-svc servicePort: 80
  在上面这个名叫cafe-ingress.yaml文件中,最值得我们关注的,是rules字段。在Kubernetes里,这个字段叫作:IngressRule。
  IngressRule的Key,就叫做:host。它必须是一个标准的域名格式(Fully Qualified Domain Name)的字符串,而不能是IP地址。
  备注:Fully Qualified Domain Name的具体格式,可以参考RFC 3986标准。
  而host字段定义的值,就是这个Ingress的入口。这也就意味着,当用户访问cafe.example.com的时候,实际上访问到的是这个Ingress对象。这样,Kubernetes就能使用IngressRule来对你的请求进行下一步转发。
  而接下来IngressRule规则的定义,则依赖于path字段。你可以简单地理解为,这里的每一个path都对应一个后端Service。所以在我们的例子里,我定义了两个path,它们分别对应coffee和tea这两个Deployment的Service(即:coffee-svc和tea-svc)。
  通过上面的讲解,不难看到,所谓Ingress对象,其实就是Kubernetes项目对"反向代理"的一种抽象。
  一个Ingress对象的主要内容,实际上就是一个"反向代理"服务(比如:Nginx)的配置文件的描述。而这个代理服务对应的转发规则,就是IngressRule。
  这就是为什么在每条IngressRule里,需要有一个host字段来作为这条IngressRule的入口,然后还需要有一系列path字段来声明具体的转发策略。这其实跟Nginx、HAproxy等项目的配置文件的写法是一致的。
  而有了Ingress这样一个统一的抽象,Kubernetes的用户就无需关心Ingress的具体细节了。
  在实际的使用中,你只需要从社区里选择一个具体的Ingress Controller,把它部署在Kubernetes集群里即可。
  然后,这个Ingress Controller会根据你定义的Ingress对象,提供对应的代理能力。目前,业界常用的各种反向代理项目,比如Nginx、HAProxy、Envoy、Traefik等,都已经为Kubernetes专门维护了对应的Ingress Controller。
  接下来,[strong_begin]我就以最常用的Nginx Ingress Controller为例,在我们前面用kubeadm部署的Bare-metal环境中,和你实践一下Ingress机制的使用过程。[strong_end]
  部署Nginx Ingress Controller的方法非常简单,如下所示:
  $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
  其中,在mandatory.yaml这个文件里,正是Nginx官方为你维护的Ingress Controller的定义。我们来看一下它的内容:
  kind: ConfigMapapiVersion: v1metadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nginx-ingress-controller namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx template: metadata: labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx annotations: ... spec: serviceAccountName: nginx-ingress-serviceaccount containers: - name: nginx-ingress-controller image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0 args: - /nginx-ingress-controller - --configmap=$(POD_NAMESPACE)/nginx-configuration - --publish-service=$(POD_NAMESPACE)/ingress-nginx - --annotations-prefix=nginx.ingress.kubernetes.io securityContext: capabilities: drop: - ALL add: - NET_BIND_SERVICE # www-data -> 33 runAsUser: 33 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE - name: http valueFrom: fieldRef: fieldPath: metadata.namespace ports: - name: http containerPort: 80 - name: https containerPort: 443
  可以看到,在上述YAML文件中,我们定义了一个使用nginx-ingress-controller镜像的Pod。需要注意的是,这个Pod的启动命令需要使用该Pod所在的Namespace作为参数。而这个信息,当然是通过Downward API拿到的,即:Pod的env字段里的定义(env.valueFrom.fieldRef.fieldPath)。
  而这个Pod本身,就是一个监听Ingress对象以及它所代理的后端Service变化的控制器。
  当一个新的Ingress对象由用户创建后,nginx-ingress-controller就会根据Ingress对象里定义的内容,生成一份对应的Nginx配置文件(/etc/nginx/nginx.conf),并使用这个配置文件启动一个 Nginx 服务。
  而一旦Ingress对象被更新,nginx-ingress-controller就会更新这个配置文件。需要注意的是,如果这里只是被代理的 Service 对象被更新,nginx-ingress-controller所管理的 Nginx 服务是不需要重新加载(reload)的。这当然是因为nginx-ingress-controller通过Nginx Lua方案实现了Nginx Upstream的动态配置。
  此外,nginx-ingress-controller还允许你通过Kubernetes的ConfigMap对象来对上述 Nginx 配置文件进行定制。这个ConfigMap的名字,需要以参数的方式传递给nginx-ingress-controller。而你在这个 ConfigMap 里添加的字段,将会被合并到最后生成的 Nginx 配置文件当中。
  可以看到,一个Nginx Ingress Controller为你提供的服务,其实是一个可以根据Ingress对象和被代理后端 Service 的变化,来自动进行更新的Nginx负载均衡器。
  当然,为了让用户能够用到这个Nginx,我们就需要创建一个Service来把Nginx Ingress Controller管理的 Nginx 服务暴露出去,如下所示:
  $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
  由于我们使用的是Bare-metal环境,所以service-nodeport.yaml文件里的内容,就是一个NodePort类型的Service,如下所示:
  apiVersion: v1kind: Servicemetadata: name: ingress-nginx namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxspec: 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
  可以看到,这个Service的唯一工作,就是将所有携带ingress-nginx标签的Pod的80和433端口暴露出去。
  而如果你是公有云上的环境,你需要创建的就是LoadBalancer类型的Service了。
  上述操作完成后,你一定要记录下这个Service的访问入口,即:宿主机的地址和NodePort的端口,如下所示:
  $ kubectl get svc -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx NodePort 10.105.72.96  80:30044/TCP,443:31453/TCP 3h
  为了后面方便使用,我会把上述访问入口设置为环境变量:
  $ IC_IP=10.168.0.2 # 任意一台宿主机的地址$ IC_HTTPS_PORT=31453 # NodePort端口
  在Ingress Controller和它所需要的Service部署完成后,我们就可以使用它了。
  备注:这个"咖啡厅"Ingress的所有示例文件,都在这里。
  首先,我们要在集群里部署我们的应用Pod和它们对应的Service,如下所示:
  $ kubectl create -f cafe.yaml
  然后,我们需要创建Ingress所需的SSL证书(tls.crt)和密钥(tls.key),这些信息都是通过Secret对象定义好的,如下所示:
  $ kubectl create -f cafe-secret.yaml
  这一步完成后,我们就可以创建在本篇文章一开始定义的Ingress对象了,如下所示:
  $ kubectl create -f cafe-ingress.yaml
  这时候,我们就可以查看一下这个Ingress对象的信息,如下所示:
  $ kubectl get ingressNAME HOSTS ADDRESS PORTS AGEcafe-ingress cafe.example.com 80, 443 2h$ kubectl describe ingress cafe-ingressName: cafe-ingressNamespace: defaultAddress: Default backend: default-http-backend:80 ()TLS: cafe-secret terminates cafe.example.comRules: Host Path Backends ---- ---- -------- cafe.example.com  /tea tea-svc:80 () /coffee coffee-svc:80 ()Annotations:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CREATE 4m nginx-ingress-controller Ingress default/cafe-ingress
  可以看到,这个Ingress对象最核心的部分,正是Rules字段。其中,我们定义的Host是cafe.example.com,它有两条转发规则(Path),分别转发给tea-svc和coffee-svc。
  当然,在Ingress的YAML文件里,你还可以定义多个Host,比如restaurant.example.com、movie.example.com等等,来为更多的域名提供负载均衡服务。
  接下来,我们就可以通过访问这个Ingress的地址和端口,访问到我们前面部署的应用了,比如,当我们访问https://cafe.example.com:443/coffee时,应该是coffee这个Deployment负责响应我的请求。我们可以来尝试一下:
  $ curl --resolve cafe.example.com:$IC_HTTPS_PORT:$IC_IP https://cafe.example.com:$IC_HTTPS_PORT/coffee --insecureServer address: 10.244.1.56:80Server name: coffee-7dbb5795f6-vglbvDate: 03/Nov/2018:03:55:32 +0000URI: /coffeeRequest ID: e487e672673195c573147134167cf898
  我们可以看到,访问这个URL 得到的返回信息是:Server name: coffee-7dbb5795f6-vglbv。这正是 coffee 这个 Deployment 的名字。
  而当我访问https://cafe.example.com:433/tea的时候,则应该是tea这个Deployment负责响应我的请求(Server name: tea-7d57856c44-lwbnp),如下所示:
  $ curl --resolve cafe.example.com:$IC_HTTPS_PORT:$IC_IP https://cafe.example.com:$IC_HTTPS_PORT/tea --insecureServer address: 10.244.1.58:80Server name: tea-7d57856c44-lwbnpDate: 03/Nov/2018:03:55:52 +0000URI: /teaRequest ID: 32191f7ea07cb6bb44a1f43b8299415c
  可以看到,Nginx Ingress Controller为我们创建的Nginx负载均衡器,已经成功地将请求转发给了对应的后端Service。
  以上,就是Kubernetes里Ingress的设计思想和使用方法了。
  不过,你可能会有一个疑问,如果我的请求没有匹配到任何一条IngressRule,那么会发生什么呢?
  首先,既然Nginx Ingress Controller是用Nginx实现的,那么它当然会为你返回一个 Nginx 的404页面。
  不过,Ingress Controller也允许你通过Pod启动命令里的--default-backend-service参数,设置一条默认规则,比如:--default-backend-service=nginx-default-backend。
  这样,任何匹配失败的请求,就都会被转发到这个名叫nginx-default-backend的Service。所以,你就可以通过部署一个专门的Pod,来为用户返回自定义的404页面了。
  总结
  在这篇文章里,我为你详细讲解了Ingress这个概念在Kubernetes里到底是怎么一回事儿。正如我在文章里所描述的,Ingress实际上就是Kubernetes对"反向代理"的抽象。
  目前,Ingress只能工作在七层,而Service只能工作在四层。所以当你想要在Kubernetes里为应用进行TLS配置等HTTP相关的操作时,都必须通过Ingress来进行。
  当然,正如同很多负载均衡项目可以同时提供七层和四层代理一样,将来Ingress的进化中,也会加入四层代理的能力。这样,一个比较完善的"反向代理"机制就比较成熟了。
  而Kubernetes提出Ingress概念的原因其实也非常容易理解,有了Ingress这个抽象,用户就可以根据自己的需求来自由选择Ingress Controller。比如,如果你的应用对代理服务的中断非常敏感,那么你就应该考虑选择类似于Traefik这样支持"热加载"的Ingress Controller实现。
  更重要的是,一旦你对社区里现有的Ingress方案感到不满意,或者你已经有了自己的负载均衡方案时,你只需要做很少的编程工作,就可以实现一个自己的Ingress Controller。
  在实际的生产环境中,Ingress带来的灵活度和自由度,对于使用容器的用户来说,其实是非常有意义的。要知道,当年在Cloud Foundry项目里,不知道有多少人为了给Gorouter组件配置一个TLS而伤透了脑筋。
  思考题
  如果我的需求是,当访问www.mysite.com和 forums.mysite.com时,分别访问到不同的Service(比如:site-svc和forums-svc)。那么,这个Ingress该如何定义呢?请你描述出YAML文件中的rules字段。

秋季养生,重点要适秋凉,艾灸这五个穴位,打通身体开关不少地方在秋分之后,早晚已经有了寒凉之气,要想防止寒凉之气伤人,身体的这3个部位一定要保护好。秋分是自然界阴阳消长的转折期,此时,咳嗽过敏性鼻炎肩周炎虚寒性胃肠病腰腿痛风湿性关节炎黄帝内经四气调神大论(原文译文)原文春三月,此谓发陈,天地俱生,万物以荣,夜卧早起,广步于庭,被发缓形,以使志生,生而勿杀,予而勿夺,赏而勿罚,此春气之应,养生之道也。逆之则伤肝,夏为寒变,奉长者少。翻译春季的三颈部疼痛?头晕乏力真难受!使用此招,专克颈部疼痛近年来,面临颈椎疼痛问题的朋友越来越多了,长时间伏案学习,让大家的颈椎开始告急,其实颈椎有明显疼痛的患者可以选择通过艾灸来缓解。灸通4大穴颈椎不再咔咔响!大椎穴艾灸大椎穴有帮助人体有些腹痛腹胀等胃肠道症状,真的不一定需要吃药功能性胃肠病,是一个非常常见的疾病,全球发病率大概是10至30。功能性胃肠病的主要表现是餐后饱胀上腹胀痛上腹灼热感食欲不振恶心等,并且持续6个月,反复发作。当然,还要排除一些别的症郑智说于汉超和郜林愿意回广州队,保利尼奥什么时候回来?如今的广州恒大面临建队以来最大的困难,以前在中甲也经历低谷,那就是广州恒大前身广州医药,差点解散,这个时候许家印重磅投资,让球员看到重生的希望,他们度过难关,并且经历十年辉煌期,在韭菜白菜靠边站,花菜秋天第一鲜,鲜嫩营养,包饺子吃真香导语韭菜白菜靠边站,这菜秋天第一鲜,鲜嫩营养,包饺子吃真香!进入秋天后,气温转凉,早晨去市场买菜,秋风凉飕飕的,都需要穿一件外套。为了增强体质,抵御寒冬,很多人会选择在秋天的时候,苹果加2个鸡蛋实在太香了,好吃营养,我家一周吃6次,每次都吃光自然界中的每一种水果都有其独特的使命,苹果作为最常见的水果之一,也有自己的过人之处。苹果中含有大量的钾离子,能够有效降低人体的胆固醇含量。不仅如此,它还有活水之称,常吃能够使得皮肤糖尿病患者饮食指南牛油果篇作者广州医科大学附属第五医院主管药师欧汝静近日,在查房过程中,一名糖尿病患者咨询临床药师,糖尿病患者可不可吃牛油果?众所周知,牛油果口感软绵细腻,富含以不饱和脂肪酸为主的油脂多种矿秋天营养均衡的美食1。尖椒溜肥肠青尖椒含有维生素C叶酸镁以及钾等,其中维生素C含量丰富。青尖椒含水分93。9左右碳水化合物约3。8。肥肠的营养价值有润燥补虚止渴止血的功效。下酒好菜主料肥肠300g(贵州兴义,万峰之中,花海森林,恣意生长万峰林能够最准确诠释重峦叠嶂的地带,是万峰林。连绵不绝的山峰在眼前伸展,从中夹杂着花田布依族村落明亮的湖泊这里是全国最负盛名的喀斯特地貌博物馆,是全国乃至全球最美的峰林之一,也拥有整个贵肿瘤患者补充蛋白粉有讲究,这些人禁用蛋白粉补品可以说是肿瘤患者们最关注的话题之一。在一项针对内科肿瘤患者的调查中,发现90以上的患者会选择服用各类补品1,蛋白粉就是其中之一。那么,肿瘤患者到底能不能吃蛋白粉呢?在回答这个疑
我省拟入库科技型中小企业名单公布齐鲁智能微系统创新产业基地14家企业入选科技型中小企业是经济发展的重要主体,也是高新技术企业的后备力量。近日,山东省科技厅公示了我省2023年第二批拟入库科技型中小企业名单,齐鲁智能微系统创新产业基地企业山东深川变频科技当GPT4反思自己错了性能提升近30,编程能力提升21机器之心报道机器之心编辑部GPT4的思考方式,越来越像人了。人类在做错事时,会反思自己的行为,避免再次出错,如果让GPT4这类大型语言模型也具备反思能力,性能不知道要提高多少了。众中国科学评价机制需反思她入选美国院士却多次落选中科院院士?阅读之前,麻烦你先点右上角的关注,既方便与你进行讨论与分享,又能给你带来不一样的参与感,感谢你的支持!李爱珍是中国的半导体科学家,在该领域中有着杰出的贡献。2007年,她成功入选美官宣!Steam客户端明年起不再支持Win788。1系统今日(3月28日),Steam官宣将于2024年1月1日开始停止对Windows788。1系统的支持。此日期后玩家将无法在这些版本的Windows系统中使用Steam客户端。究其原总销售额超亿元,第三届直播电商节大湾区直播专场活动打造广味视听盛宴南方财经全媒体记者魏彤广州报道围绕加快建设国际消费中心城市推动消费持续恢复升级,第三届直播电商节(中国广州)将于近期举办。3月25日至26日,农产品直播电商平台东方甄选首次采用游轮想买点经济的粮食酒存放几年,能否请各位酒神指点一二?一其实对于这个问题有两个重点1首先是要经济。2必须是纯粮酒。二50元左右的粮食酒1首先我推荐的是汾酒股份的53度黄盖玻汾酒42度红盖汾53度出口汾,他们都是由高粱大麦豌豆和水酿造的请你用一句话描述一下山东的特色?谢邀!人杰地灵,文化底蕴深厚。谢邀山东什么特色!胶东,微山湖,红色。五岳独尊泰山,尊称,也是封禅地。最具时尚特色,也是最接人文地气,经久不衰的食文化,大饼卷大葱!香飘城市角落。齐鲁当代很多年轻人为何离不开耳机?1。手机电脑平板等电子产品的迅速普及加上生活学习工作等的需求,使用耳机不仅方便了个人也是适应社会环境的举措。2。个人喜欢独自享受手机声音的传递。倾听琴弦波动的音乐,追剧浏览视频的时员工离职后,公司要求交出微信,我该怎么拒绝?你的陈述不具体,没有说明你的微信号是怎样注册的,即是以个人还是公司名义注册的。你使用的手机是个人的还是公司配备或者公司购买的。员工离职后,公司要求交出微信号?首先要看,这个微信是以笔记本电脑只有飞行模式该怎么解决啊?笔记本电脑只显示飞行模式的解决方法打开笔记本的时候发现没有网络,看一下网络连接界面,发现只有一个飞行模式,重启也无效果出现这种情况一般是设置不对引起的,我以win10为例来说如何来腾讯音乐Q4财报业绩稳健毛利净利均超预期,技术创新助力产业高质量发展中国网娱乐2023年3月21日讯中国领先的在线音乐与音频娱乐平台腾讯音乐娱乐集团(以下简称TME或公司)(纽交所股份代号TME及港交所股份代号1698)今日发布了截至2022年12