01. Kubernetes 是什么、解决什么问题
Kubernetes(简称 K8s,8 代表 k 和 s 中间省略的 8 个字母)是容器编排平台。当你需要管理几十上百个容器时——部署到哪些机器、负载均衡、故障恢复、滚动更新——手动操作是不可能的。K8s 就是干这事的自动化大管家。
K8s 的四大核心能力:
1. 自动调度——你告诉 K8s 你想跑几个容器,它自己决定跑在哪些机器上。
2. 自动修复——容器挂了自动重启,节点挂了自动把上面容器迁走。
3. 滚动更新——更新应用时一个一个替换,服务不中断。
4. 服务发现和负载均衡——容器之间通过服务名互相找到,自动负载均衡。
K8s 的架构:控制平面(Master 节点,负责决策)和工作节点(Worker 节点,负责跑容器)。控制平面包括 API Server、etcd(存储所有配置)、Scheduler(调度)、Controller Manager(控制器)。
02. 核心概念——Node、Pod、Service
K8s 有几个核心概念,搞懂了就入门了:
Node——物理机或虚拟机,也就是工作节点。上面跑着 kubelet(跟控制平面对接的代理)和容器运行时(Docker 或 containerd)。
Pod——K8s 调度的最小单位,不是容器。一个 Pod 里可以有 1 个或多个容器,它们共享网络和存储、在同一个 Node 上。大多数情况下一个 Pod 只跑一个容器,多容器 Pod 用于 Sidecar 模式。
Service——一组 Pod 的抽象。Pod 是临时的,IP 会变,挂了重建后 IP 可能不一样。Service 给这组 Pod 提供一个固定的虚拟 IP 和 DNS 名,你永远用 Service 名访问,不管后面 Pod 怎么变。
Deployment——管理 Pod 的控制器。你定义想跑几个副本、用什么镜像、怎么更新,Deployment 去实现并维持你想要的这个状态。
bash
# 查看节点
kubectl get nodes
# 查看 Pod
kubectl get pods
kubectl get pods -o wide # 看到分配在哪个 Node 上
# 查看 Service
kubectl get svc
# 查看 Deployment
kubectl get deployments03. kubectl——你对 K8s 的唯一操作入口
kubectl 是 K8s 的命令行客户端。你对 K8s 的一切操作——创建、查看、更新、删除——全通过 kubectl 发给 API Server。
kubectl 的基本语法:kubectl 动作 资源类型 资源名 选项。比如 kubectl get pods、kubectl describe pod my-pod、kubectl delete pod my-pod。
常用动作:get(查)、describe(详情)、create(建)、apply(声明式创建/更新,推荐)、delete(删)、logs(看日志)、exec(进容器执行命令)。
资源类型简写:pod/po、service/svc、deployment/deploy、configmap/cm、namespace/ns。记不住用 kubectl api-resources 看。
bash
# 常用 kubectl 命令
kubectl get pods -A # 所有命名空间的 Pod
kubectl describe pod my-pod # Pod 详细信息和事件
kubectl logs my-pod # Pod 日志
kubectl logs my-pod -c my-container # 指定容器日志
kubectl exec -it my-pod -- sh # 进容器
kubectl apply -f deployment.yaml # 声明式部署
kubectl delete -f deployment.yaml # 删除
kubectl port-forward my-pod 8080:80 # 端口转发kubectl explain pod.spec 非常有用——直接在命令行里查某个 K8s 资源的字段说明,不用翻文档。
04. YAML 配置的基本结构
K8s 里一切皆 YAML。每个 K8s 对象的 YAML 都遵循同样的结构——四个顶级字段:apiVersion、kind、metadata、spec(有些有 status,但那是 K8s 填的,不是你写的)。
apiVersion——K8s API 的版本,决定了哪些字段可用。比如 apps/v1(Deployment)、v1(Pod、Service)。
kind——资源类型,如 Pod、Service、Deployment、ConfigMap。
metadata——元数据,至少要有 name。可以加 labels(标签,用于筛选)、namespace(命名空间)。
spec——期望的状态,这是你最常写的部分。不同资源的 spec 完全不同。
yaml
# Pod 的 YAML 示例
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
# 应用这个文件
kubectl apply -f pod.yamlkubectl explain 资源名 能看某个资源类型的字段说明和默认值,特别适合不记得 fields 的时候。
05. Namespace——资源隔离
Namespace 是 K8s 里的虚拟分区——你在一个 Namespace 里创建的资源,在别的 Namespace 里看不到(除非你指定)。适合多团队共享同一个集群、或者按环境隔离(dev/staging/prod)。
默认有四个 Namespace:default(默认)、kube-system(K8s 自己的组件)、kube-public(公共的 ConfigMap 等)、kube-node-lease(节点心跳)。
大部分命令默认操作 default Namespace。要操作别的 Namespace 加 -n 参数,或者用 kubectl config set-context 改默认 Namespace。
注意:不是所有资源都支持 Namespace——Node、PersistentVolume 是集群级别的,不属于任何 Namespace。用 kubectl api-resources --namespaced 看哪些支持 Namespace。
bash
# 创建 Namespace
kubectl create namespace dev
# 在指定 Namespace 操作
kubectl get pods -n dev
kubectl apply -f app.yaml -n prod
# 切换默认 Namespace
kubectl config set-context --current --namespace=dev
# 查看所有 Namespace 的资源
kubectl get pods --all-namespaces
kubectl get pods -A生产环境一定用不同的 Namespace 隔离环境。dev 和 prod 混在同一个 Namespace 里就是在找麻烦。
知识测验
第 1/5 题正确 0
K8s 调度的最小单位是什么?
下一节
下一节 Pod 详解