Docker到Kubernetes迁移:容器、编排与Pod核心概念解析

容器编排Pod
于 2026-10-01 04:45:09 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目概述:这不是一次工具切换,而是一场基础设施思维的重构

“从 Docker 到 Kubernetes:概念对照与迁移”——这八个字背后,藏着过去五年里我亲手带过的17个团队踩过的坑、重装过的23台开发机、删掉又重建的400多个YAML文件,以及凌晨三点盯着kubectl get pods命令输出时那杯早已凉透的咖啡。它不是教你怎么敲几行命令,而是帮你把脑子里那个“Docker 就是 run 一个镜像”的旧地图,换成一张标着 Service、Ingress、StatefulSet 和 Operator 的新作战图。核心关键词就三个:容器、编排、Pod——它们像三把钥匙,分别打开隔离、调度和抽象的大门。如果你还在用 docker run -p 8080:8080 启动一个 Spring Boot 应用,然后靠 docker ps | grep java 查进程,再手动 docker exec -it 进去改配置,那你就是这张旧地图的典型用户;而当你开始思考“这个 Java 应用该跑几个副本?”、“数据库连接池怎么随 Pod 数量自动伸缩?”、“服务A调用服务B,IP变了怎么办?”,你就已经站在 Kubernetes 的入口了。这篇文章不讲虚的,只讲我每天在生产环境里真实操作的东西:怎么把一个用 Docker Compose 跑得好好的本地项目,一砖一瓦地搬上 K8s 集群,过程中哪些概念必须掰开揉碎,哪些命令必须背下来,哪些报错信息一看就知道是哪个环节出了问题。它适合两类人:一类是刚学完 Docker 基础、想往云原生深挖的开发者;另一类是运维老手,正被老板催着“把现有服务容器化并上 K8s”。别怕,我们从最基础的对照表开始,就像学开车先认仪表盘一样。

2. 核心概念对照:为什么不能直接把 docker-compose.yml 拖进 kubectl?

2.1 容器(Container):从“单兵作战”到“班组编制”

Docker 里的容器,本质是一个进程的封装。你执行 docker run nginx:alpine,系统就拉起一个 Nginx 进程,配上自己的 rootfs、网络命名空间和 cgroups 限制,它就是一个独立的、可运行的最小单元。这很像一个士兵:有武器(镜像)、有制服(namespace)、有活动范围(cgroup limit),但没有指挥链,没有战友协同,打完一仗就撤。Kubernetes 里的容器,从来不是单独存在的。它必须被包裹在一个叫 Pod 的结构里。Pod 是 K8s 最小的调度单位,不是容器。一个 Pod 可以包含一个或多个紧密耦合的容器,它们共享同一个网络命名空间(所以 localhost 互通)、同一个 IPC 命名空间、同一个存储卷(Volume)。举个实在的例子:你的 Java Web 应用容器,旁边通常会配一个 sidecar 容器,比如一个日志收集器(Filebeat)或者一个服务网格代理(Istio 的 Envoy)。这两个容器在物理上是两个进程,但在 K8s 眼里,它们属于同一个 Pod,共享 IP 和端口,生命周期也绑定在一起——Pod 启动,两个容器一起启动;Pod 终止,两个容器一起终止。这就像一个战斗班组:Java 应用是主战兵,Filebeat 是通信兵,他们共用一辆装甲车(Pod),车上有统一的电台频率(网络命名空间)和弹药箱(Volume)。你永远无法在 K8s 里直接创建一个“裸容器”,就像你不能在军队里只招一个兵而不给他编入班排连。所以,第一步迁移,就是把 docker-compose.yml 里每一个 service,都理解为未来要放进一个 Pod 里的一个容器。如果一个 service 依赖另一个 service 的端口,比如 app 依赖 redis,在 Docker Compose 里你写 redis:6379,在 K8s 里,你得先确保 redis 服务被暴露成一个 Service 对象,然后 app 容器通过 redis.default.svc.cluster.local:6379 来访问——这是服务发现,不是 IP 直连。

2.2 编排(Orchestration):从“手工点菜”到“智能厨房调度”

Docker Compose 的 docker-compose up 命令,本质上是一份“点菜清单”。你告诉 Docker:“我要一份 Nginx、一份 Redis、一份 MySQL,按这个顺序上,Nginx 启动后等 5 秒再启 Redis”。它执行的是线性、确定性的流程,所有动作都在一台宿主机上完成。而 Kubernetes 的编排,是“智能厨房调度”。你提交的不是菜单,而是一份“最终状态声明”(Declarative State)。你写一个 YAML 文件,声明:“我需要 3 个 app Pod,每个都带 2G 内存;我需要一个 redis Service,类型是 ClusterIP;我需要一个 nginx Ingress,把 example.com/app 的流量路由到 app Service”。K8s 的控制平面(Control Plane)——包括 API Server、Scheduler、Controller Manager——会持续监听这个声明,并不断对比集群当前的实际状态(Actual State)和你声明的目标状态(Desired State)。如果某个 app Pod 因为宿主机宕机而消失了,Controller Manager 会立刻发现“哦,少了一个”,然后通知 Scheduler 在另一台健康的节点上,重新调度一个一模一样的 Pod。这个过程完全自动,无需人工干预。这就是“自愈能力”。Docker Compose 没有这种能力。你 docker-compose down 之后,所有容器就没了,除非你再 up 一次。K8s 的编排还意味着资源感知。Scheduler 不会随便找个节点塞一个 Pod,它会看这个节点还有多少 CPU、内存空闲,会不会超过 ResourceQuota 限制,甚至考虑亲和性(Affinity)——比如“把数据库 Pod 和它的备份 Pod 分开部署在不同机架上,避免单点故障”。这种基于策略的、动态的、分布式的调度,是 Docker Compose 这种单机编排工具根本无法企及的。所以,迁移的核心,不是把 docker-compose.yml 的语法翻译成 YAML,而是把“我要运行这些服务”的思维,升级为“我要维持这些服务的稳定、弹性、可观测的最终状态”。

2.3 Pod:Kubernetes 的原子单位与一切的起点

Pod 是 Kubernetes 里绕不开的基石,也是初学者最容易误解的概念。很多人以为 Pod 就是“一个容器”,这是大错特错。Pod 是一个逻辑上的“运行时环境”,它本身不运行代码,它只是为里面的容器提供了一个共享的上下文。你可以把它想象成一个“气泡”:气泡里可以有一个容器,也可以有两个、三个。气泡提供了网络、存储、生命周期管理。为什么设计成这样?因为现实世界的应用很少是单体的。一个微服务应用,除了主业务进程,往往还需要:

  • 一个日志轮转器(logrotate),防止磁盘被日志撑爆;
  • 一个配置热更新器(confd),监听配置中心变化并重载 Nginx;
  • 一个健康检查探针(health check sidecar),专门负责向主进程发 /health 请求并上报给 K8s。

把这些功能都塞进主容器的镜像里?不行。那会让镜像臃肿、职责混乱、升级困难。K8s 的解法是:主容器 + Sidecar 容器,同处一个 Pod。它们共享 localhost,所以主进程监听 :8080,Sidecar 可以直接 curl http://localhost:8080/health;它们共享 Volume,所以主进程写日志到 /var/log/app.log,Sidecar 可以直接读取这个路径进行收集。这才是 Pod 的真正价值:它让“一个应用”这个概念,在容器时代有了更精细、更符合实际的表达。因此,在迁移时,你必须对每一个 docker-compose.yml 中的 service 进行审视:它是否真的只需要一个容器?还是它天然就需要一个搭档?比如,一个用 docker-compose 启动的 nginx 服务,如果它需要反向代理后端 Java 服务,那么在 K8s 里,你很可能需要一个 nginx Pod(里面只有 nginx 容器)和一个 app Pod(里面是 Java 容器),再通过 Service 把它们连起来。而如果你的 nginx 还需要做 JWT 验证,那可能就得在 nginx Pod 里加一个 auth-service sidecar。Pod 是一切的起点,所有其他对象(Deployment、Service、Ingress)都是围绕 Pod 构建的抽象。不理解 Pod,就永远在 K8s 的门外徘徊。

3. 迁移实操:四步走,把本地 Docker 项目搬上 K8s 集群

3.1 第一步:环境准备与工具链搭建——别让环境拖垮你的第一次尝试

在动手写 YAML 之前,你必须确保手头有一套能用的、稳定的 K8s 环境。别一上来就冲生产集群,那是给自己挖坑。我的建议是:本地用 Kind(Kubernetes in Docker),测试用 Minikube,预发/生产用云厂商托管集群(如 EKS/GKE/AKS)。Kind 是目前最轻量、最接近真实集群的本地方案。它用 Docker 容器来模拟 K8s 的各个组件(control plane 和 worker node),启动快、资源占用小、网络模型和真实集群一致。安装 Kind 只需一条命令:curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64 && chmod +x ./kind && sudo mv ./kind /usr/local/bin/。然后创建一个单节点集群:kind create cluster --name my-cluster。这条命令会在后台拉起一个名为 kind-control-plane 的容器,它既是 master 也是 worker。验证:kubectl cluster-info 和 kubectl get nodes。此时,你的 kubectl 已经指向了这个本地集群。接下来,你需要一个可靠的镜像仓库。Docker Hub 有速率限制,且公有镜像安全性堪忧。我强烈推荐使用 Harbor 或者云厂商的私有仓库(如阿里云 ACR、腾讯云 TCR)。对于本地开发,你可以用 registry:2 镜像快速搭一个:docker run -d -p 5000:5000 --restart=always --name registry registry:2。然后把你的应用镜像推送到 localhost:5000/my-app:1.0。最后,必备的 CLI 工具链:

  • kubectl:K8s 的瑞士军刀,必须熟练;
  • kubectx / kubens:快速切换上下文(context)和命名空间(namespace),避免 kubectl --context=prod --namespace=default get pods 这种长命令;
  • stern:实时 tail 多个 Pod 的日志,比 kubectl logs -f 强十倍;
  • k9s:终端里的 K8s UI,可视化查看资源状态,排查问题神器。

提示:在 kind 集群里,localhost:5000 是指宿主机的 localhost,而不是 kind 容器内部的 localhost。所以你在 kind 里拉取镜像时,要写 localhost:5000/my-app:1.0,K8s 会自动解析到宿主机的 5000 端口。这是很多新手卡住的第一关。

3.2 第二步:从 docker-compose.yml 到基础 YAML —— 手动拆解,拒绝一键转换

网上有很多 docker-compose-to-k8s 的在线转换工具,我劝你千万别用。它们生成的 YAML 往往是“能跑”,但离“能用”、“能维护”差十万八千里。真正的迁移,必须手动拆解,理解每一行的意义。我们以一个极简的 docker-compose.yml 为例:

YAML
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
depends_on:
- app
app:
build: ./app
environment:
- DB_HOST=redis
- DB_PORT=6379
depends_on:
- redis
redis:
image: redis:7-alpine
command: redis-server --appendonly yes

现在,我们把它一步步变成 K8s 的 YAML。首先,redis 服务。在 K8s 里,它对应一个 Deployment(定义如何运行 Pod)和一个 Service(定义如何访问 Pod)。

YAML
# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1 # 我们先跑一个副本
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
command: ["redis-server"]
args: ["--appendonly", "yes"]
ports:
- containerPort: 6379
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
---
# redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379

注意几个关键点:

  • selector 和 template.metadata.labels 必须严格匹配,这是 Service 找到 Pod 的唯一方式;
  • command 和 args 是分开的,command 替换镜像的 ENTRYPOINT,args 替换 CMD,这是为了清晰和可覆盖;
  • resources 是必须设置的!没有 limits 的 Pod 会吃光节点资源,没有 requests 的 Pod 会被 Scheduler 认为“不需要资源”,导致调度失败。这里的 250m 表示 0.25 个 CPU 核心,64Mi 是 64 兆字节内存,这是根据 Redis 官方文档推荐的最小值设定的。

接着是 app 服务。它需要构建镜像,所以我们先 docker build -t localhost:5000/my-app:1.0 ./app,再 docker push localhost:5000/my-app:1.0。然后写它的 Deployment:

YAML
# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
namespace: default
spec:
replicas: 2 # 我们希望有 2 个副本,实现高可用
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: localhost:5000/my-app:1.0
env:
- name: DB_HOST
value: "redis.default.svc.cluster.local" # 注意!这是 K8s 的 DNS 名称
- name: DB_PORT
value: "6379"
ports:
- containerPort: 8080
livenessProbe: # 健康检查,K8s 会定期调用
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe: # 就绪检查,只有通过才加入 Service 的 Endpoints
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1000m"

这里的关键是 DB_HOST 的值。在 Docker Compose 里,它是 redis,因为 Compose 会自动创建一个 Docker 网络,所有服务名就是 DNS 名。在 K8s 里,DNS 规则是 <service-name>.<namespace>.svc.cluster.local。redis 服务在 default 命名空间,所以全名是 redis.default.svc.cluster.local。livenessProbe 和 readinessProbe 是 K8s 的生命线。liveness 是“你还活着吗?”,死了就重启;readiness 是“你准备好接客了吗?”,没准备好就不把流量导给你。这两个探针的配置,直接决定了你的服务是否稳定。最后是 web 服务。它需要对外暴露,所以除了 Deployment,还需要一个 Service(ClusterIP)和一个 Ingress(七层路由):

YAML
# web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
---
# web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
---
# web-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
namespace: default
spec:
ingressClassName: nginx # 这里假设你已安装了 nginx-ingress-controller
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80

Ingress 是 K8s 的标准七层网关抽象。它本身不干活,需要一个 Ingress Controller(如 nginx-ingress、traefik)来实现。在 kind 集群里,你可以用 kind load docker-image nginx-ingress-controller 加载镜像,然后部署官方的 ingress-nginx。host: example.com 是域名,你需要在本地 /etc/hosts 里加上 127.0.0.1 example.com,才能用浏览器访问。

3.3 第三步:部署、验证与调试——kubectl 是你的眼睛和手

所有 YAML 文件写好后,就是部署时刻。不要一股脑 kubectl apply -f .,那会出大问题。我的习惯是分组、分步、带 -v 6(详细日志):

BASH
# 1. 先部署基础服务(redis)
kubectl apply -f redis-deployment.yaml -v 6
kubectl apply -f redis-service.yaml -v 6
 
# 2. 等待 redis Pod Running
kubectl get pods -w # -w 是 watch,实时刷新
 
# 3. 部署 app
kubectl apply -f app-deployment.yaml -v 6
 
# 4. 部署 web
kubectl apply -f web-deployment.yaml -v 6
kubectl apply -f web-service.yaml -v 6
kubectl apply -f web-ingress.yaml -v 6

部署后,验证的黄金三步法:

  1. 看 Pod 状态:kubectl get pods。理想状态是 Running。如果卡在 Pending,说明调度失败,kubectl describe pod <pod-name> 看 Events,通常是资源不足或镜像拉取失败;如果卡在 ContainerCreating,kubectl describe 看 Events,常见原因是 ImagePullBackOff(镜像名错了或仓库不可达);如果 CrashLoopBackOff,说明容器启动就崩溃,kubectl logs <pod-name> 看日志。
  2. 看 Service 的 Endpoints:kubectl get endpoints redis。如果输出是 <none>,说明 Service 的 selector 没匹配到任何 Pod 的 label,回去检查 deployment.yaml 里的 selector 和 template.metadata.labels。
  3. 看 Ingress 的地址:kubectl get ingress。ADDRESS 列应该有 IP。如果没有,说明 Ingress Controller 没装好或没运行。kubectl get pods -n ingress-nginx 看 controller 的 Pod 是否 Running。

调试时,kubectl exec 是你的手术刀。比如,你想确认 app Pod 能否连通 redis:

BASH
kubectl exec -it <app-pod-name> -- sh
# 进入容器后
apk add curl # 如果 alpine 镜像没装 curl
curl -v http://redis.default.svc.cluster.local:6379 # 应该返回 Redis 的欢迎信息

注意:kubectl exec 进入的是 Pod 的第一个容器。如果 Pod 有多个容器,要用 -c <container-name> 指定。-- sh 后面的 sh 是进入 shell,有些镜像用 bash,记得先 kubectl exec <pod> -- which bash 确认。

3.4 第四步:进阶优化与生产就绪——别让“能跑”变成“不敢动”

当你的服务在 kind 里跑通了,恭喜你迈过了第一道坎。但离生产就绪,还有很长的路。以下是我在真实项目中总结的、必须做的五件事:

  1. 命名空间(Namespace)隔离:别把所有东西都扔在 default 命名空间。按环境(dev/staging/prod)或按业务域(user-service/payment-service)划分。kubectl create namespace prod,然后在所有 YAML 的 metadata.namespace 字段里填上 prod。这不仅是组织,更是安全边界。
  2. ConfigMap 与 Secret 管理配置:把 DB_HOST、DB_PASSWORD 这些硬编码从 Deployment 里抽出来。kubectl create configmap app-config --from-literal=DB_HOST=redis.prod.svc.cluster.local,kubectl create secret generic app-secret --from-literal=DB_PASSWORD=xxx。然后在 Deployment 的 envFrom 字段里引用。Secret 的值是 base64 编码的,但 kubectl 会自动处理。
  3. 持久化存储(PersistentVolume):Redis 的 --appendonly yes 会把数据写到 /data 目录。默认 Pod 的文件系统是临时的,重启就丢。你需要一个 PersistentVolumeClaim(PVC),指向一个 PersistentVolume(PV)。在 kind 里,可以用 hostPath 类型的 PV;在云上,用云盘(EBS/EVS)。
  4. Horizontal Pod Autoscaler(HPA):让 app Deployment 根据 CPU 使用率自动扩缩容。kubectl autoscale deployment app --cpu-percent=50 --min=1 --max=10。K8s 会监控 app 的平均 CPU 使用率,超过 50% 就加 Pod,低于 50% 就减。
  5. Helm Chart 封装:当你的 YAML 文件超过 10 个,手动 apply 就是灾难。用 Helm 把它们打包成一个 Chart。helm create my-app 会生成标准目录结构,把所有 YAML 放进 templates/,用 Go 模板语法({{ .Values.replicaCount }})参数化。helm install my-app ./my-app 一键部署。这是团队协作和 CI/CD 的基石。

4. 常见问题与排查技巧实录:那些让我熬夜的报错,现在都给你列出来了

4.1 “Virtualization support not detected” —— Docker Desktop 启动失败的终极解法

这个错误信息,几乎出现在每一篇 Windows 用户的 Docker Desktop 教程评论区里。它不是 K8s 的问题,而是 Docker Desktop 自身的依赖没满足。根本原因只有一个:Windows 的 WSL2(Windows Subsystem for Linux 2)没有启用,或者 BIOS 里的虚拟化(VT-x/AMD-V)被关闭了。解决方案分三步:

  1. BIOS 设置:重启电脑,狂按 F2/Del 进 BIOS,找到 Advanced -> CPU Configuration,把 Intel Virtualization Technology(或 SVM Mode)设为 Enabled。保存退出。
  2. 启用 WSL2:以管理员身份打开 PowerShell,依次执行:
    POWERSHELL
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    重启电脑。然后下载 WSL2 Linux kernel update package 并安装。最后,wsl --set-default-version 2。
  3. Docker Desktop 设置:打开 Docker Desktop 设置(Settings)-> General,勾选 Use the WSL 2 based engine;再点 Resources -> WSL Integration,把你的发行版(如 Ubuntu)勾上。重启 Docker Desktop。

实操心得:我见过太多人卡在这一步,反复重装 Docker Desktop 十几次。记住,99% 的情况,问题不在 Docker,而在 WSL2 和 BIOS。先搞定这两样,Docker Desktop 自然就活了。

4.2 “Unable to connect to the server: EOF” —— kubectl 连不上集群的排查链

当你 kubectl get nodes 报这个错,说明 kubectl 的配置(kubeconfig)指向了一个不存在或已失效的集群。排查链必须按顺序:

  • Step 1:检查 kubeconfig:kubectl config view。看 current-context 是什么,再看 contexts 里对应的 cluster 名,最后看 clusters 里这个 cluster 的 server 地址。kind 创建的集群,server 通常是 https://127.0.0.1:32768 这样的地址。
  • Step 2:检查端口是否监听:netstat -tuln | grep 32768(Linux/macOS)或 netstat -ano | findstr :32768(Windows)。如果没输出,说明 kind 集群根本没起来。kind delete cluster,再 kind create cluster。
  • Step 3:检查证书:kubectl config view --raw --minify --flatten 会输出当前生效的完整配置。把 certificate-authority-data 的值(一长串 base64)复制出来,echo "<base64>" | base64 -d > ca.crt,然后 openssl x509 -in ca.crt -text -noout。看 Not Before 和 Not After,如果证书过期了(kind 集群的证书默认一年),就必须重建集群。
  • Step 4:检查网络代理:如果你公司用了全局代理,kubectl 也会走代理,而代理服务器无法访问 127.0.0.1。export NO_PROXY="127.0.0.1,localhost"(Linux/macOS)或 set NO_PROXY=127.0.0.1,localhost(Windows)。

4.3 “CrashLoopBackOff” —— 容器启动即崩溃的万能诊断法

这是 K8s 里最让人抓狂的状态。容器启动,运行几秒,崩溃,K8s 重启,再崩溃……循环。诊断法如下:

  1. 先看最近一次的日志:kubectl logs <pod-name> --previous。--previous 是关键,它看的是上一次崩溃前的日志,而不是重启后的新日志。
  2. 如果日志为空,看事件:kubectl describe pod <pod-name>,重点看 Events 部分。常见事件:
    • Failed to pull image "xxx":镜像名拼错,或仓库权限不够;
    • Back-off restarting failed container:容器进程退出码非 0,通常是应用启动失败;
    • OOMKilled:内存超限被系统杀死,limits.memory 设太小了。
  3. 如果还找不到,进容器看现场:kubectl exec -it <pod-name> -- sh。如果进不去,说明容器根本没起来。那就用 kubectl debug(K8s 1.20+)创建一个临时调试容器:kubectl debug -it <pod-name> --image=busybox:1.35。这个 busybox 容器会共享目标 Pod 的所有命名空间(network、pid、ipc),你可以用 ps aux 看进程,用 netstat -tuln 看端口,用 df -h 看磁盘。

4.4 “No endpoints for service” —— Service 找不到后端 Pod 的血泪教训

kubectl get endpoints <service-name> 输出 <none>,这是新手必经之路。原因无非三点:

  • Selector 不匹配:kubectl get deployment <deployment-name> -o wide,看 LABELS 列;kubectl get pods --show-labels,看 Pod 的 labels。两者必须完全一致。matchLabels 是精确匹配,matchExpressions 是表达式匹配,新手用 matchLabels 就够了。
  • Pod 没 Running:kubectl get pods,如果 Pod 是 Pending、ContainerCreating 或 Error,Service 就不会把它们加进来。先解决 Pod 的问题。
  • 命名空间不一致:kubectl get service -n <ns> 和 kubectl get pods -n <ns>,必须在同一个命名空间下操作。kubectl get service 默认是 default,而你的 Pod 可能在 dev 命名空间。

实操心得:我曾经因为一个空格,debug 了 3 小时。selector: 下面的 app: web,我多打了一个空格,变成了 app: web(两个空格)。YAML 解析器认为这是两个 key,app 的值是空字符串,自然匹配不到任何 Pod。所以,永远用 kubectl apply --dry-run=client -o yaml -f <file> 预览 YAML 被解析后的样子,再 apply。

4.5 “Connection refused” —— 服务间调用不通的三层穿透法

app Pod 里 curl http://redis.default.svc.cluster.local:6379 报 Connection refused,说明网络层通了(DNS 解析成功),但应用层没通。三层穿透:

  • Layer 1:Pod 内部:kubectl exec -it <app-pod> -- sh,然后 telnet redis.default.svc.cluster.local 6379。如果 telnet 不通,说明 redis Pod 的 containerPort 没监听,或者 redis 容器根本没起来。kubectl logs <redis-pod>。
  • Layer 2:Service 层:kubectl get endpoints redis,看有没有 IP。如果有,kubectl get svc redis -o wide,看 CLUSTER-IP。然后在 app Pod 里 curl http://<cluster-ip>:6379。如果通了,说明 Service 配置没问题;如果还不通,说明 redis 容器的 containerPort 和 Service 的 targetPort 不一致。
  • Layer 3:网络策略(NetworkPolicy):如果集群启用了 NetworkPolicy,默认是“拒绝所有”。你需要显式允许 app 命名空间的 Pod 访问 redis 命名空间的 Pod。kubectl apply -f network-policy.yaml,内容是允许 app 的 label 访问 redis 的 label。

5. 迁移后的思考:从“会用”到“用好”,Kubernetes 的深水区在哪里

当你能把一个简单的 docker-compose 项目稳稳当当地搬到 K8s 上,并且 kubectl get pods 里全是 Running,恭喜你,你已经拿到了云原生世界的入门门票。但这张票,只够你走进大厅。真正的深水区,在于如何让 K8s 不仅“能跑”,而且“跑得聪明、跑得安全、跑得省心”。我亲身经历的几个关键跃迁点,分享给你:

  • 从“手动 YAML”到“GitOps”:把所有的 YAML 文件(Deployment、Service、Ingress)都放进一个 Git 仓库,用 Argo CD 或 Flux 这样的工具监听仓库变更。一旦你 git push,Argo CD 就自动 kubectl apply。这彻底消灭了“谁在哪个集群上改了什么配置”的混沌,所有变更都有迹可循、可审计、可回滚。我所在的团队,上线一个新版本,不再是 kubectl apply -f prod/,而是 git commit -m "release v1.2.0",然后喝杯咖啡。
  • 从“静态资源”到“弹性资源”:requests 和 limits 不是摆设。我见过一个集群,因为所有 Pod 都没设 requests,Scheduler 把几百个 Pod 全塞进一台 32 核的机器,结果 CPU 爆满,整个集群雪崩。后来我们推行“资源申请文化”:每个新服务上线,必须由架构师审核其 requests 是否合理。我们用 kubectl top nodes 和 kubectl top pods 监控真实使用率,再用 kubectl set resources 动态调整。资源不是越多越好,而是“刚刚好”。
  • 从“黑盒日志”到“可观测性栈”:kubectl logs 只能看到当前日志。生产环境需要 ELK(Elasticsearch, Logstash, Kibana)或 Loki + Grafana 来做日志聚合;需要 Prometheus + Grafana 做指标监控(CPU、内存、HTTP QPS、延迟);需要 Jaeger 做分布式追踪。这三者合称“可观测性三支柱”。它们不是可选项,而是生产环境的氧气。没有它们,你就像在浓雾中开车,永远不知道下一个故障在哪。
kubernetes培训PPT完整版.rar
【标题】"Kubernetes培训PPT完整版"涵盖了Kubernetes(K8s)的基础理论、实践操作以及案例分析,是全面了解和学习这个强大的容器编排系统的宝贵资料。
为萌奔跑
2433
kubernetes-handbook-k8s容器编排实战项目
Kubernetes(常简称为k8s)作为当前云原生技术栈中最核心、最成熟的容器编排系统,已彻底重塑现代软件交付与基础设施管理的范式。本项目《kubernetes-handbook-k8s容器编排实战项目》并非泛泛而谈的概念性文档,而是以工程实践为驱动、以真实生产环境为蓝本构建的系统性学习资源,其知识体系深度覆盖从底层原理到高阶运维、从单体迁移至微服务治理、从本地开发到CI/CD全链路自动化的完整闭环。首先,标题中“容器编排实战项目”明确指向Kubernetes的本质职能——即对大规模容器化应用进行自动化部署、弹性伸缩、服务发现、负载均衡、健康检查、滚动更新、故障自愈及策略化调度。这远超Docker单独运行容器的能力边界,本质是构建一套面向终态(Declarative API)、具备强一致性和分布式协调能力的控制平面(Control Plane),由API Server、etcd、Controller Manager、Scheduler及Node侧的Kubelet、Kube-Proxy、Container Runtime共同构成松耦合但高内聚的控制循环。描述中反复强调“k8s容器编排实战项目”五次,凸显其高度聚焦于可落地、可复现、可调试的真实场景:例如基于Helm Chart封装有状态服务(如MySQL主从集群+Prometheus监控栈)、利用Operator模式扩展自定义资源(CRD)实现ETCD集群自治、通过NetworkPolicy实施零信任网络分段、借助PodSecurityPolicy(或新版Pod Security Admission)强化租户隔离、采用Ephemeral Containers诊断运行中Pod疑难问题等。标签中“Kubernetes”与“k8s”并列,体现术语规范性与社区通用性;“容器编排”点明技术层级——它不是单纯容器技术,而是容器之上的抽象层,解决多容器协同生命周期管理这一根本难题;“Docker”虽非K8s唯一支持的运行时(CRI标准已支持containerd、CRI-O等),但仍是绝大多数初学者理解镜像构建、分层存储、联合文件系统(OverlayFS)与容器网络(bridge/host/macvlan)的基石入口;“云原生”则框定其哲学底色:不可变基础设施、声明式API、服务网格化、可观测性三位一体;“微服务”是其典型负载形态——每个微服务实例被封装为Pod(最小调度单元),包含一个或多个紧密耦合的容器共享网络命名空间与存储卷,通过Service实现服务名解析与集群内负载均衡(ClusterIP/NodePort/LoadBalancer),再经Ingress暴露至外部,形成清晰的南北向与东西向流量分治架构;“CI/CD”揭示其与DevOps流程的深度咬合:GitOps(如Argo CD)将Git仓库作为唯一事实源,K8s控制器持续比对集群实际状态与Git中YAML声明状态,并自动同步,实现版本可控、审计可溯、回滚可靠的发布机制;而“Pod”、“Deployment”、“Service”三大核心原语构成应用交付的黄金三角:Pod是原子调度与生命周期单元;Deployment通过ReplicaSet保障副本数恒定,并支持蓝绿、金丝雀等渐进式发布策略;Service则解耦前端消费者与后端Pod IP的强绑定,提供稳定虚拟IP与DNS名称,背后由kube-proxy(iptables/ipvs)或CNI插件(Calico/Flannel/Cilium)实现流量转发与网络策略执行。压缩包内文件亦暗藏知识脉络:SUMMARY.md是全书知识图谱骨架,按“概念→安装→核心对象→网络→存储→安全→监控→日志→CI/CD→多集群→Operator→最佳实践”逐层递进;book.json与pm-template.latex表明其支持GitBook与LaTeX双输出,兼顾在线阅读与高质量印刷;Makefile封装了build、test、deploy等标准化命令,体现工程化思维;CONTRIBUTING.md与CODE_OF_CONDUCT.md则映射开源协作文化——K8s本身即CNCF毕业项目,其生态繁荣正依赖全球开发者遵循统一贡献协议与行为准则。综上,该项目绝非零散命令集合,而是以Kubernetes为轴心,贯穿Linux内核(cgroups/ns)、容器运行时、网络虚拟化、分布式共识算法(etcd基于Raft)、声明式系统设计、SRE方法论的立体知识网络,是通往云原生架构师之路不可或缺的实战基石。
lsx202406
spring-cloud-k8s-demo:SpringCloud + Kubernetes
二、Kubernetes 深度解析Kubernetes(简称 K8s)是 Google 开源的一款容器编排系统,用于自动化容器化应用的部署、扩展和管理。
yilin wang
221
【Kubernetes入门】容器技术基础与K8S核心概念:本地环境搭建及Nginx部署实战指南
资源摘要信息:"本文档《Kubernetes(K8S)入门阶段详细指南》系统性地介绍了从容器技术基础到Kubernetes核心概念、架构组件、本地环境搭建及实际部署操作的完整知识体系,旨在为初学者提供一条清晰、可实践的学习路径。文档首先聚焦于Docker这一容器化技术的核心工具,深入讲解其镜像与容器的管理命令,如使用`docker pull`拉取镜像、`docker images`查看本地镜像列表、`docker rmi`删除无用镜像等,帮助用户建立起对容器镜像生命周期的基本认知。在容器生命周期管理方面,文档详述了如何通过`docker run`启动一个后台运行且端口映射的容器,使用`docker ps`监控运行状态,并通过`docker stop`和`docker rm`实现容器的停止与清理,从而掌握容器的完整操作流程。更重要的是,文档强调“容器化思维”的建立,明确指出容器与传统虚拟机的本质区别:容器不包含完整操作系统,而是共享宿主机内核,因此具备轻量化、启动迅速、资源占用少等优势;同时引入镜像分层机制的概念——每一层都是只读的文件系统层,仅在最上层添加可写层供容器运行时使用,这种设计极大提升了镜像复用效率和构建速度,是现代CI/CD流水线中的关键技术支撑。在此基础上,文档进一步阐述容器编排的必要性。随着微服务架构的普及,单个应用往往由数十甚至上百个容器组成,手动管理这些容器的部署、网络连接、存储挂载、健康检查和扩缩容变得极为复杂且易出错。因此,容器编排平台应运而生,Kubernetes正是其中最为成熟和广泛应用的解决方案。文档随后进入Kubernetes核心部分,全面解析其分布式架构。K8S集群由Master节点和Worker节点构成:Master节点负责集群的整体控制与调度,其核心组件包括API Server——作为整个集群的唯一入口,接收并处理所有RESTful API请求,是用户与集群交互的中枢;etcd——一个高可用的分布式键值存储系统,用于持久化保存集群的所有配置数据和状态信息,如Pod定义、Service规则、节点状态等,确保集群具备自我恢复能力;Scheduler——负责监听新创建的Pod并根据资源需求、亲和性策略、节点负载等因素将其调度到最合适的Worker节点上;Controller Manager——运行多种控制器进程,如Replication Controller、Node Controller等,持续监控集群实际状态与期望状态的一致性,并自动进行修复,例如当某个Pod意外终止时,控制器会自动创建新的Pod以维持设定的副本数。Worker节点则是真正运行业务负载的地方,其关键组件为Kubelet——直接与API Server通信,接收PodSpec描述并确保该Pod在其所在节点上正确运行,它还负责上报节点状态和Pod健康状况;Kube-proxy——运行在每个节点上的网络代理组件,维护节点上的网络规则,支持Service的ClusterIP和服务发现机制,实现跨Pod的负载均衡。文档接着介绍Kubernetes中最重要的资源对象模型:Pod是最小的调度单元,虽然逻辑上可包含多个紧密耦合的容器(如主应用容器与日志收集边车容器),但它们共享相同的网络命名空间(即拥有同一IP地址)和存储卷,便于内部通信;Deployment是一种高级控制器,用于声明式地管理Pod副本集,支持滚动更新(Rolling Update)策略,在不中断服务的前提下逐步替换旧版本Pod,同时也支持版本回滚,极大增强了发布的可靠性与安全性;Service则为动态变化的Pod提供一个稳定的访问入口,无论后端Pod如何重建或迁移,Service都能通过标签选择器(Label Selector)自动关联匹配的Pod,并对外暴露统一的IP和端口,支持ClusterIP、NodePort、LoadBalancer等多种类型以适应不同场景;Namespace用于实现多租户环境下的资源逻辑隔离,比如将开发、测试、生产环境分别置于不同的命名空间中,避免资源命名冲突并便于权限管理和配额控制。为了降低学习门槛,文档推荐使用Minikube在本地快速搭建单节点Kubernetes集群,特别适合开发者进行实验和学习。安装过程简单明了,可通过curl命令下载二进制文件并安装至系统路径,随后执行`minikube start`即可一键启动包含完整控制平面和工作节点的微型K8S环境。配合kubectl命令行工具——Kubernetes官方客户端,用户可以执行诸如`kubectl get nodes`查看节点状态、`kubectl apply -f deployment.yaml`应用YAML配置文件、`kubectl expose`创建Service等一系列操作。文档以Nginx应用部署为例,引导读者编写Deployment的YAML文件定义副本数量、容器镜像、端口等参数,再通过Service将其暴露为NodePort类型,最终通过浏览器访问Minikube分配的IP和端口验证服务可用性。整个过程不仅巩固了前述理论知识,也培养了使用声明式配置管理基础设施的能力。此外,文档附带常用命令速查表和学习资源链接,鼓励读者结合官方文档、社区教程和动手实践不断深化理解,为后续掌握ConfigMap、Secret、Ingress、Helm、Operator等高级特性奠定坚实基础。总体而言,该指南内容结构清晰、理论与实践并重,是一份极具价值的Kubernetes入门资料。"
赛博AI Lewis
kubernetes深度培训PPT
Kubernetes,通常缩写为K8s,是一种流行的开源容器编排系统,由Google设计并贡献给Cloud Native Computing Foundation (CNCF)。
940
实战Docker到Kubernetes技术系列教程(14个非常详细).zip
本系列教程《实战Docker到Kubernetes技术系列教程(14个非常详细)》是一套系统化、由浅入深的容器化与云原生技术学习资料,全面覆盖从单机容器运行时Docker到分布式容器编排平台Kubernetes的完整技术链条。该教程聚焦于企业级应用在现代DevOps流程中的实际部署与管理,旨在帮助开发者、运维工程师及架构师掌握从本地开发环境构建镜像,到将微服务集群部署至生产级K8s集群的全流程技能。首先,在Docker部分,教程深入讲解了容器化技术的核心概念。Docker作为目前最主流的容器引擎,其核心优势在于通过轻量级虚拟化技术实现应用程序及其依赖环境的一致性封装。教程详细介绍了Docker镜像的分层结构、UnionFS文件系统机制、写时复制(Copy-on-Write)策略,以及如何编写高效且安全的Dockerfile进行镜像构建。内容涵盖多阶段构建(Multi-stage Build)、最佳实践如最小化基础镜像选择(Alpine Linux等)、合理使用缓存提升构建速度,并强调安全性配置如非root用户运行容器、资源限制设置等。其次,教程重点剖析了Docker Compose工具的应用场景。对于本地多服务微服务架构的快速搭建与测试,Docker Compose提供了一种声明式的方式定义多个容器之间的依赖关系、网络互通和数据卷挂载。通过YAML文件统一管理服务启停,极大提升了开发调试效率,为后续迁移到Kubernetes打下坚实基础。进入Kubernetes阶段,教程系统性地引入了容器编排系统的必要性——当服务数量增长至数十甚至上百个时,手动管理容器生命周期已不可行。Kubernetes(简称K8s)作为CNCF(云原生计算基金会)的旗舰项目,提供了强大的自动化能力,包括自动调度、自愈、弹性伸缩、服务发现与负载均衡。教程逐一解析K8s的核心对象模型:Pod是最小调度单位,代表一个或多个共享网络与存储空间的容器集合;Deployment用于声明式管理无状态应用的副本数与更新策略;StatefulSet则针对有状态服务(如数据库)提供稳定的网络标识与持久化存储支持;DaemonSet确保每个节点运行特定守护进程;Job与CronJob处理一次性任务与定时任务。在服务暴露方面,教程详述了Service资源的作用机制。Service通过标签选择器(Label Selector)关联后端Pod,并借助kube-proxy组件在集群内部实现稳定的虚拟IP(ClusterIP)访问。同时介绍NodePort、LoadBalancer和Ingress三种外部访问模式,特别是Ingress控制器(如Nginx Ingress Controller)结合TLS证书实现HTTPS路由的能力,是现代微服务网关的关键组成部分。此外,教程深入探讨了配置管理与敏感信息处理方案。ConfigMap用于传递非敏感配置参数(如环境变量、配置文件),而Secret则以Base64编码方式存储密码、密钥等机密数据,并支持挂载为环境变量或卷。结合Volume机制,教程展示了emptyDir、hostPath、PersistentVolume(PV)与PersistentVolumeClaim(PVC)在不同场景下的使用方式,尤其是对接外部存储系统(如NFS、Ceph、云厂商EBS)实现数据持久化。在部署管理环节,教程强调CI/CD流水线与Kubernetes的集成实践。利用GitLab CI、Jenkins或Tekton等工具链,实现代码提交后自动触发镜像构建、单元测试、安全扫描、推送镜像仓库并滚动更新K8s应用。采用蓝绿发布、金丝雀发布等高级部署策略,降低上线风险,保障服务高可用性。网络安全方面,教程涵盖NetworkPolicy的使用,通过定义Pod间通信规则实施微隔离,防止横向渗透攻击。同时介绍RBAC(基于角色的访问控制)体系,精细化管理用户和服务账户对API资源的操作权限。最后,监控与日志体系也是不可或缺的部分。教程推荐使用Prometheus采集K8s指标,Grafana可视化展示,EFK(Elasticsearch + Fluentd + Kibana)或Loki栈集中收集与分析容器日志,全面提升可观测性。综上所述,这套“实战Docker到Kubernetes技术系列教程”不仅涵盖了容器化技术的基础理论,更注重真实生产环境中的工程实践,涉及架构设计、安全性、可维护性、自动化运维等多个维度,是通往云原生架构师之路的重要学习资源。无论是初学者入门,还是资深工程师进阶提升,都能从中获得极具价值的技术指导与经验总结。
kubernetes.pdf
### Kubernetes 指南知识点概览#### 一、Kubernetes简介**1.1 基本概念**- **Kubernetes(K8s)**:由谷歌发起并开源的一个容器集群管理系统,它旨在简化容器化应用程序的部署
89
k8s-labs
Kubernetes(常简称为k8s)是当今IT领域中最核心的容器编排技术之一,广泛应用于现代云原生架构、微服务治理和DevOps实践中。标题“k8s-labs”明确指出了该文件内容与Kubernetes实验环境相关,而描述同样为“k8s-labs”,进一步强调了其作为学习、测试或实践平台的本质。结合标签信息:“kubernetes, k8s, 容器编排, 实验环境, 集群部署, 容器化, DevOps, 微服务, 云原生, yaml配置”,可以深入解析出多个关键知识点。首先,“容器编排”是Kubernetes的核心功能之一。在单个容器可以通过Docker等工具轻松运行的时代,随着应用复杂度提升,成百上千个容器需要协同工作,手动管理变得不可行。Kubernetes应运而生,提供自动化调度、伸缩、故障恢复、服务发现和负载均衡等功能。它能够将一组主机抽象为资源池,根据应用需求智能分配计算资源,并确保应用始终处于期望状态。例如,在一个微服务架构中,订单服务、用户服务、支付服务可能分别运行在不同的Pod中,Kubernetes负责这些Pod的生命周期管理,包括启动、停止、重启以及跨节点迁移。其次,“实验环境”表明该项目主要用于教学、学习或技术验证目的。这类环境通常使用Minikube、Kind(Kubernetes in Docker)、kubeadm搭建本地集群,或者通过云平台如AWS EKS、Google GKE快速创建临时集群进行测试。k8s-labs项目中的结构很可能包含一系列YAML配置文件,用于定义Deployment、Service、ConfigMap、Secret、PersistentVolume等资源对象,帮助使用者理解如何通过声明式API来管理应用。这种模式极大提升了基础设施即代码(IaC)的能力,使得环境可复制、版本可控,符合DevOps理念。再者,“集群部署”涉及从零构建一个高可用Kubernetes集群的技术细节。这包括控制平面组件(API Server、etcd、Scheduler、Controller Manager)和工作节点(kubelet、kube-proxy、容器运行时)的安装与配置。现代部署方式倾向于使用kubeadm工具简化流程,但也可能采用Ansible、Terraform等自动化工具实现批量部署。安全配置如RBAC权限控制、网络策略(NetworkPolicy)、TLS证书管理也是集群部署的重要组成部分。此外,CNI插件(如Calico、Flannel)的选择直接影响Pod间通信能力,而Ingress控制器(如Nginx Ingress、Traefik)则决定了外部访问路径的设计。“容器化”作为基础前提,意味着所有应用都需被打包为容器镜像并推送到镜像仓库(如Docker Hub、Harbor)。Kubernetes通过Image字段拉取指定镜像并在目标节点运行。容器化带来了环境一致性、快速启动、资源隔离等优势,但也引入了新的挑战,比如日志收集、监控指标采集、健康检查机制等,这些都需要通过Sidecar模式、DaemonSet或Operator模式加以解决。“DevOps”与“微服务”则是Kubernetes得以广泛应用的业务背景。在传统单体架构向微服务转型过程中,服务数量激增,发布频率加快,传统的运维方式难以应对。Kubernetes提供了CI/CD流水线集成的基础平台,配合Helm Charts实现应用模板化部署,结合Argo CD等GitOps工具实现持续交付。开发团队可以自主管理服务部署,运维团队则聚焦于平台稳定性保障,从而实现高效协作。“云原生”是一个更宏观的概念,Kubernetes是其核心技术支柱之一。云原生计算基金会(CNCF)定义的云原生技术包括容器、微服务、动态编排、声明式API、服务网格(如Istio)、可观测性(Prometheus + Grafana + Loki)等。k8s-labs项目很可能是为了掌握这一整套技术栈而设计的学习路径,涵盖从基础Pod操作到高级自定义资源(CRD)和Operator开发的全过程。最后,“yaml配置”是与Kubernetes交互的主要方式。所有的资源定义均以YAML格式编写,具有严格的结构规范。例如,一个典型的Deployment配置包含apiVersion、kind、metadata、spec等字段,其中spec.template.spec.containers定义容器镜像、端口、环境变量、卷挂载等属性。熟练掌握YAML语法、资源对象之间的依赖关系(如Service关联Pod via label selector)、滚动更新策略(rollingUpdate)、资源限制(requests/limits)是使用Kubernetes的基本功。综上所述,“k8s-labs”不仅仅是一个简单的代码仓库,而是围绕Kubernetes构建的一个系统性学习体系,涵盖了从容器化基础到云原生架构落地的完整知识链条。通过实际动手实验,学习者能够深入理解分布式系统的调度原理、服务治理机制、自动化运维手段以及现代软件交付的最佳实践,为进入企业级生产环境打下坚实基础。
zhang james
dockerDocker 和 K8s基础教程
Docker 和 Kubernetes(K8s)是现代云原生技术栈中最为关键、应用最广泛、生态最成熟的两大核心基础设施平台,它们共同构成了容器化应用从开发、构建、测试、部署到规模化运维的全生命周期支撑体系。本教程标题“Docker 和 K8s基础教程”虽简短,实则涵盖了一整套系统性、工程化、生产就绪的容器技术知识图谱;而描述中强调“超详细基础教程”,意味着其内容并非浮于命令行操作的表层演示,而是深入容器底层原理、设计哲学与最佳实践,旨在帮助学习者建立扎实的底层认知框架与可迁移的工程能力。首先,Docker 作为容器化技术的事实标准,其本质是一种基于 Linux 内核特性(如 Namespaces 实现进程隔离、Cgroups 实现资源限制、OverlayFS 等联合文件系统实现分层镜像)的轻量级虚拟化方案。它彻底改变了传统软件交付范式:不再依赖“在我机器上能跑”的模糊承诺,而是通过 Dockerfile 声明式定义应用运行时环境——包括基础操作系统层(FROM)、依赖安装(RUN)、配置挂载(COPY/ADD)、端口暴露(EXPOSE)、启动指令(CMD/ENTRYPOINT)等,最终构建成不可变、可复现、跨环境一致的镜像(Image)。镜像是分层存储的只读模板,每一层对应 Dockerfile 中一条指令,具备缓存复用机制,极大提升构建效率与镜像分发性能。而容器(Container)则是镜像的运行实例,拥有独立的 PID、Network、Mount、UTS、IPC 等命名空间,形成逻辑隔离的用户态运行环境,启动毫秒级、内存开销极低,远优于传统虚拟机。在单机容器管理之上,Kubernetes(简称 K8s)应运而生,它是由 Google 基于 Borg 系统经验开源的工业级容器编排平台,是解决大规模容器集群自动化部署、弹性伸缩、服务发现、负载均衡、滚动更新、健康检查、故障自愈等复杂运维问题的终极答案。K8s 的核心抽象是 Pod——最小调度与管理单元,一个 Pod 可封装一个或多个紧密耦合的容器(共享网络命名空间与存储卷),确保它们同驻一节点、协同启停。围绕 Pod,K8s 构建了完整的对象模型:Deployment 控制无状态应用副本集与声明式升级策略;Service 提供集群内稳定的网络访问入口与负载均衡(ClusterIP/NodePort/LoadBalancer);ConfigMap 与 Secret 解耦配置与敏感信息;PersistentVolume(PV)与 PersistentVolumeClaim(PVC)实现有状态应用的数据持久化;Ingress 统一管理外部 HTTP/HTTPS 流量路由;Namespace 实现多租户资源逻辑隔离;Role/RoleBinding 完成细粒度 RBAC 权限控制。所有这些对象均通过声明式 API(YAML/JSON)定义,并由 kube-apiserver、etcd、kube-scheduler、kube-controller-manager、kubelet、kube-proxy 等组件协同保障终态一致性。kubectl 是与 K8s 集群交互的核心命令行工具,其功能远超简单 CRUD:支持资源清单管理(apply/delete/get/describe)、实时日志查看(logs)、容器内执行命令(exec)、端口转发(port-forward)、资源监控(top)、调试诊断(describe/events)、标签选择器筛选(-l)、字段选择器过滤(--field-selector)等。熟练掌握 kubectl 不仅是日常运维的前提,更是理解 K8s 控制面与数据面协作机制的关键路径。本教程所涉“Linux容器”概念,需明确其非 Docker 专属,而是泛指所有基于 Linux 内核原生特性的容器运行时(如 containerd、CRI-O),Docker 本身已将底层运行时解耦为 containerd,体现 K8s CRI(Container Runtime Interface)标准化演进趋势。而“容器编排”一词,则精准概括了 K8s 的核心价值:将数十、数百乃至数千个动态变化的容器实例,纳入统一调度策略、服务拓扑与生命周期管理体系,实现真正意义上的“以应用为中心”的基础设施自动化。压缩包名称“Docker-K8s-master”暗示内容结构极可能包含:Docker 环境搭建与 daemon 配置、镜像仓库(Docker Hub / 私有 Registry)搭建与认证、Docker Compose 多容器本地编排实践、K8s 单节点(Minikube / Kind / MicroK8s)与高可用集群(kubeadm)部署、核心资源对象 YAML 编写规范与调试技巧、Helm Chart 包管理入门、网络插件(Calico / Flannel)原理与选型、存储方案(NFS / Rook / Longhorn)集成、监控栈(Prometheus + Grafana + kube-state-metrics)部署、日志收集(EFK / Loki)架构,以及大量真实场景故障模拟与排错演练(如 CrashLoopBackOff、ImagePullBackOff、Pending 状态分析、Service DNS 解析失败、Ingress 503 错误溯源等)。唯有如此“超详细”的深度覆盖,才能真正打通从单机容器开发到企业级云原生平台落地的认知断层,构建起支撑未来十年数字化基础设施演进的核心技术护城河。
汀、人工智能
k8s入门介绍,k8s多master多noede安装部署教程
资源摘要信息:"k8s入门介绍,k8s多master多node安装部署教程"这一资源全面系统地介绍了Kubernetes(简称k8s)的基础知识、架构设计、核心组件功能及其在实际生产环境中的高可用部署方案。该教程首先从Kubernetes的基本概念入手,深入浅出地阐述了其作为开源容器编排平台的核心价值与技术优势。Kubernetes源自希腊语“舵手”之意,象征着它在复杂分布式系统中掌控全局、调度资源的重要角色。该项目脱胎于Google内部运行十余年的Borg系统,继承并优化了Borg在大规模容器管理方面的丰富经验,是真正经过超大规模生产验证的成熟技术框架。自2014年开源以来,Kubernetes迅速成为云原生生态的基石,被广泛应用于企业级应用部署、自动化运维、微服务治理等领域。Kubernetes之所以被称为“可移植、可扩展、开源”的容器管理平台,是因为它基于容器镜像实现了跨环境的一致性部署能力,无论是开发、测试还是生产环境,只要具备兼容的容器运行时(如Docker),即可无缝迁移应用。其可扩展性体现在两个层面:一是集群本身可以通过增加Master和Worker节点实现水平扩展;二是通过HPA(Horizontal Pod Autoscaler)等机制,根据CPU、内存或自定义指标动态调整Pod副本数量,实现自动扩缩容。同时,作为CNCF(云原生计算基金会)的首个毕业项目,Kubernetes拥有庞大的社区支持和丰富的生态系统,源码完全开放,允许开发者进行深度定制与二次开发。在架构层面,Kubernetes采用典型的主从式(Master/Node)架构。Master节点负责整个集群的控制与协调,包含多个关键控制组件:apiserver是集群的唯一入口,所有请求都必须经过它进行认证、授权和处理;etcd是一个高可用的分布式键值存储数据库,用于持久化保存集群的状态信息,如Pod配置、Service定义、节点状态等,是集群的“大脑记忆”;scheduler负责监听未绑定的Pod,并根据资源需求、亲和性策略、污点容忍度等因素选择最合适的Worker节点进行调度;controller-manager则是一组控制器的集合,包括节点控制器、副本控制器、Deployment控制器等,持续监控集群状态并与期望状态比对,确保系统始终处于稳定运行状态。此外,网络插件如Calico负责实现Pod之间的通信和网络策略管理,CoreDNS提供集群内部的服务发现能力。Worker节点(也称Node或Minion)则是实际运行业务负载的地方,主要由kubelet、kube-proxy和容器运行时(如Docker)组成。kubelet是每个节点上的代理程序,负责接收来自apiserver的指令,管理Pod的生命周期,包括创建、启动、停止和销毁容器;kube-proxy则实现Service的负载均衡和网络代理功能,维护节点上的网络规则,确保服务间能够正确通信。kubectl作为用户与Kubernetes交互的主要命令行工具,提供了强大的CLI接口,支持对Pod、Deployment、Service、ConfigMap、Secret等各种资源对象进行增删改查操作,是日常管理和调试不可或缺的利器。针对高可用场景,本教程重点讲解了多Master多Node的安装部署方案。单Master架构存在单点故障风险,一旦Master宕机,集群将无法接受新的调度指令,影响业务连续性。因此,在生产环境中普遍采用多Master架构,通常通过keepalived + haproxy实现API Server的虚拟IP漂移和负载均衡,确保即使某个Master节点失效,其他节点仍能接管服务。多个Master节点共享同一个etcd集群(建议奇数个节点以避免脑裂),形成一个高可用控制平面。Worker节点可根据业务规模横向扩展,配合NodeSelector、Taints/Tolerations、Affinity等高级调度策略,实现资源的精细化管理和隔离。整个部署过程涉及操作系统初始化、时间同步、主机名解析、关闭防火墙与SELinux、配置YUM源、安装Docker、部署kubelet/kubeadm/kubectl、初始化第一个Master节点、加入其余Master和Worker节点、配置网络插件等多个步骤,每一步都需要严格遵循最佳实践,确保集群稳定性与安全性。综上所述,该资源不仅为初学者提供了清晰的学习路径,也为中级用户深入理解Kubernetes的内在机制和掌握高可用部署技能奠定了坚实基础,是一份兼具理论深度与实践指导意义的优质学习资料。
小乐笙
Kubernetes与Docker:容器编排的未来
本文探讨了Docker和Kubernetes在容器化技术中的作用,介绍了它们的基础概念、协作方式以及在部署、扩展、安全和治理方面的特性,帮助读者理解如何有效运用这两项技术来管理现代应用。
程序员喵姐
1892
【Docker高级篇】吃透容器编排:Swarm vs K8s 核心差异,为后续K8s学习打牢基础
本文从运维视角剖析单机Docker在批量管理、故障自愈、负载均衡及跨主机通信等方面的局限性,系统对比Docker Swarm与Kubernetes(K8s)在设计理念、部署复杂度、调度能力、高可用性和生态支持上的核心差异,并简要铺垫K8s三大基础概念:Pod、Service和Deployment,为云原生环境下容器编排技术选型与进阶学习提供依据。
予枫的编程笔记
1494
Docker技术系列文章,第十篇——Docker 集群与编排(以 Kubernetes 为例)
本文是Docker技术系列收尾之作,介绍了Docker集群与编排概念。指出大规模容器管理需借助工具,以Kubernetes为例,阐述其定义、优势、核心组件、部署流程、资源对象,还给出部署Web应用及滚动更新、回滚等实际应用案例,为容器化应用管理提供高效方案。
佳腾_
1810
【Kubernetes】架构与原理:核心概念、组件协同及容器化部署解析
本文围绕Kubernetes展开,介绍了其诞生背景,对比传统部署、虚拟化部署,阐述容器化部署优势。解析Kubernetes核心架构,包括控制平面与工作节点组件及协同原理,还介绍了Pod、控制器等核心概念。最后探讨了Kubernetes功能、与Docker差别及容器、虚拟机、物理机对比。
卜及中
2975
从Docker到K8s:容器编排实战与LNMP集群部署解析
本文深入剖析Docker与Kubernetes在容器化体系中的定位差异:Docker解决单机打包与运行问题,K8s专注集群级编排、调度、自愈与伸缩。通过LNMP架构的Docker Compose与K8s双路径部署对比,详解Pod、Deployment、Service、StatefulSet等核心抽象,并覆盖环境搭建(kind)、有状态服务部署(MySQL/Redis)、故障排查流程及Compose迁移路径,强调声明式配置与期望状态管理的核心思想。
weixin_33910759
519
Kubernetes(k8s)容器编排概述
K8s,全称Kubernetes,是Google基于Borg系统开源的容器编排工具,提供自动化应用部署、扩展和管理功能。K8s以其跨平台、资源高效利用、自动缩放和高可靠性等优势,成为容器领域的主流技术。核心概念包括节点(Master和Node)、Pod、Label、ReplicaSet、Service和Namespace,这些构建了强大的容器集群管理基础。
赵广陆
3598
Docker与K8S从零到实战:容器编排、部署与故障排查指南
本文系统讲解Docker容器化与Kubernetes编排的核心技术,涵盖Docker环境搭建、镜像构建、Compose编排;K8S集群部署(kubeadm)、Pod/Deployment/Service等核心资源操作;以及生产级故障排查(Pod异常、CPU节流、数据丢失)、监控告警(Prometheus+Grafana)和RBAC权限管理。强调从零动手实践,贯穿容器运行时到编排平台的完整链路。
weixin_34186128
550
云原生进阶之路:Docker 与 Kubernetes 深度解析及容器化应用迁移实战
本文深入探讨Docker与Kubernetes的关系,阐述从Docker到K8s的容器化应用迁移路径。重点介绍如何将Docker Compose应用迁移到K8s集群,涵盖Pod、Service、StatefulSet、ConfigMap/Secret等核心资源的适配方法,并提供迁移前评估、配置转换、部署验证及性能优化全流程指导。
yc.L
881
容器编排工具-Kubernetes
本文围绕容器编排展开,介绍了常见编排工具,重点解析K8s。阐述其基本功能、架构、组件,包括控制平面、API服务器等。还说明了K8s使用方法,如Pod创建流程、状态,kubectl命令及yaml配置。最后分享了阿里云K8s实践,如查看Pod状态、日志等。
MaAidan
1259
Kubernetes(K8s)、Docker容器和Git操作指令
本文围绕Go语言面试展开,涵盖Kubernetes基础概念、Pod创建过程、HTTP各版本特点、访问网页的流程及数据包处理、Docker相关内容和Git操作指令。介绍了K8s核心组件、资源对象,HTTP不同版本性能差异,还阐述了Docker容器与镜像关系、常用命令及异常排查方法等。
Aiyer0104
1385
【K8S】Kubernetes初探
本文深入探讨Kubernetes(K8S)的核心概念与架构,详细解析Pod、Service、Deployment等关键组件,阐述容器编排原理与实践。
SunAlwaysOnline
3710
Docker与Kubernetes核心概念解析:从容器化到云原生编排
本文系统解析Docker与Kubernetes的核心概念与架构:Docker通过镜像、容器和引擎实现应用标准化封装与运行;Kubernetes以控制平面(API Server、etcd、Scheduler、Controller Manager)和工作节点(kubelet、Container Runtime、kube-proxy)构成集群,以Pod为最小调度单元,通过Service/Ingress提供稳定服务发现与流量入口,并借助ConfigMap、Secret、Volume实现配置解耦、安全管理和持久化存储。全文强调声明式API、控制器模式及生产部署关键实践。
weixin_30564901
438
从Docker到Kubernetes:容器编排与集群管理的核心价值解析
本文深入剖析Docker与Kubernetes的核心职责差异:Docker聚焦单机容器运行时,解决环境一致性与轻量隔离;K8s作为集群编排平台,提供跨节点调度、自动故障恢复、弹性伸缩、声明式服务发布与Service服务发现等能力。文章通过部署演进案例、核心抽象(Pod/Deployment/Service)、控制平面机制及典型排查链路,厘清二者层次关系与适用场景,强调K8s并非替代Docker,而是构建在其之上的集群治理层。
weixin_34357887
342
Docker容器编排:Kubernetes实战
本文围绕Docker容器编排中Kubernetes的应用展开。介绍了容器编排基本概念和Kubernetes核心特性,阐述了Kubernetes集群部署、配置管理、监控运维的实战应用,还说明了Kubernetes与Docker的集成及和Docker Compose的协同,助读者掌握其应用方法。
2501_92487756
1127
从Docker到Kubernetes:容器化与编排实战入门指南
本文系统讲解Docker容器化与Kubernetes编排的核心概念与实操路径:涵盖Docker镜像构建、容器运行,以及Kubernetes Deployment、Service部署、kubectl命令使用;强调本地Minikube实验环境搭建、多阶段构建、Pod自愈机制,并延伸至生产环境的镜像安全、资源限制、健康探针、日志监控等关键实践。
weixin_34122604
456
Docker容器与Kubernetes编排指南
本文系统讲解Docker容器引擎与Kubernetes编排平台的核心概念、工作原理及技术关系。涵盖Docker Desktop配置优化、Docker单机容器管理、K8s控制平面与节点组件、Deployment与Service部署实践,并对比二者在开发测试与生产环境中的适用场景。强调K8s自1.24起默认使用containerd运行时,Docker需通过cri-dockerd适配,同时提供Docker Compose到Kubernetes的迁移路径和安全、网络、存储等高级运维要点。
AI-好学者
508
从 Docker 到 Kubernetes:概念对照与迁移
本文系统对比Docker Compose与Kubernetes的核心概念,包括Pod/Deployment/Service/Ingress与服务、网络、更新机制的映射关系;详解ConfigMap与Secret替代环境变量的配置管理升级路径;提供基于kompose的自动化转换、手动调整(镜像、PVC、副本、敏感信息)、minikube/kind本地验证及灰度上线的完整迁移实操流程;并阐明K8s适用场景与常见认知误区。
vipxieliang
1323
Docker Swarm 与 Kubernetes (K8s) 全面对比教程
本文详细对比了Docker Swarm和Kubernetes的核心区别,包括架构设计、易用性、功能性能及适用场景。适用于不同规模和技术背景的团队,帮助开发者根据实际需求选择合适的容器编排工具。
Rysxt
2143
容器基础(五)从容器到Kubernetes:云原生编排系统的本质解析
本文深入探讨了容器技术的本质和Kubernetes的架构设计,解析了Kubernetes的核心设计思想及其技术渊源。通过对比Docker Swarm,阐述了Kubernetes在容器编排领域的优势和特点,以及处理有状态容器迁移的挑战。
ʕ ᵔᴥᵔ ʔ(◞‸◟ )
1082
Docker与K8s:为什么容器化之后还要学Kubernetes?
本文系统阐述Docker与Kubernetes的核心定位差异:Docker解决应用打包与单机运行('怎么跑'),K8s解决跨节点调度、故障自愈、弹性伸缩、服务发现与滚动更新等集群级问题('跑在哪、坏了怎么办')。强调二者非替代关系,而是构建-运行-编排的流水线协作。涵盖Pod抽象、声明式API、Service/Ingress、资源管理、常见故障排查及生产最佳实践。
weixin_33766168
459