docker中使用端口映射可以访问容器中的服务,k8s中的pod可以通过service的NodePort方式暴露服务,然而端口不能够定制,对于生产环境中还需要自己配置反向代理来搞定。

Ingress从官方的定义来看就是允许访问集群服务的规则的集合。可以通过配置提供服务外部可达的url,负载均衡,terminate SSL等等。用户对api server发起ingress资源的请求,ingress controller是负责来实现ingress规则的,通常是一个负载均衡器。

通过一个简单的操作看看怎么使用ingress

minikube环境

通过minkube可以很方便的在本地部署k8s环境,我的环境是:

  • minikube: 0.26.0
  • k8s: 1.10.0

部署服务

用tomcat做个测试,编写一个deploy_tomcat.yaml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.0

创建deployment:

1
$ kubectl create -f deploy_tomcat.yaml -o wide

查看创建的pod:

1
default       tomcat-659f98bc89-4lzxh                 1/1       Running   1          3h        172.17.0.3       minikube

看到tomcat已经运行,tomcat的镜像默认会开启8080端口,测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
$ minikube ssh curl 172.17.0.3:8080
...
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/8.0.50</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
...

说明tomcat正常运行了,那给tomcat创建一个service,编写文件service_tomcat.yaml

1
2
3
4
5
6
7
8
9
10
11
12
kind: Service
apiVersion: v1
metadata:
name: my-tomcat
namespace: default
spec:
selector:
app: tomcat
ports:
- protocol: TCP
port: 8989
targetPort: 8080

创建service:

1
2
3
$ kubectl create -f service_tomcat.yaml
$ kubectl get svc -o wide
my-tomcat ClusterIP 10.108.155.32 <none> 8989/TCP 4h app=tomcat

创建ingress

上一步中创建了service,但是service中没有配置NodePort,所以无法直接通过service进行访问,也就是说k8s没有将服务暴露出来,在minikube环境中需要确认ingress功能已经开启:

1
2
3
4
$ minikube addons list
...
- ingress: enabled
...

如果没有开启可以手动enable:

1
$ minikube addons enable ingress

开启以后,编写ingress_tomcat.yaml

1
2
3
4
5
6
7
8
9
10
11
12
kind: Ingress
metadata:
name: tomcat
namespace: default
spec:
rules:
- host: tomcat.k8s.ingress
http:
paths:
- backend:
serviceName: my-tomcat
servicePort: 8989

创建ingress:

1
kubectl create -f ingress_tomcat.yaml

查看ingress:

1
tomcat    tomcat.k8s.ingress   192.168.99.100   80        4h

这里设置的host是tomcat.k8s.ingress,其后端就是上一步中创建的服务my-tomcat,端口也正是service的端口8989,也就是说能正常解析我们配置的tomcat.k8s.ingress后就能请求到tomcat服务了。

这里需要手动自己配置下,将tomcat.k8s.ingress添加到hosts,保证能够正确解析,然后打开浏览器输入tomcat.k8s.ingress,就能看到tomcat的服务页面了。