一、Ingress知识
1.ingress是什么
把外部请求(如浏览器访问)转发到集群内部服务的入口
2.为什么service可以访问还得需要域名
1.端口太多 难以管理记忆 用域名可以用域名路由区分
2.ingress可以用https
3.负载均衡: 把流量路由到不同的service(通过路由)
灰度发布:新旧版本按比例分流(ingress Controller)
限流:也是通过ingressController
3.ingress和nginx的区别
nginx是干活的小弟
ingress是任务清单
nginx ingress controller 是小弟拿着清单干活(nginx实现ingress规则)
4.ingress的工作原理是什么
1.ingress声明规则,ingressController读取规则
2.ingressController读取到规则以后,把外部请求转发到对应的service
3.service将请求分发给pod
5.我需要单独部署ingressController吗
需要,没有ingress Controller,创建了ingress 也不会有请求路由到servcie
常见的ingress Controller
1.nginx ingress Controller : 简单稳定,用nginx实现ingress的功能
2.traefik :自动识别服务变化,支持更多协议,配置灵活
3.istio gateway:istio控制流量的边界入口,支持策略 安全 遥测等
6,如何部署ingress Controller
直接 # 部署 Nginx Ingress Controller
kubectl apply -f raw.githubusercontent.com/kubernetes/…
二、ingress部署实践
1.部署ingressController
kubectl apply -f raw.githubusercontent.com/kubernetes/…
确认Controller 正常运行:kubectl get pods -n ingress-nginx
2.创建Deployment+Service
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deploy
spec:
replicas: 2
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: hashicorp/http-echo
args:
- "-text=Hello World"
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- port: 80
targetPort: 5678
3.创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: hello.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
4.执行命令
kubectl apply -f hello.yaml
kubectl get svc hello-service
kubectl apply -f hello-ingress.yaml
kubectl get ingress
5.测试
1.本地测试,可以在 /etc/hosts 添加:
<ingress-controller-ip> hello.local
2.浏览器访问 hello.local,应该看到:Hello World