K8s基本概念及Kubectl命令

Q1:什么是K8s?

https://K8S.io/zh-cn/docs/home/

K8S 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。K8S 提供一个可弹性运行分布式系统的框架,可以满足扩展要求、应用故障转移、提供部署模式等。K8S 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。

Google 在 2014 年开源了 K8S 项目。

补充1:什么是云原生?

云原生(Cloud Native)是一种软件架构和开发方法论,旨在利用云计算的优势,提高应用程序的可伸缩性、可靠性和灵活性。云原生应用程序是设计用于在云环境中构建、部署和运行的应用程序,充分利用云计算服务和特性,以实现更高的效率和弹性。

在这里插入图片描述

传统部署:如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 如果将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。— 性价比低
虚拟化部署:允许在单个物理服务器的 CPU 上运行多台虚拟机(VM)。应用程序在不同 VM 之间被彼此隔离(提供一定程度的安全性),可轻松地添加或更新应用程序(具有更高的可扩缩性)。— 更好地利用物理服务器的资源
容器部署:容器之间可以共享操作系统(OS)。容器比起 VM 更轻量级,与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。优点:与基础架构分离,跨云和操作系统发行版本的可移植性。提高了容器镜像创建的简便性和效率。持续开发、集成和部署。松散耦合、分布式、弹性、解放的微服务(应用程序被分解成较小的独立部分, 并且可以动态部署和管理,而不是在一台大型单机上整体运行)。— 高效率、高密度的资源利用率

由此可见,容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 假设一个场景:如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?

Q2:我们为什么使用K8s?

K8S架构:

在这里插入图片描述

Kube Scheduler:将新创建的Pod调度到集群中的合适的节点上,同时考虑资源需求、硬件约束等因素,确保集群中的负载均衡
Kube Controller Manager:包含多个控制器,这些控制器负责监视系统状态,并根据需要执行操作,确保系统处于预期的状态。例如,Replication Controller确保指定数量的Pod运行,并在Pod故障时进行替换
Kube Api Server:K8S集群的主要管理端点。所有集群操作通过API服务器进行,包括创建、更新和删除资源对象。其他组件通过API服务器与集群进行通信
Etcd:分布式键值存储,用于存储集群的配置数据、状态信息和元数据。K8S的各个组件通过Etcd共享信息,确保集群的一致性和可靠性
Cloud Controller Manager:集成云服务提供商的特定功能,例如负载均衡、持久卷等。每个云服务提供商都有自己的控制器管理器,与K8S集成以提供云平台的相关功能
Kubelet:运行在每个节点上,负责管理该节点上的容器。它与API服务器通信,接收Pod规范并确保Pod中的容器在节点上正确运行
Kube Proxy:负责维护节点上的网络规则,使得Pod能够相互通信。它负责实现服务发现和负载均衡,确保Pod之间的网络通信正常
CRI:CRI(Container Runtime Interface)用于定义容器运行时(负责管理容器生命周期的组件)和Kubelet之间通信接口的规范。在K8S中,容器运行时负责管理容器的生命周期,包括创建、启动、停止和删除容器。CRI的目标是为K8S提供一种标准的容器运行时接口,使得Kubelet可以与不同的容器运行时进行通信,而无需修改Kubelet的代码

补充2:基础概念

Pod:最小的可部署和可扩展的计算单元。它可以包含一个或多个容器,这些容器共享相同的网络命名空间、存储卷和其他资源,共同构成一个部署单元。Pod提供了一种逻辑上隔离的环境,使得容器可以协同工作,并共享资源
命名空间(Namespace):一种在Kubernetes集群中用于隔离和组织资源的机制。通过使用命名空间,用户可以在同一集群中创建多个虚拟集群,每个虚拟集群都有自己的资源范围,如Pod、Service、Volume等。这有助于将集群划分为多个逻辑部分,以便不同团队或应用程序可以在同一集群中独立运行而不干扰彼此
Volume(卷):用于持久化数据的抽象概念。它可以在Pod中的一个或多个容器之间共享和持久化数据。Volumes可以连接到主机文件系统、网络存储或其他存储后端,并提供了一种在容器之间传递和存储数据的方式
App:由一个或多个相关联的Pod和其他资源组成的应用程序。一个应用程序可以由多个Pod组成,这些Pod共同支持应用程序的不同部分或服务。Kubernetes提供了一些抽象,如Deployment、Service等,以更方便地管理和操作应用程序。
Service:定义一组Pod的访问方式,为一组Pod提供稳定的网络终结点,通过这个终结点可以访问到这组Pod。Service可以提供负载均衡、服务发现和内部网络通信等功能。有几种类型的Service,包括ClusterIP(仅在集群内部可访问)、NodePort(在每个节点上公开一个端口)、LoadBalancer(在云平台上创建负载均衡器)等

K8S 提供的能力:

1、服务发现和负载均衡

K8S 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, K8S 可以负载均衡并分配网络流量,从而使部署稳定。
【负载均衡】(Load Balancing)一种分布式系统设计的策略,旨在将请求或网络流量均匀地分发到多个服务器或计算资源上,以避免任何一个资源过载,提高系统的性能、可用性和可扩展性。负载均衡器通常位于网络前端,根据不同的算法(如轮询、最小连接数、最小响应时间等)将传入的请求路由到后端的多个服务器上。

2、存储编排

K8S 允许自动挂载选择的存储系统,例如本地存储、公共云提供商等。

3、自动部署和回滚

可以使用 K8S 描述已部署容器的所需状态, 可以以受控的速率将实际状态更改为期望状态。 例如,可以自动化 K8S 来部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

4、自动完成装箱计算

K8S 提供许多节点组成的集群,在这个集群上运行容器化的任务。 如果告诉 K8S 每个容器需要多少 CPU 和内存 (RAM)。 K8S 可以将这些容器按实际情况调度到对应节点上,以最佳方式利用资源。
【装箱计算】(Containerization)一种虚拟化技术,通过将应用程序及其所有依赖项、运行时环境打包到一个独立的容器中,实现轻量级、可移植和一致的部署。容器包含应用程序、运行时、系统工具、系统库和设置,确保应用程序在任何环境中都能一致地运行。Docker 是一个流行的容器化平台,使得开发者能够更容易地构建、交付和运行应用程序。

5、自我修复

K8S 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

6、密钥与配置管理

K8S 允许存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

7、等等等等。。

Q3:通过什么样的方式来使用K8s?----Rancher

补充3:什么是Rancher?本质:Kubectl命令调用。

K8S 集群管理集群资源的唯一入口是通过相应的方法调用 ApiServer提供的接口。kubectl 是官方的CLI命令行工具,用于与 ApiServer 进行通信,将用户在命令行输入的命令,组织并转化为 ApiServer 能识别的信息,进而实现管理 K8S 各种资源的有效管理。
Rancher是一个开源的容器管理平台,它提供了一个用户友好的界面,帮助用户轻松地部署、管理和运行K8S集群。它简化了K8S集群的操作和监控,提供了图形化的用户界面和更高级的管理功能。(Rancher不仅支持K8S,还可以管理其他容器编排系统,如Docker Swarm。)
除了Rancher之外,还有许多其他容器管理平台可以用于管理和操作K8S集群,如OpenShift、Google K8S Engine (GKE)、Amazon EKS等

Rancher

集群(Cluster):表示一组物理或虚拟机器,这些机器组成一个Kubernetes集群。Cluster中包含了节点、网络配置、存储配置等信息,通过Rancher用户界面或API,用户可以轻松地创建、管理和监控Kubernetes集群
kubeconfig:Kubernetes配置文件,包含用于访问Kubernetes集群的认证信息、集群信息和上下文信息。在Rancher中,用户可以通过Rancher UI获取kubeconfig文件,以便通过kubectl等工具与Rancher管理的Kubernetes集群进行交互
workloads(工作负载):运行在Kubernetes集群上的应用程序和服务。包括Deployments、StatefulSets、DaemonSets等Kubernetes资源对象,用于描述和管理应用程序的部署和运行
load Balancing(负载均衡):用于在Kubernetes集群中分配流量以确保服务的高可用性和性能。Rancher提供了负载均衡器配置,用户可以通过Rancher UI设置负载均衡规则,以实现对服务的流量分发。
Ingress(入口):Kubernetes中的一个资源对象,用于定义从集群外部访问服务的规则。Ingress充当HTTP和HTTPS流量的入口,它可以定义路由规则、TLS设置、负载均衡等,使得外部流量能够到达集群内的Service
service discovery:为应用程序提供自动化的服务注册和发现功能。Rancher使用Service Discovery来简化应用程序中各个服务之间的通信和连接,使得服务能够动态地找到并与其他服务通信,而不需要硬编码服务的位置信息
Secrets(密钥/密码):Kubernetes中的一个资源对象,用于存储和管理敏感信息,如API密钥、密码等。Secret以加密的方式存储这些敏感信息,并且可以在Pod中通过Volume或环境变量的方式使用。Secret是安全地存储和传递敏感信息的一种方式
Config-Map(配置映射):ConfigMap是Kubernetes中的一个资源对象,用于将配置数据从Pod的容器中分离出来,以实现配置的解耦和灵活性。ConfigMap可以包含键值对、配置文件等数据,这些数据可以被Pod中的容器引用。通过使用ConfigMap,可以更轻松地管理应用程序的配置,而无需修改应用程序代码。
config-scale(配置和扩展):允许用户通过配置文件对应用程序进行扩展和缩减。用户可以定义水平扩展规则,根据负载或其他条件,自动调整应用程序的副本数量,有助于实现根据需求自动调整应用程序规模的弹性部署

Q4:如何在K8s上排查问题?

举例说明。

FE->API->Server->PaaS

1、Rancher

2、Kubectl

kubectl get pods --namespace=xxx
kubectl logs xxx --namespace=xxx

相关补充

1、容易混淆的概念

(1)Pod vs 容器

Pod:Pod是K8S中的基本调度和管理单位。它可以包含一个或多个容器,并共享相同的网络命名空间、存储卷和其他资源。Pod提供了一个逻辑上隔离的环境,使其内部的容器可以相互通信和共享资源。
容器:容器是真正运行应用程序的封装单元。Pod中的容器是应用程序的实际执行者,包含应用程序的代码、运行时、系统工具和依赖库。容器通过Docker等容器运行时工具打包为镜像,并在Pod中运行。

(2)Node vs Pod

Node: Node是K8S集群中的工作节点,负责运行Pod中的容器。Node上运行了Kubelet,它与Master节点上的Kube API Server通信,接收Pod规范并确保Pod中的容器在节点上正确运行。一个Node可以运行多个Pod,而一个Pod可以在多个Node上运行。

Pod: Pod是K8S中最小的部署单元,它可以包含一个或多个容器。Pod提供了一个逻辑上隔离的环境,容器在同一个Pod内共享网络命名空间和存储卷。Pod是部署和调度的基本单位。

(3)Cluster、Node、Pod、容器之间的关系
在这里插入图片描述

(4)Namespace、Volume、App、Deployment、Service之间的关系

在这里插入图片描述

2、Kubectl命令

http://docs.kubernetes.org.cn/683.html

export KUBECONFIG=~/.kube/test

1 基本操作
1.1 信息查看

kubectl get nodes (显示一个或多个资源)

kubectl get pods --namespace=xxx

kubectl cluster-info (显示集群信息)

kubectl version(输出客户端和服务端的版本信息)

1.2 生命周期
kubectl create(从文件或从stdi创建资源)

kubectl delete(按文件名、标准输入、资源和名称或按资源和标签选择器删除资源)

2 部署命令
kubectl scale(为部署、复制集或复制控制器设置新的大小)

kubectl autoscale(自动缩放部署、副本集、状态集或复制控制器)

3 集群管理
kubectl certificate(修改证书资源)

kubectl top(显示资源(CPU/内存)使用情况)

4 调试命令
kubectl describe(显示特定资源或资源组的详细信息)

kubectl logs(打印 Pod 中容器的日志)

kubectl attach(挂接到一个运行中的容)

kubectl exec(在某个容器中执行一个命令)

kubectl debug(创建调试会话,用于对工作负载和节点进行故障排除)

5 高级命令
kubectl diff(将实时版本与可能应用的版本进行比较)

kubectl apply(通过文件名或标准输入将配置应用于资源)

6 设置命令
kubectl label(更新某资源上的标签)

kubectl config(修改 kubeconfig 文件)
e.g. kubectl config current-context

kubectl config view

7 其他命令
kubectl api-resources(打印服务器上支持的API资源)

3、Helm命令

Helm 是一个用于管理 Kubernetes 应用程序的包管理工具。它允许定义、安装和升级 Kubernetes 中的应用程序,称为 Helm Charts。Helm Charts 是预定义 Kubernetes 资源的集合,通过 Helm可以将应用程序打包为 Helm Charts,并使用 Helm 命令行工具在 Kubernetes 集群上轻松部署、升级和删除应用程序。虽然 kubectl 可以手动完成 Helm 所做的一些工作,但 Helm 提供了更高级别的抽象,使得应用程序的管理更加方便。

4、更多资料

《一关系图让你理解K8s中的概念,Pod、Service、Job等到底有啥关系》https://www.zhihu.com/tardis/zm/art/105006577?source_id=1003

《快速理解K8S基础概念》https://cloud.tencent.com/developer/article/2136335

《一文讲清K8S整体架构》https://zhuanlan.zhihu.com/p/654662196

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值