• k8s Ingress介绍和部署IngressController


    Ingress介绍和部署IngressController

    • Ingress是为了弥补nodeport不足而生的,nodeport存在不足:一个端口只能一个服务使用,端口需要提前规划,只支持4层负载均衡。

    • Ingress 公开了从集群外部到集群内部服务的HTTP和HTTPS路由的规则集合,而具体实现流量路由是由Ingress Controller负责。

    Ingress: k8s中一个抽象资源,给管理员提供一个暴漏应用的入口定义方法。
    Ingress Controller: 根据Ingress生成具体的路由规则,并对Pod负载均衡器。
    

    ingress Controller工作流程
    		Ingress Contronler通过于k8s API交互,动态去感知集群中Ingress 规则变化,然后读取它按照自定义规则,规则就是写明哪个域名对应哪个service ,生成一段nginx配资后,应用到管理Nginx服务, 然后热加载生效,从而达到Nginx负载均衡器配置及动态更新问题。
    		
    ingress-controller流程: 客户端->LB(公网)-> Ingress Controller(nginx) -> 分布在各pod节点
    nodeport流程:客户端->LB(公网)->Service(nodeport)--> Ingress Controller(nginx) -> 分布在各pod节点
    进入ingress-nginx
    [root@k8s-master ~]# kubectl exec -it nginx-ingress-controller-5dc64b58f-7qwxn -n ingress-nginx -- bash 
    
    • 部署Ingress Controller

      • 我们采用nginx控制器

      • 下载YAML

        wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
        
      • 也可以直接下载ingress-controller.yaml,提取码:hcgm 来直接创建ingress规则。

      • 更改名称

        mv mandatory.yaml ingress-controller.yaml
        
      • 修改yaml

        1. apps/v1 下的kind为 DaemonSet
        
        apiVersion: apps/v1
        kind: DaemonSet# 如果通过Deployment部署只会在某个节点上能访问。考虑到高可用,通过DaemonSet会在每一个节点上部署
        metadata:
          name: nginx-ingress-controller
          namespace: ingress-nginx
          labels:
        ...
        
        2. 新增hostNetwork: true 将ingress-controller暴漏出去提供全局入口
        spec:
              hostNetwork: true
              # wait up to five minutes for the drain of connections
              terminationGracePeriodSeconds: 300
              serviceAccountName: nginx-ingress-serviceaccount
              nodeSelector:
              ...
        3.更改镜像地址
        containers:
          - name: nginx-ingress-controller
          image: lizhenliang/nginx-ingress-controller:0.30.0
           args:
              - /nginx-ingress-controller
              ...
        
      • 加载配置

        kubectl apply -f ingress-controller.yaml
        
      • 查看部署是否成功

        kubectl get pods -n ingress-nginx
        
      • 创建规则为其他项目暴漏

        # 编辑规则
        vi ingress.yaml
        apiVersion: networking.k8s.io/v1
        kind: Ingress
        metadata:
          name: xujunkai
        spec:
          rules:
          - host: web.xujunkai.com# 指定域名
            http:
              paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: web# 指定service 名称
                    port:
                      number: 80 # service端口
        # 创建规则
        kubectl apply -f ingress.yaml
        # 查看规则
        [root@k8s-master ~]# kubectl get ingress
        NAME       CLASS    HOSTS              ADDRESS   PORTS   AGE
        xujunkai   <none>   web.xujunkai.com             80      7s
        
        
      • 查看ingress-nginx在哪个节点上。

        kubectl get pods -n ingress-nginx -o wide
        NAME                                       READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
        nginx-ingress-controller-5dc64b58f-7qwxn   1/1     Running   0          9m50s   172.16.215.140   k8s-node01   <none>           <none>
        
      • 可以看到在172.16.215.140 上也就是k8s node01节点上

        # 通过查看80 443端口已经有监听了,它就是ingress-nginx-controller监听的
        [root@k8s-node01 logs]# ss -anpt | grep 80
        [root@k8s-node01 logs]# ss -anpt | grep 443
        # 而在master节点是没有监听的
        
      • 访问http://web.xujunkai.com/ 是可以访问到的

    • ingress配置https

      • cfssl下载

        wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
        wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
        wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
        
        chmod -x cfssl*
        for x in cfssl*; do mv $x ${x%*_linux-amd64};  done
        mv cfssl* /usr/bin
        
      • 配置https步骤:

        mkdir ssl
        cd ssl
        vi certs.sh
        # 生成证书
        cat > ca-config.json <<EOF
        {
          "signing": {
            "default": {
              "expiry": "87600h"
            },
            "profiles": {
              "kubernetes": {
                 "expiry": "87600h",
                 "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
              }
            }
          }
        }
        EOF
        
        cat > ca-csr.json <<EOF
        {
            "CN": "kubernetes",
            "key": {
                "algo": "rsa",
                "size": 2048
            },
            "names": [
                {
                    "C": "CN",
                    "L": "Beijing",
                    "ST": "Beijing"
                }
            ]
        }
        EOF
        
        cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
        
        #-----------------------
        cat > web.xujunkai.com-csr.json <<EOF
        {
            "CN": "web.xujunkai.com",
            "hosts": [],
            "key": {
              "algo": "rsa",
              "size": 2048
            },
            "name": [
              {
                "C": "CN",
                "L": "BeiJing",
                "ST": "Beijing"
              }
            ]
        }
        EOF
        
        cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes web.xujunkai.com-csr.json | cfssljson -bare web.xujunkai.com
        
      • 将证书保存到Secret

        kubectl create secret tls web-xujunkai-com --cert=web.xujunkai.com.pem --key=web.xujunkai.com-key.pem
        
      • 配置ingress https的yaml

        vi ingress-https.yaml
        
        apiVersion: networking.k8s.io/v1
        kind: Ingress
        metadata:
          name: xujunkai-https
        spec:
          tls:
          - hosts:
              - web.xujunkai.com
            secretName: web-xujunkai-com# 密钥证书名字
          rules:
          - host: web.xujunkai.com
            http:
              paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: web
                    port:
                      number: 80
        
      • 应用ingress

        kubectl apply -f ingress-https.yaml
        
      • 查看ingress

        [root@k8s-master ~]# kubectl get ingress
        NAME             CLASS    HOSTS              ADDRESS   PORTS     AGE
        xujunkai-https   <none>   web.xujunkai.com             80, 443   35s
        
      • 这样就可以访问https://web.xujunkai.com,需要提前本地配置hosts

    • 之前部署的一个pod的python服务,通过service创建NodePod。这里通过ingress做负载。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: web-ingress
    spec:
      rules:
      - host: web.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: websvc# 这里是service名称
                port:
                  number: 9527# 这里是创建pod容器端口
    
  • 相关阅读:
    Vue2.5 旅游项目实例27 联调测试上线-项目打包上线
    Vue2.5 旅游项目实例26 联调测试上线-真机测试
    Vue2.5 旅游项目实例25 联调测试上线-项目前后端联调
    Vue2.5 旅游项目实例24 详情页-在项目中添加基础动画
    Vue2.5 旅游项目实例23 详情页 Ajax动态获取数据
    Vue2.5 旅游项目实例22 详情页 使用递归组件实现详情页列表
    HTML5标签embed详解
    MongoDB使用经验总结
    16个非常酷的jQuery插件
    kendo-ui的MVVM模式
  • 原文地址:https://www.cnblogs.com/xujunkai/p/14869278.html
Copyright © 2020-2023  润新知