理论
Ingress 解决什么问题
- 动态配置服务
如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要额外的操作。
- 减少暴露不必要端口
配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式
Ingress 工作原理
- ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,
- 然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置
- 再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中
- 然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。
Ingress网站:
https://github.com/kubernetes/ingress-nginx
https://kubernetes.github.io/ingress-nginx/
示例
提示:使用vim创建yaml并运行,否则,复制可能导致格式错误。
1、 创建2个Deployment
第一个: nginx镜像,replicas:3
vim deploy1.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: deploy1
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
第二个: httpd镜像,replicas:4
vim deploy2.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: deploy2
spec:
selector:
matchLabels:
app: httpd
replicas: 4
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: IfNotPresent
2、 创建2个SVC资源,
第一个和第一个Deploy绑定
vim svc1.yaml
kind: Service
apiVersion: v1
metadata:
name: svc1
spec:
selector:
app: nginx