Kubernetes(K8s)入门实践

Kubernetes(K8s)入门实践

前言

Kubernetes,简称 K8s,是一个开源的容器编排平台,主要用于自动化部署、扩展和管理容器化应用。

在云原生技术体系中,K8s 已经成为非常重要的基础设施能力。它可以帮助我们更高效地管理容器应用的整个生命周期,例如部署、扩容、滚动更新、故障恢复、服务发现和负载均衡等。

本文将按照自己的入门学习路线,介绍 Kubernetes 的基本概念、整体架构、核心组件以及常用实践。


1. 什么是 Kubernetes?

Kubernetes 是由 Google 开源的容器编排系统,主要用于自动化容器化应用的部署、扩展和管理。

在没有 Kubernetes 之前,如果我们想运行多个容器应用,通常需要手动处理很多事情,例如:

  • 容器部署在哪台机器上
  • 某个容器挂了如何自动恢复
  • 多个容器之间如何通信
  • 应用如何扩容和缩容
  • 新版本如何平滑发布
  • 服务如何对外暴露

而 Kubernetes 的出现,就是为了解决这些问题。

简单来说,Kubernetes 的目标是:

让容器化应用的部署和管理变得简单、高效和可靠。

Kubernetes 提供了很多能力,例如:

  • 服务发现
  • 负载均衡
  • 自动扩缩容
  • 滚动更新
  • 故障自愈
  • 配置管理
  • 密钥管理
  • 存储编排

2. K8s 架构

Kubernetes 采用主从架构,主要由 控制平面 Control Plane工作节点 Worker Node 组成。

控制平面负责管理整个集群,工作节点负责真正运行应用容器。

可以简单理解为:

  • Control Plane:负责管理和调度
  • Worker Node:负责运行具体业务应用

2.1 Control Plane 控制平面

Control Plane 是 Kubernetes 集群的大脑,负责整个集群的管理、调度和状态维护。

核心组件包括:

组件 说明
API Server K8s 的统一入口,提供 REST API,所有请求都通过它处理
Scheduler 负责将 Pod 调度到合适的 Worker 节点
Controller Manager 负责维护集群状态,例如副本数量、节点状态等
etcd 高可用的键值存储,用于保存集群的所有数据

其中,API Server 是整个 Kubernetes 的入口。无论是用户执行 kubectl 命令,还是集群内部组件之间通信,最终都会通过 API Server 完成。


2.2 Worker Node 工作节点

Worker Node 是真正运行应用容器的节点。

每个 Worker Node 中通常包含以下组件:

组件 说明
Kubelet 运行在节点上,负责管理 Pod 和容器的生命周期
Kube-proxy 负责为 Service 提供网络代理和负载均衡
Container Runtime 容器运行时,负责真正启动和运行容器,例如 containerd

在 Worker Node 上,业务应用最终会以 Pod 的形式运行。


3. 核心概念

Kubernetes 中有很多资源对象,可以先从以下几个核心概念开始。


3.1 Pod

Pod 是 Kubernetes 中最小的部署单元。

一个 Pod 中可以包含一个或多个容器,这些容器会共享网络、存储等资源。

通常情况下,一个 Pod 中只运行一个主要业务容器。

Pod 的特点:

  • K8s 中最小的调度单位
  • 一个 Pod 可以包含一个或多个容器
  • 同一个 Pod 内的容器共享网络
  • Pod 的生命周期通常比较短
  • Pod 异常后可以被重新创建

Pod 示例:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80

创建 Pod:

bash 复制代码
kubectl apply -f pod.yaml

查看 Pod:

bash 复制代码
kubectl get pods

3.2 Deployment

Deployment 用于管理无状态应用,是日常使用最频繁的资源对象之一。

它并不是直接运行容器,而是通过 ReplicaSet 来管理 Pod。

Deployment 的主要作用:

  • 管理 Pod 副本数量
  • 支持滚动更新
  • 支持版本回滚
  • 自动恢复异常 Pod
  • 保证应用始终运行在期望状态

Deployment 示例:

yaml 复制代码
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:latest
          ports:
            - containerPort: 80

创建 Deployment:

bash 复制代码
kubectl apply -f deployment.yaml

查看 Deployment:

bash 复制代码
kubectl get deployments

查看 Pod:

bash 复制代码
kubectl get pods

3.3 Service

Pod 的 IP 地址不是固定的。当 Pod 被删除或重新创建后,它的 IP 地址可能会发生变化。

如果其他服务直接访问 Pod IP,就会出现访问不稳定的问题。

Service 的作用就是为一组 Pod 提供一个稳定的访问入口。

常见 Service 类型如下:

类型 说明
ClusterIP 默认类型,只能在集群内部访问
NodePort 通过节点端口暴露服务
LoadBalancer 通过云厂商负载均衡器暴露服务
ExternalName 将服务映射到外部域名

Service 示例:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

3.4 Namespace

Namespace 用于在同一个 Kubernetes 集群中划分不同的逻辑空间。

它可以帮助我们将不同环境、不同项目或不同团队的资源进行隔离。

常见使用场景:

  • 开发环境:dev
  • 测试环境:sit / uat
  • 生产环境:prod
  • 不同团队资源隔离
  • 不同项目资源隔离

创建 Namespace:

bash 复制代码
kubectl create namespace dev

查看 Namespace:

bash 复制代码
kubectl get namespaces

在指定 Namespace 中创建资源:

bash 复制代码
kubectl apply -f deployment.yaml -n dev

查看指定 Namespace 下的 Pod:

bash 复制代码
kubectl get pods -n dev

3.5 ConfigMap & Secret

在实际项目中,应用通常需要读取配置,例如端口号、数据库地址、环境变量等。

如果把这些配置直接写死在镜像中,就会导致镜像不够灵活。

Kubernetes 提供了 ConfigMap 和 Secret 来解决这个问题。


ConfigMap

ConfigMap 用于保存普通配置信息。

示例:

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  APP_PORT: "8080"

在 Pod 中使用 ConfigMap:

yaml 复制代码
env:
  - name: APP_ENV
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: APP_ENV

Secret

Secret 用于保存敏感信息,例如密码、Token、证书等。

示例:

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  DB_PASSWORD: "123456"

在 Pod 中使用 Secret:

yaml 复制代码
env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: app-secret
        key: DB_PASSWORD

需要注意的是,Secret 虽然用于保存敏感数据,但并不代表默认就是绝对安全的。生产环境中还需要结合 RBAC、加密存储等方式一起使用。


4. 安装 K8s

学习 Kubernetes 可以选择多种安装方式。

如果只是本地学习,可以使用 Minikube 或 Kind。如果想更接近生产环境,可以使用 kubeadm 搭建集群。


4.1 使用 kubeadm 安装

kubeadm 是 Kubernetes 官方提供的集群初始化工具,适合学习 K8s 集群搭建过程。

安装前通常需要准备:

  • 至少 2 台 Linux 服务器
  • 关闭 swap
  • 配置容器运行时
  • 安装 kubeadm、kubelet、kubectl
  • 配置网络插件

初始化 Master 节点:

bash 复制代码
kubeadm init

初始化成功后,会生成一条 kubeadm join 命令,用于 Worker 节点加入集群。

配置 kubectl:

bash 复制代码
mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看节点:

bash 复制代码
kubectl get nodes

安装网络插件后,节点状态会逐渐变为 Ready


4.2 本地学习环境推荐

如果只是入门学习,不建议一开始就搭建复杂集群,可以先使用 Minikube:

bash 复制代码
minikube start

或者使用 Kind:

bash 复制代码
kind create cluster

这两种方式更适合本地快速学习和实验。


5. 常用命令

Kubernetes 日常操作主要通过 kubectl 命令完成。

查看节点:

bash 复制代码
kubectl get nodes

查看 Pod:

bash 复制代码
kubectl get pods

查看所有资源:

bash 复制代码
kubectl get all

查看 Deployment:

bash 复制代码
kubectl get deployments

查看 Service:

bash 复制代码
kubectl get svc

查看资源详情:

bash 复制代码
kubectl describe pod pod-name

查看日志:

bash 复制代码
kubectl logs pod-name

进入容器:

bash 复制代码
kubectl exec -it pod-name -- /bin/sh

删除资源:

bash 复制代码
kubectl delete -f deployment.yaml

查看当前上下文:

bash 复制代码
kubectl config current-context

切换 Namespace:

bash 复制代码
kubectl config set-context --current --namespace=dev

6. 部署一个示例应用

下面使用 Deployment 和 Service 部署一个简单的 Nginx 应用。


6.1 创建 Deployment

创建 nginx-deployment.yaml 文件:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo-nginx
  template:
    metadata:
      labels:
        app: demo-nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

执行命令:

bash 复制代码
kubectl apply -f nginx-deployment.yaml

查看 Deployment:

bash 复制代码
kubectl get deployments

查看 Pod:

bash 复制代码
kubectl get pods

6.2 创建 Service

创建 nginx-service.yaml 文件:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: demo-nginx-service
spec:
  type: NodePort
  selector:
    app: demo-nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

执行命令:

bash 复制代码
kubectl apply -f nginx-service.yaml

查看 Service:

bash 复制代码
kubectl get svc

访问服务:

bash 复制代码
http://节点IP:30080

如果使用的是 Minikube,可以执行:

bash 复制代码
minikube service demo-nginx-service

6.3 扩容应用

将副本数扩容到 5 个:

bash 复制代码
kubectl scale deployment demo-nginx --replicas=5

查看 Pod 数量:

bash 复制代码
kubectl get pods

6.4 更新应用

修改镜像版本:

bash 复制代码
kubectl set image deployment/demo-nginx nginx=nginx:1.25

查看更新状态:

bash 复制代码
kubectl rollout status deployment/demo-nginx

6.5 回滚应用

如果新版本有问题,可以回滚到上一个版本:

bash 复制代码
kubectl rollout undo deployment/demo-nginx

查看历史版本:

bash 复制代码
kubectl rollout history deployment/demo-nginx

相关推荐
阿里云云原生15 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉15 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情17 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海1 天前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色1 天前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠1 天前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟1 天前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。1 天前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠1 天前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes