K8s

【Kubernetes】部署gaiaGPU(vCUDA)
3 minutes

部署GaiaGPU

前置工作

  • 配置好GPU环境
  • 配置好k8s集群环境

gpu-admission

部署deployment

创建文件gpu-quota-admission.yaml

---
apiVersion: 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: gpu-admission
  namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gpu-admission-as-kube-scheduler
subjects:
- kind: ServiceAccount
  name: gpu-admission
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:kube-scheduler
  apiGroup: rbac.authorization.k8s.io
  
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gpu-admission-as-volume-scheduler
subjects:
- kind: ServiceAccount
  name: gpu-admission
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:volume-scheduler
  apiGroup: rbac.authorization.k8s.io
  
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gpu-admission-as-daemon-set-controller
subjects:
- kind: ServiceAccount
  name: gpu-admission
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: system:controller:daemon-set-controller
  apiGroup: rbac.authorization.k8s.io

---
# 创建控制器
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: gpu-quota-admission
  name: gpu-quota-admission
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: gpu-quota-admission
  template:
    metadata:
      labels:
        k8s-app: gpu-quota-admission
      namespace: kube-system
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: node-role.kubernetes.io/master
                operator: Exists
            weight: 1
      containers:
      - env:
        - name: LOG_LEVEL
          value: "4"
        - name: EXTRA_FLAGS
          value: --incluster-mode=true
        image: ccr.ccs.tencentyun.com/tkeimages/gpu-quota-admission:latest
        imagePullPolicy: IfNotPresent
        name: gpu-quota-admission
        ports:
        - containerPort: 3456
          protocol: TCP
        resources:
          limits:
            cpu: "2"
            memory: 2Gi
          requests:
            cpu: "1"
            memory: 1Gi
        volumeMounts:
        - mountPath: /root/gpu-quota-admission/
          name: config
      dnsPolicy: ClusterFirstWithHostNet
      initContainers:
      - command:
        - sh
        - -c
        - ' mkdir -p /etc/kubernetes/ && cp /root/gpu-quota-admission/gpu-quota-admission.config
          /etc/kubernetes/'
        image: busybox
        imagePullPolicy: Always
        name: init-kube-config
        securityContext:
          privileged: true
        volumeMounts:
        - mountPath: /root/gpu-quota-admission/
          name: config
      priority: 2000000000
      priorityClassName: system-cluster-critical
      restartPolicy: Always
      serviceAccount: gpu-admission
      terminationGracePeriodSeconds: 30
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
      volumes:
      - configMap:
          defaultMode: 420
          name: gpu-quota-admission
        name: config

---
# 创建configMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: gpu-quota-admission
  namespace: kube-system
data:
  gpu-quota-admission.config: |
    {
         "QuotaConfigMapName": "gpuquota",
         "QuotaConfigMapNamespace": "kube-system",
         "GPUModelLabel": "gaia.tencent.com/gpu-model",
         "GPUPoolLabel": "gaia.tencent.com/gpu-pool"
     }

---
# 创建service
apiVersion: v1
kind: Service
metadata:
  name: gpu-quota-admission
  namespace: kube-system
spec:
  ports:
  - port: 3456
    protocol: TCP
    targetPort: 3456
  selector:
    k8s-app: gpu-quota-admission
  type: ClusterIP
kubectl apply -f gpu-quota-admission.yaml

创建自定义调度文件

创建文件/etc/kubernetes/scheduler-policy-config.json

【论文笔记】GaiaGPU论文阅读笔记
11 minutes

《GaiaGPU:Sharing GPUs in Container Clouds》论文笔记

Abstract

  • 对于云服务的提供商, 如何在容器间共享GPU, 是一个有吸引力的问题
    • 容器的轻量与伸缩性
    • GPU强大的并行计算能力
    • 在云环境,容器需要使用一个或多个GPU来满足资源需要的同时, 容器独占式的GPU往往使用率很低
  • 我们提出GaiaGPU,能够在容器间共享显存和算力
    • 将物理GPU划分为多个虚拟GPU
    • 采用弹性资源分配动态资源分配来提高资源利用率
    • 实验结果显示, 有效的实现了容器间资源的分配和隔离的同时,平均只增加了1.015%的开销。

Introduction

  • 容器化是一种虚拟化技术
    • 涉及到量身定制一个标准操作系统,方便它在一个物理机上运行由多个用户处理的不同应用程序
    • 与VM模拟底层硬件不同
      • 容器模拟的是操作系统
      • 轻量,可伸缩,易部署
      • 微服务打包与发布应用的事实标准
    • 云服务提供商整合容器编排框架(如k8s)到基础架构中来提供容器云
  • GPU 图像处理单元
    • 有很强的并行处理能力
      • 因为一个芯片上集成了数以千计的计算核
      • GPU被广泛用于计算密集型任务,以加快计算
      • 随着技术的发展趋势,现代GPU内将集成入越来越多的计算资源
    • CUDA是多功能GPU最流行的平台,提供了API方便GPU的使用
    • 卓越的性能吸引了很多云提供商将GPU引入云环境
      • 在云环境中,部署在容器中的一个应用程序可能需要一个或多个GPU才能执行,
      • 而另一方面,应用程序的专用GPU资源导致资源不足。
      • 因此,如何在不同的容器中共享GPU对大多数云提供商都非常感兴趣
  • GPU虚拟化技术是在隔离的虚拟环境(例如VM, 容器)之间共享GPU的技术
    • 多数的GPU虚拟化技术应用于VM, 容器间的虚拟化技术还在起始阶段
    • 现阶段的基于容器的GPU虚拟化技术有以下局限性
      • 需要特定的硬件设备(NVIDIA GRID)
      • 将一整个GPU分配给单个容器, 不能共享 (NVIDIA Docker)
      • 容器间只能共享GPU显存 (ConvGPU)
      • 只支持单个GPU (ConvGPU)
  • 我们提出GaiaGPU,能够在容器间透明地共享显存和算力
    • 用户不用修改容器镜像来共享底层GPU
      • 我们使用k8s的device plugin 框架将物理GPU划分为多个虚拟GPU
    • 每个镜像可以按需分配一个或者多个vGPU
    • 提供了两者方式在运行时更改镜像资源
      • 弹性资源分配:暂时改变资源
      • 动态资源分配:永久改变资源
  • vGPU包括GPU显存和计算资源
    • 共享显存
      • 容器包含GPU显存的一小部分
      • vGPU分配的是GPU的物理内存
    • 共享计算资源
      • 共享计算资源意味着每个容器都拥有GPU线程的一部分以并行执行计算。
      • VGPU的计算资源由GPU的利用率衡量(采样时段内, 容器使用GPU的时间比例)
  • 总结:本文做了如下贡献
    • 提出了GaiaGPU:一种在容器间透明共享显存与算力的方法
    • 采用弹性分配和动态分配的方式提高了资源的利用率
    • 进行了四个实验来验证GaiaGPU的性能。结果:实现了容器间资源的分配和隔离的同时,平均只增加了1.015%的开销。

GPU虚拟化

  • 被应用于在多个虚拟环境之间分享GPU, 极大地提高了应用性能

【Kubernetes】ubuntu安装k8s集群
6 minutes

在ubuntu上k8s集群部署实践

centos 上安装建议看 后端 - CentOS 搭建 K8S,一次性成功,收藏了!_个人文章 - SegmentFault 思否

一、机器配置

配置主机名

sudo hostnamectl set-hostname "k8s-master"    // Run this command on masternode
cat /etc/hostname
sudo hostnamectl set-hostname "k8s-node1"     // Run this command on node-0
sudo hostnamectl set-hostname "k8s-node2"     // Run this command on node-1

配置/etc/hosts

sudo vi /etc/hosts 

10.1.13.106    k8s-master

#10.1.13.107    k8s-node1

#10.1.13.108    k8s-node1

配置免密登录(可以省略)

想让机器 A 访问机器 B,就把机器 A 的公钥放到机器 B 的~/.ssh/authorized_keys 文件里就行了。