装在笔记本里的私有云环境:K8s 集群准备

news2025/1/16 5:39:25

本篇是系列中的第六篇内容,继续聊聊如何把一个简化过的私有云环境部署在笔记本里,以满足低成本、低功耗、低延时的实验环境。

在前几篇内容中,我们聊过了:虚拟化、监控、基础的存储、持续集成等内容,接下来的内容中,我们聊聊 K8s 集群的部署和配置相关的内容。

前置准备

因为一台笔记本的计算资源有限,想要顺滑的使用在一台设备中安装和使用 K8s 集群,其实还是有一些挑战的。为此我们需要做一些前置的准备,包括硬件资源分配、网络规划、软件准备。

除此之外,为了让程序运行的更加丝滑,在本文中,对于之前使用的虚拟化方案的资源分配进行了一些调整。

我们先来聊聊硬件方面的准备。

硬件准备

搭建私有云使用的硬件

本文使用的设备是去年购置的笔记本之一,搭载了 AMD Zen3 的 ThinkBook 15,一句话来概括设备特点是:使用能耗控制出众的 7nm 的芯片,拥有 8C16T 的计算资源,设备本身没有 CPU 功耗限制,能够扩展一条 32G 内存将容量提升至 40GB,拥有两个硬盘位,本身具备不错的扩展性。

关于这台设备,我在去年的文章《 AMD 4750u 及 5800u 笔记本安装 Ubuntu 20.04 》中有提到过,感兴趣可以自行翻阅。如果你没有这台设备,但是同样希望只在一台设备中完成各种环境的模拟和测试,可以根据自己实际情况调整,在选择的过程中建议尽可能选择颗心数更多的设备,方便虚拟化资源分配。

安装了 ESXi 的笔记本设备

在准备好设备之后,便需要选择合适自己的虚拟化方案,在之前的文章《AMD 5800u 笔记本折腾 Proxmox VE 7.0 虚拟化》、《NUC 折腾笔记 - 安装 ESXi 7》中,我们提到过 PVE 和 ESXi 两个常见的简单方案的安装部署。这里选择哪一种都不影响最终的结果,这里根据自己的实际需求选择即可。 在一些设备上 PVE 能够相对简单的提供显卡的“直通”,所以如果你需要折腾“硬件直通”,可以选择 PVE。因为之前构建过 ESXi 的镜像,也申请了免费的 License,所以这里我的选择是 ESXi。更多的细节可以参考《装在笔记本里的私有云环境:准备篇》中关于“虚拟化环境”的介绍和比较部分。

让屏幕休眠运行的一种方案

如果笔记本长时间运行,我们又不使用屏幕进行交互,不仅有一些浪费电力资源,还会出现不必要的积温。有一些设备支持使用键盘快捷键关闭屏幕,而更多的设备则设计了一个人性化的交互:当笔记本屏幕闭合到一定程度的时候,为屏幕断电。所以,如果你不希望屏幕一直亮着,可以参考上面的方式,在屏幕闭合处放一个手环之类的东西,让屏幕处于关闭但是没有完全关闭的状态。

网络公开的方案设计中,有的作者会考虑 “All in One”,将网络地址的分配和管理交给 ESXi 或者 PVE 的“软路由”虚拟机来负责,启动一个虚拟机来运行 Bind9 或者直接跑一个 OpenWRT。

但是,如果我们“精打细算”一番,会发现如果想要最高性价比的使用有限的 CPU 核心资源,并且保证任意虚拟机进入重启等维护状态时,整套设备不陷入瘫痪。最简单的方案是使用外部的服务,来完成网络地址分配和管理等事情。因为这个事情稳定性要求高,但是资源消耗量非常低、并且不应该被“自举(存在过耦合,引起维护上的麻烦)”,尤其是单独花费哪怕一个 CPU 都是非常非常浪费的。

因为有虚拟交换机,实际传输效率并不低

在生产环境中,我们会使用不少公有云的 DNS 服务,不过既然我们做好了私有化的准备,不妨做的更彻底一些,让它能够“完全离线”,运行时不依赖外部在线服务。我这里的考虑是增加一台廉价的外部设备,比如使用一台物理路由器:将需要稳定提供服务的 DHCP 移动到外部。

稳定可靠的 Padavan 路由固件

在过去几年的尝试验证下,个人体验搭载廉价的 MTK 芯片的路由,搭配在之前的文章《近期家用设备(NUC、猫盘、路由器)散热升级记录》中提到的 “Padavan” 可以提供足够的稳定性。

最终,我选择了一台 100 块左右的路由器,并刷上了熟悉的固件:hanwckf/rt-n56u 。为了稳定的使用,建议在使用的过程中,尽可能关闭所有的非必要插件,避免不必要的程序的运行影响我们的核心诉求,争抢有限的路由资源。

虚拟化资源分配

因为我们一共只有 8C16T 的 CPU 资源 ,为了最大效率的使用虚拟机,我们要进行一些虚拟机隔离性上取舍。

在《装在笔记本里的私有云环境:准备篇》里,我们根据职能划分了 7 台虚拟机。在经过长时间验证后,我将虚拟机合并为了 5 台,除了保留 3 台虚拟机作为最小规模的 K8S 集群之外,将原本的 Base、Monitor、Database、Storage 合并为 2 台,让程序在 VM 里因为能享用更多的 CPU 资源,能运行的更有效率。

重新划分的虚拟机资源

  • K8s 集群:Node x3 (2核心8GB内存120GB磁盘)
  • 外部存储:Storage x1 (4核心 4GB 内存 100GB 磁盘)
  • 通用服务:Base x1 (4核心 4GB 内存 300 GB 磁盘)

在分配磁盘的时候,K8s 集群和其他两台虚拟机选择不同的磁盘,可以避免磁盘 IO 用满导致的服务性能骤降、甚至引发不可用的问题

这里有一个小细节,我们在创建虚拟机的时候,尽量不要完全占满磁盘,预留一些空间除了有助于磁盘性能释放之外,还能避免虚拟机创建后,因为各种原因,磁盘用量超出我们预先设定时,影响虚拟化系统的整体可靠性。

当我们完成对主机完成虚拟化和虚拟机资源分配之后,来聊聊网络设计的细节。

网络设计

前文提到,我计划使用一台小路由器来“固定网络环境”。在实践的过程中需要配置两个部分的内容。

第一部分是针对 ESXi(设备主机)和各个虚拟机进行 IP 地址的分配。

重新划分的虚拟机资源

esxi    10.10.10.70     7C:8A:E1:82:xx:xx
base    10.10.10.100    00:0C:29:DB:xx:xx
storage 10.10.10.101    00:0C:29:50:xx:xx
potato  10.10.10.200    00:0C:29:02:xx:xx
spud    10.10.10.201    00:0C:29:C8:xx:xx
murphy  10.10.10.202    00:0C:29:A5:xx:xx

完成 IP 绑定后,不论是重启主机和虚拟机,还是执行 dhclient 命令或者使用 service / systemctl 重启网络服务都可以,我们需要让虚拟机的 IP 得到更新。

除了完成地址的分配之外,考虑到日常操作使用的方便,我们还需要完成端口在路由器(外部网关设备)上的暴露。因为一般路由器的默认规则是禁止从外部访问到内部设备的,会影响到我们日常使用 SSHWeb 方式访问虚拟机上的服务,或者维护 ESXi,以及这台小路由器的。毕竟,每次想管理或者维护的时候,都要加入这台路由也挺麻烦的。

我们先来解决从外部访问路由器的问题。

允许外部访问路由管理后台

接着,我们来解决端口绑定,让我们能够通过在外部网络访问路由器的地址配合不同的端口,就能够实现管理路由器、ESXi、虚拟机,或者通过 Web 访问跑在虚拟机或者 K8s 集群上的服务的功能。

完成基本的端口映射

这里不推荐使用路由器自带的 DMZ 功能,因为它将完全独占外部网关(路由)设备的 IP 端口。

系统环境准备和 K8s 集群部署

虚拟机上的 Linux 系统安装,可以参考《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》一文中的方式。需要注意的是,K8s 集群的机器上不必安装和配置 Docker,其余内容完全跟着第二篇文章流程走即可。

当然,如果你和我一样是个懒人,觉得重复执行命令很麻烦,可以结合本文中接下来提到的 “Ansible” 来进行重复命令执行,节约时间。

轻量的标准化 K8s 集群搭建,可以参考《轻量高可用的 K8s 集群搭建方案:MicroK8s》,在此也就不过多赘述。

Linux 软件包下载加速

安装过程中,可以使用《Linux 软件包下载加速工具:APT Proxy》一文中提供的工具,来加速软件包的获取,未来 CI 容器构建等场景的加速。

使用容器方式启动和管理的情况下,最简单的用法可以参考下面,先创建一个目录,在目录中创建一个用于管理程序的 compose 配置文件:

mkdir -p /app/apt-proxy
touch /app/apt-proxy/docker-compose.yml
docker pull soulteary/apt-proxy

然后,编辑 docker-compose.yml 中的内容:

version: "3"
services:

  apt-proxy:
    image: soulteary/apt-proxy
    restart: always
    command: --ubuntu=cn:tsinghua --debian=cn:tsinghua  --alpine=cn:tsinghua --centos=cn:tsinghua
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "3142:3142"

最后,使用 docker compose up -d 启动服务即可。服务的使用,在下面的文章中还会提到,也就先不展开了。

工具的代码开源在 https://github.com/soulteary/apt-proxy ,如果觉得好用,欢迎点赞和分享给你的朋友 😄

配置简单的堡垒机 / 跳板机

为了方便后续操作,我们将“堡垒机”的职能也放在 “Base” 这台机器里,先在这台机器上生成一个用于登录和管理其他机器的密钥:

ssh-keygen -t rsa -C "base-manage-key"

执行完毕,看到类似下面的日志:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/soulteary/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/soulteary/.ssh/id_rsa
Your public key has been saved in /home/soulteary/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:7iZLlm2iEFF+exxxxYnzdfhr9CxxxxxI2GrxxxxcVo base-manage-key
The key's randomart image is:
+---[RSA 3072]----+
|    .         .oE|
|   o .       . o.|
|  . o o     o .  |
|   . +     . .   |
|  . .   S     .  |
|   o o = ..  .   |
|  . * B *=.o.    |
|   o O.=++=.+o   |
|    o o=o+=o+*+  |
+----[SHA256]-----+

然后使用 ssh-copy-id 来依次将密钥添加到要被管理的机器上(用户名请根据自己的实际情况进行替换):

ssh-copy-id -i ~/.ssh/id_rsa soulteary@10.10.10.200
ssh-copy-id -i ~/.ssh/id_rsa soulteary@10.10.10.201
ssh-copy-id -i ~/.ssh/id_rsa soulteary@10.10.10.202
...

程序正确正确执行后,我们会得到类似下面的日志:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/soulteary/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
soulteary@10.10.10.200's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'soulteary@10.10.10.200'"
and check to make sure that only the key(s) you wanted were added.

在完成配置之后,我们可以通过下面的命令来简单验证是否配置正确:

ssh 10.10.10.200 echo "ok"

如果命令行输出的结果是“ok”,那么说明我们的配置是正确的。如果你想验证所有的主机的配置都是正确,那么需要手动修改 IP 地址,依次执行上面的命令。

当然,你也可以选择使用接下来要聊的 “Ansible” 来执行命令的批量执行。

借助 Ansible 来偷部署的懒

RedHat Ansible 项目官方网站

Ansible 是目前流行的 IT 自动化工具之一,也是久负盛名的开源软件之一,我们可以使用它来完成系统配置、软件部署、服务编排等任务,以及处理后续 CI/CD 中进行集成的相关任务。

本篇文章里,我们简单聊聊如何在初始化环节,通过它一步一步完成服务部署,避免在多台机器上重复执行命令,进行偷懒。

如何安装和简单配置 Ansible

最简单的使用场景下,我们只需要在控制端(比如堡垒机)完成 ansible 的安装即可。

因为我们选择了 Ubuntu 这种用户量非常大的 Linux 发行版,所以安装 ansible 的过程就特别简单,只需要一条命令:

sudo apt install -y ansible

在完成安装之后,我们先需要为 ansible 创建配置。首先要完成 ansible 的配置目录创建和目录的权限调整:

sudo mkdir -p /etc/ansible
sudo chown -R `whoami`:`whoami` /etc/ansible

接着,执行命令,将主机名、分组、IP 信息写入配置(参考你的实际情况):

cat > /etc/ansible/hosts << EOF
[k8s]
potato ansible_host=10.10.10.200
spud   ansible_host=10.10.10.201
murphy ansible_host=10.10.10.202

[data]
storage ansible_host=10.10.10.101

[common]
base    ansible_host=10.10.10.100

[all:vars]
ansible_python_interpreter=/usr/bin/python3

EOF

在执行完上面的命令之后,ansible 的基础配置就完成了。我们可以通过下面的命令来进行服务配置验证:

ansible-inventory --list -y

不出意外的话,将得到下面的日志输出:

all:
  children:
    common:
      hosts:
        base:
          ansible_host: 10.10.10.100
          ansible_python_interpreter: /usr/bin/python3
    data:
      hosts:
        storage:
          ansible_host: 10.10.10.101
          ansible_python_interpreter: /usr/bin/python3
    k8s:
      hosts:
        murphy:
          ansible_host: 10.10.10.202
          ansible_python_interpreter: /usr/bin/python3
        potato:
          ansible_host: 10.10.10.200
          ansible_python_interpreter: /usr/bin/python3
        spud:
          ansible_host: 10.10.10.201
          ansible_python_interpreter: /usr/bin/python3
    ungrouped: {}

当你想进行连通性测试,验证主机是否在线的时候,可以执行 ansible all -m ping。如果在上文中,你有正确配置密钥登录,那么将得到类似下面的日志结果:

spud | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
murphy | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
potato | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
storage | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
base | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

如何使用 Ansible 批量执行命令

如果我们想让 K8s 分组的机器都执行系统软件包更新的命令,可以这样编写命令(直接使用上文中 ansible 配置中的小组名称即可):

ansible k8s -a "sudo apt-get update && sudo apt-get -y upgrade"

如果我们希望是某几台机器、几个分组执行命令,可以使用 “:” 或 “,” 来分割要执行命令的目标名称:

ansible potato,murphy,spud -a "sudo apt-get update && sudo apt-get -y upgrade"

当然,ansible 不仅仅支持“组合”,还支持简单的“是(&)”和“非(!)” 操作,如果你有复杂的编排任务,可以参考官方文档里关于 “Advanced pattern options” 部分的介绍。

如果我们想结合上文提到的 APT Proxy 来加速系统软件包的下载,命令需要改写成下面这样:

ansible k8s -a "sudo http_proxy=http://10.10.10.100:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true update"

ansible k8s -a "sudo http_proxy=http://10.10.10.100:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true upgrade -y"

命令执行完毕,我们将看到 ansible 依次在每一台机器上执行命令,并会高亮执行失败的命令(如果有):

murphy | CHANGED | rc=0 >>
Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease
Reading package lists...
spud | CHANGED | rc=0 >>
Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease
Reading package lists...
potato | CHANGED | rc=0 >>
Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease
Reading package lists...
...

使用 ansible 完成软件的批量安装也很简单,只需要调整命令为具体的软件安装命令即可:

ansible k8s,data -a "sudo http_proxy=http://10.10.10.100:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true install -y iftop iotop bmon dstat"

不过,虽然 ansible 能够帮助我们安装交互式的命令工具,但它是不能够为我们批量执行交互式的命令的,比如:topiftopvim等。

如何使用 Ansible 简单管理 K8s

在上文中,我们针对 K8s 的主机资源进行了分组(k8s),所以当我们需要查看服务节点的时候,可以通过下面的命令来查看:

ansible k8s -a "sudo microk8s.status"

当然,因为有两个节点不是管理节点,所以我们会看的一些提示:

murphy | CHANGED | rc=0 >>
This MicroK8s deployment is acting as a node in a cluster.
Please use the control plane node.
spud | CHANGED | rc=0 >>
This MicroK8s deployment is acting as a node in a cluster.
Please use the control plane node.
potato | CHANGED | rc=0 >>
microk8s is running
high-availability: no
  datastore master nodes: 10.10.10.200:19001
  datastore standby nodes: none
addons:
  enabled:
    dashboard            # (core) The Kubernetes dashboard
    ha-cluster           # (core) Configure high availability on the current node
    helm                 # (core) Helm - the package manager for Kubernetes
    helm3                # (core) Helm 3 - the package manager for Kubernetes
    metrics-server       # (core) K8s Metrics Server for API access to service metrics
  disabled:
    cert-manager         # (core) Cloud native certificate management
    community            # (core) The community addons repository
    dns                  # (core) CoreDNS
    gpu                  # (core) Automatic enablement of Nvidia CUDA
    host-access          # (core) Allow Pods connecting to Host services smoothly
    hostpath-storage     # (core) Storage class; allocates storage from host directory
    ingress              # (core) Ingress controller for external access
    kube-ovn             # (core) An advanced network fabric for Kubernetes
    mayastor             # (core) OpenEBS MayaStor
    metallb              # (core) Loadbalancer for your Kubernetes cluster
    observability        # (core) A lightweight observability stack for logs, traces and metrics
    prometheus           # (core) Prometheus operator for monitoring and logging
    rbac                 # (core) Role-Based Access Control for authorisation
    registry             # (core) Private image registry exposed on localhost:32000
    storage              # (core) Alias to hostpath-storage add-on, deprecated

如果你只想操作管理节点,可以直接使用管理节点的主机名称,比如我们来查看到底有哪些服务在运行:

ansible potato -a "kubectl get pods --all-namespaces"

将得到下面的结果:

potato | CHANGED | rc=0 >>
NAMESPACE     NAME                                         READY   STATUS    RESTARTS       AGE
kube-system   kubernetes-dashboard-6f7f6c6876-mkd7s        1/1     Running   3 (3h2m ago)   43d
kube-system   calico-node-9fbw4                            1/1     Running   1 (3h2m ago)   46h
kube-system   calico-kube-controllers-6bb8f46dcd-f4flz     1/1     Running   1 (3h2m ago)   46h
kube-system   calico-node-lnk4k                            1/1     Running   1 (3h2m ago)   46h
kube-system   calico-node-m4rtp                            1/1     Running   1 (3h1m ago)   46h
kube-system   dashboard-metrics-scraper-64bcc67c9c-zjjt9   1/1     Running   3 (3h1m ago)   43d
kube-system   metrics-server-6b6844c455-45kjc              1/1     Running   3 (3h2m ago)   43d

我个人认为 Ansible 偷懒精华更多在 “Ansible Playbooks”,目前我们只了解和使用“Ansible SSH” 就足够了。在后面聊 CI 的时候,我们再进一步展开吧。

最后

时间不早了,本篇文章就先写到这里啦。

下一篇文章,我们聊聊结合 K8s 的存储部分的搭建和使用。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴,欢迎阅读下面的内容,扫码添加好友。

  • 关于“交友”的一些建议和看法
  • 添加好友,请备注实名和公司或学校、注明来源和目的,否则不会通过审核。
  • 关于折腾群入群的那些事

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2022年11月29日
统计字数: 12906字
阅读时间: 26分钟阅读
本文链接: https://soulteary.com/2022/11/29/private-cloud-environment-installed-in-a-notebook-k8s-cluster-preparation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告诉你如果对一个新产品进行测试

初入一家公司&#xff0c;当一个全新的产品摆在你的面前&#xff0c;你会如何快速入手呢&#xff1f;点、点、点。。。虽说实践是熟悉系统的第一要素&#xff0c;但我们需要静静思考一下。我是谁&#xff1f;--QA我在哪&#xff1f;--**产品组我要做什么&#xff1f;--保质量有…

Nature:“我还有用!“凋亡细胞释放的代谢物充当组织信使

代谢组学文献分享&#xff0c;细胞凋亡是指为维持内环境稳定&#xff0c;由基因控制的细胞自主的有序的死亡。2002年授予在“发现细胞凋亡的重要调控分子并阐述其作用机制”方面做出重要贡献的三位科学家诺贝尔生理和医学奖&#xff0c;caspase依赖的细胞凋亡约占机体内稳态细胞…

多线程初阶(一)

目录 前言&#xff1a; 认识多线程 创建线程 run方法和start区别 继承Thread类 实现Runnable接口 匿名内部类实现继承Thread类 匿名内部类实现Runnable接口实例 Lambda表达式 中断线程 等待线程 线程休眠 线程状态 线程状态之间切换 代码观察线程的状态 线程安…

多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践

伴随着国家产业升级的推进和云原生技术成熟&#xff0c;多点 DMALL 大数据技术也经历了从存算一体到存算分离的架构调整变迁。本文将从引入 Kyuubi 实现统一 SQL Proxy 的角度讲述这一探索实践的历程。 多点 DMALL 成立于2015年&#xff0c;提供一站式全渠道数字零售解决方案 D…

STL的常用算法-查找 (20221130)

STL的常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;涉及比较、交换、查找、遍历等等&#xff1b; <functional>定义了一些模板类&#xff0…

使用记账软件记录生活收支明细,如何防止收支不被他人修改

坚持记账是每个人都必须要做的事情&#xff0c;日常生活中的生活开支都是一笔笔的支出&#xff0c;一个月挣来的工资&#xff0c;在不知不觉之中就花完了&#xff0c;可以使用——晨曦记账本记录生活明细&#xff0c;为了防止被他人修改&#xff0c;该如何操作呢&#xff1f;一…

Allegro调丝印规范操作指导

Allegro调丝印规范操作指导 Allegro和其它PCB设计软件一样,丝印的排布也是类似的,具体规范介绍如下 以下图为例 打开Setup-Design Parameter 选择text 设置丝印字体的参数 设置需要丝印的字体,比如3号字体,参数如下 然后点击OK Edit-Change需要调整丝印的字体

Linux-Hadoop部署

部署Hadoop一、Hadoop部署模式1、独立模式2、伪分布式模式3、完全分布式模式二、Hadoop集群规划1、集群拓扑2、角色分配三、JDK安装与配置1、下载JDK压缩包2、上传到master虚拟机3、在master虚拟机上安装配置JDK4、将JDK分发到slave1和slave2虚拟机5、将环境配置文件分发到slav…

图的初识·存储结构

邻接矩阵存储结构 用矩阵表示表示图中各个顶点之间的邻接关系和权值。如图G(V,E)G(V,E)G(V,E)&#xff0c;其中有N个结点&#xff0c;使用NxNNxNNxN的矩阵表示。 不带权值的图 Gij{1,无向图(vi,vj)或有向图的<vi,vj>是图中的边0,无向图的(vi,vj)或有向图的<vi,vj>…

猕猴桃的红色果肉受到特定的激活-抑制系统的控制

文章信息 题目&#xff1a;The red flesh of kiwifruit is differentially controlled by specific activation–repression systems 刊名&#xff1a;New Phytologist 作者&#xff1a;Wen-qiu Wang&#xff0c;Andrew C. Allan,Xue-ren Yin et al 单位&#xff1a;Zhejia…

猿如意开发工具|Sublime Text(4126)

文章目录 一、猿如意是什么&#xff1f; 二、如何使用猿如意下载安装Sublime Text 三、总结 一、猿如意是什么&#xff1f; 猿如意是一款面向开发者的辅助开发工具箱&#xff0c;包含了效率工具、开发工具下载&#xff0c;教程文档&#xff0c;代码片段搜索&#xff0c;全网搜…

【Pandas数据处理100例】(九十九):Pandas使用at_time()筛选出特定时间点的数据行

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

如何建立一套完善的销售管理体系?

怎样创建两套健全的产品销售体系&#xff1f;用工程建设观念管理工作产品销售项目组&#xff0c;创建健全的产品销售体系&#xff01; 逐步形成精确的最终目标虽说重要&#xff0c;但缺乏有效率的方式来破冰&#xff0c;最终目标可能将仅是这份无用。 篮球赛事球手的最终目标…

IOC 的底层原理和Bean管理XML方式、xml注入集合属性

目录 什么是IOC IOC底层管理 工厂模式 IOC 的过程 IOC 接口 IOC 操作Bean 原理 Bean 管理操作有两种方式 1. 基于xml 配置方式创建对象 2. 基于xml方式注入属性 第二种使用有参数构造注入 p 名称空间注入 ICO操作Bean管理&#xff08;xml 注入其他类型属性&#xff…

微信小程序的 websocket 以及 微信开发者工具测试 ws 协议没有数据的 离奇解决方案 记录

微信小程序的 websocket 在本地web能够使用ws协议去链接websocket&#xff0c;但是小程序不能使用。一、WSS 协议与 WS 协议二、业务场景记录 : 使用 ws 协议的 websocekt 做测试,但是在 h5中可以拿到实时数据,在微信开发者工具中以及真机调试中拿不到模拟数据的问题1. 首先在 …

2022安洵杯babybf

babybf 赛后分析了下&#xff0c;发现是一道很有意思的题目 Brainfuck是一种极小化的计算机语言&#xff0c;它是由Urban Mller在1993年创建的。由于fuck在英语中是脏话&#xff0c;这种语言有时被称为brainf*ck或brainf**k&#xff0c;甚至被简称为BF。 其实本题是一个c语言实…

三、【redux】异步action

文章目录1、不成熟的异步修改1.1、CODE1.1.1、count_action.js1.1.1、count_reducer.js1.2、异常2、异步action代码修正2.1、store.js2.2、count_action.js3、小总结action分两类&#xff1a; 同步&#xff1a;指action的值是Object类型的一般对象异步&#xff1a;指action的值…

在C#中使用Halcon开发视觉检测程序

本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下&#xff0c;通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤&#xff0c;让开发者能把精力完全集中到算法的开发上面。 首先&#xff0c;你需要安装Halcon&#xff0c;HALCON 18.…

D. X-Magic Pair(辗转相除)

Problem - 1612D - Codeforces 给你一对整数&#xff08;a,b&#xff09;和一个整数x。 你可以用两种不同的方式改变这对整数。 设置&#xff08;分配&#xff09;a:|a-b|。 设置&#xff08;分配&#xff09;b:|a-b|。 其中|a-b|是a和b之间的绝对差值。 如果只用给定的操作就…

【Linux】shell命令行简单解释器

回顾一下&#xff0c;我们前面学习了进程创建&#xff0c;进程终止&#xff0c;进程等待&#xff0c;进程替换&#xff0c;通过这些内容我们可以来进行实现简单的shell命令行解释器&#xff01;&#xff01;&#xff01;下面我们直接来看一看如何去实现shell命令行解释器&#…