边缘Ingress

    具体应用场景为:

    1. 节点池内或节点池外通过边缘ingress访问节点池内提供的服务。
    2. 节点池外访问nginx ingress controller,目前支持通过NodePort Service及externalIPs的方式。

    具体用法为:

    1. 启用指定节点池上的边缘Ingress功能。
    2. 同K8S一样创建并部署ingress规则以访问相应的服务。

    请按以下步骤尝试使用边缘Ingress功能:


    YurtIngress opeator负责将nginx ingress controller编排到需要启用边缘Ingress功能的节点池中。 假设您的OpenYurt集群中有4个节点池:pool01、pool02、pool03、pool04,如果您想要在pool01和pool03上启用边缘ingress功能,可以按如下方式创建YurtIngress CR:

    1). 创建YurtIngress CR yaml文件:

    1.1). YurtIngress CR的简单定义:

    默认为每个节点池创建的nginx ingress控制器副本数为1
    默认的ingress控制器docker image为:k8s.gcr.io/ingress-nginx/controller:v0.48.1
    默认的生成ingress控制器webhook证书的docker image为:k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v0.48.1

    1.2). 如果用户不想使用默认的配置,而是想对节点池做一些个性化配置,可以如下定义CR:

    1. kind: YurtIngress
    2. metadata:
    3. name: yurtingress-test
    4. spec:
    5. ingress_controller_replicas_per_pool: 2
    6. ingress_controller_image: k8s.gcr.io/ingress-nginx/controller:v0.49.0
    7. ingress_webhook_certgen_image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v0.49.0
    8. pools:
    9. - name: pool01
    10. ingress_ips:
    11. - xxx.xxx.xxx.xxx
    12. - name: pool03

    其中:
    igress_controller_replicas_per_pool/ingress_controller_image/ingress_webhook_certgen_image可供用户自定义相关默认配置, ingress_ips 代表如果用户想通过externalIPs的方式为某个特定的节点池对外暴露nginx ingress控制器服务的公网IP地址。

    a). 用户可以通过定义不同的YurtIngress CRs来对不同节点池做一些个性化配置,比如通过定义不同的CR来对不同的节点池配置不同的ingress控制器副本数。

    b). 在spec中,“ingress_controller_replicas_per_pool”表示部署在每个节点池上的ingress控制器副本数,它主要用于HA高可用场景。

    c). 在spec中,“pools”表示要在其上开启ingress功能的节点池列表,目前支持节点池名及针对该节点池的ingress服务公网IP配置。

    2). 部署YurtIngress CR yaml文件:
    假定CR文件名为yurtingress-test.yaml:

    1. #kubectl apply -f yurtingress-test.yaml
    2. yurtingress.apps.openyurt.io/yurtingress-test created

    然后您可以查看YurtIngress CR的状态:

    成功编排ingress controller后,每个节点池将暴露一个NodePort类型的Service服务:

    1. #kubectl get svc -n ingress-nginx
    2. ingress-nginx pool01-ingress-nginx-controller NodePort 192.167.107.123 <none> 80:32255/TCP,443:32275/TCP 53m
    3. ingress-nginx pool03-ingress-nginx-controller NodePort 192.167.48.114 <none> 80:30531/TCP,443:30916/TCP 53m

    提示:

    a). “ying”是YurtIngress资源的简称

    b). 当“READYNUM”与您部署的节点池数量一致时,表示ingress功能在您定义的所有节点池上已就绪。

    d). 对于成功启用ingress功能的每个NodePool,会为用户暴露一个NodePort类型的服务用来访问nginx ingress controller。

    e). YurtIngress operator会创建一个”ingress-nginx”的namespace,编排nginx ingress controller时,所有跟namespace相关的resource都会被部署在这个namespace下。


    2.同K8S一样创建并部署ingress规则以访问相应的服务

    当上述步骤1完成后,您已经通过Yurtingress成功的将nginx ingress controller部署到相应的节点池中。接下来的用法就和K8S中使用ingress的体验一致了。

    假设您的业务应用被部署到了多个节点池中,并且它们通过一个全局的service对外暴露,举个例子:

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: pool01-deployment
    5. labels:
    6. app: echo
    7. replicas: 2
    8. matchLabels:
    9. app: echo
    10. template:
    11. metadata:
    12. labels:
    13. app: echo
    14. spec:
    15. containers:
    16. - name: echo-app
    17. image: hashicorp/http-echo
    18. args:
    19. - "-text=echo from nodepool pool01"
    20. imagePullPolicy: IfNotPresent
    21. nodeSelector:
    22. apps.openyurt.io/nodepool: pool01
    23. ---
    24. apiVersion: apps/v1
    25. kind: Deployment
    26. metadata:
    27. name: pool03-deployment
    28. labels:
    29. app: echo
    30. spec:
    31. replicas: 2
    32. selector:
    33. matchLabels:
    34. app: echo
    35. labels:
    36. app: echo
    37. spec:
    38. containers:
    39. - name: echo-app
    40. image: hashicorp/http-echo
    41. args:
    42. - "-text=echo from nodepool pool03"
    43. imagePullPolicy: IfNotPresent
    44. nodeSelector:
    45. apps.openyurt.io/nodepool: pool03
    46. ---
    47. kind: Service
    48. apiVersion: v1
    49. metadata:
    50. name: echo-service
    51. spec:
    52. selector:
    53. app: echo
    54. ports:
    55. - port: 5678

    当您想要访问pool01提供的服务时,您可以如下操作:

    1). 创建ingress规则yaml文件:

    提示:

    a). 由哪个节点池提供ingress功能是由ingress class决定的,因此您需要将ingress class定义为您想要访问服务的节点池名称。

    b). 不同K8S版本的ingress CR定义可能不同,您需要确保ingress CR的定义与集群K8S版本匹配。

    1. #kubectl apply -f ingress-myapp.yaml
    2. ingress.extensions/ingress-myapp created

    成功完成上述所有步骤后,您就可以通过ingress controller NodePort service验证边缘Ingress功能了:

    1. #curl xxx:32255/echo
    2. "xxx" 代表节点池pool01中的节点IP地址
    3. "32255" 代表对应节点池中ingress controller暴露的service NodePort