公网访问
概述
公网访问是指使用外部网络访问负载,您可以给负载绑定共享型ELB实例(ELB必须与负载在同一个VPC内),通过ELB实例访问负载,当前外部访问支持四层和七层负载公网访问。
- 四层公网访问支持TCP和UDP两种协议,设置完成后可以通过“elb公网ip:elb端口”访问负载。
- 七层公网访问支持HTTP和HTTPS两种协议访问,设置完成后,可以通过“http://公网域名(或elb 公网ip):elb端口/映射路径”访问负载。
Service是基于四层TCP和UDP协议转发的,Ingress可以基于七层的HTTP和HTTPS协议转发,可以通过域名和路径做到更细粒度的划分,如下图所示。
下图是一个通过HTTP协议访问负载的示例。
约束与限制
使用弹性公网IP(Elastic IP,简称EIP)前,请先了解EIP的使用限制。
配置公网访问-创建工作负载时设置
在云容器实例中,您只需要在创建负载时选择“公网访问”,然后配置如下参数。
- 服务名称:服务名称即Service的名称,Service是用于管理Pod访问的对象。Service的详细信息请参见https://support.huaweicloud.com/intl/zh-cn/devg-cci/cci_05_0007.html。
- 安装coredns:coredns插件为您的其他负载提供内部域名解析服务,如果不安装coredns则无法通过“服务名称:负载访问端口”访问负载。
- ELB实例:选择ELB实例,如没有ELB实例可以单击“创建共享型ELB实例”去创建。
此处创建的ELB需要与负载所在命名空间在同一个VPC内。
CCI暂时不支持独享型负载均衡,建议您创建共享型ELB实例。
- ELB协议:即公网访问使用的通信协议,支持HTTP、HTTPS、TCP和UDP协议。
- Ingress名称:Ingress是用于管理七层协议访问的对象。此处如果不配置,云容器实例会默认负载名称作为Ingress名称。Ingress的详细信息请参见https://support.huaweicloud.com/intl/zh-cn/devg-cci/cci_05_0008.html。
- 公网域名(选择HTTP/HTTPS协议时可配置):通过域名访问负载,公网域名需要您自行购买,并将域名解析指向所选的ELB实例弹性公网IP。
- 证书(选择HTTPS协议时必填):SSL证书的导入方法请参见SSL证书。
- ELB端口:选择使用的ELB访问的具体协议和端口。
- 负载端口协议:访问负载的通信协议,可选择TCP或UDP,如果ELB协议选择为HTTP/HTTPS,则负载端口协议为TCP。
- 负载端口配置:
- 负载访问端口:负载提供的访问端口。
- 容器端口:容器监听的端口,负载访问端口映射到容器端口。
- HTTP路由配置
- 映射路径:URL访问的路径,必须以“/”开头,如“/api/web”,也可以是根路径“/”。
- 负载访问端口:前面设置的负载访问端口。
如下图所示,假如ELB实例的IP地址为“10.10.10.10”,则通过“http://10.10.10.10:6071/”就可以从公网访问到负载。
配置公网访问-工作负载创建完成后设置
在工作负载创建完成后对Service进行配置,此配置对工作负载状态无影响,且实时生效。具体操作如下:
- 登录云容器实例管理控制台,左侧导航栏中选择“网络管理 > 服务(Service)”,在右侧页面单击“添加服务”。
- 在“添加服务”页面,访问类型选择“负载均衡 LoadBalancer”。
- 设置弹性负载均衡访问参数。
- 服务名称:服务名称即Service的名称,Service是用于管理Pod访问的对象。
- 命名空间:工作负载所在命名空间。
- 关联工作负载:要添加Service的工作负载。
- 负载均衡:选择公网ELB实例,如没有ELB实例可以单击“创建ELB实例”去创建。
此处创建的ELB需要与负载所在命名空间在同一个VPC内。
CCI暂时不支持独享型负载均衡,建议您创建共享型ELB实例。
- 负载端口配置
- 协议:访问负载的通信协议,可选择TCP或UDP。
- 访问端口:负载提供的访问端口。
- 容器端口:容器监听的端口,负载访问端口映射到容器端口。
- 单击“提交”,工作负载已添加“负载均衡 LoadBalancer”的服务。
添加DNAT访问方式
工作负载创建后,如果想要使用公网访问Pod,除了使用ELB,还可以添加DNAT访问方式。具体操作如下:
- 创建一个NAT网关。
- 使用kubectl创建DNAT类型的Service,具体创建方式请参考Service,下面是一个DNAT类型的Service示例:
apiVersion: v1 kind: Service metadata: name: nginx namespace: default # 用户命名空间,默认为default annotations: kubernetes.io/elb.class: dnat # 类型DNAT kubernetes.io/natgateway.id: 4b8cda3d-3543-4ebd-a55e-ca610b3b3c43 # NAT网关ID spec: loadBalancerIP: 100.85.218.195 # DNAT使用的 EIP selector: app: nginx ports: - name: service0 targetPort: 80 # Pod 暴露的端口 port: 8080 # DNAT访问端口 protocol: TCP type: LoadBalancer # Service的类型
- 创建成功后,使用kubectl describe <service_name> -n <service_namespace> 可以查看Service更新状态。
创建并更新成功后,就可以使用EIP+Port的方式访问Pod了。
约束与限制:
添加Ingress访问方式
您可以在工作负载创建完成后为其添加Ingress类型的访问,此配置对工作负载状态无影响,且实时生效。具体操作如下:
- 登录云容器实例管理控制台,左侧导航栏中选择“网络管理 > 路由(Ingress)”,在右侧页面单击“添加路由”。
- 设置路由参数。
- 路由名称:自定义Ingress名称。
- 命名空间:选择需要添加Ingress的命名空间。
- 负载均衡:可以将互联网访问流量自动分发到工作负载所在的多个节点上。
- 对外端口:开放在负载均衡服务地址的端口,可任意指定。
- 对外协议:支持HTTP和HTTPS。如果选择HTTPS,请选择密钥证书,格式说明请参见证书格式。
- 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见使用Secret。
- 同一个ELB实例的同一个端口配置HTTPS时,一个监听器只支持配置一个密钥证书。如果使用两个不同的密钥证书将两个Ingress添加到同一个ELB下的同一个监听器,ELB侧实际只生效最初的证书。
- 域名:可选填。实际访问的域名地址,该域名需用户购买,并确保所填域名能解析到所选负载均衡实例的服务地址。一旦配置了域名规则,则必须使用域名访问。
- 路由配置:
- 配置完成后,单击“提交”。
创建完成后,在Ingress列表可查看到已创建成功的Ingress。
如何处理公网无法访问
- 公网能正常访问的前提是负载已处于运行中状态,如果您的负载处于未就绪或异常状态,公网访问将无法正常使用。
- 从负载开始创建到公网可以正常访问可需要1分钟到3分钟的时间,在此时间内网络路由尚未完成配置,请稍作等待。
- 负载创建3分钟以后仍然无法访问。单击创建的负载进入详情页,在详情页单击访问配置下面的“事件”标签,查看访问事件,查看是否有告警事件。如下两种常见的事件。
- Listener port is repeated:ELB监听器端口重复,是由于之前发布公网访问的负载,删除之后立刻创建使用相同ELB端口的公网访问负载,ELB实际删除端口需要一定的时间,因此首次创建失败,可以选择删除负载重新创建,也可以等待5-10分钟,公网访问可正常使用。
- Create listener failed:创建ELB监听器失败,创建监听器失败的原因一般是超过配额限度,请选择其他配额充足的ELB实例。
- 负载创建3分钟以后仍然无法访问,且无告警事件,可能原因是用户配置的容器端口实际上没有相应进程在监听,目前云容器实例服务无法检测出该类使用异常,需要您排查镜像是否有监听该容器端口。如果容器端口监听正确,此时无法访问的原因可能为ELB实例本身有问题,请排查ELB实例状态。
更新Service
您可以在添加完Service后,更新此Service的端口配置。操作如下:
- 登录云容器实例管理控制台,左侧导航栏中选择“网络管理 > 服务(Service)”,在Service页面中,选择对应的命名空间,单击需要更新端口配置的Service后的“更新”。
- 更新负载均衡参数:
- 命名空间:工作负载所在命名空间,更新时此处不可修改。
- 关联工作负载:要添加Service的工作负载,更新时此处不可修改。
- 服务名称:服务名称即Service的名称,Service是用于管理Pod访问的对象,更新时此处不可修改。
- 负载均衡:更新时此处不可修改。
- 端口配置
- 协议:访问负载的通信协议,可选择TCP或UDP。
- 访问端口:负载提供的访问端口。
- 容器端口:容器监听的端口,负载访问端口映射到容器端口。
- 单击“提交”。工作负载已更新Service。
更新Ingress
您可以在添加完Ingress后,更新此Ingress的端口、域名和路由配置。操作如下:
- 登录云容器实例管理控制台,左侧导航栏中选择“网络管理 > 路由(Ingress)”,选择对应的命名空间,单击待更新Ingress后的“更新”。
- 在“更新路由”页面,更新如下参数:
- 单击“提交”,工作负载已更新Ingress。