- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
对比软件安装和运行; 。
作为研发人员,通常自己电脑的系统环境都是非常复杂,在个人的习惯上,是按照下图的模块管理电脑的系统环境; 。
对于「基础设施」、「主机操作系统」、「系统软件」来说,通常只做配置修改; 。
对于自行安装的软件环境来说,个人通常这样分类:「应用软件」、「研发软件」、「持续集成」、「虚拟机环境」; 。
不论是这些软件环境还是虚拟机系统的搭建,基本都是通过下载软件安装包,然后在本地部署和定期更新以及运行,基于这个场景再去理解容器和Pod组件,会轻松许多; 。
参考上面系统环境的管理,软件包和安装部署的原理; 。
Docker容器镜像是一个轻量级的、独立的、可执行的软件包,它包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置,带有创建Docker容器的说明; 。
可以通过Dockerfile脚本自定义镜像,也可以使用云端仓库中其他人公开发布的,生产环境通常采用私有仓库管理镜像; 。
容器镜像所承载的是封装了应用程序及其所有软件依赖的二进制数据,容器镜像是可执行的软件包,可以单独运行;通常会创建应用的容器镜像并将其推送到某仓库,然后在Pod中引用它; 。
容器将应用程序从底层的主机设施中解耦,这使得在不同的云或OS环境中部署更加容易; 。
容器的本质就是一个视图隔离、可限制资源、独立文件系统的进程集合; 。
以常见的Linux研发环境来分析,可以限制容器的资源分配,比如内存大小、CPU使用,隔离进程之间的通信,设置独立的文件系统等; 。
Kubernetes集群中的每个节点都会运行容器,这些容器构成分配给该节点的Pod,单个Pod中的容器会在共同调度下,于同一位置运行在相同的节点上; 。
从整体上可以把K8S理解为「操作系统」,镜像理解为「软件安装包」,容器理解为「应用进程」; 。
制作镜像,首先将代码工程 auto-client 和 auto-serve 打包,然后构建镜像文件,放在本地环境中; 。
构建命令 。
docker build -t auto-client:latest .
Dockerfile脚本 。
# 基础镜像
FROM openjdk:8
# 维护者
MAINTAINER cicadasmile
# 持久化目录
VOLUME /data/docker/logs
# 添加应用服务JAR包
ADD auto-client.jar application.jar
# 配置参数
ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]
构建命令 。
docker build -t auto-serve:latest .
Dockerfile脚本 。
# 基础镜像
FROM openjdk:8
# 维护者
MAINTAINER cicadasmile
# 持久化目录
VOLUME /data/docker/logs
# 添加应用服务JAR包
ADD auto-serve.jar application.jar
# 配置参数
ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]
Pod是可以在K8S中创建和管理的、最小的可部署的计算单元; 。
Pod是一组(一个或多个)容器,这些容器共享存储、网络、以及怎样运行这些容器的声明,Pod中的内容总是并置的并且一同调度,在共享的上下文中运行; 。
【Pod创建】 。
通常不会直接创建Pod,而是使用诸如Deployment或Job这类工作负载资源来创建Pod;是相对临时性的、用后即抛的一次性实体; 。
【单容器Pod】 。
每个Pod都意在运行给定应用程序的单个实例,可以使用多个Pod对应用程序横向扩展,即一个实例一个Pod对应,Pod看作单个容器的包装器由K8S直接管理,是常见的部署方式; 。
【多容器Pod】 。
分布式系统中可能存在由多个紧密耦合且需要共享资源的共处容器组成的应用程序,比较典型的是「生产消费」场景,Pod将这些容器和存储资源打包为一个可管理的实体; 。
Pod中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度,容器之间可以共享网络和存储资源和依赖、彼此通信、协调何时以及何种方式终止自身; 。
容器之间原本是被隔离开的,而Pod在设计上可以突破这种隔离,进而实现资源共享; 。
在Pod层面设置共享的Volume,该Pod中所有容器都可以访问该共享Volume,这也是Pod组件的存储方式,Volume还允许Pod中持久数据保留下来,即使其中的容器需要重新启动; 。
同一个Pod内,所有容器共享一个IP地址和端口空间,并且可以通过 localhost 发现对方; 。
在此前的案例中,都是单容器Pod,这里演示多容器Pod,将【auto-client】和【auto-serve】放在同一个「auto-pod」中运行; 。
并且这里为两个容器分配CPU和内存资源, requests 是要为容器指定资源需求, limits 是要为容器指定资源限制; 。
apiVersion: v1
kind: Pod
metadata:
name: auto-pod
spec:
containers:
- name: auto-client
image: auto-client
imagePullPolicy: Never
ports:
- containerPort: 8079
resources:
requests:
cpu: "250m"
memory: "64Mi"
limits:
cpu: "500m"
memory: "128Mi"
- name: auto-serve
image: auto-serve
imagePullPolicy: Never
ports:
- containerPort: 8082
resources:
requests:
cpu: "250m"
memory: "64Mi"
limits:
cpu: "500m"
memory: "128Mi"
kubectl create -f pod.yaml
kubectl get pod/auto-pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
auto-pod 2/2 Running 0 9m2s 10.1.0.123 docker-desktop <none> <none>
kubectl describe pod/auto-pod
# 此处只展示部分信息
Name: auto-pod
Namespace: default
Node: docker-desktop/192.168.65.11
Status: Running
IP: 10.1.0.123
Containers:
auto-client:
Container ID: docker://Container-ID
Image: auto-client
Image ID: docker://sha256:Image-ID
Port: 8079/TCP
Limits:
cpu: 500m
memory: 128Mi
Requests:
cpu: 250m
memory: 64Mi
auto-serve:
Container ID: docker://Container-ID
Image: auto-serve
Image ID: docker://sha256:Image-ID
Port: 8082/TCP
Limits:
cpu: 500m
memory: 128Mi
Requests:
cpu: 250m
memory: 64Mi
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 38s default-scheduler Successfully assigned default/auto-pod to docker-desktop
Normal Pulled 37s kubelet Container image "auto-client" already present on machine
Normal Created 37s kubelet Created container auto-client
Normal Started 37s kubelet Started container auto-client
Normal Pulled 37s kubelet Container image "auto-serve" already present on machine
Normal Created 37s kubelet Created container auto-serve
Normal Started 37s kubelet Started container auto-serve
kubectl delete -f pod.yaml
在「auto-client」服务中,提供一个简单的定时任务,每10秒访问一次「auto-serve」的接口,打印请求的响应结果; 。
@Component
public class HttpJob {
private static final Logger LOG = LoggerFactory.getLogger(HttpJob.class.getName()) ;
private static final String SERVER_URL = "http://localhost:8082/serve";
/**
* 每10秒执行一次
*/
@Scheduled(fixedDelay = 10000)
public void systemDate (){
try{
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(3000);
factory.setConnectTimeout(6000);
RestTemplate restTemplate = new RestTemplate(factory);
Map<String,String> paramMap = new HashMap<>() ;
String result = restTemplate.getForObject(SERVER_URL,String.class,paramMap);
LOG.info("server-resp::::"+result);
} catch (Exception e){
e.printStackTrace();
}
}
}
在「auto-serve」服务中,提供一个简单的Get请求接口; 。
@RestController
public class ServeWeb {
private static final Logger logger = LoggerFactory.getLogger(ServeWeb.class) ;
@Value("${server.port:}")
private Integer servePort ;
@GetMapping("/serve")
public String serve (){
logger.info("serve:{}",servePort);
return "serve:"+servePort ;
}
}
查看两个容器的运行日志,发现「auto-client」和「auto-serve」可以正常通信,以此来验证同一个Pod内网络共享; 。
可以在Pod中通过 restartPolicy 属性设置重启策略,常用的取值是 Always 以降低应用的中断时间,适用于Pod中的所有容器; 。
Pod遵循预定义的生命周期,起始于 Pending 阶段,如果至少其中有一个主要容器正常启动,则进入 Running 阶段,之后取决于Pod中是否有容器以失败状态结束而进入 Succeeded 或者 Failed 阶段.
文档仓库:
https://gitee.com/cicadasmile/butte-java-note
脚本仓库:
https://gitee.com/cicadasmile/butte-auto-parent
最后此篇关于K8S|容器和Pod组件的文章就讲到这里了,如果你想了解更多关于K8S|容器和Pod组件的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!