2.5、部署Master节点

(1)生成预处理文件

在master节点执行如下指令:

[root@master1 ~]# kubeadm config print init-defaults > kubeadm-init.yaml

这个文件kubeadm-init.yaml,是我们初始化使用的文件,里面大概修改这几项参数。

[root@master1 ~]# cat kubeadm-init.yaml apiVersion: kubeadm.k8s.io/v1beta2bootstrapTokens:- groups:  - system:bootstrappers:kubeadm:default-node-token  token: abcdef.0123456789abcdef  ttl: 24h0m0s  usages:  - signing  - authenticationkind: InitConfigurationlocalAPIEndpoint:  advertiseAddress: 192.168.50.100      #VIP的地址  bindPort:  6443nodeRegistration:  criSocket: /var/run/dockershim.sock  name: master1  taints:  - effect: NoSchedule    key: node-role.kubernetes.io/master---apiServer:            #添加如下两行信息  certSANs:  - "192.168.50.100"         #VIP地址  timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns:  type: CoreDNSetcd:  local:    dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers   #阿里云的镜像站点controlPlaneEndpoint: "192.168.50.100:8443"    #VIP的地址和端口kind: ClusterConfigurationkubernetesVersion: v1.18.3        #kubernetes版本号networking:  dnsDomain: cluster.local   serviceSubnet: 10.96.0.0/12       #选择默认即可,当然也可以自定义CIDR  podSubnet: 10.244.0.0/16        #添加pod网段scheduler: {}

**注意:**上面的advertiseAddress字段的值,这个值并非当前主机的网卡地址,而是高可用集群的VIP的地址。

**注意:**上面的controlPlaneEndpoint这里填写的是VIP的地址,而端口则是haproxy服务的8443端口,也就是我们在haproxy里面配置的这段信息。

frontend k8s-master  bind 0.0.0.0:8443  bind 127.0.0.1:8443  mode tcp

这一段里面的8443端,如果你自定义了其他端口,这里请记得修改controlPlaneEndpoint里面的端口。

(2)提前拉取镜像

如果直接采用kubeadm init来初始化,中间会有系统自动拉取镜像的这一步骤,这是比较慢的,我建议分开来做,所以这里就先提前拉取镜像。

[root@master1 ~]# kubeadm config images pull --config kubeadm-init.yaml[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.0[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.0[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.18.0[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.1[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.4.3-0[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:1.6.5

如果大家看到开头的两行warning信息(我这里没有打印),不必担心,这只是警告,不影响我们完成实验。

其他master节点提前拉取镜像

其他两个master节点在初始化之前也尽量先把镜像拉取下来,这样子减少初始化时间

[root@master1 ~]# scp kubeadm-init.yaml root@master2:~[root@master1 ~]# scp kubeadm-init.yaml root@master3:~

master2节点

# 注意在master2节点执行如下命令[root@master2 ~]# kubeadm config images pull --config kubeadm-init.yaml

master3节点

# 注意在master3节点执行如下命令[root@master3 ~]# kubeadm config images pull --config kubeadm-init.yaml

(3)初始化kubenetes的master1节点

执行如下命令

[root@master1 ~]# kubeadm init --config kubeadm-init.yaml --upload-certs[init] Using Kubernetes version: v1.18.3[preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/[preflight] Pulling images required for setting up a Kubernetes cluster[preflight] This might take a minute or two, depending on the speed of your internet connection[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"[certs] apiserver serving cert is signed for DNS names [master1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.50.128 192.168.50.100]...           # 省略[upload-certs] Skipping phase. Please see --upload-certs[mark-control-plane] Marking the node master1 as control-plane by adding the label "node-role.kubernetes.io/master=''"[mark-control-plane] Marking the node master1 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule][addons] Applied essential addon: CoreDNS[endpoint] WARNING: port specified in controlPlaneEndpoint overrides bindPort in the controlplane address[addons] Applied essential addon: kube-proxyYour Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:  mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:  https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of control-plane nodes by copying certificate authoritiesand service account keys on each node and then running the following as root:  kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648     --control-plane --certificate-key 4931f39d3f53351cb6966a9dcc53cb5cbd2364c6d5b83e50e258c81fbec69539 Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648

这个过程大概30s的时间就做完了,之所以初始化的这么快就是因为我们提前拉取了镜像。像我上面这样的没有报错信息,并且显示上面的最后10行类似的信息这些,说明我们的master1节点是初始化成功的。

在使用集群之前还需要做些收尾工作,在master1节点执行:

[root@master1 ~]# mkdir -p $HOME/.kube[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

再配置一下环境变量

[root@master1 ~]# cat >> ~/.bashrc <

好了,此时的master1节点就算是初始化完毕了。

有个重要的点就是最后几行信息中,其中有两条kubeadm join 192.168.50.100:8443 开头的信息。 这分别是其他master节点和node节点加入kubernetes集群的认证命令。这个密钥是系统根据 sha256算法计算出来的,必须持有这样的密钥才可以加入当前的kubernetes集群。

使用区别

这两条加入集群的命令是有一些区别的:

比如这个第一条,我们看到最后有一行内容--control-plane --certificate-key xxxx,这是控制节点加入集群的命令,控制节点是kubernetes官方的说法,其实在我们这里指的就是其他的master节点。

kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648     --control-plane --certificate-key 4931f39d3f53351cb6966a9dcc53cb5cbd2364c6d5b83e50e258c81fbec69539

而最后一条就表示node节点加入集群的命令,比如:

kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648

所以这两个节点使用时要看清楚是什么类型的节点加入集群的。

查看节点

如果此时查看当前集群的节点,会发现只有master1节点自己。

[root@master1 ~]# kubectl get nodeNAME      STATUS     ROLES    AGE     VERSIONmaster1   NotReady   master   9m58s   v1.18.4

接下来我们把其他两个master节点加入到kubernetes集群中

2.6、其他master节点加入kubernetes集群中

(1)master2节点加入集群

既然是其他的master节点加入集群,那肯定是使用如下命令:

[root@master2 ~]#  kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef      --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648      --control-plane --certificate-key 4931f39d3f53351cb6966a9dcc53cb5cbd2364c6d5b83e50e258c81fbec69539[preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The ......                                  #省略若干[mark-control-plane] Marking the node master2 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]This node has joined the cluster and a new control plane instance was created:To start administering your cluster from this node, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configRun 'kubectl get nodes' to see this node join the cluster.

看上去没有报错,说明加入集群成功,现在再执行一些收尾工作

[root@master2 ~]# mkdir -p $HOME/.kube[root@master2 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master2 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

加环境变量

[root@master2 ~]# cat >> ~/.bashrc <

(2)master3节点加入集群

[root@master3 ~]#  kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef      --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648      --control-plane --certificate-key 4931f39d3f53351cb6966a9dcc53cb5cbd2364c6d5b83e50e258c81fbec69539

做一些收尾工作

[root@master3 ~]# mkdir -p $HOME/.kube[root@master3 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master3 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config[root@master3 ~]# cat >> ~/.bashrc <

到此,所有的master节点都已经加入集群

查看集群master节点

[root@master1 ~]# kubectl get nodeNAME      STATUS     ROLES    AGE     VERSIONmaster1   NotReady   master   25m     v1.18.4master2   NotReady   master   12m     v1.18.4master3   NotReady   master   3m30s   v1.18.4

你可以在任意一个master节点上执行kubectl get node查看集群节点的命令。

2.7、node节点加入kubernetes集群中

正如我们上面所说的,master1节点初始化完成后,第二条kubeadm join xxx(或者说是最后一行内容)内容便是node节点加入集群的命令。

~]# kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648

注意:node节点加入集群只需要执行上面的一条命令即可,只要没有报错就表示成功。不必像master一样做最后的加入环境变量等收尾工作。

(1)node1节点加入集群

[root@node1 ~]# kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef >     --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648[preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/[preflight] Reading configuration from the cluster...........[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Starting the kubelet[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

当看到倒数第四行内容This node has joined the cluster,这一行信息表示node1节点加入集群成功。

(2)node2节点加入集群

[root@node2 ~]# kubeadm join 192.168.50.100:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:4c738bc8e2684c5d52d80687d48925613b66ab660403649145eb668d71d85648

(3)查看集群节点信息

此时我们可以在任意一个master节点执行如下命令查看此集群的节点信息。

[root@master1 ~]# kubectl get nodesNAME      STATUS     ROLES    AGE     VERSIONmaster1   NotReady   master   20h     v1.18.4master2   NotReady   master   20h     v1.18.4master3   NotReady   master   20h     v1.18.4node1     NotReady      5m15s   v1.18.4node2     NotReady      5m11s   v1.18.4

可以看到集群的五个节点都已经存在,但是现在还不能用,也就是说现在集群节点是不可用的,原因在于上面的第2个字段,我们看到五个节点都是``NotReady`状态,这是因为我们还没有安装网络插件。

网络插件有calico,flannel等插件,这里我们选择使用flannel插件。

2.8、安装网络插件

(1)默认方法

默认大家从网上看的教程都会使用这个命令来初始化。

~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

事实上很多用户都不能成功,因为国内网络受限,所以可以这样子来做。

(2)更换flannel镜像源

master1节点上修改本地的hosts文件添加如下内容以便解析

199.232.28.133  raw.githubusercontent.com

然后下载flannel文件

[root@master1 ~]# curl -o kube-flannel.yml   https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

编辑镜像源,默认的镜像地址我们修改一下。把yaml文件中所有的quay.io修改为 quay-mirror.qiniu.com

[root@master1 ~]# sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml

此时保存保存退出。在master节点执行此命令。

[root@master1 ~]# kubectl apply -f kube-flannel.yml podsecuritypolicy.policy/psp.flannel.unprivileged createdclusterrole.rbac.authorization.k8s.io/flannel createdclusterrolebinding.rbac.authorization.k8s.io/flannel createdserviceaccount/flannel createdconfigmap/kube-flannel-cfg createddaemonset.apps/kube-flannel-ds-amd64 createddaemonset.apps/kube-flannel-ds-arm64 createddaemonset.apps/kube-flannel-ds-arm createddaemonset.apps/kube-flannel-ds-ppc64le createddaemonset.apps/kube-flannel-ds-s390x created

这样子就可以成功拉取flannel镜像了。当然你也可以使用我提供给大家的kube-flannel.yml文件

查看flannel是否正常

如果你想查看flannel这些pod运行是否正常,使用如下命令

[root@master1 ~]# kubectl get pods -n kube-system | grep flannelNAME                              READY   STATUS    RESTARTS   AGEkube-flannel-ds-amd64-dp972       1/1     Running   0          66skube-flannel-ds-amd64-lkspx       1/1     Running   0          66skube-flannel-ds-amd64-rmsdk       1/1     Running   0          66skube-flannel-ds-amd64-wp668       1/1     Running   0          66skube-flannel-ds-amd64-zkrwh       1/1     Running   0          66s

如果第三字段STATUS不是处于Running状态的话,说明flannel是异常的,需要排查问题所在。

查看节点是否为Ready

稍等片刻,执行如下指令查看节点是否可用

[root@master1 ~]# kubectl get nodesNAME      STATUS   ROLES    AGE   VERSIONmaster1   Ready    master   21h   v1.18.4master2   Ready    master   21h   v1.18.4master3   Ready    master   21h   v1.18.4node1     Ready       62m   v1.18.4node2     Ready       62m   v1.18.4

目前节点状态是Ready,表示集群节点现在是可用的

3、测试kubernetes集群

3.1、kubernetes集群测试

(1)创建一个nginx的pod

现在我们在kubernetes集群中创建一个nginx的pod,验证是否能正常运行。

在master节点执行一下步骤:

[root@master1 ~]# kubectl create deployment nginx --image=nginxdeployment.apps/nginx created[root@master1 ~]# kubectl expose deployment nginx --port=80 --type=NodePortservice/nginx exposed

现在我们查看pod和service

[root@master1 ~]# kubectl get pod,svc -o wide

打印的结果中,前半部分是pod相关信息,后半部分是service相关信息。我们看service/nginx这一行可以看出service暴漏给集群的端口是30249。记住这个端口。

然后从pod的详细信息可以看出此时pod在node2节点之上。node2节点的IP地址是192.168.50.132

(2)访问nginx验证集群

那现在我们访问一下。打开浏览器(建议火狐浏览器),访问地址就是:http://192.168.50.132:30249

3.2、安装dashboard

(1)创建dashboard

先把dashboard的配置文件下载下来。由于我们之前已经添加了hosts解析,因此可以下载。

[root@master1 ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

大概在此文件的32-44行之间,修改为如下:

kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kube-systemspec:  type: NodePort       #加上此行  ports:    - port: 443      targetPort: 8443      nodePort: 30001     #加上此行,端口30001可以自行定义  selector:    k8s-app: kubernetes-dashboard

运行此yaml文件

[root@master1 ~]# kubectl apply -f recommended.yaml namespace/kubernetes-dashboard createdserviceaccount/kubernetes-dashboard createdservice/kubernetes-dashboard createdsecret/kubernetes-dashboard-certs created...service/dashboard-metrics-scraper createddeployment.apps/dashboard-metrics-scraper created

查看dashboard运行是否正常

[root@master1 ~]# kubectl get pods -n kubernetes-dashboardNAME                                         READY   STATUS    RESTARTS   AGEdashboard-metrics-scraper-694557449d-mlnl4   1/1     Running   0          2m31skubernetes-dashboard-9774cc786-ccvcf         1/1     Running   0          2m31s

主要是看status这一列的值,如果是Running,并且RESTARTS字段的值为0(只要这个值不是一直在渐渐变大),就是正常的,目前来看是没有问题的。我们可以继续下一步。

查看此dashboard的pod运行所在的节点

从上面可以看出,kubernetes-dashboard-9774cc786-ccvcf运行所在的节点是node2上面,并且暴漏出来的端口是30001,所以访问地址是:https://192.168.50.132:30001

用火狐浏览器访问,访问的时候会让输入token,从此处可以查看到token的值。

[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

把上面的token值输入进去即可进去dashboard界面。

不过现在我们虽然可以登陆上去,但是我们权限不够还查看不了集群信息,因为我们还没有绑定集群角色,同学们可以先按照上面的尝试一下,再来做下面的步骤

(2)cluster-admin管理员角色绑定

[root@master1 ~]# kubectl create serviceaccount dashboard-admin -n kube-system[root@master1 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

再使用输出的token登陆dashboard即可。

报错

(1)其他master节点无法加入集群

[check-etcd] Checking that the etcd cluster is healthyerror execution phase check-etcd: error syncing endpoints with etc: context deadline exceededTo see the stack trace of this error execute with --v=5 or higher

查看集群的高可用配置是否有问题,比如keepalived的配置中,主备,优先级是否都配置好了。

master节点重置后添加node报错_kubeadm高可用master节点(三主两从)2相关推荐

  1. master节点重置后添加node报错_企业实战(23)基于Docker平台的Jenkins添加node节点与报错详解(2)...

    相关文章  企业实战(23)基于Docker平台部署Jenkins中国定制版(1) 添加node节点前配置 在这里插入图片描述 在这里插入图片描述 开始添加node节点 在这里插入图片描述 在这里插入 ...

  2. master节点重置后添加node报错_土豆SUPER通过Node-Red接入HASS和Homekit

    土豆SUPER通过Node-Red接入HASS和Homekit 最近研究home-assistant(以下简称HASS)上了瘾,将小米全家桶基本都实现接入了.家里刚装了土豆SUPER新风机,很优秀的产 ...

  3. master节点重置后添加node报错_超强教程!在树莓派上构建多节点K8S集群!

    在很长一段时间里,我对于在树莓派上搭建Kubernetes集群极为感兴趣.在网络上找到一些教程并且跟着实操,我已经能够将Kubernetes安装在树莓派上,并在三个Pi集群中工作.然而,在master ...

  4. Worker节点加入K8S集群报错:error execution phase preflight: couldn‘t validate the identity of the API Server

    问题描述 在使用kubeadm的join命令,想要将Worker节点加入到K8S集群,命令如下: kubeadm join cluster-endpoint:6443 --token x5g4uy.w ...

  5. VS +QT 手动添加Q_OBJECT 报错问题解决

    VS+QT 手动添加Q_OBJECT 报错问题解决 参考QT Ide上,需要重新Qmake 在vs上,手动添加Q_OBJECT,后moc_XXX文件也生成,但是编译却失败,出现无法打开moc_xxx ...

  6. Clickhouse彻底删除表, drop表后重新创建报错,Code: 342, Existing table metadata in ZooKeeper differs in primary key

    Clickhouse彻底删除表, drop表后重新创建报错,Code: 342, Existing table metadata in ZooKeeper differs in primary key ...

  7. 安装WPS后office出现报错的情况

    安装WPS后office出现报错的情况 如:Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效.请确定文件未损坏,并且文件扩展名与文件的格式匹配 转载自:https://www.dr ...

  8. VS CODE JSON添加注释报错 为JSON添加注释

    问题描述 在json文件中添加注释后,大面积报错. 解决方案 1.选择JSON 2.选择JSON with Comments后,错误消失

  9. 关于Access数据库执行Update语句后,不报错,但影响行数总是返回0的问题

    最近碰到一个奇怪的问题,使用Access数据库执行Update语句后,不报错,但影响行数总是返回0. 因为是第一次碰到这个问题,纠结了半天.后来在网上搜索得到解决方案: SQL语句传参数的顺序和语句中 ...

最新文章

  1. 使用Feign时如何设置Feign的Header信息
  2. 总结】Android辅助功能(一)-AccessibilityEvent的分发
  3. Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)
  4. python如何绘制直线_python绘制直线的方法
  5. pom文件报错_maven-resources-plugin修改了我的文件
  6. css框架和js框架_优雅设计的顶级CSS框架
  7. mvc 扫描jar jsp_SpringBoot+jsp项目启动出现404
  8. 100层楼扔2个鸡蛋、3个鸡蛋……
  9. 机房收费系统合作版(二):透过显示上机人数品味如何做到全心全意为人民服务
  10. HDU3782 xxx定律【数学计算+水题】
  11. 关于EXCEL操作的问题
  12. Dem地形数据转换为cass支持的dat格式教程
  13. 快乐数-判断一个数字是否是快乐数
  14. java.lang.UnsatisfiedLinkError: /usr/local/java/jdk1.8.0_91/jre/lib/amd64/libawt_xawt.so: libXtst.so
  15. App开发之前的工作准备和开发中的一些流程
  16. 开环控制与闭环控制的简单笔记
  17. php批量获得经纬度,批量调用百度地图API获取地址经纬度坐标
  18. VINS-Mono之后端非线性优化 (目标函数中视觉残差和IMU残差,及其对状态量的雅克比矩阵、协方差递推方程的推导)
  19. 动词ing基本用法_(完整版)英语动词ing的用法
  20. 无聊猿宇宙之风进军国内市场会卷起巨浪吗?

热门文章

  1. 如何解决命令行编译运行Java文件时报错Could not find or load main class ...
  2. linux使用mv报资源或什忙,一天一个Linux命令(第6天mv命令)
  3. 【技术】DTEmpower核心功能技术揭秘(2) - AIOD智能异常点检测技术
  4. SAP License:GR/IR和暂估入库设计思路的简单对比
  5. 网页文章无法复制问题
  6. 设计需要满足用户更需要分析需求
  7. #systemverilog# $time,$stime,$realtime的使用
  8. python方差的计算公式_python计算均值方差
  9. 是p2p的测试用例_软件测试用例测试报告
  10. 最新Java学习路线,java入门到精通,Java自学者的福利