Kubernetes 1.2 中利用 Ingress 简化复杂网络
原文:Kubernetes 1.2 and simplifying advanced networking with Ingress
在 Kubernetes 中,服务和 Pod 的 IP 地址缺省只能被集群网络路由。所有边缘路由器传来的流量要么被丢弃,要么被转向。在 Kubernetes 中,我们对 Ingress 对象做了改进,用于简化传入连接进入集群服务的过程。对其进行配置,能够给服务外部可达的 URL,负载均衡,Terminate SSL,提供具名虚拟主机等大量功能。
Ingress Controller
如今,受容器或者虚拟机的影响,对 Web 服务器或者负载均衡的配置变得麻烦了。多数的 Web 服务器配置文件很像。虽说有些应用有些古怪,但是总的说来还是可以通过一些逻辑来达到目的的。在 Kuberntes 1.2 中,Ingress 实现了这些想法,Ingress 控制器就是用于处理这些特别的 Ingress “类” (可能是负载均衡的一个实例,或者复杂一些的提供 GSLB、CDN、DDoS 保护等功能的前端)中的这些个性的东西。Ingress Controller 是一个守护进程,以 Kuberntes Pod 的形式进行部署,他会监控 API 服务的 /ingress 终结点来获取对 Ingress 资源 的更新。他的任务就是实现 Ingress 请求。
为了运行下面的例子,你的 Kubternetes 集群必须仅有一个支持 TLS 的 Ingress 控制器。如果你的集群运行在云提供商环境中,首先查找一下 “kube-system” 命名空间,查找 Ingress 控制器的 RC。如果没有的话,需要部署一个 nginx 控制器 或者 用不到 100 行代码自行实现。
务必花费少许时间来了解一下现存控制器的限制( GCE, nginx )。
TLS termination 和 HTTP 负载均衡
Ingress 用于承接服务,所以很适合做负载均衡以及中心化的安全配置。如果你熟悉 Go 语言,Ingress 在集群中扮演了 net/http’s “Server”
的角色。下面的例子示范了如何配置 TLS termination。负载均衡是 Ingress 的必选项目,所以只要创建了这一对象,就有了负载均衡能力。
首先创建一个测试服务。我们会运行一个简单的 Echo 服务器,用来告知我们正在运行的内容(源代码):
$ kubectl run echoheaders
--image=gcr.io/google_containers/echoserver:1.3 --port=8080
$ kubectl expose deployment echoheaders --target-port=8080
--type=NodePort
如果你是在云服务提供商提供的集群上运行,确认你可以由外网通过 Nodeport 访问到这一服务。
$ NODE_IP=$(kubectl get node `kubectl get po -l run=echoheaders
--template '{{range .items}}{{.spec.nodeName}}{{end}}'` --template
'{{range $i, $n := .status.addresses}}{{if eq $n.type
"ExternalIP"}}{{$n.address}}{{end}}{{end}}')
$ NODE_PORT=$(kubectl get svc echoheaders --template '{{range $i, $e
:= .spec.ports}}{{$e.nodePort}}{{end}}')
$ curl $NODE_IP:$NODE_PORT
这是一个简单的检查,如果最后一步失败了,可能需要设置一下防火墙规则。
接下来创建我们的 TLS secret:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout
/tmp/tls.key -out /tmp/tls.crt -subj "/CN=echoheaders/O=echoheaders"
$ echo "
apiVersion: v1
kind: Secret
metadata:
name: tls
data:
tls.crt: `base64 -w 0 /tmp/tls.crt`
tls.key: `base64 -w 0 /tmp/tls.key`
" | kubectl create -f
配置 Ingress:
$ echo "
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
tls:
- secretName: tls
backend:
serviceName: echoheaders
servicePort: 8080
" | kubectl create -f -
这样就得到了一个负载均衡 IP:
$ kubectl get ing
NAME RULE BACKEND ADDRESS AGE
test - echoheaders:8080 130.X.X.X 4m
如果等到 Ingress 控制器把你的后端设置为健康,会看到访问该 IP 80 端口的请求会被重定向到 443 端口,并会使用指定的 TLS 进行验证。
未来
可以在 Ingress API 获得更多的信息。Ingress 还在 Beta 阶段,我们期待你的反馈。你也可以贡献控制器或者 API 代码。所有跟 “Ingress” 的内容都可以,包含 DNS、不同的 TLS 模式、SNI、4 层负载均衡、内容缓存、更多的算法和健康检查等。