k8s1.11部署Ingress-nginx
一、ingress-controller介绍
ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据ingress对象生成配置并应用新配置到反向代理,比如nginx-ingress就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置
二、ingress和ingress-controller区别
1、ingress
k8s中的一个api对象,用yaml文件配置,定义请求转发到service的规则
2、ingress-controller
具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。
三、ingress实现
ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于host的方向代理。ingress要依靠ingress-controller来具体实现以上功能。
四、部署
1、关闭准入控制器
--admission-control中SecurityContextDeny,拒绝创建pod使用SecurityContext字段。 SecurityContextDeny:该插件将拒绝任何试图设置特定扩展 SecurityContext 字段的 pod。如果集群没有使用pod 安全策略 来限制安全上下文所能获取的值集,那么应该启用这个功能。
2、获取ingress-nginx的yaml部署文件
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.28.0
3、部署方式
deployment(hostNetwork)+service(ClusterIP)->ingress-nignx
4、mandatory.yaml文件修改
(1)镜像修改使用国内镜像
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.28.0
(2)命名空间修改
我们的测试服务使用的是压测环境的defalut命名空间的服务,故修改namespace为default
注释:
#apiVersion: v1
#kind: Namespace
#metadata:
# name: ingress-nginx
# labels:
# app.kubernetes.io/name: ingress-nginx
# app.kubernetes.io/part-of: ingress-nginx
(3)资源配额限制
注释:
#apiVersion: v1
#kind: LimitRange
#metadata:
# name: ingress-nginx
# namespace: ingress-nginx
# labels:
# app.kubernetes.io/name: ingress-nginx
# app.kubernetes.io/part-of: ingress-nginx
#spec:
# limits:
# - default:
# min:
# memory: 90Mi
# cpu: 100m
# type: Container
重新配置资源配额
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 1000m
memory: 1Gi
(4)调度亲和性修改,使用hostnetwork
spec:
# wait up to five minutes for the drain of connections
terminationGracePeriodSeconds: 300
serviceAccountName: nginx-ingress-serviceaccount
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 192.168.99.82
hostNetwork: true
5、创建ingress-nginx-conftoller的service文件ingress-nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
# namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
# type: NodePort
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
# nodePort: 40080
protocol: TCP
- name: https
port: 443
targetPort: 443
# nodePort: 40443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
6、创建pod,svc
(1)创建
[root@node982 ingress-nginx-0.28.0]# kubectl create -f mandatory.yaml
[root@node982 ingress-nginx-0.28.0]# kubectl create -f ingress-nginx-svc.yaml
(2)查看
[root@node982 ingress-nginx-0.28.0]# kubectl get po -owide |grep nginx
nginx-ingress-controller-85f99d6b4d-fdt97 1/1 Running 0 2d 192.168.99.82 192.168.99.82 <none>
[root@node982 ingress-nginx-0.28.0]# kubectl get svc |grep nginx
ingress-nginx ClusterIP 10.10.10.198 <none> 80/TCP,443/TCP 2d
五、业务应用
1、对现有业务open-global创建service-ClusterIP
[root@node982 ingress-nginx-0.28.0]# kubectl get po -owide |grep open-global
open-global-9c6f7c769-crb65 1/1 Running 16 25d 100.10.86.8 192.168.99.85 <none>
该服务是通过deployment部署。
2、创建该服务的ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: open-global-ingress
namespace: default
labels:
type: ingress
#选择需要路由的service服务
app: open-global
annotations:
kubernetes.io/ingress.class: "nginx"
# 开启use-regex,启用path的正则匹配
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
#需要绑定的域名
- host: www.jwtest.com
http:
paths:
#支持自定义路由规则
- path: /
backend:
serviceName: open-global-svc
#容器内部端口
servicePort: 9090
该资源一端连接ingress-nginx-controller来修改路由,一端连接service找到需要路由的pod
3、创建open-global的service
apiVersion: v1
kind: Service
metadata:
name: open-global-svc
namespace: default
labels:
type: svc
app: open-global
spec:
selector:
app: open-global
#注意类型是clusterIP
type: ClusterIP
ports:
- port: 9090
targetPort: 9090
protocol: TCP
name: http
4、创建该yaml资源文件并通过域名访问
(1)创建资源
[root@node982 ingress-nginx-0.28.0]# kubectl create -f open-global-ingress.yaml
[root@node982 ingress-nginx-0.28.0]# kubectl create -f open-global-svc.yaml
(2)查看创建的资源
[root@node982 ingress-nginx-0.28.0]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
open-global-ingress www.jwtest.com 80 2d
[root@node982 ingress-nginx-0.28.0]# kubectl get svc |grep open-global
open-global-svc ClusterIP 10.10.10.45 <none> 9090/TCP 2d
(3)访问
在windows的hosts文件配置好域名映射
证书的域名需要向权威机构申请证书,并绑定该ingress的域名上面,重新配置
参考:
https://segmentfault.com/a/1190000019908991
https://feisky.gitbooks.io/kubernetes/content/concepts/security-context.html