作为开发者,看完这篇文章就可以快速上手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的架构和一些常用到的命令。希望各位读完这篇文章下来会对你有所帮助。

相关推荐
电商api接口开发6 分钟前
ASP.NET MVC 入门指南三
后端·asp.net·mvc
声声codeGrandMaster7 分钟前
django之账号管理功能
数据库·后端·python·django
我的golang之路果然有问题34 分钟前
案例速成GO+redis 个人笔记
经验分享·redis·笔记·后端·学习·golang·go
嘻嘻嘻嘻嘻嘻ys1 小时前
《Vue 3.3响应式革新与TypeScript高效开发实战指南》
前端·后端
暮乘白帝过重山1 小时前
路由逻辑由 Exchange 和 Binding(绑定) 决定” 的含义
开发语言·后端·中间件·路由流程
CHQIUU1 小时前
告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
spring boot·后端·状态模式
广西千灵通网络科技有限公司1 小时前
基于Django的个性化股票交易管理系统
后端·python·django
CodeFox1 小时前
动态线程池 v1.2.1 版本发布,告警规则重构,bytebuddy 替换 cglib,新增 jmh 基准测试等!
java·后端
破 风1 小时前
Docker启动mysql容器时找不到 mysqlx.sock 和 mysqld.sock
mysql·docker·容器
tonydf1 小时前
0帧起手本地跑一下BitNet
后端·ai编程