
暑假运维考核总结
感觉这几天折腾 K8s 够我这个知识库以后可能会用到的很多内容了,虽然熟练之后可能就不怎么会用到了,但是如果以后生了需要重新熟悉这个东西还是需要的。
部署 K8s
部署 K8s 挺简单的,只需要 Sealos 一把梭就行了
(不过如果要手动部署的话还是有点要命的
安装 Sealos
echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | sudo tee /etc/apt/sources.list.d/labring.list
sudo apt update
sudo apt install sealos
上面是通过包管理器来安装 Sealos,其它的安装方法可以参考官方文档
安装集群
要注意选择合适的版本,K8s 的生命周期感觉不怎么长,所以更新比较频繁,可以在轩辕镜像中查镜像的版本,下面的镜像我也换成了轩辕镜像。
注意 Sealos 如果是 5.0.0 版本及以上的,下面的镜像要找带 -5.0.1
这样的字眼的。
sealos run docker.xuanyuan.me/labring/kubernetes:v1.29.9 docker.xuanyuan.me/labring/helm:v3.9.4 docker.xuanyuan.me/labring/cilium:v1.13.4 --single
K8s 一些常见命令
# 获取资源
kubectl get [资源类型] [资源名称] [选项]
- 资源类型:常见的资源有 node、deployment、pod、namespace(ns)、service(svc),资源详解将在后文提出
- 选项:
-n
指定命名空间-o
指定输出格式-A
输出上述全部资源,其它资源如 ingress 可能不会列出-l
获取指定标签资源
# 获取特定资源详细信息
kubectl describe [资源类型] [资源名称] [选项]
参数内容和上述基本一致
# 查看指定 pod 的日志
kubectl logs [pod 名称] [选项]
- 选项:
--tail
指定输出最后几行
# 获取特定资源详细信息
kubectl delete [资源类型] [资源名称]
参数内容和上述基本一致
注:k8s pod 中没有重启一说,只能通过删除 pod 来达到重启的目的
# 配置应用资源
kubectl apply -f [CRD 资源文件] [选项]
- CRD 资源文件:通过 YAML 文件定义的资源结构
# 基于文件或标准输入创建一个资源。
# 接受 JSON 和 YAML 格式。
kubectl create -f [CRD 资源文件]
参数内容和上述基本一致
# 进入指定 pod 内部
kubectl exec -it [pod 名称] /bin/bash
如有需要,可使用 -n
指定 pod 所在命名空间
# 使用策略合并补丁、JSON 合并补丁或 JSON 补丁来更新某资源的字段。
# 接受 JSON 和 YAML 格式。
kubectl patch (-f FILENAME | TYPE NAME) [-p PATCH|--patch-file FILE]
官方示例:
# 使用策略合并补丁部分更新节点,指定补丁为 JSON 格式
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
# 使用策略合并补丁部分更新节点,指定补丁为 YAML 格式
kubectl patch node k8s-node-1 -p $'spec:\n unschedulable: true'
# 使用策略合并补丁部分更新以在 "node.json" 中所指定类别和名称标识的节点
kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}'
# 更新容器的镜像;spec.containers[*].name 是必需的,因为它是合并键
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
# 使用带有位置数组的 JSON 补丁更新容器的镜像
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
# 使用合并补丁通过 “scale” 子资源更新 Deployment 的副本
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'
具体指令使用方法请参考官方文档:https://kubernetes.io/zh-cn/docs/reference/kubectl/generated/
资源类型
1. 工作负载类
此类资源决定了你的应用程序如何运行和扩展:
-
Pod(po)
K8S最小的可调度单元,是容器的载体。实际生产中很少直接运维裸Pod,通常用在Job等场景。 -
ReplicaSet(rs)
保证指定副本数的Pod持续运行。多由Deployment控制间接管理,不直接编写。 -
Deployment(deploy)
最常用的部署资源,支持回滚、滚动升级。日常生产用的最多,如Web应用、API服务等。 -
StatefulSet(sts)
有状态服务(如MySQL、Redis集群)专用,Pod有固定标识符和持久存储。 -
DaemonSet(ds)
用于每个(或指定)Node上自动运行一个Pod,例如日志收集、监控agent。 -
Job / CronJob
Job用于一次性任务,CronJob实现定时调度(可类比Linux的crontab)。
2. 服务发现与负载均衡
-
Service(svc)
集群内持久服务入口,实现Pod间或外部服务访问负载均衡。 -
Endpoints / EndpointSlice
Service关联的实际Pod IP存储对象,自动管理,无需手动变更。 -
Ingress
七层路由,支持HTTP/S流量的准入、反向代理、SSL。
3. 存储管理
-
PersistentVolume(pv)、PersistentVolumeClaim(pvc)
PV是系统管理员提供的物理存储,PVC是用户申请的逻辑存储,两者绑定让Pod能持久存储。 -
StorageClass(sc)
提供动态存储卷选项,简化PVC自动分配。
4. 配置与密钥
-
ConfigMap(cm)
存储配置数据,诸如环境变量、配置文件。明文存储,非敏感信息。 -
Secret
存储敏感数据,例如密码、密钥、token,默认base64编码(需注意不是加密,生产需结合KMS等方案)。
5. 集群级管理
-
Namespace(ns)
多租户/隔离环境的实现基础,推荐每个业务系统独占一个namespace。 -
Node(no)
集群中的物理机/虚拟机。不可随意操作,部分命令需集群管理员权限。
7. 其他高阶与扩展
- CRD(CustomResourceDefinition)
用户自定义资源类型。实现Operator、Service Mesh、云原生数据库等扩展生态的基石。
更多详见:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/
其它补充
更换 containerd 镜像
有的时候创建 Pod 会卡在 Pull Image 的阶段,这可能是因为国内特殊的网络国情,这时候就需要使用镜像
配置镜像只需要修改 /etc/containerd/certs.d/docker.io/hosts.toml
这个文件就可以了
下面是一个文件示例:
server = "https://docker.io"
[host."https://dockerproxy.com"]
capabilities = ["pull", "resolve"]
修改完这个文件之后需要重启一下 containerd 服务:
systemctl restart containerd.service
测试效果:
sudo crictl pull docker.io/library/nginx:alpine
Longhorn PV
有的时候如果总的分配的 PV 大于存储空间,可能会导致 Pod 无法附加,这个时候记得扩容,或者上 Web UI 调整保留容量
挂载新磁盘的时候也要记得在 Web UI 挂载
有关访问 Web UI 的部分,详见:https://longhorn.io/docs/1.9.1/deploy/accessing-the-ui/