• k8s Ingress 理解和部署


    前言

    在跟随书籍学习 kubernetes 的过程中,我一直在思考如何从外部访问集群的服务,诚然到了 Ingress 的内容,才理解 kubernetes 对外提供内部服务的方式。

    Ingress 与 ingress-controller

    Ingress 是 kubernetes 的一种资源对象,该对象允许外部访问 kubernetes 服务, 通过创建规则集合来配置访问权限,这些规则定义了哪些入站连接可以访问哪些服务。
    ingress-controller 是实现反向代理和负载均衡的程序,其功能是为了使 ingress 工作,通过解析 ingress 的规则来实现请求转发。集群内可以有多个 ingress-controller。

    Ingress 部署

    Ingress 部署的方式有多种,一般情况下需要考虑场景才选择部署方式。以下是笔者摘抄的常见部署方式:
    Deployment + LoadBalancer

    如果要把 ingress 部署在公有云,那用这种方式比较合适。用 Deployment 部署 ingress-controller,创建一个 type 为 LoadBalancer 的 service 关联这组 pod。大部分公有云,都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址。只要把域名解析指向该地址,就实现了集群服务的对外暴露。

    Deployment + NodePort

    同样用 deployment 模式部署 ingress-controller,并创建对应的服务,但是 type 为 NodePort。这样,ingress 就会暴露在集群节点 ip 的特定端口上。由于 nodeport 暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境 ip 地址不变的场景。NodePort 方式暴露 ingress 虽然简单方便,但是 NodePort 多了一层 NAT,在请求量级很大时可能对性能会有一定影响。

    DaemonSet + HostNetwork + nodeSelector

    用 DaemonSet 结合 nodeselector 来部署 ingress-controller 到特定的 node 上,然后使用 HostNetwork 直接把该 pod 与宿主机 node 的网络打通,直接使用宿主机的 80/433 端口就能访问服务。这时,ingress-controller 所在的 node 机器就很类似传统架构的边缘节点,比如机房入口的 nginx 服务器。该方式整个请求链路最简单,性能相对 NodePort 模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个 node 只能部署一个 ingress-controller pod。比较适合大并发的生产环境使用。

    在本次实验中也根据相关教程使用 DaemonSet+HostNetwork+nodeSelector 的方式部署。

    1、部署 ingress-controller

    为需要部署为边缘节点的 node 打上 labe:

    $ kubectl  label   node k8sn91 isIngress="true"
    
    

    在官方 yaml 配置文件中,相关资源的创建已经包含在内,但是我们需要使用 DaemonSet 的方式部署,就需要修改一小部分内容。下载官方 yaml:

    $ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
    

    修改 Deployment 部分的配置:

    ……
    apiVersion: apps/v1
    # kind: Deployment
    # 修改成 DaemonSet
    kind: DaemonSet
    metadata:
      name: nginx-ingress-controller
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
    #  注释掉 replicas
    #  replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: ingress-nginx
          app.kubernetes.io/part-of: ingress-nginx
      template:
        metadata:
          labels:
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
          annotations:
            prometheus.io/port: "10254"
            prometheus.io/scrape: "true"
        spec:
          # wait up to five minutes for the drain of connections
          terminationGracePeriodSeconds: 300
          serviceAccountName: nginx-ingress-serviceaccount
          # 选择打上 isIngress 标签的 node
          nodeSelector:
            isIngress: "true"
          # 暴露服务
          hostNetwork: true
          containers:
            - name: nginx-ingress-controller
              image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
    ……
    

    部署 nginx-ingress-controller:

    $ kubectl apply -f mandatory.yaml
    

    查看:

    $ kubectl get ds -n ingress-nginx
    NAME                       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR    AGE
    nginx-ingress-controller   1         1         1       1            1           isIngress=true   10m
    $ kubectl get pods -n ingress-nginx
    NAME                             READY   STATUS    RESTARTS   AGE
    nginx-ingress-controller-prqv5   1/1     Running   0          10m
    

    2、部署测试 web 服务

    为了展示 ingress 路由转发功能,创建两个 web 服务,然后通过 ingress 编写规则来转发相关请求。
    apple.yaml

    kind: Pod
    apiVersion: v1
    metadata:
      name: apple-app
      labels:
        app: apple
    spec:
      containers:
        - name: apple-app
          image: hashicorp/http-echo
          args:
            - "-text=apple"
    
    ---
    
    kind: Service
    apiVersion: v1
    metadata:
      name: apple-service
    spec:
      selector:
        app: apple
      ports:
        - port: 5678 # Default port for image
    

    banana.yaml

    kind: Pod
    apiVersion: v1
    metadata:
      name: banana-app
      labels:
        app: banana
    spec:
      containers:
        - name: banana-app
          image: hashicorp/http-echo
          args:
            - "-text=banana"
    
    ---
    
    kind: Service
    apiVersion: v1
    metadata:
      name: banana-service
    spec:
      selector:
        app: banana
      ports:
        - port: 5678 # Default port for image
    

    部署 pod

    $ kubectl apply -f apple.yaml
    $ kubectl apply -f banana.yaml
    

    查看 service、pod:

    $ kubectl get svc,po | grep -E "apple|banana"
    service/apple-service          ClusterIP   10.106.133.148   <none>        5678/TCP   10m
    service/banana-service         ClusterIP   10.108.239.61    <none>        5678/TCP   10m
    pod/apple-app                           1/1     Running             0          10m
    pod/banana-app                          1/1     Running             0          10m
    $ curl 10.106.133.148:5678
    apple
    $ curl 10.108.239.61:5678
    banana
    

    3、部署 Ingress

    编写 yaml 文件,指定路由规则

    $ vim ingress-nginx.yaml
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: nginx.tempdomain.com
        http:
          paths:
          - path: /apple
            backend:
              serviceName: apple-service
              servicePort: 5678
          - path: /banana
            backend:
              serviceName: banana-service
              servicePort: 5678
    

    部署 ingress:

    $ kubectl apply -f ingress-nginx.yaml
    

    查看 ingress:

    $ kubectl get ingress
    NAME            HOSTS               ADDRESS   PORTS   AGE
    nginx-ingress   nginx.tempdomain.com             80      10m
    $ kubectl describe ingress nginx-ingress
    Name:             nginx-ingress
    Namespace:        default
    Address:
    Default backend:  default-http-backend:80 (<none>)
    Rules:
      Host               Path  Backends
      ----               ----  --------
      nginx.tempdomain.com
                         /apple    apple-service:5678 (100.93.23.211:5678)
                         /banana   banana-service:5678 (100.107.55.15:5678)
    

    4、检查可用性

    $ curl nginx.tempdomain.com/apple
    apple
    $ curl nginx.tempdomain.com/banana
    banana
    

    参考:
    https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
    https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html
    https://segmentfault.com/a/1190000019908991#articleHeader5

  • 相关阅读:
    模型
    smarty变量
    smarty变量调节器
    分页
    表单验证(注册)
    php数据库访问
    php面向对象 继承
    php 面向对象
    php正则数组
    php 函数
  • 原文地址:https://www.cnblogs.com/nnylee/p/11889163.html
Copyright © 2020-2023  润新知