QingCloud 文档 – 服务 - kaiyun官方网站下载手机网页 /container/qke_plus/manual/service/ Recent content in 服务 on QingCloud 文档 Hugo -- gohugo.io Container: 服务概述 /container/qke_plus/manual/service/introduction/ Mon, 01 Jan 0001 00:00:00 +0000 /container/qke_plus/manual/service/introduction/ <h2 id="什么是服务">什么是服务</h2> <p>服务是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。每一个服务后面都有很多对应的容器来提供支持,对外表现为一个单一访问接口。借助服务,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。</p> <p>服务有一个固定 IP 地址(在创建 QEK 集群时有一个 “Service 网段” 的设置,这个网段专门用于给服务分配 IP 地址),服务将访问它的流量转发给 Pod,具体转发给哪些 Pod 通过 Label 来选择,而且服务可以给这些 Pod 做负载均衡。</p> <h2 id="服务类型">服务类型</h2> <p>Kubernetes 允许在您创建服务时,指定你所需要的服务类型。类型的取值及行为如下表说明。</p> <table> <thead> <tr> <th>服务类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>ClusterIP</td> <td>通过集群的内部 IP 暴露服务,即服务只能够在集群内部访问。 这也是默认的服务类型。<br/>当您的服务只需要在集群内部被访问时,请使用该类型。</td> </tr> <tr> <td>NodePort</td> <td>在每个节点的 IP 上开放一个静态端口,通过静态端口对外暴露服务。<code>NodePort</code> 服务会路由到自动创建的 <code>ClusterIP</code> 服务。通过请求 <code>&lt;节点 IP&gt;:&lt;节点端口&gt;</code>,你可以从集群的外部访问一个 <code>NodePort</code> 服务。<br/><div style="background-color: #D8ECDE; padding: 10px 24px; margin: 10px 0; border-left: 3px solid #00a971;"><b>注意</b><br/>除了测试以及非生产环境以外,不推荐在生产环境中直接通过集群节点对外甚至公网提供服务。从安全上考虑,使用该类型会直接暴露集群节点,容易受到攻击。</div></td> </tr> <tr> <td>LoadBalancer</td> <td>使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 <code>NodePort</code> 服务和 <code>ClusterIP</code> 服务上。<br/> <code>LoadBalancer</code>服务一般为需要暴露到公网的服务。</td> </tr> <tr> <td>externalName</td> <td>通过返回 <code>CNAME</code> 和对应值,可以将服务映射到 <code>externalName</code> 字段的内容(例如,<code>foo.bar.example.com</code>)。 无需创建任何类型代理。<div style="background-color: #D8ECDE; padding: 10px 24px; margin: 10px 0; border-left: 3px solid #00a971;"><b>说明</b><br/>需要使用 kube-dns 1.7 及以上版本或者 CoreDNS 0.0.8 及以上版本才能使用 <code>ExternalName</code> 类型。</div></td> </tr> <tr> <td>Headless</td> <td>Headless 服务即不需要 Cluster IP 的服务,可以在创建服务的时候指定 <code>spec.clusterIP=None</code>。<br/>Headless 服务包括两种类型:<ul><li>不指定 Selectors,但设置 externalName,通过 CNAME 记录处理</li><li>指定 Selectors,通过 DNS A 记录设置后端 Endpoints 列表</li></ul></td> </tr> </tbody> </table> Container: 查看服务 /container/qke_plus/manual/service/view_service/ Mon, 01 Jan 0001 00:00:00 +0000 /container/qke_plus/manual/service/view_service/ <p>服务创建后,您可以在 QKE 控制台查看。</p> <h2 id="前提条件">前提条件</h2> <p>服务已创建,包括系统创建及用户手动创建的服务。</p> <blockquote> <p><strong>说明</strong></p> <p>目前无法在 QKE 控制台创建服务,可通过 KubeSphere 等集群可视化工具进行创建。</p> </blockquote> <h2 id="操作步骤">操作步骤</h2> <ol> <li> <p>登录管理控制台。</p> </li> <li> <p>在控制台顶部的导航菜单中,选择<strong>产品与服务</strong> &gt; <strong>容器服务</strong> &gt; <strong>容器引擎 QKE</strong>,进入 QKE 集群列表页面。</p> </li> <li> <p>在集群列表,点击待查看集群的名称,进入<strong>集群概览</strong>页面。</p> </li> <li> <p>在左侧导航栏,选择<strong>资源管理</strong> &gt; <strong>服务</strong>,进入<strong>服务</strong>页面。</p> <p><img src="/container/qke_plus/_images/service_page.png" alt=""></p> <p>页面展示了服务的名称、所属命名空间、类型及访问 IP 等信息。</p> <ul> <li> <p>在<strong>服务类型</strong>列进行条件过滤,可分别查看不同类型的服务。</p> </li> <li> <p>可在搜索栏输入名称或命名空间查找符合条件的服务。</p> </li> </ul> </li> </ol> Container: 将服务暴露给外网 /container/qke_plus/manual/service/lb_service/ Mon, 01 Jan 0001 00:00:00 +0000 /container/qke_plus/manual/service/lb_service/ <p>通过为服务资源绑定一个“公网”类型的负载均衡器,使该服务对应的容器应用能够通过外部网络进行访问。</p> <h2 id="背景信息">背景信息</h2> <p>负载均衡( LoadBalancer )访问类型的服务可以通过负载均衡器从公网访问到工作负载,与弹性 IP 方式相比提供了高可靠的保障,一般用于系统中需要暴露到公网的服务。</p> <p>负载均衡访问方式由公网负载均衡器服务地址以及设置的访问端口组成,例如“10.10.10.10:80”。</p> <h2 id="约束与限制">约束与限制</h2> <ul> <li>不能使用集群内部自动创建的负载均衡器绑定到服务资源。</li> <li>只能选择集群同一私有网络(Vxnet)下的负载均衡器绑定到服务资源。</li> <li>负载均衡器目前支持 TCP/HTTP/HTTPS 协议监听。</li> <li>根据工信部规范,公网 IP 必须提交 ICP 备案信息,未备案公网 IP 80/443 端口的服务将被禁用。若负载均衡器公网 IP 未进行备案,请不要使用 80/443 端口。</li> </ul> <h2 id="前提条件">前提条件</h2> <ul> <li>请提前创建好用于绑定服务的负载均衡器。</li> <li>负载均衡器与 QKE 集群在同一私有网络下且已绑定公网 IP。</li> </ul> <h2 id="通过-qke-控制台">通过 QKE 控制台</h2> <ol> <li> <p>登录管理控制台。</p> </li> <li> <p>在控制台顶部的导航菜单中,选择<strong>产品与服务</strong> &gt; <strong>容器服务</strong> &gt; <strong>容器引擎 QKE</strong>,进入 QKE 集群列表页面。</p> </li> <li> <p>在集群列表,点击待查看集群的名称,进入<strong>集群概览</strong>页面。</p> </li> <li> <p>在左侧导航栏,选择<strong>资源管理</strong> &gt; <strong>服务</strong>,进入<strong>服务</strong>页面。</p> </li> <li> <p>在<strong>负载均衡器</strong>列,点击<strong>选择负载均衡器</strong>,弹出负载均衡器选择对话框。</p> <img src="/container/qke_plus/_images/service_select_lb_1.png" style="zoom:50%;" /> </li> <li> <p>在下拉列表中选择需要使用的负载均衡器。</p> <img src="/container/qke_plus/_images/service_select_lb.png" style="zoom:50%;" /> </li> <li> <p>选择监听协议及端口,若选择 HTTPS 协议,还需要添加服务器证书。</p> <blockquote> <p><strong>说明</strong></p> <p>若未创建服务器证书,请参见<a href="/network/loadbalancer/manual/certificate/create_cert/">创建服务器证书</a>进行创建。</p> </blockquote> </li> <li> <p>配置完成后,点击<strong>确定</strong>。</p> </li> </ol> <h2 id="通过-yaml-文件配置">通过 YAML 文件配置</h2> <p>通过服务 YAML 文件中的 Annotation(注解),可以实现丰富的负载均衡功能。</p> <p>为服务创建一个公网负载均衡器并指定负载均衡器规格,配置示例如下:</p> <pre tabindex="0"><code>apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids: &#34;${loadbalancer_eip}&#34; service.beta.kubernetes.io/qingcloud-load-balancer-type: &#34;${loadbalancer_typ}&#34; name: nginx namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: LoadBalancer </code></pre><p>关键参数说明如下:</p> <ul> <li> <p><code>service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids</code></p> <p>该 annotation 表示要创建公网类型的负载均衡器,其值为您在开·云app官方版下载上创建好的公网 IP ID 号,系统会自动创建负载均衡器并绑定此公网 IP。公网 IP 必须是可用状态。</p> </li> <li> <p><code>service.beta.kubernetes.io/qingcloud-load-balancer-type</code></p> <p>表示负载均衡器的规格,其值与 <a href="/network/loadbalancer/api/loadbanlancer/create_lb/">CreateLoadBalancer</a> 接口中的 <code>loadbalancer_typ</code> 取值范围相同。</p> </li> </ul> <p>更多更详细的负载均衡器配置说明,请参见<a href="../ccm_config/">负载均衡器插件配置指南</a>。</p> Container: 配置负载均衡器 /container/qke_plus/manual/service/ccm_config/ Mon, 01 Jan 0001 00:00:00 +0000 /container/qke_plus/manual/service/ccm_config/ <p>本文主要介绍需要对接开·云app官方版下载负载均衡器插件时,如何通过配置服务的注解(Annotation)来实现服务的一些高级配置功能。</p> <h2 id="背景信息">背景信息</h2> <p>进行配置操作前,您需要了解以下背景知识:</p> <ul> <li> <p>关于服务注解(Annotation):</p> <p>服务的注解记录了关于当前服务的额外配置,使用 key/value 键值对的形式进行定义。详细介绍及使用说明请参见 <a href="https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/annotations/">Kubernetes 官方文档</a>。</p> </li> <li> <p>关于负载均衡器插件(cloud-controller-manager):</p> <p><a href="https://github.com/yunify/qingcloud-cloud-controller-manager">cloud-controller-manager</a> 是开·云app官方版下载自主研发的负载均衡器插件,自动集成于 QKE 中。支持将 Kubernetes 内部服务和 QingCloud 负载均衡器关联起来,可自动创建负载均衡器、公网 IP,通过负载均衡器将服务暴露给集群外部调用。</p> </li> </ul> <h2 id="约束与限制">约束与限制</h2> <p>除本文介绍的相关配置外,更多的功能支持,如<strong>转发规则定义</strong>、<strong>透明代理</strong>等功能还在开发中,目前暂不支持。建议您可以在<a href="https://console.qingcloud.com/pek3/loadbalancers/">负载均衡器控制台</a>进行负载均衡器的更多更全面的配置。</p> <blockquote> <p><strong>注意</strong></p> <p>请勿随意修改集群内部系统自动创建的负载均衡器配置,尤其是 K8s apiserver 使用的负载均衡监听器(监听协议/端口为 TCP/6443),若修改将导致 K8s apiserver 不可用。</p> </blockquote> <h2 id="配置负载均衡器属性">配置负载均衡器属性</h2> <p><strong>配置方法</strong></p> <ul> <li>通过在 Service 的<code>annotations</code>中添加<code>ServiceAnnotationLoadBalancerType</code>来配置负载均衡器的规格。不添加此 key 的 Service 在 Event 中会有错误。其值范围与 <a href="/network/loadbalancer/api/loadbanlancer/create_lb/">CreateLoadBalancer</a> 接口中的 <code>loadbalancer_typ</code> 取值范围相同。</li> <li>开·云app官方版下载负载均衡器支持 http/https 协议的负载均衡,如果想要使用负载均衡器的七层能力,请将服务的特定的端口<code>name</code>指定为为<code>http</code>或<code>https</code>。</li> </ul> <p><strong>配置示例</strong></p> <pre tabindex="0"><code>kind: Service apiVersion: v1 metadata: name: mylbapp annotations: service.beta.kubernetes.io/qingcloud-load-balancer-type: &#34;0&#34; #这里指定负载均衡器实例的规格 spec: selector: app: mylbapp type: LoadBalancer ports: - name: http #这里指定 port name,如果有多个http端口,都可以指定为http port: 8088 targetPort: 80 </code></pre><h2 id="配置负载均衡器公网-ip">配置负载均衡器公网 IP</h2> <p>使用开·云app官方版下载负载均衡器时需要配置一个公网 IP,cloud-controller 带有 IP 管理功能。</p> <h3 id="手动配置公网-ip">手动配置公网 IP</h3> <p><strong>配置方法</strong></p> <p>这是本插件的默认方式,即用户需要在 Service 中添加公网 IP 的 Annotation。</p> <ul> <li>首先在 Service Annotation 中添加 Key:<code>service.beta.kubernetes.io/qingcloud-load-balancer-eip-source</code>,并设置其值为<code>mannual</code>。如果不设置此Key,则默认是<code>mannual</code>。</li> <li>然后必须继续添加 Key:<code>service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids</code>,其值公网 IP 的 ID,如果需要绑定多个 IP,以逗号分隔。请确保公网 IP 处于<code>可用</code>状态。</li> </ul> <p><strong>配置示例</strong></p> <pre tabindex="0"><code>kind: Service apiVersion: v1 metadata: name: mylbapp annotations: service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids: &#34;eip-xxxxx&#34; #这里指定公网IP的ID service.beta.kubernetes.io/qingcloud-load-balancer-type: &#34;0&#34; spec: selector: app: mylbapp type: LoadBalancer ports: - name: http port: 8088 targetPort: 80 </code></pre><h3 id="自动获取公网-ip">自动获取公网 IP</h3> <p><strong>自动获取方式</strong></p> <p>自动获取 IP 有三种方式:</p> <ul> <li>自动获取当前账户下处于可用的公网 IP,如果找不到返回错误。</li> <li>自动获取当前账户下处于可用的公网 IP,如果找不到则申请一个新的。</li> <li>不管账户下有没有可用的公网 IP,申请一个新公网 IP。</li> </ul> <p><strong>配置方法</strong></p> <p>开启公网 IP 自动获取的功能,需进行如下操作:</p> <ol> <li>在集群的配置文件中<code>/etc/kubernetes/qingcloud.conf</code>配置<code>userID</code>。因为一些用户 API 权限较大,会获取到其他用户的 IP。</li> <li>配置 Service Annotations 中的<code>service.beta.kubernetes.io/qingcloud-load-balancer-eip-source</code> 不为<code>mannual</code>,上述三种获取方式对应的值分别为: <ul> <li><code>use-available</code></li> <li><code>auto</code></li> <li><code>allocate</code></li> </ul> </li> </ol> <p><strong>配置示例</strong></p> <pre tabindex="0"><code>kind: Service apiVersion: v1 metadata: name: mylbapp annotations: service.beta.kubernetes.io/qingcloud-load-balancer-eip-source: &#34;auto&#34; # 指定自动获取方式,可填填 auto、use-available 或 allocate service.beta.kubernetes.io/qingcloud-load-balancer-type: &#34;0&#34; spec: selector: app: mylbapp type: LoadBalancer ports: - name: http port: 8088 targetPort: 80 </code></pre><h2 id="配置使用云上现有的负载均衡器">配置使用云上现有的负载均衡器</h2> <p><strong>注意事项</strong></p> <ul> <li>在此模式下,负载均衡器的一些功能属性,包括七层协议、规格、公网 IP 都由用户配置,负载均衡器插件不会修改任何属性,除了增删一些监听器。</li> <li>请确保负载均衡器处于正常工作状态,并且和 Service 对应的端口不冲突,即已有监听器的监听端口不能和需要暴露的服务冲突。</li> </ul> <p><strong>配置方法</strong></p> <ol> <li>添加 key <code>service.beta.kubernetes.io/qingcloud-load-balancer-eip-strategy</code> ,设置期值为 <code>reuse-lb</code>。</li> <li>添加 key <code>service.beta.kubernetes.io/qingcloud-load-balancer-id</code>,设置其值为现有的负载均衡器 ID,类似&quot;lb-xxxxxx&quot;。</li> </ol> <blockquote> <p><strong>说明</strong></p> <p>其余设置都会被负载均衡器插件忽略。</p> </blockquote> <p><strong>配置示例</strong></p> <pre tabindex="0"><code>kind: Service apiVersion: v1 metadata: name: reuse-lb annotations: service.beta.kubernetes.io/qingcloud-load-balancer-eip-strategy: &#34;reuse-lb&#34; service.beta.kubernetes.io/qingcloud-load-balancer-id: &#34;lb-oglqftju&#34; spec: selector: app: mylbapp type: LoadBalancer ports: - name: http port: 8090 targetPort: 80 </code></pre><h2 id="配置监听器属性">配置监听器属性</h2> <p><strong>配置方法</strong></p> <ul> <li>设置监听器的健康检查方式:添加 key <code>service.beta.kubernetes.io/qingcloud-lb-listener-healthycheckmethod</code>,设置其值为“监听端口:检查方式”。对于 TCP 协议监听器,检查方式默认为 <code>TCP</code>,对于 UDP 协议监听器,检查方式默认为<code>UDP</code>。</li> <li>设置监听器的健康检查参数:添加 key <code>service.beta.kubernetes.io/qingcloud-lb-listener-healthycheckoption</code>,设置其值为“监听端口:检查参数”,检查参数默认值为 <code>10|5|2|5</code>,分别对应“检查间隔|超时时间|不健康阈值|健康阈值”。</li> <li>设置负载均衡方式:添加 key <code>service.beta.kubernetes.io/qingcloud-lb-listener-balancemode</code>,支持 roundrobin(轮询)、leastconn(最少连接)、source(源地址) 三种负载均衡方式,默认为 <code>roundrobin</code>。</li> <li>配置 HTTPS 协议及证书,添加 key <code>service.beta.kubernetes.io/qingcloud-lb-listener-cert</code>,设置其值为“监听端口:证书ID”。如果配置了证书,则监听器使用 https 协议,没有此注解则默认使用 Service 所用协议。</li> <li>配置多个监听器时,通过逗号分隔,区分不同监听器:<code>80:xxx,443:xxx</code>。</li> </ul> <blockquote> <p>说明</p> <p>监听器参数说明,请参考<a href="https://docsv3.qingcloud.com/network/loadbalancer/api/listener/modify_listener_attribute/">监听器 API 文档</a>。</p> </blockquote> <p><strong>配置示例</strong></p> <pre tabindex="0"><code>apiVersion: v1 metadata: name: reuse-lb annotations: service.beta.kubernetes.io/qingcloud-load-balancer-eip-strategy: &#34;reuse-lb&#34; service.beta.kubernetes.io/qingcloud-load-balancer-id: &#34;lb-oglqftju&#34; service.beta.kubernetes.io/qingcloud-lb-listener-healthycheckmethod: &#34;8090:tcp&#34; service.beta.kubernetes.io/qingcloud-lb-listener-healthycheckoption: &#34;8090:10|5|2|5&#34; service.beta.kubernetes.io/qingcloud-lb-listener-balancemode: &#34;8090:source&#34; service.beta.kubernetes.io/qingcloud-lb-listener-cert: &#34;8090:sc-77oko7zj&#34; spec: selector: app: mylbapp type: LoadBalancer ports: - name: http port: 8090 protocol: TCP targetPort: 80 </code></pre><h2 id="配置内网负载均衡器">配置内网负载均衡器</h2> <p><strong>已知问题</strong></p> <p>Kubernetes 在 ipvs 模式下,kube-proxy 会把内网负载均衡器的 IP 绑定在 ipvs 接口上,这样会导致从负载均衡器过来的包被 drop(进来的是主网卡,但是出去的时候发现 ipvs 有这么一个 IP,路由不一致),故目前无法在 ipvs 模式下使用内网负载均衡器。详情参考 <a href="https://github.com/kubernetes/kubernetes/issues/79783">issue</a>。</p> <p><strong>配置方法</strong></p> <ul> <li>必须手动指定<code>service.beta.kubernetes.io/qingcloud-load-balancer-network-type</code>为<code>internal</code>,如果不指定或者填写其他值,则默认为公网负载均衡器,需要配置公网 IP。</li> <li>可指定负载均衡器所在的私有网络,默认为创建 LB 插件配置文件中的<code>defaultVxnet</code>,手动配置私有网络,需要添加此 Annotation:<code>service.beta.kubernetes.io/qingcloud-load-balancer-vxnet-id:{vxnet-id}</code></li> <li>可指定负载均衡器内网 IP,通过添加 key <code>service.beta.kubernetes.io/qingcloud-load-balancer-internal-ip</code>指定。</li> </ul> <blockquote> <p><strong>注意</strong></p> <p>当前不支持更换内网 IP。</p> </blockquote> <p><strong>配置示例</strong></p> <pre tabindex="0"><code>kind: Service apiVersion: v1 metadata: name: mylbapp namespace: default annotations: service.beta.kubernetes.io/qingcloud-load-balancer-type: &#34;0&#34; service.beta.kubernetes.io/qingcloud-load-balancer-network-type: &#34;internal&#34; service.beta.kubernetes.io/qingcloud-load-balancer-internal-ip: &#34;192.168.0.1&#34; ##如果要路由器自动分配删掉这一行 spec: selector: app: mylbapp type: LoadBalancer ports: - name: http port: 80 targetPort: 80 </code></pre>