痛点: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(下一篇讲),它会自动重建。

你学到了什么

  1. K8s 用 yaml 管理资源,不是用命令行
  2. Pod 是最小的部署单位,一个 Pod 可以包含一个或多个容器
  3. kubectl apply 是声明式的——你告诉 K8s 你想要什么,它负责实现

下一步

你跑了一个 Pod。但 Pod 是短暂的——它可能随时被删掉、被重建、被迁移到另一台机器。

你需要一个稳定的方式来访问它。这就是 Service 的作用。

下一篇讲 Deployment(怎么让 Pod 不死)和 Service(怎么让别人访问你的服务)。

参考资料