k8s集群ingress碎碎念
比起君子讷于言而敏于行我更喜欢君子善于言且敏于行。目录前言一、Ingress 是什么二、Controller 是什么三、Ingress 的作用四、如何实现1. 安装 Ingress Controller2. 创建 Ingress 对象3. 高可用建议4. 外部访问总结前言ingress单独理解是好理解的k8s的service、hostnameNetwork单独理解也是好理解的排列组合用起来确实容易眼花缭乱。万变不离其宗那就以不变应万变叭~一、Ingress 是什么Ingress是 Kubernetes 的HTTP/HTTPS 层流量入口入口控制器它负责根据域名和路径将外部请求路由到集群内部的 Service。ServiceClusterIP / NodePort→ 解决了“找 Pod”的问题Ingress→ 解决了“找 Service 里的哪一个路径 / 域名”的问题Ingress 本身是一个K8s 对象 Controller的组合没 Controller 其实不能工作。二、Controller 是什么Ingress Controller 负责实现 Ingress 对象规则的实际服务1Ingress就是一个“路由清单”或者“路由计划表”告诉 Kubernetes“域名 myapp.example.com 的流量要送到哪个 Service”。2但是这个清单本身不会自动搬运流量。它只是一个对象存储在 Kubernetes 里。3Ingress Controller才是真正做路由的程序它会监听这个清单把流量送到对应的 Service。最常见的实现是nginx所以很多人说 Ingress Controller nginx三、Ingress 的作用Ingress 的主要作用有1.基于域名路由不同域名指向不同 Serviceeg: app1.example.com → Service app1app2.example.com → Service app22.基于路径路由同一个域名下不同路径指向不同 Serviceeg: /api → Service api/web → Service frontend3.TLS/HTTPS 终端Ingress 可以绑定证书为多个域名提供 HTTPS4.负载均衡应用层在 Service 之前Ingress Controller 可以做 Layer7 负载均衡5.跨集群/跨服务访问控制结合注解或中间件比如限流、白名单、重定向等四、如何实现1. 安装 Ingress ControllerIngress 本身只是对象需要 Controller 来真正路由流量。常见有NGINX Ingress ControllerTraefikHAProxy Ingress安装 NGINX Ingress Controller简化示例kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.14.0/deploy/static/provider/cloud/deploy.yaml2. 创建 Ingress 对象注意Ingress YAML里的端口 Service端口apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: default annotations: kubernetes.io/ingress.class: nginx spec: tls: - hosts: - myapp.example.com secretName: myapp-tls rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80host→ 域名路由paths→ 路径路由backend.service.name/port→ 指向内部 Service3. 高可用建议Ingress Controller 使用 Deployment/DaemonSetDaemonSet → 每个节点一个 Pod保证节点级别高可用Deployment → 多副本 Pod保证 Pod 高可用hostNetwork: true→ 如果要直接占用节点 80/443 端口4. 外部访问如果使用 NodePort 类型 Service Ingress Controller → 外部访问端口在 30000-32767。可以配置hostNetwork: true占用节点的80/443端口如果使用 hostNetwork DaemonSet → 外部可以直接访问节点的 80/443这种方式可以访问每个节点的ip:80/443。但是有url的话还是得前面再做一层nginx或者直接用ingress总结这里其实最让人乱七八糟的是端口ingress的yaml里面写的是service服务的端口。service的yaml里面写的是三个端口。port: 443 # Service 内部端口集群内部访问这个 Service 用 443targetPort: 443 # Pod 的端口Service 转发到 Pod 444nodePort: 32443 # 节点上暴露的端口外部访问节点IP:32443也能访问 Pod