K8S中Ingress的使用
1. Ingress的介绍
1.1 Pod 的漂移
Kubernetes 具有强大的副本控制能力,能保证在任意副本(Pod)挂掉时自动从其他机器启动一个新 的,还可以动态扩容等,通俗地说,这个 Pod 可能在任何时刻出现在任何节点上,也可能在任何时刻死 在任何节点上;那么自然随着 Pod 的创建和销毁,Pod IP 肯定会动态变化;那么如何把这个动态的 Pod IP 暴露出去?这里借助于 Kubernetes 的 Service 机制,Service 可以以标签的形式选定一组带有指定标签的 Pod,并监控和自动负载他们的 Pod IP,那么我们向外暴露只暴露 Service IP 就行了;这就是 NodePort 模式:即在每个节点上开起一个端口,然后转发到内部 Pod IP 上。
客户端请求-->node 节点的 ip:端口--->service 的 ip:端口--->pod 的 ip:端口
1.2 Ingress 介绍
Ingress 官网定义:Ingress 可以把进入到集群内部的请求转发到集群中的一些服务上,从而可以把服务映射到集群外部。Ingress 能把集群内 Service 配置成外网能够访问的 URL,流量负载均衡,提供基于 域名访问的虚拟主机等。
1.3 Ingress Controller 介绍
Ingress Controller 是一个七层负载均衡调度器,客户端的请求先到达这个七层负载均衡调度器,由七层 负载均衡器在反向代理到后端 pod,常见的七层负载均衡器有 nginx、traefik,以我们熟悉的 nginx 为 例,假如请求到达 nginx,会通过 upstream 反向代理到后端 pod 应用,但是后端 pod 的 ip 地址是一 直在变化的,因此在后端 pod 前需要加一个 service,这个 service 只是起到分组的作用,那么我们 upstream 只需要填写 service 地址即可。
1.4 Ingress 和 Ingress Controller 总结
Ingress Controller 可以理解为控制器,它通过不断的跟 Kubernetes API 交互,实时获取后端 Service、Pod 的变化,比如新增、删除等,结合 Ingress 定义的规则生成配置,然后动态更新上边的 Nginx 或者 trafik 负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。
Ingress 则是定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。它可以通过 Yaml 文件定义,可以给一个或多个 Service 定义一个或多个 Ingress 规则。
2. Ingress 完整实战指南
2.1 获取官方部署文件
https://github.com/kubernetes/ingress-nginx/releases
## 获取文件 我这里的文件版本是 1.5.1
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/baremetal/deploy.yaml
2.2 部署前修改YAML文件
## 1. 这里我修改了nodePort的端口范围,在command的字段下面添加如下参数
[root@k8s-master /etc/kubernetes/manifests]# grep service-node-port kube-apiserver.yaml- --service-node-port-range=80-32767
## 2. 重启kube-apiserver## 下载的 deploy.yaml 包含完整的 RBAC、Deployment 等配置。默认使用 LoadBalancer 类型 Service,需要改为 NodePort.
...
---
apiVersion: v1
kind: Service
metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/component: controllername: ingress-nginx-controllernamespace: ingress-nginx
spec:type: NodePortports:- name: httpport: 80protocol: TCPtargetPort: httpnodePort: 80- name: httpsport: 443protocol: TCPtargetPort: httpsnodePort: 443selector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/component: controller
...
---
2.3 部署controller
# 1. 直接应用部署后的yaml文件
[root@k8s-master /manifests/ingress]# kubectl apply -f deployment.yaml
# 2. 查看pod状态
[root@k8s-master /manifests/ingress]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-89769d8f9-kjcsg 1/1 Running 0 32m# 3. 检查 service
[root@k8s-master /manifests/ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.200.132.122 <none> 80:80/TCP,443:443/TCP 33m# 4. 查看 controller 日志
[root@k8s-master /manifests/ingress]# kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -f
3. 创建测试应用
3.1 部署应用v1
[root@k8s-master /manifests/ingress]# cat tomcat-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: ingress-tomcat
spec:replicas: 2selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: 192.168.0.77:32237/library/tomcat:alpine ports:- name: httpcontainerPort: 8080name: ajpcontainerPort: 8009---
apiVersion: v1
kind: Service
metadata:name: service-tomcat
spec:selector:app: tomcatports:- name: httptargetPort: 8080port: 8080- name: ajptargetPort: 8009port: 8009## 检查 pod 和 service
[root@k8s-master /manifests/ingress]# kubectl get pod,svc
4. 核心ingress的配置
4.1 基础单路由配置
[root@k8s-master /manifests/ingress]# cat ingress-basic.yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: tomcat
spec:controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: basic-ingressnamespace: default
spec:## ingressClassName 要一直ingressClassName: tomcat ## 定义后端转发的规则rules:## #通过域名进行转发 - host: tomcat.lucky.comhttp:paths:- path: /pathType: Prefix## 配置后端服务 backend:## service的名称要一直service:name: service-tomcat port:number: 8080## 检查ingress
[root@k8s-master /manifests/ingress]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
basic-ingress tomcat tomcat.lucky.com 192.168.0.162 80 7m11s[root@k8s-master /manifests/ingress]# kubectl describe ingress basic-ingress
4.2 访问
--- 1. 在window的电脑上修改hosts文件:
C:\
Windows\System32\drivers\etc
--- 2. 管理员打开hosts 文件,增加一下内容
192.168.0.162 tomcat.lucky.com--- 3. 浏览器域名访问
4.3 Ingress 的https代理配置
--- 1. 创建自签证书(测试用)
[root@k8s-master /manifests/ingress]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=tomcat.lucky.com"--- 2. 创建 Secret
[root@k8s-master /manifests/ingress]# kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key --namespace=default-- 3. 查看
[root@k8s-master /manifests/ingress]# kubectl describe secret tomcat-ingress-secret--- 4. 修改yaml文件
[root@k8s-master /manifests/ingress]# cat ingress-basic-tls.yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: tomcat
spec:controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: basic-ingressnamespace: default
spec:ingressClassName: tomcat ## 添加tls信息tls:- hosts:- tomcat.lucky.com## secret 名称secretName: tomcat-ingress-secretrules:- host: tomcat.lucky.comhttp:paths:- path: /pathType: Prefixbackend:service:name: service-tomcat port:number: 8080
--- 4. 浏览器通过https的方式访问
如果想详细了解更多知识的小伙伴可以参考我的个人博客:
https://xingzhibang.top/
