华为云用户手册

  • 通过kubectl命令行设置 您可以通过对Deployment添加annotations指定Pod的IPv6双栈网卡将要加入的共享带宽,如下所示。 ... spec: selector: matchLabels: app: demo version: v1 template: metadata: annotations: yangtse.io/ipv6-bandwidth-id: "xxx" yangtse.io/ipv6-bandwidth-id:共享带宽的ID,Pod对应的IPv6双栈网卡将加入此共享带宽。该ID可前往弹性公网IP控制台中的“共享带宽”页面查询。
  • 解决方案 问题场景一:ntpd运行异常 请登录该节点,执行systemctl status ntpd命令查询ntpd服务运行状态。若回显状态异常,请执行systemctl restart ntpd命令后重新查询状态。 以下为正常回显: 图1 ntpd运行状态 若重启ntpd服务无法解决该问题,请联系技术支持人员。 问题场景二:chronyd运行异常 请登录该节点,执行systemctl status chronyd命令查询chronyd服务运行状态。若回显状态异常,请执行systemctl restart chronyd命令后重新查询状态。 以下为正常回显: 图2 chronyd运行状态 若重启chronyd服务无法解决该问题,请联系技术支持人员。
  • 节点最大Pod数量计算方式 根据集群类型不同,节点可创建的最大Pod数量计算方式如下: 对于“容器隧道网络”的集群,仅取决于节点最大实例数。 对于“VPC网络”的集群,取决于节点最大实例数和节点可分配容器IP数中的最小值,建议节点最大实例数不要超过节点可分配容器IP数,否则当容器IP数不足时Pod实例可能无法调度。 对于“云原生2.0网络”的集群( CCE Turbo 集群),取决于节点最大实例数和CCE Turbo集群节点网卡数量中的最小值。建议节点最大实例数不要超过节点网卡数,否则当节点规格可分配网卡不足时Pod实例可能无法正常调度。
  • 节点可分配容器IP数 在创建CCE集群时,如果网络模型选择“VPC网络”,会让您选择每个节点可供分配的容器IP数量(alpha.cce/fixPoolMask)。Pod直接使用宿主机的网络(配置hostNetwork: true)时,不占用可分配容器IP,详情请参见容器网络 vs 主机网络。 该参数会影响节点上可以创建最大Pod的数量,因为每个Pod会占用一个IP(使用容器网络的情况),如果可用IP数量不够的话,就无法创建Pod。Pod直接使用宿主机的网络(配置hostNetwork: true)时,不占用可分配容器IP。 图1 VPC网络模型节点可分配容器IP数配置 节点默认会占用掉3个容器IP地址(网络地址、网关地址、广播地址),因此节点上 可分配给容器使用的IP数量 = 您选择的容器IP数量 - 3,例如上面图中可分配给容器使用的IP数量为 128-3=125。
  • 节点最大实例数 在创建节点时,可以配置节点可以创建的最大实例数(maxPods)。该参数是kubelet的配置参数,决定kubelet最多可创建多少个Pod。 对于默认节点池(DefaultPool)中的节点,节点创建完成后,最大实例数不支持修改。 对于自定义节点池中的节点,创建完成后可通过修改节点池配置中的max-pods参数,修改节点最大实例数。详情请参见节点池配置管理。 默认场景下,节点最大实例数最多可调整至256。如果您期望提升节点上的部署密度,您可以提交工单申请调整节点最大实例数,最大支持修改至512个实例。 图2 节点最大实例数配置 根据节点规格不同,节点默认最大实例数如表1所示。 表1 节点默认最大实例数 内存 节点默认最大实例数 4G 20 8G 40 16G 60 32G 80 64G及以上 110
  • 容器网络 vs 主机网络 创建Pod时,可以选择Pod使用容器网络或是宿主机网络。 容器网络:默认使用容器网络,Pod的网络由集群网络插件负责分配,每个Pod分配一个IP地址,会占用容器网络的IP。 主机网络:Pod直接使用宿主机的网络(Pod需要配置hostNetwork: true),会占用宿主机的端口,Pod的IP就是宿主机的IP,不会占用容器网络的IP。使用时需要考虑是否与宿主机上的端口冲突,因此一般情况下除非您知道需要某个特定应用占用宿主机上的特定端口时,不建议使用主机网络。
  • 解决方案 由于当前GPU插件的驱动配置由您自行配置,需要您验证两者的兼容性。建议您在测试环境验证安装升级目标版本的GPU插件,并配置当前GPU驱动后,测试创建节点是否正常使用。 您可以执行以下步骤确认GPU插件的升级目标版本与当前驱动配置。 登录CCE控制台,前往“插件中心”处查看GPU插件。 gpu-beta插件与gpu-device-plugin插件为同一插件。gpu-beta插件在2.0.0版本后,正式更名为gpu-device-plugin。 单击该插件的“升级”按钮,查看插件目标版本及驱动配置。 在测试环境验证安装升级目标版本的GPU插件,并配置当前GPU驱动后,测试创建节点是否正常使用。 如果两者不兼容,您可以尝试替换高版本驱动。如有需要,请联系技术支持人员。
  • 为API Server绑定EIP 登录CCE控制台,单击集群名称进入集群。 查看集群概览页,在右边“连接信息”下公网地址一栏,单击“绑定”。 选择一个已有的弹性公网IP。如果无可用IP,可单击“创建弹性IP”前往EIP控制台进行创建。 通过绑定EIP实现公网访问,集群存在风险,建议绑定的EIP配置 DDoS高防服务 或配置API Server访问策略。 绑定EIP将会短暂重启集群API Server并更新kubeconfig证书,请避免在此期间操作集群。 单击“确定”。
  • 通过kubectl命令行设置 您可以通过对工作负载添加annotations指定出口带宽和入口带宽,如下所示。 apiVersion: apps/v1 kind: Deployment metadata: name: test namespace: default labels: app: test spec: replicas: 2 selector: matchLabels: app: test template: metadata: labels: app: test annotations: kubernetes.io/ingress-bandwidth: 100M kubernetes.io/egress-bandwidth: 100M spec: containers: - name: container-1 image: nginx:alpine imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret kubernetes.io/ingress-bandwidth:Pod的入口带宽 kubernetes.io/egress-bandwidth:Pod的出口带宽 如果不设置这两个参数,则表示不限制带宽。 修改Pod出/入口带宽限速后,需要重启容器才可生效。由于独立创建的Pod(不通过工作负载管理)修改annotations后不会触发容器重启,因此带宽限制不会生效,您可以重新创建Pod或手动触发容器重启。
  • 约束与限制 Pod互访限速设置需遵循以下约束: 约束类别 容器隧道网络模式 VPC网络模式 云原生2.0网络模式 支持的版本 所有版本都支持 v1.19.10以上集群版本 v1.19.10以上集群版本 支持的运行时类型 仅支持普通容器 支持的Pod类型 仅支持非HostNetwork类型Pod 支持的场景 支持Pod间互访、Pod访问Node、Pod访问Service的场景限速 限制的场景 无 无 不支持Pod访问100.64.0.0/10和214.0.0.0/8外部云服务网段的限速场景 不支持健康检查的流量限速场景 限速值取值范围 只支持单位M或G的限速配置,如100M,1G;最小取值1M,最大取值4.29G。
  • 使用密钥设置工作负载的环境变量 使用控制台方式 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏选择“工作负载”,单击右上角“创建工作负载”。 在创建工作负载时,在“容器配置”中找到“环境变量”,单击“新增变量”。 密钥导入:选择一个密钥,将密钥中所有键值都导入为环境变量。 密钥项键值导入:将密钥中某个键的值导入作为某个环境变量的值。 变量名称:工作负载中的环境变量名称,可自定义,默认为密钥中选择的键名。 变量/变量引用:选择一个密钥及需要导入的键名,将其对应的值导入为工作负载环境变量。 例如将mysecret这个密钥中“username”的值导入,作为工作负载环境变量“username”的值,导入后容器中将会有一个名为“username”的环境变量。 配置其他工作负载参数后,单击“创建工作负载”。 等待工作负载正常运行后,您可登录容器执行以下语句,查看该密钥是否已被设置为工作负载的环境变量。 printenv username 如输出与Secret中的内容一致,则说明该密钥已被设置为工作负载的环境变量。 使用kubectl方式 请参见通过kubectl连接集群配置kubectl命令。 创建并编辑nginx-secret.yaml文件。 vi nginx-secret.yaml YAML文件内容如下: 密钥导入:如果要将一个密钥中所有数据都添加到环境变量中,可以使用envFrom参数,密钥中的Key会成为工作负载中的环境变量名称。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest envFrom: # 使用envFrom来指定环境变量引用的密钥 - secretRef: name: mysecret # 引用的密钥名称 imagePullSecrets: - name: default-secret 密钥键值导入:您可以在创建工作负载时将密钥设置为环境变量,使用valueFrom参数单独引用Secret中的Key/Value。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest env: # 设置工作负载中的环境变量 - name: SECRET_USERNAME # 工作负载中的环境变量名称 valueFrom: # 使用valueFrom来指定环境变量引用的密钥 secretKeyRef: name: mysecret # 引用的密钥名称 key: username # 引用的密钥中的key - name: SECRET_PASSWORD # 添加多个环境变量参数,可同时导入多个环境变量 valueFrom: secretKeyRef: name: mysecret key: password imagePullSecrets: - name: default-secret 创建工作负载。 kubectl apply -f nginx-secret.yaml 创建完成后,查看Pod中的环境变量。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep nginx-secret 预期输出如下: nginx-secret-*** 1/1 Running 0 2m18s 执行以下命令,查看该Pod中的环境变量。 kubectl exec nginx-secret-*** -- printenv SPECIAL_USERNAME SPECIAL_PASSWORD 如输出与Secret中的内容一致,则说明该密钥已被设置为工作负载的环境变量。
  • 检查Pod的EIP就绪 容器网络控制器会在Pod IP分配后,为Pod绑定EIP并回写分配结果至Pod的annotation(yangtse.io/allocated-ipv4-eip),Pod业务容器的启动时间可能早于EIP分配结果回写成功时间。 您可以尝试为Pod配置init container并使用downwardAPI类型的存储卷把yangtse.io/allocated-ipv4-eip的annotation通过volume挂载到init container里,并在init container中检查EIP是否已经分配成功。您可以参考以下示例配置init container。 apiVersion: v1 kind: Pod metadata: name: example annotations: yangtse.io/pod-with-eip: "true" yangtse.io/eip-bandwidth-size: "5" yangtse.io/eip-network-type: 5_bgp yangtse.io/eip-charge-mode: bandwidth yangtse.io/eip-bandwidth-name: "xxx" spec: initContainers: - name: init image: busybox:latest command: ['timeout', '60', 'sh', '-c', "until grep -E '[0-9]+' /etc/eipinfo/allocated-ipv4-eip; do echo waiting for allocated-ipv4-eip; sleep 2; done"] volumeMounts: - name: eipinfo mountPath: /etc/eipinfo volumes: - name: eipinfo downwardAPI: items: - path: "allocated-ipv4-eip" fieldRef: fieldPath: metadata.annotations['yangtse.io/allocated-ipv4-eip'] ...
  • 约束限制 绑定EIP的Pod,如果要被公网成功访问,需要添加放通相应请求流量的安全组规则。 单个Pod只能绑定单个EIP。 创建Pod时,可指定相关的annotation配置EIP的属性,创建完成后,更新EIP相关的annotation均无效。 与Pod关联的EIP不要通过弹性公网IP的console或API直接操作(修改名称/删除/解绑/绑定/转包周期等操作),否则可能导致EIP功能异常。 自动创建的EIP被手动删除后,会导致网络异常,需要重建Pod。
  • 约束与限制 使用对象存储时,挂载点不支持修改属组和权限。 对于并行文件系统,CCE支持通过OBS SDK方式和PVC挂载方式使用,其中PVC挂载方式是通过OBS服务提供的obsfs工具实现。在节点上每挂载一个并行文件系统对象存储卷,就会产生一个obsfs常驻进程。如下图所示: 图1 obsfs常驻进程 建议为每个obsfs进程预留1G的内存空间,例如4U8G的节点,则建议挂载obsfs并行文件系统的实例不超过8个。 obsfs常驻进程是直接运行在节点上,如果消耗的内存超过了节点上限,则会导致节点异常。例如在4U8G的节点上,运行的挂载并行文件系统卷的实例超过100+,有极大概率会导致节点异常不可用。因此强烈建议控制单个节点上的挂载并行文件系统实例的数量。 在使用obsfs工具时,还需遵循obsfs约束与限制。 安全容器不支持使用对象存储。 挂载普通桶时不支持硬链接(Hard Link)。 支持多个PV挂载同一个对象存储,但有如下限制: 多个不同的PVC/PV使用同一个底层对象存储卷时,如果挂载至同一Pod使用,会因为PV的volumeHandle参数值相同导致无法挂载,请避免该使用场景。 PV中persistentVolumeReclaimPolicy参数建议设置为Retain,否则可能存在一个PV删除时,级联删除底层卷,其他关联这个底层卷的PV会由于底层存储被删除导致使用出现异常。 重复用底层存储时,数据一致性由您自行维护。建议在应用层做好多读多写的隔离保护,合理规划文件使用时间,避免出现多个客户端写同一个文件的情况,防止产生数据覆盖和丢失。
  • 验证数据持久化及共享性 查看部署的应用及文件。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-mjhm9 1/1 Running 0 46s web-demo-846b489584-wvv5s 1/1 Running 0 46s 依次执行以下命令,查看Pod的/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data kubectl exec web-demo-846b489584-wvv5s -- ls /data 两个Pod均无返回结果,说明/data路径下无文件。 执行以下命令,在/data路径下创建static文件。 kubectl exec web-demo-846b489584-mjhm9 -- touch /data/static 执行以下命令,查看/data路径下的文件。 kubectl exec web-demo-846b489584-mjhm9 -- ls /data 预期输出如下: static 验证数据持久化 执行以下命令,删除名称为web-demo-846b489584-mjhm9的Pod。 kubectl delete pod web-demo-846b489584-mjhm9 预期输出如下: pod "web-demo-846b489584-mjhm9" deleted 删除后,Deployment控制器会自动重新创建一个副本。 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下,web-demo-846b489584-d4d4j为新建的Pod: web-demo-846b489584-d4d4j 1/1 Running 0 110s web-demo-846b489584-wvv5s 1/1 Running 0 7m50s 执行以下命令,验证新建的Pod中/data路径下的文件是否更改。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: static static文件仍然存在,则说明数据可持久化保存。 验证数据共享性 执行以下命令,查看已创建的Pod。 kubectl get pod | grep web-demo 预期输出如下: web-demo-846b489584-d4d4j 1/1 Running 0 7m web-demo-846b489584-wvv5s 1/1 Running 0 13m 执行以下命令,在任意一个Pod的/data路径下创建share文件。本例中选择名为web-demo-846b489584-d4d4j的Pod。 kubectl exec web-demo-846b489584-d4d4j -- touch /data/share 并查看该Pod中/data路径下的文件。 kubectl exec web-demo-846b489584-d4d4j -- ls /data 预期输出如下: share static 由于写入share文件的操作未在名为web-demo-846b489584-wvv5s的Pod中执行,在该Pod中查看/data路径下是否存在文件以验证数据共享性。 kubectl exec web-demo-846b489584-wvv5s -- ls /data 预期输出如下: share static 如果在任意一个Pod中的/data路径下创建文件,其他Pod下的/data路径下均存在此文件,则说明两个Pod共享一个存储卷。
  • 删除网络配置 您可以查看新添加网络配置的YAML,也可以对新添加的配置进行“删除”操作。 在删除网络配置时,需先删除该配置所对应的容器,否则将删除失败。 执行以下命令筛选集群中使用该配置的Pod(其中example为示例配置名称,请自行替换): kubectl get po -A -o=jsonpath="{.items[?(@.metadata.annotations.cni\.yangtse\.io/network-status=='[{\"name\":\"example\"}]')]['metadata.namespace', 'metadata.name']}" 返回结果中包含了该配置关联的Pod名字及命名空间。 删除创建该Pod的Owner,其Owner可能为Deployment、StatefulSet、DaemonSet或Job类型的工作负载。
  • 通过控制台创建工作负载类型的容器网络配置 登录CCE控制台。 单击集群名称进入集群,在左侧选择“配置中心”,选择“网络配置”页签。 集群中存在默认容器网络配置default-network,对所有未配置自定义容器网络配置的Pod生效,“总览”页面的网络信息中的“默认容器子网”即为default-network中的容器子网。 查看“自定义容器网络配置”,单击“添加自定义容器网络配置”,在弹窗中配置容器子网和安全组等信息。 名称:自定义容器网络配置名称,最长支持253个字符。default-network、default、mgnt0、mgnt1四个名称为系统预留,请勿使用。 关联资源类型:自定义容器网络配置关联的资源类型,详情请参见表1。创建命名空间类型的容器网络配置请选择“工作负载”类型。 容器子网:请选择子网。若无子网可选请单击后方的“创建子网”进行创建,创建完成后单击刷新按钮。最多可选择 20 个子网。 关联安全组:默认为容器ENI安全组,您也可以选择单击后方的“创建安全组”进行创建,创建完成后单击刷新按钮。最多可选择5个安全组。 图3 创建工作负载类型的容器网络配置 完成基本配置后单击“创建”,创建完成后页面自动返回到自定义容器网络配置列表,可以看到新创建的容器网络配置已在列表中。 图4 容器网络配置列表 在创建工作负载时,可选择自定义的容器网络配置。 在左侧导航栏中选择“工作负载”,在右侧选择“无状态负载”页签。 单击页面右上角“创建工作负载”,在“高级配置”中选择“网络配置”页签,并选择是否开启指定容器网络配置。 选择一个已有的容器网络配置。如果没有可用的网络配置,可单击“添加自定义容器网络配置”进行创建。 图5 选择容器网络配置 工作负载其余信息都配置完成后,单击“创建工作负载”。 返回到“配置中心”,在容器网络配置列表里可以看到创建的容器网络配置关联的资源名称。 图6 查看容器网络配置关联的资源
  • 通过控制台创建命名空间类型的容器网络配置 登录CCE控制台。 单击集群名称进入集群,在左侧选择“配置中心”,选择“网络配置”页签。 集群中存在默认容器网络配置default-network,对所有未配置自定义容器网络配置的Pod生效,“总览”页面的网络信息中的“默认容器子网”即为default-network中的容器子网。 查看“自定义容器网络配置”,单击“添加自定义容器网络配置”,在弹窗中配置容器子网和安全组等信息。 名称:自定义容器网络配置名称,最长支持253个字符。default-network、default、mgnt0、mgnt1四个名称为系统预留,请勿使用。 关联资源类型:自定义容器网络配置关联的资源类型,详情请参见表1。创建命名空间类型的容器网络配置请选择“命名空间”类型。 命名空间:请选择您需要关联的命名空间。不同容器网络配置之间关联的命名空间不可重复。若无命名空间可选请单击后方的“创建命名空间”进行创建。 容器子网:请选择子网。若无子网可选请单击后方的“创建子网”进行创建,创建完成后单击刷新按钮。最多可选择 20 个子网。 关联安全组:默认为容器ENI安全组,您也可以选择单击后方的“创建安全组”进行创建,创建完成后单击刷新按钮。最多可选择5个安全组。 图1 创建命名空间类型的容器网络配置 完成基本配置后单击“创建”,创建完成后页面自动返回到自定义容器网络配置列表,可以看到新创建的容器网络配置已在列表中。 图2 容器网络配置列表
  • 操作场景 CCE Turbo集群支持以命名空间或工作负载粒度设置容器所在的容器子网及安全组,该功能通过名为NetworkAttachmentDefinition的CRD资源实现。如您想为指定的命名空间或工作负载配置指定的容器子网和安全组,可创建自定义容器网络配置(NetworkAttachmentDefinition),并将该容器网络配置与相应的命名空间或工作负载关联,进而实现业务的子网划分或业务安全隔离的述求。 目前容器网络配置(NetworkAttachmentDefinition)支持关联的资源类型对比如下: 表1 关联资源类型对比 维度 容器网络配置(NetworkAttachmentDefinition)关联的资源类型 命名空间 工作负载 容器网络划分维度说明 容器网络配置关联的命令空间下创建的所有工作负载使用相同的子网配置跟安全组配置 指定了相同容器网络配置的工作负载使用相同的子网配置跟安全组配置 支持的集群版本 仅在CCE Turbo集群中可用,且集群为1.23.8-r0、1.25.3-r0及以上版本 仅在CCE Turbo集群中可用,且集群为1.23.11-r0、1.25.6-r0、1.27.3-r0、1.28.1-r0及以上版本 约束限制 不同容器网络配置之间的命名空间不可重复 只能指定未关联命名空间的自定义容器网络配置
  • 约束与限制 仅默认容器网络配置 default-network 支持开启网卡预热,使用自定义容器网络配置的Pod的创建速度相对使用默认容器网络配置的Pod会稍慢一些,因此不适用于极速Pod弹性场景。 默认容器网络配置 default-network 不支持删除。 已开启固定IP的工作负载,如果需要关联新的容器网络配置,Pod重建时,固定IP功能会失效。请删除工作负载并释放已经固定的IP,然后重新创建工作负载。 如需删除创建的自定义容器网络配置(NetworkAttachmentDefinition),请先删除对应的命名空间下使用该配置创建的Pod(带有名为“cni.yangtse.io/network-status”的annotation),详情请参见删除网络配置。
  • 使用场景 默认情况下,kubelet使用 CFS 配额 来执行Pod的CPU约束。 当节点上运行了很多CPU密集的Pod时,工作负载可能会迁移到不同的CPU核, 这取决于调度时Pod是否被扼制,以及哪些CPU核是可用的。许多应用对这种迁移不敏感,因此无需任何干预即可正常工作。有些应用对CPU敏感,CPU敏感型应用有如下特点。 对CPU throttling 敏感 对上下文切换敏感 对处理器缓存未命中敏感 对跨Socket内存访问敏感 期望运行在同一物理CPU的超线程 如果您的应用有以上其中一个特点,可以利用Kubernetes中提供的CPU管理策略为应用分配独占的CPU核(即CPU绑核),提升应用性能,减少应用的调度延迟。CPU manager会优先在一个Socket上分配资源,也会优先分配完整的物理核,避免一些干扰。
  • 为Pod设置独占CPU Pod设置独占CPU(即CPU绑核)有如下几点要求: 节点上开启静态(static)CPU管理策略,具体方法请参见开启CPU管理策略。 Pod的定义里都要设置requests和limits参数,requests和limits必须为整数,且数值一致。 如果有init container需要设置独占CPU,init container的requests参数建议与业务容器设置的requests参数一致(避免业务容器未继承init container的CPU分配结果,导致CPU manager多预留一部分CPU)。更多信息请参见App Containers can't inherit Init Containers CPUs - CPU Manager Static Policy。 在使用时您可以利用调度策略(亲和与反亲和)将如上配置的Pod调度到开启静态(static)CPU管理策略的节点上,这样就能够达到独占CPU的效果。 设置独占CPU的YAML示例如下: kind: Deployment apiVersion: apps/v1 metadata: name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: container-1 image: nginx:alpine resources: requests: cpu: 2 # 必须为整数,且需要与limits中一致 memory: 2048Mi limits: cpu: 2 # 必须为整数,且需要与requests中一致 memory: 2048Mi imagePullSecrets: - name: default-secret
  • YAML示例(ICAgent) 您可以通过在YAML定义的方式设置容器日志存储路径。 如下所示,使用EmptyDir挂载到容器的“/var/log/nginx”路径下,这样ICAgent就会采集容器“/var/log/nginx”路径下的日志。其中policy字段是CCE自定义的字段,能够让ICAgent识别并采集日志。 apiVersion: apps/v1 kind: Deployment metadata: name: testlog namespace: default spec: selector: matchLabels: app: testlog template: replicas: 1 metadata: labels: app: testlog spec: containers: - image: 'nginx:alpine' name: container-0 resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi volumeMounts: - name: vol-log mountPath: /var/log/nginx policy: logs: rotate: '' volumes: - emptyDir: {} name: vol-log imagePullSecrets: - name: default-secret 使用HostPath方法如下所示,相比EmptyDir就是volume的类型变成hostPath,且需要配置hostPath在主机上的路径。下面示例中将主机上“/tmp/log”挂载到容器的“/var/log/nginx”路径下,这样ICAgent就会采集容器“/var/log/nginx”路径下的日志,且日志还会在主机的“/tmp/log”路径下存储。 apiVersion: apps/v1 kind: Deployment metadata: name: testlog namespace: default spec: replicas: 1 selector: matchLabels: app: testlog template: metadata: labels: app: testlog spec: containers: - image: 'nginx:alpine' name: container-0 resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi volumeMounts: - name: vol-log mountPath: /var/log/nginx readOnly: false extendPathMode: PodUID policy: logs: rotate: Hourly annotations: pathPattern: '**' format: '' volumes: - hostPath: path: /tmp/log name: vol-log imagePullSecrets: - name: default-secret 表2 关键参数解释 参数 解释 说明 extendPathMode 主机扩展路径 通过实例的ID或者容器的名称扩展主机路径,实现同一个主机路径下区分来自不同容器的挂载。 会在原先的“卷目录/子目录”中增加一个三级目录。使用户更方便获取单个Pod输出的文件。 None:不配置拓展路径。 PodUID:Pod的ID。 PodName:Pod的名称。 PodUID/ContainerName:Pod的ID/容器名称。 PodName/ContainerName:Pod名称/容器名称。 policy.logs.rotate 日志转储 此处日志转储是指日志的本地绕接。 设置: AOM 每分钟扫描一次日志文件,当某个日志文件超过50MB时,会立即对其转储(转储时会在该日志文件所在的目录下生成一个新的zip文件。对于一个日志文件,AOM只保留最近生成的20个zip文件,当zip文件超过20个时,时间较早的zip文件会被删除),转储完成后AOM会将该日志文件清空。 不设置:若您在下拉列表框中选择“不设置”,则AOM不会对日志文件进行转储。 说明: AOM的日志绕接能力是使用copytruncate方式实现的,如果选择了设置,请务必保证您写日志文件的方式是append(追加模式),否则可能出现文件空洞问题。 当前主流的日志组件例如Log4j、Logback等均已经具备日志文件的绕接能力,如果您的日志文件已经实现了绕接能力,则无需设置。否则可能出现冲突。 建议您的业务自己实现绕接,可以更灵活的控制绕接文件的大小和个数。 policy.logs.annotations.pathPattern 采集路径 设置采集路径可以更精确的指定采集内容,当前支持以下设置方式: 不设置则默认采集当前路径下.log .trace .out文件 设置**表示递归采集5层目录下的.log .trace .out文件 设置*表示模糊匹配 例子: 采集路径为/tmp/**/test*.log表示采集/tmp目录及其1-5层子目录下的全部以test开头的.log文件。 注意: 使用采集路径功能请确认您的采集器ICAgent版本为5.12.22或以上版本。 policy.logs.annotations.format 多行日志匹配 有些程序打印的日志存在一条完整的日志数据跨占多行(例如 Java 程序日志)情况,日志采集系统默认是按行采集。如果您想在日志采集系统中按整条显示日志,可以开启多行日志,采用时间或正则匹配的方式,当某行日志匹配上预先设置的时间格式或正则表达式,就认为是一条日志的开头,而下一个行首出现作为该条日志的结束标识符。 格式如下 { "multi": { "mode": "time", "value": "YYYY-MM-DD hh:mm:ss" } } multi表示分行模式: time:日志时间,请输入时间通配符。时间通配符填写参考示例:如日志中的时间是2017-01-01 23:59:59,按照规则应该填写:YYYY-MM-DD hh:mm:ss。 regular:正则模式,请输入正则表达式。
  • 使用ICAgent采集日志 在工作负载中可以单独配置日志采集策略,此策略需要使用ICAgent。 在CCE中创建工作负载时,在配置容器信息时可以设置容器日志。 单击添加日志策略。 以nginx为例,不同工作负载根据实际情况配置。 图1 添加日志策略 存储类型有“主机路径”和“容器路径”两种类型可供选择: 表1 配置日志策略 参数 参数说明 存储类型 主机路径:HostPath模式,将主机路径挂载到指定的容器路径(挂载路径)。用户可以在节点的主机路径中查看到容器输出在挂载路径中的日志信息。 容器路径:EmptyDir模式,将节点的临时路径挂载到指定的路径(挂载路径)。临时路径中存在的但暂未被采集器上报到AOM的日志数据在Pod实例删除后会消失。 主机路径 请输入主机的路径,如:/var/paas/sys/log/nginx 挂载路径 请输入数据存储要挂载到容器上的路径,如:/tmp 须知: 请不要挂载到系统目录下,如“/”、“/var/run”等,否则会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。 挂载高危目录的情况下 ,建议使用低权限账号启动,否则可能会造成宿主机高危文件被破坏。 AOM只采集最近修改过的前20个日志文件,且默认采集两级子目录。 AOM只采集挂载路径下的“.log”、“.trace”、“.out”文本日志文件。 容器中挂载点的权限设置方法,请参见为Pod或容器配置安全性上下文。 主机扩展路径 仅“主机路径”类型需要填写 通过实例的ID或者容器的名称扩展主机路径,实现同一个主机路径下区分来自不同容器的挂载。 会在原先的“卷目录/子目录”中增加一个三级目录。使用户更方便获取单个Pod输出的文件。 None:不配置拓展路径。 PodUID:Pod的ID。 PodName:Pod的名称。 PodUID/ContainerName:Pod的ID/容器名称。 PodName/ContainerName:Pod名称/容器名称。 采集路径 设置采集路径可以更精确的指定采集内容,当前支持以下设置方式: 不设置则默认采集当前路径下.log .trace .out文件 设置**表示递归采集5层目录下的.log .trace .out文件 设置*表示模糊匹配 例子: 采集路径为/tmp/**/test*.log表示采集/tmp目录及其1-5层子目录下的全部以test开头的.log文件。 注意: 使用采集路径功能请确认您的采集器ICAgent版本为5.12.22或以上版本。 日志转储 此处日志转储是指日志的本地绕接。 设置:AOM每分钟扫描一次日志文件,当某个日志文件超过50MB时会对其转储(转储时会在该日志文件所在的目录下生成一个新的zip文件。对于一个日志文件,AOM只保留最近生成的20个zip文件,当zip文件超过20个时,时间较早的zip文件会被删除)。 不设置:若您在下拉列表框中选择“不设置”,则AOM不会对日志文件进行转储。 说明: AOM的日志绕接能力是使用copytruncate方式实现的,如果选择了设置,请务必保证您写日志文件的方式是append(追加模式),否则可能出现文件空洞问题。 当前主流的日志组件例如Log4j、Logback等均已经具备日志文件的绕接能力,如果您的日志文件已经实现了绕接能力,则无需设置。否则可能出现冲突。 建议您的业务自己实现绕接,可以更灵活的控制绕接文件的大小和个数。 单击“确定”,并完成创建工作负载。
  • 工作负载的DNS配置实践 前面介绍了Linux系统 域名 解析文件以及Kubernetes为应用提供的DNS相关配置项,下面将举例介绍应用如何进行DNS配置。 场景1 对接Kubernetes内置的Kube-DNS/CoreDNS 场景说明: 这种方式适用于应用中的域名解析只涉及集群内部域名,或者集群内部域名+外部域名两种方式,应用默认采用这种配置。 示例: apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: ClusterFirst imagePullSecrets: - name: default-secret 该配置下容器的域名解析文件将如下所示: nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 场景2 直接对接云DNS 场景说明: 这种方式适用于应用只访问注册到互联网的外部域名,该场景不能解析集群内部域名。 示例: apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: Default #使用kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云DNS) imagePullSecrets: - name: default-secret 该配置下容器的域名解析文件将如下所示: nameserver 100.125.x.x 场景3 主机网络模式的应用对接Kube-DNS/CoreDNS 场景说明: 对于配置主机网络模式的应用,默认对接云DNS,如果应用需要对接Kube-DNS/CoreDNS,需将dnsPolicy设置为“ClusterFirstWithHostNet”。 示例: apiVersion: v1 kind: Pod metadata: name: nginx spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 imagePullSecrets: - name: default-secret 该配置下容器的域名解析文件将如下所示: nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 场景4 自定义应用的域名配置 场景说明: 用户可以完全自定义配置应用的域名解析文件,这种方式非常灵活,dnsPolicy和dnsConfig配合使用,几乎能够满足所有使用场景,如对接用户自建DNS的场景、串联多个DNS的场景以及优化DNS配置选项的场景等等。 示例1:对接用户自建DNS 该配置下,dnsPolicy为“None”,应用的域名解析文件完全根据dnsConfig配置生成。 apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: "None" dnsConfig: nameservers: - 10.2.3.4 #用户自建DNS的IP地址 searches: - ns1.svc.cluster.local - my.dns.search.suffix options: - name: ndots value: "2" - name: timeout value: "3" imagePullSecrets: - name: default-secret 该配置下容器的域名解析文件将如下所示: nameserver 10.2.3.4 search ns1.svc.cluster.local my.dns.search.suffix options timeout:3 ndots:2 示例2:修改域名解析文件的ndots选项,减少无效的DNS查询 该配置下,dnsPolicy不为“None”,会在基于dnsPolicy生成的域名解析文件的基础上,追加dnsConfig中配置的dns参数。 apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: "ClusterFirst" dnsConfig: options: - name: ndots value: "2" #该配置会将基于ClusterFirst策略生成的域名解析文件的ndots:5参数改写为ndots:2 imagePullSecrets: - name: default-secret 该配置下容器的域名解析文件将如下所示: nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:2 示例3:串联使用多个DNS apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx:alpine dnsPolicy: ClusterFirst # 追加域名解析配置,集群中会默认对接CoreDNS dnsConfig: nameservers: - 10.2.3.4 # 用户自建DNS的IP地址 imagePullSecrets: - name: default-secret 容器DNS配置文件中nameserver最多可设置3个 DNS地址 : 当dnsPolicy设置为ClusterFirst时,如果集群使用CoreDNS,除CoreDNS地址外可追加2个自定义DNS地址,超出部分无效。 当dnsPolicy设置为ClusterFirst时,如果集群同时使用CoreDNS和NodeLocal DNSCache,除CoreDNS和NodeLocal DNSCache地址外可追加1个自定义DNS地址,超出部分无效。 该配置下容器的域名解析文件将如下所示: nameserver 10.247.3.10 10.2.3.4 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
  • 通过工作负载YAML进行DNS配置 您也可以通过YAML的方式创建工作负载,以nginx应用为例,其YAML文件中的DNS配置示例如下: apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent imagePullSecrets: - name: default-secret dnsPolicy: None dnsConfig: options: - name: ndots value: '5' - name: timeout value: '3' nameservers: - 10.2.3.4 searches: - my.dns.search.suffix dnsPolicy字段说明: dnsPolicy字段是应用设置的DNS策略,默认值为“ClusterFirst”。dnsPolicy当前支持四种参数值: 表1 dnsPolicy字段说明 参数 说明 ClusterFirst(默认值) 即在默认DNS配置中追加自定义的域名解析配置。应用会默认对接CoreDNS(CCE集群的CoreDNS默认级联云上DNS),自定义填写的dnsConfig会追加到默认DNS参数中。这种场景下,容器既能够解析service注册的集群内部域名,也能够解析发布到互联网上的外部域名。由于该配置下,域名解析文件设置了search搜索域列表和ndots: 5,因此当访问外部域名和集群内部长域名(如kubernetes.default.svc.cluster.local)时,大部分域名都会优先遍历search搜索域列表,导致至少有6次无效的DNS查询,只有访问集群内部短域名(如kubernetes)时,才不存在无效的DNS查询。 ClusterFirstWithHostNet 对于配置主机网络(hostNetwork)的应用,默认对接Pod所在节点域名解析配置,即kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云上DNS)。如需对接集群的Kube-DNS/CoreDNS,dnsPolicy字段需设置为ClusterFirstWithHostNet,此时容器的域名解析文件配置与“ClusterFirst”一致,也存在无效的DNS查询。 ... spec: containers: - image: nginx:latest imagePullPolicy: IfNotPresent name: container-1 restartPolicy: Always hostNetwork: true dnsPolicy: ClusterFirstWithHostNet Default 即继承Pod所在节点域名解析配置,并在此基础上追加自定义的域名解析配置。容器的域名解析文件使用kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云上DNS),没有配置search搜索域列表和options。该配置只能解析注册到互联网上的外部域名,无法解析集群内部域名,且不存在无效的DNS查询。 None 即替换默认的域名解析配置,完全使用自定义的域名解析配置。设置为None之后,必须设置dnsConfig字段,此时容器的域名解析文件将完全通过dnsConfig的配置来生成。 此处如果dnsPolicy字段未被指定,其默认值为ClusterFirst,而不是Default。 dnsConfig字段说明: dnsConfig为应用设置DNS参数,设置的参数将合并到基于dnsPolicy策略生成的域名解析文件中。当dnsPolicy为“None”,应用的域名解析文件完全由dnsConfig指定;当dnsPolicy不为“None”时,会在基于dnsPolicy生成的域名解析文件的基础上,追加dnsConfig中配置的dns参数。 表2 dnsConfig字段说明 参数 说明 options DNS的配置选项,其中每个对象可以具有name属性(必需)和value属性(可选)。该字段中的内容将合并到基于dnsPolicy生成的域名解析文件的options字段中,dnsConfig的options的某些选项如果与基于dnsPolicy生成的域名解析文件的选项冲突,则会被dnsConfig所覆盖。 nameservers DNS的IP地址列表。当应用的dnsPolicy设置为“None”时,列表必须至少包含一个IP地址,否则此属性是可选的。列出的DNS的IP列表将合并到基于dnsPolicy生成的域名解析文件的nameserver字段中,并删除重复的地址。 说明: 容器DNS配置文件中nameserver最多可设置3个DNS地址: 当dnsPolicy设置为ClusterFirst时,如果集群使用CoreDNS,除CoreDNS地址外可追加2个自定义DNS地址,超出部分无效。 当dnsPolicy设置为ClusterFirst时,如果集群同时使用CoreDNS和NodeLocal DNSCache,除CoreDNS和NodeLocal DNSCache地址外可追加1个自定义DNS地址,超出部分无效。 searches 域名查询时的DNS搜索域列表,此属性是可选的。指定后,提供的搜索域列表将合并到基于dnsPolicy生成的域名解析文件的search字段中,并删除重复的域名。Kubernetes最多允许6个搜索域。
  • DNS配置项说明 在Linux系统的节点或者容器里执行cat /etc/resolv.conf命令,能够查看到DNS配置,以Kubernetes集群的容器DNS配置为例: nameserver 10.247.x.x search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 配置项说明: nameserver:容器解析域名时查询的DNS服务器的IP地址列表。如果设置为10.247.x.x说明DNS对接到Kube-DNS/CoreDNS,如果是其他IP地址,则表示采用云上DNS或者用户自建的DNS。 search:定义域名的搜索域列表,当访问的域名不能被DNS解析时,会把该域名与搜索域列表中的域依次进行组合,并重新向DNS发起请求,直到域名被正确解析或者尝试完搜索域列表为止。对于CCE集群来说,容器的搜索域列表配置3个域,当解析一个不存在的域名时,会产生8次DNS查询,因为对于每个域名需要查询两次,分别是IPv4和IPv6。 options:定义域名解析配置文件的其他选项,常见的有timeout、ndots等等。 Kubernetes集群容器的域名解析文件设置为options ndots:5,该参数的含义是当域名的“.”个数小于ndots的值,会先把域名与search搜索域列表进行组合后进行DNS查询,如果均没有被正确解析,再以域名本身去进行DNS查询。当域名的“.”个数大于或者等于ndots的值,会先对域名本身进行DNS查询,如果没有被正确解析,再把域名与search搜索域列表依次进行组合后进行DNS查询。 如查询www.***.com域名时,由于该域名的“.”个数为2,小于ndots的值,所以DNS查询请求的顺序依次为:www.***.com.default.svc.cluster.local、www.***.com.svc.cluster.local、 www.***.com.cluster.local和 www.***.com,需要发起至少7次DNS查询请求才能解析出该域名的IP。可以看出,这种配置在访问外部域名时,存在大量冗余的DNS查询,存在优化点。 完整的Linux域名解析文件配置项说明可以参考文档:http://man7.org/linux/man-pages/man5/resolv.conf.5.html。
  • 通过控制台进行工作负载DNS配置 Kubernetes为应用提供了与DNS相关的配置选项,通过对应用进行DNS配置,能够在某些场景下有效地减少冗余的DNS查询,提升业务并发量。以下步骤以nginx应用为例,介绍如何通过控制台为工作负载添加DNS配置。 登录CCE控制台,单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”。 设置工作负载基本参数,详情请参见创建工作负载。 在“高级配置”中,选择“DNS配置”页签,并按需填写以下参数。 DNS策略:控制台中提供的DNS策略与YAML中的dnsPolicy字段对应,详情请参见表1。 追加域名解析配置:即dnsPolicy字段设置为ClusterFirst,此时容器中既能够解析service注册的集群内部域名,也能够解析发布到互联网上的外部域名。 替换域名解析配置:即dnsPolicy字段设置为None,此时必须填写“IP地址”和“搜索域”参数。容器将仅使用自定义的IP地址和搜索域配置进行域名解析。 继承Pod所在节点域名解析配置:即dnsPolicy字段设置为Default,此时容器将使用Pod所在节点的域名解析配置,无法解析集群内部域名。 可选对象:即dnsConfig字段中的options参数。每个对象可以具有name属性(必需)和value属性(可选),填写完成后需单击“确认添加”。 timeout:超时时间 (s)。 ndots:域名中必须出现的"."的个数。如果域名中的"."的个数不小于ndots,则该域名为一个全限定域名,操作系统会直接查询;如果域名中的"."的个数小于ndots,操作系统会在搜索域中进行查询。 域名解析服务器地址:即dnsConfig字段中的nameservers参数,您可对自定义的域名配置域名服务器,值为一个或一组DNS IP地址。 搜索域:即dnsConfig字段中的searches参数,表示域名查询时的DNS搜索域列表,此属性是可选的。指定后,提供的搜索域列表将合并到基于dnsPolicy生成的域名解析文件的search字段中,并删除重复的域名。 启用hostAliases:配置Pod的本地配置文件“/etc/hosts”,可以将域名和IP地址映射加入到hosts文件中,在本地系统中实现简单的域名解析。更多使用详情请参见使用HostAliases向Pod /etc/hosts文件添加条目。 图1 工作负载DNS配置 单击“创建工作负载”。
  • URI GET /v2/products/incentive-discount-policies 参数说明请参见表 查询参数。 表1 查询参数 参数 是否必选 参数类型 取值范围 描述 time 是 String 最大长度:20 查询策略的指定时间。东八区时间,格式:YYYY-MM。 说明: 实际查询结果为指定时间所在月最后一天23:59:59的策略情况。 service_type_code 否 String 最大长度:64 云服务类型编码,例如OBS的云服务类型编码为“hws.service.type.obs”。您可以调用查询云服务类型列表接口获取。 此参数不携带或携带值为空或携带值为null时,不作为筛选条件;携带值为空串,作为筛选条件。 offset 否 Integer [0-最大整数] 偏移量,从0开始。默认值为0。 此参数不携带或携带值为空或携带值为null时,取默认值0;不支持携带值为空串。 说明: offset用于分页处理,如不涉及分页,请使用默认值0。offset表示相对于满足条件的第一个数据的偏移量。如offset = 1,则返回满足条件的第二个数据至最后一个数据。 示例1,满足查询条件的结果共10条数据,limit取值为10,offset取值为1,则返回的数据为2~10,第一条数据不返回。 示例2,查询总数20条,期望每页返回10条数据,则获取第一页数据,入参offset填写0,limit填写10;获取第二页数据,入参offset填写10,limit填写10。 limit 否 Integer [1-100] 每次查询的数量,默认值为10。 此参数不携带或携带值为空或携带值为null时,取默认值10;不支持携带值为空串。
  • 请求消息 请求参数 无 请求示例 GET https://bss.myhuaweicloud.com/v2/products/incentive-discount-policies?time=2021-10&service_type_code=hws.service.type.workplace&offset=0&limit=10 HTTP/1.1 Content-Type: application/json X-Auth-Token:MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ
共100000条