管理Kubernetes工作负载 | 大装置帮助中心
跳到主要内容

管理Kubernetes工作负载

Kubernetes中的资源管理,连接弹性算力池集群后,可通过编辑yaml文件或等效的kubectl完成。参考Kubernetes官方命令指导

SenseCore平台的联动和限制示例

Kubernetes官方示例yaml为基础示例基本使用流程。

工作负载的创建

示例yaml中nginx镜像未指定镜像仓库,Kubernetes会默认使用海外镜像仓库,此处替换为国内SenseCore上海01区存储的镜像,以保证更稳定的访问。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.sensetime.com/lepton/nginx:latest #此处使用稳定镜像源替代了示例yaml中的镜像地址。
ports:
- containerPort: 80

用户连接集群后,默认操作会在default命名空间中。假定Kubernetes集群是多人共用,当前用户仅在jackson命名空间中通过rolebinding绑定了edit角色,当前用户所有操作均需在jackson命名空间中完成。

  • 通过 kubectl config set-context --current --namespace=jackson 切换至jackson命名空间中。
    本页的后续操作,未特别指定namespace的命令执行、yaml提交,均会在此namespace中。
  • 提交上述yaml
  • 查看运行状态

通过SenseCore EIP进行服务发布

详见使用 Service 连接到应用,具体用例及步骤如下:

1. 创建Service,为三个Nginx提供统一流量入口。

示例通过命令行kubectl expose deployment/nginx-deployment创建后可看到为服务分配了"CLUSTER-IP"10.233.62.235。在SenseCore平台,"CLUSTER-IP"的路由可达范围不限于当前集群,与当前弹性算力池集群同VPC的容器、云主机等云资源均可以直接通过此地址访问Kubernetes中的服务。

2. 配置DNAT规则

NAT网关绑定EIP后,可以配置DNAT规则,将SenseCore集群中的service或Pod IP地址发布至Internet。示例如下:将上述的"CLUSTER-IP"10.233.62.235和"PORT"80填入DNAT配置中。详细步骤参见参见NAT网关操作指南

3. 连通性测试

配置完成后,本地浏览器中输入<EIP地址:EIP端口>即可通过Internet网络打开Nginx页面。

挂载GPU资源

在声明资源需求时,Kubernetes 并不会保证实际分配对应的资源,且默认不会分配 GPU 资源。因此,在生产环境中,应为工作负载中的每个容器明确设置所需的 CPU、内存、GPU 等资源。具体可参考以下示例,了解如何为工作负载添加指定类型的 GPU 资源。

进一步修改上文中的yaml如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.sensetime.com/lepton/nginx:latest
ports:
- containerPort: 80
resources:
requests:
nvidia.com/gpu: "1" # 示例请求 1 卡 GPU
limits:
nvidia.com/gpu: "1" # 限制使用 1 卡 GPU,GPU直通时对性能有更好的保证,限制limit与request一致。
nodeSelector:
lepton.sensetime.com/machine-type: "N6lS.Iu.I80" # 节点选择器,选择规格编码为N6lS.Iu.I80的节点,计算节点加入集群时,作自动打上SKU的规格编码标签,以便指定调度在特定GPU型号的节点上。

提交修改后的yaml,返回configured说明提交变更成功。
可按需查看变更后的配置和变更过程,kubectl describe deployment nginx-deployment ,旧的副本逐步由新的副本替代。
随机挑选一个副本,如“nginx-deployment-55f67fb856-z47m9”通过kubectl exec在容器内执行执行nvidia-smi可以看到容器已挂载了GPU。

挂载文件存储AFS卷

弹性算力池托管的Kubernetes集群中,预置了文件存储AFS提供的CSI。用户可通过创建及绑定PVC完成文件存储AFS卷和指定目录的挂载。

1. 找到有权限的AFS存储卷

2. 创建包含AK/SK信息的secret

  • 创建AK/SK或找到已有的AKSK,确保AKSK是启用状态

  • 将AK和SK分别进行编码

    • Linux/MacOS执行echo -n <AK或SK>
    • Windows PowerShell执行:[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("<AK或SK>"))
  • 写Secret文件并提交
    示例secret:

apiVersion: v1
kind: Secret
metadata:
name: jackson-aksk-secret
namespace: jackson
type: Opaque #配合上文编码方式和默认的安全策略使用
data:
accessKey: RDQ5NUQ1OEEyRTA4NEI3MDlDRjlGQTVDQ0Y4NEQyN0M=
secretKey: N0U0OUMxNUM4Nzk2NDRGRjhBMDJGQjlEREYwNkRBN0Y=
  • 提交至集群
  • (可选)查看提交结果

kubernetes的secret有多种填写方法和安全加固扩展机制,围绕不同场景对便捷或安全诉求,可以参考kubernetes官方文档调整

3. 创建PVC

  • 基于上文选择的文件存储AFS卷示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: quarkfs-pvc
annotations:
afs.endpoint: "quarkfs://172.31.16.106:6600;172.31.16.107:6600;172.31.16.108:6600/4527fb28-0ec5-11f0-8cef-5e82dd5eb179"
afs.secretName: "jackson-aksk-secret"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1000Mi
storageClassName: quarkfs-sc
  • 其它可选字段说明:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: quarkfs-pvc
annotations:
afs.subdir: "/subpath" #选填,如果只挂载AFS卷下已创建的特定目录时填写
afs.root_squash: "true" #选填,配置后,容器中任意用户对AFS的读写都会转换为SenseCore为IAM用户和用户组分配的uid、gid。
afs.endpoint: "endpoint" #必填,通过文件存储AFS控制台获得
afs.secretName: "jackson-aksk-secret" #必填,即前一步创建的secret
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1000Mi # 使用文件存储AFS时,此处仅作占位,真实可用大小由AFS控制
storageClassName: quarkfs-sc # 使用文件存储AFS时,storageClassName固定为quarkfs-sc。

  • yaml提交后pvc状态为Bound则说明创建成功

4. 修改工作负载配置绑定AFS存储

  • 在上文yaml基础上修改,增加AFS挂载相关配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.sensetime.com/lepton/nginx:latest
ports:
- containerPort: 80
resources:
requests:
nvidia.com/gpu: "1"
limits:
nvidia.com/gpu: "1"
volumeMounts: #新增卷挂载相关内容,填写规范与社区完全一致
- name: myafs
mountPath: "/mnt"
volumes:
- name: myafs
persistentVolumeClaim:
claimName: quarkfs-pvc
nodeSelector:
lepton.sensetime.com/machine-type: "N6lS.Iu.I80"
  • 通过kubectl apply -f提交更新后的yaml。

5. 查看挂载效果

  • 通过kubectl exec命令进入任意更新后的副本
  • 通过df -h命令会看到挂载至/mnt下的文件存储AFS卷(文件系统为quarkfs_client),空间大小同控制台看到的文件存储AFS卷大小(与PVC中申请无关)。

挂载节点本地存储

上文df -h命令查看到的overlayFS文件系统空间,使用的是用户购买的计算节点ACN本地盘空间。通过OverlayFS使用计算节点的本地磁盘空间,适合临时的读写场景,在Pod删除后数据会清除。 如需Pod终止时在本地盘继续保留数据,可通过host path等方式将本地盘路径挂载至容器中,配置方法和场景建议参考hostpath。 计算节点ACN允许用户挂载的hostpath路径包括。

目录路径允许操作适用场景
/data/<自定义子目录>读写业务数据持久化(如日志、临时文件)
/opt/<自定义子目录>读写应用程序依赖库或配置文件
/var/log/<子目录>只读日志采集(如Fluentd采集主机日志)
/mnt/<自定义子目录>读写临时存储或设备挂载(如GPU驱动)
/tmp/<容器专用目录>读写临时文件缓存(需容器内定期清理)

查看kubernetes中工作负载的日志和监控指标

1. 查看日志

除通过kubectl logs命令可以查看正在运行的Pod日志。在Pod结束后,可通过云监控/日志控制台,选择当前ECP集群,基于工作负载的名称等信息查询相关的日志,以便问题的排查。

2. SenseCore会默认采集节点的CPU、内存等关键指标和GPU的核心指标

弹性算力池集群在Kubernetes集群创建时,当前在kube-system命名空间部署了Grafana仪表盘,并预置了当前集群的集群概览、节点监控、GPU监控三个Dashboard。 Grafana的服务地址可通过控制台和命令看查询。 参考上文通过EIP的DNAT发布nginx服务方式,可按需将grafana仪发布至Internet或参考通过kubectl port-forward命令实现本机可访问dashboard方式,将grafana服务发布至本地端口后,通过浏览器可打开grafana仪表盘查看各项监控指标。