Kubenetes基础学习
Kubenetes基础学习
- 一:K8s概念
- 二:k8s学习目的
- 三:组件说明
- 四:Pod概念
- 控制器的类型
- HPA(Horuzibtal Pod Autosacling)
- StatefulSet
- DaemonSet
- Job
- 服务发现
- 五:网络发现
- Overlay Network扁平化网络
- 六:资源清单
- 6.1 k8s中的资源
- 6.1.1 命名空间级别
- 6.1.2 集群级别资源
- 6.1.3 元数据资源
- 6.2 资源清单
- 6.3 常见字段解释说明
- 6.3.1 必须存在的属性
- 6.3.2 主要对象,没有设置的话使用默认值
- 6.4容器生命周期
- 6.5 探针
- 6.5.1 探针方式
- 6.5.2测试
- 6.6 启动、退出动作
- 6.7 Pod各个状态存在的可能值
- 7 控制器
- 7.1 什么是控制器
- 7.2 控制器类型
- 7.2.1 RC和RS
- 7.2.2 Deployment
- 7.2.3 DaemonSet
- 7.2.4 Job
- 7.2.5CronJob
- 7.2.6 statefulset有状态服务
- 7.2.7 HPA (Horizontal Pod Autoscaling)
- 7.3 各个控制器的使用
- 7.3.1 RS与RC与Deployment的关联
- 7.3.2 DaemonSet
- 7.3.3 Job
- 7.3.4 CronJob
- 8 Service (SVC)
- 8.1 Service的概念
- 8.2 代理
- 8.3 ClusterIP
- 8.3.1 测试
- 8.4 NodePort
- 8.5 Ingress
- 8.5.1 IngressHTTPS 代理访问
- 8.5.2 Nginx进行BasicAuth
- 8.5.3 Nginx进行重写
- 9 ConfigMap
- 9.1 ConfigMap在Pod中的使用
- 9.2 用ConfigMap设置命令行参数
- 10 Secret
- 11 Volume
- 11.1emptyDir
- 11.2 hostPath
- 12 PV
- 12.1 PV访问模式
一:K8s概念
二:k8s学习目的
- 什么是pod
- 控制器类型
- k8s网络通信模式
- 搭建k8s集群
- 资源清单:资源 掌握资源清单的语法,编写pod 。掌握pod的全生命周期
- pod控制器:掌握各种控制器的特点以及使用定义方式
- 服务发现:掌握svc原理及其构建方式
- 存储:掌握多种存储类型的特点,并且能够在不同环境中选择合数的存储方案
- 调度器:掌握调度器原理,能够根据要求把pod调度到制定的node
- 安全:集群的认证、鉴权、访问控制、原理及其流程
- helm:linux yum掌握helm原理, helm末班自定义、helm不熟一些常用的插件
- 运维:修改kubeadm达到证书可用期限为10年,能够构建高可用k8s集群
服务分类
* 有状态服务:DBMS数据库管理
* 无状态服务:Nginx。
三:组件说明
高可用最好为3、5节点
- apuserver:所有服务访问同一入口
- ControllerManager:位置副本数期望说明
- Schedule:负责介绍人物,选择合适的节点进行分配任务
- etcd:键值对数据库,存储k8s集群所有重要的信息(持久化)
- kubelet:直接跟容器引擎交互实现容器的生命周期
- kube-proxy:负责写入规则至iptables、ipvs实现服务映射访问的
- coredns:可以为集群中的svc创建一个域名ip的对应关系接续
- dashboard 给k8s集群提供一个b/s结构访问体系
- Ingress Controller:官方只能实现四层代码,ingress可以实现七层代理
- federation:提供一个可以跨集群中心多k8s同一管理功能
- prometheus:提供k8s集群的监控能力
- elk:提供k8s集群日志统一分析介入平台
四:Pod概念
- 自主式 pod
- 控制器管理的pod
控制器的类型
- replicationController:用来确保容器应用的副本数始终保持在用户定义的副本数,如果有容器异常时,会自动创建新的
- ReplicaSet:新版k8s中,replicaSet取代ReplicationController,本质没有不同,replicaSet支持集合式selector
- Deployment:一般建议使用deployment管理replicaSet,这样无需担心跟其他机制不兼容问题(repicaSet不支持rolling-update,但deployment支持)
HPA(Horuzibtal Pod Autosacling)
在V1版本根据pod的cpu利用率扩容pod的数量,在vlalpha版本,支持根据内存和用户自定义的metric扩缩容
StatefulSet
是为了解决有状态服务的问题,对应的deployment和replicaSets是为了无状态服务而设计的,应用场景包括
- 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据库,基于pvc实现
- 稳定的网络标志,即pod重新调度后podName和HostName不变,基于Headless Service(即没有Cluster IP的service)实现
- 有序部署,有序扩展,即pod是有顺序的,
- 有序收缩,有序删除
DaemonSet
确保全部(或者一些)Node上运行一个pod的副本,随着Node的增加和删除,会同时新增和删除,用法
- 运行日志收集,fluentd
- 监控,
Job
Job负责批量执行任务,即仅执行一次的任务,他保证批量处理任务的一个或多个pod成功结束
Cron Job管理基于时间的Job即
- 在给定时间点只运行一次
- 周期性在给定时间点运行
服务发现
service
五:网络发现
同一pod内的多个容器内部通讯:同一个pod共享同一个网络命名空间,共享同一个linux协议栈,使用localhost访问
各pod之间的通信:Overlay Network
* pod1与pod2不在同一台主机,overlay network网络,使用flannel * pod1与pod2在同一台机器,由Docker0网桥直接转发请求到pod2,不需要使用flannel
Pod与service之间的通讯:各节点的IPtables规则
Pod到外网,Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主机网卡完成路由选择后,iptables执行masquerade,把源IP更代为宿主机网卡的IP,然后向外网服务器发送请求
外网访问Pod,service
Overlay Network扁平化网络
Flannel:是一个网络规划服务,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟Ip地址,而且它能够在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不同地传送到目标容器内
Etcd之Flannel提供说明
- 存储管理Flannel可分配的IP地址段资源
- 监控Etcd中每个Pod的实际地址,并在内存中建立维护pod节点路由表
六:资源清单
* k8s中资源
* 资源清单
* 常用字段解释说明
* 容器生命周期
6.1 k8s中的资源
资源分类:
命名空间级别:kubeadm k8s
集群级别:role
元数据型:HPA。通过指标分类
资源的概念:K8S中所有的内容都抽象为资源,资源实例化之后,叫做对象
6.1.1 命名空间级别
6.1.2 集群级别资源
Namespace Node Role ClusterRole RoleBinding、ClusterRoleBing
6.1.3 元数据资源
HPA、PodTemplate、LinitRange
6.2 资源清单
在k8s中,一般使用yaml格式的文件
- 不允许使用tab键,只允许使用空格
键值类型
age: 18
数组类型
animal
- cat
- Dog
复合类型,对象和数组可以结合使用
languages:
- Ruby
- Perl
websites:
YAML: yam,org
yaml文件中“~”代表空值
6.3 常见字段解释说明
6.3.1 必须存在的属性
6.3.2 主要对象,没有设置的话使用默认值
6.4容器生命周期
readiness:
Liveness:
- InitC
Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器
Init容器于普通的容器非常像,除了如下两点- Init容器总是运行到成功完成为止
- 每个Init容器都必须在下一个Init容器启动之前成功完成
如果pod的init容器失败,k8s会不断地重启该pod,知道Init容器成功为止,然后,如果pod对应的restartPolicy为Never,则不会重启。
测试:1
另外两个service,initC检测的service
6.5 探针
探针是有kubelet对容器执行的定期诊断,要执行诊断,kubelet调用有容器实现的Handler,有三种类型的处理程序
- ExecAction:在容器内执行制定命令,如果命令退出时返回码为0,则认为诊断成功
- TCPSocketAction:对制定端口上的容器的IP地址进行TCP检查,如果端口打开,则诊断为成功
- HTTPGetAction:对指定的端口和路径上的容器的IP地址执行HTTP执行Get请求,如果响应的非状态码大雨等于200且小于400,则成功
每次探针都将获取以下三种结果之一 - 成功,容器通过诊断
- 失败,未通过诊断
- 未知,诊断失败,因此不糊采取任何行动
6.5.1 探针方式
- livennessProbe:指示容器是否正在运行,如果存活探针失败,则kubelet会杀死容器,并且容器将会受到其“重启策略”的影响,如果容器不提供存活探针,则默认状态为success
- readinessProbe:只是容器是否准备好服务请求,如果就是探测失败,断点控制器将从Pod匹配的所有Service的断点中删除该Pod的IP地址,初始延迟之前的就绪状态默认为Failure,如果容器不提供就绪探针,则默认状态为Success
6.5.2测试
- 就绪探针
initialDelaySeconds:1 容器启动1s后开始检查
periodSeconds:3 每3秒检查一次
由于使用的是就绪探针,通过在myapp中没有index1.html文件,该pod的Status会是running,但Ready为非就绪
上述的pod的信息中,
READY:就绪探针检测后的值
STATUS:生存探针检测后的值
- 生存探针 exec
- 生存探针 http
timeoutSeconds:10 每次请求的超时时间
- 生存探针 tcp
6.6 启动、退出动作
Pod的生命周期中,Pod在启动的时候执行postStart里面的指令,Pod在死亡时执行preStop里面的指令
6.7 Pod各个状态存在的可能值
- Pending:挂起,Pod已被k8s系统接收,但有一个或多个容器镜像尚未创建,等待时间:包括调度pod的时间和通过网络下载镜像的时间,这可能需要花点时间
- Running:运行中,该Pod已经绑定到了一个节点上,Pod中所有的容器都已被创建,至少有一个容器正在运行,或者正处于启动或重启状态
- Succeeded:成功,pod中的所有容器都被成功终止,且不会重启
- Failed:Pod中的所有的容器都已被终止,并且至少有一个容器是因为失败终止,也就是说,容器以非0状态退出或被系统终止
- Unknown:未知,因为某些原因无法获取Pod的状态,通常是因为Pod所在主机通讯失败
7 控制器
Pod的分类:
- 自主式Pod,Pod退出了,此类型的Pod不会被创建
- 控制器管理的Pod,在控制器的生命周期里,始终要维持Pod的副本数目
7.1 什么是控制器
k8s中内建立了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为
7.2 控制器类型
- ReplicationController 和ReplicaSet
- Deployment
- DaemonSet
- StateFulSet
- Job/CronJob
- Horizontal Pod Autoscalling
7.2.1 RC和RS
- RC:用来确保容器应用的副本说始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代,而如果异常多出来的容器也会自动回收
- RS:在新版k8s中建议使用RS取代RC,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的selector
7.2.2 Deployment
Deployment为pod和ReplicaSet提供一个声明式定义方法,用来替代以前的RC来方便的管理应用,典型的应用场景包括:
- 定义Deployment来创建Pod和Replicaset,示意图如下
- 滚动升级和回滚应用,通过执行新增的RS,来实现;deployment特有
- 扩容和缩容
- 暂停和继续Deployment
7.2.3 DaemonSet
7.2.4 Job
job负责批量处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束
7.2.5CronJob
在特定的时间循环创建Job,
CronJob管理基于时间的Job,
- 在给定时间只运行一次,
- 周期性地在给定时间点运行
典型的用法 - 在给定的时间点调度job运行
- 创建周期性运行的job,例如数据库备份、发送邮件
7.2.6 statefulset有状态服务
7.2.7 HPA (Horizontal Pod Autoscaling)
应用的资源使用率通常都有高峰和低谷的时候,如何削峰削谷,提高集群整体资源利用率,让service中的Pod个数自动调整?这就是HPA的左右,可根据内存的占比使pod水平自动缩放
概念补充
命令式编程:它侧重于如果实现程序,需要把程序实现的过程按照逻辑结果一步步写下来
声明式编程:它侧重于定义要想什么,然后告诉计算机、引擎,让他去实现
7.3 各个控制器的使用
7.3.1 RS与RC与Deployment的关联
- RC(ReplicationController)主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收Kubernetes官方建议使用RS(ReplicaSet)替代RC(ReplicationController)进行部署,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的selector。
- RS和Deployment的关联
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。
典型的应用场景包括:
定义Deployment来创建Pod和ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续Deployment - 案例
创建deployment会同时创建RS
- deployment 扩容
kubectl scale deployment nginx-deployment --replicas10 - 更新
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 - 回滚
kubectl rollout undo deployment/nginx-deployment - 查看回滚的状态
kubectl rollout status deployments - 查看回滚历史
kubectl rollout history deployment/ - 可以使用 --version参数制定某个历史版本
kubectl rollout undo deployment/ --to-revision=1
- kubectl rollout pause deployment/nginx-deployment ## 暂停deployment的更新
- 使用kubectl rollout status 查看deployment滚动是否成功,如果成功返回值为0
7.3.2 DaemonSet
7.3.3 Job
7.3.4 CronJob
8 Service (SVC)
8.1 Service的概念
k8s中定义了这样的一种抽象,一个Pod的逻辑分组,一种可以访问他们的策略----通过称为微服务,这一组Pod能够被service访问到,通常是通过 Label Selector选择
Service能够提供负载均衡的能力,但是在使用上有以下限制:
只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的
Service在K8S中的四种类型
- clusterIP:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
- NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过: NodePort来访问该服务
- LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到: NodePort
主要是使用云供应商实现负载均衡
- ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的kube-dns才支持
SVC的实现流程
8.2 代理
VIP和Service代理
- userspace代理
- iptables
- ipvs
8.3 ClusterIP
clusterIP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口
为了实现图上的功能,主要需要以下几个组件的协同工作:
- apiserver用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
- kube-proxy kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中
- iptables使用NAT等技术将virtualIP的流量转至endpoint中
8.3.1 测试
deployment.yaml
8.4 NodePort
nodePort的原理在于在node上开了一个端口,将向该端口的流量导入到kube-proxy,然后由kube-proxy进一步到给对应的pod.
会在每一个node节点都暴露端口
8.5 Ingress
域名访问,一般使用的是ingrass-nginx
8.5.1 IngressHTTPS 代理访问
创建证书,以及cert存储方式
8.5.2 Nginx进行BasicAuth
8.5.3 Nginx进行重写
9 ConfigMap
ConfigMap功能在Kubernetes1.2版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象.
- 文件目录创建
- 使用文件创建
只要指定为一个文件就可以从单个文件中创建ConfigMap
kubectl create configmap game-config-2 --from-file=docs/guide/configmap/kubectl/game.properties - 使用字面值创建
kubectl create configmap special-map --from-literal=name=www --from-literal=age=12
9.1 ConfigMap在Pod中的使用
创建pod
9.2 用ConfigMap设置命令行参数
10 Secret
Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。
Secret可以以Volume或者环境变量的方式使用。
- Service Account
- Opaque Secret
创建说明
Opaque类型的数据是一个map类型,要求value是base64编码格式:
secret.yaml
使用方式
1、将Secret挂载到Volume中
2、将Secret导出到环境变量中
如果在镜像仓库中拉取镜像需要密码时,可以先创建docker registry认证的secret,然后再创建pod的yaml指定imagePullSecrets。达到不需要密码的效果
11 Volume
11.1emptyDir
emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除。
容器崩溃不会从节点中移除pod,因此emptydir卷中的数据在容器崩溃时是安全的
临时存储,
#在master上编写emptyDir资源清单
[root@ubuntu-200 ~]# cat volume-emptyDir.yaml
apiVersion: v1
kind: Pod
metadata:name: emptydir-pod #注意此处只能是小写字母或数字,大写字母会报错
spec:containers:- name: nginx-testimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}#创建pod
[root@ubuntu-200 ~]# kubectl apply -f volume-emptyDir.yaml#查看Pod
[root@ubuntu-200 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
emptydir-pod 1/1 Running 0 17s 10.244.2.62 ubuntu-210 <none> <none>#进入容器并在容器中创建文件测试
[root@ubuntu-200 ~]# kubectl exec -it emptydir-pod -- bash
root@emptydir-pod:/# ls -l /cache/
total 0
root@emptydir-pod:/cache# touch /cache/nginx-emptydir.log
root@emptydir-pod:/cache# echo nginx-emptydir > /cache/nginx-emptydir.log
root@emptydir-pod:/cache# cat /cache/nginx-emptydir.log
nginx-emptydir#在node节点上查找临时存储的文件位置
[root@ubuntu-210 ~]# find / -name nginx-emptydir.log
/var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log#查看文件内容
[root@ubuntu-210 ~]# cat /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log
nginx-emptydir#在master节点上删除pod
[root@ubuntu-200 ~]# kubectl delete -f volume-emptyDir.yaml
pod "emptydir-pod" deleted#在node节点上查看临时存储是否还存在
[root@ubuntu-210 ~]# cat /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log
cat: /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log: No such file or directory
[root@ubuntu-210 ~]# ll /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/
ls: cannot access '/var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/': No such file or directory
11.2 hostPath
hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中
hostPath的用途如下:
- 运行需要访问Docker内部的容器;使用/var/lib/docker的hostPath
- 在容器中运行cAdvisor;使用/dev/cgroups的hostPath
- 允许pod指定给定的hostPath是否应该在pod运行之前存在,是否应该创建,以及它应该以什么形式存在
使用这种卷类型是请注意,因为: - 由于每个节点上的文件都不同,具有相同配置(例如从podTemplate创建的)的pod在不同节点上的行为可能会有所不同
- 当Kubernetes按照计划添加资源感知调度时,将无法考虑hostPath使用的资源
- 在底层主机上创建的文件或目录只能由root写入。您需要在特权容器中以root身份运行进程,或修改主机上的文件权限以便写入hostPath卷
12 PV
pod消失,pv不会因为pod删除而删除,pvc消耗pv资源
12.1 PV访问模式
Kubenetes基础学习相关推荐
- 【转】oracle PLSQL基础学习
[转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...
- python创建对象的格式为_Python入门基础学习(面向对象)
python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...
- 虚幻引擎虚拟现实开发基础学习教程
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...
- 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals
如何分类--动画产业基础 大小解压后:6.2G 含课程素材 1920X1080 mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 绘画技巧.解剖学.角色设计.透视和整体讲故事--这门 ...
- Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender
Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Funda ...
- ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course
ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语+中英文字幕(机译)时长 ...
- 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?
原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...
- 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...
2019 年计算机一级考试 PS 基础学习点子: PS 菜单中英文对照表 PS菜单中英文对照表 一.File New 2.Open 3.Open As 4.Open Recent Close 6.Sa ...
- Java零基础学习难吗
java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...
最新文章
- 在写游戏时钟类时,应确保时钟的计算是以某个固定的CPU为标准的
- markdown 创建表格
- 【云上ELK系列】Logstash迁移Elasticsearch数据方法解读
- ubuntu16 php mysql_Ubuntu16.04 搭建 LAMP(Ubuntu16.04 、apache 2.4.18、MySQL 5.7.22、PHP 7.0.28)...
- python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?
- 简述isodata算法的原理_算法常见面试题汇总(一):概率论与数理统计部分
- PC版微信,也终于上线了这个超赞的功能
- C++ 中 async、packaged_task、promise 区别及使用
- 详介 MQTT 服务器的搭建与客户端连接
- R,L,C,t物理量之间的量纲关系
- 剑指Offer面试题11(Java版):数值的整数次方
- Redis主从, 哨兵, Lettuce(二)
- MacOS安装brew安装git安装sdkman安装sbt
- 进口计算机软件,关于软件进口报关手续及流程介绍【进口知识】
- Spark:解析CSV文件并按列值分组
- 自动连接 无法连接网络连接服务器,微信提示无法连接到服务器怎么办?微信无法连接服务器怎么解决?...
- 细菌觅食算法BFOA
- Python爬音乐--qq
- c语言漂亮的壁纸编码,怎么用c语言写一个设定壁纸的demo?
- 数据资产管理实践白皮书(6.0版)解读
热门文章
- 监控数据从哪来?(入门篇)
- 新基建专题报告:未来发展方向及重点产业分析
- 华为IRF之分布式链路聚合
- mac电脑真正好用且实用的软件(不断积累)
- Improving Multispectral Pedestrian Detection by Addressing Modality Imbalance Problems(2020)文献解读
- java计算机毕业设计飞羽羽毛球馆管理系统MyBatis+系统+LW文档+源码+调试部署
- ArcGIS API for Silverlight开发入门
- Spring boot 集成ip2region.xdb,在jar包中的使用
- Ebay是扇窗,几度风雨,依旧好风光!
- 残酷的真实 - 罗曼蒂克消亡史