k8s设置Ingress统⼀访问⼊⼝
Ingress 统⼀访问⼊⼝
1、术语
节点: Kubernetes 集中的服务器
集: Kubernetes 管理的⼀组服务器集合
边界路由器:为局域⽹和 Internet 路由数据包的路由器,执⾏防⽕墙保护局域⽹络
集⽹络:遵循 Kubernetes ⽹络模型实现集内的通信的具体实现,⽐如 Flannel 和 Calico
服务: Kubernetes 的服务 (Service) 是使⽤标签选择器标识的⼀组 Pod Service (Deployment)。除⾮另有说明,否则服务的虚拟 IP 仅可在集内部访问
2、内部访问⽅式 ClusterIP
ClusterIP 服务是 Kubernetes 的默认服务。它给你⼀个集内的服务,集内的其它应⽤都可以访问该服务。集外部⽆法访问它。在某些场景下我们可以使⽤ Kubernetes 的 Proxy 模式来访问服务,⽐如
调试服务时。
3、三种外部访问⽅式
a、NodePort
NodePort 服务是引导外部流量到你的服务的最原始⽅式。NodePort,正如这个名字所⽰,在所有节点(虚拟机)上开放⼀个特定端⼝,任何发送到该端⼝的流量都被转发到对应服务。
NodePort 服务特征如下:
每个端⼝只能是⼀种服务
端⼝范围只能是 30000-32767(可调)
不在 YAML 配置⽂件中指定则会分配⼀个默认端⼝
建议:不要在⽣产环境中使⽤这种⽅式暴露服务,⼤多数时候我们应该让 Kubernetes 来选择端⼝
b、LoadBalancer
LoadBalancer 服务是暴露服务到 Internet 的标准⽅式。所有通往你指定的端⼝的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你⼏乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,WebSocket,gRPC 或其它任意种类。
c、Ingress
Ingress 事实上不是⼀种服务类型。相反,它处于多个服务的前端,扮演着 “智能路由” 或者集⼊⼝的⾓⾊。你可以⽤ Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能⼒。它允许你基于路径或者⼦域名来路由流量到后端服务。
Ingress 可能是暴露服务的最强⼤⽅式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer,
Nginx,Contour,Istio,等等。它还有各种插件,⽐如 cert-manager (它可以为你的服务⾃动提供 SSL 证书)/
如果你想要使⽤同⼀个 IP 暴露多个服务,这些服务都是使⽤相同的七层协议(典型如 HTTP),你还可以获取各种开箱即⽤的特性(⽐如SSL、认证、路由等等)
4、什么是 Ingress
通常情况下,Service 和 Pod 的 IP 仅可在集内部访问。集外部的请求需要通过负载均衡转发到 Service 在 Node 上暴露的 NodePort 上,然后再由 kube-proxy 通过边缘路由器 (edge router) 将其转发给相关的 Pod 或者丢弃。⽽ Ingress 就是为进⼊集的请求提供路由规则的集合
Ingress 可以给 Service 提供集外部访问的 URL、负载均衡、SSL 终⽌、HTTP 路由等。为了配置这些 Ingress 规则,集管理员需要部署⼀个 Ingress Controller,它监听 Ingress 和 Service 的变化,并根据规则配置负载均衡并提供访问⼊⼝。
5、使⽤ Nginx Ingress Controller
本次实践的主要⽬的就是将⼊⼝统⼀,不再通过 LoadBalancer 等⽅式将端⼝暴露出来,⽽是使⽤ Ingress 提供的反向代理负载均衡功能作为我们的唯⼀⼊⼝。通过以下步骤操作仔细体会。
注意:下⾯包含资源配置的步骤都是⾃⾏创建 YAML 配置⽂件通过kubectl create -f <YAML>和kubectl delete -f <YAML>部署和删除a、部署 Tomcat
部署 Tomcat 但仅允许在内⽹访问,我们要通过 Ingress 提供的反向代理功能路由到 Tomcat 之上
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-app
spec:
replicas: 2
template:
metadata:
labels:
name: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-http
spec:
ports:
- port: 8080
targetPort: 8080
# ClusterIP, NodePort, LoadBalancer
type: LoadBalancer
selector:
name: tomcat
b、安装 Nginx Ingress Controller
Ingress Controller 有许多种,我们选择最熟悉的 Nginx 来处理请求,其它可以参考
下载 Nginx Ingress Controller 配置⽂件
wget raw.githubusercontent/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
修改配置⽂件,到配置如下位置 (搜索serviceAccountName) 在下⾯增加⼀句hostNetwork: true
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
# 可以部署多个实例
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:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
serviceAccountName: nginx-ingress-serviceaccount
# 增加 hostNetwork: true,意思是开启主机⽹络模式,暴露 Nginx 服务端⼝ 80
hostNetwork: true
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
-
--udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
// 以下代码省略...
c、部署 Ingress
Ingress 翻译过来是⼊⼝的意思,说⽩了就是个 API ⽹关(想想之前学的 Zuul 和 Spring Cloud Gateway)
nginx ssl证书配置apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-web
annotations:
# 指定 Ingress Controller 的类型
kubernetes.io/ingress.class: "nginx"
# 指定我们的 rules 的 path 可以使⽤正则表达式
nginx.ingress.kubernetes.io/use-regex: "true"
# 连接超时时间,默认为 5s
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
# 后端服务器回转数据超时时间,默认为 60s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
# 后端服务器响应超时时间,默认为 60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
# 客户端上传⽂件,最⼤⼤⼩,默认为 20m
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
# URL 重写
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# 路由规则
rules:
# 主机名,只能是域名,修改为你⾃⼰的
- host: st
http:
paths:
- path:
backend:
# 后台部署的 Service Name,与上⾯部署的 Tomcat 对应
serviceName: tomcat-http
# 后台部署的 Service Port,与上⾯部署的 Tomcat 对应
servicePort: 8080
6、验证是否成功
a、查看 Tomcat
kubectl get deployment
# 输出如下
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat-app 2/2 2 2 88m
kubectl get service
# 输出如下
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h
tomcat-http ClusterIP 10.97.222.179 <none> 8080/TCP 89m
b、查看 Nginx Ingress Controller
kubectl get pods -n ingress-nginx -o wide
# 输出如下,注意下⾯的 IP 地址,就是我们实际访问地址
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ingress-controller-76f9fddcf8-vzkm5 1/1 Running 0 61m 192.168.141.160 kubernetes-node-01 <none> <none>
c、查看 Ingress
kubectl get ingress
# 输出如下
NAME HOSTS ADDRESS PORTS AGE
nginx-web st 80 61m
d、测试访问
成功代理到 Tomcat 即表⽰成功
# 不设置 Hosts 的⽅式请求地址,下⾯的 IP 和 Host 均在上⾯有配置 curl -v 192.168.141.160 -H 'host: st'
转⾃:有梦想的咸鱼
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论