本页介绍了在 Google Distributed Cloud Connected 硬件上部署工作负载的步骤,以及在配置工作负载时必须遵守的限制。
在完成这些步骤之前,您必须满足 Distributed Cloud Connected 安装 要求并 订购 Distributed Cloud 硬件。
当 Google Distributed Cloud Connected 硬件到达您选择的 目的地时,它已预先配置了硬件 Google Cloud以及您在订购 Distributed Cloud Connected 时指定的 一些 网络设置。
Google 安装人员会完成物理安装,而您的系统管理员会将 Distributed Cloud Connected 连接到您的本地网络。
硬件连接到本地网络后,它会与 通信 Google Cloud ,以下载软件更新并与您的 Google Cloud 项目建立连接。然后,您就可以在 Distributed Cloud Connected 上预配节点池并部署工作负载了。
部署概览
如需在 Distributed Cloud Connected 硬件上部署工作负载,请完成以下步骤:
可选: 如果您想与 Cloud Key Management Service 集成,以便为本地存储启用客户管理的加密密钥 (CMEK) 支持,请为 您的工作负载数据启用 CMEK 支持。如需了解 Distributed Cloud Connected 如何加密工作负载数据,请参阅 本地存储安全性。
创建节点池。 在此步骤中,您可以将节点分配给节点池,并可以选择将节点池配置为使用 Cloud KMS 来封装和解封 Linux 统一密钥设置 (LUKS) 密码,以加密工作负载数据。
获取集群的凭据 以测试集群。
通过在项目上为用户分配 Edge Container Viewer 角色 (
roles/edgecontainer.viewer) 或 Edge Container Admin 角色 (roles/edgecontainer.admin),授予用户对集群的访问权限。使用
RoleBinding和ClusterRoleBinding为用户分配对集群资源的精细角色型访问权限。可选: 启用 VM Runtime on Google Distributed Cloud 支持,以便在 Distributed Cloud Connected 上的虚拟机上运行工作负载。
可选: 启用 GPU 支持,以便在 Distributed Cloud Connected上运行基于 GPU 的工作负载。
将 NGINX 负载均衡器部署为服务
以下示例说明了如何在 Distributed Cloud Connected 集群上部署 NGINX 服务器并将其公开为服务:
创建一个名为
nginx-deployment.yaml的 YAML 文件,其中包含以下内容:apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
使用以下命令将 YAML 文件应用于集群:
kubectl apply -f nginx-deployment.yaml
创建一个名为
nginx-service.yaml的 YAML 文件,其中包含以下内容:apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: LoadBalancer selector: app: nginx ports: - protocol: TCP port: 8080 targetPort: 80
使用以下命令将 YAML 文件应用于集群:
kubectl apply -f nginx-deployment.yaml
使用以下命令获取 MetalLB 负载平衡器分配给服务的外部 IP 地址:
kubectl get services
该命令会返回类似于以下内容的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service LoadBalancer 10.51.195.25 10.100.68.104 8080:31966/TCP 11d
配置 NodeSystemConfigUpdate 资源
为集群中的每个节点配置 NodeSystemConfigUpdate 网络功能运算符资源,如下所示。
使用以下命令列出在目标集群的节点池中运行的节点:
kubectl get nodes | grep -v master
该命令会返回类似于以下内容的输出:
NAME STATUS ROLES AGE VERSION pool-example-node-1-01-b2d82cc7 Ready <none> 2d v1.22.8-gke.200 pool-example-node-1-02-52ddvfc9 Ready <none> 2d v1.22.8-gke.200记录返回的节点名称并推导出其简称。例如,对于
pool-example-node-1-01-b2d82cc7节点,其简称为node101。对于您在上一步中记录的每个节点,创建一个专用的
NodeSystemConfigUpdate资源文件,其中包含以下内容:apiVersion: networking.gke.io/v1 kind: NodeSystemConfigUpdate metadata: name: nodesystemconfigupdate-NODE_SHORT_NAME namespace: nf-operator spec: kubeletConfig: cpuManagerPolicy: Static topologyManagerPolicy: SingleNumaNode nodeName: NODE_NAME osConfig: hugePagesConfig: ONE_GB: 2 TWO_MB: 0 isolatedCpusPerSocket: "0": 40 "1": 40 sysctls: nodeLevel: net.core.rmem_max: "8388608" net.core.wmem_max: "8388608"
替换以下内容:
NODE_NAME:目标节点的完整名称。例如,pool-example-node-1-01-b2d82cc7。NODE_SHORT_NAME:从目标节点的完整名称推导出的简称。例如,node101。
将每个文件命名为
node-system-config-update-NODE_SHORT_NAME.yaml。使用以下命令将每个
NodeSystemConfigUpdate资源文件应用于集群:kubectl apply -f node-system-config-update-NODE_SHORT_NAME.yaml
将
NODE_SHORT_NAME替换为相应目标节点的简称。将资源应用于集群时,每个受影响的节点都会重启,这可能需要长达 30 分钟的时间。
- 监控受影响节点的状态,直到所有节点都成功重启:
kubectl get nodes | grep -v master
每个节点的状态都会在重启完成后从
not-ready转换为ready。
为 Pod 配置映像缓存
您可以将在 Distributed Cloud Connected 集群上运行的 Pod 配置为缓存其映像。Pod 在首次从代码库中拉取映像后,便会开始使用缓存的映像。如果托管 Pod 的节点存储空间不足,则系统不会缓存新映像,并且会清除现有映像缓存,以确保工作负载继续不间断地运行。
您的 Pod 配置必须满足以下前提条件:
- 您必须在 Pod 上设置
gdce.baremetal.cluster.gke.io/cache-image: true标签。 - 如果您使用的是私有映像代码库,则
ImagePullSecret资源必须为kubernetes.io/dockerconfigjson类型。 - 您必须将 Pod 的拉取政策设置为
IfNotPresent,以确保始终使用目标映像的缓存副本。如果本地没有缓存副本,则系统会从代码库中拉取映像。
以下示例说明了启用缓存的 Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: cached-image-pod
labels:
gdce.baremetal.cluster.gke.io/cache-image: "true"
spec:
containers:
- name: my-container
image: your-private-image-repo/your-image:tag
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: my-image-secret # If using a private registry
下一个示例说明了启用缓存的 Deployment 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: cached-image-deployment
spec:
template:
metadata:
labels:
gdce.baremetal.cluster.gke.io/cache-image: "true"
spec:
containers:
- name: my-container
image: your-private-image-repo/your-image:tag
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: my-image-secret # If using a private registry
Distributed Cloud 工作负载的限制
配置 Distributed Cloud Connected 工作负载时,您必须遵守本部分中所述的限制。Distributed Cloud Connected 会对您在 Distributed Cloud Connected 硬件上部署的所有工作负载强制执行这些限制。
Linux 工作负载限制
Distributed Cloud Connected 仅支持以下 工作负载的 Linux 功能 :
AUDIT_READAUDIT_WRITECHOWNDAC_OVERRIDEFOWNERFSETIDIPC_LOCKIPC_OWNERKILLMKNODNET_ADMINNET_BIND_SERVICENET_RAWSETFCAPSETGIDSETPCAPSETUIDSYS_CHROOTSYS_NICESYS_PACCTSYS_PTRACESYS_RESOURCESYS_TIME
命名空间限制
Distributed Cloud Connected 不支持以下命名空间:
hostPIDhostIPChostNetwork
资源类型限制
Distributed Cloud Connected 不支持 CertificateSigningRequest 资源类型,该类型允许客户端根据签名请求请求颁发 X.509 证书。
安全上下文限制
Distributed Cloud Connected 不支持特权模式安全上下文。
Pod 绑定限制
Distributed Cloud Connected 不支持在 HostNetwork 命名空间中将 Pod 绑定到主机端口。此外,HostNetwork 命名空间不可用。
hostPath 卷限制
Distributed Cloud Connected 仅允许以下具有读写权限的 hostPath 卷:
/dev/hugepages/dev/infiniband/dev/vfio/dev/char/sys/devices
PersistentVolumeClaim 资源类型限制
Distributed Cloud Connected 仅允许以下 PersistentVolumeClaim 资源类型:
csinfslocal
卷类型限制
Distributed Cloud Connected 仅允许以下卷类型:
configMapcsidownwardAPIemptyDirhostPathnfspersistentVolumeClaimprojectedsecret
Pod 容忍限制
Distributed Cloud Connected 不允许在控制平面节点上创建用户创建的 Pod。具体而言,Distributed Cloud Connected 不允许调度具有以下容忍键的 Pod:
""node-role.kubernetes.io/masternode-role.kubernetes.io/control-plane
模拟限制
Distributed Cloud Connected 不支持用户或群组模拟。
管理命名空间限制
Distributed Cloud Connected 不允许访问以下命名空间:
ai-systemai-speech-systemai-ocr-systemai-translation-systemanthos-identity-servicecert-managerdataproc-systemdataproc-PROJECT_IDdns-systemg-istio-systemgke-connectgke-managed-metrics-servergke-operatorsg-ospf-servicecontrol-systemg-ospf-systemg-pspf-systemgke-systemgpc-backup-systemiam-systemkube-node-leasekube-publickube-system,但删除ippools.whereabouts.cni.cncf.io除外metallb-system,但修改configMap资源以设置负载均衡 IP 地址范围除外nf-operatoroclcm-systempredictionrm-systemrobiniosaas-systemvm-system
PROJECT_ID 表示目标 Google Cloud 项目的 ID。
避免使用名称中带有 g- 前缀的任何命名空间。此类命名空间通常是 Distributed Cloud Connected 使用的预留命名空间。
Webhook 限制
Distributed Cloud Connected 对 Webhook 的限制如下:
- 您创建的任何变更 Webhook 都会自动排除
kube-system命名空间。 - 以下资源类型停用了变更 Webhook:
nodespersistentvolumescertificatesigningrequeststokenreviews
Pod 优先级限制
Distributed Cloud Connected 要求您将工作负载 Pod 的优先级设置为低于 500000000 的值。
为 Pod 配置运行时类
借助 Distributed Cloud Connected,您可以使用 runtimeClassName 字段在 Pod 的配置中指定其运行时类。这会替换在集群级别指定的默认运行时类。可用的运行时类为 runc 和 gvisor。
例如:
apiVersion: v1
kind: Pod
metadata:
name: myPod
spec:
runtimeClassName: gvisor
containers:
- name: myPod
image: myPodImage
restartPolicy: OnFailure
如果您在 Pod 配置中省略此项,则 Pod 会使用在集群级别指定的类。
默认的集群级运行时类为 runc,除非您配置默认运行时类
使用 --default-container-runtime 参数,如 创建和管理集群中所述。
如果您在 Pod 级别或集群级别更改运行时类,则必须重启受影响的 Pod,更改才会生效。
gvisor 运行时类
指定 gvisor 运行时类会将 Pod 切换到基于 gVisor 的开放容器倡议 (OCI) 安全运行时
。gVisor 是一种沙盒解决方案,可在工作负载及其主机之间引入
强大的隔离。
配置 VPC Service Controls 集成
完成本部分中的步骤,以配置 Distributed Cloud Edge Container API 与 VPC Service Controls 的集成。如需了解详情,请参阅以下内容:
必需的出站规则
您必须配置本部分中所述的出站规则,才能将 Distributed Cloud Edge Container API 与 VPC Service Controls 集成。如需了解出站规则语法,请参阅 出站规则参考。
访问机器可用区和 Google Cloud 项目
此规则允许调用方身份在使用 Distributed Cloud Edge Container API 进行调用时访问机器可用区和 Google Cloud 项目。当机器和集群不在同一 Google Cloud 项目中,并且机器 Google Cloud 项目位于边界之外时,此规则适用。如果您使用 VPC Service Controls 在边界内限制了 Distributed Cloud Edge Container API,则需要此规则。
以下是 JSON 格式的此规则的 egressFrom 配置示例:
egressFrom:
identityType: ANY_SERVICE_ACCOUNT
sources:
- accessLevel: "*"
以下是此规则的 egressTo 配置示例:
egressTo:
resources:
- "projects/280968151686"
operations:
- serviceName: "edgecontainer.googleapis.com"
methodSelectors:
- method: "*"
必需的入站规则
您必须配置本部分中所述的入站规则,才能将 Distributed Cloud Edge Container API 与 VPC Service Controls 集成。如需了解入站规则语法,请参阅 入站规则参考。
访问 Distributed Cloud Edge Container API
此规则允许特定身份访问 Distributed Cloud Edge Container API 并与之互动。 如果您使用 VPC Service Controls 在边界内限制了 Distributed Cloud Edge Container API,并且调用 Distributed Cloud Edge Container API 的身份位于边界之外,则必须配置此规则。
以下是此规则的 ingressFrom 配置示例:
ingressFrom:
sources:
- accessLevel: '*'
identities:
- serviceAccount:testuser@kubernetesedge-e2e-testing.iam.gserviceaccount.com
以下是此规则的 ingressTo 配置示例:
ingressTo:
resources:
- "*"
operations:
- serviceName: "edgecontainer.googleapis.com"
methodSelectors:
- method: "*"
访问 Connect API 和 Security Token Service API
此规则允许工作负载访问 Connect API 和 Security Token Service API。 如果您使用 VPC Service Controls 在边界内限制了对 Connect API 和 Security Token Service API 的访问权限,则必须配置此规则。如需了解如何在 IP 地址级别设置访问政策,请参阅 IP 地址。
以下是此规则的 ingressFrom 配置示例:
- ingressFrom:
identityType: ANY_IDENTITY
sources:
- accessLevel: "accessPolicies/100637171436/accessLevels/fwi"
以下是此规则的 ingressTo 配置示例:
ingressTo:
resources:
- "*"
operations:
- serviceName: "gkeconnect.googleapis.com"
methodSelectors:
- method: "*"
- serviceName: "sts.googleapis.com"
methodSelectors:
- method: "*"