kubernetes入门案例

news2025/1/4 19:43:50

kubernetes入门案例

本文我们通过一个 Java Web 应用例子来介绍 kubernetes 的使用,可以让新手快速上手和实践。

此 Java Web 应用的结构比较简单,是一个运行在 Tomcat 里的 Web App,JSP 页面通过 JDBC 直接访问 MySQL

数据库并展示数据。出于演示和简化的目的,只要程序正确连接到了数据库,就会自动完成对应的 Table 的创建与

初始化数据的准备工作。所以,当我们通过浏览器访问此应用时,就会显示一个表格的页面,数据则来自数据库。

在这里插入图片描述

此应用需要启动两个容器:Web App 容器和 MySQL 容器,并且 Web App 容器需要访问 MySQL 容器。在

Docker 时代,假设我们在一个宿主机上启动了这两个容器,就需要把 MySQL 容器的 IP 地址通过环境变量注入

Web App 容器里;同时,需要将 Web App 容器的 8080 端口映射到宿主机的 8080 端口,以便在外部访问。在本

文的这个例子里,我们介绍在 Kubernetes 时代是如何达到这个目标的。

1、环境准备

首先需要安装 kubernetes 集群,这里我们将不在介绍安装,安装请参考其它文章,本文的环境:

[root@master ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE     VERSION
master    Ready    control-plane,master   6m5s    v1.21.0
master2   Ready    control-plane,master   4m57s   v1.21.0
slave1    Ready    <none>                 5m30s   v1.21.0
slave2    Ready    <none>                 5m28s   v1.21.0
[root@master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-b86879b9b-mb6hk   1/1     Running   0          24s
kube-system   calico-node-6v5kp                         1/1     Running   0          24s
kube-system   calico-node-c8l7v                         1/1     Running   0          24s
kube-system   calico-node-grlqh                         1/1     Running   0          24s
kube-system   calico-node-mr8rk                         1/1     Running   0          24s
kube-system   coredns-545d6fc579-42cxc                  1/1     Running   0          5m33s
kube-system   coredns-545d6fc579-lzgbz                  1/1     Running   0          5m33s
kube-system   etcd-master                               1/1     Running   0          5m49s
kube-system   etcd-master2                              1/1     Running   0          4m45s
kube-system   kube-apiserver-master                     1/1     Running   0          5m49s
kube-system   kube-apiserver-master2                    1/1     Running   0          4m49s
kube-system   kube-controller-manager-master            1/1     Running   1          5m49s
kube-system   kube-controller-manager-master2           1/1     Running   0          4m49s
kube-system   kube-proxy-8gj54                          1/1     Running   0          5m22s
kube-system   kube-proxy-9vc8c                          1/1     Running   0          4m49s
kube-system   kube-proxy-lpfnx                          1/1     Running   0          5m33s
kube-system   kube-proxy-mvphs                          1/1     Running   0          5m20s
kube-system   kube-scheduler-master                     1/1     Running   1          5m49s
kube-system   kube-scheduler-master2                    1/1     Running   0          4m49s

本文使用的 Docker 镜像地址: https://hub.docker.com/u/kubeguide/

2、启动MySQL服务

为 MySQL 服务创建一个 RC 定义文件 mysql-rc.yaml

apiVersion: v1
# 副本控制器RC
kind: ReplicationController
metadata:
  # RC的名称,全局唯一
  name: mysql
spec:
  # Pod副本的期待数量
  replicas: 1
  selector:
    # 符合目标的Pod拥有此标签
    app: mysql
    # 根据此模板创建Pod的副本(实例)
  template:
    metadata:
      labels:
        # Pod副本拥有的标签,对应RC的Selector
        app: mysql
    spec:
      # Pod内容器的定义部分
      containers:
        # 容器的名称
        - name: mysql
          # 容器对应的Docker Image
          image: mysql:5.7
          ports:
            # 容器应用监听的端口号
            - containerPort: 3306
          # 注入容器内的环境变量
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"

以上 YAML 定义文件中的 kind 属性用来表明此资源对象的类型,比如这里的值为 ReplicationController,表示这

是一个 RC ;在 spec 一节中是 RC 的相关属性定义,比如 spec.selector 是 RC 的 Pod 标签选择器,即监控和管

理拥有这些标签的 Pod 实例,确保在当前集群中始终有且仅有 replicas 个 Pod 实例在运行,这里设置

replicas=1,表示只能运行一个 MySQL Pod 实例。当在集群中运行的 Pod 数量少于 replicas 时,RC 会根据在

spec.template 一节中定义的 Pod 模板来生成一个新的 Pod 实例,spec.template.metadata.labels 指定了该

Pod 的标签,需要特别注意的是:这里的 labels 必须匹配之前的 spec.selector,否则此 RC 每创建一个无法匹配

Label 的 Pod,就会不停地尝试创建新的 Pod,陷入恶性循环中。

在创建好 mysql-rc.yaml 文件后,将它发布到 kubernetes 集群中,我们在 master 上执行如下命令:

[root@master cha1]# kubectl create -f mysql-rc.yaml
replicationcontroller/mysql created

接下来,用 kubectl 命令查看刚刚创建的 RC:

[root@master cha1]# kubectl get rc -o wide
NAME    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                    SELECTOR
mysql   1         1         1       7m37s   mysql        mysql:5.7                 app=mysql

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

# NODE=slave2表示该pod在slave2节点上创建
[root@master cha1]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP               NODE     NOMINATED NODE   READINESS GATES
mysql-8mwkz   1/1     Running   0          8m8s   10.244.140.65    slave2   <none>           <none>

我们看到一个名为 mysql-8mwkz 的 Pod 实例,这是 kubernetes 根据 mysql 这个 RC 的定义自动创建的 Pod。

由于 Pod 的调度和创建需要花费一定的时间,比如需要一定的时间来确定调度到哪个节点上,以及下载 Pod 里的

容器镜像需要一段时间,所以我们一开始看到Pod的状态显示为 Pending。在 Pod 成功创建完成以后,状态最终

会被更新为 Running。

我们通过 docker ps 指令查看正在运行的容器,发现提供 MySQL 服务的 Pod 容器已经创建并正常运行了,此外

会发现 MySQL Pod 对应的容器还多创建了一个来自谷歌的 pause 容器,这就是 Pod 的根容器。

[root@slave2 ~]# docker ps | grep mysql
9b799e33f346   c20987f18b13                                          "docker-entrypoint.s…"   7 minutes ago    Up 7 minutes              k8s_mysql_mysql-8mwkz_default_b494d65f-2ee8-436b-8a09-ef0b220ba916_0
d18de886ae4e   registry.aliyuncs.com/google_containers/pause:3.4.1   "/pause"                 7 minutes ago    Up 7 minutes              k8s_POD_mysql-8mwkz_default_b494d65f-2ee8-436b-8a09-ef0b220ba916_85

创建一个与之关联的 kubernetes service,service 的定义文件 mysql-svc.yaml如下:

apiVersion: v1
# 表明是Kubernetes Service
kind: Service
metadata:
  # Service的全局唯一名称
  name: mysql
spec:
  ports:
    # Service提供服务的端口号
    - port: 3306
  # Service对应的Pod拥有这里定义的标签
  selector:
    app: mysql

其中,metadata.name 是 Service 的服务名;port 属性则定义了 Service 的端口;spec.selector 确定了哪些 Pod

副本(实例)对应本服务。通过下面的命令创建 service:

[root@master cha1]# kubectl create -f mysql-svc.yaml
service/mysql created

运行 kubectl 命令查看刚刚创建的 Service:

[root@master cha1]# kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE     SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          15m     <none>
mysql        ClusterIP   10.110.148.221   <none>        3306/TCP         7m12s   app=mysql

可以发现,MySQL 服务被分配了一个值为 10.110.148.221 的 Cluster IP 地址。随后,Kubernetes 集群中其他

新创建的 Pod 就可以通过 Service 的 Cluster IP+端口号3306 来连接和访问它了。

通常,Cluster IP 是在 Service 创建后由 Kubernetes 系统自动分配的,其他 Pod 无法预先知道某个 Service 的

Cluster IP地址,因此需要一个服务发现机制来找到这个服务。为此,最初时,Kubernetes 巧妙地使用了 Linux

环境变量来解决这个问题。现在只需知道,根据 Service 的唯一名称,容器可以从环境变量中获取 Service 对应的

Cluster IP 地址和端口,从而发起 TCP/IP 连接请求。

3、启动Tomcat应用

上面定义和启动了 MySQL 服务,接下来采用同样的步骤完成 Tomcat 应用的启动过程。首先,创建对应的 RC 文

myweb-rc.yaml,内容如下:

apiVersion: v1
# 副本控制器RC
kind: ReplicationController
metadata:
  # RC的名称,全局唯一
  name: myweb
spec:
  # Pod副本的期待数量
  replicas: 2
  selector:
    # 符合目标的Pod拥有此标签
    app: myweb
    # 根据此模板创建Pod的副本(实例)
  template:
    metadata:
      labels:
        # Pod副本拥有的标签,对应RC的Selector
        app: myweb
    spec:
      # Pod内容器的定义部分
      containers:
        # 容器的名称
        - name: myweb
          # 容器对应的 Docker Image
          image: kubeguide/tomcat-app:v1
          ports:
            # 容器应用监听的端口号
            - containerPort: 8080
          env:
            - name: MYSQL_SERVICE_HOST
              value: 'mysql'
            - name: MYSQL_SERVICE_PORT
              value: '3306'

注意:在 Tomcat 容器内,应用将使用环境变量 MYSQL_SERVICE_HOST 的值连接MySQL服务。更安全可靠的用

法是使用服务的名称 mysql。运行下面的命令,完成RC的创建和验证工作:

[root@master cha1]# kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
[root@master cha1]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
mysql-8mwkz   1/1     Running   0          10m     10.244.140.65    slave2   <none>           <none>
myweb-clht2   1/1     Running   0          8m18s   10.244.140.193   slave1   <none>           <none>
myweb-sjdhr   1/1     Running   0          8m18s   10.244.140.194   slave1   <none>           <none>

最后,创建对应的 Service,定义文件 myweb-svc.yaml

apiVersion: v1
# 表明是Kubernetes Service
kind: Service
metadata:
  # Service的全局唯一名称
  name: myweb
spec:
  type: NodePort
  ports:
    # Service提供服务的端口号
    - port: 8080
      nodePort: 30001
  # Service对应的Pod拥有这里定义的标签
  selector:
    app: myweb

type=NodePort 和 nodePort=30001 的两个属性表明此 Service 开启了 NodePort 方式的外网访问模式。在

Kubernetes 集群之外,比如在本机的浏览器里,可以通过 30001 这个端口访问myweb(对应到8080的虚端口

上)。使用下面的命令进行创建:

[root@master cha1]# kubectl create -f myweb-svc.yaml
service/myweb created

查看 service:

[root@master cha1]# kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE     SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          17m     <none>
mysql        ClusterIP   10.110.148.221   <none>        3306/TCP         8m55s   app=mysql
myweb        NodePort    10.101.194.99    <none>        8080:30001/TCP   8m33s   app=myweb

至此,我们的第1个 Kubernetes 例子便搭建完成了。

4、通过浏览器访问网页

经过上面的几个步骤,我们终于成功实现了 Kubernetes 上第1个例子的部署搭建工作。现在一起来见证成果吧!

打开浏览器输入http://192.168.43.201:30001/demo/,可以看到如下图所示的网页界面:

在这里插入图片描述

接下来,可以尝试单击 Add… 按钮添加一条记录并提交,如图所示,在提交以后,数据就被写入 MySQL 数据库

中了。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

至此,我们终于完成了 Kubernetes 上的 Tomcat 例子,这个例子并不是很复杂。我们也看到,相对于传统的分布

式应用的部署方式,在 Kubernetes 之上我们仅仅通过一些很容易理解的配置文件和相关的简单命令就完成了对整

个集群的部署,这让我们惊诧于 Kubernetes 的创新和强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

青梅产业成立“国家队”,溜溜梅迎来树立品牌良机?

扩大内需在今年政府工作报告中被频频提及。国务院发展研究中心原副主任王一鸣认为&#xff0c;激活潜在消费需求&#xff0c;将释放中国超大规模市场的经济增长潜力。 如今&#xff0c;休闲零食市场也正在经历这样一场激活潜在需求的变革。无论是洽洽食品、三只松鼠、良品铺子…

Kubernetes(k8s)容器编排概述

目录 1 k8s 是什么2 K8s的由来2.1 K8s发展历程2.2 发展时间线 3 为什么使用k8s3.1 什么是容器3.2 什么是 Kubernetes3.3 K8s 的著名优势特色3.3.1 一个平台搞定所有3.3.2 云环境无缝迁移3.3.3 高效的利用资源3.3.4 开箱即用的自动缩放能力3.3.5 使 CI/CD 更加简单3.3.6 可靠性 …

香橙派 1. 上手,配置wifi以及vnc

0. 环境 香橙派4以及电源 读卡器 32GB TF卡 1. 重新烧写固件 Orangepi4_2.1.2_ubuntu_bionic_desktop_linux4.4.179.img 用sd card formatter 格式化TF卡 安装Win32DiskImager&#xff0c;打开&#xff0c;选择IMG&#xff0c;确认U盘&#xff0c;点击写入。 2. 插上TTL 注意…

Mybatis相关知识(2)

Mybatis相关知识 今天接着上期mybatis相关知识进行讲解&#xff0c;今天主要是讲解mybatis和数据库相关的映射&#xff0c;标签和SQL编写等。 会结合实际业务和代码进行讲解。 1 占位符和传参的相关问题 先来看两条xml的SQL。第一条SQL从id名称可知&#xff0c;是根据id删除数…

cookie、session、token学习笔记

一.cookie 1.什么是cookie&#xff1f; Cookie用于存储web页面的用户信息。 Cookie是一些数据&#xff0c;存储于你电脑的文本文件中。 当web服务器向浏览器发送web页面时&#xff0c;在连接关闭后&#xff0c;服务端不会记录用户的信息。 而Cookie的作用就是用于解决“如…

【unity每日一记】 三大金星之(音频Audio + 碰撞和触发+光源组件)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

Kubernetes(k8s)部署模式发展

目录 1 简介2 物理单机(~2000)2.1 主要代表 3 虚拟化&#xff1a;初期&#xff08;2001~2009&#xff09;3.1 VMware3.2 laaS 4 虚拟化&#xff1a;成熟期&#xff08;2010~至今&#xff09;4.1 OpenStack4.2 虚拟化四巨头 5 容器化:&#xff08;2013-至今&#xff09;5.1 Dock…

【从零开始学习JAVA | 第十三篇】继承

目录 前言&#xff1a; 引入&#xff1a; 继承&#xff1a; 小拓展&#xff1a; 优点&#xff1a; 成员方法的继承问题&#xff1a; 总结&#xff1a; 前言&#xff1a; 继承是面向对象三大特性之一&#xff0c;它是在封装之后我们讲解的一个重要的性质&#xff0c;继承…

【Kubernetes资源篇】DaemonSet控制器入门实战详解

文章目录 一、DaemonSet控制器理论知识1、DaemonSet控制器是什么&#xff1f;2、DaemonSet控制器工作原理3、DaemonSet典型应用场景4、DaemonSet与Deployment的区别 二、案例&#xff1a;DaemonSet控制器实战演示1、使用DaemonSet部署日志收集组件2、DaemonSet管理Pod滚动更新 …

数据库期末复习大总结 数据库课程学习资料(包含数据库全部章节的经典例题)【我的数据库期末复习】

为刚开始上大学数据库课程 提供学习方向【我的数据库期末复习】 第一章 绪论1.1 数据库系统概述 第二章 关系数据库2.1 关系的基本概念2.2 关系的完整性 关系数据库标准语言SQL3.1.1 SQL创建模式和表3.1.2 SQL修改和删除表3.2.1 SQ单表查询3.2.2 分组聚合和分组过滤3.2.3 多表联…

Matplotlib---散点图

1. 散点图 scatter函数用于绘制散点图。下面是scatter函数的语法格式&#xff1a; scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, edgecolorsNone, **kwargs)参数解释&#xff1a; x&#xff1a;指定散点的…

【二分查找】详细图解

目录 一.什么是二分查找法&#xff1f; 二.算法要求 三.算法思想 图解&#xff08;要找的数k的值为3&#xff09; 参考代码 一.什么是二分查找法&#xff1f; 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。但是&am…

GEE:DYNAMICWORLD/V1数据集介绍

作者:CSDN @ _养乐多_ 本文将介绍GOOGLE/DYNAMICWORLD/V1数据集。 在Dynamic World数据集中,每个波段代表了某个特定类别的土地覆盖概率。这些概率表示了一个像素完全被某种土地覆盖类别所覆盖的可能性,其取值范围从0到1。每个波段的名称和描述指示了对应类别的土地覆盖类…

成为CSDN创作者的第2048天,我收获了什么?

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

linux下容器 安装 操作 介绍

介绍&#xff1a; 容器是一种轻量级的虚拟化技术&#xff0c;可以将应用程序及其依赖项打包到一个独立的运行环境中&#xff0c;从而实现快速部署、可移植性和可扩展性。容器可以在不同的操作系统和云平台上运行&#xff0c;使得应用程序的部署和管理变得更加简单和高效。 安…

八大指针笔试题带你overcome指针

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造…

pgsql序列的使用

大家都知道pgsql和mysql不同&#xff0c;mysql字段有有自增属性&#xff0c;pgsql并没有&#xff0c;但是pgsql和oracle一样有序列&#xff0c;很多人刚接触pgsql的时候&#xff0c;并不知道序列是什么&#xff0c;怎么用&#xff0c;下面这篇文章就介绍序列&#xff0c;并且怎…

Flutter系列(十一)实现商城首页和商品详情页

基础工程&#xff1a; Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 一、前言 本文用flutter实现商城首页和商品详情页&#xff0c;效果如下图&#xff1a; 二、使用的组件 MasonryGridView.count 瀑布流插件&#xff…

几何引擎 约束求解器 3D仿真物理引擎 图形引擎

几何引擎 & 约束求解器 & 3D仿真物理引擎 & 图形引擎 1 介绍技术图谱建模主流CAD/CAM/CAE/AEC所用引擎 2 几何建模引擎2.1 介绍2.2 各家实现 3 图形引擎4 几何约束求解器4.1 介绍4.2 各家实现D-Cubed DCM&#xff08;西门子&#xff09;CGM(达索&#xff09;LGS&am…

OpenGL模型控制(旋转、平移)

1.效果图 2.平移 首先做一个鼠标双击事件&#xff0c;表示平移模型对象&#xff0c;当然&#xff0c;我们需要遍历当前哪个模型对象被选中&#xff0c;才能进行该对象的平移操作。 void AXBOpemglWidget::mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event);if(m_m…