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:查看所有Podkubectl get svc:查看所有Servicekubectl get deployment:查看所有Deploymentkubectl 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平台的关键基础设施。