前言
在这之前我们已经学习过了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_HOST
和KUBERNETES_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
命令:
shellkubectl [command] [TYPE] [NAME] [flags]
其中
command
、TYPE
、NAME
和flags
分别是:
command
:指定要对一个或多个资源执行的操作,例如create
、get
、describe
、delete
。
TYPE
:指定资源类型。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
shellkubectl 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
-
查找 Pod 名称:
bashkubectl get pods
输出示例:
bashNAME READY STATUS RESTARTS AGE aijava-6cc95c764-5vzh4 1/1 Running 0 20m
-
删除 Pod:
bashkubectl 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,可以按照以下步骤操作:
-
查找 Deployment 名称:
bashkubectl get deployments
输出示例:
bashNAME READY UP-TO-DATE AVAILABLE AGE aijava 1/1 1 1 20m
-
删除 Deployment:
bashkubectl delete deployment aijava
这将删除名为
aijava
的 Deployment 及其管理的所有 Pod。
而这个方法就是真正停掉了整个aijava这个服务。如果后面需要启动新的服务,我们则需要重新根据deployment.yaml创建一个Deployment。
暂停 Deployment
如果你只是想暂时停止 Deployment 而不是完全删除它,可以使用 scale
命令将副本数设置为 0:
-
查找 Deployment 名称:
bashkubectl get deployments
输出示例:
bashNAME READY UP-TO-DATE AVAILABLE AGE aijava 1/1 1 1 20m
-
暂停 Deployment:
bashkubectl scale deployment aijava --replicas=0
这将把
aijava
Deployment 的副本数设置为 0,所有 Pod 将被终止。到了第二步,所有的pod都没了,也就是说Deployment里面没有pod了,即没有这个aijava的服务存在了。
-
恢复 Deployment: 当你准备好再次运行 Pod 时,可以将副本数恢复到原来的值:
bashkubectl scale deployment aijava --replicas=1
注意,这个两个pod已经不是一个pod了。这些新创建的 Pod 虽然与原来的 Pod 属于同一个 Deployment,并且可能会有相同的配置和环境变量,但是它们是全新的实例,不是之前被删除的 Pod 的直接延续。
查看服务运行日志
查看 Pod 日志
-
查找 Pod 名称: 首先,你需要知道要查看日志的 Pod 的名称。你可以通过以下命令列出所有的 Pod:
bashkubectl get pods
输出示例:
bashNAME READY STATUS RESTARTS AGE aijava-6cc95c764-5vzh4 1/1 Running 0 20m
-
查看 Pod 日志 : 使用
kubectl logs
命令查看指定 Pod 的日志。假设你的 Pod 名称是aijava-6cc95c764-5vzh4
,你可以使用以下命令:bashkubectl 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
,你可以使用以下命令来查看日志:
-
查看pod名称:
bashkubectl get pods -n 命名空间 | grep aijava
-
查看pod的日志:
bashkubectl 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 的状态:
bashkubectl 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 没有自动启动,我们可以手动启动它们。
-
手动启动 Deployment:
-
如果 Deployment 没有自动启动,可以使用以下命令重新创建 Deployment:
bashkubectl apply -f deployment.yaml
-
-
手动启动 Pod:
-
如果某个 Pod 没有自动启动,可以手动删除该 Pod,Kubernetes 会自动重新创建一个新的 Pod:
bashkubectl delete pod aijava-6cc95c764-5vzh4
-
列出所有 Service
shell
# 以纯文本输出格式列出所有 Service。
kubectl get services
由于篇幅的问题,作者在这里只列出了作为开发可能在开发过程中要用到的命令,如果大家没有在本文中找到你想要的命令,可以去
官方文档中找到你想要的示例。本篇文章主旨是想带读者以一个开发者的角度去认识一下K8s的架构和一些常用到的命令。希望各位读完这篇文章下来会对你有所帮助。
