Ingress实战

1、概述

Ingress

Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 经过 HTTP/HTTPS 方式暴露到集群外部,并经过规则定义 HTTP/HTTPS 的路由。Ingress 具有以下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。html

Ingress Controller (一般须要负载均衡器配合)负责实现 Ingress API 对象所声明的能力。以下图所示:node

  1. Ingress Controller 监听全部 worker 节点上的 80/443 端口
  2. Ingress Controller 将全部对域名为 a.kuboard.cn 的 HTTP/HTTPS 请求路由到 Service B 的 9080 端口
  3. Service B 将请求进一步转发到其标签所选择的 Pod 容器组(经过 targetPort 指定容器组上的端口号)

该图中,请求被转发的过程为:nginx

  1. 假设您将 a.kuboard.cn 的 DNS 解析到了集群中的一个 worker 节点的 IP 地址 192.168.2.69。(若是您的 worker 节点有外网地址,请使用外网地址,这样您能够从外网访问您的服务)
  2. 从客户端机器执行命令 curl http://a.kuboard.cn/abc/,该请求您将被转发到 192.168.2.69 这个地址的 80 端口,并被 Ingress Controller 接收
  3. Ingress Controller 根据请求的域名 a.kuboard.cn 和路径 abc 匹配集群中全部的 Ingress 信息,并最终找到 Ingress B 中有这个配置,其对应的 Service 为 Service B 的 9080 端口
  4. Ingress Controller 经过 kube-proxy 将请求转发到 Service B 对应的任意一个 Pod 上 与 Service B 的 9080 端口对应的容器端口上。(从 Ingress Controller 到 Pod 的负载均衡由 kube-proxy + Service 实现)

 

Ingress Controller

如上所述,您必须在 Kubernetes 集群中安装了 Ingress Controller,您配置的 Ingress 才能生效。git

划重点 Ingress 只是 Kubernetes 中的一种配置信息;Ingress Controller 才是监听 80/443 端口,并根据 Ingress 上配置的路由信息执行 HTTP 路由转发的组件。

Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文档 Additional controllers,比较经常使用的有 Traefic 、 Nginx Ingress Controller for Kubernetes 等。github

若是您参考 https://kuboard.cn 网站上提供的文档安装了 Kubernetes,您应该已经完成了 Nginx Ingress Controller for Kubernetes 在您 Kubernetes 集群中的安装。该 Ingress Controller 以 DaemonSet 的类型部署到 Kubernetes,且监听了 hostPort 80/443docker

 

2、安装Ingress Controller

环境介绍

系统 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 节点上执行flask

kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml

配置域名解析windows

将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也能够是 demo-worker-a-1 的地址 y.y.y.y)centos

验证配置api

在浏览器访问 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

相关文章
相关标签/搜索