在集群中部署 Kubernetes 本机应用程序
使用 Kubernetes 技术在 IBM Cloud® Kubernetes Service 中部署容器化应用程序。 执行滚动更新和回滚,用户无需停机。
有关创建配置文件的更多信息,请参阅《 配置最佳实践 》指南。
启动 Kubernetes 仪表板
访问 Kubernetes 控制面板,通过 IBM Cloud 控制台 或 CLI 查看群集和工作节点信息。
开始之前,请确认您拥有适当的 访问角色。 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
从 IBM Cloud 控制台启动 Kubernetes 仪表板
- 登录到 IBM Cloud 控制台。
- 在菜单栏中,选择要使用的帐户。
- 从菜单中
,点击容器 > 集群。
- 在集群页面上,单击要访问的集群。
- 在集群详细信息页面中,单击 Kubernetes 仪表板按钮。
从 CLI 启动 Kubernetes 仪表板
CLI 方法可实现自动化和 CI/CD 集成。 在开始之前 安装 CLI。
-
获取 Kubernetes 证书。
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}' -
从输出中复制 id-token 值。
-
启动代理。
kubectl proxy示例输出
Starting to serve on 127.0.0.1:8001 -
登录到仪表板。
-
在浏览器中导航到以下 URL:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ -
在登录页面选择令牌验证方法。
-
将 id-token 值粘贴到 代币 字段,然后单击 登录。
-
使用 CTRL+C 退出 proxy 命令。 再次运行 kubectl proxy 重新启动仪表板。
使用 Kubernetes 仪表板部署应用程序
通过仪表板输入配置详情或上传 YAML 文件来部署应用程序。
开始之前,请 打开仪表板 并验证您是否拥有 服务访问角色。 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
部署应用程序
-
单击 + 创建。
-
选择部署方法:
- 选择“指定应用程序详细信息”并输入详细信息。
- 选择上传 YAML 或 JSON 文件上传应用程序 配置文件。
-
单击“**部署 **”验证应用程序是否已成功部署。
使用 CLI 部署应用程序
CLI 方法可提供精确控制并实现自动化。 您将创建定义应用程序资源的配置文件,并对其进行版本控制。
开始之前,请 安装 CLI 并验证您是否拥有 服务访问角色。 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
部署应用程序
使用标签将应用程序部署到特定工作程序节点
部署应用程序时,应用程序 pod 会不加选择地部署到集群中的各种工作程序节点。 有时,您可能希望限制应用程序 pod 部署到的 Worker 节点。 例如,您可能希望应用程序 pod 仅部署到特定工作程序池中的工作程序节点,因为这些工作程序节点位于裸机机器上。 要指定应用程序 pod 必须部署到的工作程序节点,请将亲缘关系规则添加到应用程序部署。
准备工作
要将应用程序部署到特定的工作节点、
-
获取要将应用程序 pod 部署到的工作程序池的标识。
ibmcloud ks worker-pool ls --cluster <cluster_name_or_ID> -
列出工作程序池中的工作程序节点,并记下其中一个 Private IP 地址。
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID> -
描述工作程序节点。 在 Labels 输出中,记下工作程序池标识标签
ibm-cloud.kubernetes.io/worker-pool-id。本主题中的步骤使用工作程序池标识将应用程序 pod 仅部署到该工作程序池中的工作程序节点。 要使用其他标签将应用程序 pod 部署到特定工作程序节点,请改为记下此标签。 例如,要将应用程序 pod 仅部署到特定专用 VLAN 上的工作程序节点,请使用
privateVLAN=标签。kubectl describe node <worker_node_private_IP>示例输出
NAME: 10.xxx.xx.xxx Roles: <none> Labels: arch=amd64 beta.kubernetes.io/arch=amd64 beta.kubernetes.io/instance-type=b3c.4x16.encrypted beta.kubernetes.io/os=linux failure-domain.beta.kubernetes.io/region=us-south failure-domain.beta.kubernetes.io/zone=dal10 ibm-cloud.kubernetes.io/encrypted-docker-data=true ibm-cloud.kubernetes.io/ha-worker=true ibm-cloud.kubernetes.io/iaas-provider=softlayer ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted ibm-cloud.kubernetes.io/sgx-enabled=false ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a ibm-cloud.kubernetes.io/worker-version=1.34_1534 kubernetes.io/hostname=10.xxx.xx.xxx privateVLAN=1234567 publicVLAN=7654321 Annotations: node.alpha.kubernetes.io/ttl=0 ... -
在应用程序部署中为工人池 ID 标签 添加亲和规则。
示例 YAML
apiVersion: apps/v1 kind: Deployment metadata: name: with-node-affinity spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ibm-cloud.kubernetes.io/worker-pool-id operator: In values: - <worker_pool_ID> ...在示例 YAML 的亲缘关系部分,
ibm-cloud.kubernetes.io/worker-pool-id是key,<worker_pool_ID>是value。 -
应用已更新的部署配置文件。
kubectl apply -f with-node-affinity.yaml -
验证应用程序 pod 是否部署到正确的工作程序节点。
-
列出集群中的 pod。
kubectl get pods -o wide示例输出
NAME READY STATUS RESTARTS AGE IP NODE cf-py-d7b7d94db-vp8pq 1/1 Running 0 15d 172.30.xxx.xxx 10.176.48.78 -
在输出中,确定应用程序的 pod。 记下该 pod 所在的工作程序节点的 NODE 专用 IP 地址。
在上面的输出示例中,应用程序 pod
cf-py-d7b7d94db-vp8pq位于 IP 地址为10.xxx.xx.xxx的工作程序节点上。 -
列出在应用程序部署中指定的工作程序池中的工作程序节点。
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>示例输出
ID Public IP Private IP Machine Type State Status Zone Version kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7 169.xx.xxx.xxx 10.176.48.78 b3c.4x16 normal Ready dal10 1.8.6_1504 kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8 169.xx.xxx.xxx 10.176.48.83 b3c.4x16 normal Ready dal10 1.8.6_1504 kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9 169.xx.xxx.xxx 10.176.48.69 b3c.4x16 normal Ready dal12 1.8.6_1504如果基于其他因素创建了应用程序亲缘关系规则,请改为获取该因素的值。 例如,要验证应用程序 pod 是否已部署到特定 VLAN 上的工作节点,可通过运行
ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID>查看工作节点所在的 VLAN。 -
在输出中,验证在先前步骤中识别的具有专用 IP 地址的工作程序节点是否部署在此工作程序池中。
-
在 NVIDIA GPU 机器上部署应用程序
如果您具有 GPU 机器类型,那么可以加快计算密集型工作负载 (例如 AI,机器学习,推断等) 所需的处理时间。
在 IBM Cloud Kubernetes Service中,将自动为您安装所需的 GPU 驱动程序。
在以下步骤中,您将了解如何部署需要 GPU 的工作负载。 不过,您也可以部署不需要在 GPU 和 CPU 上处理其工作负载的应用程序。
您还可以通过 此 Kubernetes 演示尝试数学密集型工作负载,例如机器学习 TensorFlow 框架。
先决条件
准备工作
部署工作负载
-
创建 YAML 文件。 在此示例中,
JobYAML 通过创建一个短命 pod 来管理批处理类工作负载,该 pod 一直运行到命令完成并成功终止为止。对于 GPU 工作负载,必须在作业 YAML 中指定
resources: limits: nvidia.com/gpu字段。apiVersion: batch/v1 kind: Job metadata: name: nvidia-devicequery labels: name: nvidia-devicequery spec: template: metadata: labels: name: nvidia-devicequery spec: containers: - name: nvidia-devicequery image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04 imagePullPolicy: IfNotPresent resources: limits: nvidia.com/gpu: 2 restartPolicy: Never了解 YAML 组件 组件 描述 元数据和标签名称 为任务输入名称和标签,并在文件元数据和 spec template元数据中使用相同的名称。 例如,nvidia-devicequery。containers.image提供容器是其运行实例的映像。 在此示例中,该值设置为使用 DockerHub CUDA 设备查询映像: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04。containers.imagePullPolicy要只在图像当前不在工作节点上时提取新图像,请指定 IfNotPresent。resources.limits对于 GPU 机器,必须指定资源限制。 Kubernetes 设备插件会设置默认资源请求,使其与限制相匹配。
- 您必须将密钥指定为
nvidia.com/gpu。 - 输入请求的 GPU 的整数,例如
2。 请注意,容器 pod 不共享 GPU,并且不能过量使用 GPU。 例如,如果只有 1 个mg1c.16x128机器,那么该机器中只有 2 个 GPU,因此可以指定的最大值为2。
- 您必须将密钥指定为
-
应用 YAML 文件。 例如:
kubectl apply -f nvidia-devicequery.yaml -
通过
nvidia-devicequery标签过滤 pod,检查作业 pod。 验证 STATUS 是否为 Completed。kubectl get pod -A -l 'name in (nvidia-devicequery)'示例输出
NAME READY STATUS RESTARTS AGE nvidia-devicequery-ppkd4 0/1 Completed 0 36s -
对 pod 执行 describe 命令,以查看 GPU 设备插件是如何安排 pod 的。
-
在
Limits和Requests字段中,确保指定的资源限制与设备插件自动设置的请求相匹配。 -
在 Events 中,验证是否已将 pod 分配给 GPU 工作程序节点。
kubectl describe pod nvidia-devicequery-ppkd4示例输出
NAME: nvidia-devicequery-ppkd4 Namespace: default ... Limits: nvidia.com/gpu: 1 Requests: nvidia.com/gpu: 1 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 1m default-scheduler Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx ...
-
-
要验证作业是否使用了 GPU 来计算其工作负载,可以检查日志。
kubectl logs nvidia-devicequery-ppkd4示例输出
/cuda-samples/sample Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "Tesla P100-PCIE-16GB" CUDA Driver Version / Runtime Version 11.4 / 11.7 CUDA Capability Major/Minor version number: 6.0 Total amount of global memory: 16281 MBytes (17071734784 bytes) (056) Multiprocessors, (064) CUDA Cores/MP: 3584 CUDA Cores GPU Max Clock rate: 1329 MHz (1.33 GHz) Memory Clock rate: 715 Mhz Memory Bus Width: 4096-bit L2 Cache Size: 4194304 bytes Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384) Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total shared memory per multiprocessor: 65536 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 2 copy engine(s) Run time limit on kernels: No Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Enabled Device supports Unified Addressing (UVA): Yes Device supports Managed Memory: Yes Device supports Compute Preemption: Yes Supports Cooperative Kernel Launch: Yes Supports MultiDevice Co-op Kernel Launch: Yes Device PCI Domain ID / Bus ID / location ID: 0 / 175 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1 Result = PASS在此示例中,您看到 GPU 用于执行作业,因为 GPU 是在工作程序节点中调度的。 如果限制设置为 2,那么仅显示 2 个 GPU。
现在部署了测试 GPU 工作负载,您可能希望设置集群以运行依赖于 GPU 处理的工具,例如 IBM Maximo Visual Inspection。