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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐