Kubernetes 集群运维的实用技巧和最佳实践。

Kubectl 常用技巧

批量删除 Job

删除所有以 foo-bar 开头的 Job:

1
kubectl get jobs -o name | grep 'foo-bar' | xargs kubectl delete

命令说明:

部分 作用
kubectl get jobs -o name 列出所有 Job 名称
grep 'foo-bar' 过滤以 foo-bar 开头的 Job
xargs kubectl delete 批量删除

预览删除列表(不执行删除):

1
kubectl get jobs -o name | grep 'foo-bar'

指定命名空间:

1
kubectl get jobs -n your-namespace -o name | grep 'foo-bar' | xargs kubectl delete -n your-namespace

设置默认 StorageClass

1. 查看现有 StorageClass

1
kubectl get storageclass

2. 设置默认 StorageClass

my-storage-class 设置为默认:

1
kubectl patch storageclass my-storage-class -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

3. 移除其他默认标记

如果之前有其他默认 StorageClass,需要移除:

1
kubectl patch storageclass old-default-storage-class -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

4. 验证设置

1
kubectl get storageclass

查看 my-storage-class 的注解是否为 true


镜像管理

查询特定镜像仓库的所有镜像

查询 Kubernetes 集群上所有以 docker.foobar.com 开头的 Pod 镜像,并去重排序:

1
kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | grep '^docker\.foobar\.com' | sort -u

命令说明:

命令部分 作用
kubectl get pods --all-namespaces -o jsonpath="{..image}" 获取所有命名空间中 Pod 的镜像信息
tr -s '[[:space:]]' '\n' 将空格转换为换行符,每个镜像占一行
grep '^docker\.foobar\.com' 过滤以 docker.foobar.com 开头的镜像
sort -u 排序并去重(-u 参数表示唯一)

脚本方式:

1
2
3
4
5
6
7
#!/bin/bash

# 查询并去重排序镜像
kubectl get pods --all-namespaces -o jsonpath="{..image}" | \
tr -s '[[:space:]]' '\n' | \
grep '^docker\.foobar\.com' | \
sort -u

保存为 get-images.sh 后执行:

1
2
chmod +x get-images.sh
./get-images.sh

注意:

  • 需要有查询所有命名空间 Pod 的权限
  • 确保 kubectl 配置正确并能访问集群

JupyterHub 在 K8s 上的配置

LDAP 非加密端口支持

问题:JupyterHub 的 LDAP 认证默认只支持 LDAPS(加密端口),对于使用非加密 LDAP 端口的场景无法正常工作。

原因jupyterhub-ldapauthenticator 包中的 use_ssl 参数逻辑有问题,导致非加密连接时使用了错误的绑定模式。

解决方案:通过 Dockerfile 修改认证器源码,修复 use_ssl 逻辑:

1
2
3
4
5
6
7
8
FROM jupyterhub/k8s-hub:latest

USER root
# 修复 LDAP authenticator use_ssl 问题
RUN FILEPATH=`python -c "import pkg_resources; import os; print(os.path.join(pkg_resources.get_distribution('jupyterhub-ldapauthenticator').location, 'ldapauthenticator', 'ldapauthenticator.py'))"` && \
sed -i 's/ldap3.AUTO_BIND_NO_TLS if self.use_ssl else ldap3.AUTO_BIND_TLS_BEFORE_BIND/ldap3.AUTO_BIND_NO_TLS if not self.use_ssl else ldap3.AUTO_BIND_TLS_BEFORE_BIND/g' ${FILEPATH}

USER jovyan

这个修复将原来的 if self.use_ssl 改为 if not self.use_ssl,确保:

  • 非加密连接时使用 AUTO_BIND_NO_TLS
  • 加密连接时使用 AUTO_BIND_TLS_BEFORE_BIND

ProfileList 配置

在 K8s 上部署 JupyterHub 时,可以让用户在启动 Notebook 时选择不同的资源配置(如 4G/8G 内存,不同节点类型)。

配置方式:通过 KubeSpawner.profile_list 配置多个资源配置选项。

values.yaml 配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
hub:
extraConfig:
profileList: |
c.KubeSpawner.profile_list = [
{
'display_name': '小型环境 (4G 内存)',
'description': '适合轻量级数据分析任务',
'kubespawner_override': {
'cpu_limit': 1,
'cpu_guarantee': 0.5,
'mem_limit': '4G',
'mem_guarantee': '2G',
'node_selector': {
'disktype': 'ssd',
'workload': 'general'
}
}
},
{
'display_name': '大型环境 (8G 内存)',
'description': '适合大规模数据处理和模型训练',
'kubespawner_override': {
'cpu_limit': 2,
'cpu_guarantee': 1,
'mem_limit': '8G',
'mem_guarantee': '4G',
'node_selector': {
'disktype': 'ssd',
'workload': 'compute'
}
}
},
{
'display_name': 'GPU 环境',
'description': '配备 GPU 用于深度学习',
'kubespawner_override': {
'cpu_limit': 4,
'mem_limit': '16G',
'extra_resource_limits': {
'nvidia.com/gpu': '1'
},
'node_selector': {
'accelerator': 'nvidia-tesla-v100'
}
}
}
]

配置项说明

配置项 说明 示例
cpu_limit CPU 上限 2 (2 核)
cpu_guarantee CPU 保证值 1 (1 核)
mem_limit 内存上限 '8G'
mem_guarantee 内存保证值 '4G'

节点选择

1
2
3
4
5
'node_selector': {
'disktype': 'ssd', # 磁盘类型
'workload': 'compute', # 工作负载类型
'zone': 'us-east-1a' # 可用区
}

Tolerations(容忍度)

1
2
3
4
5
6
7
8
'tolerations': [
{
'key': 'gpu',
'operator': 'Equal',
'value': 'true',
'effect': 'NoSchedule'
}
]

部署配置

1
2
3
4
5
6
7
8
RELEASE=jhub
NAMESPACE=jhub

helm upgrade --install $RELEASE jupyterhub/jupyterhub \
--namespace $NAMESPACE \
--create-namespace \
--version=3.0.0 \
--values config.yaml

注意事项

  • 批量删除操作不可逆,执行前务必确认
  • 同一时间只能有一个默认 StorageClass
  • 修改 StorageClass 需要相应的集群权限
  • 节点必须提前打好对应的标签:kubectl label nodes node1 disktype=ssd
  • cpu_limitmem_limit 会限制 Pod 的最大资源使用
  • GPU 资源需要先安装 NVIDIA Device Plugin

参考文档