k8s教程(基础篇)-入门及案例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: k8s教程(基础篇)-入门及案例

1. 了解 Kubernetes

1.1 Kubernetes是什么

Kubernetes 是谷歌十几年来大规模容器技术应用的重要成果,是谷歌严格保密十几年的秘密武器一一 Borg 的一个开源版本。

通过简单阅读下列内容,对kubernetes有个感性的认知:

  • Kubernetes 也是一个全新的基于容器技术的分布式架构领先方案,是容器云的优秀平台选型方案,已成为新一代的基于容器技术的 PaaS 平台的重要底层框架,也是云原生技术生态圈的核心,服务网格(Service Mesh)、无服务器架构(Serverless)等新一代分布式架构框架及技术纷纷基于 Kubernetes 实现。
  • Kubernetes提供了强大的自动化机制,系统后期的运维难度和运维成本大幅度降低。
  • Kubernetes 是一个开放的开发平台,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用 Java、Go、C++还是用 Python 编写的服务,都可以被映射为 KubernetesService(服务),并通过标准的 TCP 通信协议进行交互。
  • Kubernetes 是一个完备的分布式系统支撑平台Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。
  • Kubernetes 提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。因此,Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。

1.2 Kubernetes的基本知识

1.2.1 Service

Kubernetes 中,Service是分布式集群架构的核心,一个 Service 对象拥有如下关键特征:

  • 拥有唯一指定的名称(比如 mysql-server);
  • 拥有一个虚拟IP地址(ClusterIP 地址)和端口号;
  • 能够提供某种远程服务能力;
  • 能够将客户端对服务的访问请求转发到一组容器应用上。

每个服务进程都有一个独立的 Endpoint (IP+Port)访问点,但 Kubernetes 能够让我们通过 Service (ClusterIP+Service Port)连接指定的服务。更重要的是,这个 Service 本身一旦创建就不再变化,这意味着我们再也不用为 Kubernetes集群中应用服务进程IP地址变来变去的问题头疼了。

Kubernetes设计了Pod对象为容器提供了强大的隔离功能,我们有必要把 Service 提供服务的这组进程放入容器中进行隔离。Kubernetes 会给每个Pod都贴上一个标签(Label),例如MySQL Service标签选择器的选择条件为 name=mysql,意为该 Service 要作用于所有包含 name=mysql 标签的 Pod,这样一来,就巧妙解决了 ServicePod的关联问题。

1.2.2 Pod

Pod的概念:

  • 首先,Pod 运行在一个被称为节点(Node)的环境中,这个节点既可以是物理机,也可以是私有云或者公有云中的一个虚拟机,在一个节点上能够运行多个 Pod
  • 其次,在每个 Pod 中都运行着一个特殊的被称为 Pause 的容器,其他容器则为业务容器,这些业务容器共享 Pause 容器的网络栈和 Volume 挂载卷,因此它们之间的通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个 Pod 中;
  • 最后,需要注意的是,并不是每个 Pod 和它里面运行的容器都能被映射到一个 Service上,只有提供服务(无论是对内还是对外)的那组 Pod 才会被映射为一个服务

在集群管理方面,Kubernetes 将集群中的机器划分为一个 Master 和一些Node:

  • Master上运行着集群管理相关的一些进程kube-apiserver、kube- controller-manager kube-scheduler,这些进程实现了整个集群的资源管理、Pod 调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且都是自动完成的。
  • Node 作为集群中的工作节点,其上运行着真正的应用程序。在 Node 上,Kubernetes 管理的最小运行单元是 Pod。在 Node 上运行着 Kuberneteskubeletkube-proxy 服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁,以及实现软件模式的负载均衡器。

2. 为什么要用 Kubernetes

使用Kubernetes的理由:

  • IT 行业从来都是由新技术驱动的。Kubernetes是软件领域近几年来最具创新的容器技术,涵盖了架构、研发、部署、运维等全系列软件开发流程,不仅对互联网公司的产品产生了极大影响,也对传统行业的 IT 技术产生了越来越强的冲击。
  • 市面上几乎所有提供云基础设施的公司都以原生形式将 Kubernetes 作为底层平台。例如腾讯自研的 TKEx 容器平台的底层也使用了 Kubernetes 原生技术,服务于腾讯的各种业务系统,包括腾讯会议、腾讯课堂、QQ 及腾讯看点等,目前这些业务已运行的 Kubernetes集群规模达到几百万 CPU 核数。

3. 从一个简单的例子开始

需求:JSP 页面通过 JDBC 直接访问 MySQL 数据库并展示数据。

3.1 启动 MySQL 服务

3.1.1 Deployment定义文件

首先,为 MySQL 服务创建一个 Deployment 定义文件 mysql-deploy.yaml,下面给出了该文件的完整内容和说明:

以上 YAML 定义文件中:

  • kind 属性用来表明此资源对象的类型,比如这里的属性值表示这是一个 Deployment;
  • spec 部分是 Deployment 的相关属性定义。比如:spec.selectorDeployment Pod 选择器,符合条件的 Pod 实例受到该 Deployment 的管理,确保在当前集群中始终有且仅有 replicas Pod 实例在运行(这里设置 replicas=1, 表示只能运行一个 MySQL Pod 实例)。
  • 当在集群中运行的Pod数量少于 replicas 时,Deployment 控制器会根据在 spec.template 部分定义的Pod模板生成一个新的Pod实例spec.template.metadata.labels 指定了该Pod的标签,labels 必须匹配之前的 spec.selector

创建好mysql-deploy.yaml 文件后,为了将它发布到 Kubernetes集群中,我们在 Master上运行如下命令:

接下来,运行 kubectl命令查看刚刚创建的 Deployment:

查看 Pod 的创建情况时,可以运行下面的命令:

可以看到一个名称为mysql-85f4b4cdf4-k97whPod 实例,这是 Kubernetes 根据 mysql 这个 Deployment 的定义自动创建的 Pod

由于 Pod 的调度和创建需要花费一定的时间,比如需要确定调度到哪个节点上,而且下载 Pod 所需的容器镜像也需要一段时间,所以一开始Pod的状态为 Pending,在 Pod 成功创建启动完成后,其状态最终会更新为 Running

我们可以在 Kubernetes 节点的服务器上通过 docker ps 指令查看正在运行的容器,发现提供 MySQL 服务的 Pod 容器已创建且正常运行,并且 MySQL Pod 对应的容器多创建了一个 Pause 容器,该容器就是Pod的根容器。

3.1.2 service定义文件

最后,创建一个与之关联的 Kubernetes Service--MySQL 的定义文件(文件名为 mysql-svc.yaml),完整的内容和说明如下:

其中:

  • metadata.nameService的服务名(ServiceName);
  • spec.ports属性定义了 Service 的虚端口;
  • spec. selector 确定了哪些 Pod 副本(实例)对应本服务。

类似地,我们通过 kubectl create 命令创建 service 对象:

运行 kubectl get 命令,查看刚刚创建的 Service 对象:

可以发现,MySQL 服务被分配了一个值为 10.245.161.22ClusterIP 地址(在不同环境中分配的 IP 地址可能不同)。随后,在 Kubernetes 集群中新创建的其他 Pod 就可以通过 ServiceClusterIP+端口号 3306 来连接和访问它了。

通常,ClusterIP 地址是在 Service创建后由 Kubernetes 系统自动分配的,其他 Pod 无法预先知道某个 ServiceClusterIP 地址,因此需要一个服务发现机制来找到这个服务。为此,Kubernetes最初巧妙地使用了 Linux 环境变量(Environment Variable)来解决这个问题。根据 Service的唯一名称,容器可以从环境变量中获取Service对应的ClusterIP地址和端口号,从而发起TCP/IP 连接请求

3.2 启动 Tomcat应用

3.2.1 Deployment定义文件

前面定义和启动了 MySQL 服务,接下来采用同样的步骤完成 Tomcat 应用的启动。首先,创建对应的 RC文件 myweb--deploy.yaml,内容如下:

注意:在 Tomcat 容器内,应用将使用环境变量 MYSQL_SERVICE_HOST 的值连接 MySQL 服务,但这里为什么没有注册该环境变量呢?这是因为 Kubernetes 会自动将已存在的 Service 对象以环境变量的形式展现在新生成的 Pod 中。其更安全、可靠的方法是使用服务的名称 mysql,这就要求集群内的 DNS 服务(kube- dns)正常运行。运行下面的命令,完成 Deployment 的创建和验证工作:

3.2.2 service定义文件

最后,创建对应的 Service,以下是完整的 YAML 定义文件(myweb- svc.yaml):

type: NodePort和“nodePort:30001”表明此 Service开启了 NodePort 格式的外网访问模式。比如,在 Kubernetes 集群外,客户端的浏览器可以通过 30001 端口访问 myweb(对应 8080 的虚端口,运行 kubectl create 命令进行创建:

运行 kubectl get命令,查看已创建的service:

3.3 通过浏览器访问网页

经过上面的流程,我们终于成功实现了 Kubernetes上第 1 个例子的部署、搭建工作。现在一起来见证成果吧!在你的笔记本上打开浏览器,输入“http:/虚拟机 IP:30001/demo/”。

比如虚拟机 IP 为 192.168.18.131(可以通过 pa 命令进行查询),在浏览器里输入地址 http: /192.168.18.131:30001/demo/后,可以看到如图1.2 所示的网页界面

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
100 2
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
94 5
|
1月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
124 3
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
55 3
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1月前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!
|
2月前
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
139 1
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用

热门文章

最新文章

推荐镜像

更多