首页 > 技术文章 > k8s的ingress资源简述

Smbands 2019-05-09 23:03 原文

ingress controller是独立与controller-manager的
Ingress的主要作用是可以利用nginx,haproxy,envoy,traefik等负载均衡器来暴露集群内部服务。
利用Ingress可以解决内部资源访问外部资源的方式,和四层调度替换为七层调度的问题。
解决因为四层iptables/ipvs规则实现调度或加密tsl的方式过于复杂且效率低下的问题,因为四层调度的iptables/ipvs模块无法卸载,所以使用七层负载均衡来替代。

用户访问过程:
用户访问->nodeIP:Nodeport->podIP:containerPort

ingress原理:
用户访问-->LB-->ingress-nginx-service-->ingressController-ingress-nginx-pod-->ingress字段中调用的后端pod
后端pod的service只提供pod归类,归类后ingress会将此service中的后端pod信息提取出来,然后动态注入到ingress-nginx-pod中的ingress字段中
随后,后端pod就被调用到了

例:myapp
1.下载资源。github上搜索ingress-nginx,找到deploy项目,下载里面的mandatory.yaml,或在https://kubernetes.github.io/ingress-nginx/deploy/查看教程下载mandatory.yaml和service-nodeport.yaml
下载yaml后,kubectl apply -f mandatory.yaml。会创建1个pod:nginx-ingress-controller,1个svc:ingress-nginx,1个namespace
            kubectl apply -f service-nodeport.yaml会创建一个service
            这两条命令创建出ingress框架:ns/svc/deploy/ingress/,以后创建后端和后端匹配的ingress资源就可以使用生成的svc来访问了
2.创建myapp后端资源:

 1 apiVersion: v1
 2 kind: Service
 3 metadata:
 4   name: myapp
 5   namespace: default
 6 spec:
 7   selector:
 8     app: myapp
 9     release: canary
10   ports:
11   - name: http
12     targetPort: 80
13     port: 80
14 ---
15 apiVersion: apps/v1
16 kind: Deployment
17 metadata:
18   name: myapp-deploy
19   namespace: default
20 spec:
21   replicas: 3
22   selector:
23     matchLabels:
24       app: myapp
25       release: canary
26   template:
27     metadata:
28       labels:
29         app: myapp
30         release: canary
31     spec:
32       containers:
33       - name: myapp
34         image: ikubernetes/myapp:v2
35         ports:
36         - name: http
37           containerPort: 80

 3.创建ingress

 1 apiVersion: extensions/v1beta1
 2 kind: Ingress
 3 metadata:
 4   name: ingress-myapp
 5   namespace: default
 6   annotations:
 7     kubernetes.io/ingess.class: "nginx"
 8 spec:
 9   rules:
10   - host: smbands.com
11     http:
12        paths:
13        - path:
14          backend:
15            serviceName: myapp  ##注此处必须要和后端pod的service的名称一致,否则会报503错误
16            servicePort: 80     ##注此处必须要和后端pod的service的端口一致,否则会报503错误

#然后kubectl apply -f myapp-demo.yaml、kubectl apply -f ingress-demo.yaml。

4.访问。

确保hosts文件可以正确解析即可访问,使用域名+ingress-nginx的service暴露的端口


自签证书https  tls
例:
1.生成所需文件

生成私钥文件:openssl genrsa -out tls.key 2048
  生成证书文件:openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DepOps/CN=tomcat.smbands.com
会有tls.crt  tls.key两个文件

2.创建后端pod资源

 1 apiVersion: v1
 2 kind: Service
 3 metadata:
 4   name: tomcat  ##下面的Ingess的资源清单里面的serviceName必须与此名称一致,否则报503错误。
 5   namespace: default
 6 spec:
 7   selector:
 8     app: tomcat
 9     release: canary
10   ports:
11   - name: http
12     targetPort: 8080
13     port: 8080
14   - name: ajp
15     targetPort: 8009
16     port: 8009
17 ---
18 apiVersion: apps/v1
19 kind: Deployment
20 metadata:
21   name: tomcat-deploy
22   namespace: default
23 spec:
24   replicas: 3
25   selector:
26     matchLabels:
27       app: tomcat
28       release: canary
29   template:
30     metadata:
31       labels:
32         app: tomcat
33         release: canary
34     spec:
35       containers:
36       - name: tomcat
37         image: tomcat
38         ports:
39         - name: http
40           containerPort: 8080
41         - name: ajp
42           containerPort: 8009

3.创建secert资源,使其将证书密钥注入到tomcat配置文件中:

1 kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key

4.创建ingress资源:

 1 apiVersion: extensions/v1beta1
 2 kind: Ingress
 3 metadata:
 4   name: ingress-tomcat-tls
 5   namespace: default
 6   annotations:
 7     kubernetes.io/ingess.class: "nginx"
 8 spec:
 9   tls:
10   - hosts:
11     - tomcat-smbands.com
12     secretName: tomcat-ingress-secret
13   rules:
14   - host: tomcat.smbands.com
15     http:
16        paths:
17        - path:
18          backend:
19            serviceName: tomcat  ##注:这里的serviceName必须与pod的service名称一致,否则会报503错误。
20            servicePort: 8080    ##注此处必须要和后端pod的service的端口一致,否则会报503错误

5.应用

kubectl apply -f tomcat-ingress-tls.yaml
6.访问。

确保hosts文件可以正确解析即可访问,使用域名https://tomcat.smbands.com:ingress的service向外暴露的端口。


推荐阅读