为啥需要ingrss

k8s默认的服务请求是service
service 是 k8s 暴露http服务的默认方式, 其中 NodePort 类型可以将http 服务暴露在宿主机的端口上,以便外部可以访问。 service模式的结构如下
image.png
client->service->pod

service的优点

结构简单, 容易理解。

service的缺点

  1. 一个app 需要占用一个主机端口
  2. 端口缺乏管理
  3. L4转发, 无法根据http header 和 path 进行路由转发

而ingress的模式就是在service 之前加了一层ingress,结构如下
image.png
client-> ingress -> service -> pod

ingress的优点

  1. 增加了7层的识别能力,可以根据 http header, path 进行路由转发
  2. 实现了后端服务代理

    ingress缺点

  3. 复杂度提升

    理解Ingress 实现

    Ingress 的实现分为两个部分 Ingress Controller 和 Ingress

  4. Ingress Controller 是流量的入口,是一个实体软件, 一般是Nginx 和 Haproxy 。

  5. Ingress 描述具体的路由规则。

Ingress Controller 会监听 api server上的 /ingresses 资源 并实时生效。
Ingerss 描述了一个或者多个 域名的路由规则,以 ingress 资源的形式存在。
简单说: Ingress 描述路由规则, Ingress Controller 实时实现规则。

搭建 nginx Ingress Controller

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

image.png
执行官方命令

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

deploy.yaml

image是quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
链接: https://pan.baidu.com/s/1v-l6-wfjGElLCG3y0N3e9A 提取码: 6j77

 docker  load -i nginx-ingress-v32.tar.gz

查看安装是否成功

kubectl get pod -n ingress-nginx
kubectl get svc -n ingress-nginx

image.png

建立ingrss

Ingress Controller 创建完成后,就可以按照需求建立ingress了,建立ingress的前提是,有了service服务才行。准备一套完整的yaml文件

cat > nginx-ingress.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations: 
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: nginx.k8s.com
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80
EOF

image.png

查看ingress

image.png

curl -H 'Host:nginx.k8s.com' http://master01:30461

image.png