6 篇文章带有标签 “pod”

Kubernetes中配置调度器

我们遇到一个场景,压榨出每一台节点的性能,需要优先调度到资源(CPU、Memory)使用最多的节点上。

了解默认调度

现有的通用调度程序是平台默认提供的调度程序引擎,它可通过三步操作来选择托管 pod 的节点:

过滤节点

根据指定的约束或要求过滤可用的节点。这可以通过名为predicates的过滤函数列表筛选每个节点来完成。

排列过滤后节点列表的优先顺序

实现方式是让每个节点通过一系列优先级函数,以为其分配从 0 到 10 的一个分数。0 代表不适合的节点,10 则代表最适合托管该 pod。调度程序配置还可以为每个优先级函数使用简单的权重(正数值)。每个优先级函数提供的节点分数乘以权重(大多数优先级的默认权重为 1),然后将每个节点从所有优先级获得的分数相加。管理员可以使用这个权重属性,为一些优先级赋予更高的重要性。

选择最适合的节点

节点按照分数排序,系统选择分数最高的节点来托管该 pod。如果多个节点的分数相同,则随机选择其中一个。

配置调度策略 编写调度策略文件,配置优先级。 配置参与打分项及权重。这里使用了 MostRequestedPriority,优先使用占用 CPU 和 Memory 多的节点。 sudo vim /etc/kubernetes/scheduler-policy-config.

Kubernetes中的计算资源管理

查看节点资源总量

$ kubectl describe nodes ln1

Name:               ln1
...
Capacity:
  cpu:                40
  ephemeral-storage:  574345384Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             264015508Ki
  pods:               110
Allocatable:
  cpu:                40
  ephemeral-storage:  529316705019
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             263913108Ki
  pods:               110
  • Capacity, 节点的资源总量
  • Allocatable, 可分配给 Pod 的资源量

Pod 中的容器申请资源 定义 Pod,通过容器指定 CPU 和内存的资源请求量 #requests-pod.

Kubernetes JSONPath实践

Node

标签信息

查看单个节点

$ kubectl get node ln1 -o=jsonpath='{.metadata.labels}{"\n"}'
map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:ln1 kubernetes.io/os:linux node-role.kubernetes.io/master:]

查看集群所有节点 $ kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels}{"\n"}{end}' gpu1 map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux k8s.amazonaws.com/accelerator:vgpu kubernetes.io/arch:amd64 kubernetes.io/hostname:gpu1 kubernetes.

Kubernetes中的注解

注解

注解也是键值对,和标签类似,但没有对象的选择器来进行分组筛选,它可以容纳更多的内容(总共不超过256KB),主要用于工具的使用。Kubernetes 会将一些注解自动添加到对象。

增加(key=value)

添加域名(gouchicao.com)前缀这种格式的注解键是避免键冲突的一个好方法。

$ kubectl annotate pod kubia-manual gouchicao.com/someannotation="test"
pod/kubia-manual annotated

需要增加多个注解只需要使用空格进行分隔即可。

$ kubectl annotate pod kubia-manual key1=value1 key2=value2

查看 获取完整的 YAML 描述(-o yaml) $ kubectl get pod kubia-manual -o yaml apiVersion: v1 kind: Pod metadata: annotations: gouchicao.com/someannotation: test kubectl.kubernetes.

Kubernetes中的标签和标签选择器

标签

标签是键值对的形式,用于组织 Kubernetes 资源,为对象进行分组。只要标签的 key 在资源内是唯一的,一个资源便可以拥有多个标签。

通过添加两个标签将 Pod 组织为两个维度(基于应用的横向维度和基于版本的纵向维度)

编写带标签的 Pod YAML文件(kubia-manual-labels.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-v2
  labels:
    app: sc
    rel: stable
spec:
  containers:
  - image: wangjunjian/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

创建带标签的 Pod

$ kubectl apply -f kubia-manual-labels.yaml
pod/kubia-manual-v2 created

查看 Pod 的标签(--show-labels) $ kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS kubia-864465c9d-744qc 1/1 Running 0 5d3h app=kubia,pod-template-hash=864465c9d

通过端口转发连接Pod

通过端口转发(port-forward)可以连接到 Pod,方便测试和调试服务。

创建 Pod

编写 Pod YAML文件(kubia-manual.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: wangjunjian/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

创建 Pod

$ kubectl apply -f kubia-manual.yaml 
pod/kubia-manual created

查看 Pod

$ kubectl get pod kubia-manual
NAME           READY   STATUS    RESTARTS   AGE
kubia-manual   1/1     Running   0          77s

查看 Pod 的完整描述

  • YAML 格式
$ kubectl get pod kubia-manual -o yaml
  • JSON 格式
$ kubectl get pod kubia-manual -o json

日志查看

logs 是查看容器的日志,Pod 只有一个容器时,可以忽略容器名。

$ kubectl logs kubia-manual 
Kubia server starting...