Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。
Ingress Controller (通常需要负载均衡器配合)负责实现 Ingress API 对象所声明的能力。如下图所示:
该图中,请求被转发的过程为:
192.168.2.69
。(如果您的 worker 节点有外网地址,请使用外网地址,这样您可以从外网访问您的服务)curl http://a.kuboard.cn/abc/
,该请求您将被转发到 192.168.2.69
这个地址的 80 端口,并被 Ingress Controller 接收a.kuboard.cn
和路径 abc
匹配集群中所有的 Ingress 信息,并最终找到 Ingress B
中有这个配置,其对应的 Service 为 Service B
的 9080
端口Service B
对应的任意一个 Pod 上 与 Service B
的 9080
端口对应的容器端口上。(从 Ingress Controller 到 Pod 的负载均衡由 kube-proxy + Service 实现).assets/image-20190910222649193.d809a7d7.png)
如上所述,您必须在 Kubernetes 集群中安装了 Ingress Controller,您配置的 Ingress 才能生效。
划重点
Ingress 只是 Kubernetes 中的一种配置信息;Ingress Controller 才是监听 80/443 端口,并根据 Ingress 上配置的路由信息执行 HTTP 路由转发的组件。
Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文档 Additional controllers
,比较常用的有 Nginx Ingress Controller for Kubernetes
等。
如果您参考 https://kuboard.cn 网站上提供的文档安装了 Kubernetes,您应该已经完成了 Nginx Ingress Controller for Kubernetes
在您 Kubernetes 集群中的安装。该 Ingress Controller 以 DaemonSet 的类型部署到 Kubernetes,且监听了 hostPort 80/443,YAML 片段如下所示:
如果您打算使用其他 Ingress Controller,您可以 卸载 Nginx Ingress Controller;如果您尚未安装任何 Ingress Controller,请参考 安装 Nginx Ingress Controller,以便可以完成本教程的后续内容。
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ingress
namespace: nginx-ingress
# ...
spec:
selector:
matchLabels:
app: nginx-ingress
template:
metadata:
labels:
app: nginx-ingress
spec:
serviceAccountName: nginx-ingress
containers:
- image: nginx/nginx-ingress:1.5.3
name: nginx-ingress
ports:
- name: http
containerPort: 80
hostPort: 80
- name: https
containerPort: 443
hostPort: 443
TIP
如前所述,Kubernetes Ingress 只能监听到节点的 80/443 端口,且 Ingress 可以完成 L7 路由的功能。由于 Kubernetes Ingress 配置更便捷,推荐使用 Kubernetes Ingress 替代常规的互联网应用架构中的 Nginx 反向代理。那么,如何使部署在内网的 Kubernetes 集群上的 Ingress Controller 的 80/443 端口可以在外网访问到呢?
本教程推荐如下两种做法,结合您自己对安全性、可靠性等因素的考量,您可以演化出适合自己的拓扑结构。
如下图所示,暴露单个 worker 节点的步骤如下:
a.demo.kuboard.cn
)解析到该外网 IP 地址 Z.Z.Z.Z文档 安装 Kubernetes 单Master节点 中使用的就是这种拓扑结构。这种方式下,Ingress Controller 存在单点故障的可能性。
.assets/k8s.png)
如下图所示,使用外部负载均衡器的步骤如下:
a.demo.kuboard.cn
)解析到该负载均衡器的外网 IP 地址 Z.Z.Z.Z文档 安装 Kubernetes 高可用 中使用的就是这种拓扑结构。
.assets/kubernetes.png)
前提
假设您已经完成了 公布应用程序 中的实战部分
假设您已经将 Ingress 融入到您的网络拓扑中,并且将 *.demo.kuboard.cn
(请使用您自己的域名)解析到对应的外网 IP 地址
创建文件 nginx-deployment.yaml
vim nginx-deployment.yaml
文件内容如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
创建文件 nginx-service.yaml
vim nginx-service.yaml
文件内容如下
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- name: nginx-port
protocol: TCP
port: 80
nodePort: 32600
targetPort: 80
type: NodePort
创建文件 nginx-ingress.yaml
vim nginx-ingress.yaml
文件内容如下
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx # Ingress 的名字,仅用于标识
spec:
rules: # Ingress 中定义 L7 路由规则
- host: a.demo.kuboard.cn # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
servicePort: 80
执行命令
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml
检查执行结果
kubectl get ingress -o wide
可查看到名称为 my-ingress-for-nginx 的 Ingress。
从互联网访问
# 请使用您自己的域名
curl a.demo.kuboard.cn
原文:https://www.cnblogs.com/sanduzxcvbnm/p/13038059.html