阅读本文前可先参考

Kubernetes - Kubernetes详解;安装部署_MinggeQingchun的博客-CSDN博客

https://blog.csdn.net/MinggeQingchun/article/details/126420188

一、Ingress

k8s 对外暴露服务(service)主要有两种方式:NotePort, LoadBalance, 此外externalIPs也可以使各类service对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个service一个LB又有点浪费和麻烦,并且需要k8s之外的支持; 而ingress则只需要一个NodePort或者一个LB就可以满足所有service对外服务的需求

Kubernetes 暴露服务的方式:

NodePort:后期维护困难,不支持虚拟路径

LoadBlancer:需要云厂商支持,有局限性

ClusterIP:只能在集群内部访问

Ingress:灵活,无依赖

(一)NodePort

NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点(虚拟机)上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里

NodePort服务的YAML文件如下:

apiVersion: v1
kind: Service
metadata:  name: my-nodeport-service
selector:   app: my-appspec:type: NodePortports:  - name: httpport: 80targetPort: 80nodePort: 30008protocol: TCP

这种方式有一个“nodePort"的端口,能在节点上指定开放哪个端口,如果没有指定端口,它会选择一个随机端口,大多数时候应该让Kubernetes随机选择端口;

这种方式的不足:

1、一个端口只能供一个服务使用;

2、只能使用30000–32767之间的端口;

3、如果节点/虚拟机的IP地址发生变化,需要手动进行处理;

因此,在生产环境不推荐使用这种方式来直接发布服务,如果不要求运行的服务实时可用,或者用于演示或者临时运行一个应用可以用这种方式

三种端口说明

ports:

- name: http

port: 80

targetPort: 80

nodePort: 30008

protocol: TCP

nodePort

外部机器(在windows浏览器)可以访问的端口

如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问scheme://node:30001访问到该服务

targetPort

容器的端口,与制作容器时暴露的端口一致(Dockerfile中EXPOSE),如docker.io官方的nginx暴露的是80端口

port

Kubernetes集群中的各个服务之间访问的端口,虽然mysql容器暴露了3306端口,但外部机器不能访问到mysql服务,因为他没有配置NodePort类型,该3306端口是集群内其他容器需要通过3306端口访问该服务

kubectl expose deployment springboot-k8s --port=8080 --target-port=8080 --type=NodePort

(二)LoadBalancer

LoadBlancer可以暴露服务,这种方式需要向云平台申请负载均衡器,目前很多云平台都支持,但是这种方式深度耦合了云平台(购买服务)

从外部的访问通过负载均衡器LoadBlancer转发到后端的Pod,具体如何实现要看云提供商

(三)Ingress

Ingress 英文翻译为:入口、进入、进入权、进食,也就是入口,即外部请求进入k8s集群必经之口

虽然k8s集群内部署的pod、service都有自己的IP,但是却无法提供外网访问,以前我们可以通过监听NodePort的方式暴露服务,但是这种方式并不灵活,生产环境也不建议使用;

Ingresss是k8s集群中的一个API资源对象,相当于一个集群网关,我们可以自定义路由规则来转发、管理、暴露服务(一组pod),比较灵活,生产环境建议使用这种方式;

Ingress不是kubernetes内置的(安装好k8s之后,并没有安装ingress),ingress需要单独安装,而且有多种类型Google Cloud Load Balancer,Nginx,Contour,Istio等等,我们这里选择官方维护的Ingress Nginx

Ingress:k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法,将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制

Ingress Controller:根据Ingress生成具体的路由规则,并对Pod负载均衡,实现基于不同HTTP URL向后转发的负载分发规则,并可以灵活设置7层负载分发策略。

使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样会跳过kube-proxy的转发功能,kube-proxy不再起作用。如果Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能

使用Ingress Nginx的步骤

1、部署Ingress Nginx

2、配置Ingress Nginx规则

二、Ingress暴露容器化应用

1、部署一个容器化应用(pod),如Nginx、SpringBoot应用

kubectl create deployment nginx --image=nginx

2、暴露该服务

kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

3、部署Ingress Nginx

GitHub地址:

GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes

Installation Guide - NGINX Ingress Controller

ingress-nginx是使用NGINX作为反向代理和负载均衡器的Kubernetes的Ingress控制器

1、首先下载该 yaml 文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

应用

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

2、应用

kubectl apply -f deploy.yaml

输出如下:xx unchanged ;正确输出应该是xx created ;查看service、deployment、pod状态也发现并未启动好

validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured

[root@eureka8761 ingress]# kubectl apply -f deploy.yaml
namespace/ingress-nginx unchanged
serviceaccount/ingress-nginx unchanged
serviceaccount/ingress-nginx-admission unchanged
role.rbac.authorization.k8s.io/ingress-nginx unchanged
role.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
configmap/ingress-nginx-controller unchanged
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create unchanged
job.batch/ingress-nginx-admission-patch unchanged
ingressclass.networking.k8s.io/nginx unchanged
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured

查看Ingress的状态

kubectl get service -n ingress-nginx

kubectl get deploy -n ingress-nginx

kubectl get pods -n ingress-nginx

3、 我们修改下载好的 deploy.yaml 文件 

v1 Ingress资源规范

apiVersion: networking.k8s.io/v1 #资源所属的API群组和版本
kind: Ingress #资源类型标识符
metadata: #元数据name <string> #资源名称annotations: #资源注解,vlbetal使用下面的注解来指定要解析该资源的控制器类型kubernetes.io/ingress.class:<string> #适配的Ingress控制器类别namespace <string>  #名称空间
spec:rules <[]object> #Ingress规则列表- host <string>  #虚拟主机的FQDN,支持“*"前缀通配,不支持IP,不支持指定端口http <object>paths <[]object>#虚拟主机PATH定义的列表,由path和backend组成- path <string> #流量匹配的HTTP PATH,必须以/开头pathType <string> #支持Exact、Prefix和ImplementationSpecific,必选backend <Object>#匹配到的流量转发到的目标后端resource <object>  #引用的同一名称空间下的资源,与下面两个字段互斥service <object> #关联的后端Service对象name <string> #后端Service的名称port bject> #后端Service上的端口对象name <string> #端口名称number <integer>  #端口号tls <[]object>  #TLS配置,用于指定上rules中定义的哪些host需要工作HTTPS模式- hosts <[]string>  #使用同一组证书的主机名称列表secretName <string> #保存于数字证书和私钥信息的secret资源名称backend <object>  #默认backend的定义,可嵌套字段及使用格式跟rules字段中的相同ingressClassName <string> #ingress类名称,用于指定适配的控制器

(1)修改镜像,不然会下载失败

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

(2)添加一个配置项 hostNetwork

hostNetwork设置适用于Kubernetes。当Pod配置为时hostNetwork: true,在此Pod中运行的应用程序可以直接看到启动Pod的主机的网络接口

4、删除webhook,删除之前未创建好的service、deployment、pod,重新应用

查看 webhook

kubectl get validatingwebhookconfigurations

删除ingress-nginx-admission

kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
kubectl delete service ingress-nginx-controller -n ingress-nginx
kubectl delete service ingress-nginx-controller-admission -n ingress-nginxkubectl delete deploy ingress-nginx-controller -n ingress-nginxkubectl delete pods -n ingress-nginxkubectl apply -f deploy.yaml

5、查看Ingress的状态

kubectl get service -n ingress-nginx

kubectl get deploy -n ingress-nginx

kubectl get pods -n ingress-nginx

6、创建Ingress规则

(1)编写 ingress-nginx-rule.yaml 文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: k8s-ingress
spec:rules:- host: www.abc.comhttp:paths:- pathType: Prefixpath: /backend:service:name: nginxport: number: 80

(2)应用

kubectl apply -f ingress-nginx-rule.yaml

此时如果报错

ingress-nginx-controller-58bfcbb55b-nk2pw   0/1     ContainerCreating   0          6m5s
[root@eureka8761 ingress]# kubectl apply -f ingress-nginx-rule.yaml
Error from server (InternalError): error when creating "ingress-nginx-rule.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": dial tcp 10.111.130.1:443: connect: connection refused

解决办法:

kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

再次执行

kubectl apply -f ingress-nginx-rule.yaml

查看规则

kubectl get ingress

三、kubernetes部署Spring Cloud微服务

1、项目打成jar包或者war包

2、制作项目镜像(编写Dockerfile文件)

生成镜像:
docker build -t spring-cloud-alibaba-consumer -f Dockerfile-consumer .
docker build -t spring-cloud-alibaba-provider -f Dockerfile-provider .
docker build -t spring-cloud-alibaba-gateway -f Dockerfile-gateway .

3、用k8s部署镜像(命令方式、yaml方式)

注:deploy.yaml文件里面镜像从本地拉取

containers:- image: spring-cloud-alibaba-consumer-1.0.0-jarname: spring-cloud-alibaba-consumer-1-0-0-jar-8ntrximagePullPolicy: Never

把镜像拉取策略改为Never

4、对外暴露服务

部署提供者:
(1)
kubectl create deployment spring-cloud-alibaba-provider --image=spring-cloud-alibaba-provider --dry-run -o yaml > provider.yaml
(2)
kubectl apply -f provider.yaml
部署消费者:
(1)
kubectl create deployment spring-cloud-alibaba-consumer --image=spring-cloud-alibaba-consumer --dry-run -o yaml > consumer.yaml
(2)
kubectl apply -f consumer.yaml
(3)
kubectl expose deployment spring-cloud-alibaba-consumer --port=9090 --target-port=9090 --type=NodePort
部署网关:
(1)
kubectl create deployment spring-cloud-alibaba-gateway --image=spring-cloud-alibaba-gateway --dry-run -o yaml > gateway.yaml
(2)
kubectl apply -f gateway.yaml
(3)
kubectl expose deployment spring-cloud-alibaba-gateway --port=80 --target-port=80 --type=NodePort

5、 查看状态

kubectl get service -n ingress-nginx
kubectl get deploy -n ingress-nginx
kubectl get pods -n ingress-nginx看pod详情:
kubectl describe pods spring-cloud-alibaba-consumer-xx看pod运行日志:
kubectl logs -f spring-cloud-alibaba-consumer-xx

Kubernetes - Ingress暴露应用(四)相关推荐

  1. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...

  2. Kubernetes使用Nginx Ingress暴露Dashboard

    Kubernetes使用Nginx Ingress暴露Dashboard [TOC] 1. 环境说明 可用的kubernetes集群 可用的nginx ingress controller 可用的da ...

  3. 使用ingress暴露kubernetes集群内部的pod服务

    微信公众号搜索 DevOps和k8s全栈技术 ,关注之后,在后台回复 ingress,就可获取Ingress相关视频和文档,也可扫描文章最后的二维码关注公众号. 回顾 Kubernetes暴露服务的方 ...

  4. 容器编排技术 -- Kubernetes Ingress解析

    容器编排技术 -- Kubernetes Ingress解析 前言 这是kubernete官方文档中Ingress Resource的翻译,因为最近工作中用到,文章也不长,也很好理解,索性翻译一下,也 ...

  5. Kubernetes Ingress and Services 故障排查

    流量:Internet → Ingress 控制器规则(根据你的 Ingress YAML)→ Service → Pods 调试流程:Pods → Service → Ingress → Ingre ...

  6. Kubernetes Ingress Nginx使用

    在此我们不讲述如何部署ingress-controller,只演示如何使用ingress之nginx使用.主要演示如何使用ingress nginx实现我们nginx的多样化配置,从而达到使用ingr ...

  7. 宅家学习,如何进行Kubernetes Ingress控制器的技术选型?

    导语:在Kubernetes的实践.部署中,为了解决 Pod 迁移.Node Pod 端口.域名动态分配等问题,需要开发人员选择合适的 Ingress 解决方案.面对市场上众多Ingress产品,开发 ...

  8. Kubernetes Ingress 控制器的技术选型技巧

    作者:厉辉,腾讯云中间件API网关核心研发成员 在 Kubernetes 的实践.部署中,为了解决 Pod 迁移.Node Pod 端口.域名动态分配等问题,需要开发人员选择合适的 Ingress 解 ...

  9. Kubernetes Ingress(和网络)的Why以及How

    客座文章最初由 Saaras 团队在Saaras 博客[1]上发表 在公有云或私有云上无法访问 Kubernetes 中运行的服务.这就是 Kubernetes 在设计时考虑到服务安全性的方式. 集群 ...

最新文章

  1. 找到反例!博士后数学家推翻困扰数学界80多年的单位猜想
  2. linux 中关于网络的配置方法
  3. android 固定中间焦点,在Android上将相机焦点设置为受控固定距离
  4. python删除word表格中的某一行_python docx删除word段落
  5. kubectl logs -f tail 显示100_系统管理员应该知道的9个kubectl命令
  6. 拼接的option会多出空行_Word空格,空行,页眉横线等问题,我只花一分钟就全解决了...
  7. SQL Server常用函数 -- 更新中
  8. Linux常用基本命令(rename,basename,dirname)
  9. Swift教程之基本操作符
  10. 动态规划之多重部分和问题
  11. Vs2010创建WebService
  12. 设计自己的基于Selenium 的自动化测试框架-Java版(1) - 为什么selenium还需要测试框架?...
  13. matlab知识集锦(3)
  14. PMP第六版备考笔记练习题答疑(持续更新)
  15. 安装破解IAR EWARM 8.2,提供注册机
  16. 568A以及568B线序
  17. 1一9数字行书写法_1一9数字行书写法
  18. Ubuntu Server 22.04 Jammy Jellyfish安装Budgie桌面环境
  19. SQL——数据定义DDL
  20. QT实现ping功能

热门文章

  1. 【教程】为kiftd设置自定义背景图片
  2. MP4 格式:最少加载多少数据就能渲染出视频首帧?优化短视频播放体验必须先了解它丨音视频基础
  3. 【6】OpenCV中vec类的介绍
  4. Unity Tag标签
  5. 万剑归宗—架构设计中的抽象思维与具象思维
  6. 2020年中国高温合金行业发展现状及竞争格局分析,20年高温合金供需缺口扩大,依赖进口「图」
  7. TS协议解析第二部分(PMT)
  8. 【Android】SD卡工具类
  9. 深度学习中的TTA(Test Time Augmentation)--测试时数据增强技术
  10. 业内人士称游资3年前开始准备炒作糖价