Kubernetes(K8s)从入门到精通:一篇彻底搞懂云原生核心

Kubernetes(K8s)从入门到精通:一篇彻底搞懂云原生核心

适用人群:开发、运维、SRE、DevOps 工程师

目标:掌握 K8s 核心概念、架构原理、实战操作与生产最佳实践

前置知识:Docker 基础、Linux 命令、网络基础

一、为什么需要 Kubernetes?🚫 单机 Docker 的局限单点故障:容器崩溃后无法自愈手动扩缩容:流量激增时需人工干预服务发现困难:容器 IP 动态变化,难以互相调用资源调度低效:无法跨多台机器智能分配负载✅ K8s 的解决方案image 💡 核心思想:声明式 API + 控制器模式(Reconciliation Loop)

二、K8s 核心架构(5 分钟理解)1. 控制平面(Control Plane)—— 大脑API Server:唯一入口,处理所有 REST 请求etcd:分布式键值存储,保存集群所有状态Scheduler:决定 Pod 调度到哪个 NodeController Manager:运行各种控制器(如 ReplicaSet、Node Controller)Cloud Controller Manager(可选):对接云厂商 API2. 工作节点(Worker Node)—— 肌肉kubelet:Node 上的代理,确保容器运行kube-proxy:维护网络规则,实现 Service 负载均衡Container Runtime:容器运行时(Docker / containerd / CRI-O)image三、K8s 核心对象(Objects)1. Pod —— 最小调度单元一个或多个紧密耦合的容器共享网络/存储

短暂性:IP 会变,随时可能被重建

YAML 示例:

代码语言:javascript复制apiVersion: v1

kind: Pod

metadata:

name: nginx-pod

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:1.25

ports:

- containerPort: 802. Deployment —— 管理无状态应用确保指定数量的 Pod 副本始终运行

支持滚动更新、回滚、扩缩容

YAML 示例:

代码语言:javascript复制apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

spec:

replicas: 3

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:1.253. Service —— 稳定访问入口为动态 Pod 提供固定 IP 和 DNS 名称

类型:

ClusterIP(默认):集群内部访问NodePort:通过 : 访问LoadBalancer:云厂商提供外网 LBExternalName:CNAME 到外部服务YAML 示例:

代码语言:javascript复制apiVersion: v1

kind: Service

metadata:

name: nginx-service

spec:

selector:

app: nginx

ports:

- protocol: TCP

port: 80

targetPort: 80

type: LoadBalancer4. ConfigMap & Secret —— 配置解耦ConfigMap:存储非敏感配置(如环境变量、配置文件)

Secret:存储敏感信息(Base64 编码,建议配合加密)

代码语言:javascript复制# Secret 示例

apiVersion: v1

kind: Secret

metadata:

name: db-secret

type: Opaque

data:

username: YWRtaW4= # echo -n "admin" | base64

password: MWYyZDFlMmU2N2Rm5. Namespace —— 资源隔离逻辑分区,避免命名冲突

默认 Namespace:default, kube-system, kube-public

创建命令:

代码语言:javascript复制kubectl create namespace dev

kubectl get pods -n dev # 指定命名空间四、环境搭建(快速上手)方案 1:Minikube(本地学习)代码语言:javascript复制# 安装 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

# 验证

kubectl get nodes

minikube dashboard # 打开 Web UI方案 2:Kind(Kubernetes in Docker)代码语言:javascript复制# 安装 Kind

go install sigs.k8s.io/kind@v0.20.0

# 创建集群

kind create cluster --name my-cluster

# 验证

kubectl cluster-info方案 3:云平台(生产推荐)阿里云 ACK、腾讯云 TKE、AWS EKS、GCP GKE五、kubectl 命令速查image六、实战:部署一个 Web 应用步骤 1:创建 Deployment代码语言:javascript复制# app-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: web-app

spec:

replicas: 2

selector:

matchLabels:

app: web

template:

metadata:

labels:

app: web

spec:

containers:

- name: app

image: nginx:alpine

ports:

- containerPort: 80步骤 2:创建 Service代码语言:javascript复制# app-svc.yaml

apiVersion: v1

kind: Service

metadata:

name: web-service

spec:

selector:

app: web

ports:

- protocol: TCP

port: 80

targetPort: 80

type: NodePort步骤 3:部署 & 访问代码语言:javascript复制# 部署

kubectl apply -f app-deploy.yaml

kubectl apply -f app-svc.yaml

# 获取访问地址(Minikube)

minikube service web-service --url

# 或端口转发

kubectl port-forward svc/web-service 8080:80

# 访问 http://localhost:8080七、高级功能1. 健康检查(Liveness & Readiness)代码语言:javascript复制spec:

containers:

- name: app

image: my-app

livenessProbe:

httpGet:

path: /health

port: 8080

initialDelaySeconds: 5

periodSeconds: 10

readinessProbe:

httpGet:

path: /ready

port: 8080

initialDelaySeconds: 22. 持久化存储(PV/PVC)代码语言:javascript复制# PVC 示例

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-pvc

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 10Gi3. Ingress —— 7 层 HTTP 路由代码语言:javascript复制apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: web-ingress

spec:

rules:

- host: myapp.example.com

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: web-service

port:

number: 804. Helm —— 包管理器代码语言:javascript复制# 安装 Helm

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 部署 MySQL

helm repo add bitnami https://charts.bitnami.com/bitnami

helm install my-mysql bitnami/mysql八、生产环境最佳实践🔒 安全启用 RBAC:最小权限原则PodSecurityPolicy / Pod Security Admission:限制特权容器扫描镜像漏洞:Trivy / Clair加密 etcd:静态数据加密🚀 性能资源请求 & 限制:

代码语言:javascript复制resources:

requests:

memory: "64Mi"

cpu: "250m"

limits:

memory: "128Mi"

cpu: "500m"亲和性 & 反亲和性:避免单点故障

Horizontal Pod Autoscaler (HPA):基于指标自动扩缩容

🛠️ 监控Metrics Server:提供 CPU/内存指标Prometheus + Grafana:监控集群 & 应用EFK / Loki:日志收集与分析🔄 CI/CD 集成GitLab CI / Jenkins → 构建镜像 → 推送 Registry → kubectl apply九、常见问题排查❌ Pod 一直处于 Pending?节点资源不足 → kubectl describe pod节点污点(Taint)不匹配 → kubectl describe node❌ Service 无法访问?检查 Selector 是否匹配 Pod Label检查 kube-proxy 是否正常运行测试 ClusterIP:kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup web-service❌ 应用频繁重启?查看日志:kubectl logs --previous检查健康检查配置是否合理十、学习路线图image 📚 推荐资源:

官方文档:kubernetes.io书籍:《Kubernetes in Action》实验:Killer.sh(CKA 模拟)结语Kubernetes 不是终点,而是云原生旅程的起点。掌握它,你将:

✅ 构建高可用、可扩展的现代应用✅ 实现 DevOps 自动化流水线✅ 为微服务、Serverless、AI 平台打下基础 记住:

“Don’t learn Kubernetes to run Kubernetes. Learn Kubernetes to build resilient systems.”

附:速查 Cheat Sheet

📥 下载 PDF 版命令速查表

🐙 GitHub 示例 YAML 仓库

现在,打开终端,输入 kubectl get nodes,开启你的 K8s 之旅吧! ☸️