“Ingress API对象用来管理集群中需要对外的HTTP/HTTPS服务,提供负载均衡,基于域名的虚拟主机,也为灰度发布提供支持。
”
介绍
默认服务不能在集群外部访问,如要将服务对外需要使用NodePort、LoadBalancer来实现。
Ingress[1]也是一种实现将服务提供外部访问的方式,并且支持基于域名的虚拟主机,不需要像LoadBalancer一样,每个服务需要申请一个独立的IP地址。
定义的Ingress对象,通过Ingress Controller[2](如nginx)监控API Server的变化,根据定义的对象自动生成相应的配置,并重载应用程序。
创建Ingress对象
创建基于域名的虚拟主机:
# 创建服务对象
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc-test
namespace: yau-test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat
sessionAffinity: None
type: ClusterIP
---
# 创建Ingress对象
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat-test
namespace: yau-test
spec:
rules:
- host: yau-test.yaukb.com
http:
paths:
- backend:
serviceName: tomcat-svc-test
servicePort: 80
path: /
通过Ingress指向到同一个Namespace的Service,通过域名访问即可访问到Service对应的Pod。
Ingress 网络原理
Ingress控制器安装好后,配置Service时,如在云上指定类型LoadBalancer会创建对应的SLB。
apiVersion: v1
kind: Service
metadata:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
labels:
app: nginx-ingress
name: nginx-ingress
namespace: kube-system
spec:
ports:
- name: http
nodePort: 30185
port: 80
protocol: TCP
targetPort: 80
- name: https
nodePort: 31488
port: 443
protocol: TCP
targetPort: 443
selector:
app: ingress-nginx
type: LoadBalancer
创建的SLB会自动配置好虚拟服务器组,映射到Ingress服务的NodePort端口。
在k8s集群上使用iptables或lvs将流量路由到后端的Ingress Controller。Nginx Ingress Controler针对该域名(yau-test.yaukb.com)的配置,使用lua进行配置的生成:
Upstream的配置使用Lua脚本进行处理:
Nginx Ingress Controller访问日志存储
默认访问日志是输出到标准输出,可以通过修改configmap来定义日志的输出路径,并将日志进行持久化。
修改configmap定义日志的路径:
# kubectl edit configmaps -n kube-system nginx-configuration
apiVersion: v1
data:
# 定义日志路径
access-log-path: /logs/nginx-ingress-controller/access.log
error-log-path: /logs/nginx-ingress-controller/error.log
...
定义Ingress Controller的Volume:
# kubectl edit deployments -n kube-system nginx-ingress-controller
...
volumeMounts:
- mountPath: /logs
name: app-logs
volumes:
- name: app-logs
persistentVolumeClaim:
claimName: pvc-nginx-ingress-logs
...
总结
通过Ingress可以将服务发布到外部系统,同时也方便配置的变更,支持多域名,SSL等。
Kubernetes Ingress: https://kubernetes.io/docs/concepts/services-networking/ingress/
[2]Ingress Controller: https://kubernetes.github.io/ingress-nginx/