华为云用户手册

  • 操作场景 CCE支持配置工作负载日志策略,便于日志的统一收集、管理和分析,以及按周期防爆处理。 CCE配合AOM收集工作负载的日志,在创建节点时会默认安装AOM的ICAgent(在集群kube-system命名空间下名为icagent的DaemonSet),ICAgent负责收集工作负载的日志并上报到AOM,您可以在CCE控制台和AOM控制台查看工作负载的日志。 默认情况下,ICAgent会采集容器的标准输出,您无需做任何设置。 您还可以在创建工作负载的时候设置容器日志存储路径,ICAgent会采集该路径下日志。 容器日志可以选择主机路径和容器路径两种模式。 主机路径:HostPath模式,将主机路径挂载到指定的容器路径(挂载路径)。用户可以在节点的主机路径中查看到容器输出在挂载路径中的日志信息。 容器路径:EmptyDir模式,将节点的临时路径挂载到指定的路径(挂载路径)。临时路径中存在的但暂未被采集器上报到AOM的日志数据在Pod实例删除后会消失。
  • 设置容器日志存储路径-使用kubectl 您可以通过在YAML定义的方式设置容器日志存储路径。 如下所示,使用EmptyDir挂载到容器的“/var/log/nginx”路径下,这样ICAgent就会采集容器“/var/log/nginx”路径下的日志。其中policy字段是CCE自定义的字段,能够让ICAgent识别并采集日志。 apiVersion: apps/v1kind: Deploymentmetadata: name: testlog namespace: defaultspec: 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/v1kind: Deploymentmetadata: name: testlog namespace: defaultspec: 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:正则模式,请输入正则表达式。
  • 通过配置项设置命令行参数 您可以使用配置项设置容器中的命令或者参数值,使用环境变量替换语法$(VAR_NAME)来进行。如下面的编排示例所示。 apiVersion: v1kind: Podmetadata: name: configmap-pod-3spec: containers: - name: test-container image: busybox command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: cce-configmap key: SPECIAL_LEVEL - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: cce-configmap key: SPECIAL_TYPE restartPolicy: Never 这个Pod运行后,输出如下内容。 Hello CCE
  • 使用配置项挂载到工作负载数据卷 配置项也可以在数据卷里面使用,只需在创建工作负载时将配置项挂载到工作负载中即可。挂载完成后,最终生成以key为文件名, value为文件内容的配置文件。 apiVersion: v1kind: Podmetadata: name: configmap-pod-4spec: containers: - name: test-container image: busybox command: [ "/bin/sh", "-c", "ls /etc/config/" ] ##列出该目录下的文件名称 volumeMounts: - name: config-volume mountPath: /etc/config ##挂载到/etc/config目录下 volumes: - name: config-volume configMap: name: cce-configmap restartPolicy: Never 这个Pod运行后,在/etc/config目录下会生成SPECIAL_LEVEL和SPECIAL_TYPE两个文件,文件的内容为Hello和CCE。且运行时会输出如下内容,即cce-configmap中SPECIAL_LEVEL和SPECIAL_TYPE的名称。 SPECIAL_TYPESPECIAL_LEVEL 挂载ConfigMap到数据卷还可以在界面上进行操作,在创建工作负载时,设置容器的高级设置,选择数据存储,添加本地磁盘,选择ConfigMap即可配置。具体操作请参见配置项(ConfigMap)挂载。
  • 通过配置项设置工作负载环境变量 您可以在创建工作负载时将配置项设置为环境变量,使用valueFrom参数引用ConfigMap中的Key/Value。 apiVersion: v1kind: Podmetadata: name: configmap-pod-1spec: containers: - name: test-container image: busybox command: [ "/bin/sh", "-c", "env" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: ##使用valueFrom来指定env引用配置项的value值 configMapKeyRef: name: cce-configmap ##引用的配置文件名称 key: SPECIAL_LEVEL ##引用的配置项key restartPolicy: Never 如果您需要将多个配置项的value值定义为pod的环境变量值,您只需要在pod中添加多个环境变量参数即可。 env:- name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: cce-configmap key: SPECIAL_LEVEL- name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: cce-configmap key: SPECIAL_TYPE 如果要将一个配置项中所有数据都添加到环境变量中,可以使用 envFrom 参数,配置项中的 key 会成为 Pod 中的环境变量名称。 apiVersion: v1kind: Podmetadata: name: configmap-pod-2spec: containers: - name: test-container image: busybox command: [ "/bin/sh", "-c", "env" ] envFrom: - configMapRef: name: cce-configmap restartPolicy: Never
  • 约束与限制 CCE Turbo集群仅支持在新版本UI设置弹性扩缩容,具体设置请参见操作步骤-新UI。 支持在新版本UI设置节点池包周期计费,具体设置请参见操作步骤-新UI。 节点弹性伸缩功能需要安装autoscaler插件,具体安装与参数配置请参见autoscaler。 仅按需计费支持节点弹性伸缩,包年/包月计费模式不支持弹性伸缩。如果节点池中有按需计费节点被转成包周期计费,可能会导致弹性伸缩失效,请通过迁移节点功能将包周期节点迁移到DefaultPool。
  • 操作步骤-新UI 新UI支持节点池中节点包周期。 登录CCE控制台。 进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 单击右上角“创建节点池”。 填写基础配置参数。 节点池名称:新建节点池的名称,默认按“集群名-nodepool-随机数”生成名称,可自定义。 节点数量:创建节点池时,创建节点的数量。 弹性伸缩: 默认不开启。包年/包月不支持弹性伸缩,仅按需支持。 单击开启后,节点池将根据集群负载情况自动创建或删除节点池内的节点,参数设置如下: 节点数上限和节点数下限:您可设置节点数的上限和下限,保证节点数在合理的范围内伸缩。 节点池优先级:请根据业务需要设置相应数值,该数值表示节点池之间进行弹性扩缩容的优先级,数值越大优先级越高,如设置为4的节点池比设置为1的节点池优先启动弹性伸缩。若多个节点池的值设置相同,如都设置为2,表示这几个节点池之间不分优先级,系统将按最小资源浪费原则进行伸缩。 弹性扩容时CCE将按照如下策略来选择节点池进行扩容: 通过预判算法判断节点池是否能满足让Pending的Pod正常调度的条件,包括节点资源大于Pod的request值、nodeSelect、nodeAffinity和taints等是否满足Pod正常调度的条件;另外还会过滤掉扩容失败(因为资源不足等原因)还处于15min冷却时间的节点池。 有多个节点池满足条件时,判断节点池设置的优先级(优先级默认值为0,取值范围为0-100,其中100为最高,0为最低),选择优先级最高的节点池扩容。 如果有多个节点池处于相同的优先级,或者都没有配置优先级时,通过最小浪费原则,根据节点池里设置的虚拟机规格,计算刚好能满足Pending的Pod正常调度,且浪费资源最少的节点池。 如果还是有多个节点池的虚拟机规格都一样,只是AZ不同,那么会随机选择其中一个节点池触发扩容。 节点池中的节点建议不要放置重要数据,以防止节点被弹性缩容,数据无法恢复。 为保证功能的正常使用,节点池开启弹性扩缩容功能后,请务必安装AutoScaler插件。 填写计算配置参数。 计费模式:按需计费或包年/包月。包年/包月可选择时长和自动续费,按月购买自动续费周期为1个月,按年购买自动续费周期为1年。 可用区:可用区是在同一区域下,电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。 请根据业务需要进行选择。节点池创建之后不支持修改可用区属性,请谨慎选择。 如果您需要提高工作负载的高可靠性,建议您选择“随机可用区”,将节点随机均匀分布在不同可用区中。 节点类型:虚拟机节点或裸金属节点。 节点规格:请根据业务需求选择相应的节点规格,不同的可用区可选择的节点规格类型可能不同,请根据实际情况选择。 图4 选择节点规格 为确保节点稳定性,系统会自动预留部分资源,用于运行必须的系统组件。详细请参见节点预留资源计算公式。 操作系统:部分Region不显示下方分类,请直接选择节点对应的操作系统。 公共镜像:请选择节点对应的操作系统。 私有镜像(公测中):若没有私有镜像可选择,请单击“创建私有镜像指引”进行制作,该功能仅支持v1.15及以上版本集群。详细操作步骤请参见如何使用私有镜像制作工作节点镜像?。 重装操作系统或修改操作系统配置将导致节点不可用,请务必谨慎操作。 登录方式:支持密码和密钥对。 选择“密码”:用户名默认为“root”,请输入登录节点的密码,并确认密码。 登录节点时需要使用该密码,请妥善管理密码,系统无法获取您设置的密码内容。 选择“密钥对”:选择用于登录本节点的密钥对,支持选择共享密钥。 密钥对用于远程登录节点时的身份认证。若没有密钥对,可单击选项框右侧的“创建密钥对”来新建,创建密钥对操作步骤请参见创建密钥对。 如果子用户创建节点选择密钥对创建,这个密钥只对创建这个密钥的子用户有效,即使其他子用户在同一个组也无法选择,也无法使用。例如:A用户创建的密钥,B用户无法使用这个密钥对创建节点,并且Console也选不到。 图5 密钥对 填写存储配置参数。 系统盘:设置工作节点的系统盘空间。您可以设置系统盘的规格为40GB-1024GB之间的数值,缺省值为50GB。 在默认情况下,系统盘可提供高I/O(SAS)、超高I/O(SSD)几种基本的云硬盘类型,关于云硬盘的详细信息请参见云硬盘概述。 数据盘:设置工作节点的数据盘空间。您可以设置数据盘的规格为100GB-32768GB之间的数值,缺省值为100GB。数据盘空间大小配置跟实际业务有关,详细的说明请参见数据盘空间分配说明。 当集群版本为v1.13.10-r0及以上,且节点类型为“磁盘增强型”或“超高I/O型”时,数据盘支持使用云硬盘或本地盘。 若数据盘卸载或损坏,会导致docker服务异常,最终导致节点不可用。建议不要删除该数据盘。 数据盘空间分配:单击后方的“展开高级配置”,勾选下面“自定义空间分配”可以对数据盘空间使用占比进行自定义设置。 您可以自定义数据盘中容器运行时和Kubelet的资源占比。默认90%空间分配给容器运行时使用,剩余空间分配给kubelet组件使用。 您还可以定义单个容器最大能够占用多少空间,默认为10G。 新增数据盘:节点至少需要一块数据盘,且可以增加数据盘。单击“增加一块数据盘”,可以增加数据盘,单击后方的“展开高级配置”可以选择将新增数据盘 挂载到指定目录。 注意挂载路径不能设置为 /、/home/paas、/var/paas、/var/lib、/var/script、/var/log/、/mnt/paas、/opt/cloud,不能和系统目录冲突(例如bin、lib、home、root、boot、dev、etc、lost+found、mnt、proc、sbin、srv、tmp、var、media、opt、selinux、sys、usr等),否则会导致系统或节点安装失败。 加密:数据盘加密功能可为您的数据提供强大的安全防护,加密磁盘生成的快照及通过这些快照创建的磁盘将自动继承加密功能。 默认不加密。 点选“加密”后,可在弹出的“加密设置”对话框中,选择已有的密钥,若没有可选的密钥,请单击后方的链接创建新密钥,完成创建后单击刷新按钮。 填写网络配置参数。 虚拟私有云:跟随集群,不可变更。 该参数仅在v1.13.10-r0及以上版本的集群中支持,否则不显示。 所在子网:通过子网提供与其他网络隔离的、可以独享的网络资源,以提高网络安全。 可选择该集群虚拟私有云下的任意子网,集群节点支持跨子网。 请确保子网下的DNS服务器可以解析OBS服务域名,否则无法创建节点。 该参数仅在v1.13.10-r0及以上版本的集群中支持,否则不显示。 填写高级配置参数。 K8S标签:K8S标签是Kubernetes自带的标签能力,可以通过kubectl命令使用标签过滤节点资源。 资源标签:通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。 您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。具体请参见创建预定义标签。 CCE服务会自动帮您创建CCE-Dynamic-Provisioning-Node=节点id的标签,允许增加5个标签。 污点(Taints):使用污点(Taints)可优化容器在集群间的调度,结合工作负载的容忍能力可以避免容器Pod被分配到不合适的节点上。详细说明请参见节点调度设置(污点taint)。 最大实例数:节点最大允许创建的实例数(Pod),该数量包含系统默认实例。集群网络模型为“VPC网络”时,此处的最大值取决于您选择的每个节点可供分配的容器IP个数。 该设置的目的为防止节点因管理过多实例而负载过重,请根据您的业务需要进行设置,相关说明请参见节点最多可以创建多少个Pod。 云服务器组:云服务器组是对云服务器的一种逻辑划分,同一云服务器组中的云服务器遵从同一策略。 安装前执行脚本:请输入脚本命令,大小限制为0~1000字符。 脚本将在Kubernetes软件安装前执行,可能导致Kubernetes软件无法正常安装,需谨慎使用。常用于格式化数据盘等场景。 安装后执行脚本:请输入脚本命令,大小限制为0~1000字符。 脚本将在Kubernetes软件安装后执行,不影响Kubernetes软件安装。常用于修改Docker配置参数等场景。 委托:委托是由租户管理员在统一身份认证服务上创建的。通过委托,可以将云主机资源共享给其他帐号,或委托更专业的人或团队来代为管理。新建委托请参见委托其他云服务管理资源,创建委托时委托类型选择“云服务”,单击“选择”按钮并在弹出的窗口中选择“ECS BMS”,即允许ECS或BMS调用云服务。 单容器可用数据空间:该参数用于设置一个容器可用的数据空间大小,设置范围为10G到500G。如果设置的参数超过数据盘中Docker可占用的实际数据空间(由数据盘设置项中的资源分配自定义参数指定,默认为数据盘大小的90%),将以Docker的实际空间大小为主。该参数仅在v1.13.10-r0及以上版本的集群中显示。 单击“下一步:规格确认”。 单击“提交”。
  • 使用密钥设置Pod的环境变量 密钥可以在Pod中设置为环境变量。如下面的Pod示例所示,mysecret密钥的username和password配置为Pod的环境变量。 apiVersion: v1kind: Podmetadata: name: secret-env-podspec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password restartPolicy: Never
  • 使用密钥配置Pod的数据卷 密钥可以在Pod中作为文件使用。如下面的Pod示例所示,mysecret密钥的username和password以文件方式保存在/etc/foo目录下。 apiVersion: v1kind: Podmetadata: name: mypodspec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret 另外,还可以指定密钥的目录路径和权限,username存放在容器中的/etc/foo/my-group/my-username目录下。 apiVersion: v1kind: Podmetadata: name: mypodspec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" volumes: - name: foo secret: secretName: mysecret items: - key: username path: my-group/my-username mode: 511 挂载Secret到数据卷还可以在界面上进行操作,在创建工作负载时,设置容器的高级设置,选择数据存储,添加本地磁盘,选择Secret即可配置。具体请参见密钥(Secret)挂载。
  • 操作场景 容器组(Pod)是Kubernetes中最小的可部署单元。一个Pod(容器组)包含了一个应用程序容器(某些情况下是多个容器)、存储资源、一个唯一的网络IP地址、以及一些确定容器该如何运行的选项。Pod容器组代表了Kubernetes中一个独立的应用程序运行实例,该实例可能由单个容器或者几个紧耦合在一起的容器组成。 Kubernetes集群中的Pod存在如下两种使用途径: 一个Pod中只运行一个容器。"one-container-per-pod" 是Kubernetes中最常见的使用方式。此时,您可以认为Pod容器组是该容器的 wrapper,Kubernetes通过Pod管理容器,而不是直接管理容器。 一个Pod中运行多个需要互相协作的容器。您可以将多个紧密耦合、共享资源且始终在一起运行的容器编排在同一个Pod中,可能的情况有: Content management systems, file and data loaders, local cache managers等 log and checkpoint backup, compression, rotation, snapshotting等 data change watchers, log tailers, logging and monitoring adapters, event publishers等 proxies, bridges, adapters等 controllers, managers, configurators, and updaters 您可以在云容器引擎CCE中方便的管理容器组(Pod),如编辑YAML、监控、删除等操作。
  • 操作场景 工作负载创建后,您可以对其执行伸缩、升级、编辑YAML、日志、监控、回退、删除等操作。 表1 工作负载/任务管理 操作 描述 日志 可查看无状态工作负载、有状态工作负载、守护进程集、普通任务的日志信息 升级 可以通过更换镜像或镜像版本实现无状态工作负载、有状态工作负载、守护进程集的快速升级,业务无中断。 编辑YAML 可通过在线YAML编辑窗对无状态工作负载、有状态工作负载、守护进程集和容器组的YAML文件进行修改和下载。普通任务和定时任务的YAML文件仅支持查看、复制和下载。 伸缩 可以根据业务需求自行定义无状态工作负载、有状态工作负载和守护进程集的伸缩策略,降低因应对业务变化和高峰压力而人为反复调整资源的工作量,帮助您节约资源和人力成本。 监控 可以通过CCE控制台查看无状态工作负载、守护进程集和容器组的CPU和内存占用情况,以确定需要的资源规格。 回退 无状态工作负载可以进行回退操作,仅无状态工作负载可用。 暂停 无状态工作负载可以进行暂停操作,仅无状态工作负载可用。 恢复 无状态工作负载可以进行恢复操作,仅无状态工作负载可用。 标签管理 标签是以key/value键值对的形式附加在工作负载上的。添加标签后,可通过标签对工作负载进行管理和选择,主要用于设置亲和性与反亲和性调度。 删除 若工作负载无需再使用,您可以将工作负载或任务删除。工作负载或任务删除后,将无法恢复,请谨慎操作。 访问方式 您可根据业务需要选择工作负载的访问方式:网络概述。 调度策略 CCE支持“自定义调度策略”和“简易调度策略”。自定义调度策略开放节点亲和、工作负载亲和以及工作负载反亲和调度策略的配置,以满足用户的更高需求。简易调度策略提供简单便捷以及足够功能的调度方式。 事件 查看该工作负载或具体实例的事件名称、事件类型、发生次数、Kubernetes事件、首次和最近发生的时间。
  • 容器如何执行命令和参数 Docker的镜像拥有存储镜像信息的相关元数据,如果不设置生命周期命令和参数,容器运行时会运行镜像制作时提供的默认的命令和参数,Docker原生定义这两个字段为“Entrypoint”和"CMD"。 如果在创建工作负载时填写了容器的运行命令和参数,将会覆盖镜像构建时的默认命令"Entrypoint"、"CMD",规则如下: 表1 容器如何执行命令和参数 镜像 Entrypoint 镜像CMD 容器运行命令 容器运行参数 最终执行 [touch] [/root/test] 未设置 未设置 [touch /root/test] [touch] [/root/test] [mkdir] 未设置 [mkdir] [touch] [/root/test] 未设置 [/opt/test] [touch /opt/test] [touch] [/root/test] [mkdir] [/opt/test] [mkdir /opt/test]
  • 操作场景 创建工作负载或任务时,通常通过镜像指定容器中运行的进程。 在默认情况下,镜像会运行默认命令,如果想运行特定命令或重写镜像默认值,需要用到以下设置: 工作目录:指定运行命令的工作目录。 若镜像中未指定工作目录,且在界面中也未指定,默认是“/”。 运行命令:控制镜像运行的实际命令。 运行参数:传递给运行命令的参数。 容器启动后,容器中的内容不应修改。如果修改配置项(例如将容器应用的密码、证书、环境变量配置到容器中),当容器重启(例如节点异常重新调度pod)后,会导致配置丢失,业务异常。 配置信息应通过入参等方式导入容器中,以免重启后配置丢失。
  • 设置容器启动命令-YAML样例 本节以nginx为例,说明通过kubectl设置容器启动命令的方法。 请参见通过kubectl连接集群,使用kubectl连接集群。参见通过kubectl命令行创建无状态工作负载或通过kubectl命令行创建有状态工作负载时,容器启动命令的参数设置如下所示,详细请参见kubernetes官方文档。 apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 1 selector: matchLabels: app: nginx strategy: type: RollingUpdate template: metadata: labels: app: nginx spec: containers: - image: nginx command: - sleep - '3600' #启动命令 imagePullPolicy: Always lifecycle: postStart: exec: command: - /bin/bash - install.sh #启动后命令 preStop: exec: command: - /bin/bash - uninstall.sh #停止前命令 name: nginx imagePullSecrets: - name: default-secret
  • 工作负载创建时设置 您可以在创建工作负载时通过CCE控制台设置Service访问方式,如下: 参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet),在“工作负载访问设置”步骤,单击“添加服务”。 访问类型:选择“集群内访问 ( ClusterIP )”。 Service名称:自定义服务名称,可与工作负载名称保持一致。 IPv6:默认不开启,开启后服务的集群内IP地址(ClusterIP)变为IPv6地址,具体请参见如何通过CCE搭建IPv4/IPv6双栈集群?。该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。 端口配置: 协议:请根据业务的协议类型选择。 容器端口:工作负载程序实际监听的端口,需用户确定。nginx程序实际监听的端口为80。 访问端口:容器端口映射到集群虚拟IP上的端口,用虚拟IP访问工作负载时使用,端口范围为1-65535,可任意指定。 图2 访问类型为集群内访问 ( ClusterIP ) 单击“下一步”进入“高级设置”页面,直接单击“创建”。 单击“查看工作负载详情”,在“访问方式”页签下获取访问地址,例如10.247.74.100:8080。
  • 集群网络构成 集群中节点都位于VPC中,节点使用VPC的网络,容器的网络是使用专门的网络插件来管理。 节点网络 节点网络为集群内主机(节点,图中的Node)分配IP地址,您需要选择VPC中的子网用于CCE集群的节点网络。子网的可用IP数量决定了集群中可以创建节点数量的上限(包括Master节点和Node节点),集群中可创建节点数量还受容器网络的影响,在容器网络模型中会进一步说明。 容器网络 为集群内容器分配IP地址。CCE继承Kubernetes的IP-Per-Pod-Per-Network的容器网络模型,即每个Pod在每个网络平面下都拥有一个独立的IP地址,Pod内所有容器共享同一个网络命名空间,集群内所有Pod都在一个直接连通的扁平网络中,无需NAT可直接通过Pod的IP地址访问。Kubernetes只提供了如何为Pod提供网络的机制,并不直接负责配置Pod网络;Pod网络的具体配置操作交由具体的容器网络插件实现。容器网络插件负责为Pod配置网络并管理容器IP地址。 当前CCE支持如下容器网络模型。 容器隧道网络:容器隧道网络在节点网络基础上通过隧道封装另构建的独立于节点网络平面的容器网络平面,CCE集群容器隧道网络使用的封装协议为VXLAN,后端虚拟交换机采用的是openvswitch,VXLAN是将以太网报文封装成UDP报文进行隧道传输。 VPC网络:VPC网络采用VPC路由方式与底层网络深度整合,适用于高性能场景,节点数量受限于虚拟私有云VPC的路由配额。每个节点将会被分配固定大小的IP地址段。VPC网络由于没有隧道封装的消耗,容器网络性能相对于容器隧道网络有一定优势。VPC网络集群由于VPC路由中配置有容器网段与节点IP的路由,可以支持集群外直接访问容器实例等特殊场景。 云原生2.0网络:云原生网络2.0是自研的新一代容器网络模型,深度整合了虚拟私有云VPC的弹性网卡(Elastic Network Interface,简称ENI)和辅助弹性网卡(Sub Network Interface,简称Sub-ENI)的能力,直接从VPC网段内分配容器IP地址,支持ELB直通容器,绑定安全组,绑定弹性公网IP,享有高性能。 不同容器网络模型,容器网络的性能、组网规模、适用场景各不相同,在容器网络模型对比章节,将会详细介绍不同容器网络模型的功能特性,了解这些有助于您选择容器网络模型。 服务网络 服务(Service)是Kubernetes内的概念,每个Service都有一个固定的IP地址,在CCE上创建集群时,可以指定Service的地址段(即服务网段)。服务网段不能和节点网段、容器网段重叠。服务网段只在集群内使用,不能在集群外使用。
  • 使用kubectl创建第三方镜像仓库的密钥 请参见通过kubectl连接集群,使用kubectl连接集群。 通过kubectl创建认证密钥 ,该密钥类型为dockercfg类型。 kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 其中,myregistrykey为密钥名称,其余参数如下所示。 DOCKER_REGISTRY_SERVER:第三方镜像仓库的地址,如“www.3rdregistry.com”或“10.10.10.10:443”。 DOCKER_USER:第三方镜像仓库的帐号。 DOCKER_PASSWORD:第三方镜像仓库的密码。 DOCKER_EMAIL:第三方镜像仓库的邮箱。 创建工作负载时使用第三方镜像,具体步骤请参见如下。 dockecfg类型的密钥作为私有镜像获取的认证方式,以Pod为例,创建的myregistrykey作为镜像的认证方式。 apiVersion: v1kind: Podmetadata: name: foo namespace: defaultspec: containers: - name: foo image: www.3rdregistry.com/janedoe/awesomeapp:v1 imagePullSecrets: - name: myregistrykey #使用上面创建的密钥
  • Service Service是用来解决Pod访问问题的。每个Service有一个固定IP地址,Service将访问流量转发给Pod,而且Service可以给这些Pod做负载均衡。 图1 通过Service访问Pod 根据创建Service的类型类型不同,可分成如下模式: ClusterIP:用于在集群内部互相访问的场景,通过ClusterIP访问Service。 NodePort:用于从集群外部访问的场景,通过节点上的端口访问Service。 LoadBalancer:用于从集群外部访问的场景,其实是NodePort的扩展,通过一个特定的LoadBalancer访问Service,这个LoadBalancer将请求转发到节点的NodePort,而外部只需要访问LoadBalancer。 ENI LoadBalancer:用于从集群外部访问的场景,可使用LoadBalancer直通容器,使部署在容器中的业务时延降低、性能无损耗。 Service的详细介绍请参见Service概述。
  • 网络访问场景 负载网络访问可以分为如下几种场景。 集群内部访问:创建ClusterIP类型的Service,通过Service访问负载。 外部访问负载:从外部访问负载推荐使用Service(NodePort类型或LoadBalancer类型)或Ingress访问。 公网访问负载需要节点或LoadBalancer绑定公网IP。 内网访问负载通过节点或LoadBalancer内网IP即可。如果跨VPC需要通过对等连接等手段打通不同VPC网络。 负载访问外部: 负载访问内网:负载访问内网地址,在不同容器网络模型下有不同的表现,需要注意在对端安全组放通容器网段,具体请参见容器如何访问VPC内部网络。 负载访问公网:访问公网有几种方法可以实现,一是让容器所在节点绑定公网IP(容器网络模型为VPC网络或容器隧道网络),或给Pod IP绑定公网IP(云原生2.0网络),另一个是通过NAT网关配置SNAT规则,具体请参见从容器访问公网。 图3 网络访问示意图
  • 使用说明 使用便捷:您可以像使用传统服务器硬盘一样,对挂载到服务器上的块存储(硬盘)做格式化、创建文件系统等操作。 数据不共享:每台服务器使用独立的块存储(硬盘),多服务器之间数据隔离。 私有网络:数据访问必须在数据中心内部网络中。 容量性能:单卷容量有限(TB级),但性能极佳(IO读写时延ms级)。 使用限制:不支持导入分区过或者具有非ext4文件系统的云硬盘。 应用场景:主要面向HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。适用于供单实例部署的无状态负载(Deployment)和普通任务(Job),以及有状态工作负载(StatefulSet)的每个实例独占式使用。因为云硬盘属于非共享存储,不能同时被多个节点挂载,若两个Pod配置了使用同一个云硬盘,当这两个Pod被调度到不同的节点时,必然有一个Pod会因为无法挂载云硬盘导致无法成功启动。
  • CSI和Flexvolume存储插件的区别 表4 CSI与Flexvolume Kubernetes插件方案 CCE插件名称 插件特性 使用推荐 CSI Everest CSI插件是kubernetes社区推荐的存储插件机制。CCE发布的kubernetes1.15版本及以上版本默认安装CSI插件Everest,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 Everest插件包含两部分: Everest-csi-controller:提供存储卷的创建、删除、扩容、云盘快照等功能; Everest-csi-driver:提供存储卷在node上的挂载、卸载、格式化等功能。 详情请参见Everest 针对1.15及以上版本的集群,在创建时将默认安装CSI插件(Everest)。CCE会跟随社区持续更新CSI插件的各种能力。 Flexvolume storage-driver Flexvolume插件是kubernetes社区早期实现的存储卷插件机制。自CCE上线伊始,提供的就是Flexvolume数据卷服务。CCE发布的kubernetes 1.13及以下版本安装的插件是“storage-driver”,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 详情请参见storage-driver 针对已经创建的1.13及以下版本的集群,仍然使用已经安装的Flexvolume存储插件(storage-driver),CCE已停止更新该插件,您可以升级集群版本。 不支持CSI和Flexvolume插件在同一个集群中使用。 不支持将v1.13及以下版本集群的Flexvolume插件转变到CSI插件,v1.13版本的集群可以通过升级集群版本切换为CSI插件,详情请参见集群升级路径。
  • 插件版本说明 使用CSI插件(Everest)要求Kubernetes版本需为1.15及以上。 v1.13及以下版本集群创建时默认安装Flexvolume插件(storage-driver)。集群版本由v1.13升级到v1.15后,v1.13版本集群中的Flexvolume容器存储插件(storage-driver)能力将由v1.15的CSI插件(Everest,插件版本v1.1.6及以上)接管,接管后原有功能保持不变。
  • 使用说明 符合标准文件协议:用户可以将文件系统挂载给服务器,像使用本地文件目录一样。 数据共享:多台服务器可挂载相同的文件系统,数据可以共享操作和访问。 私有网络:数据访问必须在数据中心内部网络中。 容量与性能:单文件系统容量较高(PB级),性能极佳(IO读写时延ms级)。 应用场景:适用于多读多写(ReadWriteMany)场景下的各种工作负载(Deployment/StatefulSet)和普通任务(Job)使用,主要面向高性能计算、媒体处理、内容管理和Web服务、大数据和分析应用程序等场景。 详情请参见弹性文件服务产品介绍。
  • 操作步骤 参照使用kubectl自动创建文件存储中操作创建文件存储卷,记录文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为sfs-statefulset-example.yaml。 touch sfs-statefulset-example.yaml vi sfs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: sfs-statefulset-example namespace: defaultspec: replicas: 2 selector: matchLabels: app: sfs-statefulset-example serviceName: qwqq template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: "true" labels: app: sfs-statefulset-example spec: affinity: {} containers: - image: nginx:latest name: container-0 volumeMounts: - mountPath: /tmp name: pvc-sfs-example imagePullSecrets: - name: default-secret volumes: - name: pvc-sfs-example persistentVolumeClaim: claimName: cce-sfs-demo 表1 关键参数说明 前置路径 参数 描述 spec replicas 实例数。 metadata name 新建工作负载的名称。 spec.template.spec.containers image 新建工作负载使用的镜像。 spec.template.spec.containers.volumeMounts mountPath 容器内挂载路径。 spec serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 spec.template.spec.volumes.persistentVolumeClaim claimName 已有PVC名称。 spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f sfs-statefulset-example .yaml
  • 操作步骤 参照使用kubectl自动创建对象存储中操作创建对象存储卷,并获取PVC名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个YAML文件,用于创建工作负载。假设文件名为obs-statefulset-example.yaml。 touch obs-statefulset-example.yaml vi obs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: obs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: obs-statefulset-example serviceName: qwqq template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: "true" creationTimestamp: null labels: app: obs-statefulset-example spec: affinity: {} containers: image: nginx:latest imagePullPolicy: Always name: container-0 volumeMounts: - mountPath: /tmp name: pvc-obs-example imagePullSecrets: - name: default-secret volumes: - name: pvc-obs-example persistentVolumeClaim: claimName: cce-obs-demo 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 创建有状态工作负载。 kubectl create -f obs-statefulset-example.yaml
  • 使用说明 符合标准文件协议:用户可以将文件系统挂载给服务器,像使用本地文件目录一样。 数据共享:多台服务器可挂载相同的文件系统,数据可以共享操作和访问。 私有网络:数据访问必须在数据中心内部网络中。 安全隔离:直接使用云上现有IAAS服务构建独享的云文件存储,为租户提供数据隔离保护和IOPS性能保障。 应用场景:适用于多读多写(ReadWriteMany)场景下的各种工作负载(Deployment/StatefulSet)、守护进程集(DaemonSet)和普通任务(Job)使用,主要面向高性能网站、日志存储、DevOps、企业办公等场景。
  • 操作步骤 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建两个yaml文件,用于创建PersistentVolume(PV)、PersistentVolumeClaim(PVC),假设文件名为pv-obs-example.yaml、pvc-obs-example.yaml。 touch pv-obs-example.yaml pvc-obs-example.yaml K8s集群版本(K8s version) 说明 yaml示例 1.11 ≤ K8s version ≤ 1.13 1.11以上及1.13版本集群 请参见1.11~1.13 yaml文件配置示例 K8s version = 1.9 1.9版本集群 请参见1.9 yaml文件配置示例 1.11 ≤ K8s version ≤ 1.13(1.11以上及1.13版本集群) PV yaml文件配置示例: apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: flexvolume-huawei.com/fuxiobsspec: accessModes: - ReadWriteMany capacity: storage: 1Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: pvc-obs-example namespace: default flexVolume: driver: huawei.com/fuxiobs fsType: obs options: fsType: obs region: cn-north-4 storage_class: STANDARD volumeID: test-obs persistentVolumeReclaimPolicy: Delete storageClassName: obs-standard 表1 关键参数说明 参数 描述 driver 挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。 storage_class 存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。 region 集群所在的region。 volumeID 对象存储的桶名称。 获取方法:在CCE控制台,单击左侧栏目树中的“资源管理-存储管理”,在“对象存储卷”页签下单击PVC的名称,在PVC详情页的“PV详情”页签下复制“PV名称”后的内容即可。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 storageClassName 对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。 spec.claimRef.apiVersion 固定值"v1"。 spec.claimRef.kind 固定值"PersistentVolumeClaim"。 spec.claimRef.name 与下一步创建的pvc的name一致。 spec.claimRef.namespace 与下一步创建的pvc的namespace一致。 PVC yaml文件配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: volume.beta.kubernetes.io/storage-class: obs-standard volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs name: pvc-obs-example namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeName: pv-obs-example 表2 关键参数说明 参数 描述 volume.beta.kubernetes.io/storage-class 对象存储支持的存储类型,包括obs-standard、obs-standard-ia。 volume.beta.kubernetes.io/storage-provisioner 必须使用flexvolume-huawei.com/fuxiobs。 volumeName PV的名称。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 K8s version = 1.9(1.9版本集群) PV yaml文件配置示例: apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example namespace: default spec: accessModes: - ReadWriteMany capacity: storage: 1Gi flexVolume: driver: huawei.com/fuxiobs fsType: obs options: fsType: obs kubernetes.io/namespace: default region: cn-north-4 storage_class: STANDARD volumeID: test-obs persistentVolumeReclaimPolicy: Delete storageClassName: obs-standard 表3 关键参数说明 参数 描述 driver 挂载依赖的存储驱动,对象存储配置为“huawei.com/fuxiobs”。 storage_class 存储类型,包括STANDARD(标准桶)、STANDARD_IA(低频访问桶)。 region 集群所在的region。 volumeID 对象存储的桶名称。 获取方法:在CCE控制台,单击左侧栏目树中的“资源管理-存储管理”,在“对象存储卷”页签下单击PVC的名称,在PVC详情页的“PV详情”页签下复制“PV名称”后的内容即可。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 storageClassName 对象存储支持的存储类型,包括obs-standard(标准)、obs-standard-ia(低频)。 PVC yaml文件配置示例: apiVersion: v1kind: PersistentVolumeClaimmetadata: annotations: volume.beta.kubernetes.io/storage-class: obs-standard volume.beta.kubernetes.io/storage-provisioner: flexvolume-huawei.com/fuxiobs name: pvc-obs-example namespace: defaultspec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeName: pv-obs-example volumeNamespace: default 表4 关键参数说明 参数 描述 volume.beta.kubernetes.io/storage-class 对象存储支持的存储类型,包括obs-standard、obs-standard-ia。 volume.beta.kubernetes.io/storage-provisioner 必须使用flexvolume-huawei.com/fuxiobs。 volumeName PV的名称。 storage 存储容量,单位为Gi。此处配置为固定值1Gi。 创建PV。 kubectl create -f pv-obs-example.yaml 创建PVC。 kubectl create -f pvc-obs-example.yaml
  • 操作步骤 参照创建文件存储卷中操作创建极速文件存储卷,记录极速文件存储卷名称。 请参见通过kubectl连接集群,使用kubectl连接集群。 新建一个文件,用于创建工作负载。假设文件名为efs-statefulset-example.yaml。 touch efs-statefulset-example.yaml vi efs-statefulset-example.yaml yaml示例如下: apiVersion: apps/v1kind: StatefulSetmetadata: name: efs-statefulset-example namespace: defaultspec: replicas: 1 selector: matchLabels: app: efs-statefulset-example template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' pod.alpha.kubernetes.io/initialized: 'true' labels: app: efs-statefulset-example spec: containers: - image: 'nginx:1.0.0' name: container-0 resources: requests: {} limits: {} env: - name: PAAS_APP_NAME value: efs-statefulset-example - name: PAAS_NAMESPACE value: default - name: PAAS_PROJECT_ID value: b18296881cc34f929baa8b9e95abf88b volumeMounts: - name: efs-statefulset-example mountPath: /tmp readOnly: false subPath: '' imagePullSecrets: - name: default-secret terminationGracePeriodSeconds: 30 volumes: - persistentVolumeClaim: claimName: cce-efs-import-jnr481gm-3y5o name: efs-statefulset-example affinity: {} tolerations: - key: node.kubernetes.io/not-ready operator: Exists effect: NoExecute tolerationSeconds: 300 - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute tolerationSeconds: 300 podManagementPolicy: OrderedReady serviceName: test updateStrategy: type: RollingUpdate 表1 关键参数说明 参数 描述 replicas 实例数。 name 新建工作负载的名称。 image 新建工作负载使用的镜像。 mountPath 容器内挂载路径。 serviceName 工作负载对应的服务,服务创建过程请参见创建有状态负载(StatefulSet)。 claimName 已有PVC名称。 spec.template.spec.containers.volumeMounts.name和spec.template.spec.volumes.name有映射关系,必须保持一致。 创建有状态工作负载。 kubectl create -f efs-statefulset-example.yaml
  • IPVS IPVS(IP Virtual Server)是在Netfilter上层构建的,并作为Linux内核的一部分,实现传输层负载均衡。IPVS可以将基于TCP和UDP服务的请求定向到真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。 IPVS 模式下,kube-proxy 使用 IPVS 负载均衡代替了 iptables。这种模式同样有效,IPVS 的设计就是用来为大量服务进行负载均衡的,它有一套优化过的 API,使用优化的查找算法,而不是简单的从列表中查找规则。
  • 节点标签使用场景 节点标签的主要使用场景有两类。 节点管理:通过节点标签管理节点,给节点分类。 工作负载与节点的亲和与反亲和: 有的工作负载需要的CPU大,有的工作负载需要的内存大,有的工作负载需要IO大、可能会影响其他工作负载正常工作等等,此时建议给节点添加不同标签。在部署工作负载的时候,就可以选择相应标签的节点亲和部署,保证系统正常工作;反之,可以使用节点的反亲和部署。 一个系统可以分为多个模块,每个模块由多个微服务组成,为保证后期运维的高效,可以将节点打上对应模块的标签,让各模块部署到各自的节点模块上,互不干扰、方便开发到各自节点上去维护。
共100000条