糖呀糖啦~Pleiades
首页
归档
关于
友链
切换模式
返回顶部
首页
技术实践
书斋絮语
晴天札记
糖呀糖啦~Pleiades
首页
技术实践
书斋絮语
晴天札记
首页
归档
关于
友链
【Kubernetes】第一个实例 - Java Web 应用
技术实践
·
02-28
糖呀糖 xyz
# 实践内容 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 集群,部署机和工作节点均是由 pve 创建的虚拟机, 部署机 IP:192168.25.64;kubernetes 集群工作节点:192.168.25.72 # 启动 MySQL 服务 ## 在 Kubernetes 节点上操作 ### 更新系统 在 192.168.25.72 执行以下命令更新系统: ```bash sudo apt update sudo apt update -y ``` ### 安装必要的工具 安装 `apt-transport-https` 和 `ca-certificates` ```bash sudo apt install -y apt-transport-https ca-certificates curl ``` ### 添加 Kubernetes 的 GPG 密钥和源 执行以下命令: ```bash curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list ``` ### 安装 Kubeadm 、Kubelet、Kubectl 更新包列表并安装 Kubernetes 组件: ```bash sudo apt update sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl ``` 在创建 Kubernetes 集群 ### 配置 kubectl 在 Kubernetes 节点上,执行以下命令: ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` ## 创建 MySQL 的 RC 定义文件 在 Kubernetes 几点上创建一个名为“mysql-rc.yaml” 的文件, ### 创建 mysql-rc.yaml 文件 ```bash touch mysql-rc.yaml ``` ### yaml 配置文件写入以下内容 ```yaml apiVersion: v1 kind: ReplicationController # 副本控制器RC metadata: name: mysql # RC的名称,全局唯一 spec: replicas: 1 # Pod副本的期待数量 selector: app: mysql # 符合目标的Pod拥有此标签 template: # 根据此模板创建Pod的副本(实例) metadata: labels: app: mysql # Pod副本拥有的标签,对应RC的Selector spec: containers: # Pod内容器的定义部分 - name: mysql # 容器的名称 image: mysql:5.7 # 容器对应的Docker Image ports: - containerPort: 3306 # 容器应用监听的端口号 env: # 注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456" ``` ### yaml 文件解释 - kind 属性: `kind:Replication Controller` 表明此资源对象的类型, - 这里是 Replication Controller,表示这是一个 RC - 用于确保指定数量的 Pod 副本在运行 - metedata:包含关于该资源的元数据 - `name: mysql` 指定该 Replication Controller 的名称为 `mysql` 在即群众必须是唯一的 - spec:RC 的相关属性定义,期望状态 - `replicas: 1` 确保在当前集群中始终有且仅有 replicas 个 Pod 实例,此处是 1 就是期望运行一个 Pod 副本 - `spec.selector`:用于选择与此 RC 关联的 Pod,也就是 RC 的 Pod 标签选择器,即监控和管理拥有这些标签的 Pod 实例 - `app: mysql` 标签 - `spec.template` :定义 Pod 的模板,Replication Controller 将根据此创建 Pod 副本 - `metadata`:定义 Pod 的元数据 - `labels`:为 Pod 指定标签 - `app: mysql` Pod 将被标记为 `app: mysql` 以便与 RC 的选择器匹配。 - `注意` 这里的标签 必须匹配之前的 `spec.selector`,否则此 RC 每创建一个无法匹配 Label 的 Pod,就会不停地尝试创建新的 Pod - `spec` :定义 Pod 规范 - `containers`:定义 Pod 中的容器 - `- name` 容器的名称 - `image: mysql` 指定容器使用的 Docker 镜像为 `mysql` ,可以指定更具体的镜像比如, `mysql:5.7`确保使用特定的版本 - `ports` 定义容器的暴露端口 - `- containerPort: 3306` 容器将监听 3306 端口,这是 MySQL 的默认端口 - `env` 定义容器内的环境变量 - `- name:MYSQL_ROOT_PASSWORD` 设置 MySQL 的根用户密码 - `value: "123456` 将跟用户密码设置为 123456 - 关于 `-` 的说明: - `-` 符号用于表示列表中的新项。在 `containers` 列表中,`- name: mysql` 表示这是一个新的容器定义。 - `image: mysql` 是该容器的另一个属性,属于同一个容器定义,因此不需要再使用 `-` 需要注意的是,如果是按照以上内容进行,会出现无法从 DockerHub 拉取镜像的问题,当我执行以下命令拉取官方 MySQL 镜像: ```yaml docker pull mysql:5.7 ``` 发现是可以成功手动拉取镜像的。 后面将 `mysql-rc.yaml` 文件中的 image 替换为: `image: (镜像链接)/library/mysql:5.7 ` ## 将 mysql-rc.yaml 发布到 Kubernetes 集群中 在 Master 节点上执行: ```bash kubectl create -f mysql-rc.yaml # 第一次创建 kubectl apply -f mysql-rc.yaml # 修改过 yaml 文件再执行 ``` 会有  类似信息出现,是 created ## 查看刚创建的 RC ```bash kubectl get rc ```  ## 查看 Pod 情况 ```bash kubectl get pods ```  名为 `mysql-8n5ss` 的 Pod 实例,是 Kubernetes 根据 mysql 这个 RC 的定义自动创建的 Pod 由于 Pod 的调度和创建需要花费一定的时间,比如需要一定的时间来确定调度到哪个节点上,以及下载 Pod 里的容器镜像需要一段时间,所以我们一开始看到 Pod 的状态显示为 Pending。 在 Pod 成功创建完成以后,状态最终会被更新为 Running。 ## 创建与之关联的 Kubernetes Service -- MySQL 创建 MySQL 定义文件 mysql-svc.yaml ```bash touch mysql-svc.yaml ``` 文件内容: ```yaml apiVersion: v1 kind: Service # 表明是Kubernetes Service metadata: name: mysql # Service的全局唯一名称 spec: ports: - port: 3306 # Service提供服务的端口号 selector: # Service对应的Pod拥有这里定义的标签 app: mysql ``` ### yaml 文件解释 - `metadata.name` 是 Service 的服务名(ServiceName) - port 属性定义了 Service 的虚端口 - `spec.selector` 确定了哪些 Pod 副本(实例)对应本服务 ## 创建 Service ```bash kubectl create -f mysql-svc.yaml ```  ## 查看刚创建的 Service ```bash kubectl get svc ```  MySQL 服务被分配了一个值为 10.233.16.61 的 Cluster IP 随后,Kubernetes 集群中其他创建的 Pod 就可以通过 Service 的 Cluster IP + 端口号 3306 来连接和访问它了 通常 Cluster IP 是在 Service 创建后由 Kubernetes 系统自动分配的,其他 Pod 无法预先知道某个 Service 的 Cluster IP,因此需要一个 **服务发现** 机制来找到这个服务。 根据 Service 的唯一名称,容器可以从环境变量中获取 Service 对应 的 Cluster IP 地址和端口,从而发起 TCP/IP 连接请求。 # 启动 Tomcat 应用 ## 创建 Tomcat 对应的 RC 文件 ### 创建 myweb-rc.yaml 文件 ```bash touch myweb-rc.yaml ``` ### yaml 配置文件写入以下内容 ```yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: (镜像链接)/kubeguide/tomcat-app:v1 ports: - containerPort: 8080 ``` ## 创建 RC ```bash kubectl create -f myweb-rc.yaml ``` 执行结果: ## 查看刚创建的 RC ```bash kubectl get pods ```  ## 创建对应的 Service ### 创建 mysql-svc.yaml 配置文件 创建 MySQL 定义文件 mysql-svc.yaml ```bash touch mysql-svc.yaml ``` 文件内容: ```yaml apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb ``` ### yaml 配置文件解析 - `type=NodePort` 和 `nodePort=30001` 表明此 Service 开启了 NodePort 方式的外网访问模式。 - 在 Kubernetes 集群之外,比如本机的浏览器中,可以通过 30001 这个端口访问 myweb(对应到 8080 的虚拟口上) ### 创建 Service 执行命令: ```bash kubectl create -f myweb-svc.yaml ```  ## 查看创建的 Service ```bash kubectl get services ``` 执行结果:  至此,第一个 Kubernetes 例子搭建完成。 # 结果验证 在笔记本上打开浏览器,输入: `http://虚拟机 IP:30001/demo/` Kubernetes 集群所在虚拟机 IP 为 192.168.25.72,所以我需要打开的是 `http://192.168.25.72/30001/demo/`  单击按钮“Add...” 可以添加一条记录并提交 操作结果:  成功!!!!!!!!!!! # References - claude 3.5 sonnet - Kubernetes 权威指南:从 Docker 到 Kubernetes 实践全接触(第 4 版)
Kubernetes
取消回复
提交评论
Deep Router
31 天前
回复
大佬好强!!!
tls
02-28
回复
写的很详细,很清晰!
糖呀糖 xyz
我们谈论生活,讨论技术,借由文字,抵达心灵。
热门文章
【Kubernetes】第一个实例 - Java Web 应用
Obsidian 迁移全记录(又名:纯小白的闭坑指南)
使用宝塔面板对网站、数据库等进行定时备份到腾讯云 COS 对象存储
2025 年
在细雨中呼喊,在困顿中挣扎
Ubuntu 22.04 server 安装教程
Debian 12.2 安装方法
最新评论
tl.s: 很实用 🦆🦆
tl.s: 绘图很清晰,图示质量很高
tl.s: 写的很详细,赞👍
Deep Router: 大佬好强!!!
tls: 写的很详细,很清晰!
tl.s: 讲的很清楚,语言组织很好 🦆🦆🦆🦆🦆🦆🦆🦆🦆🦆
tl.s: 好棒🦆🦆🦆🦆🦆🦆🦆🦆🦆🦆🦆
热门标签
Kubernetes
Ubuntu
Linux
Python3
生活
2025
Debian
技术实践
在细雨中呼喊
读书笔记
笔记软件
Obsidian
2024
openEuler
Kuboard
粤ICP备2024349207号
大佬好强!!!
写的很详细,很清晰!