本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已过时。
Kubernetes 1.2 和使用 Ingress 简化高级网络
编者注: 这是关于 Kubernetes 1.2 新特性的系列深度文章中的第六篇
Ingress 目前处于 Beta 阶段,并正在积极开发中。
在 Kubernetes 中,Service 和 Pod 默认只有集群网络可路由的 IP。所有到达边缘路由器的流量要么被丢弃,要么被转发到其他地方。在 Kubernetes 1.2 中,我们改进了 Ingress 对象,简化了允许入站连接到达集群 Service 的方式。它可以配置为给 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL、提供基于名称的虚拟主机等等。
Ingress 控制器
如今,使用容器或虚拟机时,配置 Web 服务器或负载均衡器比应有的要复杂。大多数 Web 服务器配置文件都非常相似。有些应用有一些奇怪的小怪癖,往往会搅乱一切,但大多数情况下,你可以对它们应用相同的逻辑并达到期望的结果。在 Kubernetes 1.2 中,Ingress 资源体现了这一思想,Ingress 控制器旨在处理与特定“类”的 Ingress 相关的所有怪癖(无论是一个负载均衡器的单个实例,还是提供 GSLB、CDN、DDoS 防护等的更复杂前端设置)。Ingress 控制器是一个守护进程,部署为 Kubernetes Pod,它监听 ApiServer 的 /ingresses 端点,以获取 Ingress 资源的更新。它的工作是满足入站请求。
您的 Kubernetes 集群必须有一个支持 TLS 的 Ingress 控制器,下面的示例才能正常工作。如果您在使用云提供商,首先请检查“kube-system”命名空间中是否有 Ingress 控制器 RC。如果没有,您可以部署 nginx 控制器,或者用少于 100 行代码编写自己的。
请花一点时间查阅现有控制器(gce、nginx)的已知限制。
TLS 终止和 HTTP 负载均衡
由于 Ingress 跨越 Service,它特别适合负载均衡和集中式安全配置。如果您熟悉 go 编程语言,Ingress 就像是您整个集群的 net/http 的“Server”。下面的示例展示了如何配置 TLS 终止。在处理入站流量时,负载均衡不是可选的,因此简单地创建对象就会配置一个负载均衡器。
首先创建一个测试 Service。我们将为此示例运行一个简单的 echo 服务器,以便您准确了解正在发生的事情。源码在此。
$ kubectl run echoheaders
--image=gcr.io/google\_containers/echoserver:1.3 --port=8080
$ kubectl expose deployment echoheaders --target-port=8080
--type=NodePort
如果您在使用云提供商,请确保您可以从集群外部通过其节点端口访问该 Service。
$ 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 证书进行终止。
$ curl 130.X.X.X
\<html\>
\<head\>\<title\>301 Moved Permanently\</title\>\</head\>\<body bgcolor="white"\>\<center\>\<h1\>301 Moved Permanently\</h1\>\</center\>
$ curl https://130.X.X.X -kCLIENT VALUES:client\_address=10.48.0.1command=GETreal path=/
$ curl 130.X.X.X -Lk
CLIENT VALUES:client\_address=10.48.0.1command=GETreal path=/
未来工作
您可以通过以下链接阅读更多关于 Ingress API 或控制器的内容。Ingress 仍处于 Beta 阶段,我们非常乐意听到您的意见来改进它。您可以通过编写控制器或演进 API 来贡献。所有与“ingress”一词含义相关的事项都在范围之内,这包括 DNS、不同的 TLS 模式、SNI、四层负载均衡、内容缓存、更多算法、更好的健康检查等等;列表还在继续。
有许多参与方式。如果您对 Kubernetes 和网络特别感兴趣,您可能会感兴趣的是
- 我们的网络 Slack 频道
- 我们的Kubernetes 网络特别兴趣小组邮件列表
- 大数据“特别兴趣小组”,每周两次太平洋时间下午 3 点 (15:00) 在 SIG-Networking 会议室举行会议
当然,有关项目的更多信息,请访问www.kubernetes.io