Ingress实战
Ingress
Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。
Ingress Controller (通常需要负载均衡器配合)负责实现 Ingress API 对象所声明的能力。如下图所示:
Ingress Controller 监听所有 worker 节点上的 80/443 端口
Ingress Controller 将所有对域名为 a.kuboard.cn 的 HTTP/HTTPS 请求路由到 Service B 的 9080 端口
Service B 将请求进一步转发到其标签所选择的 Pod 容器组(通过 targetPort 指定容器组上的端口号)
该图中,请求被转发的过程为:
假设您将 a.kuboard.cn 的 DNS 解析到了集群中的一个 worker 节点的 IP 地址
192.168.2.69
。(如果您的 worker 节点有外网地址,请使用外网地址,这样您可以从外网访问您的服务)从客户端机器执行命令
curl http://a.kuboard.cn/abc/
,该请求您将被转发到192.168.2.69
这个地址的 80 端口,并被 Ingress Controller 接收Ingress Controller 根据请求的域名
a.kuboard.cn
和路径abc
匹配集群中所有的 Ingress 信息,并最终找到Ingress B
中有这个配置,其对应的 Service 为Service B
的9080
端口Ingress Controller 通过 kube-proxy 将请求转发到
Service B
对应的任意一个 Pod 上 与Service B
的9080
端口对应的容器端口上。(从 Ingress Controller 到 Pod 的负载均衡由 kube-proxy + Service 实现)
Ingress Controller
如上所述,您必须在 Kubernetes 集群中安装了 Ingress Controller,您配置的 Ingress 才能生效。
划重点
Ingress 只是 Kubernetes 中的一种配置信息;Ingress Controller 才是监听 80/443 端口,并根据 Ingress 上配置的路由信息执行 HTTP 路由转发的组件。
Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文档 Additional controllers,比较常用的有 Traefic 、 Nginx Ingress Controller for Kubernetes 等。
如果您参考 https://kuboard.cn 网站上提供的文档安装了 Kubernetes,您应该已经完成了 Nginx Ingress Controller for Kubernetes 在您 Kubernetes 集群中的安装。该 Ingress Controller 以 DaemonSet 的类型部署到 Kubernetes,且监听了 hostPort 80/443
环境介绍
系统 | docker | ip | 主机名 | 配置 |
---|---|---|---|---|
centos 7.6 | 19.03.5 | 192.168.31.150 | k8s-master | 2核4G |
centos 7.6 | 19.03.5 | 192.168.31.183 | k8s-node01 | 2核4G |
centos 7.6 | 19.03.5 | 192.168.31.178 | k8s-node02 | 2核4G |
安装
在 master 节点上执行
kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml
配置域名解析
将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)
验证配置
在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面
发布应用
应用yaml
这里以flaskapp为例
vi flaskapp.yaml
内容如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
k8s.eip.work/displayName: flaskapp
k8s.eip.work/ingress: 'false'
k8s.eip.work/service: ClusterIP
k8s.eip.work/workload: svc-flaskapp
labels:
k8s.eip.work/layer: svc
k8s.eip.work/name: svc-flaskapp
name: svc-flaskapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
k8s.eip.work/layer: svc
k8s.eip.work/name: svc-flaskapp
template:
metadata:
labels:
k8s.eip.work/layer: svc
k8s.eip.work/name: svc-flaskapp
spec:
containers:
-
image: jcdemo/flaskapp
imagePullPolicy: Always
name: flaskapp
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
annotations:
k8s.eip.work/displayName: flaskapp
k8s.eip.work/workload: svc-flaskapp
labels:
k8s.eip.work/layer: svc
k8s.eip.work/name: svc-flaskapp
name: svc-flaskapp
namespace: default
spec:
ports:
- name: wjaz2a
nodePort: 0
port: 5000
protocol: TCP
targetPort: 5000
selector:
k8s.eip.work/layer: svc
k8s.eip.work/name: svc-flaskapp
type: ClusterIP
注意:此段yaml内容,使用Kuboard生成的,创建工作负载,可以预览yaml文件。
关于Kuboard的使用,请参考链接:
https://www.cnblogs.com/xiao987334176/p/12060855.html
ingress yaml
vi flaskapp-ingress.yaml
内容如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: svc-flaskapp
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: flaskapp.baidu.com
http:
paths:
- path:
backend:
serviceName: svc-flaskapp
servicePort: 5000
注意: Kuboard也可以生成ingress,但是有bug,外部无法访问。
因此这段,我是手动编写的。注意修改上面的红色文字。
执行yaml
kubectl apply -f flaskapp.yaml
kubectl apply -f flaskapp-ingress.yaml
查看pod
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
svc-flaskapp-774c665d-c42ft 1/1 Running 0 113m 10.244.58.194 k8s-node02 <none> <none>
查看svc
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 56d
svc-flaskapp ClusterIP 10.1.116.148 <none> 5000/TCP 123m
查看ingresses
# kubectl get ingresses.extensions
NAME HOSTS ADDRESS PORTS AGE
svc-flaskapp flaskapp.baidu.com 80 106m
设置域名解析
如果没有dns,修改windows 10的hosts,添加一条记录
192.168.31.164 flaskapp.baidu.com
注意:解析到任意node节点都可以!
访问页面
http://flaskapp.baidu.com/
效果如下:
本文参考链接:
https://www.kuboard.cn/learning/k8s-intermediate/service/ingress.html#ingress
https://www.kuboard.cn/install/install-k8s.html#%E5%AE%89%E8%A3%85-ingress-controller
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341