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 |
|
保存为 get-images.sh 后执行:
1 | chmod +x get-images.sh |
注意:
- 需要有查询所有命名空间 Pod 的权限
- 确保 kubectl 配置正确并能访问集群
JupyterHub 在 K8s 上的配置
LDAP 非加密端口支持
问题:JupyterHub 的 LDAP 认证默认只支持 LDAPS(加密端口),对于使用非加密 LDAP 端口的场景无法正常工作。
原因:jupyterhub-ldapauthenticator 包中的 use_ssl 参数逻辑有问题,导致非加密连接时使用了错误的绑定模式。
解决方案:通过 Dockerfile 修改认证器源码,修复 use_ssl 逻辑:
1 | FROM jupyterhub/k8s-hub:latest |
这个修复将原来的 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 | hub: |
配置项说明:
| 配置项 | 说明 | 示例 |
|---|---|---|
cpu_limit |
CPU 上限 | 2 (2 核) |
cpu_guarantee |
CPU 保证值 | 1 (1 核) |
mem_limit |
内存上限 | '8G' |
mem_guarantee |
内存保证值 | '4G' |
节点选择:
1 | 'node_selector': { |
Tolerations(容忍度):
1 | 'tolerations': [ |
部署配置:
1 | RELEASE=jhub |
注意事项
- 批量删除操作不可逆,执行前务必确认
- 同一时间只能有一个默认 StorageClass
- 修改 StorageClass 需要相应的集群权限
- 节点必须提前打好对应的标签:
kubectl label nodes node1 disktype=ssd cpu_limit和mem_limit会限制 Pod 的最大资源使用- GPU 资源需要先安装 NVIDIA Device Plugin