如何在kubernetes中配置Calico路由反射器

最后更新于:2021-02-17 23:31:20

1. 概述

作为Kubernetes最长使用的一种网络插件,Calico具有很强的扩展性,较优的资源利用和较少的依赖,相较于Flannel插件采用Overlay的网络,Calico可以通过三层路由的方式采用性能更佳的Underlay网络,Calico网络插件的转发效率是所有方案中最高的。

在使用Calico网络插件的实际生产环境当中,为了提高网络的性能和灵活性,需要将K8S的工作节点和物理网络中的leaf交换机建立bgp邻居关系,同步bgp路由信息,可以将pod网络的路由发布到物理网络中。Calico给出了三种类型的BGP互联方案,分别是Full-meshRoute reflectorsTop of Rack (ToR)

  • Full-mesh

全互联模式,启用了BGP之后,Calico的默认行为是在每个节点彼此对等的情况下创建完整的内部BGP(iBGP)连接,这使Calico可以在任何L2网络(无论是公有云还是私有云)上运行,或者说(如果配了IPIP)可以在任何不禁止IPIP流量的网络上作为overlay运行。对于vxlan overlay,Calico不使用BGP。

Full-mesh模式对于100个以内的工作节点或更少节点的中小规模部署非常有用,但是在较大的规模上,Full-mesh模式效率会降低,较大规模情况下,Calico官方建议使用Route reflectors。

  • Route reflectors

如果想构建内部BGP(iBGP)大规模集群,可以使用BGP路由反射器来减少每个节点上使用BGP对等体的数量。在此模型中,某些节点充当路由反射器,并配置为在它们之间建立完整的网格。然后,将其他节点配置为与这些路由反射器的子集(通常为冗余,通常为2个)进行对等,从而与全网格相比减少了BGP对等连接的总数。

  • Top of Rack(ToR)

在本地部署中,可以将Calico配置为直接与物理网络基础结构对等。通常,这需要涉及到禁用Calico的默认Full-mesh行为,将所有Calico节点与L3 ToR路由器对等。

本篇文章重点会介绍如何在BGP网络环境下配置Calico路由反射器,本篇主要介绍将K8S工作节点作为路由反射器和物理交换机建立BGP连接。配置环境拓扑如下:

在本次环境中,分别有一台spine交换机和两台leaf交换机来建立EBGP连接。所有leaf交换机都属于一个独立的自治系统,所有leaf交换机下的node都属于一个独立的自治系统。Kubernetes集群节点中每个leaf下由两台工作节点作为CalicoRR(路由反射器),之所以用两台node作为路由反射器是考虑冗余性,所有Calico RR都跟自己上联的leaf交换机建立EBGP连接。Calico RR和自己所属的node之间建立iBGP连接。

2. 安装calicoctl

Calico RR所有配置操作都需要通过calicoctl工具来完成, calicoctl允许从命令创建,读取,更新和删除Calico对象,所以我们首先需要在Kubernetes所有的工作节点上安装calicoctl工具。

采用二进制方式安装calicoctl工具。

登录到主机,打开终端提示符,然后导航到安装二进制文件位置,一般情况下calicoctl安装到 /usr/local/bin/。

使用以下命令下载calicoctl二进制文件,版本号选择自己calico的版本。

$ curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.17.2/calicoctl

将文件设置为可执行文件。

$ chmod +x calicoctl

每次执行calicoctl之前需要设置环境变量。

$ export DATASTORE_TYPE=kubernetes
$ export KUBECONFIG=~/.kube/config

如果不希望每次执行calicoctl之前都需要设置环境变量,可以将环境变量信息写到永久写入到/etc/calico/calicoctl.cfg文件里,calicoctl.cfg配置文件编辑如下:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "kubernetes"
  kubeconfig: "/root/.kube/config"

命令使用

[root@node1 ~]# calicoctl -h
Usage:
  calicoctl [options] <command> [<args>...]

    create       Create a resource by filename or stdin.
    replace      Replace a resource by filename or stdin.
    apply        Apply a resource by filename or stdin.  This creates a resource
                 if it does not exist, and replaces a resource if it does exists.
    patch        Patch a pre-exisiting resource in place.
    delete       Delete a resource identified by file, stdin or resource type and
                 name.
    get          Get a resource identified by file, stdin or resource type and
                 name.
    label        Add or update labels of resources.
    convert      Convert config files between different API versions.
    ipam         IP address management.
    node         Calico node management.
    version      Display the version of calicoctl.
    export       Export the Calico datastore objects for migration
    import       Import the Calico datastore objects for migration
    datastore    Calico datastore management.

Options:
  -h --help               Show this screen.
  -l --log-level=<level>  Set the log level (one of panic, fatal, error,
                          warn, info, debug) [default: panic]

Description:
  The calicoctl command line tool is used to manage Calico network and security
  policy, to view and manage endpoint configuration, and to manage a Calico
  node instance.

  See 'calicoctl <command> --help' to read about a specific subcommand.

3. 关闭Full-mesh模式

Calico默认是Full-mesh全互联模式,Calico集群中的的节点之间都会建立连接,进行路由交换。但是随着集群规模的扩大,mesh模式将形成一个巨大服务网格,连接数成倍增加。这时就需要使用 Route Reflector(路由器反射)模式解决这个问题。确定一个或多个Calico节点充当路由反射器,让其他节点从这个RR节点获取路由信息。

关闭node-to-node BGP网络,具体操作步骤如下:

添加default BGP配置,调整nodeToNodeMeshEnabled和asNumber:

[root@node1 calico]# cat bgpconf.yaml 
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false 
  asNumber: 64512

直接应用一下,应用之后会马上禁用Full-mesh,

[root@node1 calico]# calicoctl apply -f bgpconf.yaml 
Successfully applied 1 'BGPConfiguration' resource(s)

查看bgp网络配置情况,false为关闭

[root@node1 calico]# calicoctl get bgpconfig
NAME      LOGSEVERITY   MESHENABLED   ASNUMBER   
default   Info          false         64512

4. 修改工作节点的calico配置

通过calicoctl get nodes --output=wide可以获取各节点的ASN号,

[root@node1 calico]# calicoctl get nodes --output=wide
NAME    ASN      IPV4             IPV6   
node1   (64512)   172.20.0.11/24          
node2   (64512)   172.20.0.12/24          
node3   (64512)   172.20.0.13/24          
node4   (64512)   173.20.0.11/24          
node5   (64512)   173.20.0.12/24
node6   (64512)   173.20.0.13/24

可以看到获取的ASN号都是“(64512)”,这是因为如果不给每个节点指定ASN号,默认都是64512。我们可以按照拓扑图配置各个节点的ASN号,不同leaf交换机下的节点,ASN号不一样,每个leaf交换机下的工作节点都是一个独立自治系统。

通过如下命令,获取工作节点的calico配置信息:

$ calicoctl get node node1 -o yaml > node1.yaml 

每一个工作节点的calico配置信息都需要获取一下,输出为yaml文件,“node1”为calico节点的名称。

按照如下格式进行修改:

[root@node1 calico]# cat node1.yaml 
apiVersion: projectcalico.org/v3
kind: Node
metadata:
  annotations:
    projectcalico.org/kube-labels: '{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node1","kubernetes.io/os":"linux","node-role.kubernetes.io/master":"","node-role.kubernetes.io/worker":"","rr-group":"rr1","rr-id":"rr1"}'
  creationTimestamp: null
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/os: linux
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: node1
    kubernetes.io/os: linux
    node-role.kubernetes.io/master: ""
    node-role.kubernetes.io/worker: ""
  name: node1
spec:
  bgp:
    asNumber: 64512                           ## asNumber根据自己需要进行修改

    ipv4Address: 172.20.0.11/24
    routeReflectorClusterID: 172.20.0.11      ## routeReflectorClusterID一般改成自己节点的IP地址
  orchRefs:
  - nodeName: node1
    orchestrator: k8s
status:
  podCIDRs:
  - ""
  - 10.233.64.0/24

将所有节点的Calico配置信息全部修改之后,通过calicoctl get nodes -o wide命令获取到的节点信息如下:

[root@node1 calico]# calicoctl get nodes -o wide
NAME    ASN     IPV4             IPV6   
node1   64512   172.20.0.11/24          
node2   64512   172.20.0.12/24          
node3   64512   172.20.0.13/24          
node4   64513   173.20.0.11/24          
node5   64513   173.20.0.12/24          
node6   64513   173.20.0.13/24

上面可以可以看到所有的ASN好都已变为手动指定的,不在是全局默认的。

5. 为node节点进行分组(添加label)

为方便让BGPPeer轻松选择节点,在Kubernetes集群中,我们需要将所有节点通过打label的方式进行分组,这里,我们将label标签分为下面几种:

rr-group 这里定义为节点所属的Calico RR组,主要有rr1和rr2两种,为不同leaf交换机下的Calico RR
rr-id 这里定义为所属Calico RR的ID,节点添加了该标签说明该节点作为了路由反射器,主要有rr1和rr2两种,为不同leaf交换机下的Calico RR

通过以下命令为每个节点添加label,

$ kubectl label nodes node1 rr-group=rr1
$ kubectl label nodes node1 rr-id=rr1

查看最终设置情况,

[root@node1 calico]# kubectl get nodes --show-labels 
NAME         STATUS           ROLES            AGE          VERSION         LABELS
node1   Ready    master,worker   31d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,rr-group=rr1,rr-id=rr1
node2   Ready    master,worker   31d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,rr-group=rr1,rr-id=rr1
node3   Ready    master,worker   31d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux,node-role.kubernetes.io/master=,node-role.kubernetes.io/worker=,rr-group=rr1
node4   Ready    worker          16d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node4,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,rr-group=rr2,rr-id=rr2
node5   Ready    worker          16d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node5,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,rr-group=rr2,rr-id=rr2
node6   Ready    worker          16d   v1.17.9   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node5,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,rr-group=rr2,rr-id=rr2 

6. 配置BGPPeer

在配置BGPPeer之前,我们可以先查看一下各个node BGP的节点状态,因为已经禁用了Full-mesh,并且现在还没有配置BGPPeer,所以所有节点里的信息都是空的。

[root@node3 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
No IPv4 peers found.

IPv6 BGP status
No IPv6 peers found.

根据环境拓扑,node1和node2作为Calico RR,需要和leaf01交换机建立BGP连接;node4和node5作为Calico RR需要和leaf02交换机建立BGP连接;node1、node2和node3需要和RR1建立BGP连接;node4、node5和node6需要和RR2建立BGP连接。按照下面步骤依次配置:

1) RR1和leaf01建立BGP连接

编写配置文件,取名为“rr1-to-leaf1-peer.yaml”,配置文件编辑如下:

[root@node1 calico]# cat rr1-to-leaf1-peer.yaml 
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rr1-to-leaf1-peer        ## 给BGPPeer取一个名称,方便识别

spec:
  nodeSelector: rr-id == 'rr1'   ## 通过节点选择器添加有rr-id == 'rr1'标签的节点

  peerIP: 172.20.0.254           ##  leaf01交换机的地址
  asNumber: 65009                ##  leaf01交换机的AS号

应用该配置,

[root@node1 calico]# calicoctl apply -f rr1-to-leaf1-peer.yaml 
Successfully applied 1 'BGPPeer' resource(s)

2) RR1和自己所属的节点建立BGP连接

RR1所属的节点主要有node1、node2和node3,也就是打了rr-group=rr1标签的节点,配置文件编写如下:

[[root@node1 calico]# cat rr1-to-node-peer.yaml 
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rr1-to-node-peer              ## 给BGPPeer取一个名称,方便识别

spec:
  nodeSelector: rr-group == 'rr1'     ## 通过节点选择器添加有rr-group == ‘rr1’标签的节点

  peerSelector: rr-id  == 'rr1'       ## 通过peer选择器添加有rr-id == ‘rr1’标签的路由反射器

应用该配置,

[root@node1 calico]# calicoctl apply -f rr1-to-node-peer.yaml 
Successfully applied 1 'BGPPeer' resource(s)

3) 在leaf01交换机上操作,建立leaf01交换机和RR1的BGP连接,交换机配置完成后,可以查看交换机bgp peer的连接状态

[leaf01]show bgp peer ipv4

 BGP local router ID: 2.2.2.2
 Local AS number: 65009
 Total number of peers: 3		  Peers in established state: 3

  * - Dynamically created peer
  Peer                    AS  MsgRcvd  MsgSent OutQ PrefRcv Up/Down  State

  100.0.0.1            65008     1696     1677    0       8 23:52:28 Established
  172.20.0.11          64512     1648     1506    0       4 23:51:50 Established
  172.20.0.12          64512     1647     1659    0       4 23:51:44 Established

上面172.20.0.11和172.20.0.12是node1和node2节点,也就是RR1。状态显示为“Established“说明BGP连结已建立。

4) RR2和leaf02建立BGP连接

编写配置文件,取名为“rr2-to-leaf2-peer.yaml”,配置文件编辑如下:

[root@node1 calico]# cat rr2-to-leaf2-peer.yaml 
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rr2-to-leaf2-peer        ## 给BGPPeer取一个名称,方便识别

spec:
  nodeSelector: rr-id == 'rr2'   ## 通过节点选择器添加有rr-id == 'rr2'标签的节点
  peerIP: 173.20.0.254           ##  leaf02交换机的地址
  asNumber: 65010                ##  leaf02交换机的AS号

应用该配置,

[root@node1 calico]# calicoctl apply -f rr2-to-leaf2-peer.yaml 
Successfully applied 1 'BGPPeer' resource(s)

5) RR2和自己所属的节点建立BGP连接

RR2所属的节点主要有node4、node5和node6,也就是打了rr-group=rr2标签的节点,配置文件编写如下:

[[root@node1 calico]# cat rr2-to-node-peer.yaml 
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rr2-to-node-peer              ## 给BGPPeer取一个名称,方便识别

spec:
  nodeSelector: rr-group == 'rr2'     ## 通过节点选择器添加有rr-group == ‘rr2’标签的节点
  peerSelector: rr-id  == 'rr2'       ## 通过peer选择器添加有rr-id == ‘rr2’标签的路由反射器

应用该配置,

[root@node1 calico]# calicoctl apply -f rr2-to-node-peer.yaml 
Successfully applied 1 'BGPPeer' resource(s)

6) 在leaf02交换机上操作,建立leaf02交换机和RR2的BGP连接

交换机配置完成后,可以查看交换机bgp peer的连接状态

<leaf02>sys
System View: return to User View with Ctrl+Z.
[leaf02]show bgp peer ipv4

 BGP local router ID: 3.3.3.3
 Local AS number: 65010
 Total number of peers: 3		  Peers in established state: 3

  * - Dynamically created peer
  Peer                    AS  MsgRcvd  MsgSent OutQ PrefRcv Up/Down  State

  100.0.0.5            65008     1561     1686    0      11 24:01:03 Established
  173.20.0.11          64513     1655     1650    0       2 23:59:44 Established
  173.20.0.12          64513     1661     1883    0       2 23:59:56 Established

上面173.20.0.11和173.20.0.12是node4和node5节点,也就是RR2。状态显示为“Established“说明BGP连结已建立。

最后,我们可以通过calicoctl get bgppeer命令来查看所有的BGPPeer配置条目,

[root@node1 calico]# calicoctl get bgppeer
NAME                PEERIP         NODE                ASN     
rr1-to-leaf1-peer   172.20.0.254   rr-id == 'rr1'      65009   
rr1-to-node-peer                   rr-group == 'rr1'   0       
rr2-to-leaf2-peer   173.20.0.254   rr-id == 'rr2'      65010   
rr2-to-node-peer                   rr-group == 'rr2'   0

如果想删除某个BGPPeer条目,可以通过下面的命令

$ calicoctl delete bgppeer rr2-to-node-peer

7. 工作节点配置验证

至此,BGPPeer配置已完成,可以在各个节点里再次查看BGPPeer状态信息

在node1节点操作

[root@node1 calico]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+------------+-------------+
| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+--------------+---------------+-------+------------+-------------+
| 172.20.0.12  | node specific | up    | 2021-02-16 | Established |
| 172.20.0.13  | node specific | up    | 2021-02-16 | Established |
| 172.20.0.254 | node specific | up    | 2021-02-16 | Established |
+--------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

可以看到该节点已经和leaf01交换机、node2和node3节点建立了BGP连接。

在node2节点操作

[root@node2 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+------------+-------------+
| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+--------------+---------------+-------+------------+-------------+
| 172.20.0.11  | node specific | up    | 2021-02-16 | Established |
| 172.20.0.13  | node specific | up    | 2021-02-16 | Established |
| 172.20.0.254 | node specific | up    | 2021-02-16 | Established |
+--------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

可以看到该节点已经和leaf01交换机、node1和node3节点建立了BGP连接。

在node3节点操作

[root@node3 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+------------+-------------+
| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+--------------+---------------+-------+------------+-------------+
| 172.20.0.11  | node specific | up    | 2021-02-16 | Established |
| 172.20.0.12  | node specific | up    | 2021-02-16 | Established |
+--------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

可以看到该节点已经和node1和node2节点建立了BGP连接,因为该节点不作为路由反射器节点,所以并为与leaf01交换机建立bgp连接。

在node4节点操作

[root@node4 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+------------+-------------+
| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+--------------+---------------+-------+------------+-------------+
| 173.20.0.12  | node specific | up    | 2021-02-16 | Established |
| 173.20.0.13  | node specific | up    | 2021-02-16 | Established |
| 173.20.0.254 | node specific | up    | 2021-02-16 | Established |
+--------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

可以看到该节点已经和leaf02交换机、node5和node6节点建立了BGP连接。

在node5节点操作

[root@node5 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+------------+-------------+
| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+--------------+---------------+-------+------------+-------------+
| 173.20.0.11  | node specific | up    | 2021-02-16 | Established |
| 173.20.0.13  | node specific | up    | 2021-02-16 | Established |
| 173.20.0.254 | node specific | up    | 2021-02-16 | Established |
+--------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

可以看到该节点已经和leaf02交换机、node4和node6节点建立了BGP连接。

在node6节点操作

[root@node6 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+------------+-------------+
| PEER ADDRESS |   PEER TYPE   | STATE |   SINCE    |    INFO     |
+--------------+---------------+-------+------------+-------------+
| 173.20.0.11  | node specific | up    | 2021-02-16 | Established |
| 173.20.0.12  | node specific | up    | 2021-02-16 | Established |
+--------------+---------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

可以看到该节点已经和node4和node5节点建立了BGP连接,因为该节点不作为路由反射器节点,所以并为与leaf02交换机建立bgp连接。

8. 交换机配置验证

我们可以在所有交换机里去查看BGP同步的路由信息有没有署于pod的路由地址

Spine交换机操作

Leaf01交换机操作

Leaf02交换机操作

在上面交换机操作截图中,10.233开头的地址段都是pod地址段的路由信息。

9. 将Service地址路由同步到物理网络

有些时候不光需要Pod地址可以在现网可被路由,Service地址也会有这个需求,我们可以通过修改bgpconfig配置来实现Service地址的路由同步,

首先检查是否具有默认的BGP配置

[root@node1 ~]# calicoctl get bgpconfig default
NAME      LOGSEVERITY   MESHENABLED   ASNUMBER   
default   Info          false         64512

默认的BGP配置是存在的,更新BGP配置

[root@node1 ~]# calicoctl patch BGPConfig default --patch \
> '{"spec": {"serviceClusterIPs": [{"cidr": "10.233.0.0/18"}]}}'
Successfully patched 1 'BGPConfiguration' resource

注意将上面10.233.0.0./18地址段修改为Service的地址段

上述配置完成之后,便可以在交换机里看到已经同步过来的Service地址段的路由信息。

10. 文档参考链接

绝大多数配置都可以通过Calico官方文档获取,以下就是撰写本文参考的主要官方文档链接

https://docs.projectcalico.org/networking/bgp

https://docs.projectcalico.org/getting-started/clis/calicoctl/install

https://docs.projectcalico.org/networking/advertise-service-ips#advertise-service-cluster-ip-addresses

Cisco VT Camera II 复活指南

最后更新于:2020-05-07 19:44:10

这几天帮朋友搬家,找到了几个Cisco VT Camera II,上网查了一下很古老的摄像头,大概上市时间是2008年,是Cisco OEM罗技QuickCam Pro 5000,这个摄像头驱动更新的最新版没有windows10,但是通过下载QuickCam Pro 9000的驱动来使用。

具体也是Google出来的解决办法,可以参考Cisco官方社区的一篇帖子https://community.cisco.com/t5/telepresence-and-video/windows-7-x64-vt-camera-ii-drivers/m-p/1344660#M82629

帖子是英文的,可能看起来费劲,其实很简单,登录罗技官网 ,下载Logitech Webcam Pro 9000的驱动,下载链接是https://support.logi.com/hc/zh-cn/articles/360024843753--%E4%B8%8B%E8%BD%BD-%E5%BF%AB%E7%9C%8B%E9%AB%98%E6%89%8B%E7%89%88-Pro-9000-%E6%91%84%E5%83%8F%E5%A4%B4

下载window10系统的驱动,进行安装,安装之后默认摄像头上自带的麦克风是可以使用的,摄像头没办法打开,按照如下进行操作

1、右击“我的电脑”选择“管理”里的“设备管理器”,右击“未知设备”选择属性

2、选择“更新驱动程序”

3、浏览我的计算机以查找驱动程序软件

4、让我从计算机上的可用驱动程序列表中选取

5、先选择图像设备,之后厂商选择“Logitech”,型号选择“Logitech Webcam Pro 9000”

6、可以看到设备运转正常

这个时候就可以正常使用Cisco VT Camera II,清晰度感觉还可以,麦克风音效也超棒,毕竟采用Rightsound技术,清晰、无回音的语音系统。

以下是 Cisco VT Camera II摄像头的一些参数:

WordPress开启https后把文章图片改为https的解决方法

最后更新于:2020-01-09 22:20:36

WordPress 站点开启 HTTPS 后,文章中引用的图片就很有必要把 HTTP 统一改为 HTTPS,要不然会地址栏上的绿锁就会有黄色的三角。提示连接不一定是安全的。

根本的解决办法是通过 SQL 语句进行正文的批量替换,用phpmyadmin工具进入数据库管理,点击SQL->粘帖语句到输入框->点击执行即可,运行如下语句批量替换:

UPDATE wp_posts SET post_content = replace(post_content, 'http://www.rainwu.cn/wp-content/uploads','https://www.rainwu.cn/wp-content/uploads');
#www.rainwu.cn 改成网站的域名

参考网站:https://www.yziw.net/archives/2861.html

让WordPress文章的段落首行自动空两格

最后更新于:2020-01-09 22:20:00

网上找到了一个简单的实现方法,将下面的代码添加到主题目录 functions.php 的最后一个 ?> 前即可实现首行缩进,其它什么都不用调整。

//文章首行缩进
function Bing_text_indent($text){
     $return = str_replace('<p', '<p style="text-indent:2em;"',$text);
     return $return;
}
add_filter('the_content','Bing_text_indent');

原文参考地址:https://www.wpdaxue.com/p-text-indent.html

但是这个有个不太满意的地方就是所有的段落都会空两格,包括代码。

驰骋在辽阔的大草原上

最后更新于:2020-01-09 22:18:39

国庆假期北京-阿尔山自驾游

最后更新于:2020-02-14 12:13:52

马上就又到国庆了,分享一下去年国庆 北京 - 阿尔山 自驾的经历,今年国庆有想自驾去 阿尔山 游玩的小伙伴可以参考一下。因为平时比较懒,所以去年的游记今年才开始写,还好平时有整理材料的习惯,去年游玩的照片视频啥的都有记录,很容易就找到了。
出发之前,我们先做了攻略,在网上也搜索了大量之前去过的人写的游记,也参考了别人的走过的路线,整个旅程大概的路线如下,全程约3100Km,采用六只脚记录的自驾路线图:

北京至阿尔山国庆自驾游行程轨迹六只脚 http://www.foooooot.com/trip/1952985/ 
为了避免路上堵车,我们请了两天的假期,也就是从9月29日开始从北京出发,历时7天6晚,然后返回北京 。整个行程安排如下:
Day1(9月29日): 北京—阿鲁科尔沁旗 ;全程715.6Km;宿阿鲁科尔沁宾馆。
Day2(9月30日): 阿鲁科尔沁旗—柴河月亮小镇;619.3Km;宿扎兰屯月亮小镇月牙楼宾馆。
Day3(10月1日):柴河月亮小镇— 阿尔山 国家森林公园;102.3Km;宿 阿尔山 天池度假酒店,在景区游玩一天半。
Day4(10月2日): 阿尔山 国家森林公园— 阿尔山 国门— 阿尔山 市区;127.8Km;宿 阿尔山 御荣国际大酒店;
Day5(10月3日): 阿尔山 市— 锡林浩特 ;702.1Km;宿 锡林浩特 大酒店;
Day6(10月4日): 锡林浩特 — 达里诺尔湖 (游玩半天)— 张北 县城;520.1Km;宿 张家口 七号国际公馆;
Day7(10月5日): 张北 县城— 北京 ;264Km;到家。

详细的游记点击进我的马蜂窝链接去看:http://www.mafengwo.cn/i/17133319.html

在太原谈《太原之恋》

最后更新于:2020-01-09 22:16:56

上周刚看完刘慈欣的中篇科幻小说《太原之恋》这周就来太原了,让我能想到的不是太原悠久的历史和宽广的汾河,在我心目中太原永远是一个人灰色的城市,到处是尘埃,永远灰蒙蒙的。第一次去太原是2008年的一个冬天,以后每次去太原几乎都在冬天,太原给我的印象就是北方的荒芜的一个煤炭城市一样,印象中永远是朦胧的干冷的和房间向外冒着蒸汽的样子。《太原之恋》是大刘写的一个黑色幽默的小说,之所以说幽默是因为文中把自己作为故事角色加进去进行调侃,调侃创作不易。整本书在我看来就是一本AI灾难剧,人工智能对人类无情的屠杀,对太原整座城市的破坏,本身就是因为诅咒病毒最初赋予的思想就是仇恨和毁灭。有很多的电影会讲到人工智能的灾难,例如我最爱看的《鹰眼追击》。但还是很少看到不枯燥的AI灾难小说,关于AI比较多的是科普类的书,例如,雷·库兹韦尔的《奇点临近(The Singularity is Near:When Humans Transcend Biology)》,这也是我比较早期关注人工智能的时候读到的书,那时候的疯狂以至于我一个计算机专业的去读了心理学,因为我知道机器如果想要被赋予思想,那必须有像人类一样的心理活动,当今人工智能的各种算法,在我看来都只是计算层面的,无论是谷歌的阿法狗还是沙特的索菲娅(Sophia),人类的心理活动计算机算法是很难复制的,这就需要我们更多的去了解人,去了解人的思想。

被一个梦惊醒了

最后更新于:2020-01-09 22:16:34

梦中有一个梦,在梦中挣扎着想起来,想从之前的梦中起来,可是怎么也醒不来。

梦中的剧情是这样的,我变得一无所有,回到了从前,连一个住的地方都没有,忍受别人的欺凌,吃不起饭,可是那么的饿,再吃也是很饿,我想饿的可能不是肚子,饿的是生活。努力的从这个梦境中醒来,发现自己没办法动,但是可以观察到房间,房间是我睡过的房间,但是在梦里的一切我都不熟悉,像是虚构一样,梦里没有自己在睡觉的记忆,就像是真的故事一样,我想起来,随来能观察整个房间,但是我醒不来,我大声的嘶吼,可是身体不能动,但我依然能观察整个房间,梦里的那种失落感,令我挣扎彷徨,感觉自己会不存在了一般。最总猛然间,我醒了,我知道这些都是梦,一个冬日下午在床上的一场梦,起来后我再也不想睡觉了。

2012年3月22日的一篇随记

最后更新于:2020-01-09 22:17:06

对于一件明知可能性不太大的事情,会不会继续做下去,这真是一个纠结的问题。曾经少年时参加学校运动会,老师说拿不拿名次不重要,重要的是参加了,即使得了最后也无所谓。真的是贵在参与吗?“重在参与”这是赤裸裸的安慰性词语,做一些明知不会有结果的事情,还要咬牙坚持,完事失败了,还要说无悔! 世界上没有比这个词更虚伪的了,参与与否?每件事情既然去做了,肯定是有目的的,达不到目的即使做了,也没有丝毫意义,不要总拿“重在参与”这个词来安慰自己或者他人,这更加没有意义了。换种说法你可以说:失败了,下次再接再厉嘛!如果你真的喜欢做某一件事,怎可能轻易言败? 其实对自己不报有希望是缺乏自信的表现,为什么自己的一切要比别人差呢?为什么自己一定没别人好呢?有这种想法是错误的!