4、Kubernetes入门:Pod、Service、Deployment核心概念、kubectl常用命令、声明式API理解

好,咱们进入正题。Kubernetes,简称K8s,是PaaS平台的基石。你想想看,没有它,我们后面讲的所有中间件服务化,都像是空中楼阁。这一章,我带你把K8s最核心的三个概念——Pod、Service、Deployment,以及日常操作和声明式API,一次性理清楚。

我个人习惯,学新东西先抓主干。K8s的主干就是这三个对象。搞懂了它们,你就掌握了K8s的命脉。

4.1 Pod:最小的调度单元

Pod是K8s里你能创建和部署的最小单元。它不是单个容器,而是一个或多个容器的组合。这些容器共享网络、存储和生命周期。

为什么要有Pod? 直接跑容器不行吗?

嗯,这里要注意。有些场景下,两个进程需要紧密协作,比如一个写日志,一个读日志。它们最好在同一台机器上,共享同一个网络栈和存储卷。Pod就是为这种“亲密关系”设计的。

核心要点:

  • 一个Pod里可以有一个或多个容器
  • Pod内的容器共享IP和端口空间
  • Pod是短暂的,随时可能被销毁重建

我在项目中遇到过,有同事把两个需要通信的服务放在两个Pod里,结果网络配置搞得很复杂。其实,如果它们需要共享数据或本地通信,放在同一个Pod里会更简单。

4.2 Service:稳定的访问入口

Pod是动态的,IP会变。那谁来提供稳定的访问入口?Service就是干这个的。

Service为一组功能相同的Pod提供统一的访问入口。它通过标签选择器(Label Selector)来找到目标Pod。

说白了,Service就是一个抽象层。你访问Service的IP,它帮你把请求转发到后端的某个Pod上。

Service类型 说明 使用场景
ClusterIP 集群内部可访问 内部服务间调用
NodePort 通过节点IP+端口访问 外部调试、测试
LoadBalancer 云厂商提供负载均衡器 生产环境对外暴露

避坑指南: 我曾经在配置Service时,忘记给Pod打上正确的标签,结果Service找不到后端Pod,一直报错。记住,标签是Service和Pod之间的桥梁。

4.3 Deployment:声明式的应用管理

Deployment是K8s里最常用的控制器。它负责管理Pod的副本数、滚动更新、回滚等。

你只需要告诉Deployment:“我想要3个副本,镜像版本是v2”,它就会自动帮你搞定。这就是声明式API的魅力。

为什么会这样?因为Deployment背后有一个控制器循环,它会不断对比“当前状态”和“期望状态”,然后采取行动让它们一致。

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.21
        ports:
        - containerPort: 80

这个YAML文件,就是声明式的。我告诉K8s:“我要一个叫nginx-deployment的Deployment,3个副本,镜像用nginx:1.21”。剩下的,K8s自己会处理。

4.4 kubectl常用命令

kubectl是操作K8s的命令行工具。我建议你把它当成日常伴侣,多用就熟了。

以下是我最常用的几个命令:

  • kubectl get pods:查看所有Pod
  • kubectl get svc:查看所有Service
  • kubectl get deployment:查看所有Deployment
  • kubectl apply -f file.yaml:应用一个YAML文件
  • kubectl delete -f file.yaml:删除一个YAML文件定义的对象
  • kubectl logs pod-name:查看Pod日志
  • kubectl exec -it pod-name -- /bin/bash:进入Pod内部

注意: 使用kubectl delete时要小心,它会直接删除资源。我曾经在生产环境误删了一个Deployment,还好有备份,不然就出大事了。建议先加--dry-run=client参数预览一下。

4.5 理解声明式API

声明式API是K8s的核心设计哲学。你只需要描述“想要什么”,而不是“怎么去做”。

举个例子:

  • 命令式: 先创建3个容器,如果某个挂了,再手动创建一个。
  • 声明式: 告诉K8s“我要3个副本”,K8s自己保证始终有3个在运行。

你想想看,哪个更省心?显然是声明式。尤其是在大规模集群中,手动管理根本不可行。

我个人习惯,所有资源都写成YAML文件,然后用kubectl apply提交。这样既方便版本控制,又能保证一致性。

嗯,这里要注意。声明式API虽然好,但也不是万能的。有些临时操作,比如快速查看日志、进入容器,还是得用命令式。两者结合,才是最佳实践。

好了,这一章的内容就到这里。Pod、Service、Deployment这三个概念,你只要理解了,K8s的大门就为你敞开了。下一章,我们聊聊K8s的网络和存储,这些都是PaaS平台的关键基础设施。