Kubernetes 运维实践指南
Kubernetes 集群运维的实用技巧和最佳实践。
Kubectl 常用技巧
批量删除 Job
删除所有以 foo-bar 开头的 Job:
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 | 批量删除 |
预览删除列表(不执行删除):
kubectl get jobs -o name | grep 'foo-bar'
指定命名空间:
kubectl get jobs -n your-namespace -o name | grep 'foo-bar' | xargs kubectl delete -n your-namespace
设置默认 StorageClass
1. 查看现有 StorageClass
kubectl get storageclass
2. 设置默认 StorageClass
将 my-storage-class 设置为默认:
kubectl patch storageclass my-storage-class -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
3. 移除其他默认标记
如果之前有其他默认 StorageClass,需要移除:
kubectl patch storageclass old-default-storage-class -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
4. 验证设置
kubectl get storageclass
查看 my-storage-class 的注解是否为 true。
镜像管理
查询特定镜像仓库的所有镜像
查询 Kubernetes 集群上所有以 docker.foobar.com 开头的 Pod 镜像,并去重排序:
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 参数表示唯一) |
脚本方式:
#!/bin/bash
# 查询并去重排序镜像
kubectl get pods --all-namespaces -o jsonpath="{..image}" | \
tr -s '[[:space:]]' '\n' | \
grep '^docker\.foobar\.com' | \
sort -u
保存为 get-images.sh 后执行:
chmod +x get-images.sh
./get-images.sh
注意:
- 需要有查询所有命名空间 Pod 的权限
- 确保 kubectl 配置正确并能访问集群
JupyterHub 在 K8s 上的配置
LDAP 非加密端口支持
问题:JupyterHub 的 LDAP 认证默认只支持 LDAPS(加密端口),对于使用非加密 LDAP 端口的场景无法正常工作。
原因:jupyterhub-ldapauthenticator 包中的 use_ssl 参数逻辑有问题,导致非加密连接时使用了错误的绑定模式。
解决方案:通过 Dockerfile 修改认证器源码,修复 use_ssl 逻辑:
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 配置示例:
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' |
节点选择:
'node_selector': {
'disktype': 'ssd', # 磁盘类型
'workload': 'compute', # 工作负载类型
'zone': 'us-east-1a' # 可用区
}
Tolerations(容忍度):
'tolerations': [
{
'key': 'gpu',
'operator': 'Equal',
'value': 'true',
'effect': 'NoSchedule'
}
]
部署配置:
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_limit和mem_limit会限制 Pod 的最大资源使用- GPU 资源需要先安装 NVIDIA Device Plugin