在集群中部署 Kubernetes 本机应用程序
您可以在 IBM Cloud® Kubernetes Service 中使用 Kubernetes 技术在容器中部署应用程序,并确保这些应用程序正常运行。 例如,可以执行滚动更新和回滚,而不给用户造成中断。
有关为应用程序创建配置文件的更多信息,请参阅 配置最佳实践。
启动 Kubernetes 仪表板
在本地系统上打开 Kubernetes 仪表板,以查看有关集群及其工作程序节点的信息。 在 IBM Cloud 控制台中,可以使用方便的一次单击按钮来访问该仪表板。 通过 CLI,可以访问该仪表板或使用自动化过程中的步骤,例如针对 CI/CD 管道的步骤。
您的集群中是否有太多资源和用户,导致 Kubernetes 仪表板的速度有些慢? 集群管理员可以通过运行 kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3
来扩展 kubernetes-dashboard
部署。
要检查单个应用程序 pod 的日志,可以运行 kubectl logs <pod name>
。 不要使用 Kubernetes 仪表板来流式传输 pod 的日志,这可能会导致对 Kubernetes 仪表板的访问中断。
准备工作
- 确保为您分配了授予相应 Kubernetes RBAC 角色的 服务访问角色,以便您可以使用 Kubernetes 资源。
- 要 从控制台启动 Kubernetes 仪表板,必须分配一个 平台访问角色。 如果只分配了服务访问角色而没有分配平台访问角色,请 从 CLI 启动 Kubernetes 仪表板。
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
您可以使用缺省端口或设置自己的端口来启动集群的 Kubernetes 仪表板。
从 IBM Cloud 控制台启动 Kubernetes 仪表板
- 登录到 IBM Cloud 控制台。
- 在菜单栏中,选择要使用的帐户。
- 从菜单中
,点击容器 > 集群。
- 在集群页面上,单击要访问的集群。
- 在集群详细信息页面中,单击 Kubernetes 仪表板按钮。
从 CLI 启动 Kubernetes 仪表板
开始之前,请 安装 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 值粘贴到令牌字段中,然后单击登录。
-
对 Kubernetes 仪表板操作完毕后,使用 CTRL+C
以退出 proxy
命令。 退出后,Kubernetes 仪表板不再可用。 运行 proxy
命令以重新启动 Kubernetes 仪表板。
接下来,您可以 从仪表板运行配置文件。
使用 Kubernetes 仪表板部署应用程序
使用 Kubernetes 仪表板将应用程序部署到集群时,部署资源会在集群中自动创建、更新和管理 pod。 有关使用仪表盘的更多信息,请参阅 Kubernetes 文档。
您的集群中是否有太多资源和用户,导致 Kubernetes 仪表板的速度有些慢? 集群管理员可以通过运行 kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3
来扩展 kubernetes-dashboard
部署。
准备工作
- 安装必需的 CLI。
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
- 确保为您分配了授予相应 Kubernetes RBAC 角色的 服务访问角色,以便您可以使用 Kubernetes 资源。
- 要 从控制台启动 Kubernetes 仪表板,必须分配一个 平台访问角色。 如果只分配了服务访问角色而没有分配平台访问角色,请 从 CLI 启动 Kubernetes 仪表板。
要部署应用程序,
-
在 Kubernetes 仪表板中,单击 + 创建。
-
通过下面两种方式之一来输入应用程序详细信息。
- 选择“指定应用程序详细信息”并输入详细信息。
- 选择上传 YAML 或 JSON 文件上传应用程序 配置文件。
需要配置文件的相关帮助? 请查看此 示例 YAML 文件。 在此示例中,将从美国南部区域中的 ibmliberty 映像部署容器。 使用 Kubernetes 资源时,请了解有关确保个人信息安全的更多信息。
-
通过下列其中一种方式验证是否已成功部署应用程序。
- 在 Kubernetes 仪表板中,单击部署。 这将显示成功部署的列表。
- 如果应用程序公开可用,请浏览至 IBM Cloud® Kubernetes Service 仪表板中的集群概述页面。 复制位于“集群摘要”部分中的子域,并将其粘贴到浏览器以查看应用程序。
使用 CLI 部署应用程序
创建集群后,可以使用 Kubernetes CLI 将应用程序部署到该集群。
准备工作
- 安装必需的 CLI。
- 登录您的账户。 如果适用,请将相应的资源组设定为目标。 设置集群的上下文。
- 确保为您分配了授予相应 Kubernetes RBAC 角色的 服务访问角色,这样您就可以在命名空间中使用 Kubernetes 资源。
要部署应用程序,
-
根据 Kubernetes 最佳实践创建配置文件。 通常,配置文件包含要在 Kubernetes 中创建的每个资源的配置详细信息。 脚本可能包含以下一个或多个部分:
-
部署:定义 pod 和副本集的创建。 pod 包含单个容器化应用程序,而副本集用于控制多个 pod 实例。
-
服务:通过使用工作节点或负载平衡器公共 IP 地址或公共入口路由,提供对 pod 的前端访问。
-
入口:指定一种负载平衡器,它提供公开访问应用程序的路由。
使用 Kubernetes 资源时,请了解有关确保个人信息安全的更多信息。
-
-
在集群上下文中运行配置文件。
kubectl apply -f config.yaml
-
如果使用 NodePort 服务、LoadBalancer 服务或 Ingress 使应用程序公共可用,请验证您是否可以访问该应用程序。
使用标签将应用程序部署到特定工作程序节点
部署应用程序时,应用程序 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.32_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 文件。 在此示例中,
Job
YAML 通过创建一个短命 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。