华为云用户手册
-
验证负载伸缩结果 查看FederatedHPA策略,结果显示工作负载的CPU使用率为0%。 kubectl get FederatedHPA hpa-example-hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 1 6m 通过如下命令访问工作负载,其中{ip:port}为负载的访问地址,可以在工作负载的详情页中查询。 while true;do wget -q -O- http://{ip:port}; done 观察工作负载自动扩容过程。 kubectl get federatedhpa hpa-example-hpa --watch 查看FederatedHPA策略,可以看到6m23s时负载的CPU使用率为200%,超过了目标值,此时触发了FederatedHPA策略,将工作负载扩容为4个Pod,随后的几分钟内,CPU使用并未下降,直到到8m16s时CPU使用率才开始下降,这是因为新创建的Pod并不一定创建成功,可能是因为资源不足Pod处于Pending状态,这段时间内在扩容节点。 到8m16s时CPU使用率开始下降,说明Pod创建成功,开始分担请求流量,到8分钟时下降到81%,还是高于目标值,在容忍度范围外,说明还会再次扩容,到9m31s时再次扩容到7个Pod,这时CPU使用率降为51%,在容忍度范围内,不会再次扩缩,因此此后Pod数量一直稳定在7个。 NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 1 6m hpa-example-hpa Deployment/hpa-example 200%/50% 1 100 1 6m23s hpa-example-hpa Deployment/hpa-example 200%/50% 1 100 4 6m31s hpa-example-hpa Deployment/hpa-example 210%/50% 1 100 4 7m16s hpa-example-hpa Deployment/hpa-example 210%/50% 1 100 4 7m16s hpa-example-hpa Deployment/hpa-example 90%/50% 1 100 4 8m16s hpa-example-hpa Deployment/hpa-example 85%/50% 1 100 4 9m16s hpa-example-hpa Deployment/hpa-example 51%/50% 1 100 7 9m31s hpa-example-hpa Deployment/hpa-example 51%/50% 1 100 7 10m16s hpa-example-hpa Deployment/hpa-example 51%/50% 1 100 7 11m 查看FederatedHPA策略事件,可以看到策略的生效时间。 kubectl describe federatedhpa hpa-example-hpa 停止访问负载,观察工作负载自动缩容过程。 查看FederatedHPA策略,可以看到从13m开始CPU使用率为21%,18m时Pod数量缩为3个,到23m时Pod数量缩为1个。 kubectl get federatedhpa hpa-example-hpa --watch NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-example-hpa Deployment/hpa-example 50%/50% 1 100 7 12m hpa-example-hpa Deployment/hpa-example 21%/50% 1 100 7 13m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 7 14m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 7 18m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 18m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 19m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 23m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 3 23m hpa-example-hpa Deployment/hpa-example 0%/50% 1 100 1 23m 查看FederatedHPA策略事件,可以看到策略的生效时间。 kubectl describe federatedhpa hpa-example-hpa 达到CronFederatedHPA策略的触发时间后,观察工作负载的自动扩缩容过程。 可以看到118m时Pod数量扩为4个,到123m时Pod数量扩为10个。 kubectl get cronfederatedhpa cron-federated-hpa --watch NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE cron-federated-hpa Deployment/hpa-example 50%/50% 1 100 1 112m cron-federated-hpa Deployment/hpa-example 21%/50% 1 100 1 113m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 114m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 118m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 118m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 4 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 119m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 7 123m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 10 123m cron-federated-hpa Deployment/hpa-example 0%/50% 1 100 10 123m 查看CronFederatedHPA策略事件,可以看到策略的生效时间。 kubectl describe cronfederatedhpa cron-federated-hpa
-
应用场景 在一些复杂的业务场景下,可能有固定时间段高峰业务,又有日常突发高峰业务,若只使用标准的FederatedHPA功能,需要足够的时间来扩展工作负载,在预期的负载峰值可能会导致服务不可用。此种情况下,用户既期望能定时弹性伸缩应对固定时间段高峰业务,又期望能基于指标弹性伸缩应对日常突发高峰业务。联动FederatedHPA策略与CronFederatedHPA策略可实现复杂场景下的工作负载扩缩能力。 本小节将以hpa-example应用为例,指导您搭配使用FederatedHPA策略与CronFederatedHPA策略,实现复杂业务场景下的工作负载扩缩。
-
创建工作负载 使用构建的hpa-example镜像创建无状态工作负载,Pod数为1。镜像地址与上传到的SWR仓库有关,需要替换为实际取值。 kind: Deployment apiVersion: apps/v1 metadata: name: hpa-example spec: replicas: 1 selector: matchLabels: app: hpa-example template: metadata: labels: app: hpa-example spec: containers: - name: container-1 image: 'hpa-example:latest' # 替换为您上传到SWR的镜像地址 resources: limits: # limits与requests建议取值保持一致,避免扩缩容过程中出现震荡 cpu: 500m memory: 200Mi requests: cpu: 500m memory: 200Mi imagePullSecrets: - name: default-secret 创建一个端口号为80的服务。 kind: Service apiVersion: v1 metadata: name: hpa-example spec: ports: - name: cce-service-0 protocol: TCP port: 80 targetPort: 80 nodePort: 31144 selector: app: hpa-example type: NodePort 为工作负载和服务创建一个调度策略,并将其部署到cluster01和cluster02两个集群,使用权重拆分的方式部署,每个集群的权重为1,以保证两个集群的相同优先级。 apiVersion: policy.karmada.io/v1alpha1 kind: PropagationPolicy metadata: name: hpa-example-pp namespace: default spec: placement: clusterAffinity: clusterNames: - cluster01 - cluster02 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: staticWeightList: - targetCluster: clusterNames: - cluster01 weight: 1 - targetCluster: clusterNames: - cluster02 weight: 1 preemption: Never propagateDeps: true resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: hpa-example namespace: default - apiVersion: v1 kind: Service name: hpa-example namespace: default
-
创建负载伸缩策略 为工作负载创建FederatedHPA策略。 vi hpa-example-hpa.yaml YAML文件内容如下。该策略作用于名称为hpa-example的负载,稳定窗口时长为扩容0秒、缩容100秒,最大Pod数为100、最小Pod数为2,包含一条系统指标规则,期望的CPU利用率为50%。 apiVersion: autoscaling.karmada.io/v1alpha1 kind: FederatedHPA metadata: name: hpa-example-hpa # FederatedHPA策略名称 namespace: default # 工作负载所在命名空间名称 spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hpa-example # 工作负载名称 behavior: scaleDown: stabilizationWindowSeconds: 100 # 缩容的稳定窗口时长为100秒 scaleUp: stabilizationWindowSeconds: 0 # 扩容的稳定窗口时长为0秒 minReplicas: 2 # 最小Pod数为2 maxReplicas: 100 # 最大Pod数为100 metrics: - type: Resource resource: name: cpu # 扩缩指标基于CPU数据 target: type: Utilization # 指标类型为利用率 averageUtilization: 50 # 期望的平均利用率 创建CronFederatedHPA策略。 vi cron-federated-hpa.yaml YAML文件内容如下。该策略作用于名称为hpa-example-hpa的FederatedHPA策略,期望每天8:30扩容工作负载至10个Pod,每天10:00缩容工作负载至2个Pod。 apiVersion: autoscaling.karmada.io/v1alpha1 kind: CronFederatedHPA metadata: name: cron-federated-hpa # CronFederatedHPA策略名称 spec: scaleTargetRef: apiVersion: apps/v1 kind: FederatedHPA # 作用于FederatedHPA策略 name: hpa-example-hpa # FederatedHPA的名称 rules: - name: "Scale-Up" # 规则名称 schedule: 30 08 * * * # 触发时间 targetReplicas: 10 # 目标Pod数,非负整数 timeZone: Asia/Shanghai # 时区 - name: "Scale-Down" # 规则名称 schedule: 0 10 * * * # 触发时间 targetReplicas: 2 # 目标Pod数,非负整数 timeZone: Asia/Shanghai # 时区
-
接入前准备 服务 域名 IP(如涉及) 端口 SWR swr.cn-north-4.myhuaweicloud.com 从VPCEP中获取。 443 OBS op-svc-swr-b051-10-38-19-62-3az.obs.cn-north-4.myhuaweicloud.com 不涉及 443、80 CIA cie-{容器智能分析实例instanceid前八位数字}{当前选择接入的VPC子网ID前八位数字}.cn-north-4.myhuaweicloud.com 从VPCEP中获取。 443 DNS 不涉及 创建VPCEP,选择DNS Endpoint对应的地址。 53 其他区域的SWR及依赖OBS的域名信息。 Region SWR域名 OBS域名 华北-北京四 swr.cn-north-4.myhuaweicloud.com op-svc-swr-b051-10-38-19-62-3az.obs.cn-north-4.myhuaweicloud.com 华东-上海二 swr.cn-east-2.myhuaweicloud.com obs.cn-east-2.myhuaweicloud.com 华东-上海一 swr.cn-east-3.myhuaweicloud.com op-svc-swr-b051-10-147-7-14-3az.obs.cn-east-3.myhuaweicloud.com 华南-广州 swr.cn-south-1.myhuaweicloud.com op-svc-swr-b051-10-230-33-197-3az.obs.cn-south-1.myhuaweicloud.com 西南-贵阳一 swr.cn-southwest-2.myhuaweicloud.com op-svc-swr-b051-10-205-14-19-3az.obs.cn-southwest-2.myhuaweicloud.com 华北-乌兰察布一 swr.cn-north-9.myhuaweicloud.com obs.cn-north-9.myhuaweicloud.com 亚太-新加坡 swr.ap-southeast-3.myhuaweicloud.com op-svc-swr-b051-10-38-34-172-3az.obs.ap-southeast-3.myhuaweicloud.com 香港 swr.ap-southeast-1.myhuaweicloud.com obs.ap-southeast-1.myhuaweicloud.com 拉美-墨西哥一 swr.na-mexico-1.myhuaweicloud.com obs.na-mexico-1.myhuaweicloud.com 拉美-墨西哥二 swr.la-north-2.myhuaweicloud.com obs.la-north-2.myhuaweicloud.com
-
前提条件 账号已开通U CS 服务,并且按照图1完成舰队、集群资源的准备工作。 按照图2完成权限数据的准备工作。 表1 IAM 控制台数据准备 用户组 用户 权限 管理员用户组:UCS_Group_admin UCS_Group_admin_User1 UCS FullAccess 用户组1:UCS_Group_1 UCS_Group_1_User1、UCS_Group_1_User2 ... UCS CommonOperations 用户组2:UCS_Group_2 UCS_Group_2_User1、UCS_Group_2_User2 ... UCS CommonOperations 表2 UCS控制台数据准备 用户组 用户 权限类型 权限名称 用户组1 UCS_Group_1_User1、UCS_Group_1_User2 ... 管理员权限 ucs-group-1-admin 只读权限 ucs-group-1-readonly 用户组2 UCS_Group_2_User1、UCS_Group_2_User2 ... 管理员权限 ucs-group-2-admin 只读权限 ucs-group-2-readonly
-
应用场景 UCS在 统一身份认证 服务(IAM)能力基础上,为用户提供细粒度的权限管理功能,帮助用户灵活便捷地对租户下的IAM用户设置不同的UCS资源权限,结合权限策略和舰队设计,可实现企业不同部门或项目之间的权限隔离。 例如,某公司同时推进两个项目组,每个项目组中有多名成员,权限分配如图1 权限设计所示。 项目组A在开发过程中需要舰队1、2的管理员权限以及舰队3的只读权限。 项目组B在开发过程中需要舰队1、3的管理员权限以及舰队2的只读权限。 图1 权限设计
-
步骤二:UCS管理员授权 使用UCS管理员登录UCS控制台,在左侧导航栏选择“权限管理”。 单击右上角的“创建权限”按钮。 在弹出页面中填写权限的参数项。 权限名称:自定义权限的名称,需以小写字母开头,由小写字母、数字、中划线(-)组成,且不能以中划线(-)结尾。 用户:选择权限关联的用户,即上一步创建的IAM用户。实际应用中,一个用户组会有多个用户,创建权限时,可以将这个用户组下的所有用户全部选中,以达到批量授权的目的。 权限类型:选择“管理员权限”。管理员权限表示对所有集群资源对象的读写权限。 单击“确定”,创建权限。 权限创建完成后,可前往“容器舰队”页面,单击目标舰队右上角按钮。 图7 为舰队关联权限 在弹出的页面单击“关联权限”,打开“修改权限”页面,将3中创建的权限和舰队的全部命名空间关联起来。 图8 修改权限 单击“确定”。完成后,使用该IAM用户登录UCS控制台可使用权限范围内的功能。 重复以上步骤,完成表2中其他权限的创建,以及权限和舰队的关联。
-
方案介绍 要想实现上述的权限隔离,必须结合使用IAM系统策略和UCS权限管理功能,IAM系统策略控制用户可操作哪些UCS控制台的功能,UCS权限管理控制用户可操作哪些舰队和集群资源。 如图2 授权方案所示,授权包括如下两大步骤。 第一步授权(IAM控制台):拥有Tenant Administrator权限的IAM管理员需要创建三个用户组,一个为管理员用户组,另外两个为项目组A、B所对应的用户组(用户组1、2),分别授予UCS FullAccess和UCS CommonOperations权限。 第二步授权(UCS控制台):拥有UCS FullAccess权限的UCS管理员分别为用户组1、用户组2创建各自的管理员权限、只读权限,然后关联到舰队上。 具体的关联策略如下:用户组1的管理员权限关联至舰队1、舰队2,只读权限关联至舰队3;用户组2的管理员权限关联至舰队1、舰队3,只读权限关联至舰队2。 图2 授权方案
-
步骤一:IAM管理员授权 使用IAM管理员账号登录IAM控制台。 左侧导航栏选择“用户组”,单击右上角“创建用户组”。 在“创建用户组”界面,输入管理员用户组的名称及描述,单击“确定”,完成用户组创建。 图3 创建用户组 在用户组列表中,单击目标用户组右侧的“授权”按钮。 图4 为用户组授权 搜索并选择权限策略UCS FullAccess。 图5 选择权限策略 单击“下一步”,选择授权范围方案。 选择“所有资源”,不设置最小授权范围,用户可根据权限使用账号中所有资源,包括企业项目、区域项目和全局服务资源。 单击“确定”完成授权。 左侧导航栏选择“用户”,单击右上角“创建用户”,新建一个IAM用户。 填写用户名及初始密码,其余参数说明请参见创建IAM用户。 单击“下一步”,选择加入4中已授权的用户组。 图6 加入用户组 单击“创建用户”。 重复上述步骤,完成表1中其他用户组、用户的创建和授权。
-
使用kubectl命令实现UCS高可用部署操作步骤 前置条件: 使用kubectl连接集群联邦,详细操作请参见通过kubectl连接集群。 已创建可使用的独享型ELB实例,并绑定弹性公网,详情可参见购买独享型负载均衡器。 以下均为示例yaml,请根据实际情况修改参数内容。 实践操作操作步骤: 使用UCS高可用部署,需要进行指定资源下发规则,示例如下yaml: apiVersion: policy.karmada.io/v1alpha1 kind: ClusterPropagationPolicy metadata: name: karmada-global-policy # 策略名 spec: resourceSelectors: # 分发策略关联的资源,支持同时分发多个资源对象 - apiVersion: apps/v1 # group/version kind: Deployment # 资源类型kind - apiVersion: apps/v1 kind: DaemonSet - apiVersion: v1 kind: Service - apiVersion: v1 kind: Secret - apiVersion: v1 kind: ConfigMap - apiVersion: v1 kind: ResourceQuota - apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler - apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler - apiVersion: autoscaling.cce.io/v2alpha1 kind: CronHorizontalPodAutoscaler priority: 0 # 数值越大,优先级越高 conflictResolution: Overwrite # conflictResolution声明当正在传播的资源已存在于目标集群中时, 默认为“Abort”,这意味着停止传播以避免意外覆盖。Overwrite则表示强制覆盖。 placement: # 放置规则即把关联资源分发到哪些集群 clusterAffinity: # 配置集群亲和性 clusterNames: # 使用集群名选择集群 - ucs01 # 集群名:需要修改为环境中实际集群名 - ucs02 # 集群名:需要修改为环境中实际集群名 replicaScheduling: # 实例调度策略 replicaSchedulingType: Divided # 实例拆分 replicaDivisionPreference: Weighted # 根据权重拆分 weightPreference: # 权重选项 staticWeightList: # 静态权重列表: ucs01的权重为1(分配到大约1/2的实例数),ucs02权重为1 (分配到大约1/2的实例数) - targetCluster: # 目标集群 clusterNames: - ucs01 # 集群名:需要修改为环境中实际集群名 weight: 1 # 权重为1 - targetCluster: # 目标集群 clusterNames: - ucs02 # 集群名:需要修改为环境中实际集群名 weight: 1 # 权重为1 clusterTolerations: # 集群容忍,当集群master不健康或不可达时,应用不作驱逐处理 - key: cluster.karmada.io/not-ready operator: Exists effect: NoExecute - key: cluster.karmada.io/unreachable operator: Exists effect: NoExecute 若创建了HPA,需要拆分hpa中的最小实例数,可使用如下示例yaml(可选): 以下yaml中clusterNum为集群数量,示例集群数量为2,请根据实际场景配置。 apiVersion: config.karmada.io/v1alpha1 kind: ResourceInterpreterCustomization metadata: name: hpa-min-replica-split-ric spec: customizations: replicaResource: luaScript: | function GetReplicas(obj) clusterNum = 2 replica = obj.spec.minReplicas if ( obj.spec.minReplicas == 1 ) then replica = clusterNum end return replica, nil end replicaRevision: luaScript: | function ReviseReplica(obj, desiredReplica) obj.spec.minReplicas = desiredReplica return obj end target: apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler 创建configmap实例,示例如下yaml: apiVersion: v1 kind: ConfigMap metadata: name: demo-configmap namespace: default #命名空间,默认为default data: foo: bar 创建deployment实例,示例如下yaml: apiVersion: apps/v1 kind: Deployment metadata: name: demo namespace: default #命名空间,默认为default labels: app: demo spec: replicas: 2 strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% selector: matchLabels: app: demo template: metadata: labels: app: demo spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - demo topologyKey: kubernetes.io/hostname containers: - env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: POD_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP envFrom: - configMapRef: name: demo-configmap name: demo image: nginx #若使用“开源镜像中心”的镜像,可直接填写镜像名称;若使用“我的镜像”中的镜像,请在SWR中获取具体镜像地址。 command: - /bin/bash args: - '-c' - 'sed -i "s/nginx/podname: $POD_NAME podIP: $POD_IP/g" /usr/share/nginx/html/index.html;nginx "-g" "daemon off;"' imagePullPolicy: IfNotPresent resources: requests: cpu: 100m memory: 100Mi limits: cpu: 100m memory: 100Mi 创建hpa实例,示例如下yaml: apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: demo-hpa namespace: default #命名空间,默认为default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: demo minReplicas: 2 maxReplicas: 4 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 30 behavior: scaleDown: policies: - type: Pods value: 2 periodSeconds: 100 - type: Percent value: 10 periodSeconds: 100 selectPolicy: Min stabilizationWindowSeconds: 300 scaleUp: policies: - type: Pods value: 2 periodSeconds: 15 - type: Percent value: 20 periodSeconds: 15 selectPolicy: Max stabilizationWindowSeconds: 0 创建service实例,示例如下yaml: apiVersion: v1 kind: Service metadata: name: demo-svc namespace: default #命名空间,默认为default spec: type: ClusterIP selector: app: demo sessionAffinity: None ports: - name: http protocol: TCP port: 8080 targetPort: 8080 创建mci实例,示例如下yaml: apiVersion: networking.karmada.io/v1alpha1 kind: MultiClusterIngress metadata: name: demo-mci # MCI的名字 namespace: default #命名空间,默认为default annotations: karmada.io/elb.id: xxx # TODO: ELB实例ID karmada.io/elb.projectid: xxx #TODO: ELB实例的项目ID karmada.io/elb.port: "8080" #TODO: ELB监听端口 karmada.io/elb.health-check-flag: "on" karmada.io/elb.health-check-option.demo-svc: '{"protocol":"TCP"}' spec: ingressClassName: public-elb # ELB类型,固定值 rules: - host: demo.localdev.me # 对外暴露的域名 TODO:修改实际地址 http: paths: - backend: service: name: demo-svc # 暴露的service名字 port: number: 8080 # 暴露service端口 path: / pathType: Prefix # 前缀匹配
-
节点级容错配置建议 节点级容错是指当某个节点发生故障时,可以将Pod自动重新调度到其他健康节点上。 项目 描述 说明 节点故障自动驱逐 当节点出现异常,变为不可用状态时,容器将在该容忍时间后自动驱逐,默认为300s。默认对所有的容器生效,用户也可以为指定pod进行差异化容忍配置,此时将以Pod配置的容忍时长为准。 无特殊需求建议保持默认配置,容忍时间配置过小可能导致容器在网络抖动等一些短时故障场景下频繁迁移影响业务,容忍时间配置过大可能导致容器在节点故障时长时间无法迁移导致业务受损。 集群节点弹性 节点弹性伸缩,也就是资源层面的弹性伸缩。CA(Cluster AutoScaling)会检查所有Pending状态的Pod,根据用户配置的扩缩容策略,选择出一个最合适的节点池进行扩容。 当集群资源不够时需要CA扩容节点,使得集群有足够资源;而当HPA缩容后集群会有大量空余资源,这时需要CA缩容节点释放资源,才不至于造成浪费。CA的上限应根据业务高峰期的资源需求或者单集群故障来设定,确保有足够的节点应对流量激增。
-
通过kubectl命令恢复集群级/AZ级故障(可选) 集群关键系统组件出现故障或者集群升级策略不当、升级配置有误、操作人员执行有误等人为因素导致集群整体不可用或者出现AZ站点级别的故障时,UCS提供手动切流的能力。通过创建Remedy对象将MultiClusterIngress流量从故障集群上摘除。 通过Kubectl命令恢复故障步骤如下: 使用kubectl连接集群联邦,详细操作请参见通过kubectl连接集群联邦。 集群故障后,在执行机上创建并编辑remedy.yaml文件,文件内容如下所示,参数定义请参见表1。 vi remedy.yaml 示例YAML定义了一个Remedy对象,触发条件为空,表示无条件触发,集群联邦控制器会立即将ucs01上的流量摘除。在集群故障恢复后,删除该Remedy对象,ucs01上的流量会自动恢复,由此保证单集群的故障不会影响服务的可用性。 apiVersion: remedy.karmada.io/v1alpha1 kind: Remedy metadata: name: foo spec: clusterAffinity: clusterNames: - ucs01 actions: - TrafficControl 表1 Remedy参数说明 参数 描述 spec.clusterAffinity.clusterNames 策略关注的集群名列表。仅在该列表中的集群会执行指定动作,为空时不会执行任何动作。 spec.decisionMatches 触发条件列表。当上述集群列表中指定的集群满足任一触发条件时,即会执行指定动作。当列表为空时,表示无条件触发。 conditionType 触发条件的类型。当前仅支持ServiceDomainNameResolutionReady类型,即CPD上报的CoreDNS域名解析状态。 operator 判断逻辑,仅支持Equal和NotEqual两种值,即等于和不等于。 conditionStatus 触发条件的状态。 actions 策略要执行的动作,目前仅支持TrafficControl,即流量控制。 集群故障恢复后,删除该Remedy对象。 kubectl delete remedy foo 检查集群ucs01上的流量已自动恢复,手动切流成功。
-
方案架构简介 UCS控制面: UCS控制面3AZ部署:UCS当前默认多AZ部署,使用集群联邦,详情可参见开通集群联邦。 UCS控制面负责管理ucs01与ucs02集群,集群加入容器舰队,详情可参见管理容器舰队。 CCE集群: 2个CCE turbo集群,集群控制面节点3AZ部署,创建集群详情可参见购买Standard/Turbo集群; 集群计算节点分别创建AZ1、AZ2节点池,创建节点池详情可参见创建节点池。 集群内分别安装集群弹性引擎(CCE Cluster Autoscaler),容器弹性引擎(CCE Advanced HPA)、域名解析(CoreDNS)等插件,详情可参见插件概述。 弹性负载均衡ELB: ELB实例多AZ部署,详情可参见ELB资源使用多AZ部署。 ELB将访问流量根据路由策略分发到后端多个Pod实例,同时结合健康检查功能,流量只分发后端正常工作的Pod实例,详情可参见配置流量分配策略分发流量。 应用部署:通过CICD流水线对接UCS控制面,创建应用deployment、弹性伸缩策略HPA以及分发策略PropagationPolicy均衡部署到双集群,并通过MultiClusterIngress发布应用,详情可参见使用kubectl命令实现UCS高可用部署操作步骤。
-
容器级容错实施建议 容器级容错旨在通过配置健康检查和自动重启机制,确保容器应用的高可用性和可靠性。应用部署需要遵守以下规范: 项目 描述 说明 应用无状态化 应用必须做无状态和幂等处理。 服务的无状态化是部署的多个服务模块(进程),使其完全对等。也就是部署多个Pod实例,请求到任一实例的处理结果是一样的。这些Pod实例不存储业务的上下文信息,比如session、登录、业务上下文相关的信息。只会根据每次请求携带的数据进行相应的业务处理。 幂等指的是使用相同的参数多次调用相同的API,对后端产生的影响是一致的。 应用副本数 每个应用负载实例数满足业务容量规划和可用性要求。 必须:每个负载的实例数不小于2。 建议:4个实例,每个集群有2个实例。 配合多集群方案,满足生产中应用高可用性要求。为集群级别和可用区(AZ)级别故障域隔离创造条件。 应用健康检查 每个应用必须配置: 启动探针(Startup Probe):适用于启动时间较长的应用,可以避免在应用尚未完全启动时就进行就绪检查。 存活探针(Liveness Probe):用于检测容器是否还在运行,如果失败,Kubernetes会重启容器。 就绪探针(Readiness Probe):用于确定容器是否已经准备好接受流量,如果失败,该容器将不会被认为是“就绪状态”,从而不会接收到服务流量。 配置合理的检查间隔和超时: 设置合理的periodSeconds(检查间隔)和timeoutSeconds(超时时间),以平衡检查频率和系统负载。 对于启动探针,可以设置较长的间隔和超时,以适应应用的启动时间。 容器出现故障或无法正常工作,系统可以自动重启该容器,从而提高应用的可用性和可靠性。 弹性伸缩 业务支持自动扩缩容的能力即配置指标弹性HPA,并且要求: 必须:HPA minReplicas不小于2,HPA maxReplicas大于等于minReplicas。 建议:HPA minReplicas值为4。 业务按需使用资源,最大程度地减少资源浪费。在业务流量突增以及集群级故障时,应用能够自动扩容,保障业务不受损。 优雅停机 应用必须支持优雅停机。 优雅停机是在对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响。应用接收到停止指令之后的步骤应该是,停止接收访问请求,等待已经接收到的请求处理完成,并能成功返回,这时才真正停止应用。 ELB健康检查 弹性负载均衡ELB流量分发正常工作的后端。 必须:应用提供健康检查接口,并在ELB上配置健康检查。 在个别实例异常、节点异常或者整个AZ、整个集群故障时,能快速地隔离故障实例,保证业务访问成功率。 容器镜像 容器镜像体积最大应不超过1G。容器镜像标签使用具体的版本号。 必须:容器镜像标签禁止使用latest。 体积小的镜像有利于分发、快速启动;镜像使用具体的版本号才能做版本控制。 资源配额 资源配额应为资源申请量的两倍数值。 预防应用升级、应用扩容场景时,因资源配额不足导致失败的情况。
-
获取IAM Token 创建 ServiceAccount,此处 ServiceAccount 的名称需要与2时填写的 ServiceAccountName 保持一致。 apiVersion: v1 kind: ServiceAccount metadata: name: test_sa_name # 与配置身份转换规则处保持一致 如下所示,在工作负载中新增 ServiceAccount 以及 Volume 相关配置。 apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx version: v1 template: metadata: labels: app: nginx version: v1 spec: containers: - name: container-1 image: nginx:latest volumeMounts - mountPath: "/var/run/secrets/tokens" # 将Kubernetes生成的ServiceAccountToken 挂载到 /var/run/secrets/tokens/token_path 文件内 name: token-volume imagePullSecrets: - name: default-secret serviceAccountName: test_sa_name # 上一步创建的ServiceAccount的名称 volumes: - name: token-volume projected: defaultMode: 420 sources: - serviceAccountToken: audience: ucs-cluster-identity # 此处取值必须为身份提供商的客户端ID expirationSeconds: 7200 # 过期时间 path: token_path # 路径名称,可自定义 创建完成后,登录到容器中获取 Token。 构造请求体数据,项目ID的获取请参见获取项目ID。 { "auth" : { "id_token" : { "id" : "eyJhbGciOiJSUzIXXXXX" // 上一步获得的 token 内容 }, "scope": { "project" : { "id" : "05495693df80d3c92fa1c01795c2be02", // 项目 ID "name" : "cn-north-7" } } } } 请求IAM接口以获取IAM Token,IAM的Endpoint信息请参见地区和终端节点。 curl -i --location --request POST 'https://{{iam endpoint}}/v3.0/OS-AUTH/id-token/tokens' --header 'X-Idp-Id: {{workload_identity}}' --header 'Content-Type: application/json' --data @token_body.json workload_identity为1中注册的身份提供商名称,此示例内为 ucs-cluster-identity。 token_body.json 为构造的请求体数据文件。 返回体内获取IAM Token,响应消息头中 X-Subject-Token 字段即为 IAM Token。
-
使用IAM Token访问云服务 本小节以请求LTS服务为例,介绍如何使用IAM Token访问云服务。 在使用IAM Token访问云服务前,应为用户组配置相应服务的权限。 请求LTS服务需要在用户组中加上 LTS FullAccess 权限,如图所示。 执行如下命令,调用对应服务接口。 curl --location --request GET 'https://ltsperform.cn-north-7.myhuaweicloud.com/v2/{{项目 ID}}/groups/{{日志组 ID}}/streams' \--header 'Content-Type: application/json;charset=utf-8' \--header 'X-Auth-Token: {{上一步获得的 IAM token}}' \--data-raw '' 日志组ID可在LTS服务内进行查询。 期望的返回结果如图所示
-
配置身份提供商 登录IAM控制台,创建身份提供商,协议选择OpenID Connect。 图2 创建身份提供商 单击“确定”,然后修改身份提供商信息,需要修改的信息如表1 身份提供商配置参数说明。若需要创建身份转换规则,单击“创建规则”进行创建。 图3 修改身份提供商信息 图4 创建身份转换规则 表1 身份提供商配置参数说明 参数 说明 访问方式 选择“编程访问” 配置信息 身份提供商 URL:https://kubernetes.default.svc.cluster.local。 客户端 ID:ucs-cluster-identity。 签名公钥:本地集群的jwks,获取方法请参见获取本地集群私钥签发的jwks。 身份转换规则 身份映射规则是将工作负载的 ServiceAccount 和 IAM 用户组做映射。 例如:在集群default命名空间下创建一个名为 XXX 的 ServiceAccount,映射到 demo 用户组(后续使用身份提供商 ID 访问云服务就具有 demo 用户组的权限)。 值的格式为:system:serviceaccount:Namespace:ServiceAccountName 单击“确定”。
-
方案流程 使用工作负载Identity的流程如图1 使用工作负载Identity流程,具体流程如下: 前置授权。 在UCS获取本地集群私钥签发的jwks,该公钥用于验证集群签发的ServiceAccount Token。 在 IAM 配置身份供应商,标志当前集群在IAM侧的身份。 为身份提供商配置集群签发的公钥,后续负载使用Token发送请求时,IAM使用该公钥验证Token。 添加 ServiceAccount 与 IAM 账号的映射规则,配置后,当前 ServiceAccount 拥有对应用户的 IAM 权限。 工作负载配置Token。 部署应用并配置ServiceAccount。 挂载对应ServiceAccount的Token。 验证获取的Token能否正常进行访问。 访问IAM接口获取IAM Token。 使用IAMToken 访问云服务。 图1 使用工作负载Identity流程
-
获取本地集群私钥签发的jwks 使用kubectl连接本地集群。 执行如下命令获取公钥。 kubectl get --raw /openid/v1/jwks 返回结果为一个 json 字符串,是当前集群的签名公钥,用于访问身份提供商。 { "keys": [ { "kty": "RSA", "e": "AQAB", "use": "sig", "kid": "Ew29q....", "alg": "RS256", "n": "peJdm...." } ] }
-
VPC网段之间的网络连通 登录云容器引擎控制台,选择本端集群,进入集群详情页,单击左侧导航栏“节点管理”,进入节点详情页。 单击“节点名称”下的节点,在弹出的页面中单击右上角“远程登录”,选择VNC方式登录。 根据界面提示,输入账号和密码,成功进入Linux环境中。 在云容器引擎控制台中,选择对端集群,进入集群详情页,单击左侧导航栏“节点管理”,进入节点详情页。 在3中,使用Linux命令查看网络是否连通。对端集群节点IP为4中的节点IP。例如:ping 172.X.X.X。 在对端集群中执行相同的操作。
-
使用场景 服务网关是网格的流量入口,网格外部的客户端通过服务网关访问网格内的服务。目前默认是基于Kubernetes Gateway API模型实现网关能力,网格服务详情中的灰度发布策略只适用于东西向网格内部服务间;对于南北向入口网关的目标服务,如果需要配置灰度发布策略,可参考下文为入口网关的目标服务配置灰度发布策略。 东西向网格内部服务间灰度发布,使用的是Istio的VirtualService/DestinationRule模型,依赖DestinationRulesubsets 来定义服务的版本。 南北向入口网关的目标服务灰度发布,使用的是Kubernetes Gateway API的后端服务定义(backend service definitions),依赖定义多个service来定义服务的版本。
-
操作步骤 创建nginx-v1服务 进入CCE Console页面,单击在网格已添加的CCE集群名称进入集群详情页,单击“服务-服务”,选择对应命名空间,单击“创建服务”按钮。 参数填写说明: Service名称:自定义服务名称,例如nginx-v1。 访问类型:选择集群内访问。 选择器:单击“引用负载标签”,选择对应的工作负载,例如nginx。 端口配置:容器端口填写业务容器进程监听端口,例如80。服务端口填写通过service访问的端口,例如5566。 创建nginx-v2服务 参考步骤1创建nginx-v2服务。 创建基于流量比例的路由 进入华为云UCS控制台,依次单击“服务网格-要配置的网格名称-服务网关-网关路由-HTTP路由-YAML创建”。 使用以下内容,创建nginx-canary网关路由。 apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: nginx-canary # 网关路由名 namespace: whtest # 网关路由所在的命名空间 spec: parentRefs: - group: gateway.networking.k8s.io kind: Gateway name: gwtest1 # 网关名 namespace: whtest # 网关所在的命名空间 rules: - backendRefs: - group: '' kind: Service name: nginx-v1 # nginx-v1服务的服务名 port: 5566 # nginx-v1服务的服务端口 weight: 30 # nginx-v1服务的流量比例 - group: '' kind: Service name: nginx-v2 # nginx-v2的服务名 port: 5566 # nginx-v2服务的端口 weight: 70 # nginx-v2服务的流量比例 matches: - path: type: PathPrefix value: / 该配置表示路由规则引用whtest命名空间下名为gwtest1的Gateway资源。因为未指定监听器名称,此处会尝试引用该Gateway的所有监听器。对于路径前缀为/的请求,将30%流量路由到同命名空间下的nginx-v1服务的5566端口,将70%流量路由到同命名空间下的nginx-v2服务的5566端口。 验证基于流量比例的路由生效 等待几秒钟待新规则配置下发成功,通过网关访问目标服务nginx应用,查看路由规则是否生效。 查看方法如下: 在浏览器中输入地址 http://$GATEWAY_ELB_IP:$GATEWAY_PORT/ ,其中, $GATEWAY_ELB_IP 是路由引用的whtest命名空间下名为gwtest1的网关的负载均衡公网地址; $GATEWAY_PORT是gwtest1网关的监听器对外端口。 预期结果: 反复多次刷新浏览器,约有70%的时间可以看到v2版本的nginx服务内容。
-
操作步骤 通过使用kubectl连接网格控制面获取kubeconofig的证书内容。 登录云容器引擎控制面,单击选择任意集群,进入详情页。 建议选择网格对应的VPC下的集群。若连接其他VPC下的集群,则需要参考UCS服务网格 集群连通方法打通集群所在VPC和网格对应VPC。 在左侧导航栏,单击“配置与密钥”,单击“密钥”页签,显示集群的密钥信息。 选择“命名空间”为“asm-system”,单击右上角“创建密钥”。 设置密钥参数,单击右下角“创建密钥”,完成密钥创建。 名称:自定义名称。例如:kubeconfig。 创建的密钥的名称不要使用mesh-kubeconfig,因为apiserver也会自动创建这个名字的密钥,如果使用了这个名称可能会被覆盖。 描述:(可选)。 密钥类型:选择“其他”,填写密钥类型为“cfe/secure-opaque”。 密钥数据:添加密钥数据,键为“kubeconfig”,值为1中获取到的kubeconfig证书内容。 单击左侧导航栏“插件与模板”,在“可安装插件”页签中找到“asm-service-controller”插件,单击“安装”。 填写配置参数,单击右下角“安装”,完成插件安装。 meshKubeconfigSecret:为步骤5中创建的密钥名称。 source:目前包含“nacos”,代表对接的第三方注册中心nacos的相关信息,其中包含4个参数。 name:为该注册中心名称。 addr:为nacos的ip及端口。 allnamespaces:为是否需要同步nacos全部命名空间中的服务,当allnamespaces为false时,需要填充namespaces,表示需要同步的nacos的命名空间。 namespaces:表示需要同步的nacos的命名空间。 若插件运行的集群为CCE turbo类型集群,在安装插件完成后,需要参考为Pod配置EIP为asm-system命名空间下,名为asm-service-controller的pod绑定eip,才能正常使用该插件功能。
-
支持管理的资源 您购买的非华为云或者云下服务器,只要与华为云 云堡垒机 网络互通并且协议互相支持,就可以通过云 堡垒机 纳管相应服务器。 支持的主机类型 支持SSH、RDP、VNC、TELNET、FTP、SFTP、SCP、Rlogin协议类型的Windows或Linux主机。 支持的数据库类别 关系型数据库(Relational Database Service,RDS)。 弹性云服务器(Elastic Cloud Server ,ECS)的自建数据库。 支持的数据库类型及版本 表2 支持的数据库引擎及版本 数据库引擎 引擎版本 MySQL 5.5,5.6,5.7,8.0 Microsoft SQL Server 2014、2016、2017、2019、2022 Oracle 10g、11g、12c、19c、21c DB2 DB2 Express-C PostgreSQL 11、12、13、14、15 GaussDB 2、3 支持应用管理的服务器类型及版本 仅支持对Windows服务器和Linux上的应用进行管理 ,且支持的服务器系统版本如表3。 表3 支持的应用服务器类型及版本 系统类型 系统版本 Windows Windows Server 2008 R2及以上版本 Linux CentOS7.9 目前仅X86版本云堡垒机支持应用运维,Arm版本云堡垒机不支持应用运维。
-
支持使用的第三方客户端 云堡垒机需通过第三方客户端登录CBH系统,以及调用第三方客户端,实现安全运维管理。 表4 登录CBH支持的客户端及版本 登录方式 支持使用的客户端 版本 Web浏览器登录 Edge 44及以上版本 说明: Edge浏览器上传大文件限制:文件上传到主机,支持单个文件最大4G。 Chrome 52.0及以上版本 Safari 10及以上版本 Firefox 50.0及以上版本 SSH客户端登录 SecureCRT 8.0及以上版本 Xshell 5及以上版本 Mac Terminal 2.0及以上版本 表5 运维过程支持调用的客户端 运维方式 资源协议类型/应用类型 支持调用的客户端 数据库运维 (主机运维方式) MySQL Navicat 11、12、15、16 MySQL Administrator 1.2.17 MySQL CMD DBeaver22、23 SQL Server Navicat 11、12、15、16 S SMS 17 Oracle Toad for Oracle 11.0、12.1、12.8、13.2 Navicat 11、12、15、16 PL/SQL Developer 11.0.5.1790 DBeaver22、23 DB2 DB2 CMD命令行 11.1.0 文件传输运维 SFTP Xftp、WinSCP、FlashFXP FTP Xftp、WinSCP、FlashFXP、FileZilla 应用发布运维 MySQL Tool MySQL Administrator Oracle Tool PL/SQL Developer SQL Server Tool SSMS dbisql dbisql Chrome Chrome Edge Edge Firefox Firefox VNC Client VNC Viewer SecBrowser SecBrowser VSphere Client VSphere Client Radmin Radmin
-
网络访问限制 不支持跨区域(Region)直接使用。 云堡垒机实例与系统资源(系统内管理的弹性云服务器、云数据库等)必须在同一区域内。 虽跨区域跨VPC可通过云连接(Cloud Connect,CC)、虚拟专用网(Virtual Private Network,VPN)等构建跨区域网络,但受限于网络的不稳定性,不建议跨区域使用云堡垒机纳管资源。 不支持跨VPC直接使用。 云堡垒机实例与系统资源必须在同一个VPC的子网内,才能直接连接访问。 跨VPC情况下,可通过对等连接打通两个VPC之间网络。 云堡垒机实例与系统资源的安全组,必须允许相互访问。 系统资源必须处于实例所属安全组允许访问的范围内,且资源所属安全组必须允许实例私有IP访问。 如果实例与系统资源处于不同的安全组,系统默认不能访问。需要在实例的安全组添加“入”的访问规则。 实例的安全组默认端口有443和2222,默认支持Web浏览器和SSH客户端访问。若需其他访问方式,需用户手动添加目标端口。 只允许通过IP地址和端口访问CBH系统。 表1 入/出方向规则配置参考 场景描述 方向 协议/应用 端口 通过Web浏览器登录堡垒机(HTTP、HTTPS) 入方向 TCP 80、443、8080 通过MSTSC客户端登录堡垒机 入方向 TCP 53389 通过SSH客户端登录堡垒机 入方向 TCP 2222 通过FTP客户端登录堡垒机 入方向 TCP 2121、20000-21000 通过SFTP客户端登录堡垒机 入方向 TCP 2222 通过堡垒机的SSH协议远程访问Linux云服务器 出方向 TCP 22 通过堡垒机的RDP协议远程访问Windows云服务器 出方向 TCP 3389 通过堡垒机访问Oracle数据库 入方向 TCP 1521 通过堡垒机访问Oracle数据库 出方向 TCP 1521 通过堡垒机访问MySQL数据库 入方向 TCP 33306 通过堡垒机访问MySQL数据库 出方向 TCP 3306 通过堡垒机访问SQL Server数据库 入方向 TCP 1433 通过堡垒机访问SQL Server数据库 出方向 TCP 1433 通过堡垒机访问DB数据库 入方向 TCP 50000 通过堡垒机访问DB数据库 出方向 TCP 50000 通过堡垒机访问 GaussDB数据库 入方向 TCP 18000 通过堡垒机访问GaussDB数据库 出方向 TCP 8000,18000 License注册许可服务器 出方向 TCP 9443 华为云服务 出方向 TCP 443 同一安全组内通过SSH客户端登录堡垒机 出方向 TCP 2222 短信服务 出方向 TCP 10743、443 DNS域名解析 出方向 UDP 53 通过堡垒机访问PGSQL数据库 入方向 TCP 15432 通过堡垒机访问PGSQL数据库 出方向 TCP 5432 通过堡垒机访问DM数据库 入方向 TCP 15236 通过堡垒机访问DM数据库 出方向 TCP 5236
-
设置检查目录 支持检查代码仓指定目录。 不配置检查目录时,检查代码仓中所有目录下的代码文件。 配置检查目录时,只检查配置目录中的文件。 支持配置多个检查目录,多个目录需要用英文逗号分隔。例如: 如果要检查dir1和dir2,检查目录配置为“dir1,dir2”。 如果要检查dir1目录下的dir3,检查目录配置为“dir1/dir3”。 配置项为目录且不支持文件,默认检查代码仓中所有代码。 配置的目录层级中不能包含“.”开头的目录。 如果检查目录输入框路径为空,则默认全部检查。如果有指定检查目录,则只检查检查目录中的文件,如果指定的检查目录中有勾选设置忽略文件,则被忽略的文件不参与检查。 检查目录只生效于不需要编译的文件。例如,A文件编译后产生了B文件,则不会输出B文件上的告警。
-
设置忽略的文件集合 代码检查服务支持用户以任务为单元,设置代码检查的文件范围。 不勾选文件路径时,则检查所选仓库分支的所有代码。 勾选指定文件路径时,则该指定路径下的文件将排除检查。 在“忽略的文件集合”区域,勾选无需进行检查的文件路径。设置完成后,执行代码检查任务,将按照设置排除选中的文件路径执行检查。 勾选的忽略文件对需要编译的文件和不需要编译的文件均生效。 不需要编译的文件:勾选忽略文件后,被忽略的文件不参与检查。 需要编译的文件:例如A文件与B文件互为依赖,即使把A文件忽略,但A文件依然会参与检查前的编译过程,编译完成后不参与检查。
-
操作指引 您可以使用下述方式创建函数并部署代码。 函数工作流 控制台:基于界面化的操作快速创建出简易可执行的函数,适用于构建轻量级应用及快速验证等场景。具体操作步骤请参见使用空白模板创建并执行函数。 VSCode:基于华为云函数工作流VSCode插件,您可以在本地代码编辑器便捷地创建、执行函数,适用于小型团队、个人开发者等。具体操作步骤请参见VSCode本地调试。 Serverless Devs:基于开源CLI工具使用Yaml配置文件便捷管理多个函数,适用于拥有较多函数的复杂项目或自动化部署等场景。具体操作步骤请参见Serverless Devs使用。 Serverless Framework:基于V3版本的Serverless Framework使用Yaml配置文件维护函数的全生命周期,适用于有该工具使用基础的用户。具体操作步骤请参见Serverless Framework快速入口。
共100000条
- 1
- ...
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 633
- 634
- 635
- 636
- 637
- 638
- 639
- 640
- 641
- 642
- 643
- 644
- 645
- 646
- 647
- 648
- 649
- 650
- 651
- 652
- 653
- 654
- 655
- 656
- 657
- 658
- 659
- 660
- 661
- 662
- 663
- 664
- 665
- 666
- 667
- 668
- 669
- 670
- 671
- 672
- 673
- 674
- 675
- 676
- 677
- 678
- 679
- 680
- 681
- 682
- 683
- 684
- 685
- 686
- 687
- 688
- 689
- 690
- 691
- 692
- 693
- 694
- 695
- 696
- 697
- 698
- 699
- 700
- 701
- 702
- 703
- 704
- 705
- 706
- 707
- 708
- 709
- 710
- 711
- 712
- 713
- 714
- 715
- 716
- 717
- 718
- 719
- 720
- 721
- 722
- 723
- 724
- 725
- 726
- 727
- 728
- 729
- 730
- 731
- 732
- 733
- 734
- 735
- 736
- 737
- 738
- 739
- 740
- 741
- 742
- 743
- 744
- 745
- 746
- 747
- 748
- 749
- 750
- 751
- 752
- 753
- 754
- 755
- 756
- 757
- 758
- 759
- 760
- 761
- 762
- 763
- 764
- 765
- 766
- 767
- 768
- 769
- 770
- 771
- 772
- 773
- 774
- 775
- 776
- 777
- 778
- 779
- 780
- 781
- 782
- 783
- 784
- 785
- 786
- 787
- 788
- 789
- 790
- 791
- 792
- 793
- 794
- 795
- 796
- 797
- 798
- 799
- 800
- 801
- 802
- 803
- 804
- 805
- 806
- 807
- 808
- 809
- 810
- 811
- 812
- 813
- 814
- 815
- 816
- 817
- 818
- 819
- 820
- 821
- 822
- 823
- 824
- 825
- 826
- 827
- 828
- 829
- 830
- 831
- 832
- 833
- 834
- 835
- 836
- 837
- 838
- 839
- 840
- 841
- 842
- 843
- 844
- 845
- 846
- 847
- 848
- 849
- 850
- 851
- 852
- 853
- 854
- 855
- 856
- 857
- 858
- 859
- 860
- 861
- 862
- 863
- 864
- 865
- 866
- 867
- 868
- 869
- 870
- 871
- 872
- 873
- 874
- 875
- 876
- 877
- 878
- 879
- 880
- 881
- 882
- 883
- 884
- 885
- 886
- 887
- 888
- 889
- 890
- 891
- 892
- 893
- 894
- 895
- 896
- 897
- 898
- 899
- 900
- 901
- 902
- 903
- 904
- 905
- 906
- 907
- 908
- 909
- 910
- 911
- 912
- 913
- 914
- 915
- 916
- 917
- 918
- 919
- 920
- 921
- 922
- 923
- 924
- 925
- 926
- 927
- 928
- 929
- 930
- 931
- 932
- 933
- 934
- 935
- 936
- 937
- 938
- 939
- 940
- 941
- 942
- 943
- 944
- 945
- 946
- 947
- 948
- 949
- 950
- 951
- 952
- 953
- 954
- 955
- 956
- 957
- 958
- 959
- 960
- 961
- 962
- 963
- 964
- 965
- 966
- 967
- 968
- 969
- 970
- 971
- 972
- 973
- 974
- 975
- 976
- 977
- 978
- 979
- 980
- 981
- 982
- 983
- 984
- 985
- 986
- 987
- 988
- 989
- 990
- 991
- 992
- 993
- 994
- 995
- 996
- 997
- 998
- 999
- 1000
- 1001
- 1002
- 1003
- 1004
- 1005
- 1006
- 1007
- 1008
- 1009
- 1010
- 1011
- 1012
- 1013
- 1014
- 1015
- 1016
- 1017
- 1018
- 1019
- 1020
- 1021
- 1022
- 1023
- 1024
- 1025
- 1026
- 1027
- 1028
- 1029
- 1030
- 1031
- 1032
- 1033
- 1034
- 1035
- 1036
- 1037
- 1038
- 1039
- 1040
- 1041
- 1042
- 1043
- 1044
- 1045
- 1046
- 1047
- 1048
- 1049
- 1050
- 1051
- 1052
- 1053
- 1054
- 1055
- 1056
- 1057
- 1058
- 1059
- 1060
- 1061
- 1062
- 1063
- 1064
- 1065
- 1066
- 1067
- 1068
- 1069
- 1070
- 1071
- 1072
- 1073
- 1074
- 1075
- 1076
- 1077
- 1078
- 1079
- 1080
- 1081
- 1082
- 1083
- 1084
- 1085
- 1086
- 1087
- 1088
- 1089
- 1090
- 1091
- 1092
- 1093
- 1094
- 1095
- 1096
- 1097
- 1098
- 1099
- 1100
- 1101
- 1102
- 1103
- 1104
- 1105
- 1106
- 1107
- 1108
- 1109
- 1110
- 1111
- 1112
- 1113
- 1114
- 1115
- 1116
- 1117
- 1118
- 1119
- 1120
- 1121
- 1122
- 1123
- 1124
- 1125
- 1126
- 1127
- 1128
- 1129
- 1130
- 1131
- 1132
- 1133
- 1134
- 1135
- 1136
- 1137
- 1138
- 1139
- 1140
- 1141
- 1142
- 1143
- 1144
- 1145
- 1146
- 1147
- 1148
- 1149
- 1150
- 1151
- 1152
- 1153
- 1154
- 1155
- 1156
- 1157
- 1158
- 1159
- 1160
- 1161
- 1162
- 1163
- 1164
- 1165
- 1166
- 1167
- 1168
- 1169
- 1170
- 1171
- 1172
- 1173
- 1174
- 1175
- 1176
- 1177
- 1178
- 1179
- 1180
- 1181
- 1182
- 1183
- 1184
- 1185
- 1186
- 1187
- 1188
- 1189
- 1190
- 1191
- 1192
- 1193
- 1194
- 1195
- 1196
- 1197
- 1198
- 1199
- 1200
- 1201
- 1202
- 1203
- 1204
- 1205
- 1206
- 1207
- 1208
- 1209
- 1210
- 1211
- 1212
- 1213
- 1214
- 1215
- 1216
- 1217
- 1218
- 1219
- 1220
- 1221
- 1222
- 1223
- 1224
- 1225
- 1226
- 1227
- 1228
- 1229
- 1230
- 1231
- 1232
- 1233
- 1234
- 1235
- 1236
- 1237
- 1238
- 1239
- 1240
- 1241
- 1242
- 1243
- 1244
- 1245
- 1246
- 1247
- 1248
- 1249
- 1250
- 1251
- 1252
- 1253
- 1254
- 1255
- 1256
- 1257
- 1258
- 1259
- 1260
- 1261
- 1262
- 1263
- 1264
- 1265
- 1266
- 1267
- 1268
- 1269
- 1270
- 1271
- 1272
- 1273
- 1274
- 1275
- 1276
- 1277
- 1278
- 1279
- 1280
- 1281
- 1282
- 1283
- 1284
- 1285
- 1286
- 1287
- 1288
- 1289
- 1290
- 1291
- 1292
- 1293
- 1294
- 1295
- 1296
- 1297
- 1298
- 1299
- 1300
- 1301
- 1302
- 1303
- 1304
- 1305
- 1306
- 1307
- 1308
- 1309
- 1310
- 1311
- 1312
- 1313
- 1314
- 1315
- 1316
- 1317
- 1318
- 1319
- 1320
- 1321
- 1322
- 1323
- 1324
- 1325
- 1326
- 1327
- 1328
- 1329
- 1330
- 1331
- 1332
- 1333
- 1334
- 1335
- 1336
- 1337
- 1338
- 1339
- 1340
- 1341
- 1342
- 1343
- 1344
- 1345
- 1346
- 1347
- 1348
- 1349
- 1350
- 1351
- 1352
- 1353
- 1354
- 1355
- 1356
- 1357
- 1358
- 1359
- 1360
- 1361
- 1362
- 1363
- 1364
- 1365
- 1366
- 1367
- 1368
- 1369
- 1370
- 1371
- 1372
- 1373
- 1374
- 1375
- 1376
- 1377
- 1378
- 1379
- 1380
- 1381
- 1382
- 1383
- 1384
- 1385
- 1386
- 1387
- 1388
- 1389
- 1390
- 1391
- 1392
- 1393
- 1394
- 1395
- 1396
- 1397
- 1398
- 1399
- 1400
- 1401
- 1402
- 1403
- 1404
- 1405
- 1406
- 1407
- 1408
- 1409
- 1410
- 1411
- 1412
- 1413
- 1414
- 1415
- 1416
- 1417
- 1418
- 1419
- 1420
- 1421
- 1422
- 1423
- 1424
- 1425
- 1426
- 1427
- 1428
- 1429
- 1430
- 1431
- 1432
- 1433
- 1434
- 1435
- 1436
- 1437
- 1438
- 1439
- 1440
- 1441
- 1442
- 1443
- 1444
- 1445
- 1446
- 1447
- 1448
- 1449
- 1450
- 1451
- 1452
- 1453
- 1454
- 1455
- 1456
- 1457
- 1458
- 1459
- 1460
- 1461
- 1462
- 1463
- 1464
- 1465
- 1466
- 1467
- 1468
- 1469
- 1470
- 1471
- 1472
- 1473
- 1474
- 1475
- 1476
- 1477
- 1478
- 1479
- 1480
- 1481
- 1482
- 1483
- 1484
- 1485
- 1486
- 1487
- 1488
- 1489
- 1490
- 1491
- 1492
- 1493
- 1494
- 1495
- 1496
- 1497
- 1498
- 1499
- 1500
- 1501
- 1502
- 1503
- 1504
- 1505
- 1506
- 1507
- 1508
- 1509
- 1510
- 1511
- 1512
- 1513
- 1514
- 1515
- 1516
- 1517
- 1518
- 1519
- 1520
- 1521
- 1522
- 1523
- 1524
- 1525
- 1526
- 1527
- 1528
- 1529
- 1530
- 1531
- 1532
- 1533
- 1534
- 1535
- 1536
- 1537
- 1538
- 1539
- 1540
- 1541
- 1542
- 1543
- 1544
- 1545
- 1546
- 1547
- 1548
- 1549
- 1550
- 1551
- 1552
- 1553
- 1554
- 1555
- 1556
- 1557
- 1558
- 1559
- 1560
- 1561
- 1562
- 1563
- 1564
- 1565
- 1566
- 1567
- 1568
- 1569
- 1570
- 1571
- 1572
- 1573
- 1574
- 1575
- 1576
- 1577
- 1578
- 1579
- 1580
- 1581
- 1582
- 1583
- 1584
- 1585
- 1586
- 1587
- 1588
- 1589
- 1590
- 1591
- 1592
- 1593
- 1594
- 1595
- 1596
- 1597
- 1598
- 1599
- 1600
- 1601
- 1602
- 1603
- 1604
- 1605
- 1606
- 1607
- 1608
- 1609
- 1610
- 1611
- 1612
- 1613
- 1614
- 1615
- 1616
- 1617
- 1618
- 1619
- 1620
- 1621
- 1622
- 1623
- 1624
- 1625
- 1626
- 1627
- 1628
- 1629
- 1630
- 1631
- 1632
- 1633
- 1634
- 1635
- 1636
- 1637
- 1638
- 1639
- 1640
- 1641
- 1642
- 1643
- 1644
- 1645
- 1646
- 1647
- 1648
- 1649
- 1650
- 1651
- 1652
- 1653
- 1654
- 1655
- 1656
- 1657
- 1658
- 1659
- 1660
- 1661
- 1662
- 1663
- 1664
- 1665
- 1666
- 1667
- 1668
- 1669
- 1670
- 1671
- 1672
- 1673
- 1674
- 1675
- 1676
- 1677
- 1678
- 1679
- 1680
- 1681
- 1682
- 1683
- 1684
- 1685
- 1686
- 1687
- 1688
- 1689
- 1690
- 1691
- 1692
- 1693
- 1694
- 1695
- 1696
- 1697
- 1698
- 1699
- 1700
- 1701
- 1702
- 1703
- 1704
- 1705
- 1706
- 1707
- 1708
- 1709
- 1710
- 1711
- 1712
- 1713
- 1714
- 1715
- 1716
- 1717
- 1718
- 1719
- 1720
- ...
- 1721
- 1722
- 1723
- 1724
- 1725
- 1726
- 1727
- 1728
- 1729
- 1730
- 1731
- 1732
- 1733
- 1734
- 1735
- 1736
- 1737
- 1738
- 1739
- 1740
- 1741
- 1742
- 1743
- 1744
- 1745
- 1746
- 1747
- 1748
- 1749
- 1750
- 1751
- 1752
- 1753
- 1754
- 1755
- 1756
- 1757
- 1758
- 1759
- 1760
- 1761
- 1762
- 1763
- 1764
- 1765
- 1766
- 1767
- 1768
- 1769
- 1770
- 1771
- 1772
- 1773
- 1774
- 1775
- 1776
- 1777
- 1778
- 1779
- 1780
- 1781
- 1782
- 1783
- 1784
- 1785
- 1786
- 1787
- 1788
- 1789
- 1790
- 1791
- 1792
- 1793
- 1794
- 1795
- 1796
- 1797
- 1798
- 1799
- 1800
- 1801
- 1802
- 1803
- 1804
- 1805
- 1806
- 1807
- 1808
- 1809
- 1810
- 1811
- 1812
- 1813
- 1814
- 1815
- 1816
- 1817
- 1818
- 1819
- 1820
- 1821
- 1822
- 1823
- 1824
- 1825
- 1826
- 1827
- 1828
- 1829
- 1830
- 1831
- 1832
- 1833
- 1834
- 1835
- 1836
- 1837
- 1838
- 1839
- 1840
- 1841
- 1842
- 1843
- 1844
- 1845
- 1846
- 1847
- 1848
- 1849
- 1850
- 1851
- 1852
- 1853
- 1854
- 1855
- 1856
- 1857
- 1858
- 1859
- 1860
- 1861
- 1862
- 1863
- 1864
- 1865
- 1866
- 1867
- 1868
- 1869
- 1870
- 1871
- 1872
- 1873
- 1874
- 1875
- 1876
- 1877
- 1878
- 1879
- 1880
- 1881
- 1882
- 1883
- 1884
- 1885
- 1886
- 1887
- 1888
- 1889
- 1890
- 1891
- 1892
- 1893
- 1894
- 1895
- 1896
- 1897
- 1898
- 1899
- 1900
- 1901
- 1902
- 1903
- 1904
- 1905
- 1906
- 1907
- 1908
- 1909
- 1910
- 1911
- 1912
- 1913
- 1914
- 1915
- 1916
- 1917
- 1918
- 1919
- 1920
- 1921
- 1922
- 1923
- 1924
- 1925
- 1926
- 1927
- 1928
- 1929
- 1930
- 1931
- 1932
- 1933
- 1934
- 1935
- 1936
- 1937
- 1938
- 1939
- 1940
- 1941
- 1942
- 1943
- 1944
- 1945
- 1946
- 1947
- 1948
- 1949
- 1950
- 1951
- 1952
- 1953
- 1954
- 1955
- 1956
- 1957
- 1958
- 1959
- 1960
- 1961
- 1962
- 1963
- 1964
- 1965
- 1966
- 1967
- 1968
- 1969
- 1970
- 1971
- 1972
- 1973
- 1974
- 1975
- 1976
- 1977
- 1978
- 1979
- 1980
- 1981
- 1982
- 1983
- 1984
- 1985
- 1986
- 1987
- 1988
- 1989
- 1990
- 1991
- 1992
- 1993
- 1994
- 1995
- 1996
- 1997
- 1998
- 1999
- 2000
- 2001
- 2002
- 2003
- 2004
- 2005
- 2006
- 2007
- 2008
- 2009
- 2010
- 2011
- 2012
- 2013
- 2014
- 2015
- 2016
- 2017
- 2018
- 2019
- 2020
- 2021
- 2022
- 2023
- 2024
- 2025
- 2026
- 2027
- 2028
- 2029
- 2030
- 2031
- 2032
- 2033
- 2034
- 2035
- 2036
- 2037
- 2038
- 2039
- 2040
- 2041
- 2042
- 2043
- 2044
- 2045
- 2046
- 2047
- 2048
- 2049
- 2050
- 2051
- 2052
- 2053
- 2054
- 2055
- 2056
- 2057
- 2058
- 2059
- 2060
- 2061
- 2062
- 2063
- 2064
- 2065
- 2066
- 2067
- 2068
- 2069
- 2070
- 2071
- 2072
- 2073
- 2074
- 2075
- 2076
- 2077
- 2078
- 2079
- 2080
- 2081
- 2082
- 2083
- 2084
- 2085
- 2086
- 2087
- 2088
- 2089
- 2090
- 2091
- 2092
- 2093
- 2094
- 2095
- 2096
- 2097
- 2098
- 2099
- 2100
- 2101
- 2102
- 2103
- 2104
- 2105
- 2106
- 2107
- 2108
- 2109
- 2110
- 2111
- 2112
- 2113
- 2114
- 2115
- 2116
- 2117
- 2118
- 2119
- 2120
- 2121
- 2122
- 2123
- 2124
- 2125
- 2126
- 2127
- 2128
- 2129
- 2130
- 2131
- 2132
- 2133
- 2134
- 2135
- 2136
- 2137
- 2138
- 2139
- 2140
- 2141
- 2142
- 2143
- 2144
- 2145
- 2146
- 2147
- 2148
- 2149
- 2150
- 2151
- 2152
- 2153
- 2154
- 2155
- 2156
- 2157
- 2158
- 2159
- 2160
- 2161
- 2162
- 2163
- 2164
- 2165
- 2166
- 2167
- 2168
- 2169
- 2170
- 2171
- 2172
- 2173
- 2174
- 2175
- 2176
- 2177
- 2178
- 2179
- 2180
- 2181
- 2182
- 2183
- 2184
- 2185
- 2186
- 2187
- 2188
- 2189
- 2190
- 2191
- 2192
- 2193
- 2194
- 2195
- 2196
- 2197
- 2198
- 2199
- 2200
- 2201
- 2202
- 2203
- 2204
- 2205
- 2206
- 2207
- 2208
- 2209
- 2210
- 2211
- 2212
- 2213
- 2214
- 2215
- 2216
- 2217
- 2218
- 2219
- 2220
- 2221
- 2222
- 2223
- 2224
- 2225
- 2226
- 2227
- 2228
- 2229
- 2230
- 2231
- 2232
- 2233
- 2234
- 2235
- 2236
- 2237
- 2238
- 2239
- 2240
- 2241
- 2242
- 2243
- 2244
- 2245
- 2246
- 2247
- 2248
- 2249
- 2250
- 2251
- 2252
- 2253
- 2254
- 2255
- 2256
- 2257
- 2258
- 2259
- 2260
- 2261
- 2262
- 2263
- 2264
- 2265
- 2266
- 2267
- 2268
- 2269
- 2270
- 2271
- 2272
- 2273
- 2274
- 2275
- 2276
- 2277
- 2278
- 2279
- 2280
- 2281
- 2282
- 2283
- 2284
- 2285
- 2286
- 2287
- 2288
- 2289
- 2290
- 2291
- 2292
- 2293
- 2294
- 2295
- 2296
- 2297
- 2298
- 2299
- 2300
- 2301
- 2302
- 2303
- 2304
- 2305
- 2306
- 2307
- 2308
- 2309
- 2310
- 2311
- 2312
- 2313
- 2314
- 2315
- 2316
- 2317
- 2318
- 2319
- 2320
- 2321
- 2322
- 2323
- 2324
- 2325
- 2326
- 2327
- 2328
- 2329
- 2330
- 2331
- 2332
- 2333
- 2334
- 2335
- 2336
- 2337
- 2338
- 2339
- 2340
- 2341
- 2342
- 2343
- 2344
- 2345
- 2346
- 2347
- 2348
- 2349
- 2350
- 2351
- 2352
- 2353
- 2354
- 2355
- 2356
- 2357
- 2358
- 2359
- 2360
- 2361
- 2362
- 2363
- 2364
- 2365
- 2366
- 2367
- 2368
- 2369
- 2370
- 2371
- 2372
- 2373
- 2374
- 2375
- 2376
- 2377
- 2378
- 2379
- 2380
- 2381
- 2382
- 2383
- 2384
- 2385
- 2386
- 2387
- 2388
- 2389
- 2390
- 2391
- 2392
- 2393
- 2394
- 2395
- 2396
- 2397
- 2398
- 2399
- 2400
- 2401
- 2402
- 2403
- 2404
- 2405
- 2406
- 2407
- 2408
- 2409
- 2410
- 2411
- 2412
- 2413
- 2414
- 2415
- 2416
- 2417
- 2418
- 2419
- 2420
- 2421
- 2422
- 2423
- 2424
- 2425
- 2426
- 2427
- 2428
- 2429
- 2430
- 2431
- 2432
- 2433
- 2434
- 2435
- 2436
- 2437
- 2438
- 2439
- 2440
- 2441
- 2442
- 2443
- 2444
- 2445
- 2446
- 2447
- 2448
- 2449
- 2450
- 2451
- 2452
- 2453
- 2454
- 2455
- 2456
- 2457
- 2458
- 2459
- 2460
- 2461
- 2462
- 2463
- 2464
- 2465
- 2466
- 2467
- 2468
- 2469
- 2470
- 2471
- 2472
- 2473
- 2474
- 2475
- 2476
- 2477
- 2478
- 2479
- 2480
- 2481
- 2482
- 2483
- 2484
- 2485
- 2486
- 2487
- 2488
- 2489
- 2490
- 2491
- 2492
- 2493
- 2494
- 2495
- 2496
- 2497
- 2498
- 2499
- 2500
- 2501
- 2502
- 2503
- 2504
- 2505
- 2506
- 2507
- 2508
- 2509
- 2510
- 2511
- 2512
- 2513
- 2514
- 2515
- 2516
- 2517
- 2518
- 2519
- 2520
- 2521
- 2522
- 2523
- 2524
- 2525
- 2526
- 2527
- 2528
- 2529
- 2530
- 2531
- 2532
- 2533
- 2534
- 2535
- 2536
- 2537
- 2538
- 2539
- 2540
- 2541
- 2542
- 2543
- 2544
- 2545
- 2546
- 2547
- 2548
- 2549
- 2550
- 2551
- 2552
- 2553
- 2554
- 2555
- 2556
- 2557
- 2558
- 2559
- 2560
- 2561
- 2562
- 2563
- 2564
- 2565
- 2566
- 2567
- 2568
- 2569
- 2570
- 2571
- 2572
- 2573
- 2574
- 2575
- 2576
- 2577
- 2578
- 2579
- 2580
- 2581
- 2582
- 2583
- 2584
- 2585
- 2586
- 2587
- 2588
- 2589
- 2590
- 2591
- 2592
- 2593
- 2594
- 2595
- 2596
- 2597
- 2598
- 2599
- 2600
- 2601
- 2602
- 2603
- 2604
- 2605
- 2606
- 2607
- 2608
- 2609
- 2610
- 2611
- 2612
- 2613
- 2614
- 2615
- 2616
- 2617
- 2618
- 2619
- 2620
- 2621
- 2622
- 2623
- 2624
- 2625
- 2626
- 2627
- 2628
- 2629
- 2630
- 2631
- 2632
- 2633
- 2634
- 2635
- 2636
- 2637
- 2638
- 2639
- 2640
- 2641
- 2642
- 2643
- 2644
- 2645
- 2646
- 2647
- 2648
- 2649
- 2650
- 2651
- 2652
- 2653
- 2654
- 2655
- 2656
- 2657
- 2658
- 2659
- 2660
- 2661
- 2662
- 2663
- 2664
- 2665
- 2666
- 2667
- 2668
- 2669
- 2670
- 2671
- 2672
- 2673
- 2674
- 2675
- 2676
- 2677
- 2678
- 2679
- 2680
- 2681
- 2682
- 2683
- 2684
- 2685
- 2686
- 2687
- 2688
- 2689
- 2690
- 2691
- 2692
- 2693
- 2694
- 2695
- 2696
- 2697
- 2698
- 2699
- 2700
- 2701
- 2702
- 2703
- 2704
- 2705
- 2706
- 2707
- 2708
- 2709
- 2710
- 2711
- 2712
- 2713
- 2714
- 2715
- 2716
- 2717
- 2718
- 2719
- 2720
- 2721
- 2722
- 2723
- 2724
- 2725
- 2726
- 2727
- 2728
- 2729
- 2730
- 2731
- 2732
- 2733
- 2734
- 2735
- 2736
- 2737
- 2738
- 2739
- 2740
- 2741
- 2742
- 2743
- 2744
- 2745
- 2746
- 2747
- 2748
- 2749
- 2750
- 2751
- 2752
- 2753
- 2754
- 2755
- 2756
- 2757
- 2758
- 2759
- 2760
- 2761
- 2762
- 2763
- 2764
- 2765
- 2766
- 2767
- 2768
- 2769
- 2770
- 2771
- 2772
- 2773
- 2774
- 2775
- 2776
- 2777
- 2778
- 2779
- 2780
- 2781
- 2782
- 2783
- 2784
- 2785
- 2786
- 2787
- 2788
- 2789
- 2790
- 2791
- 2792
- 2793
- 2794
- 2795
- 2796
- 2797
- 2798
- 2799
- 2800
- 2801
- 2802
- 2803
- 2804
- 2805
- 2806
- 2807
- 2808
- 2809
- 2810
- 2811
- 2812
- 2813
- 2814
- 2815
- 2816
- 2817
- 2818
- 2819
- 2820
- 2821
- 2822
- 2823
- 2824
- 2825
- 2826
- 2827
- 2828
- 2829
- 2830
- 2831
- 2832
- 2833
- 2834
- 2835
- 2836
- 2837
- 2838
- 2839
- 2840
- 2841
- 2842
- 2843
- 2844
- 2845
- 2846
- 2847
- 2848
- 2849
- 2850
- 2851
- 2852
- 2853
- 2854
- 2855
- 2856
- 2857
- 2858
- 2859
- 2860
- 2861
- 2862
- 2863
- 2864
- 2865
- 2866
- 2867
- 2868
- 2869
- 2870
- 2871
- 2872
- 2873
- 2874
- 2875
- 2876
- 2877
- 2878
- 2879
- 2880
- 2881
- 2882
- 2883
- 2884
- 2885
- 2886
- 2887
- 2888
- 2889
- 2890
- 2891
- 2892
- 2893
- 2894
- 2895
- 2896
- 2897
- 2898
- 2899
- 2900
- 2901
- 2902
- 2903
- 2904
- 2905
- 2906
- 2907
- 2908
- 2909
- 2910
- 2911
- 2912
- 2913
- 2914
- 2915
- 2916
- 2917
- 2918
- 2919
- 2920
- 2921
- 2922
- 2923
- 2924
- 2925
- 2926
- 2927
- 2928
- 2929
- 2930
- 2931
- 2932
- 2933
- 2934
- 2935
- 2936
- 2937
- 2938
- 2939
- 2940
- 2941
- 2942
- 2943
- 2944
- 2945
- 2946
- 2947
- 2948
- 2949
- 2950
- 2951
- 2952
- 2953
- 2954
- 2955
- 2956
- 2957
- 2958
- 2959
- 2960
- 2961
- 2962
- 2963
- 2964
- 2965
- 2966
- 2967
- 2968
- 2969
- 2970
- 2971
- 2972
- 2973
- 2974
- 2975
- 2976
- 2977
- 2978
- 2979
- 2980
- 2981
- 2982
- 2983
- 2984
- 2985
- 2986
- 2987
- 2988
- 2989
- 2990
- 2991
- 2992
- 2993
- 2994
- 2995
- 2996
- 2997
- 2998
- 2999
- 3000
- 3001
- 3002
- 3003
- 3004
- 3005
- 3006
- 3007
- 3008
- 3009
- 3010
- 3011
- 3012
- 3013
- 3014
- 3015
- 3016
- 3017
- 3018
- 3019
- 3020
- 3021
- 3022
- 3023
- 3024
- 3025
- 3026
- 3027
- 3028
- 3029
- 3030
- 3031
- 3032
- 3033
- 3034
- 3035
- 3036
- 3037
- 3038
- 3039
- 3040
- 3041
- 3042
- 3043
- 3044
- 3045
- 3046
- 3047
- 3048
- 3049
- 3050
- 3051
- 3052
- 3053
- 3054
- 3055
- 3056
- 3057
- 3058
- 3059
- 3060
- 3061
- 3062
- 3063
- 3064
- 3065
- 3066
- 3067
- 3068
- 3069
- 3070
- 3071
- 3072
- 3073
- 3074
- 3075
- 3076
- 3077
- 3078
- 3079
- 3080
- 3081
- 3082
- 3083
- 3084
- 3085
- 3086
- 3087
- 3088
- 3089
- 3090
- 3091
- 3092
- 3093
- 3094
- 3095
- 3096
- 3097
- 3098
- 3099
- 3100
- 3101
- 3102
- 3103
- 3104
- 3105
- 3106
- 3107
- 3108
- 3109
- 3110
- 3111
- 3112
- 3113
- 3114
- 3115
- 3116
- 3117
- 3118
- 3119
- 3120
- 3121
- 3122
- 3123
- 3124
- 3125
- 3126
- 3127
- 3128
- 3129
- 3130
- 3131
- 3132
- 3133
- 3134
- 3135
- 3136
- 3137
- 3138
- 3139
- 3140
- 3141
- 3142
- 3143
- 3144
- 3145
- 3146
- 3147
- 3148
- 3149
- 3150
- 3151
- 3152
- 3153
- 3154
- 3155
- 3156
- 3157
- 3158
- 3159
- 3160
- 3161
- 3162
- 3163
- 3164
- 3165
- 3166
- 3167
- 3168
- 3169
- 3170
- 3171
- 3172
- 3173
- 3174
- 3175
- 3176
- 3177
- 3178
- 3179
- 3180
- 3181
- 3182
- 3183
- 3184
- 3185
- 3186
- 3187
- 3188
- 3189
- 3190
- 3191
- 3192
- 3193
- 3194
- 3195
- 3196
- 3197
- 3198
- 3199
- 3200
- 3201
- 3202
- 3203
- 3204
- 3205
- 3206
- 3207
- 3208
- 3209
- 3210
- 3211
- 3212
- 3213
- 3214
- 3215
- 3216
- 3217
- 3218
- 3219
- 3220
- 3221
- 3222
- 3223
- 3224
- 3225
- 3226
- 3227
- 3228
- 3229
- 3230
- 3231
- 3232
- 3233
- 3234
- 3235
- 3236
- 3237
- 3238
- 3239
- 3240
- 3241
- 3242
- 3243
- 3244
- 3245
- 3246
- 3247
- 3248
- 3249
- 3250
- 3251
- 3252
- 3253
- 3254
- 3255
- 3256
- 3257
- 3258
- 3259
- 3260
- 3261
- 3262
- 3263
- 3264
- 3265
- 3266
- 3267
- 3268
- 3269
- 3270
- 3271
- 3272
- 3273
- 3274
- 3275
- 3276
- 3277
- 3278
- 3279
- 3280
- 3281
- 3282
- 3283
- 3284
- 3285
- 3286
- 3287
- 3288
- 3289
- 3290
- 3291
- 3292
- 3293
- 3294
- 3295
- 3296
- 3297
- 3298
- 3299
- 3300
- 3301
- 3302
- 3303
- 3304
- 3305
- 3306
- 3307
- 3308
- 3309
- 3310
- 3311
- 3312
- 3313
- 3314
- 3315
- 3316
- 3317
- 3318
- 3319
- 3320
- 3321
- 3322
- 3323
- 3324
- 3325
- 3326
- 3327
- 3328
- 3329
- 3330
- 3331
- 3332
- 3333
- 3333