当前位置: 首页 > news >正文

k8s学习之路 | Day16 k8s 中的容器初探

文章目录

  • 容器镜像
    • 镜像名称
    • 镜像拉取策略
    • 私有仓库的拉取策略
  • 容器的环境变量和启动命令
    • 容器的环境变量
    • 容器的启动命令
  • 容器的生命周期钩子
    • postStart
    • preStop
  • 容器的探针
    • startupProbe
    • livenessProbe
    • readinessProbe

k8s 集群中最小的管理单元就是一个Pod,而Pod里面才是容器,但是容器里面到底应该怎么写yaml呢?这个就是我今天学习的目标

  • 一个最简单的Pod资源清单类似于以下这种:
##pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginx

image-20230223150750157

  • 我们通过kubectl explain pod.spec.containers解释了容器到底里面能写什么忒多了
[root@k8s-01 k8s-yaml]# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1RESOURCE: containers <[]Object>DESCRIPTION:List of containers belonging to the pod. Containers cannot currently beadded or removed. There must be at least one container in a Pod. Cannot beupdated.A single application container that you want to run within a pod.FIELDS:args <[]string>Arguments to the entrypoint. The docker image's CMD is used if this is notprovided. Variable references $(VAR_NAME) are expanded using thecontainer's environment. If a variable cannot be resolved, the reference inthe input string will be unchanged. The $(VAR_NAME) syntax can be escapedwith a double $$, ie: $$(VAR_NAME). Escaped references will never beexpanded, regardless of whether the variable exists or not. Cannot beupdated. More info:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
...

容器镜像

镜像名称

kubectl explain pod.spec.containers中的【image 】解释了有关镜像名称的含义和写法

image-20230223152202307

  • Docker image 的镜像名称
  • string 数据类型
##所以在写yaml文件的时候,就应该以这种形式来确认你这个容器启动用的镜像
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginx#image: nginx:1.21-alpine#image: tomcat:latest

镜像拉取策略

kubectl explain pod.spec.containers中的【imagePullPolicy】解释的就是镜像拉取策略

kubectl explain pod.spec.containers.imagePullPolicy拉取策略

image-20230223164237141

  • Always:每当 kubelet 启动一个容器时,kubelet 会查询容器的镜像仓库, 将名称解析为一个镜像摘要。 如果 kubelet 有一个容器镜像,并且对应的摘要已在本地缓存,kubelet 就会使用其缓存的镜像; 否则,kubelet 就会使用解析后的摘要拉取镜像,并使用该镜像来启动容器。这也是默认拉取策略
  • Never:Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。
  • IfNotPresent:只有当镜像在本地不存在时才会拉取。
##所以在写yaml文件的时候,就应该以这种形式来确认要启动容器的镜像的来源
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginximagePullPolicy: Always ## 默认拉取策略:总是去下载

举个栗子

我有下面这个pod文件,我尝试启动一下试试:

#####pod-test1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: wordpressimagePullPolicy: Never

image-20230225220247465

私有仓库的拉取策略

如果我们需要从自己的阿里云私人镜像仓库拉取镜像,又应该如何操作呢?看一下官方帮助文档kubectl explain pod.spec中的【imagePullSecrets <[]Object>】

image-20230225220917430

官方地址:

https://kubernetes.io/zh-cn/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod

官方是这样说的:

  1. 要创建一个Secret

  2. 然后在 Pod 中引用 ImagePullSecrets

举个栗子

我要拉取我自己阿里云镜像仓库的镜像:

  • 我需要先创建一个Secret,这个怎么创建呢?官方是这样说的
kubectl create secret docker-registry <name> \--docker-server=DOCKER_REGISTRY_SERVER \--docker-username=DOCKER_USER \--docker-password=DOCKER_PASSWORD \--docker-email=DOCKER_EMAIL

我就创建一个试试:

kubectl create secret docker-registry test \--docker-server=registry.cn-hangzhou.aliyuncs.com \--docker-username=tb330504_33 \--docker-password=xxxxxxxx \--docker-email=565616251@qq.com

image-20230225222046858

我在准备一个Pod文件

apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:imagePullSecrets:- name: testcontainers:- name: pod-demoimage: registry.cn-hangzhou.aliyuncs.com/publiclibrary/tomcat:8.5-jdk11-temurin-focalimagePullPolicy: IfNotPresent

运行一下,看是否能拉取后正常运行:

  • 正在拉取镜像

image-20230225222729867

  • 拉取成功,运行成功

image-20230225222907947

容器的环境变量和启动命令

容器的环境变量

  • kubectl explain pod.spec.containers.env

image-20230226182054008

  • 按照官方描述,有关容器的环境变量就应该这样写了
####以mysql镜像为例
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-mysql-demoimage: mysqlimagePullPolicy: Alwaysenv:- name: MYSQL_DATABASEvalue: my-test- name: MYSQL_ROOT_PASSWORDvalue: admin@123
  • 尝试并验证一下:OK

image-20230226183241856

容器的启动命令

  • kubectl explain pod.spec.containers.command

https://kubernetes.io/zh-cn/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

image-20230227133904452

image-20230227135528022

  • 尝试一下(覆盖容器默认的启动命令)
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels:app: MYAPP
spec:containers:- name: pod-demoimage: nginxcommand:- /bin/sh- -c- "echo hello world;sleep 3600;"

image-20230227134820426

  • 可以看到,如果设置了command字段信息,就会覆盖默认的容器启动命令,对于这个,官方有明确的说明:

    1. 如果在配置文件中设置了容器启动时要执行的命令及其参数,那么容器镜像中自带的命令与参数将会被覆盖而不再执行。
    2. 如果配置文件中只是设置了参数,却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新参数作为其执行时的参数。

    image-20230227135440569

  • 从最新的文档发现,有些内容有所出入

容器的生命周期钩子

https://kubernetes.io/zh-cn/docs/concepts/containers/container-lifecycle-hooks/#container-hooks

kubectl explain pod.spec.containers.lifecycle

image-20230227142655173

kubectl explain pod.spec.containers.lifecycle.postStart

image-20230227143050232

kubectl explain pod.spec.containers.lifecycle.preStop

image-20230227143147357

k8s 中提供了二个关于容器的生命周期钩子

  • postStart

在容器创建后将立刻执行。但是,并不能保证该钩子函数在容器的 ENTRYPOINT 之前

执行。该钩子函数没有输入参数。

  • preStop

在容器被 terminate(终止)之前执行

postStart

k8s 在容器启动后立刻发送postStart事件,但是并不能确保postStart事件处理程序在容器的EntryPoint之前执行,意思就是容器启动了就会触发,不管容器执行是否成功?在 k8s 管理容器的时候,将一直等待 postStart事件处理程序结束后,才会将容器的状态标记为Running

  • exec:容器创建以后,钩子函数执行一个命令
  • httpGet:容器创建以后,钩子函数发送一个http的get请求
  • tcpSocket:容器创建以后,钩子函数连上一个TCP端口

我们以httpGet为例

我们先启动一个 nginx pod

##pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels: app: MYAPP
spec:containers:- name: pod-demoimage: nginx

image-20230227152057674

我们在准备一个示例yaml

##lifecycle-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: lifecycle-demolabels: app: MYAPP
spec:containers:- name: lifecycle-demoimage: nginxlifecycle:postStart:httpGet:host: 192.168.0.190path: /lifecycle-testport: 80scheme: HTTP  ####注意这个地方是大写

启动一下

image-20230227153045576

查看一下钩子的设置是否生效

  • 是有相关请求,证明是生效的

image-20230227153136409

preStop

钩子函数在容器被terminate之前执行,执行是同步的,执行完才删除容器,写法也是和postStart一样

##lifecycle-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: lifecycle-demolabels: app: MYAPP
spec:containers:- name: lifecycle-demoimage: nginxlifecycle:preStop:httpGet:host: 192.168.0.190path: /lifecycle-testport: 80scheme: HTTP  ####注意这个地方是大写

我们先启动一个这样的 pod

image-20230227153727455

我将这个pod杀死

kubectl delete -f lifecycle-demo.yaml

看下是否生效

image-20230227153826868

容器的探针

健康检查机制

probe 是由 kubelet 对容器执行的定期诊断。 要执行诊断,kubelet 既可以在容器内执行代码,也可以发出一个网络请求。

  • startupProbe:启动探针

    指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器, 而容器依其重启策略进行重启。 如果容器没有提供启动探测,则默认状态为 Success。

  • livenessProbe:存活探针

    指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success。

  • readinessProbe:就绪探针

    指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。 初始延迟之前的就绪态的状态值默认为 Failure。 如果容器不提供就绪态探针,则默认状态为 Success。

  • 写法是一致的 kubectl explain pod.spec.containers.startupProbe

    • initialDelaySeconds:容器启动后要等待多少秒后才启动启动、存活和就绪探针, 默认是 0 秒,最小值是 0。

    • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。

    • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。

    • successThreshold:探针在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。

    • failureThreshold:探针连续失败了 failureThreshold 次之后, Kubernetes 认为总体上检查已失败:容器状态未就绪、不健康、不活跃。 对于启动探针或存活探针而言,如果至少有 failureThreshold 个探针已失败, Kubernetes 会将容器视为不健康并为这个特定的容器触发重启操作。 kubelet 会考虑该容器的 terminationGracePeriodSeconds 设置。 对于失败的就绪探针,kubelet 继续运行检查失败的容器,并继续运行更多探针; 因为检查失败,kubelet 将 Pod 的 Ready 状况设置为 false

    • terminationGracePeriodSeconds:为 kubelet 配置从为失败的容器触发终止操作到强制容器运行时停止该容器之前等待的宽限时长。 默认值是继承 Pod 级别的 terminationGracePeriodSeconds 值(如果不设置则为 30 秒),最小值为 1。

  • 检查机制

    • exec
      在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功

    • httpGet

      对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的

    • tcpSocket

      对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的

  • 探测结果

    • Success(成功)
      容器通过了诊断。
    • Failure(失败)
      容器未通过诊断。
    • Unknown(未知)
      诊断失败,因此不会采取任何行动。

startupProbe

我先启动了一个 pod-demo 的容器:

image-20230227165026071

我现在准备一个另一个 pod:

apiVersion: v1
kind: Pod
metadata:name: probe-demolabels: app: MYAPP
spec:containers:- name: probe-demoimage: nginxstartupProbe:httpGet:host: 192.168.0.190path: /index2.htmlport: 80scheme: HTTP  ####注意这个地方是大写initialDelaySeconds: 60failureThreshold: 3periodSeconds: 10

我们启动验证一下:

  • 最开始肯定是失败的,因为探针设置的路径不存在的,所以pod的状态也是未就绪的

image-20230227165632242

  • 我们对pod-demo中的文件进行一个操作,让测试pod可以探针成功

image-20230227165724162

image-20230227165829042

livenessProbe

我们还是以上面的为例,准备一个测试 yaml

###每个1秒就去检查特定服务器的服务是否正常访问,
apiVersion: v1
kind: Pod
metadata:name: probe-demolabels: app: MYAPP
spec:containers:- name: probe-demoimage: nginxlivenessProbe:httpGet:host: 192.168.0.190path: /index.htmlport: 80scheme: HTTP  ####注意这个地方是大写initialDelaySeconds: 60failureThreshold: 3periodSeconds: 1
  • 查看一下各状态

image-20230227170427680

  • 我们删除探针里面需要用到的pod,再看下状态

image-20230227170534804

  • 看下探针的事件:检查失败就会一直重启

image-20230227170658527

image-20230227170839132

但是我不知道为啥pod还是处于READY的状态

readinessProbe

就绪探针,理论是和上面一样的

有时候,应用会暂时性地无法为请求提供服务。 例如,应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用,也不想给它发送请求。 Kubernetes 提供了就绪探针来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。

后续实际应用中,我再来探一下更多的用法场景

相关文章:

k8s学习之路 | Day16 k8s 中的容器初探

文章目录容器镜像镜像名称镜像拉取策略私有仓库的拉取策略容器的环境变量和启动命令容器的环境变量容器的启动命令容器的生命周期钩子postStartpreStop容器的探针startupProbelivenessProbereadinessProbek8s 集群中最小的管理单元就是一个Pod&#xff0c;而Pod里面才是容器&am…...

export、import、commit、save、load的区别

目录1. docker export 和 docker import2. docker commit3.docker save 和 docker load1. docker export 和 docker import docker export 容器ID/容器Name > xxx.tar 导出一个容器快照 docker import xxx.tar NewImageName:tag 导入一个容器快照到本地镜像库 适用场景&a…...

多部委联合举办中国人工智能大赛启动会在厦召开,快商通亮相发言

站在“第二个百年奋斗目标”的新起点上&#xff0c;为深入推动我国人工智能产业创新发展&#xff0c;发掘一批人工智能优秀团队&#xff0c; 国家互联网信息办公室、工业和信息化部、公安部、国家广播电视总局、厦门市人民政府将联合主办第四届中国人工智能大赛 。快商通联合创…...

js红宝书学习笔记(1-6章)

就按照原书中写的章节顺序记笔记了&#xff0c; 还有可能我学过js一段时间了&#xff0c;可能有些对于新手的细节会忽略&#xff0c;但是会尽量写全的~ 1.第一章 什么是JavaScript 1.1讲了一些历史&#xff0c;所以我们从1.2开始看 1.2 JavaScript的实现 完整的JaveScript包…...

第十四届蓝桥杯第三期官方模拟赛C\C++题解

文章目录A-填空题题意算法参考代码&#xff08;C&#xff09;B-填空题题意算法参考代码&#xff08;C&#xff09;C-填空题题意算法参考代码&#xff08;C&#xff09;D-填空题题意算法参考代码&#xff08;C&#xff09;E-填空题题意算法参考代码&#xff08;C&#xff09;F题…...

API接口安全

目前项目都是前后端分离或者有对外提供接口的需求&#xff0c;在这些情况下&#xff0c;就要考虑接口安全。 如果不重视接口安全&#xff0c;可能导致严重的危害&#xff0c;例如数据盗取&#xff0c;服务宕机等。 可能的安全问题: 1.明文密码被攻击者抓包看到 前端可对密码或…...

2023前端一面vue面试题合集

函数式组件优势和原理 函数组件的特点 函数式组件需要在声明组件是指定 functional:true不需要实例化&#xff0c;所以没有this,this通过render函数的第二个参数context来代替没有生命周期钩子函数&#xff0c;不能使用计算属性&#xff0c;watch不能通过$emit 对外暴露事件&…...

【Leetcode 剑指Offer】第 5 天 查找算法(中等)

查找算法剑指 Offer 04. 二维数组中的查找剑指 Offer 11. 旋转数组的最小数字剑指 Offer 50. 第一个只出现一次的字符Python字典基础哈希表&#xff08;python中是dict()&#xff09;有序哈希表第一个中等&#xff0c;后两个简单题。剑指 Offer 04. 二维数组中的查找 题&#…...

薯条投放适合哪些笔记?小红书薯条投放的3种模式

随着小红书平台的种草推广模式兴盛&#xff0c;薯条投放这个词也渐渐进入大众的视野&#xff0c;今天就来给大家讲讲什么是薯条投放&#xff0c;以及薯条投放适合哪些笔记。一、什么是薯条投放?薯条是一款为小红书用户打造的笔记推广工具&#xff0c;用户可选择推广目标&#…...

记录第一个Python练习的过程

题目如下 编写一个名为collatz()的函数&#xff0c;它有一个名为number的参数。如果参数是偶数&#xff0c;那么collatz()就打印出number // 2&#xff0c;并返回该值。如果number是奇数&#xff0c;collatz()就打印并返回3 * number 1。 然后编写一个程序&#xff0c;让用户…...

【Python】3.3实现多线程

程序Program进程Process线程Thread为完成特定任务而用计算机语言编写的一组计算机能识别和执行的指令的集合。程序是指令、数据及其组织形式的描述&#xff0c;一段静态代码&#xff0c;静态对象。计算机中的程序关于某数据集合上的一次执行过程。进程是程序的实体&#xff0c;…...

在linux中使用lftp和sftp下载文件(夹)

一、首先确保你的系统中已经下载了lftp和sftp。 1.安装lftp sudo apt install lftp sudo apt install screen 2.安装sftp 在Linux系统中&#xff0c;一般RedHat系统默认已经安装了openssh-client和openssh-server&#xff0c;即默认已经集成了sftp服务&#xff0c;不需要重…...

Docker简介与用法

文章目录1、Docker简介1.1、Docker能解决什么问题1.2、什么是虚拟机技术1.2.1、虚拟机的缺点1.3、什么是容器1.3.1、容器与虚拟机比较1.4、分析 Docker 容器架构1.4.1、Docker客户端和服务器1.4.2、Docker 镜像(Image)1.4.3、Docker 容器(Container)1.4.4、Docker 仓库(reposit…...

基于海鸥算法改进的DELM分类-附代码

海鸥算法改进的深度极限学习机DELM的分类 文章目录海鸥算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.海鸥算法4.海鸥算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1a;https://blog.c…...

linux基本功系列之mount命令实战

文章目录前言一. mount命令的介绍二. 语法格式及常用选项三. 参考案例3.1 将iso镜像挂载到/mnt上3.2 把某个分区挂载到/sdb1上3.3 用只读的形式把/dev/sdb2挂载到/sdb2上3.4 设置自动挂载总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【…...

力扣Top100题之两数相加(Java解法)

0 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数…...

【测试】Python手机自动化测试库uiautomator2和weditor的详细使用

1.说明 我们之前在电脑操作手机进行自动化测试&#xff0c;基本上都是通过Appium的&#xff0c;这个工具确实强大&#xff0c;搭配谷歌官方的UiAutomator基本上可以完成各种测试&#xff0c;但缺点也很明显&#xff0c;配置环境太麻烦了&#xff0c;需要jdk、sdk等&#xff0c…...

《NFL橄榄球》:旧金山49人·橄榄1号位

旧金山四九人&#xff08;San Francisco 49ers&#xff0c;又译旧金山淘金者) 是美国全国橄榄球联盟球队。成立于1946年&#xff0c;最初作为全美橄榄球联合会(AAFC)的一员参加比赛&#xff0c;后于1950年与克利夫兰布朗一同加入由美国橄榄球联合会合并而成的NFL。现任主教练为…...

spark为什么比hadoop快

网上一堆人根本对计算框架一知半解就出来糊弄人&#xff0c;常见解答有&#xff1a; spark是基于内存计算&#xff0c;所以快。这跟废话似的&#xff0c;mr计算的时候不也是基于内存&#xff1f; mr shuffle落盘。这也是胡扯&#xff0c; spark shuffle不落盘&#xff1f; 实际…...

跨境人都在用的指纹浏览器到底有什么魔力?三分钟带你了解透彻

什么是指纹浏览器&#xff1f;这是东哥近期收到最多的粉丝私信咨询&#xff0c;指纹两个字大家都很熟悉&#xff0c;指纹浏览器就变得陌生起来。之前东哥也跟大家分享过很多次指纹浏览器的用法&#xff0c;鉴于还是很多人不认识这个好用的工具&#xff0c;东哥今天就来详细给大…...

机器学习概述

机器学习是人工智能的核心研究领域之一&#xff0c;其研究动机是为了让计算机系统具有人的学习能力以便实现人工智能。目前被广泛采用的机器学习的定义是“利用经验来改善计算机系统自身的性能”。由于“经验在计算机系统中主要是以数据的形式存在的&#xff0c;因此机器学习需…...

企业网站自动生成系统的设计和实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着Internet技术的发展&#xff0c;人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于数字技术的发展&#xff0c;越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势&…...

sikuli+eclipse对于安卓app自动化测试的应用

Sikuli是什么&#xff1f; 下面是来自于官网的介绍&#xff1a;Sikuli is a visual technology to automate and test graphical user interfaces (GUI) using images (screenshots). Sikuli includes Sikuli Script, a visual scripting API for Jython, and Sikuli IDE, an …...

react源码分析:babel如何解析jsx

同作为MVVM框架&#xff0c;React相比于Vue来讲&#xff0c;上手更需要JavaScript功底深厚一些&#xff0c;本系列将阅读React相关源码&#xff0c;从jsx -> VDom -> RDOM等一些列的过程&#xff0c;将会在本系列中一一讲解 工欲善其事&#xff0c;必先利其器 经过多年的…...

搜广推 WideDeep 与 DeepCrossNetwork (DCN) - 记忆+泛化共存

😄 这节来讲讲Wide&Deep与Deep&CrossNetwork (DCN)。从下图可看出WD非常重要,后面衍生出了一堆WD的变体。本节要讲的WD和DCN结构都非常简单,但其设计思想值得学习。 🚀 wide&deep:2016年,谷歌提出。 🚀 Deep&CrossNetwork (DCN):2017年,谷歌和斯坦…...

项目管理工具dhtmlxGantt甘特图入门教程(十四):导出/导入 Excel到 iCal

这篇文章给大家讲解利用dhtmlxgantt导入/导出Excel到iCal的操作方法。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun&#xff1b;765665…...

k-means聚类总结

1.概述 聚类算法又叫做‘无监督学习’&#xff0c;其目的是将数据划分成有意义或有用的组&#xff08;或簇&#xff09;。 2.KMeans 关键概念&#xff1a;簇与质心 KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇&#xff0c;直观上来看是簇是一组一组聚集在一起的…...

char * 和const char *的区别

一、含义的不同 char* 表示一个指针变量&#xff0c;并且这个变量是可以被改变的。 const char*表示一个限定不会被改变的指针变量。 二、模式的不同 char*是常量指针&#xff0c;地址不可以改变&#xff0c;但是指针的值可变。 const char*是指向常量的常量指针&#xff…...

【剑指offer】JZ3 数组中重复的数字、 JZ4 二维数组中的查找

目录 JZ3 数组中重复的数字 思路&#xff1a; 解题步骤&#xff1a; JZ4 二维数组中的查找 思路 JZ3 数组中重复的数字 描述&#xff1a; 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的&#xff0c;但不知道有几个数字是重复的。也不知道每…...

数据采集 - 笔记

1 redis GitHub - redis/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps. Redis 通常被称为数…...

北京专业做网站推广/百度导航如何设置公司地址

索引是对数据库中的一列或多列进行排序的一种数据结构&#xff1b;下面通过单列索引和多列索引分析什么场景下可以走到索引&#xff0c;什么情况下又不会走到索引在进行查询时&#xff0c;索引列不能是表达式的一部分&#xff0c;也不能是函数的参数&#xff0c;否则无法使用索…...

检测网站开发/免费下载百度并安装

MOV$ 字符串传关指令这个指令只需要指定源字、第一个目标字勇哥很奇怪它怎么知道我传送多少个字符串&#xff1f;经过实验&#xff0c;我发现它是由源字开始&#xff0c;一直传送到0结束的字符串。也就是0做为要传送字符串的结束符。下面我截了内存区的图像&#xff0c;各位一…...

专业响应式网站制作/百度的链接

1.ctrlaltt, 打开一个终端。 2.使用组合键 ctrlshiftt , 这时就在同一个窗口中打开了另一个终端&#xff0c;当然再按一次ctrlshiftt&#xff0c;会再生成一个&#xff0c;需要多少了大家可以自行决定。 3.按组合键Alt1&#xff0c;就会切换到第一个终端&#xff0c;按Alt2&a…...

维护一个网站要多少钱/安新seo优化排名网站

php修改文件内容的方法&#xff1a;首先通过file_put_contents函数写入文件&#xff1b;然后使fwrite配合fopen进行写入并修改的操作&#xff1b;最后通过file_exists等函数检测文件属性即可。file_put_contents写入文件我们先来学习第一种写入文件的方式&#xff1a;int file_…...

延安网站建设公司电话/现在推广引流什么平台比较火

android-ui该项目已经停止维护&#xff0c;请移步到这里帮助快速开发android&#xff0c;项目集成6.0权限申请&#xff0c;常用dialog&#xff0c;本地图片选择等...项目部分引用第三方开源库&#xff0c;感谢开源项目正在不断有空更新&#xff0c; 别急&#xff0c;先star吧..…...

aps网站服务建设/如何创建一个app

本文主要介绍如何利用F1V3.0中的地图模块搭建一个GIS相关的应用&#xff08;需要有地图作为背景数据&#xff09;。...