Ingress

Ingress是Kubernetes集群用来暴露内部服务给外部人使用的一种机制,目前。Ingress机制主要由两部分组成:Ingress规则和Ingress Controller。Ingress规则定义了服务的访问规则。在Kubernetes中,Ingress和Service之类的一样,是一个资源。Ingress中定义了具体路径到后端容器的对应关系。Ingress Controller就是对定义Ingress进行响应的组件。以Nginx-Controller举例,Nginx监听某一地址,Nginx-Controller读取Kubernetes中的Ingress,然后把Ingress中定义的信息翻译到Nginx配置文件中,从而达到访问Nginx就可访问内部容器服务的功能。这就是Ingress的用途,监听某一地址,把流量代理到后端的容器。

Ingress搭建

Ingress的搭建需要Default-Backend和Nginx-Controller两个服务,目前这两个服务都已容器化。Default-Backend是Nginx不能正确转发时使用的后端,定义有如404 Not Found等页面。Nginx-Controller我们之前已经介绍过。
在创建Default-Backend时,可以使用Deployment来创建。创建Nginx-Controller时可以使用DaemonSet创建。创建时注意修改Nginx-Controller的–apiserver-host参数。当然,如果ApiServer存在认证,那需要传递其他参数(可使用ServiceAccount,详见ServiceAccount使用)。
创建Default-Backend的YAML文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: default-http-backend
labels:
k8s-app: default-http-backend
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
k8s-app: default-http-backend
spec:
terminationGracePeriodSeconds: 60
containers:
- name: default-http-backend
image: googlecontainer/defaultbackend:1.0
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
- containerPort: 8080
resources:
limits:
cpu: 10m
memory: 20Mi
requests:
cpu: 10m
memory: 20Mi
---
apiVersion: v1
kind: Service
metadata:
name: default-http-backend
namespace: kube-system
labels:
k8s-app: default-http-backend
spec:
ports:
- port: 80
targetPort: 8080
selector:
k8s-app: default-http-backend

创建Nginx-Controller的YAML文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ingress-lb
labels:
name: nginx-ingress-lb
namespace: kube-system
spec:
template:
metadata:
labels:
name: nginx-ingress-lb
spec:
terminationGracePeriodSeconds: 60
hostNetwork: true
containers:
- image: googlecontainer/nginx-ingress-controller:0.9.0-beta.8
name: nginx-ingress-lb
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 1
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
args:
- /nginx-ingress-controller
- --apiserver-host=http://10.0.2.15:8080
- --default-backend-service=kube-system/default-http-backend

如果使用命令kubectl get pods --namespace=kube-system查看,default-http-backend和nginx-ingress-lb都处在Running状态,那么Ingress环境搭建完毕。

1
2
3
4
root@fankang:/home/fankang/app/ingress# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
default-http-backend-3699201686-pvs98 1/1 Running 0 4h
nginx-ingress-lb-17q6d 1/1 Running 0 2m

Ingress创建及使用

我们假设default空间下已存在名为nginx的服务,服务的端口为80。
可以通过kubectl create -f ingress.yaml创建Ingress,ingress.yaml如右所示。 可以看到,在rules中,我们的host写的是fankang,因为之前创建的nginx-controller-lb监听的就是这个地址(即nginx需要监听的地址),path是/default/nginx,后端就是ingress所在namespace中的nginx服务。这里要说明的是,annotations字段中需要添加ingress.kubernetes.io/rewrite-target: /,这是因为遇到path访问时返回404错误的解决方法,github上的bug地址为: https://github.com/kubernetes/ingress/issues/349。
Ingress创建的YAML文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: default
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: fankang
http:
paths:
- path: /default/nginx
backend:
serviceName: nginx
servicePort: 80

现在我们访问”fankang/default/nginx”就可以访问default下的nginx服务了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@fankang:/home/fankang/app/ingress# curl fankang/default/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

todo

如果Nginx-Controller监听的是Neutron的网络中的地址,是否就可以实现Kubernetes Service层的虚拟网络了???