美文网首页
kubernetes学习之三:负载均衡测试

kubernetes学习之三:负载均衡测试

作者: 集韵增广 | 来源:发表于2021-01-11 18:00 被阅读0次

    Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。

    环境准备

    你必须具有 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。你可能需要部署 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。理想情况下,所有 Ingress 控制器都应符合参考规范。但实际上,不同的 Ingress 控制器操作略有不同。
    说明:本文需要参照《Kubernetes学习之二:Hello K8S》文章,安装完ingress-controller

    //使用以下命令查看ingress控制器是否存在
    kubectl get pod --all-namespaces
    NAMESPACE NAME READY STATUS RESTARTS AGE
    default nginx 1/1 Running 0 5d1h
    ......
    ingress-nginx nginx-ingress-controller-54b86f8f7b-lghw4 1/1 Running 0 4d6h
    ......
    #如果有nginx-ingress-controller这个pod就可以继续后面的测试

    实验目标

    k8s部署pod并自动生成endpoint信息(容器的IP及端口清单),service指向endpoint。

    关系图

    实验部署

    对于外部资源(未使用k8s部署的,如外部的数据库或应用),也可以使用ingress+service+endpoint的模式实现高可用及负载均衡,我们用nginx模拟下这个场景:分别在节点1,节点2用docker启用nginx。映射到主机端口为8021

    //在node的机器直接运行以下命令,可能不成功,看后面的注
    docker run --name nginx81 -p 8021:80 -d -v /data/nginx81/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx81/html:/usr/share/nginx/html -v /data/nginx81/conf.d:/etc/nginx/conf.d nginx:latest
    //查看node的安装情况
    sudo docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    d79a7a61396e nginx "/docker-entrypoint.…" 5 days ago Up 5 days 0.0.0.0:8021->80/tcp nginx81
    //注:如果创建docker container的时候可能是因为nginx目录没有
    sudo docker run --name nginx81 -d -p 80:80 -v /usr/docker/nginx/html:/usr/share/nginx/html nginx

    //如果创建好了,到nginx的html文件夹里增加index.html文件并添加以下内容
    node1:    <html><body>node1 8021 1.html</body></html>
    node2:    <html><body>node2 8021 1.html</body></html>

    //然后预览
    curl 10.10.30.74
    <html><body>node1 8021 1.html</body></html>
    curl 10.10.30.75
    <html><body>node2 8021 1.html</body></html>

    通过ingress映射外部

    ---
    kind: Endpoints
    apiVersion: v1
    metadata:
        name: edp-test
        namespace: my-system
    subsets:
        - addresses:
    #这里可以填写多个IP终结点IP,我们填写的是node1/node2的IP及端口
            - ip: 10.10.30.75
            - ip: 10.10.30.74
        ports:
            - port: 8021
    ---
    apiVersion: v1
    kind: Service
    metadata:
        name: edp-test
        namespace: my-system
    spec:
        ports:
            - port: 8021
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
        name: edp-test
        namespace: my-system
        annotations:
            nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
        rules:
        - http:
            paths:
            - path: /testpath
                pathType: Prefix
                backend:
                    service:
                        name: edp-test
                        port:
                            number: 8021

    先通过命令增加namespace再增加ingress

    kubectl create namespace my-system
    namespace/my-system created
    kubectl apply -f ingressdemo.yaml
    endpoints/edp-test created
    service/edp-test created
    ingress.networking.k8s.io/edp-test created
    kubectl describe ingress --all-namespaces
    Name: ingress-nginx
    Namespace: default
    Address: 10.1.64.186
    Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
    Rules:
    Host Path Backends
    ---- ---- --------
    * nginx-service:80 (10.244.1.4:80,10.244.1.5:80,10.244.3.4:80 + 1 more...)
    Annotations: kubernetes.io/ingress.class: nginx
    Events: <none>
    Name: edp-test
    Namespace: my-system
    Address: 10.1.64.186
    Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
    Rules:
    Host Path Backends
    ---- ---- --------
    * /testpath edp-test:8021 (10.10.30.75:8021,10.10.30.74:8021)
    Annotations: nginx.ingress.kubernetes.io/rewrite-target: /
    Events:
    Type Reason Age From Message
    ---- ------ ---- ---- -------
    Normal CREATE 20m nginx-ingress-controller Ingress my-system/edp-test
    Normal UPDATE 19m nginx-ingress-controller Ingress my-system/edp-test

    测试

    //外部测试访问
    curl 10.10.30.76:30010/testpath
    <html><body>node2 8021 1.html</body></html>
    curl 10.10.30.76:30010/testpath
    <html><body>node1 8021 1.html</body></html>
    //停止节点1,再访问
    sudo docker stop nginx81
    curl 10.10.30.76:30010/testpath
    <html><body>node2 8021 1.html</body></html>
    curl 10.10.30.76:30010/testpath
    <html><body>node2 8021 1.html</body></html>
    注:不会再访问到node1的节点,说明k8s的service会自动寻找有效节点。

    k8s的ingress+service+endpoint+pod的模式,是自带注册中心、负载均衡和高可用的模式。能够快速实现简单微服务架构。

    相关文章

      网友评论

          本文标题:kubernetes学习之三:负载均衡测试

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