作为开发者,看完这篇文章就可以快速上手Kubernetes了

前言

在这之前我们已经学习过了Kubernetes的核心组件不会Kubernetes?一站式入门指南,带你快速掌握 K8s的核心组件,了解了

  • Node是一个运行服务的主机或者虚拟机;

  • Pod是作为一个K8s中最小单元存在,存放多个容器的一个组件;

  • ConfigMap可以把一些配置项用key-value的形式存储起来;

  • Secret则可以用密文的方式加密ConfigMap;

  • 而作为网关使用的Service可以将pod的api统一管理和ip分发;

  • Deployment则可以统一管理多个pod;Ingress虽然在后续版本中被遗弃掉了,但是作为"Nginx"加dns域名解析我们还是可以了解的;

  • 除了Deployment管理无状态的Pod之外,我们还可以存在一个有状态的StatefulSet,有了这个之后我们就可以使得Pod拥有"持久化"的能力,可以用来运行一些数据库之类的中间件;

  • 最后我们了解到了Volume可以作为磁盘挂载,存储我们pod中产生的一些需要持久化的文件等等。

Kubernetes的核心架构

而在这篇文章中,我们需要简单学习一下Kubernetes的核心架构:

这张图展示了Kubernetes(k8s)集群的架构。可能很多人看到这张图有点懵,下面作者就来带大家认识一下里面的一些东西。Kubernetes 是典型的 Master-Worker 架构,上面的Control Plane我们可以理解为Master-Node,而图中的两个Node1和Node2就是Worker-Node,通过两个Master-Node和 三个Worker-Node就可以组成一个高可用的K8s集群了。

控制平面(Control Plane)

控制平面是集群的大脑,负责管理整个集群的状态。它由以下几个主要组件组成:

  • kube-api-server :API服务器,是集群的中心枢纽,提供RESTful接口,允许用户与集群交互。我们后面不管通过命令行kubectl,还是图形界面操作K8s集群,都要经过kube-api-server,而k8s会有鉴权检查,他会检查 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT 环境变量以及 /var/run/secrets/kubernetes.io/serviceaccount/token 中是否存在服务帐户令牌文件。如果没有,则会拒绝访问。
  • etcd:一个分布式键值存储系统,用于保存集群的状态数据。
  • cloud-controller-manager:云控制器管理器,集成云提供商的服务,如负载均衡器和自动伸缩。
  • scheduler(kube-scheduler):调度器,负责将Pod调度到合适的节点上运行。
  • controller manager(kube-controller-manager):控制器管理器,负责执行各种控制循环,以维护集群状态。

节点(Nodes)

节点是集群中的工作机器,运行应用程序。每个节点包含以下组件:

  • kubelet:一个代理服务,运行在每个节点上,负责创建和删除Pod,并确保它们按照预期运行。
  • kube-proxy:一个网络代理,运行在每个节点上,实现服务(Service)的网络规则。
  • Pods:这是Kubernetes的基本调度单位,包含一个或多个容器,以及它们所需的资源。

集群(Cluster)

集群是由多个节点组成的集合,这些节点通过网络连接在一起,共同构成一个逻辑单元。集群可以跨越多个物理位置,如数据中心或云提供商的数据中心。上面的CLUSTER的框框就是一个集群。

云提供商API

云提供商API是可选的,用于与特定云提供商的服务进行交互,例如AWS、GCP或Azure。这个就是很多云服务商提供的k8s集群了。

介绍完了K8s的架构之后,我们来看一下如何使用K8s的命令呢,我们这次主要来讲解一下我们平时在开发过程中会遇到的哪些命令。

K8s 命令

语法

使用以下语法从终端窗口运行 kubectl 命令:

shell 复制代码
kubectl [command] [TYPE] [NAME] [flags]

其中 commandTYPENAMEflags 分别是:

  • command:指定要对一个或多个资源执行的操作,例如 creategetdescribedelete

  • TYPE:指定资源类型。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:

    shell 复制代码
    kubectl get pod pod1
    kubectl get pods pod1
    kubectl get po pod1
  • NAME:指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。例如:kubectl get pods

  • flags: 指定可选的参数。例如,可以使用 -s--server 参数指定 Kubernetes API 服务器的地址和端口。

关闭服务

我们如果需要关闭这个服务或者减少一个节点,则需要关闭我们的Pod。而关闭 Pod 有几种方法,我们可以通过删除 Pod 或者删除管理 Pod 的 Deployment 来实现。

删除 Pod

  1. 查找 Pod 名称

    bash 复制代码
    kubectl get pods

    输出示例:

    bash 复制代码
    NAME                     READY   STATUS    RESTARTS   AGE
    aijava-6cc95c764-5vzh4   1/1     Running   0          20m
  2. 删除 Pod

    bash 复制代码
    kubectl delete pod aijava-6cc95c764-5vzh4

    这将删除指定的 Pod。但是请注意,如果你是通过 Deployment 管理的 Pod,也就是 deployment.yaml方式创建的pod, Kubernetes会自动重新创建一个新的 Pod 来保持副本数量不变。

deployment.yaml:

yaml 复制代码
# spec:
# 定义 Deployment 的规格,即 Deployment 的具体配置。
spec:
  # replicas: 2
  # Pod 的副本数量,即 Deployment 将运行的相同 Pod 数量。
  # 用途:确保应用程序具有高可用性和负载均衡。
  replicas: 2

也就是说通过这个方法删除pod,我们最终是重启了这个服务,最终的pod数量还是为replicas里面的值(2个pod),因为 Kubernetes自动保持副本数量不变

删除 Deployment

通过删除 Deployment 来停止所有相关的 Pod,可以按照以下步骤操作:

  1. 查找 Deployment 名称

    bash 复制代码
    kubectl get deployments

    输出示例:

    bash 复制代码
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    aijava  1/1     1            1           20m
  2. 删除 Deployment

    bash 复制代码
    kubectl delete deployment aijava

    这将删除名为 aijava 的 Deployment 及其管理的所有 Pod。

而这个方法就是真正停掉了整个aijava这个服务。如果后面需要启动新的服务,我们则需要重新根据deployment.yaml创建一个Deployment。

暂停 Deployment

如果你只是想暂时停止 Deployment 而不是完全删除它,可以使用 scale 命令将副本数设置为 0:

  1. 查找 Deployment 名称

    bash 复制代码
    kubectl get deployments

    输出示例:

    bash 复制代码
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    aijava  1/1     1            1           20m
  2. 暂停 Deployment

    bash 复制代码
    kubectl scale deployment aijava --replicas=0

    这将把 aijava Deployment 的副本数设置为 0,所有 Pod 将被终止。

    到了第二步,所有的pod都没了,也就是说Deployment里面没有pod了,即没有这个aijava的服务存在了。

  3. 恢复 Deployment: 当你准备好再次运行 Pod 时,可以将副本数恢复到原来的值:

    bash 复制代码
    kubectl scale deployment aijava --replicas=1

    注意,这个两个pod已经不是一个pod了。这些新创建的 Pod 虽然与原来的 Pod 属于同一个 Deployment,并且可能会有相同的配置和环境变量,但是它们是全新的实例,不是之前被删除的 Pod 的直接延续。

查看服务运行日志

查看 Pod 日志

  1. 查找 Pod 名称: 首先,你需要知道要查看日志的 Pod 的名称。你可以通过以下命令列出所有的 Pod:

    bash 复制代码
    kubectl get pods

    输出示例:

    bash 复制代码
    NAME                     READY   STATUS    RESTARTS   AGE
    aijava-6cc95c764-5vzh4   1/1     Running   0          20m
  2. 查看 Pod 日志 : 使用 kubectl logs 命令查看指定 Pod 的日志。假设你的 Pod 名称是 aijava-6cc95c764-5vzh4,你可以使用以下命令:

    bash 复制代码
    kubectl logs aijava-6cc95c764-5vzh4

查看特定容器的日志

如果 Pod 中包含多个容器,你可以通过指定容器名称来查看特定容器的日志。假设你的 Pod 中有一个名为 aijava 的容器,你可以使用以下命令:

shell 复制代码
kubectl logs aijava-6cc95c764-5vzh4 -c aijava

查看之前的日志

如果你的 Pod 已经重启过,你可以查看之前的日志。使用 --previous 参数来查看上次运行的容器日志:

bash 复制代码
kubectl logs aijava-6cc95c764-5vzh4 --previous

实时查看日志

你可以使用 -f 参数来实时查看日志,类似于 tail -f 命令:

bash 复制代码
kubectl logs -f aijava-6cc95c764-5vzh4

查看特定行数的日志

你可以使用 --tail 参数来查看最近的几行日志。例如,查看最近 10 行日志:

bash 复制代码
kubectl logs aijava-6cc95c764-5vzh4 --tail=10

查看特定时间范围的日志

你可以使用 --since 参数来查看从某个时间点以来的日志。例如,查看过去 1 小时的日志:

bash 复制代码
kubectl logs aijava-6cc95c764-5vzh4 --since=1h

示例

假设你的 服务名称是 aijava,你可以使用以下命令来查看日志:

  1. 查看pod名称

    bash 复制代码
    kubectl get pods -n 命名空间 | grep aijava
  2. 查看pod的日志

    bash 复制代码
    kubectl logs -f --tail=1000 xxxxxx服务容器podName -n 命名空间

而作者在实际工作中会将两个命令合成一个命令:这样可以登录宿主机之后一键查看相关pod日志(小技巧)

bash 复制代码
pod_name=$(kubectl get pods -n znks | grep 你的容器名称 | awk '{print $1}' | head -n 1) && \
if [ -z "$pod_name" ]; then echo "No pod found with 'exam' in the name."; exit 1; else kubectl logs -f --tail=1000 $pod_name -n znks; fi

查看Deployment 和 Pod 状态

  • 使用以下命令检查 Deployment 和 Pod 的状态:

    bash 复制代码
    kubectl get deployments
    kubectl get pods

输出示例:

bash 复制代码
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
aijava  1/1     1            1           20m

NAME                     READY   STATUS    RESTARTS   AGE
aijava-6cc95c764-5vzh4   1/1     Running   0          20m

手动启动 Pod

通常情况下,Kubernetes 会自动恢复 Deployment 和 Pod 的状态。但如果某些 Pod 没有自动启动,我们可以手动启动它们。

  1. 手动启动 Deployment

    • 如果 Deployment 没有自动启动,可以使用以下命令重新创建 Deployment:

      bash 复制代码
      kubectl apply -f deployment.yaml
  2. 手动启动 Pod

    • 如果某个 Pod 没有自动启动,可以手动删除该 Pod,Kubernetes 会自动重新创建一个新的 Pod:

      bash 复制代码
      kubectl delete pod aijava-6cc95c764-5vzh4

列出所有 Service

shell 复制代码
# 以纯文本输出格式列出所有 Service。
kubectl get services

由于篇幅的问题,作者在这里只列出了作为开发可能在开发过程中要用到的命令,如果大家没有在本文中找到你想要的命令,可以去

kubernetes.io/zh-cn/docs/...

官方文档中找到你想要的示例。本篇文章主旨是想带读者以一个开发者的角度去认识一下K8s的架构和一些常用到的命令。希望各位读完这篇文章下来会对你有所帮助。

相关推荐
希望永不加班1 小时前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式
浮游本尊2 小时前
一次合同同步背后的多阶段流水线:从外部主数据到本地歧义消解
后端
lv__pf2 小时前
springboot原理
java·spring boot·后端
段小二3 小时前
服务一重启全丢了——Spring AI Alibaba Agent 三层持久化完整方案
java·后端
UIUV3 小时前
Go语言入门到精通学习笔记
后端·go·编程语言
lizhongxuan3 小时前
开发 Agent 的坑
后端
段小二3 小时前
Agent 自动把机票改错了,推理完全正确——这才是真正的风险
java·后端
itjinyin3 小时前
ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇
java·spring boot·后端
Victor3564 小时前
MongoDB(91)如何在MongoDB中使用TTL索引?
后端