Ingress 是从Kubernetes集群外部访问集群内部服务的入口
https://docs.jdcloud.com/cn/jcs-for-kubernetes/deploy-ingress-nginx-controller
Ingress 是从Kubernetes集群外部访问集群内部服务的入口,概念示意可参考下方说明。你可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求ingress。
1 | internet |
Ingress controller负责实现Ingress。Ingress controller在Kubernetes集群中默认不会自动启用,您可以在一个pod中部署任意类型的自定义Ingress Controller。本文将以Nginx-ingress controller为例,说明Controller部署和Ingress定义。更多外部类型的Ingresss Controller参考Kubernetes官方文档。
环境准备
从github下载nginx-ingress controller最新的安装部署文件,并将部署文件解压缩到本地目录:
1
2
3
4wget https://github.com/nginxinc/kubernetes-ingress/archive/v1.4.5.tar.gz
tar -zxvf v1.4.5.tar.gz说明:本文说明在1.12.3版本的集群上如何部署nginx-ingress controller,如集群版本不同,选择其他适合的ginx-ingress controller安装部署文件。
进入解压缩后的nginx-ingress controller安装目录;
1
cd kubernetes-ingress-1.4.5/deployments
安装nginx-ingress controller
为nginx-ingress controller创建一个namespace和service account:
1
kubectl apply -f common/ns-and-sa.yaml
为NGINX默认Server配置TLS证书和key,并将TLS证书和key保存到secret中:
1
kubectl apply -f common/default-server-secret.yaml
说明:建议使用合适的TLS证书和key替换default-server-secret.yaml文件中自签发的证书和key。
创建config map保存NGINX的自定义配置:
1
kubectl apply -f common/nginx-config.yaml
说明:目前提供的config map中的data为空,您可以按需添加自定义配置。
为第1步中创建的service account配置RBAC:
1
kubectl apply -f rbac/rbac.yaml
以Deployment的方式部署nginx-ingress controller:
1
kubectl apply -f deployment/nginx-ingress.yaml
执行如下命令,确定部署nginx-ingress controller的Deployment运行正常:
1
2
3
4kubectl get deployment -n nginx-ingress
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-ingress 1 1 1 1 24d创建ingress的LoadBalance
在 Kubernetes集群中,每个Pod都具有唯一的内部 IP 地址,但是Deployment中的Pod随时可能被删除或创建,导致Pod IP地址不断变化。因此需要创建一个Service对外暴露Pod中的应用。Service具有唯一的固定IP地址且能够为后端添加的成员Pod提供负载均衡。在京东云Kubernetes集群中您可以使用LoadBalance类型的Service,为Service关联创建一个应用负载均衡,并通过负载均衡绑定的公网IP,将Service后端关联的nginx-ingress controller应用暴露到公网:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18apiVersion: v1
kind: Service
metadata:
name: nginx-ingress #建议Service使用与nginx-ingress controller对应的Deployment名称相同的名称
namespace: nginx-ingress
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app: nginx-ingress说明:本例使用80和443端口绑定nginx-ingress controller应用
将上述Service定义到ingress.yaml文件,执行如下命令创建对应的Service:
1
kubectl create -f ingress.yaml
获取公网IP
等待一段时间,确定Service已经配置完成,并获取Service上配置的External IP字段
1
2
3
4kubectl get svc -n nginx-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress LoadBalancer 192.168.58.218 114.67.80.218 80:32436/TCP,443:30110/TCP 3h13m说明:Service的External IP将作为nginx-ingress controller的VIP,为集群中使用nginx-ingress controller的Ingress提供公网访问入口
关联的External IP作为公网入口IP
最后,在Ingress controller的Deployment部署文件nginx-ingress.yaml中增加一对环境变量”-args -external-service=nginx-ingress”,配置Ingress controller使用Service名称关联的External IP作为公网入口IP:
1
2
3
4args:
- -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
- -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
- -external-service=nginx-ingress #新增内容1
kubectl apply -f deployment/nginx-ingress.yaml #重新部署nginx-ingress controller
验证Pod
执行如下命令确定nginx-ingress controller相关的Pod运行正常,即可完成nginx ingress controller部署:
1
2
3
4
5kubectl get pod -n nginx-ingress
NAME READY STATUS RESTARTS AGE
nginx-ingress-f67b87b88-5cspd 1/1 Running 0 3h11m
nginx-ingress-f67b87b88-n7qnw 1/1 Running 0 3h13m
示例应用
例如:配置www2.veer.com的ingress配置
1 | apiVersion: extensions/v1beta1 |