涨薪技术|Kubernetes(k8s)之Ingress

01 Ingress介绍

Kubernetes暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress;本节主要介绍ingress。

ingress简单的说就是一个代理过程,可以根据配置转发请求到指定的服务上。

通俗来讲,ingress和之前提到的Service、Deployment,也是一个k8s的资源类型,ingress用于实现用域名的方式访问k8s内部应用。

Ingress为Kubernetes集群中的服务提供了入口,可以提供负载均衡、SSL终止和基于名称的虚拟主机,在生产环境中常用的Ingress有Treafik、Nginx、HAProxy、Istio等。

在Kubernetesv 1.1版中添加的Ingress用于从集群外部到集群内部Service的HTTP和HTTPS路由,流量从Internet到Ingress再到Services最后到Pod上,通常情况下,Ingress部署在所有的Node节点上。

Ingress可以配置提供服务外部访问的URL、负载均衡、终止SSL,并提供基于域名的虚拟主机。但Ingress不会暴露任意端口或协议。

由于K8S集群拥有强大的副本控制能力,Pod随时可能从一个节点上被驱逐到另一个节点上,或者直接销毁再来一个新的。

然而伴随着Pod的销毁和重生,Pod的IP等信息不断地在改变,此时使用K8S提供的Service机制可以解决这一问题,Service通过标签选定指定的Pod作为后端服务,并监听这些Pod的变化。

在对外暴露服务时,使用Service的NodePort是一个方法

问题1-如何管理端口

当需要对外暴露的服务量比较多的时候,端口管理的问题变会暴露出来。

此时的一个处理方案是使用一个代理服务(例如nginx)根据请求信息将请求转发到不同的服务器上。

问题2-如何管理转发配置

每当有新服务加入,都需要对该服务的配置进行修改、升级,在服务数量逐渐变多后,该配置项目会变得越来越大,手工修改的风险也会逐渐增高。

那么需要一个工具来简化这一过程,希望可以通过简单的配置动态生成代理中复杂的配置,最好还可以顺手重新加载配置文件。

K8S刚好也提供了此类型资源。

 

Ingress 工作原理

(1)ingress-controller通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则变化,

(2)然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置。

(3)再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中。

(4)然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。

在使用普通的Service时,集群中每个节点的kube-proxy在监听到Service和Endpoints的变化时,会动态的修改相关的iptables的转发规则。客户端在访问时通过iptables设置的规则进行路由转发达到访问服务的目的。

而Ingress则跳过了kube-proxy这一层,通过Ingress Controller中的代理配置进行路由转发达到访问目标服务的目的。实际上可以把IngressController看做一个拥有默认处理后端的代理,根据Ingress资源的配置动态修改代理的配置文件,以实现按照规则转发请求的功能。

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

02Ingress环境准备

下面ingress-nginx为类来部署ingress-controller,具体的部署步骤如下:

#创建一个目录,目录名可以随便起,这里命令为ingress-controller
[root@master ~]# mkdir ingress-controller
#下载mandatory.yaml和service-nodeport.yaml两个文件
#这里下载了现成的,所以就直接拷贝进去即可
#拷贝进去后,需要注意的是修改mandatory.yaml文件的镜像路径,具体如下:
#将原来的内容修改为以下内容,这个是国内的镜像地址
image: shichao01/nginx-ingress-controller:0.30.0
#再运行以下命令进行部署
[root@master ingress-controller]# kubectl apply -f ./
#部署完成后可以查看部署的结果
[root@master ingress-controller]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-75bd94bd9d-lhn2g 1/1 Running 0 131m
#再使用以下命令来查看ingress-nginx暴露的端口
[root@master ingress-controller]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
ingress-nginx NodePort 10.96.163.204 <none>
80:30223/TCP,443:32552/TCP 132m

下面构建一个deployment和一个service的清单,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx
namespace: test-ingress
spec:
strategy:
type: Recreate
replicas: 3
selector:
matchLabels:
app: ingress-nginx
template:
metadata:
labels:
app: ingress-nginx
spec:
containers:
- name: ingress-nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-nginx
namespace: test-ingress
spec:
selector:
app: ingress-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort

再执行下面的命令进行部署

[root@master ~]# kubectl apply -f ingress-nginx-test.yaml

03HTTP代理

实现请求暴露到http端口下,先需要配置ingress的规则,配置文件内容如下:

# ingress规则中,要指定需要绑定暴露的svc名称
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-http
namespace: test-ingress
spec:
rules: #定义路由规则
- host: nginx.chuansinfo.com # 主机名,只能是域名,修改为项目域名,但如果主机无法
解析到这个HOST,就会跳转到nginx主页,这样就会报404的错误,如果当报404错误时,就可以将这个选项
设置为空
http:
paths:
- path: /
backend:
serviceName: web-nginx # 后台部署的 Service Name
servicePort: 80 # 后台部署的 Service Port

使用以下命令来部署ingress-http.yaml文件

[root@master ~]# kubectl apply -f ingress-http.yaml

使用以下命令来查看刚创建的ingress-http

[root@master ~]# kubectl get ing ingress-http -n test-ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in
v1.22+; use networking.k8s.io/v1 Ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-http <none> nginx.chuansinfo.com 10.96.149.201 80 3m15s

使用下面命令可以看到详细情况

[root@master ~]# kubectl describe ing ingress-http -n test-ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in
v1.22+; use networking.k8s.io/v1 Ingress
Name: ingress-http
Namespace: ingress-nginx
Address: 10.96.149.201
Default backend: default-http-backend:80 (<error: endpoints "default-httpbackend"
not found>)
Rules:
Host Path Backends
---- ---- --------
nginx.chuansinfo.com
/ web-nginx:80
10.244.104.12:80,10.244.166.142:80,10.244.166.143:80)
Annotations: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 5m4s nginx-ingress-controller Ingress ingress-nginx/ingresshttp
Normal UPDATE 4m42s nginx-ingress-controller Ingress ingress-nginx/ingresshttp

再输入http://192.168.158.100:32451进行访问即可,192.168.158.100是master节点的IP地址.

04HTTS代理

1.生成自签名证书

[root@master ~]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -
keyout tls.key -out tls.crt -subj
"/CN=tomcat.test.com/ST=Chuansinfo/L=Chuansinfo/O=devops/OU=unicorn"
-req是证书请求的子命令
-newkey rsa:2048 -keyout tls.key -newkey是与-key互斥的
-newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,
-nodes 表示私钥不加密
-out 指定生成的证书请求或者自签名证书名称
-days 365 证书有效期
若执行自动输入,可使用-subj选项:
-subj——证书相关的用户信息(subject的缩写)
[root@master ~]# ls
always.yaml ingress-http.yaml never.yaml
quota-mem-cpu-pod.yaml
anaconda-ks.cfg ingress-nginx-test.yaml nginx-tomcat.yaml
quota-mem-cpu.yaml
calico.yaml ingress-tomcat-test.yaml onfailure.yaml
quota-pod.yaml
cpu-defaults-pod2.yaml memory-constraints-pod-2.yaml pod-hook-exec.yaml
service-clusterip.yaml
cpu-defaults-pod3.yaml memory-constraints-pod-3.yaml pod-nodeaffinitypreferred.
yaml service-nodeport.yaml
cpu-defaults-pod.yaml memory-constraints-pod-4.yaml pod-nodeaffinityrequired.
yaml service.yaml
cpu-default.yaml memory-constraints-pod.yaml pod-nodename.yaml
test-deployment.yaml
dashboard.yaml memory-constraints.yaml pod-nodeselector.yaml
test.txt
deployment-rolling.yaml memory-defaults-pod-2.yaml pod-podaffinityrequired.
yaml tls.crt
deployment.yaml memory-defaults-pod-3.yaml pod-podaffinitytarget.
yaml tls.key

2.将证书导入k8s的secret中,这里要指定namespace,否则ingress controller找不到证书

[root@master ~]# kubectl create secret tls tls-secret --key=tls.key --cert
tls.crt -n dev
secret/tls-secret created

创建成功后可以使用下面的命令查看secret的相关信息

[root@master ~]# kubectl describe secret tls-secret

3、再创建个ingress资源文件指定使用https,文件名为tomcat-ingress.yaml

主要就是添加了tls相关,域名还是不变的以及一个注解,并且引用了前面打入的证书

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-https
namespace: dev
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host:
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat-service
port:
number: 8080
tls:
- hosts:
- tomcat.test.com
secretName: tls-secret

输入https://tomcat.test.com:30725进行访问

需要注意的是端口要换成443对应的30725端口

至此,有关K8S的知识就分享到这里,希望大家能把这些技术掌握好,在工作上会有很大的帮助和提升

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
k8s安装ingress可以通过以下步骤进行: 1. 首先,确保你的kubernetes集群已经部署好并且正常运行。 2. 接下来,选择一种支持ingressingress controller。常见的选择有Nginx Ingress Controller和Traefik Ingress Controller。你可以根据自己的需求选择合适的controller。 3. 安装ingress controller。可以通过使用Helm进行安装,以下是使用Helm安装Nginx Ingress Controller的示例命令: ```shell helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm install my-ingress-nginx ingress-nginx/ingress-nginx ``` 如果你选择安装Traefik Ingress Controller,可以参考官方文档获取安装命令。 4. 等待ingress controller部署完成,并且确保所有相关的Pod已经正常运行。你可以使用以下命令检查相关的Pod状态: ```shell kubectl get pods -n <namespace> ``` 5. 配置ingress资源。创建一个ingress资源文件,并按照你的需求配置相应的规则和后端服务。以下是一个示例的ingress资源文件: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /foo pathType: Prefix backend: service: name: foo-service port: number: 80 - path: /bar pathType: Prefix backend: service: name: bar-service port: number: 80 ``` 在这个示例中,我们定义了两个路径规则,分别映射到名为foo-service和bar-service的后端服务。 6. 应用ingress资源。使用kubectl命令将ingress资源文件应用到你的kubernetes集群中: ```shell kubectl apply -f <ingress-resource-file.yaml> ``` 确保ingress资源已经成功创建: ```shell kubectl get ingress ``` 你应该能够看到刚刚创建的ingress资源。 7. 配置DNS解析。根据你的集群环境,可能需要配置DNS解析将域名指向ingress controller的IP地址。 完成上述步骤后,你的kubernetes集群就已经配置好了ingress。你可以通过访问指定的域名和路径来访问后端服务。请根据自己的实际情况进行调整和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值