kubernetes系列(十) - 通过Ingress实现七层代理

  • 1. Ingress入门
    • 1.1 Ingress简介
    • 1.2 原理和组成部分
    • 1.3 资料信息
  • 2. Ingress部署的几种方式
    • 2.1 前言
    • 2.1 Deployment+LoadBalancer模式的Service
    • 2.2 Deployment+NodePort模式的Service
    • 2.3 DaemonSet+HostNetwork+nodeSelector
  • 3. Deployment+NodePort模式
    • 3.1. 官网下载yaml,安装ingress-nginx
    • 3.2. 创建deployment和service
    • 3.3 创建https证书的secret
    • 3.4. 创建ingress策略
    • 3.5 查看ingress-controller的nodeport端口,并访问

1. Ingress入门

1.1 Ingress简介

kubernetes自带的service概念只有四层代理,即表现形式为IP:Port.

如果需要实现七层代理,即绑定到域名的话,则需要另一个了,即ingress api

  • 官方在v1.11推出了ingress api接口,既而达到七层代理的效果
  • 对于ingress来说,必须要绑定一个域名

1.2 原理和组成部分

Ingress可以理解为Service的Service。它由两部分组成

  1. Ingress Controller
    • 这是一个标准,可以有很多实现,其中ingress-nginx是最常用的
    • 以pod形式运行的
  2. Ingress策略设置
    • 以yaml形式为载体的一组声明式的策略
    • ingress-controller会动态地按照策略生成配置文件(如:nginx.conf)

1.3 资料信息

  1. Ingress-Nginx github repo

https://github.com/kubernetes/ingress-nginx

  1. Ingress-Nginx官方网站

https://kubernetes.github.io/ingress-nginx

2. Ingress部署的几种方式

2.1 前言

ingress的部署,需要考虑两个方面:

  1. ingress-controller是作为pod来运行的,那么以什么方式部署比较好?
  2. ingress解决了把如何请求路由到集群内部,那它自己怎么暴露给外部比较好?

下面列举一些目前常见的部署和暴露方式,具体使用哪种方式还是得根据实际需求来考虑决定。


2.1 Deployment+LoadBalancer模式的Service

如果要把ingress部署在公有云,那可以选择这种方式。用Deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。

需要额外购买公有云的服务!

kubernetes系列(十) - 通过Ingress实现七层代理_第1张图片


2.2 Deployment+NodePort模式的Service

同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。

缺点

  • NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。
  • 请求节点会是类似https://www.xx.com:30076,其中30076kubectl get svc -n ingress-nginx的svc暴露出来的nodeport端口

kubernetes系列(十) - 通过Ingress实现七层代理_第2张图片


2.3 DaemonSet+HostNetwork+nodeSelector

DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器

优点

  • 该方式整个请求链路最简单,性能相对NodePort模式更好

缺点

  • 由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod

kubernetes系列(十) - 通过Ingress实现七层代理_第3张图片

3. Deployment+NodePort模式

3.1. 官网下载yaml,安装ingress-nginx

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml

3.2. 创建deployment和service

  • 这里service定义为clusterip
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tocgenerator-deploy
  namespace: default
  labels:
    app: tocgenerator-deploy
spec:
  replicas: 2
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: tocgenerator-server
  template:
    metadata:
      labels:
        app: tocgenerator-server
    spec:
      containers:        
        - name: tocgenerator
          image: lzw5399/tocgenerator:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: tocgenerator-svc
spec:
  selector:
    app: tocgenerator-server
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

3.3 创建https证书的secret

  • 方式1:直接指定文件创建
kubectl create secret tls mywebsite-secret --key tls.key --cert tls.crt
  • 方式2: 以yaml资源清单方式创建
apiVersion: v1
kind: Secret
metadata:
  name: mywebsite-secret
data:
  tls.crt: **************************
  tls.key: **************************

3.4. 创建ingress策略

  • ingress策略必须和service同一个namespace
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tocgenerator-ingress
spec:
  tls:
    - hosts:
      - toc.codepie.fun
      secretName: toc-secret
  rules:
    - host: toc.codepie.fun
      http:
        paths:
          - path: /
            backend:
              serviceName: tocgenerator-svc
              servicePort: 80

3.5 查看ingress-controller的nodeport端口,并访问

  1. 查看ingress-controller的nodeport端口
$ kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.104.80.142           80:30122/TCP,443:30577/TCP   21h
  1. 访问
https://toc.codepie.fun:30577

你可能感兴趣的:(kubernetes系列(十) - 通过Ingress实现七层代理)