本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

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 和网络特别感兴趣,您会对以下内容感兴趣

当然,有关该项目的更多信息,请访问www.kubernetes.io