美文网首页
Kubernetes 学习笔记(六)--- Ingress

Kubernetes 学习笔记(六)--- Ingress

作者: CaiGuangyin | 来源:发表于2019-04-18 19:26 被阅读0次

    Ingress是什么?请参考:https://jimmysong.io/kubernetes-handbook/concepts/ingress.html

    https://mritd.me/2017/03/04/how-to-use-nginx-ingress/

    Service不管是工作在iptables模式,还是工作在ipvs模式,它都是四层调度器,都是工作在TCP/IP协议栈。如果用户访问的是HTTPS协议(属于七层协议)的服务,再通过Service来进行请求调度的话,显然它是不能完成的。这时我们就需要使用七层的负载均衡机制。

    Ingress可用的调度器种类:

    • Nginx
    • Traefik
    • Envoy


      image.png
    1. 外部访问请求经过K8S集群外部的负载均衡器(externalLB) 将请求调度到K8S集群中的ingress-nginx Service;

    ingress-nginx Service这一步聚也可以通过下面这个方案替换:就是将ingress的Pod共享节点主机的网络名称空间(通过DaemonSet来管理这些Pod),这样就外部负载均衡器就可以直接将请求调度到ingress Pod上了。

    1. Ingress Controller 负载管理Ingress Pod;
    2. 根据Ingress中的配置,选择将请求转发至对应的后端Pod;
    3. 通过无头Service(Headless Service)把后端Pod进行分组,一旦有Pod挂了,Ingress会将无头Service匹配到的Pod的ip或名称载入Ingress配置中,以这样的方式对新创建的Pod进行调度。

    Ingress Controller是K8S核心附件之一。接下来我们来部署Ingress-nginx。
    https://github.com/kubernetes/ingress-nginx/

    git clone https://github.com/kubernetes/ingress-nginx.git
    cd ingress-nginx/deploy
    
    kubectl apply -f mandatory.yaml
    
    # 如果嫌克隆太慢,也可以直接执行如下命令:
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
    

    上述命令执行完后,会拉取nginx-ingress-controller镜像,需要一点时间


    image.png

    等待nginx-ingress-controller Pod运行起来。

    给nginx-ingress-controller Pod创建一个类型为NodePort的Service用以接入外部流量:

    # 下载
    [root@k8s-master deploy]# wget wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
    
    # 修改service-nodeport.yaml,给此service指定nodePort。
    [root@k8s-master deploy]# vim service-nodeport.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
      ports:
        - name: http
          port: 80
          targetPort: 80
          nodePort: 30080
          protocol: TCP
        - name: https
          port: 443
          targetPort: 443
          nodePort: 30443
          protocol: TCP
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    
    ---
    
    # 创建Service
    [root@k8s-master deploy]# kubectl apply -f service-nodeport.yaml
    
    
    # 查看
    [root@k8s-master deploy]# kubectl get svc -n ingress-nginx 
    NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx   NodePort   10.106.59.175   <none>        80:30080/TCP,443:30443/TCP   5s
    

    由于此时还未定义后端Pod,所以访问http://192.168.100.135:30080/还是404

    image.png

    接下来,我们创建一组后端Pod,以及为它们创建一个Serivce

    vim myapp-deploy-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc-ingress
      namespace: default
    spec:
      selector:
        app: myapp
        release: canary
      ports:
      - name: http
        port: 80
        targetPort: 80
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
          release: canary
      template:
        metadata: 
          labels:
            app: myapp
            release: canary
        spec:
          containers:
          - name: myapp
            image: ikubernetes/myapp:v2
            ports:
            - name: http
              containerPort: 80
    

    kubectl apply -f myapp-deploy-svc.yaml

    Service名为myapp-svc-ingress,这个Service需要在ingress的后端配置中使用。创建了3个后端Pod

    定义一个Ingress,名为ingress-myapp

    [root@k8s-master ingress]# cat ingress-myapp.yaml 
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingrepp-myapp
      namespace: default
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
        - host: myapp.magedu.com
          http:
            paths:
              - path:           # urI路径为空,默认为/
                backend:
                  serviceName: myapp-svc-ingress
                  servicePort: 80
    

    创建Ingress:

    kubectl apply -f ingress-myapp.yaml
    

    查看Ingress:

    [root@k8s-master ingress]# kubectl get ingress
    NAME            HOSTS              ADDRESS   PORTS     AGE
    ingrepp-myapp   myapp.magedu.com 
    
    image.png

    验证:
    必须使用域名访问:http://myapp.magedu.com:30080,这时需要在hosts文件中,把节点IP与myapp.magedu.com做映射。

    image.png

    刷新如果一直显示一个Pod 主机名,则需要按Ctrl+F5强刷,这时会看到三个Pod轮流处理请求。

    相关文章

      网友评论

          本文标题:Kubernetes 学习笔记(六)--- Ingress

          本文链接:https://www.haomeiwen.com/subject/kkqxgqtx.html