Ubuntu22.04.2 k8s部署

k8s介绍

简单介绍

通俗易懂的解释

Kubernetes(也被称为 K8s)就像是一个大管家,帮你管理你的云计算服务。想象一下,你有很多个小程序(我们称之为"容器"),每个都在做不同的事情,而 Kubernetes 就是帮你确保这些小程序都能按照你的要求运行,如果有哪个小程序出了问题,Kubernetes 会自动修复或者替换它,确保你的服务始终可用。

专业术语的解释

Kubernetes 是一个开源的容器编排系统,用于自动化应用容器的部署、扩展和管理。它提供了平台即服务(PaaS)的简易性以及基础设施即服务(IaaS)的灵活性,并支持跨主机集群的服务发现和负载均衡。Kubernetes 提供了一种环境,使得你可以在分布式系统中运行弹性工作负载,同时还能够管理和扩展这些工作负载以满足你的特定需求。

k8s学习路线

一些资料

Sealos 私有化部署完全指南 - 米开朗基杨 - 博客园

Python实战:Kubernetes集群中部署Python应用_python kubernetes-CSDN博客

kubernetes(K8s)-sealos私有化部署完整指南-CSDN博客

一些可学习的视频

【完整版Kubernetes(K8S)全套入门+微服务实战项目,带你一站式深入掌握K8S核心能力】完整版Kubernetes(K8S)全套入门+微服务实战项目,带你一站式深入掌握K8S核心能力_哔哩哔哩_bilibili

【【2024版】最新最全最详细的kubernetes(k8s 1.27)入门教程,Java程序员转行k8s架构师必看(k8s教程/k8s安装)】【2024版】最新最全最详细的kubernetes(k8s 1.27)入门教程,Java程序员转行k8s架构师必看(k8s教程/k8s安装)_哔哩哔哩_bilibili 课件链接:无废话纯享版 k8s 1.27.x 枫叶云笔记

【【整整300集】字节跳动196小时讲完的kubernetes(k8s)教程,让你自学k8s少走99%的弯路!(k8s教程/k8s部署/k8s安装/k8s实战)】【整整300集】字节跳动196小时讲完的kubernetes(k8s)教程,让你自学k8s少走99%的弯路!(k8s教程/k8s部署/k8s安装/k8s实战)_哔哩哔哩_bilibili

【【Sealos】60分钟带你使用sealos私有化部署Kubernetes(k8s)集群!k8s安装/k8s部署/k8s实战】【Sealos】60分钟带你使用sealos私有化部署Kubernetes(k8s)集群!k8s安装/k8s部署/k8s实战_哔哩哔哩_bilibili

基础理论

  • 容器化应用的概念

  • 分布式系统的设计原则

  • Linux 操作系统和常用命令

安装 Kubernetes

  • 在本地机器上安装 Minikube 或使用云服务提供商(如 GKE,AKS,EKS)

核心概念

  • Pods

  • Deployments

  • Services

  • Ingress

  • Volumes

  • ConfigMaps

  • Secrets

进阶概念

  • StatefulSets

  • DaemonSets

  • Jobs

  • CronJobs

  • Namespaces

  • RBAC

  • Horizontal Pod Autoscaling (HPA)

  • Cluster Autoscaling

网络和存储扩展

  • 网络策略(Network Policies)

  • 持久化卷(Persistent Volumes)

集群管理和自动化

  • Helm - Kubernetes 的包管理工具

  • CI/CD 流水线与 Jenkins, GitLab CI, GitHub Actions 集成

调试和监控

  • kubectl 命令行工具

  • Kubernetes Dashboard

  • Prometheus

  • Grafana

高级特性

  • Service Mesh (Istio, Linkerd)

  • Logging (ELK, Fluentd)

  • Tracing (Jaeger, OpenTracing)

最佳实践

  • 设计模式(如12要素应用,微服务)

  • 监控和报警

  • 故障排查

  • 安全最佳实践

实践操作

  • 部署应用

  • 扩展应用

  • 更新和回滚应用

  • 管理配置和机密

  • 监控和调试问题

Kubernetes 进阶

  • 自定义资源定义(CRDs)

  • Operators 开发

  • 使用 Go 或 Python 编写自定义控制器

管理 Kubernetes

  • 使用 kubeadm 或其他工具部署 Kubernetes 集群

  • 维护和升级集群

  • 维护多个集群

云原生架构和最佳实践

  • 微服务架构

  • Declarative API (YAML 配置文件)

  • 不可变基础设施

  • 使用 GitOps 管理配置

这只是一个学习路线图的概要,实际学习过程中会涉及到更多的细节和实践操作。建议按照这个路线图逐步进行学习和实践。

k8s框架

图解

master节点与node节点

在Kubernetes中,Master节点负责管理和调度集群中的所有资源。它由多个核心组件组成,包括kube-apiserver、kube-controller-manager和kube-scheduler。这些组件通常需要部署在同一台机器上。

  • kube-apiserver:提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。

  • kube-controller-manager:Kubernetes里所有资源对象的自动化控制中心。

  • kube-scheduler:负责资源调度(Pod调度)的进程。

当你部署一个应用时,你实际上是在向Master节点的kube-apiserver提交一个请求。这个请求描述了你想要部署的应用的状态,包括应用的镜像、副本数、网络设置等。kube-apiserver接收到这个请求后,会将其保存在etcd中。

然后,kube-scheduler和kube-controller-manager会根据这个请求来调度和管理Pod。kube-scheduler负责决定将Pod部署在哪个Node节点上,而kube-controller-manager则负责监控Pod的状态,并在需要时进行自动扩缩容。

至于Node节点,它们主要负责运行Pod。每个Node节点上都运行着kubelet和kube-proxy两个进程。

  • kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。

  • kube-proxy:实现Kubernetes Service的通信以及负载均衡。

Node节点可以在运行期间动态增加到Kubernetes集群中,前提是这个节点上已经正确安装、配置和启动了上述关键进程。一旦Node被纳入集群管理范围,kubelet进程就会定时向Master节点汇报自身的情报,例如操作系统、Docker版本、机器的CPU和内存情况,以及当前有哪些Pod在运行等。这样,Master可以获知每个Node的资源使用情况,并实现高效均衡等资源调度策略。

所以,从这个角度来看,部署应用的操作是由Master节点进行的,但实际运行应用的是Node节点。而Node节点并不只有查看权限,它们也有执行操作的权限,比如创建和管理Pod。

消耗资源是master的还是node的

在Kubernetes中,应用程序实际上是在Node节点上运行的,因此,应用程序会消耗Node节点的计算资源(如CPU和内存)和存储资源。Master节点主要负责管理和调度,而不直接运行应用程序。

当你部署一个应用程序时,你会向Master节点发送一个请求,描述你想要部署的应用程序的状态。然后,Master节点的调度器(Scheduler)会决定将应用程序的Pods部署在哪个Node节点上。一旦Pods被调度到一个Node节点上,它们就会开始在那里运行,并消耗那个节点的资源。

所以,当我们说"部署一个项目",实际上是指在Master节点上创建和管理部署请求,而实际的资源消耗(如CPU、内存和存储)发生在运行应用程序的Node节点上。

k8s部署应用后和节点关联

在 Kubernetes(K8s)中,应用程序是通过部署(Deployment)在各个节点(Node)上运行的容器实例来实现的。这些容器实例被包含在一个叫做 Pod 的概念中,Pod 是 Kubernetes 中最小可管理的单元。

当你在 Kubernetes 中部署一个应用程序时,你实际上是创建了一个 Deployment。Deployment 会指示 Kubernetes 如何创建和更新应用程序的实例。这些实例(Pods)会被 Kubernetes 的调度器(Scheduler)分配到集群中的具体的节点(Node)上。

一旦 Pod 被调度到一个 Node 上,它就会在那个 Node 上运行,并消耗那个 Node 的计算资源(如 CPU 和内存)。如果运行 Pod 的 Node 发生故障或被删除,Kubernetes 的 Deployment Controller 会在集群中的另一个 Node 上重新创建一个新的 Pod。这提供了一种自我修复机制,可以处理机器故障或维护问题。

因此,部署应用程序后,应用程序与 Kubernetes 集群中的节点有紧密的关联。应用程序的运行、扩展和故障恢复都依赖于 Kubernetes 对节点的管理和调度。 ### k8s的用途和实际意义 Kubernetes(也被称为 K8s)是一个开源的容器编排平台,它在实际应用中有着广泛的用途和重要的意义: #### 自动化部署 **自动化部署**:Kubernetes可以自动化部署容器化的应用,无需运维人员进行复杂的手动配置和处理。 Kubernetes可以通过读取容器定义文件(既yaml文件)来创建和管理Pod。当Pod的状态发生变化时,Kubernetes会自动更新容器以反映这些变化。 #### 大规模可伸缩 **大规模可伸缩**:Kubernetes可以管理和扩展大规模的应用容器,以满足不断变化的业务需求。 Kubernetes提供了一种机制叫做KEDA,它可以根据Prometheus指标来动态缩放应用程序的规模 **KEDA (Kubernetes Event-Driven Autoscaling)** 是一个基于 Kubernetes 的事件驱动自动缩放 器。它的工作原理是从外部度量提供者系统(例如 Prometheus)监控度量,然后根据基于度量值 的伸缩规则进行伸缩。KEDA 并没有取代 Kubernetes 内置的水平 Pod 自动缩放器 (HPA),它仍然 使用 HPA 来发挥它的魔力。 **Prometheus** 是一个开源的系统监控和警报工具。它将所有指标数据存储为时间序列,即指标信息与记录时间戳一起存储,还可以存储可选的键-值对标签与指标一起。Prometheus 的基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控。 Prometheus 的指标(Metrics)是它收集的数据的核心,这些数据被存储为时间序列,即在不同 时间点的数据值。Prometheus 支持四种类型的指标: * **Counter**:一个只增不减的累计值,例如请求总数。 * **Gauge**:一个可以任意上下浮动的瞬时值,例如 CPU 利用率。 * **Histogram**:一种度量样本的指标,它也提供了所有值的总和和个数。例如,请求持续时间的直方图。 * **Summary**:类似于直方图,但是它可以在服务端计算出可靠的分位数。 希望这些信息能帮助你理解 KEDA 和 Prometheus 指标。 #### 负载均衡 Kubernetes内置的负载均衡策略可以实现对应用实例的管理、发现、访问。例如,集群外就可以使用Kubernetes任意一个节点的IP加上30000端口访问该服务了。 #### 资源优化 Kubernetes可以高效地利用内存、处理器等资源,节省开销。例如,可以通过监测集群资源使用率和调整节点资源配额来管理Kubernetes集群的配置。 #### **跨环境部署** 无论是物理服务器、虚拟机、公共云环境,还是私有云和混合云环境,Kubernetes都可以在其中运行。例如,我们可以将全部服务器建立一个集群,在集群中任意一个Master节点创建一个Service与多个容器Pod,每个容器Pod内运行一个应用实例,然后通过Kubernetes内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问。 #### **持续集成/持续部署(CI/CD)** Kubernetes可以简化CI/CD流程,使得应用的更新和迭代更加高效。例如,可以与企业内部原有的持续构建集成,例如Jenkins,也可以在Kubernetes中部署一套新的持续构建与发布工具,例如Drone、ArgoCD、Tekton等。 #### **提高可靠性** Kubernetes能够确保应用一直顺利运行,即使出现故障,Kubernetes也会自动恢复,提供应用程序的不间断操作。例如,我们可以配置存活性检测(Liveness Probes),如果存活性检测没有通过,Kubernetes会自动来重启这个应用。对于状态2,我们可以配置可用性检测(Readiness Probes),这样在服务初始化完成前,通过Service不能访问到这个服务,避免造成意想不到的后果。 #### 微服务架构支持 Kubernetes非常适合部署和管理基于微服务架构的应用。例如,Kubernetes通过读取容器定义文件来创建和管理Pod。当Pod的状态发生变化时,Kubernetes会自动更新容器以反映这些变化。 总的来说,Kubernetes通过自动化的方式,使得应用的部署、管理和扩展变得更加简单和高效,大大提高了IT运维的效率和应用的可靠性。 ### k8s解决的问题 1. **服务部署和扩展**:Kubernetes可以自动部署、扩展和管理容器化的应用程序,使得服务部署和扩展变得更加简单和快速。 就像你有一个机器人厨师,你告诉他你需要多少个汉堡,他就会自动做出相应数量的汉堡。如果你需要更多的汉堡,他会自动做更多。 2. **服务发现和负载均衡**:Kubernetes可以自动发现和平衡负载,从而提高服务的可用性和稳定性。 如果你有很多机器人厨师,Kubernetes就像一个经理,它会确保每个厨师的工作量都差不多,没有人会被压垮。 3. **自动回滚和恢复**:Kubernetes可以在应用程序出现故障时自动回滚和恢复,从而提高服务的可靠性。 如果一个机器人厨师犯了错误(比如做出了一个不好吃的汉堡),Kubernetes会让他停下来,然后找另一个机器人厨师接替他的工作。 4. **密钥和配置管理**:Kubernetes可以管理和保护敏感数据,如密码、OAuth令牌和SSH密钥。 Kubernetes就像一个保险箱,它可以安全地存储和管理你的秘密配方和其他重要信息。 5. **存储编排**:Kubernetes允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。 如果你的机器人厨师需要某种特殊的食材,Kubernetes会确保他们可以在需要的时候获取到。 6. **批处理和CI/CD**:Kubernetes可以管理批处理和CI/CD工作流,替代传统的主机依赖的工作流。 Kubernetes可以管理你的整个厨房工作流程,确保每个步骤都按照计划进行。 7. **资源优化**:Kubernetes可以根据资源需求和约束自动放置容器,从而提高资源利用率。 Kubernetes会确保每个机器人厨师都有足够的资源(比如时间和空间)来完成他们的工作,但又不会浪费任何资源。 8. **自我修复**:Kubernetes可以在容器失败时自动替换和重新调度容器,当节点死亡时,它可以替换和重新调度节点上的容器,当容器不通过你定义的健康检查时,它可以杀死它们,并且,当准备好服务时,它不会将其通告给客户端,直到它们准备好开始接受流量。 如果一个机器人厨师坏了,Kubernetes会自动找到问题并修复它,或者找到另一个机器人厨师来接替他的工作。 ### sealos和k8s的关系 **Sealos** 是一个基于Go语言开发的简单干净且Kubernetes集群部署工具。它可以帮助用户在生产环境中部署高可用的Kubernetes集群。Sealos提供的API与Kubernetes的CRD (Custom Resource Definitions,自定义资源定义)设计完全兼容。用户可以通过Sealos的API,以与操作Kubernetes环境相同的方式来管理和控制他们的云资源。 **Kubernetes**(简称K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。 因此,Sealos和Kubernetes的关系可以理解为:Sealos是一个工具,它使用Kubernetes作为内核,帮助用户更方便地部署和管理Kubernetes集群。 ### sealos cloud云服务与sealos和k8s的关系 **Sealos Cloud** 是一个云服务平台,它使用 **Kubernetes** 作为其内核。Sealos Cloud 提供了一套强大的工具,可以便利地管理整个 Kubernetes 集群的生命周期。 **Sealos** 是一个基于Go语言开发的简单干净且Kubernetes集群部署工具。它可以帮助用户在生产环境中部署高可用的Kubernetes集群。 **Kubernetes**(简称K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。 因此,Sealos Cloud、Sealos和Kubernetes的关系可以理解为:Sealos是一个工具,它使用Kubernetes作为内核,帮助用户更方便地部署和管理Kubernetes集群。而Sealos Cloud则是一个云服务平台,它也使用Kubernetes作为内核,提供了一套强大的工具,可以便利地管理整个 Kubernetes 集群的生命周期。 ### k8s查看计算费用,计算使用内存,计算消耗等的功能 Kubernetes本身并没有直接提供查看计算费用的功能,但它提供了一些工具和API来监控和度量资源使用情况,如CPU和内存等。这些数据可以帮助我们判断容器是否过度消耗资源或存在性能瓶颈。你可以使用Kubernetes的`top`命令来查看所有Pod和Node的内存和CPU使用情况。 对于计算费用,你可能需要借助一些第三方的工具或服务。例如,Kubecost是一个开源工具,它可以提供Kubernetes集群的成本分析和报告,帮助你理解和管理集群的运行成本。 以下是一些可能需要的Kubernetes组件和工具: 1. **Metrics Server**:Metrics Server是一个集群范围的资源指标的聚合器,它被Metrics API使用。这是查看资源使用情况的基础设施。 2. **Heapster**(已被弃用):Heapster是一个性能监控和事件数据聚合系统,它可以收集和解释各种事件和指标。 3. **Prometheus**:Prometheus是一个开源的监控和警报工具包,它可以收集和存储可靠的时间序列数据。 4. **Kubecost**:Kubecost提供了对Kubernetes资源消耗的可视化,包括CPU、内存、网络等,以及这些资源的成本。 ## Ubuntu22.04.2 k8s部署 ### 注意:Sealos内部自带有Docker一样的功能,无需重复下载docker ### 环境部署 搭建 Kubernetes (k8s) 集群的电脑配置要求如下: * **操作系统**:CentOS 7.x-86_x64 或者其他类似的 Linux 发行版。 * 硬件配置: * **CPU**:2核或更多。 * **内存**:2GB或更多。 * **硬盘**:30GB或更多。 * **网络**:集群中的所有机器之间需要网络互通。 * **外网访问**:可以访问外网,需要拉取镜像。 * **禁止swap分区**。 这些只是基本的要求,实际的配置可能需要根据你的具体需求进行调整。例如,如果你打算在集群上运行资源密集型的应用,你可能需要更多的 CPU 核心和内存。同样,如果你的应用需要大量的存储空间,你可能需要更大的硬盘。 #### 1,主机名修改不一致 查看主机名称:hostname 修改主机名 hostnamectl set-hostname k8s-master-1 #### 2,查看ip地址是否为静态ip 查看ip地址是否配置为静态ip:ip a s ens33 #### 3,修改/etc/hosts,添加以下配置 下载vim: sudo apt install vim #修改/etc/hosts,添加以下配置(ip后面的名称即为刚刚修改的主机名) sudo vim /etc/hosts > > ``` > 192.168.231.140   k8s-master01 > 192.168.231.141   k8s-worker01 > 192.168.231.142   k8s-worker02 > 192.168.231.143   k8s-worker03 > ``` #### 4,关闭防火墙 # 停止 sudo ufw disable #### 5,关闭SELinux 在Ubuntu系统中,SELinux默认是不启用的。但如果你已经启用了SELinux并希望关闭它,可以按照以下步骤操作: 1,**查看SELinux状态**:在终端中执行以下命令,查看系统中SELinux的状态: sestatus 如果SELinux已经安装并启用,你将看到类似以下输出: SELinux status: enabled 2,**临时禁用SELinux**:如果只想临时禁用SELinux,可以执行以下命令: sudo setenforce 0 这会将SELinux设置为"Permissive"模式,这意味着虽然SELinux仍然运行,但它将记录所有的安全事件而不执行任何动作。 3,**永久禁用SELinux**:如果你确定要永久禁用SELinux,需要编辑SELinux配置文件。使用以下命令打开SELinux配置文件: sudo nano /etc/selinux/config 找到以下行: SELINUX=enforcing 将其改为: SELINUX=disabled 保存并关闭文件。 4,**重新启动系统**:完成以上步骤后,重新启动系统以使更改生效: sudo reboot 或者,你可以使用以下命令暂时将SELinux置于宽容模式。请注意,此更改不会在重新启动后继续存在,并且稍后会返回到"强制"模式。要再次启用SELinux,只需执行: sudo setenforce 1 #### 6,关闭swap # 关闭swap sudo swapoff -a # 禁用开机自动启用swap sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #### 7,设置时间同步 # 设置时区 sudo timedatectl set-timezone Asia/Shanghai ​ # 同步时间 sudo apt-get install -y ntpdate sudo ntpdate time1.aliyun.com (有网才行) ### sealos CLI部署k8s集群 #### 安装sealos 仅仅k8s-master01安装就行 下载Sealos wget https://github.com/labring/sealos/releases/download/v5.0.0-beta5/sealos_5.0.0-beta5_linux_amd64.deb 安装Sealos sudo dpkg -i sealos_5.0.0-beta5_linux_amd64.deb 验证安装 sealos version #### 部署前的准备 ##### 给root用户设置密码 > 给--masters和--nodes配置的ip的机器root用户机器设置密码 > > --masters 192.168.231.140 \\ > > --nodes 192.168.231.141,192.168.231.142,192.168.231.143 \\ > > sudo passwd root > > 111111 ##### 确保支持ssh密码认证和连接 确保你的节点支持密码认证。你可以通过在你的节点上查看/etc/ssh/sshd_config文件来确认这一点。如果这个文件中的PasswordAuthentication选项被设置为no,那么你的节点就不支持密码认证。你可以将这个选项改为yes,然后重启SSH服务来启用密码认证。 vim /etc/ssh/sshd_config **如果root用户不支持ssh连接进行如下操作** **`PermitRootLogin prohibit-password`** 这个设置表示系统禁止通过密码认证的方式来进行**`root`** 用户的SSH登录。你可以将这个设置改为**`PermitRootLogin yes`** ,这样就可以允许**`root`**用户通过密码认证的方式进行SSH登录。以下是具体的步骤: 1. 打开SSH的配置文件: sudo vim /etc/ssh/sshd_config 2. 在打开的文件中,找到`PermitRootLogin prohibit-password`这一行。 3. 将这一行改为`PermitRootLogin yes`。 4. 保存并关闭文件。 5. 重启SSH服务: sudo systemctl restart ssh 完成以上步骤后,你应该就可以使用`root`用户进行SSH连接了。 #### k8s部署依赖介绍 > ``` > labring/helm:v3.12.0 \ > labring/calico:v3.24.1 \ > labring/cert-manager:v1.8.0 \ > labring/openebs:v3.4.0 \ > ``` 这些都是 Kubernetes 集群中的重要组件,它们各自有不同的作用: 1. **labring/helm:v3.12.0**:Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 下的 apt 或 yum。它可以帮助用户通过定义配置文件的方式来部署和管理 Kubernetes 应用,极大地简化了应用在 Kubernetes 上的部署和管理流程。 2. **labring/calico:v3.24.1**:Calico 是一个网络策略引擎,它提供了网络策略和网络路由的功能,可以用于 Kubernetes 集群的网络策略管理和 Pod 网络的构建。 3. **labring/cert-manager:v1.8.0**:Cert-Manager 是一个用于 Kubernetes 集群中自动化管理 TLS 证书的开源工具。它使用了 Kubernetes 的自定义资源定义(CRD)机制,让证书的创建、更新和删除变得非常容易。 4. **labring/openebs:v3.4.0**:OpenEBS 是一个开源的存储平台,它提供了一种简单的方式来部署和管理持久化数据存储在 Kubernetes 中。OpenEBS 支持多种类型的存储,包括本地卷、复制卷等。 #### 网络下部署 ##### 使用sealos cli部署K8S集群(请使用管理员权限) ###### 1,获取Clusterfile文件 > ``` > [root@k8s-master01 ~]# vim sealos-cli-install-k8s.sh > [root@k8s-master01 ~]# cat sealos-cli-install-k8s.sh > #k8s版本1.25.6 > sealos gen labring/kubernetes:v1.25.6 \ >   labring/helm:v3.12.0 \ >   labring/calico:v3.24.1 \ >   labring/cert-manager:v1.8.0 \ >   labring/openebs:v3.4.0 \ >   --masters 192.168.231.140 \ >   --nodes 192.168.231.141,192.168.231.142,192.168.231.143 \ >   -p 111111 --output Clusterfile > ​ > ​ > #k8s版本1.27.11 > sealos gen labring/kubernetes:v1.27.11 \ >   labring/helm:v3.14.1 \ >   labring/calico:v3.24.1 \ >   labring/cert-manager:v1.14.4 \ >   labring/openebs:v3.10.0 \ >   --masters 192.168.231.140 \ >   --nodes 192.168.231.141,192.168.231.142,192.168.231.143 \ >   -p 111111 --output Clusterfile > ``` > ``` > [root@k8s-master01 ~]# sh sealos-cli-install-k8s.sh > 如果执行后生成的Clusterfile有问题,下载下面依赖 > sudo apt-get install uidmap > sudo apt-get install fuse-overlayfs > ``` `sealos gen` 命令会根据你提供的参数来生成 `Clusterfile` 文件。在你的例子中,这些参数包括: * `labring/kubernetes:v1.25.6`、`labring/helm:v3.12.0`、`labring/calico:v3.24.0`、`labring/cert-manager:v1.8.0` 和 `labring/openebs:v3.4.0`:这些是你要部署的 Kubernetes 集群所需的组件和它们的版本。 * `--masters 192.168.231.140`:这是你的 Kubernetes 集群的 master 节点的 IP 地址。 * `--nodes 192.168.231.141,192.168.231.142,192.168.231.143`:这些是你的 Kubernetes 集群的 worker 节点的 IP 地址。 * `-p 111111`:这是用于 SSH 连接到你的节点的密码。 * `--output Clusterfile`:这是生成的 `Clusterfile` 文件的名称。 ###### 2,sealos利用Clusterfile部署 > ``` > 部署 > [root@k8s-master01 ~]# sealos apply -f Clusterfile > ``` **出现下图,说明k8s集群已安装完成。** ![](https://i-blog.csdnimg.cn/direct/9978ad9e31ae4d198bb3f7abfa29a090.webp) 查看节点状态 > > ``` > [root@k8s-master01 ~]# kubectl get pods -A > [root@k8s-master01 ~]# kubectl get nodes > NAME           STATUS   ROLES           AGE   VERSION > k8s-master01   Ready   control-plane   18h   v1.25.6 > k8s-worker01   Ready           18h   v1.25.6 > k8s-worker02   Ready           18h   v1.25.6 > k8s-worker03   Ready           18h   v1.25.6 > ​ > kubectl get pods -A:这个命令用于获取 Kubernetes 集群中所有命名空间的 Pod 的信息。Pod 是 Kubernetes 中的最小部署单元,它包含一个或多个容器。-A 参数表示获取所有命名空间的 Pod 的信息。 > kubectl get nodes:这个命令用于获取 Kubernetes 集群中所有节点(Node)的信息。在 Kubernetes 中,节点可以是一个虚拟机或物理机,它是运行 Pod 的主机。 > ``` #### 无网络部署 ##### 使用sealos cli部署K8S集群(请使用管理员权限) ###### 1,获取Clusterfile文件 网络下执行sealos-cli-install-k8s.sh获取Clusterfile复制到离线环境中 **注意:记得更改你自己的机器ip地址和密码** > > ``` > [root@k8s-master01 ~]# vim sealos-cli-install-k8s.sh > [root@k8s-master01 ~]# cat sealos-cli-install-k8s.sh > #k8s版本1.25.6 > sealos gen labring/kubernetes:v1.25.6 \ >   labring/helm:v3.12.0 \ >   labring/calico:v3.24.1 \ >   labring/cert-manager:v1.8.0 \ >   labring/openebs:v3.4.0 \ >   --masters 192.168.231.140 \ >   --nodes 192.168.231.141,192.168.231.142,192.168.231.143 \ >   -p 111111 --output Clusterfile > ​ > ​ > #k8s版本1.27.11 > sealos gen labring/kubernetes:v1.27.11 \ >   labring/helm:v3.14.1 \ >   labring/calico:v3.24.1 \ >   labring/cert-manager:v1.14.4 \ >   labring/openebs:v3.10.0 \ >   --masters 192.168.231.140 \ >   --nodes 192.168.231.141,192.168.231.142,192.168.231.143 \ >   -p 111111 --output Clusterfile > ``` `sealos gen` 命令会根据你提供的参数来生成 `Clusterfile` 文件。在你的例子中,这些参数包括: * `labring/kubernetes:v1.25.6`、`labring/helm:v3.12.0`、`labring/calico:v3.24.0`、`labring/cert-manager:v1.8.0` 和 `labring/openebs:v3.4.0`:这些是你要部署的 Kubernetes 集群所需的组件和它们的版本。 * `--masters 192.168.231.140`:这是你的 Kubernetes 集群的 master 节点的 IP 地址。 * `--nodes 192.168.231.141,192.168.231.142,192.168.231.143`:这些是你的 Kubernetes 集群的 worker 节点的 IP 地址。 * `-p 111111`:这是用于 SSH 连接到你的节点的密码。 * `--output Clusterfile`:这是生成的 `Clusterfile` 文件的名称。 ###### 2,下载部署需要的镜像 > ``` > #一键下载镜像的脚步pull_images.sh为拉取镜像后保存,save_images.sh为你已经拉取完镜像后保存 > #!/bin/bash > # pull_images.sh > set -ex > mkdir -p tars > images=( > docker.io/labring/kubernetes:v1.25.6 > docker.io/labring/helm:v3.12.0 > docker.io/labring/calico:v3.24.1 > docker.io/labring/cert-manager:v1.8.0 > docker.io/labring/openebs:v3.4.0 > docker.io/labring/kubernetes-reflector:v7.0.151 > docker.io/labring/ingress-nginx:v1.5.1 > docker.io/labring/zot:v1.4.3 > docker.io/labring/kubeblocks:v0.5.3 > docker.io/labring/sealos-cloud:latest > ) > ​ > for image in "${images[@]}"; do > sealos pull "$image" > filename=$(echo "$image" | cut -d':' -f1 | tr / -) > sealos save -o "tars/${filename}.tar" "$image" > done > ​ > #!/bin/bash > # save_images.sh > set -ex > mkdir -p tars > images=( > registry.cn-shanghai.aliyuncs.com/labring/sealos-cloud:v5.0.0-beta5 > ghcr.io/labring/sealos-cloud-template-frontend:latest > ghcr.io/labring/sealos-cloud-terminal-frontend:latest > ghcr.io/labring/sealos-cloud-applaunchpad-frontend:latest > ghcr.io/labring/sealos-cloud-desktop-frontend:latest > ghcr.io/labring/sealos-cloud-dbprovider-frontend:latest > ghcr.io/labring/sealos-cloud-cronjob-frontend:latest > ghcr.io/labring/sealos-cloud-costcenter-frontend:latest > ghcr.io/labring/sealos-cloud-license-frontend:latest > ghcr.io/labring/sealos-cloud-terminal-controller:latest > ghcr.io/labring/sealos-cloud-user-controller:latest > ghcr.io/labring/sealos-cloud-resources-controller:latest > ghcr.io/labring/sealos-cloud-job-init-controller:latest > ghcr.io/labring/sealos-cloud-license-controller:latest > ghcr.io/labring/sealos-cloud-job-heartbeat-controller:latest > ghcr.io/labring/sealos-cloud-app-controller:latest > ghcr.io/labring/sealos-cloud-account-controller:latest > registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.11 > ghcr.io/labring/sealos-cloud-account-service:latest > ghcr.io/labring/sealos-cloud-database-service:latest > ghcr.io/labring/sealos-cloud-launchpad-service:latest > registry.cn-shanghai.aliyuncs.com/labring/kubeblocks-apecloud-mysql:v0.8.2 > registry.cn-shanghai.aliyuncs.com/labring/kubeblocks-postgresql:v0.8.2 > registry.cn-shanghai.aliyuncs.com/labring/kubeblocks-mongodb:v0.8.2 > registry.cn-shanghai.aliyuncs.com/labring/kubeblocks:v0.8.2 > registry.cn-shanghai.aliyuncs.com/labring/kubeblocks-redis:v0.8.2 > registry.cn-shanghai.aliyuncs.com/labring/cockroach:latest > registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.14.8 > registry.cn-shanghai.aliyuncs.com/labring/cert-manager:v1.14.4 > registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.10.0 > registry.cn-shanghai.aliyuncs.com/labring/helm:v3.14.1 > registry.cn-shanghai.aliyuncs.com/labring/victoria-metrics-k8s-stack:v1.96.0 > registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.9.4 > registry.cn-shanghai.aliyuncs.com/labring/metrics-server:v0.6.4 > ) > ​ > for image in "${images[@]}"; do > filename=$(echo "$image" | cut -d':' -f1 | tr / -) > sealos save -o "tars/${filename}.tar" "$image" > done > ​ > #一键加载镜像的脚步 > #!/bin/bash > # load_images.sh > set -ex > for file in tars/*.tar; do > sealos load -i "$file" > done > ``` ###### 详细步骤解析 在有网络的环境中,使用 `sealos save` 命令导出 Docker 镜像。例如: > > ``` > sealos save -o <保存的路径> <镜像名>:<标签> > ``` 例子: * sealos save -o ./kubernetes1.25.6.tar docker.io/labring/kubernetes:v1.25.6 * sealos save -o ./cert-manager1.8.0.tar docker.io/labring/cert-manager:v1.8.0 * sealos save -o ./helm3.12.0.tar docker.io/labring/helm:v3.12.0 * sealos save -o ./openebs3.4.0.tar docker.io/labring/openebs:v3.4.0 * sealos save -o ./calico3.24.1.tar docker.io/labring/calico:v3.24.1 将导出的 Docker 镜像文件复制到离线环境中。 在离线环境中,使用 `sealos load` 命令导入 Docker 镜像。例如: > > ``` > sealos load -i <镜像文件路径> > ``` 例子: * sealos load -i ./calico3.24.1.tar * sealos load -i ./cert-manager1.8.0.tar * sealos load -i ./openebs3.4.0.tar * sealos load -i ./kubernetes1.25.6.tar * sealos load -i ./helm3.12.0.tar 确认镜像已经成功导入,可以使用 `sealos images` 命令查看。 ###### 3,sealos利用Clusterfile部署 你可以按照之前的步骤使用 Sealos 部署 Kubernetes。例如: > > ``` > sealos apply -f Clusterfile > ``` 请注意,你需要替换上述命令中的 `<保存的路径>`、`<镜像名>:<标签>` 和 `<镜像文件路径>` 为实际的值。 **出现下图,说明k8s集群已安装完成。** ![](https://i-blog.csdnimg.cn/direct/e91932dd078b47198442654dca63e32e.webp) 查看节点状态 > > ``` > [root@k8s-master01 ~]# kubectl get pods -A > [root@k8s-master01 ~]# kubectl get nodes > NAME           STATUS   ROLES           AGE   VERSION > k8s-master01   Ready   control-plane   18h   v1.25.6 > k8s-worker01   Ready           18h   v1.25.6 > k8s-worker02   Ready           18h   v1.25.6 > k8s-worker03   Ready           18h   v1.25.6 > ​ > kubectl get pods -A:这个命令用于获取 Kubernetes 集群中所有命名空间的 Pod 的信息。Pod 是 Kubernetes 中的最小部署单元,它包含一个或多个容器。-A 参数表示获取所有命名空间的 Pod 的信息。 > kubectl get nodes:这个命令用于获取 Kubernetes 集群中所有节点(Node)的信息。在 Kubernetes 中,节点可以是一个虚拟机或物理机,它是运行 Pod 的主机。 > ``` ### nginx应用运行例子 #### 有网例子 > ``` > # 创建一次deployment部署 > kubectl create deployment nginx --image=nginx #有网络请使用 > kubectl expose deployment nginx --port=80 --type=NodePort > # 查看Nginx的pod和service信息 > kubectl get pod,svc -o wide > ``` #### 无网例子 无网络情况下可提前在有网的情况下下载镜像,然后**sealos load -i \<镜像文件路径\>** 使用Sealos的`login`命令: > > ``` > sealos login -u admin -p passw0rd 192.168.231.140:5000 > ``` **推送镜像到Registry** :然后,你可以将你的Docker镜像推送到你的私人Registry。首先,你需要给你的镜像打上标签,然后推送它。例如,如果你有一个名为`my-image`的镜像,你可以使用以下命令: > > ``` > sealos tag nginx 192.168.231.140:5000/my_nginx > sealos push 192.168.231.140:5000/my_nginx > ``` > ``` > # 创建一次deployment部署 > kubectl create deployment nginx --image=192.168.231.140:5000/my_nginx #无网络请使用 > kubectl expose deployment nginx --port=80 --type=NodePort > # 查看Nginx的pod和service信息 > kubectl get pod,svc -o wide > ``` ### 应用部署 ![](https://i-blog.csdnimg.cn/direct/bf10d873c8494e99bfcb92530b1a5445.jpeg) ![](https://i-blog.csdnimg.cn/direct/4246df12a09f44028f4f1a101530fda0.jpeg) #### 资源对象扩容缩容 > ``` > kubectl edit deployment.apps nginx > ``` 这个命令 `kubectl edit deployment.apps nginx` 是 Kubernetes 的命令行工具 `kubectl` 的一个命令。下面是对这个命令的解析和备注: * `kubectl`: 这是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。 * `edit`: 这是 `kubectl` 的一个子命令,用于编辑 Kubernetes 集群中的资源。 * `deployment.apps`: 这是要编辑的资源类型。在这个例子中,资源类型是 `deployment.apps`,表示我们要编辑的是一个 Deployment 资源。 * `nginx`: 这是要编辑的资源的名称。在这个例子中,资源的名称是 `nginx`,表示我们要编辑的是名为 `nginx` 的 Deployment。 运行命令打开文件修改replicas数量为3实现扩容 ![](https://i-blog.csdnimg.cn/direct/0b5cf139855a4a58894857d4546d4d13.png) 结果 ![](https://i-blog.csdnimg.cn/direct/c24bee4b7fab460c8fb5712065f83f85.png) > > ``` > kubectl scale deployment nginx --replicas=1 > ``` 这个命令 `kubectl scale deployment nginx --replicas=1` 也是 Kubernetes 的命令行工具 `kubectl` 的一个命令。下面是对这个命令的解析和备注: * `kubectl`: 这是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。 * `scale`: 这是 `kubectl` 的一个子命令,用于改变 Kubernetes 集群中的资源的规模。 * `deployment`: 这是要改变规模的资源类型。在这个例子中,资源类型是 `deployment`,表示我们要改变的是一个 Deployment 的规模。 * `nginx`: 这是要改变规模的资源的名称。在这个例子中,资源的名称是 `nginx`,表示我们要改变的是名为 `nginx` 的 Deployment 的规模。 * `--replicas=1`: 这是 `scale` 命令的一个参数,用于指定新的规模。在这个例子中,`--replicas=1` 表示我们要将 `nginx` 的 Deployment 的副本数设置为 1。 结果 ![](https://i-blog.csdnimg.cn/direct/672818f042884396b2a6bc3de1f38664.png) #### kubectl set `kubectl set` 是 Kubernetes 的命令行工具 `kubectl` 的一个子命令,用于改变 Kubernetes 集群中的资源的某些属性。下面是一些常见的 `kubectl set` 的用法: * `kubectl set image`: 用于更新 pod 模板的镜像。例如,`kubectl set image deployment/nginx nginx=nginx:1.9.1` 命令会将名为 `nginx` 的 Deployment 的 nginx 容器的镜像更新为 `nginx:1.9.1`。 * `kubectl set resources`: 用于更新资源的资源限制。例如,`kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi` 命令会将名为 `nginx` 的 Deployment 的 CPU 限制设置为 200m,内存限制设置为 512Mi。 * `kubectl set env`: 用于更新资源的环境变量。例如,`kubectl set env deployment/nginx DOMAIN=cluster` 命令会将名为 `nginx` 的 Deployment 的环境变量 `DOMAIN` 设置为 `cluster`。 * `kubectl set serviceaccount`: 用于更新资源的服务账户。例如,`kubectl set serviceaccount deployment nginx sa-nginx` 命令会将名为 `nginx` 的 Deployment 的服务账户设置为 `sa-nginx`。 这些只是 `kubectl set` 的一些常见用法,还有很多其他的用法。你可以使用 `kubectl set --help` 命令来获取更多的信息和示例。在使用 `kubectl set` 命令时,需要注意,不是所有的属性都可以通过 `set` 命令来改变,有些属性可能需要使用 `edit` 命令或者其他的命令来改变。所以在使用这个命令时,需要根据你的需求来选择合适的命令。同时,`kubectl set` 命令的更改会立即应用,所以在使用这个命令时,需要谨慎操作。如果你不确定一个命令的效果,你可以先在一个测试环境中试验这个命令,确认没有问题后再在生产环境中使用。这是一个很好的实践,可以帮助你避免因为错误的命令导致的问题。 #### 命名空间 -- k8s平台上的一个独立的小房间,每个房间的资源,互相独立。 namespace,如果杀死命名空间,命名空间其下的所有资源(如 Pod、Service、Deployment 等)都将被删除。 ##### **查看命令** > ``` > kubectl get pods > kubectl get ns > kubectl get pod -n default > ``` 这三个命令都是 Kubernetes 的命令行工具 `kubectl` 的命令,用于获取 Kubernetes 集群中的资源信息。下面是对这些命令的解析和备注: 1. `kubectl get pods`: 这个命令用于获取 Kubernetes 集群中的所有 Pod 的信息。Pod 是 Kubernetes 中的最小部署单元,每个 Pod 可以包含一个或多个容器。这个命令会列出所有的 Pod,包括它们的名称、状态、重启次数和运行时间等信息。 2. `kubectl get ns`: 这个命令用于获取 Kubernetes 集群中的所有命名空间(Namespace)的信息。命名空间是 Kubernetes 中用于将资源进行逻辑隔离的一种方式。这个命令会列出所有的命名空间,包括它们的名称和状态等信息。 3. `kubectl get pod -n default`: 这个命令用于获取 Kubernetes 集群中 `default` 命名空间下的所有 Pod 的信息。`-n default` 参数指定了命名空间为 `default`。这个命令会列出 `default` 命名空间下的所有 Pod,包括它们的名称、状态、重启次数和运行时间等信息。 这些命令都是 Kubernetes 管理员在日常工作中经常使用的命令,用于查看和管理 Kubernetes 集群中的资源。 ##### **示例** 以下是一个示例的 YAML 文件,它首先创建一个名为 `my-namespace` 的命名空间,然后在该命名空间中部署一个 nginx 应用: > > ``` > # 这部分定义了一个 Namespace(命名空间)资源 > --- > apiVersion: v1  # Kubernetes API 的版本 > kind: Namespace  # 资源类型,这里是 Namespace > metadata: > name: my-namespace  # Namespace 的名称 > ​ > # 这部分定义了一个 Deployment(部署)资源 > --- > apiVersion: apps/v1  # Kubernetes API 的版本 > kind: Deployment  # 资源类型,这里是 Deployment > metadata: > name: nginx-deployment  # Deployment 的名称 > namespace: my-namespace  # Deployment 所在的 Namespace > spec: > selector: >   matchLabels: >     app: nginx  # 选择器,用于选择属于这个 Deployment 的 Pod > replicas: 1  # 副本数,表示这个 Deployment 管理的 Pod 的数量 > template:  # Pod 模板,用于创建新的 Pod >   metadata: >     labels: >       app: nginx  # 标签,会被添加到所有由这个 Deployment 创建的 Pod 上 >   spec: >     containers:  # 容器列表,每个 Pod 可以包含一个或多个容器 >     - name: nginx  # 容器的名称 >       image: 192.168.231.140:5000/my_nginx  # 容器的镜像 >       ports:  # 容器的端口列表 >       - containerPort: 80  # 容器的端口号 > ​ > ``` 这个 YAML 文件包含二部分: 1. 创建一个名为 `my-namespace` 的命名空间。 2. 在 `my-namespace` 命名空间中创建一个名为 `nginx-deployment` 的 Deployment。这个 Deployment 包含一个副本,每个副本运行一个 nginx 容器。 你可以将这个 YAML 文件保存为一个 `.yaml` 文件,然后使用 `kubectl apply -f [文件名].yaml` 命令来应用这个 YAML 文件。这将会创建命名空间和 nginx 应用。 **运行结果** ![](https://i-blog.csdnimg.cn/direct/2a0e669b99e24d52ad3751f9076a63aa.png) ##### 删除命名空间,删除命名空间中的某个特定资源 **删除命名空间** > > > kubectl delete namespace server > \`kubectl delete namespace server\`: 这个命令用于删除 Kubernetes 集群中名为 \`server\` 的命名空间。当你执行这个命令时,\`server\` 命名空间及其下的所有资源(如 Pod、Service、Deployment 等)都将被删除。这是一个破坏性的操作,一旦执行,所有的数据都将被永久删除,无法恢复。因此,在执行这个命令之前,你需要确保你真的想要删除这个命名空间及其所有资源。 **删除某个特定资源** 在 Kubernetes 中,你可以使用 \`kubectl delete\` 命令来删除命名空间中的特定资源。你需要提供要删除的资源类型和资源名称,以及资源所在的命名空间。以下是一些示例: - 删除默认命名空间中的 Pod: > kubectl delete pod my-pod - 删除特定命名空间中的 Deployment: > kubectl delete deployment my-deployment -n my-namespace 在这些命令中,\`my-pod\` 和 \`my-deployment\` 是要删除的资源的名称,\`my-namespace\` 是资源所在的命名空间。 \*在使用这些命令时,你需要注意,这些命令只能删除资源,不能恢复已经删除的资源。如果你不小心删除了一个重要的资源,你可能需要重新创建这个资源,或者从备份中恢复这个资源(如果你有备份的话)。因此,在使用这些命令时,你需要谨慎操作,确保你知道这些命令的影响,并且你已经做好了相应的准备。\* #### Service ##### service简介 作用:将外部流量引入到pod里面 关键:label(通过label去引入的) 地址:clusterIp -- 虚拟网络 ====》k8s集群外部的主机是无法访问的 k8s集群内部的所有应用对象,都可以自由访问 ![](https://i-blog.csdnimg.cn/direct/7a1dbaa0797d476f989bf89c765f1450.jpeg) service更多详细介绍参考:[玩转k8s:Service详解-CSDN博客](https://blog.csdn.net/duansamve/article/details/129613829 "玩转k8s:Service详解-CSDN博客") ##### **查看service** > ``` > kubectl get svc > kubectl describe svc nginx > kubectl get pod -o wide > ``` 1. `kubectl get pod -o wide`: 这个命令用于获取 Kubernetes 集群中的所有 Pod 的详细信息。`-o wide` 参数表示输出详细的信息,包括每个 Pod 的 IP 地址、所在的节点等。 2. `kubectl describe svc nginx`: 这个命令用于获取 Kubernetes 集群中名为 `nginx` 的 Service 的详细描述信息。这个命令的输出包括 Service 的类型、端口映射、选择器、事件等信息。 3. `kubectl get svc`: 这个命令用于获取 Kubernetes 集群中的所有 Service 的信息。Service 是 Kubernetes 中的一种资源,用于提供网络服务,如 HTTP 服务、数据库服务等。 ##### 创建service ###### 集群外部用户访问集群内部pod应用 命令方式: expose > kubectl expose --help #查看帮助文档 > > kubectl expose deployment nginx --port=80 ![](https://i-blog.csdnimg.cn/direct/d951b64576734bfa8d85c54518335829.png) yaml清单文件方式:apply kubectl expose deployment nginx --port=8080 --dry-run=client -o yaml \> nginx_service.yaml > > ``` > #nginx_service.yaml文件修改前 > apiVersion: v1 > kind: Service > metadata: > creationTimestamp: null > labels: >   app: nginx > name: nginx > spec: > ports: > - port: 8080 >   protocol: TCP >   targetPort: 8080 > selector: >   app: nginx > status: > loadBalancer: {} >   > #nginx_service.yaml文件修改后 > apiVersion: v1 > kind: Service > metadata: > labels: >   app: nginx > name: nginx > spec: > ports: > - port: 8080 >   protocol: TCP >   targetPort: 80 > selector: >   app: nginx > ``` 在这个 Kubernetes Service 配置中: * `port: 8080` 是**向外暴露的端口**(也被称为服务端口)。这是其他服务或客户端在集群内部访问这个 Service 时使用的端口。 * `targetPort: 8080` 是**容器的 Pod 端口**。这是 Service 将流量路由到的 Pod 中的容器端口。 apply运行 > > ``` > kubectl apply -f nginx_service.yaml > kubectl get svc > ``` ###### 集群内部pod应用访问集群外部服务 ###### 详细步骤 1. 部署外部集群 2. 创建endpoint 3. 创建service 4. pod测试 ###### 部署外部集群 部署外部mysql环境 > > ``` > # 更新系统软件包 > sudo apt-get update > ​ > # 安装 MariaDB 服务器 > sudo apt-get install mariadb-server -y > ​ > # 启动 MariaDB 服务 > sudo systemctl start mariadb > ​ > # 设置 MariaDB 服务在启动时自动启动 > sudo systemctl enable mariadb > ​ > 开启 MySQL 服务器远程访问能力 > sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf > 在 vim 中,你需要先按 i 键进入插入模式,才能开始编辑文本。 > 找到 [mysqld] 部分,然后找到 bind-address,将其值改为 0.0.0.0: > [mysqld] > bind-address = 0.0.0.0 > ​ > 重启 MySQL 服务使配置生效 > sudo systemctl restart mariadb > ​ > 配置远程主机登录权限 > mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;" > mysql -uroot -p123456 -e "FLUSH PRIVILEGES;" > 主库上创建数据库 > ]# mysql -uroot -p123456" > CREATE DATABASE bookinfo default charset utf8 collate utf8_general_ci; > USE bookinfo; > CREATE TABLE book_info ( >  id INT AUTO_INCREMENT PRIMARY KEY, >  book_name VARCHAR(100), >  author VARCHAR(100), >  date_of_issue DATE, >  isDelete BOOLEAN > ); > INSERT INTO book_info (book_name, author, date_of_issue, isDelete) VALUES >  ('Book 1', 'Author 1', '2022-01-01', FALSE), >  ('Book 2', 'Author 2', '2022-02-01', FALSE), >  ('Book 3', 'Author 3', '2022-03-01', TRUE); > use bookinfo > select * from book_info; > 检查是否可以远程连接 > mysql -uroot -p123456 -h192.168.231.141 -e "show databases" > ``` 定制资源清单文件 > > ``` > # 创建一个名为 'external-ns' 的命名空间 > apiVersion: v1 > kind: Namespace > metadata: > name: external-ns > ​ > --- > ​ > # 创建一个名为 'ex-mysql' 的 Endpoints 对象,它定义了一个 IP 地址和一个端口 > # 这通常用于表示一个非 Kubernetes 服务的网络端点 > apiVersion: v1 > kind: Endpoints > metadata: > name: ex-mysql > namespace: external-ns > subsets: > - addresses: >     - ip: 10.0.0.18 # IP 地址 >   ports: >     - port: 3306 # 端口 > ​ > --- > ​ > # 创建一个名为 'ex-mysql' 的 Service 对象 > # 这个 Service 对象定义了一个 ClusterIP 类型的服务,端口为 3306,目标端口也为 3306 > # 这个服务可以用于在集群内部访问 'ex-mysql' Endpoints 对象所代表的网络端点 > apiVersion: v1 > kind: Service > metadata: > name: ex-mysql > namespace: external-ns > spec: > type: ClusterIP > ports: > - port: 3306 >   targetPort: 3306 > ​ > --- > ​ > # 创建一个名为 'bookinfo' 的 Deployment 对象 > # 这个 Deployment 对象定义了一个副本数为 1 的 Pod,Pod 中运行了一个名为 'flask-bookinfo' 的容器 > # 该容器使用的镜像是 'kubernetes-register.sswang.com/sswang/flask_bookinfo:2.3.2' > # 容器的端口是 5000,环境变量包括数据库主机名、用户名、密码和数据库名,这些都用于连接到 'ex-mysql' 服务 > apiVersion: apps/v1 > kind: Deployment > metadata: > name: bookinfo > namespace: external-ns > spec: > replicas: 1 > selector: >   matchLabels: >     app: flask-bookinfo > template: >   metadata: >     labels: >       app: flask-bookinfo >   spec: >     containers: >       - name: flask-bookinfo >         image: kubernetes-register.sswang.com/sswang/flask_bookinfo:2.3.2 >         imagePullPolicy: Always >         ports: >           - containerPort: 5000 >         env: >           - name: DB_HOST >             value: "ex-mysql" # 数据库主机名 >           - name: DB_USER >             value: "root" # 数据库用户名 >           - name: DB_PASSWORD >             value: "123456" # 数据库密码 >           - name: DB_DATABASE >             value: "bookinfo" # 数据库名 > ​ > ``` 结果 > > ``` > 查看 > kubectl get pod -n external-ns > 端口转发 > kubectl -n external-ns port-forward --address 0.0.0.0 pod/bookinfo 5000:5000 > ``` 这个命令是 Kubernetes 的 `kubectl` 命令,用于在本地机器和 Kubernetes 集群中的 Pod 之间建立网络端口转发。下面是对这个命令的详细解析: * `kubectl`:这是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。 * `-n external-ns`:这个选项指定了命名空间为 `external-ns`。命名空间是 Kubernetes 中用于将资源进行逻辑隔离的。 * `port-forward`:这是 `kubectl` 的一个子命令,用于在本地机器和 Kubernetes 集群中的 Pod 之间建立网络端口转发。 * `--address 0.0.0.0`:这个选项指定了本地地址为 `0.0.0.0`,这意味着会监听所有的网络接口。 * `pod/bookinfo`:这是要进行端口转发的 Pod 的名称,格式为 `<资源类型>/<资源名称>`。 * `5000:5000`:这是端口转发的设置,格式为 `<本地端口>:`。这意味着本地的 5000 端口会被转发到 Pod 的 5000 端口。 总的来说,这个命令的作用是将本地机器的 5000 端口转发到 `external-ns` 命名空间中名为 `bookinfo` 的 Pod 的 5000 端口,从而可以通过访问本地的 5000 端口来访问该 Pod 的服务。 ![](https://i-blog.csdnimg.cn/direct/aea194717d4143e087eb808fdb2c8372.png) ###### 错误处理 root@k8s-master01:\~# mysql -uroot -p123456 -h192.168.231.141 -e "show databases" Command 'mysql' not found, but can be installed with: apt install mysql-client-core-8.0 # version 8.0.35-0ubuntu0.22.04.1, or apt install mariadb-client-core-10.6 # version 1:10.6.12-0ubuntu0.22.04.1 这个错误表明你的系统中没有安装 `mysql` 客户端。你可以通过以下命令来安装: 如果你想安装 MySQL 客户端,可以使用以下命令: > > ``` > sudo apt install mysql-client-core-8.0 > ``` 如果你想安装 MariaDB 客户端,可以使用以下命令: > > ``` > sudo apt install mariadb-client-core-10.6 > ``` 安装完成后,你应该就可以使用 `mysql` 命令来连接到你的 MariaDB 服务器了。 ##### 删除service 在 Kubernetes 中,你可以使用 `kubectl delete service` 命令来删除一个 Service。你需要提供要删除的 Service 的名称,以及(可选的)Service 所在的命名空间。如果 Service 在默认命名空间中,你可以省略命名空间。 以下是一些示例: * 删除默认命名空间中的 Service: > ``` > kubectl delete service my-service > ``` * 删除特定命名空间中的 Service: > ``` > kubectl delete service my-service -n my-namespace > ``` 在这些命令中,`my-service` 是要删除的 Service 的名称,`my-namespace` 是 Service 所在的命名空间。 请注意,删除 Service 不会删除后端的 Pod。这意味着,即使 Service 被删除,后端的 Pod 仍然会运行,除非你明确地删除它们。 ### k8s查看计算费用,计算使用内存等的功能 #### Metrics-Server Metrics-Server是Kubernetes的一个核心组件,它用于收集和提供集群范围内的资源使用数据。Metrics-Server实现了Resource Metrics API,从每个节点上的Kubelet公开的Summary API中采集指标信息。 Metrics-Server的主要功能包括: * **提供资源使用数据**:Metrics-Server可以提供关于节点和Pod的当前CPU、内存和存储的资源使用情况。 * **支持其他Kubernetes组件** :一些Kubernetes组件,如`kubectl top`和Horizontal Pod Autoscaler (HPA),依赖于Metrics API来获取资源使用数据。 需要注意的是,Metrics-Server只能提供当前的资源使用情况,而无法提供历史数据。如果你需要历史数据,可能需要考虑使用其他的监控和度量解决方案,如Prometheus等。 **Metrics-Server组件目的**:获取集群中pod,节点等负载信息 参考连接:[资源指标管道 \| Kubernetes](https://kubernetes.io/zh-cn/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/ "资源指标管道 | Kubernetes") ![](https://i-blog.csdnimg.cn/direct/f3df70ad22e64be1b1ca56b2bb459a1b.png) ##### 兼容性矩阵 | 指标服务器 | 指标 API 组/版本 | 支持的 Kubernetes 版本 | |-------|--------------------------|-------------------| | 0.7.x | `metrics.k8s.io/v1beta1` | 1.19+ | | 0.6.x | `metrics.k8s.io/v1beta1` | 1.19+ | | 0.5.x | `metrics.k8s.io/v1beta1` | \*1.8+ | | 0.4.x | `metrics.k8s.io/v1beta1` | \*1.8+ | | 0.3.x | `metrics.k8s.io/v1beta1` | 1.8-1.21 | ##### Metrics Server 下载方式 github:[https://github.com/kubernetes-sigs/metrics-server](https://github.com/kubernetes-sigs/metrics-server "https://github.com/kubernetes-sigs/metrics-server") ##### k8s集群安装部署metrics(高可用性安装) 使用高可用性(High Availability)的`metrics-server`配置相比普通配置有以下优势: * **快速的自动扩缩**:每15秒收集一次度量,使得Kubernetes能够更快地进行自动扩缩。 * **资源效率**:对于每个集群节点,只使用1毫核的CPU和2MB的内存。 * **可扩展性**:支持最多5000个节点的集群。 * **单一部署**:在大多数集群上都可以工作。 这些优势使得`metrics-server`能够在大规模和高负载的环境中提供稳定和可靠的性能 ###### 下载 ![](https://i-blog.csdnimg.cn/direct/6111c07fc5b04e6ea4e02c51a8e081fe.png) ###### 下载地址 > ``` > 下载地址:https://github.com/kubernetes-sigs/metrics-server/releases > wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml > ``` metrics阿里云镜像地址: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 docker镜像地址: docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 用sealos自带的docker: sealos pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 ###### 修改high-availability-1.21+.yaml ![](https://i-blog.csdnimg.cn/direct/cd421955da5741bab5cb99277bf43c01.png) ###### 执行部署 > ``` > kubectl apply -f ./high-availability-1.21+.yaml > ``` ###### 查看metrics-server的pod运行状态 > ``` > kubectl get pods -n kube-system| egrep 'NAME|metrics-server' > ``` ### 一些基本的`kubectl`命令: **查看资源** :你可以使用`kubectl get`命令来查看Kubernetes集群中的资源。例如,要查看所有的Pods,你可以使用以下命令: > > ``` > kubectl get pods > ``` **查看详情** :你可以使用`kubectl describe`命令来查看资源的详细信息。例如,要查看名为`my-python-app`的Pod的详细信息,你可以使用以下命令: > > ``` > kubectl describe pod my-python-app > ``` **创建资源** :你可以使用`kubectl apply`命令来创建或更新资源。例如,要根据`my-python-app.yaml`文件创建资源,你可以使用以下命令: > > ``` > kubectl apply -f my-python-app.yaml > ``` **删除资源** :你可以使用`kubectl delete`命令来删除资源。例如,要删除名为`my-python-app`的Pod,你可以使用以下命令: > > ``` > kubectl delete pod my-python-app > ``` **查看日志** :你可以使用`kubectl logs`命令来查看Pod的日志。例如,要查看名为`my-python-app`的Pod的日志,你可以使用以下命令: > > ``` > kubectl logs my-python-app > ``` 以上只是`kubectl`的一些基本操作,`kubectl`还有许多其他的命令和选项。 ### Sealos私有云部署一键部署 详细参考:[Sealos 集群部署 \| Sealos: 专为云原生开发打造的以 K8s 为内核的云操作系统](https://sealos.run/docs/self-hosting/sealos/installation "Sealos 集群部署 | Sealos: 专为云原生开发打造的以 K8s 为内核的云操作系统") ![](https://i-blog.csdnimg.cn/direct/9bd3a680496d4a27a522f3ba4a844dc3.png) ![](https://i-blog.csdnimg.cn/direct/56cfc59a13c94b46a019bb261013b86f.png) ![](https://i-blog.csdnimg.cn/direct/cd2a42d2e3e14cdca78a230d8963f71d.png) ![](https://i-blog.csdnimg.cn/direct/53e7854e00d1442dafb90fbee3f17763.png) ## docker安装 ### docker介绍 Docker是一种开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 让我们用一个简单的比喻来理解Docker的作用: 想象你正在搬家,你需要把你的所有物品(你的代码和它的依赖)打包到箱子里(Docker容器)。这样,无论你搬到哪个新房子(新的服务器或电脑),你的物品都能够正常工作,因为它们都在你的箱子里,和外部环境隔离开来。 Docker的主要作用有: 1. **环境一致性**:无论开发、测试还是生产环境,Docker都能保证环境的一致性,避免了"在我机器上可以运行"的问题。 2. **快速部署**:Docker可以快速地启动容器(通常在几秒钟内),使得应用的部署、扩展和迁移变得更加高效。 3. **持续交付和部署**:使用Docker,你可以构建一个容器来运行你的应用,然后把这个容器发布出去。其他人可以直接使用你的容器来运行应用,无需关心环境问题。 4. **隔离性**:每个Docker容器都运行在自己的环境中,互不干扰。 5. **微服务架构**:Docker非常适合用来部署和运行基于微服务架构的应用。 总的来说,Docker就像一个轻量级的"虚拟机",它改变了软件开发和部署的方式,使得这个过程变得更加高效、灵活和可靠。 注意:如果要使用docker请用sealos安装支持docker的k8s,否则直接用sealos即可 [安装 K8s 集群 \| Sealos: 专为云原生开发打造的以 K8s 为内核的云操作系统](https://sealos.run/docs/self-hosting/lifecycle-management/quick-start/deploy-kubernetes "安装 K8s 集群 | Sealos: 专为云原生开发打造的以 K8s 为内核的云操作系统") ![](https://i-blog.csdnimg.cn/direct/e8925f76932943c59600f8826fd61990.png) docker参考资料: [几张图帮你理解 docker 基本原理及快速入门 - 一天不进步,就是退步 - 博客园](https://www.cnblogs.com/davidwang456/articles/9578409.html "几张图帮你理解 docker 基本原理及快速入门 - 一天不进步,就是退步 - 博客园") [docker 的八大技术架构(图解)_docker 架构-CSDN博客](https://blog.csdn.net/m0_73740682/article/details/136936927 "docker 的八大技术架构(图解)_docker 架构-CSDN博客") ### Docker架构 Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。 ![](https://i-blog.csdnimg.cn/direct/bfb9a0133e5346d78443611a81a150c3.png) ### docker和sealos ![](https://i-blog.csdnimg.cn/direct/bdf9aa2cdfd64d9092b24acdb439824d.png) ### 有网络下载 阿里云 Docker 镜像源安装 Docker 的步骤: 1. 更新包管理器: > ``` > sudo apt update > ``` 2. 安装 Docker 的依赖包: > ``` > sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release > ``` 3. 添加阿里云 Docker 镜像源 GPG 密钥: > ``` > curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg > ``` 4. 添加阿里云 Docker 镜像源: > ``` > echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null > ``` 注意:如果你使用的是非 Ubuntu 系统,比如 Debian 或 CentOS,可以参考阿里云 Docker 官方文档提供的相应命令。 5. 更新 apt 缓存: > ``` > sudo apt update > ``` 6. 安装 Docker: > ``` > sudo apt install docker-ce docker-ce-cli containerd.io > ``` 7. 启动 Docker 服务: > ``` > sudo systemctl start docker > ``` ### docker搭建一个私有仓库 **注意:我们使用sealos CLI部署k8s是存在一个有一个私有仓库端口为5000** 要在Docker中搭建一个私人镜像仓库,你可以使用Docker Registry。以下是一些步骤: **安装Docker Registry**:首先,你需要在你的服务器上安装Docker Registry。你可以使用以下命令来拉取并运行它: > > ``` > docker run -d -p 5000:5000 --restart=always --name registry registry:2 > ``` **推送镜像到Registry** :然后,你可以将你的Docker镜像推送到你的私人Registry。首先,你需要给你的镜像打上标签,然后推送它。例如,如果你有一个名为`my-image`的镜像,你可以使用以下命令: > > ``` > docker tag my-image localhost:5000/my-image > docker push localhost:5000/my-image > ``` **从Registry拉取镜像** :你可以使用`docker pull`命令从你的私人Registry中拉取镜像。例如: > > ``` > docker pull localhost:5000/my-image > ``` 请注意,这只是在单个服务器上运行私人Registry的基本设置。在生产环境中,你可能需要考虑使用SSL来保护你的Registry,并配置存储后端以持久化你的镜像。你可以在Docker Registry的官方文档中找到更多信息。 ### docker打包python项目,并用k8s部署 #### 撰写一个简单的flask项目 ![](https://i-blog.csdnimg.cn/direct/228c26f713c84cdea430066b772e11c0.png) **app.py** ![](https://i-blog.csdnimg.cn/direct/702479c37a5449228d4496deb7d0512f.png) from flask import Flask app = Flask(__name__) ​ @app.route('/') def hello_world(): return 'Hello, World!' ​ if __name__ == '__main__': app.run(host='0.0.0.0', port=80) **Dockerfile**用于构建docker镜像 ![](https://i-blog.csdnimg.cn/direct/062f8568870f4b18afa785c8eeea599b.png) # Dockerfile FROM python:3.8-slim # 安装依赖 RUN pip install flask # 设置工作目录 WORKDIR /app # 复制代码 COPY . /app # 暴露端口 #EXPOSE 8000 # 启动命令 CMD ["python", "app.py"] service.yaml ![](https://i-blog.csdnimg.cn/direct/e1cb2333ab1c4fcab25dc079390a7125.png) # service.yaml apiVersion: v1 # 使用的Kubernetes API的版本 kind: Service # 资源类型,这里是Service metadata: name: my-python-app-service # Service的名称 spec: selector: app: my-python-app # 选择器,用于匹配Pod的标签 ports: # 端口配置 - protocol: TCP # 协议类型 port: 80 # Service的端口 targetPort: 80 # Pod的端口 type: LoadBalancer # Service的类型,这里是LoadBalancer deployment.yaml ![](https://i-blog.csdnimg.cn/direct/f3cea27bbaef4a6b972ec8647ed7b43e.png) # deployment.yaml apiVersion: apps/v1 # 使用的Kubernetes API的版本 kind: Deployment # 资源类型,这里是Deployment metadata: name: my-python-app # Deployment的名称 spec: replicas: 3 # 副本数量,即Pod的数量 selector: matchLabels: app: my-python-app # 选择器,用于匹配Pod的标签 template: # Pod的模板 metadata: labels: app: my-python-app # Pod的标签 spec: containers: # 容器列表 - name: my-python-app # 容器名称 image: 192.168.231.140:5000/my-app:latest # 容器镜像 ports: - containerPort: 80 # 容器开放的端口 将my_python_project目录移动到linux系统下,在my_python_project目录下执行 > > ``` > # 构建镜像 > docker build -t my_python_app . > # 标记镜像 > docker tag my_python_app localhost:5000/my-app > # 推送到远程仓库 > docker push localhost:5000/my-app > # 创建Deployment > kubectl apply -f kubernetes/deployment.yaml > # 创建Service > kubectl apply -f kubernetes/service.yaml > ``` 现在,你的镜像已经存储在你的私人Registry中,你可以在任何有权访问该Registry的地方拉取和使用它。 ### 常见错误处理 #### docker push错误 ##### 错误一http: server gave HTTP response to HTTPS client > ``` > root@k8s-master01:/home/master1/my_python_project# docker push 192.168.231.140:5000/my-app Using default tag: latest The push refers to repository [192.168.231.140:5000/my-app] Get "https://192.168.231.140:5000/v2/": http: server gave HTTP response to HTTPS client > ``` 这个错误信息表明Docker客户端在尝试通过HTTPS协议连接到你的私有仓库,但是服务器返回了一个HTTP响应。这通常意味着你的私有仓库没有正确配置为使用HTTPS,或者Docker客户端没有正确配置以信任仓库的SSL证书。 你可以通过修改Docker的配置文件来允许Docker客户端使用HTTP连接到你的私有仓库。以下是如何修改Docker配置文件的步骤: 1,打开Docker的配置文件,通常位于`/etc/docker/daemon.json`。如果文件不存在,你需要创建它。 > > ``` > sudo vim /etc/docker/daemon.json > ``` ,2,在文件中添加`insecure-registries`字段,并设置为你的私有仓库的地址。例如: JSON > ``` > { >  "insecure-registries" : ["192.168.231.140:5000"], > } > ``` 3,保存并关闭文件,然后重启Docker服务以使新的配置生效。 > > ``` > sudo systemctl daemon-reload > sudo systemctl restart docker > ``` ##### 错误二no basic auth credentials 根据Sealos的官方文档,Sealos私有仓库的默认用户名和密码是`admin:passw0rd`。你可以使用以下命令来登录到你的私有仓库: > > ``` > docker login -u admin -p passw0rd 192.168.231.140:5000 > ``` 或者使用Sealos的`login`命令: > > ``` > sealos login -u admin -p passw0rd 192.168.231.140:5000 > ``` #### sudo apt install docker-ce docker-ce-cli containerd.io:Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 24775 (unattended-upgr) 这个错误是因为另一个进程(在这个例子中,进程号是24775)正在使用`dpkg`系统,这阻止了你运行`apt`命令。这通常发生在系统正在进行自动更新(如`unattended-upgrades`)时。 你可以使用以下命令来查看哪个进程正在使用`dpkg`系统: > > ``` > ps -aux | grep 24775 > ``` 如果你确定这个进程已经不再需要(例如,如果它是一个已经停止的自动更新进程),你可以使用`kill`命令来停止它: > > ``` > sudo kill -9 24775 > ``` 然后,你应该能够运行你的`apt`命令了。但是,请注意,强制停止一个正在运行的`dpkg`进程可能会导致系统包管理器处于不一致的状态,所以只有在你确定这个进程已经不再需要时,才应该这么做。

相关推荐
roman_日积跬步-终至千里3 小时前
【K8s基础】K8s下的Helm和Operator:包管理器与运维程序化
运维·容器·kubernetes
技术liul7 小时前
Docker Compose和 Kubernetes(k8s)区别
docker·容器·kubernetes
MaCa .BaKa8 小时前
35-疫苗预约管理系统(微服务)
spring boot·redis·微服务·云原生·架构·springcloud
竹木一54010 小时前
Docker拉取镜像代理配置实践与经验分享
经验分享·docker·容器
破 风11 小时前
Docker启动mysql容器时找不到 mysqlx.sock 和 mysqld.sock
mysql·docker·容器
阿里云云原生11 小时前
SAE 实现应用发布全过程可观测
云原生
鱼饼6号12 小时前
Jenkins Pipeline 构建 CI/CD 流程
linux·运维·服务器·ci/cd·容器·jenkins
Ares-Wang13 小时前
kubernetes》》k8s》》Heml
云原生·容器·kubernetes
阿里云大数据AI技术13 小时前
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
大数据·云原生·serverless
容器魔方14 小时前
Bilibili、中电信人工智能科技、商汤科技、联通云等正式加入Volcano社区用户组
云原生·容器·云计算