-
【功能模块】容器模块【操作步骤&问题现象】1、主机把按要求添加映射,保存重启,但LTE0映射不进去容器2、本来主机有LTE0映射之后主机的LTE0也没了,关机等一段时间重新启动,主机的LTE0就有了【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
对象定义你可以使用字符来定义和创建 JavaScript 对象:实例var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};定义 JavaScript 对象可以跨越多行,空格跟换行不是必须的:实例var person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};对象属性可以说 "JavaScript 对象是变量的容器"。但是,我们通常认为 "JavaScript 对象是键值对的容器"。键值对通常写法为 name : value (键与值以冒号分割)。键值对在 JavaScript 对象通常称为 对象属性。Note JavaScript 对象是属性变量的容器。对象键值对的写法类似于:PHP 中的关联数组Python 中的字典C 语言中的哈希表Java 中的哈希映射Ruby 和 Perl 中的哈希表访问对象属性你可以通过两种方式访问对象属性:实例 1person.lastName;实例 2person["lastName"];对象方法对象的方法定义了一个函数,并作为对象的属性存储。对象方法通过添加 () 调用 (作为一个函数)。该实例访问了 person 对象的 fullName() 方法:实例name = person.fullName();如果你要访问 person 对象的 fullName 属性,它将作为一个定义函数的字符串返回:实例name = person.fullName; Note JavaScript 对象是属性和方法的容器。在随后的教程中你将学习到更多关于函数,属性和方法的知识。访问对象方法你可以使用以下语法创建对象方法:methodName : function() { // 代码 }你可以使用以下语法访问对象方法:实例objectName.methodName()通常 fullName() 是作为 person 对象的一个方法, fullName 是作为一个属性。如果使用 fullName 属性,不添加 (), 它会返回函数的定义:实例objectName.methodName
-
在NFS的基础之上,为了简便运维与管理,增加了持久卷的概念。PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节。注:图片截取自李振良老师的视频课程上图是PV、PVC的使用逻辑,通俗的理解:一个企业雇一帮人工作(nfs),选个小组长(pv),再来个团队长(pvc),这样消费者就不会直接面对生产者,企业好管理,用户的服务也有保证。其实就是软件世界的官僚机构~PV使用方式:静态供给,需要K8s运维工程师提前创建一堆PV,供开发者使用。示例:[root@k8s-node2 /]# cat pv.yamlapiVersion: v1kind: PersistentVolumemetadata: name: my-pvspec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /ifs/kubernetes server: 192.168.0.21[root@k8s-node2 /]# cat deployment-pvc.yamlkind: DeploymentapiVersion: apps/v1metadata: name: deployment-pvcspec: selector: matchLabels: app: nginx-pvc replicas: 2 template: metadata: labels: app: nginx-pvc spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot persistentVolumeClaim: claimName: my-pvc---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: my-pvcspec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi[root@k8s-node2 /]# 容器应用和卷需求模板写在了一个depolyment-pvc.yaml中,数据卷的定义写在了pv.yaml中。root@k8s-node2 /]# kubectl apply -f deployment-pvc.yamldeployment.apps/deployment-pvc createdpersistentvolumeclaim/my-pvc created[root@k8s-node2 /]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESdeployment-pvc-84df7c6f46-b98wx 1/1 Running 0 55m 10.244.169.144 k8s-node2 <none> <none>deployment-pvc-84df7c6f46-d787b 1/1 Running 0 55m 10.244.169.143 k8s-node2 <none> <none>nginx-6799fc88d8-z76rk 1/1 Running 2 45h 10.244.169.142 k8s-node2 <none> <none>[root@k8s-node2 /]# curl 10.244.169.144hello //上一个实验中的index.html文件[root@k8s-node2 /]# cd ifs[root@k8s-node2 ifs]# cd kubernetes[root@k8s-node2 kubernetes]# echo hello world>index.html[root@k8s-node2 kubernetes]# curl 10.244.169.144 hello world[root@k8s-node2 kubernetes]#
-
最近复习了一遍Spring IOC容器的初始化过程,结合书籍《Spring源码深度解析》总结了一下,IOC容器的初始化过程,大概分为以下三点:1、定位资源: 定位相关的配置文件,扫描相关注解2、加载资源: 将配置信息加载到内存中3、注册: 根据载入的配置信息,初始化对象,并将其装载至容器中POM文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>springTest</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> </dependencies> </project>测试代码public class ServiceB { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); Object serviceA = context.getBean("serviceA"); System.out.println(serviceA); }xml配置<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <context:component-scan base-package="com.donkeys.spring"/> <bean id="serviceA" class="com.donkeys.spring.service.ServiceA"></bean> </beans>ClassPathXmlApplicationContext构造方法 public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException { super(parent); //根据传入的配置文件名称,调用父类的setConfigLocations方法,解析配置文件路径, setConfigLocations(configLocations); //refresh = true //refresh() 方法会重启整个容器 if (refresh) { refresh(); } } 构造方法中一共做了2件事,首先是设置配置文件的路径,然后对整个容器进行刷新。 这里我们重点关注refresh()方法;进入refresh()方法AbstractApplicationContext类的refresh()方法@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. //为刷新前做准备 prepareRefresh(); // Tell the subclass to refresh the internal bean factory. //获取IOC容器,这里就是处理资源定位以配置文件加载/注册的方法 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } finally { // Reset common introspection caches in Spring's core, since we // might not ever need metadata for singleton beans anymore... resetCommonCaches(); } } } 这里主要关注**obtainFreshBeanFactory()**方法/** * Tell the subclass to refresh the internal bean factory. * @return the fresh BeanFactory instance * @see #refreshBeanFactory() * @see #getBeanFactory() */ protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { //刷新IOC容器 //这里使用了委派设计模式,父类定义了抽象的refreshBeanFactory方法,具体调用实现调用子类的refreshBeanFactory方法 refreshBeanFactory(); //获取一个新的容器 ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); } return beanFactory; } **obtainFreshBeanFactory()**方法总共干了2件事, 重置容器,refreshBeanFactory()方法中会设置相关标志,清除旧的容器,同时为Spring上下文生成一个新的容器,获取一个新的容器AbstractRefreshableApplicationContext的refreshBeanFactory()方法 下面我们进入**refreshBeanFactory()**方法/** * This implementation performs an actual refresh of this context's underlying * bean factory, shutting down the previous bean factory (if any) and * initializing a fresh bean factory for the next phase of the context's lifecycle. * 该方法会将之前的bean工厂全部关闭,并初始化一个全新的bean 工厂类 用于Spring 上下文的生命周期 * bean工厂就是IOC容器 */ @Override protected final void refreshBeanFactory() throws BeansException { //判断是否之前也有容器 //如果有就销毁掉 if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { //创建一个新的工厂 DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); //读取Bean对象的定义 //这里也是使用的委派设计模式 loadBeanDefinitions(beanFactory); synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } } 这里创建了新的容器工厂,同时将新的工厂传入了loadBeanDefinitions()方法中,下面来看一下在loadBeanDefinitions方法中具体做了什么操作。AbstractXmlApplicationContext的 loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法 在AbstractRefreshableApplicationContext类的refreshBeanFactory方法中,调用了loadBeanDefinitions方法,但是这个方法它的一个抽象方法,具体实现应由子类去实现,我们在程序启动时,使用的ClassPathXmlApplicationContext类。根据文章开头的类图可以知道,这里会调用子类AbstractXmlApplicationContext的loadBeanDefinitions方法去完成本次加载@Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { // Create a new XmlBeanDefinitionReader for the given BeanFactory. //使用默认的beanFactory去创建 XmlBeanDefinitionReader XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); // Configure the bean definition reader with this context's // resource loading environment. //设置资源的加载环境 beanDefinitionReader.setEnvironment(this.getEnvironment()); //设置资源读取器 beanDefinitionReader.setResourceLoader(this); //设置实体解析器 beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this)); // Allow a subclass to provide custom initialization of the reader, // then proceed with actually loading the bean definitions. //初始化 bean对象定义读取器 initBeanDefinitionReader(beanDefinitionReader); //使用初始化完成的读取器,调用loadBeanDefinitions方法 loadBeanDefinitions(beanDefinitionReader); } 总的来说,这里只干了一件事,那就是初始化配置//设置资源读取器 beanDefinitionReader.setResourceLoader(this); //初始化 bean对象定义读取器 initBeanDefinitionReader(beanDefinitionReader); 设置资源读取器,这里设置的资源读取器就是当前这个对象本身 通过类图我们可以发现我们这个类的顶级父类ApplicationContext,继承自DefaultResourceLoader这个类,该类实现了ResourceLoader接口,说明这个类的实例化对象本身是具有资源读取器的功能的 初始化bean对象定义读取器,这里设置xml文件的校验方式 下面我们继续看**loadBeanDefinitions(XmlBeanDefinitionReader reader)**方法protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException { //从子类对象中获取到资源定位 Resource[] configResources = getConfigResources(); if (configResources != null) { //XmlBeanDefinitionReader 读取器调用其父类的 reader.loadBeanDefinitions(configResources); } String[] configLocations = getConfigLocations(); if (configLocations != null) { reader.loadBeanDefinitions(configLocations); } } 先看这一行//这行代码的具体实现是由子类完成的,通过类图可以知道AbstractXmlApplicationContext的子类为ClassPathXmlApplicationContext //这里主要将我们最开始在构造方法中设置好的配置文件进行返回 Resource[] configResources = getConfigResources(); 再看这一行//如果返回的配置文件不为空,就将返回的已经封装好的资源文件进行读取, if (configResources != null) { //XmlBeanDefinitionReader 读取器调用其父类的 reader.loadBeanDefinitions(configResources); } 至此。资源文件定位过程已经加载完成。后续就是读取和注册。整个IOC容器加载过程中最重要的是读取过程,我们可以从刚刚的定位过程来看,虽然叫定位过程,但是其实就是一个配置文件读取器的初始化过程,这个过程会设置相关的解析策略以及校验策略。最终读取器生成后,就可以将我们早早设置好的配置文件载入然后进行读取。
-
【功能模块】容器编译【操作步骤&问题现象】1、根据AR-CORE-220E开发指南容器制作步骤编译出容器;2、安装到AR-CORE-220E设备上;3、使用container status查看容器状态,此时容器ip是ipv6地址;4、等待几分钟后,再次查看,容器ip仍旧是ipv6地址【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
2021年4月1日北京超图软件股份有限公司资深产品经理周世杰老师做客华为云云市场直播间,给大家带来了《场景+应用,带你硬核解析云原生GIS》的主题分享。其实在之前我是不太了解什么是GIS的,非常感谢这次的科普直播,让我不仅了解到了GIS技术,还了解到了相关的产品案例,大有裨益,本文就带大家一起梳理一下直播的内容。GIS是Geographic Information System的简称,即地理信息系统,那云原生GIS又是什么?云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生GIS是面向环境设计的,基于微服务架构思想的,以容器位部署载体的,可自动化编排、运维管理的,更弹性、更稳定、更新更实时的GIS软件体系架构。也就是以云原生的方式构建和运行的 GIS 应用。云原生GIS有什么优势?1)更稳定:服务可自动恢复 ;故障可自动转移;保证服务永久在线。2)更便捷: 内置存储资源池:Redis、MySQL、MongoDB、HDFS 、 Elasticsearch、HBase、PostGIS、PostgreSQL内置计算资源池:Spark、Hadoop YARN内置流数据环境:Kafka集群3)更弹性:资源更集约计算更高效 云原生GIS的典型应用场景:1)GIS服务数量多云原生设计的初衷就是为了解决大数据时代所带来的数据量 不断增大引起的数据发布不成功、数据加载困难等问题。当用户有成百上千的服务实例时,如果发布在一个iServer或 iServer集群中,服务器的承受力问题和服务崩溃、重启所带来的种种,都是亟待解决的问题。这种情况使用云原生GIS,对服务按 照数据源类型、服务类型、访问频率等进行分类调度到不同的节点, 就可以化解上述问题。2)数据种类多,体积大数据种类多,发布出来的服务数量也会很多,造成的问题跟上述第一个场景一样。 数据的体积比较大的情况下,查询、分析、加载等过程都会 比较耗资源,如果采用传统方式发布,不仅访问该服务会比较慢, 而且也会拖慢其他服务。所以当数据种类多、体积大或服务类型复杂时,都适用于云原生GIS环境,对这类服务进行独立调度和横向伸缩。3)局部平滑升级、故障恢复困难云原生的优势就是更新快、升级快,可以快速更新单个微服务,而不会影响其他功能。 在项目生产过程中,有需要上线一些新功能时,如果采用传统方式往往需要做大量手工配置工作,且存在风险。而在云原生GIS中,用户只需要使用新镜像,就可以滚动更新该服务,从而便捷、平滑稳定的升级新功能。再配合灰度发布让服务上线更加严谨。4)关注微服务、创新随着应用程序的功能日益丰富和强大,微服务应运而生,成为新型软件架构。 云原生GIS是由多个功能小而专注、独立部署的微服务组合出的大型GIS应用程序。各个微服务的开发彼此独立,可以根据功能需求每个微服务使用最适合的技术栈或开发语言。当用户考虑升级整体技术栈时,可以考虑云原生创新应用。5)对高可用关注度高云原生GIS的部署是多节点集群方式搭建,一个节点故障,服务会自动转移到其他存活的节点;如果其中一个服务异常,系统会自动重建一个新的服务来替代异常的服务,因为是基于容器技术,替代过程可以达到秒级替代;基于微服务的横向扩展能力,保证了服务高效稳定。6)机器/VM比较多云原生GIS环境下,所有服务都是由Kubernetes统一管理调 度,用户需要做的就是把这些机器加入Kubernetes集群即可。 云原生GIS会全面监控物理机、容器等资源使用情况,并把服务部署调度到当前最优的机器来运行。 后续有采购新机器,只需要“一键”加入Kubernetes集群即可。 当有机器从Kubernetes中移除后,它上面的服务会自动迁移到其他机器,不需要人工干预。 云原生GIS环境搭建需要的包-华为云:直播链接:https://bbs.huaweicloud.com/live/marketplace_live/202104011900.html超图云GIS管理服务器平台:https://marketplace.huaweicloud.com/contents/1bdc29fb-2828-4aa3-b799-acb09538c1a8?marketplace_live_20210401
-
【功能模块】把第三方库打包进容器【操作步骤&问题现象】1,用build_sdk_base.sh制作了基础镜像2,自己编译出来了第三方的库(.so和.a),不是按照文档脚本制作,库是测试可用的,库没有问题3,修改了createdeb文件,把所有的库都打包成deb文件执行命令:./Todeb 库文件夹 库名目的:库文件夹里面的DEBIAN文件和第三方库(.so或.a)打包成deb文件,然后分别放到sdk和ova文件夹下(问题1:必须把deb文件放到这两个文件夹下吗,制作sdk,应该和ova没有关系吧)4,用build_sdk.sh制作出编译镜像,并安装(问题2:这一步后,第三方库应该也已经被打包进编译镜像了吧,但是怎么确定打包的.so成功被打包进镜像了,目前/usr/loca/lib和/usr/lib下都没有)5,在制作出的编译环境里面执行build_ova.sh制作出容器,这一步执行过程在附件日志(问题3:安装到核心板上,没有找到第三方库,目前/usr/loca/lib和/usr/lib下都没有,应该在哪里)问题4:上面的第3步,是否可用把所有的.so和.a文件都放到一个文件夹中,一次性打包成.deb,还是必须是分开制作成.deb,然后都放到sdk目录下?问题5:请帮忙看下附件日志,还有一些警告,请问哪些警告可以忽略,哪些不能忽略,必须解决?问题6:第1步制作的交叉编译环境,应该就是华为提供的交叉编译镜像吧?root@2b2df3265563:/data/502H/eciot-ova# cat Todeb #!/bin/bash if [ $# != 1 ];then echo "Usage: $0 appdir package architecture version email description " exit fi DIR=$1 PACKAGE=$1 if [[ ! -d $DIR ]]; then mkdir $DIR fi cp ./my_lib/${PACKAGE} $DIR/ ARCH=arm64 VERSION=1.0 INSTALLED_SIZE=`du -s $DIR | awk '{print $1}'` EMAIL=guoyanzhang@orena.com.cn DESC=orena cd $DIR if [[ ! -d "DEBIAN" ]]; then mkdir DEBIAN fi #md5sum `find . -type f` > DEBIAN/md5sums echo "Package: $PACKAGE" > DEBIAN/control echo "Version: $VERSION" >> DEBIAN/control echo "Architecture: $ARCH" >> DEBIAN/control echo "Depends: " >> DEBIAN/control echo "Installed-Size: $INSTALLED_SIZE " >> DEBIAN/control echo "Priority: optional" >> DEBIAN/control echo "Maintainer: $EMAIL" >> DEBIAN/control echo "Description: $DESC" >> DEBIAN/control chmod 755 -R DEBIAN #dpkg -b . ../${PACKAGE}_${VERSION}_${ARCH}.deb cd .. pwd debName=${PACKAGE}_${VERSION}_${ARCH}.deb dpkg -b $DIR ./${debName} echo ${debName} cp ./${debName} ./custom_deb/ova/${ARCH} mv ./${debName} ./custom_deb/sdk/【截图信息】五【日志信息】(可选,上传日志内容或者附件)无
-
给容器内应用程序传递参数的实现方式:1. 将配置文件直接打包到镜像中,不推荐使用,因为变更配置不够灵活,配置过程也繁琐。2. 使用环境变量来给Pod应用传参修改配置。3.挂载存储卷: 我们可将配置信息直接放到存储卷中,自动挂载存储卷到配置文件目录,来实现给Pod中应用提供不同的配置。4. 使用configMap存储参数。configMap的作用: 一个configMap资源其实就是一系列配置信息的集合,存放在etcd中;它是K8s中的标准组件,通过两种方式实现给Pod传递配置参数: A. 将环境变量直接定义在configMap中,Pod启动时,通过env来引用configMap中定义的环境变量。 B. 将一个完整配置文件封装到configMap中,然后通过共享卷的方式挂载到Pod中,读取配置文件实现给应用传参。应用示例:首先定义一个configmap的资源文件。vi configmap-demo.yamlapiVersion: v1kind: ConfigMapmetadata: name: configmap-demo data: abc: "123" #键值key-value的方式设置参数 cde: "456" redis.properties: | #”|“代表多行数据 port: 6379 host: 192.168.31.10再定义一个使用configmap的测试容器的yaml文件。vi configmap-demo-pod.yamlapiVersion: v1kind: Podmetadata: name: configmap-demo-podspec: containers: - name: demo image: nginx env: - name: ABCD valueFrom: configMapKeyRef: name: configmap-demo key: abc - name: CDEF valueFrom: configMapKeyRef: name: configmap-demo key: cde volumeMounts: - name: config mountPath: "/config" readOnly: truevolumes:- name: configconfigMap: name: configmap-demo items: - key: "redis.properties" path: "redis.properties"[k8s-master~]#kubectl apply -f configmap-demo.yaml[k8s-master~]#kubectl apply -f configmap-demo-pod.yaml[k8s-master~]#kubectl exec -it configmap-demo-pod --bash 进入容器bashroot@configmap-demo-pod:/#echo $abc123root@configmap-demo-pod:/#cat /config/redis.properties port: 6379 host: 192.168.31.10
-
【功能模块】容器安装签名【操作步骤&问题现象】边缘计算网关二次开发指南(AR-CORE系列)文档里面“通过OpenPGP生成签名文件”这一章节的运行环境是什么?是容器交叉编译环境吗?1,如果不是,那请问运行环境是什么?2,如果是,那请问这个生成的签名文件,是容器安装和app安装同时使用的吗?3,如果是,那请问我把“通过OpenPGP生成签名文件”第3步生成的公钥文件放到容器内,安装说找不到签名文件?【截图信息】无【日志信息】(可选,上传日志内容或者附件)无
-
重启策略:Always:当容器终止退出后,总是重启容器,是默认策略。OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。Never:当容器终止退出,从不重启容器。健康检查,有以下3种类型:livenessProbe (存活检查) :如果检查失败,将杀死容器,根据Pod的重启策略来操作。readinessProbe (就绪检查) :如果检查失败, Kubernetes会把Pod从service endpoints中剔除。startupProbe (启动检查):判断容器是否成功启动。支持以下三种检查方法:httpGet:发送HTTP请求,返回200-400范围状态码为成功。exec:执行Shell命令返回状态码是0为成功。tcpSocket:发起TCP Socket建立成功。
-
【摘要】 十年磨一剑,云原生从最初的默默无闻到企业数字化转型的核心支撑,华为云作为CNCF的创始成员,一直在为社区贡献力量。随着技术和业务的演进,云原生2.0时代的新价值——“云上内生的云能力”成企业所需,看华为云云原生基础设施如何开启云原生2.0时代。文章简介什么是云原生都0202年了,如果你还不懂云原生,那真的out了。带你读懂容器技术,“容器”和“虚拟机”别再分不清容器这个词,当你第一眼看它或许脑子里是这东西:瓶瓶罐罐、装水、装其他东西的玩意。不管是什么,总的来说,容器给人第一印象就是——“装”。一文读懂k8s多集群技术发展史 一文带你了解Kubernetes多集群技术发展的历史、现状与未来。浅谈服务化和微服务化微服务是近期非常热门的话题,芸芸众生言必谈微服务。伯克利:serverless是下一代计算范式Serverless技术正是云厂商的基于规模经济的一个选择。Service Mesh:下一代微服务?微服务方兴未艾如火如荼之际,在 Spring Cloud 等经典框架之外,Service Mesh 技术正在悄然兴起。云原生系列技术:DevOps技术云计算和容器技术的快速普及,DevOps越来越被重视,甚至成为保证公司生产力的最佳之选。详解华为云容器全新解决方案华为云新一代容器基础设施“军舰”,来了!大数据容器化,头部玩家尝到了甜头?大数据容器化,大势所趋。头部玩家在进行大数据容器化后,尝到了甜头。从Vessel到二代裸金属容器,云原生新一波技术浪潮涌向何处云原生大势,深度解读华为云四大容器解决方案如何加速技术产业融合。云原生2.0时代:华为云开启应用定义基础设施新时代云原生以“应用使能”+“混合云”为核心,帮助企业本地部署与云端融合,打造企业急迫需要的混合云架构。为什么说容器的崛起预示着云原生时代到来?说到云原生,我们就不得不先了解一下容器技术。【容器】容器多云/混合云,云时代灾备新利器华为容器多云/混合云解决方案基于社区的集群联邦技术,提供了跨云的多集群统一管理、应用在多集群的统一部署和流量分发,并可以结合Istio技术,实现应用流量的全局治理。【KubeEdge】解读KubeEdge:云原生的边缘计算平台KubeEdge即Kube+Edge,顾名思义就是依托K8S的容器编排和调度能力,实现云边协同、计算下沉、海量设备的平滑接入。【Istio】万字解读:Service Mesh服务网格新生代--Istio一文带你了解关于Istio技术的介绍、架构和展望。【Volcano】Volcano火山:容器与批量计算的碰撞 Volcano是基于K8s构建的一个通用批量计算系统,弥补了K8s在“高性能应用”方面的不足,支持TensorFlow、Spark、MindSpore等多个领域框架,帮助用户通过K8s构建统一的容器平台。【鲲鹏容器】华为云鲲鹏容器发布,极致释放多元算力在云+AI+5G的时代,昇腾+鲲鹏是企业创新的最佳算力选择。【AI容器】华为云AI容器:零基础搭建AI计算平台,提升计算效率 50%华为云 AI 容器为客户提供更高性价比算力,更简化了平台运维,提升 AI 计算效率 50%,加速 AI 计算在各行业的落地和发展。【裸金属容器】华为云重磅发布全球首个双零损耗裸金属容器 全球独家双零损耗裸金属容器——华为云第二代裸金属容器,首次在业内实现资源和性能的零损耗,让容器全面释放裸金属服务器的潜力,加速云原生创新升级。【裸金属容器】华为云第二代裸金属容器:应对海量并发的网络黑科技因突发流量触发业务扩容,以前是扩容虚机速度慢,现在大部分互联网平台都使用容器了,为什么扩容速度有些时候还是跟不上流量增长的节奏?【数据库】云原生数据库三驾马车之TaurusDBTaurus其设计思想是Log-as-database以最小化网络IO,采用计算存储分离的架构。【DevCloud】华为云DevCloud,云原生架构下的DevOps实践云原生架构与DevOps的落地与转型是一个量变到质变过程。【云容器引擎】带你了解云容器引擎CCE的权限管理借助云容器引擎,您可以在华为云上轻松部署、管理和扩展容器化应用程序,快速高效的将微服务部署在云端。【容器】容器化之路:谁偷走了我的构建时间 什么是镜像?什么是镜像构建?什么是storage-driver?【Docker网络】《跟唐老师学习云网络》 - Docker网络实现带你详细理解Docker容器是如何实现Docker网络,以及解析一个容器是如何与本机、本机中的容器、其他Host、其他Host中的容器 等场景下分别是如何进行通信的详细原理。【Kubernetes】盘点Kubernetes网络问题的4种解决方案现在的开源世界里,有很多开源组件可以帮助我们打通Docker容器和容器之间的网络,实现K8s要求的网络模型。当然每种方案都有自己适合的场景,我们要根据自己的实际需要进行选择。【云容器引擎】微服务应用在CCE上的初探借助云容器引擎,在华为云上轻松部署、管理和扩展容器化应用程序,来为企业释放更多精力,CCE提供一整套完整的最佳容器解决方案,赋能企业专注业务开发。【Kubernetes】企业落地Kubernetes的问题与对策随着Kubernetes的全面成熟与大规模应用,如何落地Kubernetes是企业实施云战略需要考虑的迫切问题。【微服务】如何应对企业级微服务开发?最优解在这里…从服务管理中心、通信处理两个模块来介绍华为开源微服务框架 SeviceComb 如何帮助企业应用快速具备高性能的通信能力以及高可靠的服务管理能力。【Service】在K8S大规模场景下Service性能如何优化? K8s 原生的 Service 负载均衡基于 Iptables 实现,其规则链会随 Service 的数量呈线性增长,在大规模场景下对 Service 性能影响严重。【安全容器】容器与虚拟化的结合:浅谈“安全容器”技术发展趋势无论公有云还是私有云厂商,都认识到了将虚拟化的隔离性和容器的高效运维特性相结合,是云原生平台发展的必然趋势。【Kubernetes】Kubernetes的拐点助推器:左手开源,右手边缘计算据2020边缘计算状态报告显示,到2022年,75%的数据将通过边缘分析和处理。这种数据处理的流动性,将伴随有4大边缘技术演进方向。本合集为《大厂内参》005期,欢迎大家持续关注。大厂内参根据开发者普遍关注的热门技术领域,汇编实践精华内容。从业务场景选型,应用案例分析,到前瞻趋势预测。以专题的形式,深度解读华为云核心技术,分享一线工程师的实战经验。【第一期】敏捷&Devops:80+篇实践干货分享,深度解读敏捷&DevOps如何革新软件开发【第二期】数据库:从数据库科普到核心技术解读、上云案例分享,全方位剖析云数据库【第三期】云服务器:选型解读+案例分享:云服务器“软硬技术”全公开【第四期】人工智能:海量实战经验教你零门槛进场AI开发,无成本负担玩转AI应用【第五期】云原生:读懂云原生2.0,看它如何重塑业务开发架构【第六期】云安全:Get防范云安全的必杀技,学会构建云上完整安全体系【第七期】物联网:“端边云”IoT全栈技术大揭秘,开发实战指南带你轻松上手IoT【第八期】数据仓库:8大场景系列玩转数仓运维,做个不秃头的DBA
-
云原生2.0时代已经到来IDC发布《IDC FutureScape: 全球云计算2020 年预测——中国启示》显示,云原生应用所影响的领域正逐渐从互联网走向非互联网,从传统应用升级走向云原生。当下,云原生技术的成熟正极大地影响着个人、企业乃至整个社会的生产生活方式。为进一步推进云原生技术的普及,帮助广大技术爱好者快速掌握云原生相关技能,让学员具备云原生系统基础管理动手能力,华为云学院联合CNCF、华为云云原生团队重磅推出《华为云云原生王者之路集训营》系列课程。继《黄金系列》课程之后,在30000+黄金课程学员的呼声和期待下,华为云学院宣布:云原生王者之路《钻石系列》课程预备上线,钻石集训营正式开始啦! 黄金课程学员学习心得学员A:作为云原生基础教学,云原生黄金课程能够让人快速了解概念,具备初步动手能力,沙箱实验很棒,可以实践锻炼,学以致用!学员B:从基础的微服务K8S等理论知识,到K8S集群管理、服务管理等进阶知识,我学到很多,期待钻石进阶课程。学员C:这次学习让我了解了什么是云原生,跟随云原生大佬学习k8s,入股不亏,钻石课程快来吧! 钻石系列课程简介钻石系列课程由华为云云原生核心团队11名大咖讲师倾心打造,在黄金系列课程的基础上,对云原生技术底层原理进行深度剖析,包括Kubernetes的运行时、调度、网络、存储、运维等核心技术原理和主流方案架构,Istio的控制面、数据面、流量治理、传统微服务框架接入等技术原理和方案架构,同时精选多个企业典型应用场景,作为学员上机实践案例,帮助学员将所学技术快速与企业业务相结合,服务于企业生产。钻石集训营将以直播课程与专家答疑同步的方式,带着大家进行在线学习,帮助大家在云原生技术进阶之路上学的更轻松! 集训营特邀专家大咖阵容本阶段钻石系列课程由11位华为云云原生领域大咖专家倾力打造,全面深入地对云原生的知识体系剖析,详细课程内容,请查看课程详情。 集训营面向对象1.计算机、软件工程等专业的大学生2.涉及Kubernetes、Istio等技术的应用开发者3.其他的云原生技术兴趣爱好者 集训营直播安排直播课程期间,每晚19-20点专家讲师进行课程直播与在线答疑,次日10点可在华为云学院解锁直播课程回看。 集训营亮点4大任务:课程学习+实战演练+认证实践+结业考核5大亮点:1.黄金-钻石-王者系统化课程,带你进阶化提升2.精选典型应用场景,理论实践相结合,多阶考核与测验3.华为云云原生团队核心架构师授课带学、答疑解惑4.云原生专属学习圈,每日打卡,教辅相伴,升阶无忧5.学练考一站式,课程、实验、微认证等多元化学习体验 集训营丰富好礼参与课程学习打卡,赢价值200USD HCIA职业认证考试券、华为手环B6、筋膜枪、富士INSTAX 一次成像相机、雷柏机械键盘、华为手环4e、微认证代金券、沙箱实验点折扣券等超丰富奖品!训练营学员还可享有CKA/CKAD/CKS认证套购8.5折,单独购买9折优惠! 报名时间及方式登录“华为云学院”,从 “云原生王者之路钻石集训营”活动页进入,点击“立即报名”即可报名成功。添加小助手微信HWcloudedu,备注“云原生”加学习群,心动不如行动,快去报名吧! 课程详情请扫描下方二维码了解,参与日期截止至8月12日,课程免费向开发者开放,名额有限,招满即止,还等什么,马上占位吧!
-
云原生2.0时代已经到来IDC发布《IDC FutureScape: 全球云计算2020 年预测——中国启示》显示,云原生应用所影响的领域正逐渐从互联网走向非互联网,从传统应用升级走向云原生。当下,云原生技术的成熟正极大地影响着个人、企业乃至整个社会的生产生活方式。为进一步推进云原生技术的普及,帮助广大技术爱好者快速掌握云原生相关技能,让学员具备云原生系统基础管理动手能力,华为云学院联合CNCF、华为云云原生团队重磅推出《华为云云原生王者之路集训营》系列课程。继《黄金系列》课程之后,在30000+黄金课程学员的呼声和期待下,华为云学院宣布:云原生王者之路《钻石系列》课程预备上线,钻石集训营正式开始啦! 黄金课程学员学习心得学员A:作为云原生基础教学,云原生黄金课程能够让人快速了解概念,具备初步动手能力,沙箱实验很棒,可以实践锻炼,学以致用!学员B:从基础的微服务K8S等理论知识,到K8S集群管理、服务管理等进阶知识,我学到很多,期待钻石进阶课程。学员C:这次学习让我了解了什么是云原生,跟随云原生大佬学习k8s,入股不亏,钻石课程快来吧! 钻石系列课程简介钻石系列课程由华为云云原生核心团队11名大咖讲师倾心打造,在黄金系列课程的基础上,对云原生技术底层原理进行深度剖析,包括Kubernetes的运行时、调度、网络、存储、运维等核心技术原理和主流方案架构,Istio的控制面、数据面、流量治理、传统微服务框架接入等技术原理和方案架构,同时精选多个企业典型应用场景,作为学员上机实践案例,帮助学员将所学技术快速与企业业务相结合,服务于企业生产。钻石集训营将以直播课程与专家答疑同步的方式,带着大家进行在线学习,帮助大家在云原生技术进阶之路上学的更轻松! 集训营特邀专家大咖阵容本阶段钻石系列课程由11位华为云云原生领域大咖专家倾力打造,全面深入地对云原生的知识体系剖析。 集训营面向对象1.计算机、软件工程等专业的大学生2.涉及Kubernetes、Istio等技术的应用开发者3.其他的云原生技术兴趣爱好者 集训营直播安排直播课程期间,每晚19-20点专家讲师进行课程直播与在线答疑,次日10点可在华为云学院解锁直播课程回看。 集训营亮点4大任务:课程学习+实战演练+认证实践+结业考核5大亮点:1.黄金-钻石-王者系统化课程,带你进阶化提升2.精选典型应用场景,理论实践相结合,多阶考核与测验3.华为云云原生团队核心架构师授课带学、答疑解惑4.云原生专属学习圈,每日打卡,教辅相伴,升阶无忧5.学练考一站式,课程、实验、微认证等多元化学习体验 集训营丰富好礼参与课程学习打卡,赢价值200USD HCIA职业认证考试券、华为手环B6、筋膜枪、富士INSTAX 一次成像相机、雷柏机械键盘、华为手环4e、微认证代金券、沙箱实验点折扣券等超丰富奖品!训练营学员还可享有CKA/CKAD/CKS认证套购8.5折,单独购买9折优惠! 报名时间及方式登录“华为云学院”,从 “云原生王者之路钻石集训营”活动页进入,点击“立即报名”即可报名成功。添加小助手微信HWcloudedu,备注“云原生”加学习群,心动不如行动,快去报名吧! 课程详情请扫描下方二维码了解,参与日期截止至8月12日,课程免费向开发者开放,名额有限,招满即止,还等什么,马上占位吧!
-
冒泡排序:优点=>数据较少的容器,入门简单。缺点=>对于大规模的数据就显的效率较低冒泡排序=>简答来说就是前后数据比大小,(升序) i>i+1 交换位置。流程:1、比较相邻的俩个数,第一个值大于第二个则值交换,以此类推,完成第一次循环的次数为 arr.lenght-12、第一次的循环已经的得到最小的结果,下一次的循环拿下标为[1]的元素进行判断画图可以看的更清楚点冒泡动画这个据很细节了,第一次的循环时确定最小的那个值,第二次的循环确定第二小的.....代码实现: //定义需要排序的数组 var arr = [2, 4, 5, 3, 1]; //利用冒泡排序将原数组进行升序排列 for (var i = 0; i < arr.length - 1; i++) { for(var j=0;j<arr.length-1;j++) { if(arr[j]>arr[j+1]){ var temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } //输出排列后的数组 console.log(arr);快速排序思想=选择数组中间数作为基数,并从数组中取出此基数准备两个数组容器,遍历数组,逐个与基数比对,较小的放左边容器,较大的放右边容器;递归处理两个容器的元素,并将处理后的数据与基数按大小合并成一个数组,返回。不太懂得话上动画快速排序动画let quickSort = function (arr) { // 递归出口就是数组长度为1 if (arr.length <= 1) return arr //获取中间值的索引,使用Math.floor向下取整; let index = Math.floor(arr.length / 2) // 使用splice截取中间值,第一个参数为截取的索引,第二个参数为截取的长度; // 如果此处使用pivot=arr[index]; 那么将会出现无限递归的错误; // splice影响原数组 let pivot = arr.splice(index, 1)[0], left = [], right = []; console.log(pivot) console.log(arr) for (let i = 0; i < arr.length; i++) { if (pivot > arr[i]) { left.push(arr[i]) } else { right.push(arr[i]) } } return quickSort(left).concat([pivot], quickSort(right)); } //let arr = [2, 9, 6, 7, 4, 3, 1, 7] // console.log(quickSort(arr))参考文章:https://juejin.cn/post/6856546833025237006#heading-5
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签