十一 【Kubernetes】K8s笔记:Ingress 集群进出流量总管( 二 )


  • --class - 指定 Ingress 从属的 Ingress Class 对象
  • --rule - 指定路由规则,基本形式是 URI=Service,也就是说是访问 HTTP 路径就转发到对应的 Service 对象,再由 Service 对象转发给后端的 Pod
$ export out="--dry-run=client -o yaml"$ kubectl create ing ngx-ing --rule="ngx.test/=ngx-svc:80" --class=ngx-ink $outapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: ngx-ingspec:ingressClassName: ngx-inkrules:- host: ngx.testhttp:paths:- backend:service:name: ngx-svcport:number: 80path: /pathType: Exact这份 YAML 文档中有两个关键字段 ingressClassNamerulesrules 的格式稍显复杂:它将路由规则拆散为 hosthttp path,在 path 里又指定了路径的匹配方式,可以是精确匹配 Exact 或者是前缀匹配 Prefix,再用 backend 来指定转发的目标 Service 对象 。
3.2 Ingress ClassIngress Class 本身并没有什么实际的功能,只是起到联系 Ingress 和 Ingress Controller 的作用,所以它的定义非常简单,在 spec 里只有一个必需的字段 controller ,表示要使用哪个 Ingress Controller,具体的名字就要看实现文档了 。
比如,要使用 Nginx 开发的 Ingress Controller,那么就要用名字 nginx.org/ingress-controller
apiVersion: networking.k8s.io/v1kind: IngressClassmetadata:name: ngx-inkspec:controller: nginx.org/ingress-controller
十一 【Kubernetes】K8s笔记:Ingress 集群进出流量总管

文章插图
4. 使用 Ingress / Ingress Class使用 kubectl apply 创建 Ingress 和 Ingress Class 这两个对象:
$ kubectl apply -f ngx-ing-class.yamlingressclass.networking.k8s.io/ngx-ink created$ kubectl apply -f ngx-ing.yamlingress.networking.k8s.io/ngx-ing created然后我们查看 Ingress 和 Ingress Class 的状态:
$ kubectl get ingress -o wideNAMECLASSHOSTSADDRESSPORTSAGEngx-ingngx-inkngx.test8067s$ kubectl get ingressclass -o wideNAMECONTROLLERPARAMETERSAGEngx-inknginx.org/ingress-controller<none>84s可以使用 kubectl describe 查看详细的信息:
$ kubectl describe ing ngx-ingName:ngx-ingLabels:<none>Namespace:defaultAddress:Ingress Class:ngx-inkDefault backend:<default>Rules:HostPathBackends----------------ngx.test/ngx-svc:80 (10.10.1.38:80,10.10.1.40:80,10.10.1.41:80)Annotations:<none>Events:<none>可以看到 Ingress 对象的路由规则 Host/Path 就是在 YAML 里设置的域名 ngx.test/
5. 使用 Ingress Controller准备好了 Ingress 和 Ingress Class,接下来就需要部署真正处理路由规则的 Ingress Controller 。
Nginx Ingress Controller 以 Pod 的形式运行在 Kubernetes 里 , 同时支持 Deployment 和 DaemonSet 两种部署方式 。我们现在根据 Nginx Ingress Controller Installation Docs 部署 Nginx Ingress Controller 。
在使用 kubectl 的主机上首先克隆仓库并进入部署文件夹:
$ git clone https://github.com/nginxinc/kubernetes-ingress.git --branch v2.4.1$ cd kubernetes-ingress/deploymentsNginx Ingress Controller 的安装略微麻烦一些,有很多个 YAML 需要执行 , 但如果只是做简单的试验,就只需要用到 4 个 YAML:
$ kubectl apply -f common/ns-and-sa.yamlnamespace/nginx-ingress createdserviceaccount/nginx-ingress created$ kubectl apply -f rbac/rbac.yamlclusterrole.rbac.authorization.k8s.io/nginx-ingress createdclusterrolebinding.rbac.authorization.k8s.io/nginx-ingress created$ kubectl apply -f common/nginx-config.yamlconfigmap/nginx-config created$ kubectl apply -f common/default-server-secret.yamlsecret/default-server-secret created前两条命令为 Ingress Controller 创建了一个独立的名字空间 nginx-ingress,还有相应的账号和权限,这是为了访问 apiserver 获取 Service、Endpoint 信息用的;后两条则是创建了一个 ConfigMap 和 Secret,用来配置 HTTP/HTTPS 服务 。
接下来我们还需要部署一些 Custom Resources,没有它们我们部署的 Ingress Controller 就无法运行:
默认情况下 , 需要为虚拟服务器、虚拟服务器路由、传输服务器和策略创建自定义资源的定义 。否则,Ingress Controller Pod 将不会变为 Ready 状态 。如果要禁用该要求,请将 -enable-custom-resources 命令行参数配置为 Readyfalse 并跳过此部分 。
$ kubectl apply -f common/crds/k8s.nginx.org_policies.yamlcustomresourcedefinition.apiextensions.k8s.io/policies.k8s.nginx.org created$ kubectl apply -f common/crds/k8s.nginx.org_transportservers.yamlcustomresourcedefinition.apiextensions.k8s.io/transportservers.k8s.nginx.org created$ kubectl apply -f common/crds/k8s.nginx.org_virtualserverroutes.yamlcustomresourcedefinition.apiextensions.k8s.io/virtualserverroutes.k8s.nginx.org created$ kubectl apply -f common/crds/k8s.nginx.org_virtualservers.yamlcustomresourcedefinition.apiextensions.k8s.io/virtualservers.k8s.nginx.org created

推荐阅读