华为云用户手册

  • 策略实例示例 示例展示了ClusterRole和Role资源仅能关联到allowedRoles中定义的Role。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sDisallowAnonymousmetadata: name: no-anonymousspec: match: kinds: - apiGroups: ["rbac.authorization.k8s.io"] kinds: ["ClusterRoleBinding"] - apiGroups: ["rbac.authorization.k8s.io"] kinds: ["RoleBinding"] parameters: allowedRoles: - cluster-role-1
  • 不符合策略实例的资源定义 ClusterRole关联到cluster-role-2 Role中,不符合策略实例。 apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: cluster-role-binding-2roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-role-2subjects:- apiGroup: rbac.authorization.k8s.io kind: Group name: system:authenticated- apiGroup: rbac.authorization.k8s.io kind: Group name: system:unauthenticated
  • 不符合策略实例的资源定义 示例中allowPrivilegeEscalation的值不为false,不符合策略实例。 apiVersion: v1kind: Podmetadata: name: nginx-privilege-escalation-disallowed labels: app: nginx-privilege-escalationspec: containers: - name: nginx image: nginx securityContext: allowPrivilegeEscalation: true
  • 策略实例示例 以下策略实例展示了策略定义生效的资源类型。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sImageDigestsmetadata: name: container-image-must-have-digestspec: match: kinds: - apiGroups: [""] kinds: ["Pod"] namespaces: - "default"
  • Cilium underlay能力 在本地集群配置文件“cluster-[集群名称].yaml”中添加以下配置: CILIUM_NETWORK_MODE: underlay 例图: 模式优势: 此模式下,Cilium会将所有未发送到其他容器的数据包委托给Linux内核的路由子系统。这意味着数据包将被路由直接转发,就好像本地进程发出数据包一样,减少了数据包的封装和转换。因此,在大流量场景下,该模式存在一定性能优势。 该模式下自动配置ipv4-native-routing-cidr,Cilium会在Linux内核中自动启用IP转发。 模式依赖: 在underlay模式下,运行Cilium的主机的网络必须能够使用分配给Pod或其他工作负载的地址转发IP流量,需要关闭节点的源目的地址检查,并且节点安全组按需放通容器网段的端口及协议。 Cilium对接主机BGP 使用Cilium BGP Control Plane管理集群网络,具体使用方法请参见Cilium BGP Control Plane。
  • 策略中心概述 随着公司不断增加开发和生产集群的数量,确保在日益扩大的环境中创建和执行一致的配置和安全策略变得越来越具挑战性,这可能会阻碍运维效率。为了解决这个问题,U CS 推出了基于OPA(Open Policy Agent)的Gatekeeper实现的策略中心功能。这一功能可以帮助您在多个集群中定义和执行一致的策略,统一资源的合规性状态。 通过策略中心,您可以创建、管理和监控跨多个集群(容器舰队)的策略实施情况。这样,您可以确保所有集群都遵循相同的安全和合规要求,从而提高运维效率。这种集中式策略管理能力使您能够更容易地应对复杂的企业环境,同时确保所有资源在任何时候都处于合规状态。UCS策略中心将帮助您实现更高的运维效率和更强的安全性。 UCS策略中心的主要优势包括: 一致的策略管理 以集中、一致的方式将一组安全合规策略应用到多个容器舰队、集群中。 确保资源安全性 持续审计资源,以确保资源满足安全合规要求并且不出现违反策略的行为。 全局资源合规性视图 涵盖所有资源的全面合规性视图,大规模保护和管理集群资源。 父主题: 策略中心
  • 为什么需要Cilium Cilium是一种高性能、高可靠性的容器网络解决方案,它通过eBPF技术在Linux内核层面实现网络和安全通信。它支持多种传输层协议,例如TCP、UDP和HTTP,并提供了多种安全特性,例如应用层访问控制和服务网格支持。Cilium还支持Kubernetes网络策略,并提供了全局网络和服务发现功能,能够帮助管理员更好地管理和部署云原生应用和服务。 Cilium的eBPF 技术通过在Linux内核层面实时监控网络流量,实现了高效的安全数据包交换。该技术在网络功能虚拟化、容器网络和边缘计算等场景中都有广泛应用,能够帮助企业提升网络性能和安全性,为云原生应用提供更好的基础设施支持。 基本功能 为容器提供网络互通:Cilium通过为每个容器分配一个独特的IP地址来实现容器间的网络互通,同时支持多种网络协议。 具备网络安全检测能力:Cilium支持通过集成第三方的网络安全检测服务,如Snort等,来进行网络流量分析和检测。 自动进行 容器安全 策略管理:Cilium通过基于Kubernetes 的自定义资源定义(CRD)机制,为每个容器自动创建安全策略,保障容器的安全。 实现容器级别的负载均衡:Cilium支持实现容器级别的负载均衡,允许通过多种负载均衡算法来分配网络请求流量。 提供服务发现功能:Cilium支持借助基于Kubernetes的服务探测机制,自动发现容器内的服务,并将其注册到Kubernetes API中,以便于其他容器访问。
  • kspider工作原理 kspider工具的架构如图1所示,包含三个模块:采集模块、连接管理和分析模块。采集模块可以收集源集群的数据,包括命名空间、工作负载、节点、网络等;连接管理模块负责与源集群的API Server建立连接;分析模块分为聚合输出和评估推荐两部分,旨在输出源集群的采集数据(生成“cluster-*.json”文件)以及提供目标集群的推荐信息(生成“preferred-*.json”文件)。 图1 kspider架构
  • 步骤二:目标集群评估 在kspider执行完毕后,除了“cluster-*.json”文件之外,还会在当前目录下生成“preferred-*.json”文件。这个文件基于源集群的规模和节点规格进行初步评估,并提供关于目标集群版本和规模的推荐信息。这有助于您更好地规划和准备迁移过程。 “preferred-*.json”文件说明如下: { K8sVersion:Kubernetes版本,字符串类型 Scale:集群规模,字符串类型 Nodes:节点信息 CPU:CPU,字符串类型 Memory:内存,字符串类型 Arch:架构,字符串类型 KernelVersion:OS内核版本,字符串类型 ProxyMode:集群Proxy模式,字符串类型 ELB:是否依赖ELB,布尔型} 上述文件中每个字段的评估规则如下: 表1 评估规则 字段 评估规则 Kubernetes版本 如果是1.21以下版本,推荐UCS集群主要发行版本(例如1.21,随着时间发展会发生变化),大于主要发行版本时,将推荐UCS集群的最新版本。 集群规模 源集群节点数<25,推荐50节点规模 25≤源集群节点数<100,推荐200节点规模 100≤源集群节点数<500,推荐1000节点规模 源集群节点数≥500,推荐2000节点规模 CPU+内存 统计数量最多的那一种规格 架构 统计数量最多的那一种规格 OS内核版本 统计数量最多的那一种规格 集群Proxy模式 根据集群规模来设置,大于1000节点规模的集群,推荐使用ipvs,1000以内的推荐使用iptables。 是否依赖ELB 源集群是否有负载均衡类型的Service 示例: { "K8sVersion": "v1.21", "Scale": 50, "Nodes": { "CPU": "4", "Memory": "7622952Ki", "Arch": "amd64", "KernelVersion": "3.10.0-862.14.1.5.h520.eulerosv2r7.x86_64" }, "ELB": false, "ProxyMode": "iptables"} 评估结果仅供参考,最终选择什么版本、规模的目标集群还需要您综合判断。
  • kspider使用方法 kspider工具支持在Linux(x86、arm)和Windows环境中运行,使用方法相似。本文将以Linux(x86)环境为例进行介绍。 若使用Linux(arm)或Windows环境,请将下述命令中的kspider-linux-amd64分别替换为kspider-linux-arm64或kspider-windows-amd64.exe。 根据容器迁移准备工作章节的要求,准备一台服务器并上传kspider工具,然后进行解压缩。在kspider工具所在目录下执行./kspider-linux-amd64 -h,您可以查看该工具的使用方法。 -k, --kubeconfig:指定kubectl的KubeConfig位置,默认是$HOME/.kube/config。kubeConfig文件:用于配置对Kubernetes集群的访问,KubeConfig文件中包含访问注册Kubernetes集群所需要的认证凭据以及Endpoint(访问地址),详细介绍可参见Kubernetes文档。 -n, --namespaces:指定采集的命名空间,默认排除了kube-system、kube-public、kube-node-lease等系统命名空间。 -q, --quiet:静态退出。 -s, --serial:根据采集信息输出汇聚文件(cluster-{serial}.json)和推荐文件(preferred-{serial}.json)唯一标识的序号。 $ ./kspider-linux-amd64 -hA cluster information collection and recommendation tool implement by Go.Usage: kspider [flags]Aliases: kspider, kspiderFlags: -h, --help help for kspider -k, --kubeconfig string The kubeconfig of k8s cluster's. Default is the $HOME/.kube/config. (default "$HOME/.kube/config") -n, --namespaces string Specify a namespace for information collection. If multiple namespaces are specified, separate them with commas (,), such as ns1,ns2. default("") is all namespaces -q, --quiet command to execute silently -s, --serial string User-defined sequence number of the execution. The default value is the time when the kspider is started. (default "1673853404")
  • 步骤一:源集群数据采集 通过kubectl连接源集群。具体方法可参考使用kubectl连接集群。 使用默认参数配置,采集集群中所有命名空间的数据。执行方法:./kspider-linux-amd64 执行后的输出详细信息如下: [~]# ./kspider-linux-amd64The Cluster version is v1.15.6-r1-CCE2.0.30.B001There are 5 NamespacesThere are 2 NodesName CPU Memory IP Arch OS Kernel MachineID10.1.18.64 4 8008284Ki [10.1.18.64 10.1.18.64] amd64 linux 3.10.0-1127.19.1.el7.x86_64 ef9270ed-7eb3-4ce6-a2d8-f1450f85489a10.1.19.13 4 8008284Ki [10.1.19.13 10.1.19.13] amd64 linux 3.10.0-1127.19.1.el7.x86_64 2d889590-9a32-47e5-b947-09c5bda81849There are 9 PodsThere are 0 LonePods: There are 2 StatefulSets: Name Namespace NodeAffinityminio default falseminio minio falseThere are 3 Deployments: Name Namespace NodeAffinityrctest default trueflink-operator-controller-manager flink-operator-system falserctest minio falseThere are 1 DaemonSets: Name Namespace NodeAffinityds-nginx minio falseThere are 0 Jobs: There are 0 CronJobs: There are 4 PersistentVolumeClaims: Namespace/Name Podsdefault/pvc-data-minio-0 default/minio-0minio/obs-testing minio/ds-nginx-9hmds,minio/ds-nginx-4jsfgminio/pvc-data-minio-0 minio/minio-0There are 5 PersistentVolumes: Name Namespace pvcName scName size keypvc-bd36c70f-75bf-4000-b85c-f9fb169a14a8 minio-pv obs-testing csi-obs 1Gi pvc-bd36c70f-75bf-4000-b85c-f9fb169a14a8pvc-c7c768aa-373a-4c52-abea-e8b486d23b47 minio-pv pvc-data-minio-0 csi-disk-sata 10Gi 1bcf3d00-a524-45b1-a773-7efbca58f36apvc-4f52462b-3b4c-4191-a63b-5a36a8748c05 minio obs-testing csi-obs 1Gi pvc-4f52462b-3b4c-4191-a63b-5a36a8748c05pvc-9fd92c99-805a-4e65-9f22-e238130983c8 default pvc-data-minio-0 csi-disk 10Gi 590afd05-fc68-4c10-a598-877100ca7b3fpvc-a22fd877-f98d-4c3d-a04e-191d79883f97 minio pvc-data-minio-0 csi-disk-sata 10Gi 48874130-df77-451b-9b43-d435ac5a11d5There are 7 Services: Name Namespace ServiceTypeheadless-lxprus default ClusterIPkubernetes default ClusterIPminio default NodePortflink-operator-controller-manager-metrics-service flink-operator-system ClusterIPflink-operator-webhook-service flink-operator-system ClusterIPheadless-lxprus minio ClusterIPminio minio NodePortThere are 0 Ingresses: There are 6 Images: Namegcr.io/flink-operator/flink-operator:v1beta1-6flink:1.8.2swr.cn-north-4.myhuaweicloud.com/paas/minio:latestnginx:stable-alpine-perlswr.cn-north-4.myhuaweicloud.com/everest/minio:latestgcr.io/kubebuilder/kube-rbac-proxy:v0.4.0There are 2 Extra Secrets: SecretTypecfe/secure-opaquehelm.sh/release.v1 在kspider执行完毕后,当前目录下将生成两个文件: cluster-*.json:此文件包含了源集群及应用的采集数据,这些数据可用于分析和规划迁移过程。 preferred-*.json:此文件包含了推荐的目标集群信息。基于源集群的规模和节点规格进行初步评估,文件将提供关于目标集群版本和规模的建议。 查看源集群及应用的采集数据。 您可以用文本编辑器或JSON查看器打开“cluster-*.json”文件以查看数据。在实际操作中,您需要将文件名中的“*”替换为实际的时间戳或序列号,以找到并打开正确的文件。 “cluster-*.json”文件说明如下: { K8sVersion:Kubernetes版本,字符串类型 Namespaces:命名空间数量,字符串类型 Pods:Pod总数量,整型 Nodes:节点总信息,以IP为key,展示节点信息 IP地址 CPU:CPU,字符串类型 Arch:CPU架构,字符串类型 Memory:内存,字符串类型 HugePages1Gi:1G大页内存,字符串类型 HugePages2Mi:2M大页内存,字符串类型 OS:节点OS,字符串类型 KernelVersion:OS内核版本,字符串类型 RuntimeVersion:节点容器运行及版本,字符串类型 InternalIP:内部IP,字符串类型 ExternalIP:外部IP,字符串类型 MachineID:节点ID,字符串类型。说明:CCE中能够保证与ECS的ID一致 Workloads:工作负载 Deployment:工作负载类型,支持Deployment(无状态负载)、StatefulSet(有状态负载)、DaemonSet(守护进程集)、CronJob(定时任务)、Job(普通任务)、LonePod(独立Pod) default:命名空间名称 Count:数量,整型 Items:详细信息,数组类型 Name:工作负载名称,字符串类型 Namespace:命名空间名称,字符串类型 NodeAffinity:节点亲和性,布尔型 Replicas:副本数量,整型 Storage:存储 PersistentVolumes:持久卷 pv-name:以PV名称为key VolumeID:卷ID,字符串类型 Namespace:命名空间,字符串类型 PvcName:绑定PVC的名称,字符串类型 ScName:存储类的名称,字符串类型 Size:申请空间大小,字符串类型 Pods:使用PV的Pod名称,字符串类型 NodeIP:Pod所在的节点IP,字符串类型 VolumePath:该Pod挂载节点的路径,字符串类型 OtherVolumes:其它类型卷 类型:AzureFile、AzureDisk、GCEPersistentDisk、AWSElasticBlockStore、Cinder、Glusterfs、NFS、CephFS、FlexVolume、FlexVolume、DownwardAPI 卷ID/卷名称/卷共享路径等为key Pods:使用其的Pod,字符串类型 NodeIP:Pod所在的节点IP,字符串类型 卷ID/卷名称/卷共享路径等唯一标识卷信息的信息,字符串类型 Networks:网络 LoadBalancer:负载均衡类型 service:网络类型,包括service和ingress Name:名称,字符串类型 Namespace:命名空间名称,字符串类型 Type:类型,字符串类型 ExtraSecrets:扩展secret类型 secret类型名,字符串类型 Images:镜像 镜像repo,字符串类型} 示例: { "K8sVersion": "v1.19.10-r0-CCE22.3.1.B009", "Namespaces": 12, "Pods": 33, "Nodes": { "10.1.17.219": { "CPU": "4", "Memory": "7622944Ki", "HugePages1Gi": "0", "HugePages2Mi": "0", "Arch": "amd64", "OS": "EulerOS 2.0 (SP9x86_64)", "KernelVersion": "4.18.0-147.5.1.6.h687.eulerosv2r9.x86_64", "RuntimeVersion": "docker://18.9.0", "InternalIP": "10.1.17.219", "ExternalIP": "", "MachineID": "0c745e03-2802-44c2-8977-0a9fd081a5ba" }, "10.1.18.182": { "CPU": "4", "Memory": "7992628Ki", "HugePages1Gi": "0", "HugePages2Mi": "0", "Arch": "amd64", "OS": "EulerOS 2.0 (SP5)", "KernelVersion": "3.10.0-862.14.1.5.h520.eulerosv2r7.x86_64", "RuntimeVersion": "docker://18.9.0", "InternalIP": "10.1.18.182", "ExternalIP": "100.85.xxx.xxx", "MachineID": "2bff3d15-b565-496a-817c-063a37eaf1bf" } }, "Workloads": { "CronJob": {}, "DaemonSet": { "default": { "Count": 1, "Items": [ { "Name": "kubecost-prometheus-node-exporter", "Namespace": "default", "NodeAffinity": false, "Replicas": 3 } ] } }, "Deployment": { "default": { "Count": 1, "Items": [ { "Name": "kubecost-cost-analyzer", "Namespace": "default", "NodeAffinity": false, "Replicas": 1 } ] }, "kubecost": { "Count": 1, "Items": [ { "Name": "kubecost-kube-state-metrics", "Namespace": "kubecost", "NodeAffinity": false, "Replicas": 1 } ] } }, "Job": {}, "LonePod": {}, "StatefulSet": { "minio-all": { "Count": 1, "Items": [ { "Name": "minio", "Namespace": "minio-all", "NodeAffinity": false, "Replicas": 1 } ] } } }, "Storage": { "PersistentVolumes": { "demo": { "VolumeID": "demo", "Namespace": "fluid-demo-test", "PvcName": "demo", "ScName": "fluid", "Size": "100Gi", "Pods": "", "NodeIP": "", "VolumePath": "" }, "pvc-fd3a5bb3-119a-44fb-b02e-96b2cf9bb36c": { "VolumeID": "82365752-89b6-4609-9df0-007d964b7fe4", "Namespace": "minio-all", "PvcName": "pvc-data-minio-0", "ScName": "csi-disk", "Size": "10Gi", "Pods": "minio-all/minio-0", "NodeIP": "10.1.23.159", "VolumePath": "/var/lib/kubelet/pods/5fc47c82-7cbd-4643-98cd-cea41de28ff2/volumes/kubernetes.io~csi/pvc-fd3a5bb3-119a-44fb-b02e-96b2cf9bb36c/mount" } }, "OtherVolumes": {} }, "Networks": { "LoadBalancer": {} }, "ExtraSecrets": [ "cfe/secure-opaque", "helm.sh/release.v1" ], "Images": [ "nginx:stable-alpine-perl", "ghcr.io/koordinator-sh/koord-manager:0.6.2", "swr.cn-north-4.myhuaweicloud.com/paas/minio:latest", "swr.cn-north-4.myhuaweicloud.com/everest/e-backup-test:v1.0.0", "gcr.io/kubecost1/cost-model:prod-1.91.0", "gcr.io/kubecost1/frontend:prod-1.91.0" ]}
  • 应用恢复操作步骤 通过kubectl连接目标集群。具体方法可参考使用kubectl连接集群。 准备数据恢复配置文件:restore.json。 新建一个restore.json文件,按照格式修改,并将文件放置在k8clone工具所在目录下。 示例: { "StorageClass": { "csi-disk": "csi-disk-new" }, "ImageRepo": { "quay.io/coreos": "swr.cn-north-4.myhuaweicloud.com/paas" }} 进入k8clone工具所在目录,执行恢复命令,将备份数据恢复到目标集群。 示例: ./k8clone-linux-amd64 restore -d ./k8clone-dump.zip -f ./restore.json
  • k8clone数据恢复原理 数据恢复的流程参考如下: 图1 数据恢复流程 在执行恢复操作前,需要准备一个数据恢复配置文件“restore.json”,目的是在应用恢复时自动更换PVC、StatefulSet的存储类名称,以及工作负载所使用镜像的Repository地址。 文件内容如下: { "StorageClass": "OldStorageClassName": "NewStorageClassName" //支持修改PVC、StatefulSet的StorageClassName字段 "ImageRepo": "OldImageRepo1": "NewImageRepo1", //eg:"dockerhub.com": "cn-north-4.swr.huaweicloud.com" "OldImageRepo2": "NewImageRepo2", //eg:"dockerhub.com/org1": "cn-north-4.swr.huaweicloud.com/org2" "NoRepo": "NewImageRepo3" //eg:"golang": "swr.cn-north-4.myhuaweicloud.com/paas/golang"} StorageClass:支持PVC、有状态应用VolumeClaimTemplates中存储类名称按照配置进行自动更换。 ImageRepo:支持工作负载所使用镜像的Repository地址的更换,工作负载包括Deployment(含initContainer)、StatefulSet、Orphaned Pod、Job、CronJob、Replica Set、Replication Controller、DaemonSet。
  • k8clone恢复使用方法 k8clone工具支持在Linux(x86、arm)和Windows环境中运行,使用方法相似。本文将以Linux(x86)环境为例进行介绍。 若使用Linux(arm)或Windows环境,请将下述命令中的k8clone-linux-amd64分别替换为k8clone-linux-arm64或k8clone-windows-amd64.exe。 在k8clone工具所在目录下执行./k8clone-linux-amd64 restore -h,可以查看k8clone工具恢复的使用方法。 -k, --kubeconfig:指定kubectl的KubeConfig位置,默认是$HOME/.kube/config。kubeConfig文件:用于配置对Kubernetes集群的访问,KubeConfig文件中包含访问注册Kubernetes集群所需要的认证凭据以及Endpoint(访问地址),详细介绍可参见Kubernetes文档。 -s, --api-server:Kubernetes API Server URL,默认是""。 -q, --context:Kubernetes Configuration Context,默认是""。 -f, --restore-conf:指定restore.json的路径,默认是k8clone工具所在目录下。 -d, --local-dir:备份数据放置的路径,默认是k8clone工具所在目录下。 $ ./k8clone-linux-amd64 restore -hProcessRestore from backupUsage: k8clone restore [flags]Flags: -s, --api-server string Kubernetes api-server url -q, --context string Kubernetes configuration context -h, --help help for restore -k, --kubeconfig string The kubeconfig of k8s cluster's. Default is the $HOME/.kube/config. -d, --local-dir string Where to restore (default "./k8clone-dump.zip") -f, --restore-conf string restore conf file (default "./restore.json") 示例: ./k8clone-linux-amd64 restore -d ./k8clone-dump.zip -f ./restore.json
  • 启动后处理 在创建工作负载时,配置容器信息,选择“生命周期”。 在“启动后处理”页签,设置启动后处理的参数。 表3 启动后处理-参数说明 参数 说明 命令行方式 在容器中执行指定的命令。命令行可通过执行bash或执行二进制的方式实现,您可以参照示例配置需要执行的命令。 命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。不支持后台执行和异步执行的命令。 如需要执行的命令如下: exec: command: - /install.sh - install_agent 请在执行脚本中填写: /install install_agent。这条命令表示容器创建成功后将执行install.sh。 HTTP请求方式 发起一个HTTP调用请求。配置参数如下: 路径:请求的URL路径,可选项。 端口:请求的端口,必选项。 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。
  • 停止前处理 在创建工作负载时,配置容器信息,选择“生命周期”。 在“停止前处理”页签,设置停止前处理的命令。 表4 停止前处理 参数 说明 命令行方式 在容器中执行指定的命令。命令行可通过执行bash或执行二进制的方式实现,您可以参照示例配置需要执行的命令。 命令的格式为Command Args[1] Args[2]…(Command为系统命令或者用户自定义可执行程序,如果未指定路径则在默认路径下寻找可执行程序),如果需要执行多条命令,建议采用将命令写入脚本执行的方式。 如需要执行的命令如下: exec: command: - /uninstall.sh - uninstall_agent 请在执行脚本中填写: /uninstall uninstall_agent。这条命令表示容器结束前将执行uninstall.sh。 HTTP请求方式 发起一个HTTP调用请求。配置参数如下: 路径:请求的URL路径,可选项。 端口:请求的端口,必选项。 主机地址:请求的IP地址,可选项,默认是容器所在的节点IP。
  • YAML样例 本节以nginx为例,说明kubectl命令设置容器生命周期的方法。 在以下配置文件中,您可以看到postStart命令在容器目录/bin/bash下写了个install.sh命令。 preStop执行uninstall.sh命令。 apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 1 selector: matchLabels: app: nginx 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
  • k8clone数据恢复原理 数据恢复的流程参考如下: 图1 数据恢复流程 在执行恢复操作前,需要准备一个数据恢复配置文件“restore.json”,目的是在应用恢复时自动更换PVC、StatefulSet的存储类名称,以及工作负载所使用镜像的Repository地址。 文件内容如下: { "StorageClass": "OldStorageClassName": "NewStorageClassName" //支持修改PVC、StatefulSet的StorageClassName字段 "ImageRepo": "OldImageRepo1": "NewImageRepo1", //eg:"dockerhub.com": "cn-north-4.swr.huaweicloud.com" "OldImageRepo2": "NewImageRepo2", //eg:"dockerhub.com/org1": "cn-north-4.swr.huaweicloud.com/org2" "NoRepo": "NewImageRepo3" //eg:"golang": "swr.cn-north-4.myhuaweicloud.com/paas/golang"} StorageClass:支持PVC、有状态应用VolumeClaimTemplates中存储类名称按照配置进行自动更换。 ImageRepo:支持工作负载所使用镜像的Repository地址的更换,工作负载包括Deployment(含initContainer)、StatefulSet、Orphaned Pod、Job、CronJob、Replica Set、Replication Controller、DaemonSet。
  • 应用恢复操作步骤 通过kubectl连接目标集群。具体方法可参考使用kubectl连接集群。 准备数据恢复配置文件:restore.json。 新建一个restore.json文件,按照格式修改,并将文件放置在k8clone工具所在目录下。 示例: { "StorageClass": { "csi-disk": "csi-disk-new" }, "ImageRepo": { "quay.io/coreos": "swr.cn-north-4.myhuaweicloud.com/paas" }} 进入k8clone工具所在目录,执行恢复命令,将备份数据恢复到目标集群。 示例: ./k8clone-linux-amd64 restore -d ./k8clone-dump.zip -f ./restore.json
  • k8clone恢复使用方法 k8clone工具支持在Linux(x86、arm)和Windows环境中运行,使用方法相似。本文将以Linux(x86)环境为例进行介绍。 若使用Linux(arm)或Windows环境,请将下述命令中的k8clone-linux-amd64分别替换为k8clone-linux-arm64或k8clone-windows-amd64.exe。 在k8clone工具所在目录下执行./k8clone-linux-amd64 restore -h,可以查看k8clone工具恢复的使用方法。 -k, --kubeconfig:指定kubectl的KubeConfig位置,默认是$HOME/.kube/config。kubeConfig文件:用于配置对Kubernetes集群的访问,KubeConfig文件中包含访问注册Kubernetes集群所需要的认证凭据以及Endpoint(访问地址),详细介绍可参见Kubernetes文档。 -s, --api-server:Kubernetes API Server URL,默认是""。 -q, --context:Kubernetes Configuration Context,默认是""。 -f, --restore-conf:指定restore.json的路径,默认是k8clone工具所在目录下。 -d, --local-dir:备份数据放置的路径,默认是k8clone工具所在目录下。 $ ./k8clone-linux-amd64 restore -hProcessRestore from backupUsage: k8clone restore [flags]Flags: -s, --api-server string Kubernetes api-server url -q, --context string Kubernetes configuration context -h, --help help for restore -k, --kubeconfig string The kubeconfig of k8s cluster's. Default is the $HOME/.kube/config. -d, --local-dir string Where to restore (default "./k8clone-dump.zip") -f, --restore-conf string restore conf file (default "./restore.json") 示例: ./k8clone-linux-amd64 restore -d ./k8clone-dump.zip -f ./restore.json
  • 启动命令 在默认情况下,镜像启动时会运行默认命令,如果想运行特定命令或重写镜像默认值,需要进行相应设置。 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] 在创建工作负载时,配置容器信息,选择“生命周期”。 在“启动命令”页签,输入运行命令和运行参数。 表2 容器启动命令 命令方式 操作步骤 运行命令 在容器中执行指定的命令。命令行可通过执行bash或执行二进制的方式实现,您可以参照示例配置需要执行的命令。 若运行命令有多个,多个命令之间用空格进行分隔。若命令本身带空格,则需要加引号("")。 说明: 多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。 运行参数 输入控制容器运行命令参数,例如--port=8080。 若参数有多个,多个参数以换行分隔。
  • 数据规划 在AWS基础设施上构建多云集群时,将自动在AWS控制台创建以下资源,请确保资源配额足够: 表1 资源数量 资源类型 EC2 NAT VPC 子网 路由表 互联网网关 弹性IP 安全组 网络ACL ELB 网络接口 存储卷 数量 3台 3个 1个 6个 7个 1个 3个 5个 1个 1个 4个 6块 表2 EC2资源规格 节点类型 数量 CPU (Cores) Mem (GiB) root盘 非root盘 备注 集群管理节点 3 8 32 100 200 t3.2xlarge型号 集群计算节点 按需 8 32 100 200 数量按需可扩展 表3 IAM 权限 权限类型 权限名称 IAMRole AWSIAMRoleNodes、AWSIAMRoleControlPlane、AWSIAMRoleControllers IAMInstanceProfile AWSIAMInstanceProfileNodes、AWSIAMInstanceProfileControlPlane、AWSIAMInstanceProfileControllers IAMManagedPolicy AWSIAMManagedPolicyCloudProviderNodes、AWSIAMManagedPolicyCloudProviderControlPlane、AWSIAMManagedPolicyControllers 父主题: 安装多云集群的业务规划
  • 符合策略实例的资源定义 ingress配置的hostname不是空白或通配符类型,符合策略实例。 apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: non-wildcard-ingressspec: rules: - host: 'myservice.example.com' http: paths: - pathType: Prefix path: "/" backend: service: name: example port: number: 80
  • 不符合策略实例的资源定义 ingress配置的hostname是空白,不符合策略实例。 apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: wildcard-ingressspec: rules: - host: '' http: paths: - pathType: Prefix path: "/" backend: service: name: example port: number: 80apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: wildcard-ingressspec: rules: # Omitted host field counts as a wildcard too - http: paths: - pathType: Prefix path: "/" backend: service: name: example port: number: 80 ingress配置的hostname是包含通配符*,不符合策略实例。 apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: wildcard-ingressspec: rules: - host: '*.example.com' http: paths: - pathType: Prefix path: "/" backend: service: name: example port: number: 80
  • 策略实例示例 示例展示了该策略定义的生效类型。 apiVersion: constraints.gatekeeper.sh/v1beta1kind: K8sBlockWildcardIngressmetadata: name: block-wildcard-ingressspec: match: kinds: - apiGroups: ["extensions", "networking.k8s.io"] kinds: ["Ingress"]
  • 工具包 在集群评估、镜像迁移、应用备份和应用迁移阶段,迁移过程已实现工具化。您需要预先下载这些工具并将它们上传到前述服务器。 对于Linux操作系统来说,使用下述工具前,需要运行chmod u+x 工具名命令(例如chmod u+x kspider-linux-amd64),授予可执行权限。 表1 准备工作 工具 说明 下载链接 备注 kspider kspider是一款用于采集源集群信息的工具,它向用户提供了集群的Kubernetes版本、规模、工作负载数量、存储以及正在使用的镜像等数据,这些信息有助于用户了解集群的当前状况,评估迁移风险,并选择合适的目标集群版本和规模。 Linux x86:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/kspider-linux-amd64 Linux arm:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/kspider-linux-arm64 Windows:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/kspider-windows-amd64.exe 这些工具均支持在Linux(x86、arm)和Windows系统上运行,请根据服务器操作系统类型下载对应的工具。 image-migrator image-migrator是一个镜像迁移工具,能够自动将基于Docker Registry v2搭建的Docker镜像仓库或第三方云镜像仓库中的镜像迁移到SWR中。 Linux x86:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/image-migrator-linux-amd64 Linux arm:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/image-migrator-linux-arm64 Windows:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/image-migrator-windows-amd64.exe k8clone k8clone是一个简便的Kubernetes元数据克隆工具,它可以将Kubernetes元数据(对象)保存为本地压缩包,然后将这些元数据恢复到目标集群中。 Linux x86:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-linux-amd64 Linux arm:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-linux-arm64 Windows:https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-windows-amd64.exe
  • 符合策略实例的资源定义 cpu比例为4,内存比例为1,符合约束。 apiVersion: v1kind: Podmetadata: name: opa-allowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: limits: cpu: "4" memory: "2Gi" requests: cpu: "1" memory: "2Gi"
  • 符合策略实例的资源定义 示例中volumes中的类型均在上述定义的允许范围内,符合策略实例。 apiVersion: v1kind: Podmetadata: name: nginx-volume-types-allowed labels: app: nginx-volume-typesspec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /cache name: cache-volume - name: nginx2 image: nginx volumeMounts: - mountPath: /cache2 name: demo-vol volumes: - name: cache-volume emptyDir: {} - name: demo-vol emptyDir: {}
  • 不符合策略实例的资源定义 示例一:CPU比例为40,不符合约束。 apiVersion: v1kind: Podmetadata: name: opa-disallowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: limits: cpu: "4" memory: "2Gi" requests: cpu: "100m" memory: "2Gi" 示例二:内存比例为20,不符合约束。 apiVersion: v1kind: Podmetadata: name: opa-disallowed labels: owner: me.agilebank.demospec: containers: - name: opa image: openpolicyagent/opa:0.9.2 args: - "run" - "--server" - "--addr=localhost:8080" resources: limits: cpu: "800m" memory: "2Gi" requests: cpu: "100m" memory: "100Mi"
  • 不符合策略实例的资源定义 示例中volumes中的类型(hostPath)不在上述定义的允许范围内,不符合策略实例。 apiVersion: v1kind: Podmetadata: name: nginx-volume-types-disallowed labels: app: nginx-volume-typesspec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /cache name: cache-volume - name: nginx2 image: nginx volumeMounts: - mountPath: /cache2 name: demo-vol volumes: - name: cache-volume hostPath: path: /tmp # directory location on host - name: demo-vol emptyDir: {}
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全