
# 公网访问
#### 概述
公网访问是指使用外部网络访问负载，您可以给负载添加LoadBalancer类型的Service，配置ELB包含公网IP（ELB必须与负载在同一个VPC内），通过ELB实例访问负载。
#### 约束与限制
- 创建的ELB需要与负载所在命名空间在同一个VPC内。
- 在使用弹性公网IP（Elastic IP Address，简称EIP）前，请先了解EIP的使用限制。详细信息，请参见[弹性公网IP](https://support.huaweicloud.com/productdesc-eip/overview_0003.html)。
- CCI 2.0暂时不支持共享型负载均衡，建议您创建独享型ELB实例，且ELB实例已绑定公网IP。
 
#### 配置公网访问-工作负载创建完成后设置
在工作负载创建完成后对Service进行配置，此配置对工作负载状态无影响，且实时生效。具体操作如下：
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"服务管理"，在右侧页面单击"YAML创建"。
3. 导入或者添加Service yaml。 
   Service文件格式说明
   - Service.yaml资源描述
     ```
     apiVersion: cci/v2
     kind: Service
     metadata:
       name: service-1
       namespace: hyctest
       annotations:
         kubernetes.io/elb.class: elb
         kubernetes.io/elb.id: 123456789                               # 关联的elb id，只支持独享型elb，不支持共享型elb。
         kubernetes.io/elb.protocol-port: "http:80,https:81"           # ELB的协议及端口号，需要与spec.ports中的端口号对应。
         kubernetes.io/elb.cert-id: 123456789                          # ELB服务中的证书ID。
         kubernetes.io/elb.l7-keepalive-timeout: '0'                   # 七层监听器闲置超时时间。
         kubernetes.io/elb.l4-keepalive-timeout: '10'                  # 四层监听器闲置超时时间。
     spec:
       ports:
         - name: service-1
           protocol: TCP
           port: 80         #访问端口。
           targetPort: 80   #容器开放的端口。
         - name: service-2
           protocol: TCP
           port: 81
           targetPort: 81
         - name: service-3
           protocol: TCP
           port: 82
           targetPort: 82
         - name: service-4
           protocol: UDP
           port: 83
           targetPort: 83
       selector:
         app: a
       type: LoadBalancer
     ```
     
   
   - Service.json资源描述
     ```
     {
             "apiVersion": "cci/v2",
     "kind": "Service",
     "metadata": {
     "name": "service-1",
     "namespace": "hyctest",
     "annotations": {
     "kubernetes.io/elb.class": "elb",               # 关联的elb id，只支持独享型elb，不支持共享型elb。
     "kubernetes.io/elb.id": 123456789,              
     "kubernetes.io/elb.protocol-port": "http:80,https:81",# ELB协议及端口号，需要与spec.ports端口号对应。
     "kubernetes.io/elb.cert-id": 123456789,         # ELB服务中的证书ID。
     "kubernetes.io/elb.l7-keepalive-timeout": "0",  # 七层监听器闲置超时时间。
     "kubernetes.io/elb.l4-keepalive-timeout": "10"  # 四层监听器闲置超时时间。
     }
     },
     "spec": {
     "ports": [
     {
     "name": "service-1",
     "protocol": "TCP",
     "port": 80,            #访问端口。
     "targetPort": 80       #容器开放的端口。
     },
     {
     "name": "service-2",
     "protocol": "TCP",
     "port": 81,
     "targetPort": 81
     },
     {
     "name": "service-3",
     "protocol": "TCP",
     "port": 82,
     "targetPort": 82
     },
     {
     "name": "service-4",
     "protocol": "UDP",
     "port": 83,
     "targetPort": 83
     }
     ],
     "selector": {
     "app": "a"
     },
     "type": "LoadBalancer"
     }
     }
     ```
     
   
   
   
   
4. 单击"确定"，创建Service。查看服务管理页面，根据访问地址公网IP和端口映射中的访问端口\[公网IP:访问端口\]，即可通过公网访问负载。
 
#### 公网无法访问如何处理
- 公网能正常访问的前提是负载已处于运行中状态，如果您的负载处于未就绪或异常状态，公网访问将无法正常使用。
- 从负载开始创建到公网可以正常访问可需要1分钟到3分钟的时间，在此时间内网络路由尚未完成配置，请稍作等待。
- 负载创建3分钟以后仍然无法访问。可能原因是用户配置的容器端口实际上没有相应进程在监听，目前云容器实例服务无法检测出该类使用异常，需要您排查镜像是否有监听该容器端口。如果容器端口监听正确，此时无法访问的原因可能为ELB实例本身有问题，请排查ELB实例状态。
 
#### 更新Service
您可以在添加完Service后，更新此Service的访问端口。操作如下：
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"服务管理 "，在服务管理页面中，选择对应的命名空间，单击需要更新端口配置的Service后的"YAML编辑"。
3. 仅支持更新Service内访问端口参数修改： 
   端口配置：spec.ports\[i\].port：访问端口，端口范围为1-65535，可任意指定。
   ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
   Service创建完成后，不支持修改监听器协议（例如将TCP修改为UDP，或将HTTP修改为HTTPS）。如需修改协议，请删除原Service后重新创建。
   
   
4. 单击"确定"。工作负载已更新Service。
 
