day01-了解k8s基础与核心组件

举报
yd_268505900 发表于 2026/11/05 11:36:57 2026/11/05
【摘要】 day01-了解k8s基础与核心组件

================================================================
DAY 01 —— 了解 Kubernetes 与核心组件
(基础概念 + 可落地操作步骤)
整理时间:2026-11-05    主要依据:kubernetes.io 官方中文文档
================================================================

【学习目标】
1. 说清楚 K8s 解决什么问题,和 Docker 的区别
2. 画出并讲明白一套集群的组件构成
3. 亲手起一个集群,跑通第一个 Pod
4. 掌握 kubectl 最常用的 15 条命令


----------------------------------------------------------------
一、K8s 是什么,为什么需要它
----------------------------------------------------------------
Kubernetes(K8s)是一个容器编排平台:把一堆机器组成一个"逻辑上的大电脑",
你只描述"我要 3 个 nginx 副本、暴露 80 端口",它负责调度、拉起、重启、扩缩容、滚动升级。

Docker 解决的是"单个容器怎么跑";
K8s 解决的是"成百上千个容器在多台机器上怎么稳定地跑"。

它提供的核心能力:
- 服务发现与负载均衡:Service / CoreDNS,Pod IP 会变,Service 名字不变
- 自动装箱:按 CPU/内存请求把 Pod 塞进合适的节点
- 自愈:容器挂了重启,节点挂了把 Pod 迁走
- 水平扩缩容:HPA 按 CPU/QPS 自动加副本
- 滚动更新与回滚:Deployment 一条命令完成
- 配置与密钥管理:ConfigMap / Secret
- 存储编排:PV / PVC,把 NFS、云盘挂进容器
- 批处理:Job / CronJob

一句话记住 K8s 的工作方式:声明式 API + 控制器循环(Controller Loop)。
你写"期望状态"(YAML),控制器不断把"实际状态"拉向"期望状态"。


----------------------------------------------------------------
二、集群架构:控制平面 + 工作节点
----------------------------------------------------------------
一个集群 = 控制平面(Control Plane,可多副本)+ 若干工作节点(Node)。

┌───────────────────── 控制平面 ─────────────────────┐
│  kube-apiserver     所有请求的唯一入口,REST API     │
│  etcd               分布式 KV,集群唯一事实来源       │
│  kube-scheduler     决定 Pod 调度到哪个节点           │
│  kube-controller-manager  跑各种控制器(副本/节点…)  │
│  cloud-controller-manager 对接云厂商(可选)          │
└─────────────────────────────────────────────────────┘
              │  (kubelet 主动 watch / 上报)
┌───────────────────── 工作节点 ─────────────────────┐
│  kubelet            节点上的"班长",管 Pod 生命周期   │
│  kube-proxy         维护 iptables/IPVS 规则实现 Service│
│  container runtime  containerd / CRI-O,真正跑容器    │
│  插件:CNI 网络(Calico/Flannel)、CSI 存储、CoreDNS  │
└─────────────────────────────────────────────────────┘

组件职责速记:
1) kube-apiserver
   - 唯一读写 etcd 的组件,其他组件都只跟它说话
   - 提供认证、授权(RBAC)、准入控制(Admission)
   - kubectl 本质上就是在调它
2) etcd
   - 保存所有对象(Pod/Service/Secret…)
   - 生产环境必须 3 或 5 节点奇数部署,做好快照备份
3) kube-scheduler
   - 两步:过滤(Filter,节点资源/污点/亲和性是否满足)→ 打分(Score,选最优)
   - 只决定"放哪",不负责启动;启动是目标节点 kubelet 干的
4) kube-controller-manager
   - 一堆控制器的集合:Deployment、ReplicaSet、Node、Job、EndpointSlice…
   - 每个控制器都在跑"期望 vs 实际"的调谐循环
5) kubelet
   - 注册节点、上报心跳与资源
   - 通过 CRI 调容器运行时创建/删除容器
   - 执行 liveness/readiness 探针
6) kube-proxy
   - 把 Service 的 ClusterIP 规则落到本机 iptables/IPVS
   - 新版也可用 eBPF(Cilium)替代其数据面
7) 容器运行时
   - K8s 1.24 起移除 dockershim,默认 containerd
   - 注意:镜像还是 Docker 格式,只是不再用 dockerd 跑

一个请求的完整链路(背下来,面试常问):
kubectl apply -f pod.yaml
  → apiserver 鉴权 + 准入 → 写入 etcd
  → scheduler watch 到未绑定的 Pod → 选出节点 → 写回 binding
  → 目标节点 kubelet watch 到分配给自己 → 调 CRI 拉镜像起容器
  → kubelet 上报状态 → apiserver 更新 etcd
  → (若创建了 Service)EndpointSlice 更新 → kube-proxy 刷新转发规则


----------------------------------------------------------------
三、必须搞懂的对象模型
----------------------------------------------------------------
- Pod:最小调度单元,1 个或多个共享网络/存储的容器
- ReplicaSet:保证 N 个 Pod 副本(一般不直接写)
- Deployment:管理 ReplicaSet,负责滚动更新/回滚(无状态首选)
- StatefulSet:稳定网络标识 + 稳定存储(MySQL、Kafka、ZK)
- DaemonSet:每个节点跑一个(日志采集、CNI、监控 agent)
- Job / CronJob:一次性/定时任务
- Service:稳定虚拟 IP + 负载均衡(ClusterIP/NodePort/LoadBalancer)
- Ingress:七层路由(域名/路径 → Service),需要 Ingress Controller
- ConfigMap / Secret:配置与敏感信息
- PV / PVC / StorageClass:持久化存储
- Namespace:逻辑隔离(不是网络隔离,网络隔离用 NetworkPolicy)
- HPA:按指标自动扩缩副本

命名空间层面记住几个默认的:
default(默认)、kube-system(系统组件)、kube-public、kube-node-lease


----------------------------------------------------------------
四、动手:30 分钟起一个可用集群
----------------------------------------------------------------
【方案 A:本机学习,最省事 —— kind(K8s in Docker)】
前置:装好 Docker,至少 4C8G。

# 1. 安装 kind(Linux amd64)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
chmod +x ./kind && sudo mv ./kind /usr/local/bin/kind

# 2. 建一个 1 主 2 从的集群(默认单节点也能用,多节点更贴近真实)
cat > kind-config.yaml <<'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
kind create cluster --name demo --config kind-config.yaml

# 3. 验证
kubectl cluster-info --context kind-demo
kubectl get nodes -o wide

【方案 B:单机全功能 —— minikube】
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start --driver=docker --cpus=4 --memory=8192
minikube status

【方案 C:真实服务器 —— kubeadm(生产同款,务必先关 swap)】
# 所有节点
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
modprobe br_netfilter
cat >/etc/modules-load.d/k8s.conf <<'EOF'
overlay
br_netfilter
EOF
cat >/etc/sysctl.d/k8s.conf <<'EOF'
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sysctl --system

# 装 containerd(略去 apt 源细节)+ kubelet/kubeadm/kubectl(同版本,如 1.31)
# 控制平面初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<master-ip>
mkdir -p $HOME/.kube && cp /etc/kubernetes/admin.conf $HOME/.kube/config

# 装 CNI(这里用 Flannel,与上面网段对应)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# 工作节点加入(用 init 输出里的命令)
kubeadm join <master-ip>:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

# 单机实验可去掉 master 污点
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

生产提示:kubeadm 只是"引导器",证书 1 年到期要 kubeadm certs renew;
真正生产建议至少 3 master + etcd 独立盘,或用托管 K8s(ACK/EKS/TKE)。


----------------------------------------------------------------
五、第一个 Pod:从命令到 YAML
----------------------------------------------------------------
# 1. 最快方式(命令式,仅用于试验)
kubectl run nginx-demo --image=nginx:1.27 --port=80
kubectl get pods -o wide
kubectl describe pod nginx-demo
kubectl logs nginx-demo

# 2. 正规方式(声明式,YAML)
cat > nginx-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.27
    ports:
    - containerPort: 80
    resources:
      requests: {cpu: "100m", memory: "128Mi"}
      limits:   {cpu: "500m", memory: "256Mi"}
EOF
kubectl apply -f nginx-pod.yaml

# 3. 临时进容器看看
kubectl exec -it nginx -- sh
# 容器内:curl -I localhost

# 4. 端口转发到本机(调试神器)
kubectl port-forward pod/nginx 8080:80
# 另开终端:curl localhost:8080

# 5. 删除
kubectl delete -f nginx-pod.yaml
# 或 kubectl delete pod nginx

注意:直接创建的 Pod 没有控制器兜底,删了就没了、节点挂了也不会重建。
真实业务请用 Deployment(Day 02 讲)。


----------------------------------------------------------------
六、kubectl 必会 15 条命令
----------------------------------------------------------------
kubectl get nodes -o wide                 # 节点与内网 IP、运行时版本
kubectl get pods -A -o wide               # 全命名空间 Pod 及所在节点
kubectl get all -n default                # 常用资源一把梭
kubectl describe pod <name>               # 排障第一命令,看 Events
kubectl logs <pod> [-c 容器] [-f] [--previous]   # 看崩溃前的日志用 --previous
kubectl exec -it <pod> -- bash            # 进容器
kubectl apply -f x.yaml                   # 声明式创建/更新
kubectl delete -f x.yaml                  # 声明式删除
kubectl edit deploy <name>                # 在线改(会触发滚动更新)
kubectl scale deploy <name> --replicas=5  # 扩缩容
kubectl rollout status deploy/<name>      # 看发布进度
kubectl rollout undo deploy/<name>        # 回滚上一版
kubectl get events --sort-by=.lastTimestamp -A   # 集群事件时间线
kubectl top pod / top node                # 需要 metrics-server
kubectl api-resources                     # 查资源短名(po/svc/deploy/cm…)

提速小技巧:
alias k=kubectl
export KUBE_EDITOR=vim
kubectl config get-contexts / use-context <name>   # 多集群切换


----------------------------------------------------------------
七、Day 01 自检清单
----------------------------------------------------------------
[ ] 能不看资料画出控制平面 + Node 组件图
[ ] 能讲清 kubectl apply 之后 Pod 是怎么被创建出来的
[ ] 集群 kubectl get nodes 全部 Ready
[ ] 成功跑起 nginx Pod 并用 port-forward 访问到欢迎页
[ ] 会用 describe + logs + events 三件套定位"Pod 起不来"
[ ] 知道 Deployment 和裸 Pod 的区别

常见坑:
- Pod 一直 ContainerCreating:多半在拉镜像,describe 看 Events
- ImagePullBackOff:镜像名错 / 私有仓库没配 imagePullSecrets / 网络不通
- Pending:节点资源不足、有污点、亲和性不满足 → describe 看原因
- 节点 NotReady:kubelet 挂了、CNI 没装、磁盘压力 → systemctl status kubelet

----------------------------------------------------------------
下一篇:Day 02 —— 部署 Pod 的几种方式(命令、YAML、Deployment、
DaemonSet、Job/CronJob、静态 Pod,含探针与调度约束)
----------------------------------------------------------------

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。