Kubernetes Handbook:从Docker到kubectl的平滑过渡指南
前言
对于熟悉Docker的开发者来说,Kubernetes的学习曲线可能显得有些陡峭。本文将作为Docker用户向Kubernetes过渡的桥梁,详细对比Docker命令与kubectl命令的对应关系,帮助开发者快速掌握Kubernetes的核心操作。
核心概念差异
在开始命令对比之前,我们需要理解Docker和Kubernetes在设计理念上的关键区别:
- 单机与集群:Docker主要管理单机容器,而Kubernetes设计用于管理跨多节点的容器集群
- 直接与声明式:Docker命令通常是直接操作,而Kubernetes更倾向于声明式管理
- 容器与Pod:Kubernetes的基本调度单位是Pod(可包含多个容器),而非单个容器
命令对比详解
运行应用
Docker方式:
docker run -d --restart=always -e DOMAIN=cluster --name nginx-app -p 80:80 nginx
kubectl方式:
# 创建Deployment
kubectl run --image=nginx nginx-app --port=80 --env="DOMAIN=cluster"
# 创建Service暴露端口
kubectl expose deployment nginx-app --port=80 --name=nginx-http
关键区别:
- Kubernetes将运行应用分为两个步骤:创建Deployment和创建Service
- Deployment确保指定数量的Pod副本始终运行(类似Docker的--restart=always但更强大)
- Service提供稳定的访问入口和负载均衡
查看运行状态
Docker方式:
docker ps
kubectl方式:
kubectl get pods
扩展命令:
kubectl get deployments
查看部署状态kubectl get services
查看服务状态kubectl get all
查看所有资源
与容器交互
附加到运行中容器
Docker方式:
docker attach <container-id>
kubectl方式:
kubectl attach -it <pod-name>
在容器中执行命令
Docker方式:
docker exec -it <container-id> /bin/sh
kubectl方式:
kubectl exec -it <pod-name> -- /bin/sh
注意事项:
- kubectl需要在命令前加上
--
分隔符 - 对于多容器Pod,需指定容器名:
kubectl exec -it <pod-name> -c <container-name> -- /bin/sh
日志查看
Docker方式:
docker logs -f <container-id>
kubectl方式:
kubectl logs -f <pod-name>
高级用法:
kubectl logs --previous
查看前一个容器的日志(当容器崩溃重启时特别有用)kubectl logs -c <container-name>
查看Pod中特定容器的日志
停止和删除资源
Docker方式:
docker stop <container-id>
docker rm <container-id>
kubectl方式:
kubectl delete deployment <deployment-name>
重要区别:
- 在Kubernetes中,通常不直接删除Pod,而是删除管理Pod的Deployment
- 直接删除Pod会导致Deployment重新创建新的Pod
环境信息查询
版本信息
Docker方式:
docker version
kubectl方式:
kubectl version
环境信息
Docker方式:
docker info
kubectl方式:
kubectl cluster-info
扩展命令:
kubectl get nodes
查看集群节点状态kubectl describe node <node-name>
查看节点详细信息
特殊场景处理
私有镜像仓库
Kubernetes处理私有镜像仓库的方式与Docker不同,需要通过Secret来配置访问凭证:
- 创建docker-registry secret:
kubectl create secret docker-registry my-registry-key \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL
- 在Pod定义中引用该secret:
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: my-registry-key
最佳实践建议
- 从Deployment开始:总是使用Deployment来管理Pod,而不是直接创建Pod
- 善用标签(Label):使用一致的标签策略方便资源管理
- 理解控制器模式:Kubernetes通过控制器模式实现期望状态管理,这与Docker的直接操作有本质区别
- 日志收集策略:考虑使用集群级日志收集方案,而非依赖单个容器日志
- 监控与健康检查:充分利用Kubernetes的Liveness和Readiness探针
总结
从Docker过渡到Kubernetes需要思维模式的转变:从直接管理容器到声明式管理集群资源。通过本文的命令对比,开发者可以快速找到与Docker命令对应的kubectl操作,同时理解背后的设计理念差异。掌握这些基础命令后,可以进一步探索Kubernetes更高级的特性,如ConfigMap、Volume、Horizontal Pod Autoscaler等。
记住,Kubernetes的强大之处在于它的抽象能力和自动化管理,合理利用这些特性可以大大简化容器化应用的管理工作。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考