k8s集群服务器
k8s可以将不同的服务器连接在一起,实现资源共享,提升运行效率,减少运维成本,但同时对集群服务器的取证流程也会与常规服务器有稍许不同。
前置知识
K8s是Kubernetes的简称,是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
k8s核心组件(大概看看了解一下,这种就是有个印象就行,我也是第一次碰到)
1.Master节点:K8s的控制平面,负责管理和协调整个集群。包含API Server、Scheduler、Controller Manager等组件,API Server提供了K8s的API接口,用于接收和处理用户的请求;Scheduler负责将Pod调度到合适的节点上;Controller Manager负责管理和维护集群中各种资源的状态。
2.Node 节点:集群中的工作节点,用于运行容器化应用。每个Node节点上都运行着Kubelet和Container Runtime等组件,Kubelet负责与Master节点通信,接收并执行Master节点下达的任务,管理本地的容器;Container Runtime用于运行容器,如Docker、runc等。
3.Pod:(后续题目有问到):K8s中最小的可部署和可管理的计算单元,它可以包含一个或多个紧密相关的容器。这些容器共享网络和存储资源,通常作为一个整体被调度和管理。
4.Service:用于定义一组Pod的访问策略,为Pod提供一个固定的IP地址和DNS名称,使得其他Pod或外部客户端能够通过这个固定的地址访问到后端的Pod集合,实现服务的发现和负载均衡。
5.Deployment:用于管理Pod的部署和升级,用户可以通过Deployment来定义Pod的副本数量、镜像版本等信息,K8s会根据Deployment的定义自动创建和管理Pod,并在需要时进行升级和回滚操作。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
仿真流程
首先需要将master节点以及所有的node节点全部放到火眼取证软件中进行数据分析。
观察各个节点服务器的基本信息,是否标注出了master节点以及node节点,其次观察集群服务器的IP配置,分析其子网掩码,然后利用这些信息设置服务器的网络连接为仅主机模式,然后配置相关IP以及子网掩码。
基础命令
语法
1
kubectl [command] [TYPE] [NAME] [flags]
command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 基础命令
create # 通过文件名或标准输入创建资源
expose # 将一个资源公开为一个新的 service
run # 在集群中运行一个特定的镜像
set # 在对象上设置特定的功能
get # 显示一个或多个资源
explain # 文档参考资料
edit # 使用默认的编辑器编辑一个资源
delete # 通过文件名、标准输入、资源名称或标签选择器来删除资源
# 部署命令
rollout # 管理资源的发布
rolling-update # 对给定的复制控制器滚动更新
scale # 扩容或缩容Pod数量,Deploy、ReplicaSet、RC或Job
autoscale # 创建一个自动选择扩容或缩容并设置Pod数量
# 集群管理命令
certificate # 修改证书资源
cluster-info # 显示集群信息
top # 显示资源使用。需要Heapster运行
cordon # 标记节点不可调度
uncordon # 标记节点可调度
drain # 维护期间排除节点
taint
Kubernetes (K8s) 系统化介绍
1. 什么是 Kubernetes?
Kubernetes (K8s) 是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展、和管理。它提供了高效的方式来管理分布式系统,尤其是在大规模的集群环境中,能够帮助我们处理负载均衡、故障恢复、滚动更新等任务。
核心目标:
- 容器化应用管理:实现容器的自动化调度、扩展、监控。
- 高可用性:自动化地保证容器的高可用性,发现故障并恢复。
- 自动化:实现大规模容器的自动化部署、升级、回滚。
2. Kubernetes 的架构
集群架构
Kubernetes 集群由两部分组成:控制平面和工作节点。
控制平面(Control Plane)
控制平面是 Kubernetes 的“大脑”,负责整个集群的管理和调度决策。它主要包括:
- API Server(kube-apiserver):提供统一的 API 接口,管理与集群的交互。
- Scheduler(调度器):根据资源需求调度 Pod 到合适的 Node 上。
- Controller Manager:处理控制器,监控集群的状态,确保实际状态与期望状态一致。
- etcd:分布式键值存储,用于存储集群的所有配置和状态信息。
工作节点(Node)
工作节点是集群中运行容器(Pod)的机器,通常是物理机或虚拟机。每个节点都运行着以下组件:
- kubelet:负责管理 Pod 的生命周期,确保 Pod 按照控制平面的期望运行。
- kube-proxy:负责处理集群的网络代理,实现服务的负载均衡。
- 容器运行时:如 Docker、containerd 等,用于启动和管理容器。
3. Kubernetes 核心概念
Pod
- Pod 是 Kubernetes 中的最小资源单位,是 一个或多个容器 的集合,它们共享网络、存储等资源。Pod 内的容器通常具有强依赖关系,必须一起部署。
- 每个 Pod 都有一个 IP 地址,并且可以与其他 Pod 进行网络通信。
Service
- Service 是 Kubernetes 中用于暴露 Pod 的一种资源对象,它为一组 Pod 提供一个稳定的网络访问入口。Service 会自动进行负载均衡,将流量分发到对应的 Pod 上。
- 常见的 Service 类型:
- ClusterIP:集群内部访问。
- NodePort:通过每个节点的指定端口进行访问。
- LoadBalancer:将流量导入云服务的负载均衡器。
Deployment
- Deployment 是 Kubernetes 中用来管理应用部署的控制器,它负责管理 Pod 的副本数、升级、回滚等任务。
- Deployment 会自动管理 Pod 的生命周期,确保指定数量的 Pod 始终在运行。
ConfigMap 和 Secret
- ConfigMap:用于存储不含机密信息的配置信息,可以被容器以环境变量、命令行参数等形式读取。
- Secret:类似于 ConfigMap,但用于存储敏感数据(如密码、密钥等),并支持加密存储。
Namespace
- Namespace 是 Kubernetes 中的一种资源隔离机制,可以将不同的资源和工作负载分隔到不同的命名空间中。
- 在多租户环境下,Namespace 可以用来隔离不同团队或项目的资源,并且支持资源配额和访问控制。
4. ServiceAccount:身份管理与权限控制
什么是 ServiceAccount?
- ServiceAccount 是 Kubernetes 中的身份认证和授权机制,通常用于服务之间的通信。
- Pod 通过 ServiceAccount 来进行身份认证,并且访问 Kubernetes API 及集群资源。
- 每个 ServiceAccount 都会自动关联一个 API Token,这个 Token 是 Pod 访问集群 API 的凭证。
为什么需要 ServiceAccount?
- Kubernetes 中的 Pod 默认会使用一个叫做 default 的 ServiceAccount,但你可以为特定的应用创建自定义的 ServiceAccount。
- 通过为 Pod 指定不同的 ServiceAccount,可以控制其访问权限,实现 最小权限原则,确保应用只能够访问它们所需的资源。
ServiceAccount 的工作原理
- Kubernetes 中的 ServiceAccount 是 与 RBAC(Role-Based Access Control)结合使用的。
- RBAC 用于授予 ServiceAccount 一定的访问权限。通过定义 Role 或 ClusterRole 来授予 ServiceAccount 在某个 Namespace 或集群范围内的权限。
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 >kubectl cluster-info # 查看集群信息
>kubectl get nodes # 查看集群节点
>kubectl describe node <node-name> # 查看节点详细信息
>kubectl get pods -n <namespace># 列出指定命名空间下的 Pod
>kubectl describe pod <pod-name> -n <namespace>
>kubectl logs <pod-name> -n <namespace> # 查看pod日志
>kubectl delete pod <pod-name> -n <namespace> # 删除pod
>kubectl get pod <pod-name> -o yaml -n <namespace> # 获取pod的yaml配置文件
>kubectl get deployments # 列出所有depliyments
>kubectl describe deployment <deployment-name> -n <namespace> # 查看deployment详细信息
>kubectl create deployment <deployment-name> --image=<image-name> # 创建deployment
>kubectl set image deployment/<deployment-name> <container-name>=<new-image> -n <namespace> # 更新deployment
>kubectl delete deployment <deployment-name> -n <namespace> # 删除deployment
>kubectl get deployment <deployment-name> -o yaml -n <namespace> # 获取deployment的yaml配置文件
>kubectl get services # 列出所有service
>kubectl describe service <service-name> -n <namespace> # 查看service详细信息
>kubectl expose deployment <deployment-name> --port=<port> --target-port=<target-port> --name=<service-name> -n <namespace> # 创建service
>kubectl delete service <service-name> -n <namespace> # 删除service
>kubectl get configmap -n <namespace> # 列出所有configmap
>kubectl describe configmap <configmap-name> -n <namespace> # 查看configmap的详细信息
>kubectl create configmap <configmap-name> --from-literal=<key>=<value> -n <namespace> # 创建configmap
>kubectl delete configmap <configmap-name> -n <namespace> # 删除configmap
>kubectl get secret -n <namespace> # 列出所有secret
>kubectl describe secret <secret-name> -n <namespace> # 查看secret的详细信息
>kubectl create secret generic <secret-name> --from-literal=<key>=<value> -n <namespace> # 创建secret
>kubectl delete secret <secret-name> -n <namespace> # 删除secret
>kubectl get namespaces # 列出所有namespace
>kubectl create namespace <namespace-name> # 创建namespace
>kubectl delete namespace <namespace-name> # 删除namespace
>kubectl get roles -n <namespace> # 列出所有roles
>kubectl get clusterroles # 列出所有哦clusterrole
>kubectl describe role <role-name> -n <namespace> # 查看role详细信息
>kubectl create rolebinding <rolebinding-name> --role=<role-name> --serviceaccount=<namespace>:<serviceaccount-name> -n <namespace> # 创建rolebinding
>kubectl describe rolebinding <rolebinding-name> -n <namespace> # 查看rolebinding详细信息
>kubectl get cs # 查看集群状态
>kubectl get componentstatuses # 查看调度器和控制管理器状态
>kubectl get all -n <namespace> # 查看所有资源状态
>kubectl top nodes # 查看节点利用率
>kubectl top pods -n <namespace> # 查看pod资源利用率
>kubectl get events -n <namespace> # 查看pod事件
>kubectl exec -it <pod-name> -- /bin/bash -n <namespace> # 进入pod进行调试
>kubectl logs -f <pod-name> -n <namespace> # 查看pod终端日志
>kubectl logs -f <pod-name> -c <container-name> -n <namespace> # 查看某个容器日志
>kubectl get pvc # 查看持久卷(Persistent Volume Claims)
>kubectl get deployment -n kubernetes-dashboard # 查看kubernetes-dashboard命名空间下所有部署资源
>kubectl edit deployment kubernetes-dashboard -n kubernetes-dashboard # 编辑kubernetes-dashboard命名空间下kubernetes-dashboard资源的yaml配置文件
>kubectl get svc -A # 获取面板暴露的端口信息
>kubectl get serviceaccount -n kubernetes-dashboard # 获取kubernetes-dashboard命名空间下的所有serviceaccount
>kubectl get serviceaccount admin-user -n kubernetes-dashboard -o yaml # 查询admin-user这个serviceaccount的yaml文件
>kubectl get secret admin-user-token-xxxxx -n kubernetes-dashboard -o jsonpath="{.data.token}" | base64 -d # 读取yaml文件中secret中的token值
>kubectl create token dashboard-admin --namespace kube-system # 在kube-system命名空间中生成一个临时的dashboard-admin的token
>kubectl get pv # 列出所有pv
1. kubectl get pv - 查看 Persistent Volume (PV)
- PV(Persistent Volume) 是集群中的物理存储资源,类似于云存储、NFS 共享等。
- PV 是由管理员或自动化工具(如动态存储供应器)预先创建的,包含了存储卷的配置、容量、访问模式等信息。
- 它是集群内的存储资源池的一部分,独立于任何使用它的 Pod 或 PVC。
2. kubectl get pvc - 查看 Persistent Volume Claim (PVC)
- PVC(Persistent Volume Claim) 是一个用户请求存储资源的声明。它是对 PV 的请求,定义了用户需要的存储容量、访问模式等。
- PVC 是由用户或应用程序创建的,并且绑定到 PV 上。Kubernetes 控制平面会根据 PVC 的请求在集群中查找匹配的 PV 并将其绑定。
PV 和 PVC 的关系
- PV 是实际的存储资源(如 NFS、云存储等),由管理员创建和管理。
- PVC 是用户或应用请求的存储资源(例如:容器需要一个 10Gi 的存储卷)。当 PVC 被创建后,Kubernetes 会根据 PVC 的要求查找匹配的 PV,并将它们绑定。