本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.2 和使用 Ingress 简化高级网络
编者按:这是关于 Kubernetes 1.2 新特性的 系列深入文章中的第六篇。
Ingress 目前处于 Beta 阶段,正在积极开发中。
在 Kubernetes 中,默认情况下,服务和 Pod 的 IP 仅在集群网络中可路由。所有到达边缘路由器的流量要么被丢弃,要么被转发到其他位置。在 Kubernetes 1.2 中,我们对 Ingress 对象进行了改进,简化了允许入站连接到达集群服务的过程。它可以配置为为服务提供外部可访问的 URL、负载均衡流量、终止 SSL、提供基于名称的虚拟主机等等。
Ingress 控制器
如今,使用容器或虚拟机配置 Web 服务器或负载均衡器比应该的更困难。大多数 Web 服务器配置文件都非常相似。有些应用程序有一些奇怪的小怪癖,往往会使事情变得复杂,但在大多数情况下,您可以对它们应用相同的逻辑并达到预期的结果。在 Kubernetes 1.2 中,Ingress 资源体现了这种思想,而 Ingress 控制器旨在处理与特定 “类” Ingress 相关的所有怪癖(无论是负载均衡器的单个实例,还是提供 GSLB、CDN、DDoS 保护等的更复杂的前端设置)。Ingress 控制器是一个守护进程,作为 Kubernetes Pod 部署,它监视 ApiServer 的 /ingresses 端点,以获取 Ingress 资源的更新。它的工作是满足 Ingress 的请求。
您的 Kubernetes 集群必须只有一个 Ingress 控制器支持 TLS,以下示例才能正常工作。如果您使用的是云提供商,请首先在“kube-system”命名空间中检查 Ingress 控制器 RC。如果没有,您可以部署 nginx 控制器,或者 编写您自己的,代码量少于 100 行。
请花一点时间查看现有控制器(gce、nginx)的已知限制。
TLS 终止和 HTTP 负载均衡
由于 Ingress 跨越服务,因此它特别适合负载均衡和集中式安全配置。如果您熟悉 Go 编程语言,那么 Ingress 就像您整个集群的 net/http 的 “Server”。以下示例演示如何配置 TLS 终止。处理 Ingress 流量时,负载均衡不是可选的,因此只需创建对象即可配置负载均衡器。
首先创建一个测试 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 密钥
$ 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 控制器将您的后端标记为健康,您应该看到对 :80 上的该 IP 的请求被重定向到 :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、第 4 层负载均衡、内容缓存、更多算法、更好的健康检查;清单还在继续。
有很多参与方式。如果您对 Kubernetes 和网络特别感兴趣,您会对以下内容感兴趣
- 我们的 Networking Slack 频道
- 我们的 Kubernetes Networking Special Interest Group 邮件列表
- 大数据“特别兴趣小组”,它在太平洋时间下午 3 点(15:00)在 SIG-Networking Hangout 每两周举行一次会议
当然,有关该项目的更多信息,请访问www.kubernetes.io