很多人第一次接触 Kubernetes, 都会有一种感觉:

集群好像搭起来了, 但接下来不知道该干什么。

概念看了不少, 命令也敲过, 可真要用在项目里,还是心里没底。

这篇文章不讲晦涩定义, 只站在 运维工程师的实际使用角度, 把 Kubernetes 真正会用到的东西 一次讲清楚。


Kubernetes 到底在解决什么问题?

在没有 Kubernetes 之前, 我们部署服务往往是这样的:

  • 手动启动容器

  • 手动分配端口

  • 容器挂了再手动重启

  • 扩容只能多起几个容器

这种方式的问题很明显:

不稳定、不可控、无法规模化。

而 Kubernetes 的思路非常简单:

你只需要告诉它“我想要什么状态”剩下的交给它自己完成。

这也是 Kubernetes 最核心的设计理念:声明式管理

640.png

一个 Kubernetes 集群,里面都在忙什么?

很多人觉得 Kubernetes 复杂, 其实只是角色多,分工清晰

Master 节点,可以理解为指挥中心。

它负责:

  • 接收所有操作请求

  • 决定 Pod 应该跑在哪个节点

  • 维护整个集群的期望状态

其中最重要的只有一个组件需要记住:

kube-apiserver

所有命令、所有控制, 最终都会经过它。


Node 节点的工作反而很简单。

只做三件事:

  • 运行容器

  • 上报状态

  • 执行调度结果

Node 不做决策, 只负责执行。


用 Kubernetes,方式其实只有三种

这是很多人用不好 K8s 的根本原因。

第一种:纯命令式(不推荐)

kubectl run nginx --image=nginx

快是快, 但只适合临时测试, 不适合长期维护。


第二种:配置文件 + create

kubectl create -f nginx.yaml

比命令好, 但对频繁变更并不友好。


第三种:声明式(生产首选)

kubectl apply -f nginx.yaml

你只关心一件事:

最终状态是不是我想要的

至于中间怎么变化, Kubernetes 会自己处理。


kubectl 这些命令,日常一定会用

不需要死记, 真正常用的就这几个:

  • 查看资源

kubectl get pod
  • 查看详细信息

kubectl describe pod nginx
  • 查看日志

kubectl logs nginx
  • 进入容器

kubectl exec -it nginx -- /bin/bash
  • 删除资源

kubectl delete -f nginx.yaml

Pod 并不是你真正部署应用的方式

很多新手一开始就直接创建 Pod, 但在真实环境中,几乎不会这样做

原因很简单:

  • Pod 挂了不会自动重建

  • Pod 没有副本控制

  • Pod 不支持升级和回滚

Pod 更像是一个最小运行单元, 而不是一个部署单元。


真正用来部署应用的,是 Deployment

Deployment 才是生产环境的主角。

它能帮你解决:

  • 应用副本数量控制

  • Pod 异常自动拉起

  • 滚动升级

  • 版本回滚

创建一个 Nginx 服务:

kubectl create deployment nginx --image=nginx --replicas=3

你会发现:

  • Pod 自动创建

  • 分布在不同节点

  • 异常会自动恢复


Pod IP 会变,服务怎么访问?

这是几乎每个新手都会问的问题。

答案只有一个:Service

Service 提供了一个稳定入口, 即使 Pod 重建、IP 改变, 也不会影响访问。

最常见的一种用法:

kubectl expose deployment nginx \
--port=80 --target-port=80 --type=NodePort

扩容和缩容,其实就是一条命令

kubectl scale deployment nginx --replicas=5

不用重启, 不用停服务, Service 会自动分流。


滚动升级和回滚,是 Kubernetes 的精华

升级镜像版本:

kubectl set image deployment nginx nginx=nginx:1.19 --record

查看历史版本:

kubectl rollout history deployment nginx

回滚只需要一条命令:

kubectl rollout undo deployment nginx

这就是 Kubernetes 能真正用在生产环境的原因。


YAML,才是 Kubernetes 的最终形态

在生产环境里, 你一定会大量使用 YAML。

apiVersion: apps/v1
kind:Deployment
metadata:
name:nginx
spec:
replicas:1
selector:
    matchLabels:
      app:nginx
template:
    metadata:
      labels:
        app:nginx
    spec:
      containers:
      -name:nginx
        image:nginx:1.17

一条命令即可生效:

kubectl apply -f deployment.yaml

Dashboard:看一眼就好,不要依赖

Dashboard 可以帮你:

  • 看状态

  • 查日志

  • 简单排错

但真正稳定、可控的运维, 永远离不开 命令行 + YAML