Kubernetes入门实战从零部署第一个应用
K8s核心概念部署第一个应用常用kubectl命令滚动更新和回滚常见问题排查K8s入门不难,难的是生产环境的运维。建议先在本地minikube上多练习,熟悉了再上生产。有问题评论区交流~
·
用了两年K8s,从一脸懵逼到现在能独立运维集群,踩过不少坑。
这篇文章带你从零开始,部署第一个应用到K8s集群。
一、K8s是什么?
简单说,K8s就是容器编排工具。
Docker解决了单个容器的问题,K8s解决的是:
- 几十上百个容器怎么管理?
- 容器挂了怎么自动重启?
- 流量怎么负载均衡?
- 怎么滚动更新不停服?
二、核心概念
先搞懂这几个概念:
| 概念 | 说明 | 类比 |
|---|---|---|
| Pod | 最小部署单元,包含1个或多个容器 | 豆荚里的豆子 |
| Deployment | 管理Pod的副本数和更新策略 | 车间主管 |
| Service | 提供稳定的访问入口 | 前台接待 |
| Namespace | 资源隔离 | 不同部门 |
三、环境准备
本地学习环境
推荐用minikube或kind,一条命令搞定:
# 安装minikube(Mac)
brew install minikube
# 启动集群
minikube start
# 查看状态
kubectl get nodes
输出:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.28.3
生产环境
生产环境建议用云厂商的托管K8s:
- 阿里云ACK
- 腾讯云TKE
- 华为云CCE
省去运维Master节点的麻烦。
四、部署第一个应用
4.1 创建Deployment
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 3个副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
# 部署
kubectl apply -f nginx-deployment.yaml
# 查看Pod
kubectl get pods
输出:
NAME READY STATUS RESTARTS AGE
nginx-deployment-5d6f7b8c9d-abc12 1/1 Running 0 30s
nginx-deployment-5d6f7b8c9d-def34 1/1 Running 0 30s
nginx-deployment-5d6f7b8c9d-ghi56 1/1 Running 0 30s
三个Pod都Running了。
4.2 创建Service
Pod的IP会变,需要Service提供稳定入口:
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
kubectl apply -f nginx-service.yaml
kubectl get svc
输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service ClusterIP 10.96.123.45 <none> 80/TCP 10s
4.3 访问测试
# 在集群内访问
kubectl run curl --image=curlimages/curl -it --rm -- curl nginx-service
# 或者端口转发到本地
kubectl port-forward svc/nginx-service 8080:80
浏览器访问 http://localhost:8080 就能看到Nginx页面了。
五、常用命令
查看资源
kubectl get pods # 查看Pod
kubectl get pods -o wide # 显示更多信息(IP、节点)
kubectl get deploy # 查看Deployment
kubectl get svc # 查看Service
kubectl get all # 查看所有资源
查看详情和日志
kubectl describe pod <pod-name> # 查看Pod详情
kubectl logs <pod-name> # 查看日志
kubectl logs -f <pod-name> # 实时日志
进入容器
kubectl exec -it <pod-name> -- /bin/bash
扩缩容
kubectl scale deployment nginx-deployment --replicas=5
六、滚动更新
更新镜像版本:
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
查看更新状态:
kubectl rollout status deployment/nginx-deployment
回滚:
kubectl rollout undo deployment/nginx-deployment
K8s会逐个替换Pod,保证服务不中断。
七、常见问题排查
Pod一直Pending
kubectl describe pod <pod-name>
常见原因:
- 资源不足(CPU/内存)
- 没有合适的节点
- PVC无法绑定
Pod一直CrashLoopBackOff
kubectl logs <pod-name>
kubectl logs <pod-name> --previous # 看上一次的日志
常见原因:
- 程序启动失败
- 配置错误
- 端口冲突
ImagePullBackOff
镜像拉不下来:
- 镜像名写错了
- 私有仓库没配置认证
- 网络问题
八、远程管理集群
K8s集群一般在服务器上,怎么在本地管理?
方法1:跳板机
通过SSH跳板机执行kubectl,麻烦。
方法2:VPN
公司VPN连到内网,然后访问API Server。
方法3:组网直连
我现在用的方案:用星空组网工具把本地和服务器连起来,直接访问API Server。
# 本地直接执行
kubectl --kubeconfig=~/.kube/config-prod get pods
比VPN稳定,也不用每次都SSH登录服务器。
九、学习路线建议
入门:Pod、Deployment、Service、kubectl基本操作
进阶:ConfigMap、Secret、Ingress、PV/PVC
高级:RBAC、NetworkPolicy、自定义调度、Operator
K8s内容很多,但核心概念就那几个。先把Pod、Deployment、Service玩熟,其他的用到再学。
总结
今天学了:
- K8s核心概念
- 部署第一个应用
- 常用kubectl命令
- 滚动更新和回滚
- 常见问题排查
K8s入门不难,难的是生产环境的运维。建议先在本地minikube上多练习,熟悉了再上生产。
有问题评论区交流~
更多推荐
所有评论(0)