用了两年K8s,从一脸懵逼到现在能独立运维集群,踩过不少坑。

这篇文章带你从零开始,部署第一个应用到K8s集群。


一、K8s是什么?

简单说,K8s就是容器编排工具

Docker解决了单个容器的问题,K8s解决的是:

  • 几十上百个容器怎么管理?
  • 容器挂了怎么自动重启?
  • 流量怎么负载均衡?
  • 怎么滚动更新不停服?

二、核心概念

先搞懂这几个概念:

概念 说明 类比
Pod 最小部署单元,包含1个或多个容器 豆荚里的豆子
Deployment 管理Pod的副本数和更新策略 车间主管
Service 提供稳定的访问入口 前台接待
Namespace 资源隔离 不同部门

三、环境准备

本地学习环境

推荐用minikubekind,一条命令搞定:

# 安装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玩熟,其他的用到再学。


总结

今天学了:

  1. K8s核心概念
  2. 部署第一个应用
  3. 常用kubectl命令
  4. 滚动更新和回滚
  5. 常见问题排查

K8s入门不难,难的是生产环境的运维。建议先在本地minikube上多练习,熟悉了再上生产。

有问题评论区交流~

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐