痛点:docker-compose 的烦恼
你用 docker-compose 跑了一堆服务:
# docker-compose.yml
services:
nginx:
image: nginx:1.27
ports:
- "80:80"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password123
redis:
image: redis:7.2
跑起来:docker-compose up -d
停了:docker-compose down
重启:docker-compose restart
看起来还行。直到某一天:
- 你的 nginx 挂了,没人重启它
- 你要扩容,得手动再跑一个
docker run - 你的 MySQL 容器 IP 变了,nginx 连不上了
- 你换了台机器,compose 文件要重新配一遍
这些问题 K8s 能帮你解决。但不是所有问题——K8s 不是魔法,它有自己的一套逻辑。
第一步:跑一个 nginx
你的集群在 192.168.3.56(control-plane)和 192.168.3.57(worker)上。containerd 2.2.x 已经装好了。
先别管复杂的。就一个 nginx。
写一个 yaml
# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
部署
kubectl apply -f nginx-pod.yaml
验证
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# nginx 1/1 Running 0 10s
kubectl logs nginx
# 看到 nginx 的启动日志
你跑起来了。一个简单的 nginx。
K8s 和 Docker 的区别
| 操作 | Docker Compose | Kubernetes |
|------|---------------|------------|
| 启动 | docker-compose up | kubectl apply -f xxx.yaml |
| 查看状态 | docker-compose ps | kubectl get pods |
| 看日志 | docker-compose logs | kubectl logs <pod名> |
| 停止 | docker-compose down | kubectl delete -f xxx.yaml |
命令不一样,但做的事情差不多。
关键区别:Docker Compose 是你手动管容器。K8s 是你写一个 yaml 告诉它"我想要什么",它自己维持这个状态。
比如你删了 Pod:
kubectl delete pod nginx
# pod "nginx" deleted
如果这是裸 Pod(kind: Pod),它就真的没了。但如果你用的是 Deployment(下一篇讲),它会自动重建。
你学到了什么
- K8s 用 yaml 管理资源,不是用命令行
- Pod 是最小的部署单位,一个 Pod 可以包含一个或多个容器
kubectl apply是声明式的——你告诉 K8s 你想要什么,它负责实现
下一步
你跑了一个 Pod。但 Pod 是短暂的——它可能随时被删掉、被重建、被迁移到另一台机器。
你需要一个稳定的方式来访问它。这就是 Service 的作用。
下一篇讲 Deployment(怎么让 Pod 不死)和 Service(怎么让别人访问你的服务)。