Kubernetes - Ingress暴露应用(四)
阅读本文前可先参考
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暴露应用(四)相关推荐
- Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务
一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...
- Kubernetes使用Nginx Ingress暴露Dashboard
Kubernetes使用Nginx Ingress暴露Dashboard [TOC] 1. 环境说明 可用的kubernetes集群 可用的nginx ingress controller 可用的da ...
- 使用ingress暴露kubernetes集群内部的pod服务
微信公众号搜索 DevOps和k8s全栈技术 ,关注之后,在后台回复 ingress,就可获取Ingress相关视频和文档,也可扫描文章最后的二维码关注公众号. 回顾 Kubernetes暴露服务的方 ...
- 容器编排技术 -- Kubernetes Ingress解析
容器编排技术 -- Kubernetes Ingress解析 前言 这是kubernete官方文档中Ingress Resource的翻译,因为最近工作中用到,文章也不长,也很好理解,索性翻译一下,也 ...
- Kubernetes Ingress and Services 故障排查
流量:Internet → Ingress 控制器规则(根据你的 Ingress YAML)→ Service → Pods 调试流程:Pods → Service → Ingress → Ingre ...
- Kubernetes Ingress Nginx使用
在此我们不讲述如何部署ingress-controller,只演示如何使用ingress之nginx使用.主要演示如何使用ingress nginx实现我们nginx的多样化配置,从而达到使用ingr ...
- 宅家学习,如何进行Kubernetes Ingress控制器的技术选型?
导语:在Kubernetes的实践.部署中,为了解决 Pod 迁移.Node Pod 端口.域名动态分配等问题,需要开发人员选择合适的 Ingress 解决方案.面对市场上众多Ingress产品,开发 ...
- Kubernetes Ingress 控制器的技术选型技巧
作者:厉辉,腾讯云中间件API网关核心研发成员 在 Kubernetes 的实践.部署中,为了解决 Pod 迁移.Node Pod 端口.域名动态分配等问题,需要开发人员选择合适的 Ingress 解 ...
- Kubernetes Ingress(和网络)的Why以及How
客座文章最初由 Saaras 团队在Saaras 博客[1]上发表 在公有云或私有云上无法访问 Kubernetes 中运行的服务.这就是 Kubernetes 在设计时考虑到服务安全性的方式. 集群 ...
最新文章
- 找到反例!博士后数学家推翻困扰数学界80多年的单位猜想
- linux 中关于网络的配置方法
- android 固定中间焦点,在Android上将相机焦点设置为受控固定距离
- python删除word表格中的某一行_python docx删除word段落
- kubectl logs -f tail 显示100_系统管理员应该知道的9个kubectl命令
- 拼接的option会多出空行_Word空格,空行,页眉横线等问题,我只花一分钟就全解决了...
- SQL Server常用函数 -- 更新中
- Linux常用基本命令(rename,basename,dirname)
- Swift教程之基本操作符
- 动态规划之多重部分和问题
- Vs2010创建WebService
- 设计自己的基于Selenium 的自动化测试框架-Java版(1) - 为什么selenium还需要测试框架?...
- matlab知识集锦(3)
- PMP第六版备考笔记练习题答疑(持续更新)
- 安装破解IAR EWARM 8.2,提供注册机
- 568A以及568B线序
- 1一9数字行书写法_1一9数字行书写法
- Ubuntu Server 22.04 Jammy Jellyfish安装Budgie桌面环境
- SQL——数据定义DDL
- QT实现ping功能