把 KubeBlocks 跑在 Kata 上,真的可行吗?

背景

容器的安全性一直是广受关注的话题。这个领域也产生了很多不错的开源项目。Kata就是其中之一。

Kata Containers(简称 Kata)是一种开源项目,它提供了一种安全而高性能的容器运行时环境。Kata Containers 利用虚拟化技术(通常是硬件辅助虚拟化)创建一个轻量级的虚拟机(VM),每个容器都在独立的虚拟机中运行。这种方式使得每个容器都能够拥有自己独立的内核和文件系统,实现了容器之间的完全隔离,提高容器的安全性。

把 KubeBlocks 跑在 Kata 上能够利用Kata在安全性方面的能力,提高整个系统的安全性和隔离性,那么KubeBlocks能够运行在Kata上吗?我们构建了一个 Kata 环境并做了简单的功能验证。

Kata 特性

  1. 安全隔离: 每个容器运行在自己的虚拟机中,实现了硬件级别的隔离,从而提供了更高的安全性和隔离性。这使得 Kata Containers 更适合于多租户环境和安全敏感的工作负载。
  2. 性能和资源效率: 尽管 Kata Containers 运行在虚拟机中,但它们仍然可以提供接近于轻量级容器的性能和资源效率。Kata Containers 利用硬件虚拟化的优势,通过硬件加速等技术实现快速启动和高性能。
  3. 生态系统兼容性: Kata Containers 兼容容器生态系统,支持 Docker 和 Kubernetes,可以无缝地与现有的容器工具和平台集成。
  4. 灵活性和可扩展性: Kata Containers 可以在各种不同的虚拟化平台上运行,包括基于 KVM、Firecracker 等的平台。这使得用户可以根据自己的需求选择合适的虚拟化解决方案。

准备虚拟化环境

1. 虚拟化要求

首先,安装 kata 之前需要准备支持虚拟化的服务器,一般有两种来源:

A:裸金属服务器,这种服务器上的 CPU 一般都支持虚拟化,这种虚拟化叫做 L1 虚拟化。

B:支持嵌套虚拟化(Nested Virtualization)的 VM,这种 VM 支持虚拟化指令集,可以用来做 L2 虚拟化。

对于一个 Server 是否支持虚拟化,可以执行 grep vmx /proc/cpuinfo

slc@kata-1:~$ grep vmx /proc/cpuinfo
flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat vnmi md_clear arch_capabilities
vmx flags        : vnmi preemption_timer invvpid ept_x_only ept_ad flexpriority tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid shadow_vmcs

如果支持虚拟化,可以在结果中看到 ‘vmx’ 相关的信息。

2. GCP 创建虚拟机

目前的各个云厂商对嵌套虚拟化的支持程度不同,其中 GCP 应该是支持度最好的,详情见:GCP嵌套虚拟化。

在 GCP 上生产 3 台嵌套虚拟化服务器,使用 gcloud 指令:

slc@bogon aws % gcloud compute instances create kata-1 \--enable-nested-virtualization \--project=apecloud-labs \--zone=us-central1-c \--machine-type=n1-standard-4 \--network-interface=network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=default \--maintenance-policy=MIGRATE \--provisioning-model=STANDARD \--service-account=822787046197-compute@developer.gserviceaccount.com \--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \--create-disk=auto-delete=yes,boot=yes,device-name=instance-20240407-035747,image=projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20240319,mode=rw,size=100,type=projects/apecloud-labs/zones/us-central1-c/diskTypes/pd-balanced \--no-shielded-secure-boot \--shielded-vtpm \--shielded-integrity-monitoring \--labels=goog-ec-src=vm_add-gcloud \--reservation-affinity=any

可以执行 3 次来生产 3 台我们需要的支持 vmx 的 VM。

打通上面的 ipip/dns53 vpc firewall rules,以便 K8s 内部节点之间的通信。

安装 K8s + kata 环境

我们选取 k3s 作为我们的 K8s 底座,k3s 的安装过程简单快捷,参考网站 https://k3s.io/。

1. 安装 k3s
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
2. 创建 bootstrap token
sudo k3s token create
3. 加入其他 Node

红色部分为主节点 ip。

 curl -sfL https://get.k3s.io | K3S_URL=https://10.128.0.49:6443 K3S_TOKEN="K1027e02d430f1a7c8a4e9a67b9a8a354875ff92c366a830d66ceada5784518e8c8::2bhamg.xd7vwu3dlkqyipvh" sh -
4. 验证集群状态
kubectl get nodes
slc@kata-1:~$ kg nodes
NAME     STATUS   ROLES                  AGE    VERSION
kata-2   Ready    <none>                 100m   v1.28.8+k3s1
kata-1   Ready    control-plane,master   104m   v1.28.8+k3s1
kata-3   Ready    <none>                 99m    v1.28.8+k3s1
5. 安装 Kata 环境

此处我们使用 cloud hypervisor 作为默认的 hypervisor,更多选择见 kata-deploy。

git clone https://github.com/kata-containers/kata-containers.git
cd kata-containers/tools/packaging/kata-deploy/
kubectl apply -f kata-rbac/base/kata-rbac.yaml
kubectl apply -k kata-deploy/overlays/k3s
kubectl apply -f https://raw.githubusercontent.com/kata-containers/kata-containers/main/tools/packaging/kata-deploy/runtimeclasses/kata-runtimeClasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kata-containers/kata-containers/main/tools/packaging/kata-deploy/examples/test-deploy-kata-clh.yaml
6. 验证 Kata 环境安装成功
kubectl get pods -A
slc@kata-1:~$ kg pods -A
NAMESPACE     NAME                                            READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-6c86858495-z4fm5         1/1     Running     0          106m
kube-system   svclb-traefik-5010304c-zldjh                    2/2     Running     0          106m
kube-system   svclb-traefik-5010304c-wlmtb                    2/2     Running     0          103m
kube-system   svclb-traefik-5010304c-49jz5                    2/2     Running     0          102m
kube-system   kata-deploy-6hw8t                               1/1     Running     0          98m
kube-system   kata-deploy-g4j9s                               1/1     Running     0          98m
kube-system   kata-deploy-drn8w                               1/1     Running     0          98m
kube-system   helm-install-traefik-zl849                      0/1     Completed   1          106m
kube-system   helm-install-traefik-crd-rhfl4                  0/1     Completed   0          106m
default       php-apache-kata-clh-67f67d6f89-h2dw6            1/1     Running     0          94m
kube-system   metrics-server-54fd9b65b-hqpm7                  1/1     Running     0          106m
kube-system   coredns-6799fbcd5-68wxv                         1/1     Running     0          106m
kube-system   traefik-f4564c4f4-4crfq                         1/1     Running     0          106m     

我们可以看到对应的 runtime。

root        6902  0.0  0.2 1419432 39560 ?       Sl   07:22   0:03 /opt/kata/bin/containerd-shim-kata-v2 -namespace k8s.io -address /run/k3s/containerd/containerd.sock -publish-binary  -id 9e7c835d4868398b062d9735e
root        6914  0.0  0.0   2612  1920 ?        S    07:22   0:00  \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/9e7c835d4868398b062d9735eb28115be58e5ab8ce
root        6919  0.0  0.1 2106124 26756 ?       Sl   07:22   0:00  |   \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/9e7c835d4868398b062d9735eb28115be58e5a
root        6915  0.3  0.9 2385428 151808 ?      Sl   07:22   0:18  \_ /opt/kata/bin/cloud-hypervisor --api-socket /run/vc/vm/9e7c835d4868398b062d9735eb28115be58e5ab8ce7111f0e729f651b7a3c2c3/clh-api.sock

安装 KubeBlocks

curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash
kbcli kubeblocks  list-versions
kbcli kubeblocks  install --version="0.8.2"

安装过程中报错:

slc@kata-1:~$ kbcli kubeblocks  install --version="0.8.2"
The connection to the server localhost:8080 was refused - did you specify the right host or port?

原因是 kbcli 在枚举 K8s context 的过程中找不到 kubeconfig,所以最终拼了 localhost:8080 来做最后尝试,加软连接后解决。

ln -sf /etc/rancher/k3s/k3s.yaml /home/slc/.kube/.kubeconfig

等待 KB 安装成功。

创建数据库集群

1. 创建普通集群

该集群还是由 runC 托管。

kbcli cluster create --cluster-definition=apecloud-mysql
kbcli cluster connect aloe03Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kubeblocks         |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

Runtime 信息:

root       11801  0.1  0.0 1238384 15136 ?       Sl   08:21   0:02 /var/lib/rancher/k3s/data/ef92c15b8f1c59f266ea4a9589be87b1b799d1682673f29721e8a1f7b0a4a97b/bin/containerd-shim-runc-v2 -namespace k8s.io -id 604c9d603425ef5c172e94a7598af3fd1b7e2004dfef4e7517e5e731e5123fc7 -address /run/k3s/containerd/containerd.sock
65535      11822  0.0  0.0    972   512 ?        Ss   08:21   0:00  \_ /pause
ubuntu     12032  0.9  1.4 1105756 217004 ?      Ssl  08:21   0:25  \_ mysqld
root       12181  0.0  0.0  22716  2320 ?        Ss   08:21   0:00  |   \_ crond -i -s
root       12590  0.0  0.0   1604   896 ?        Ss   08:21   0:00  \_ /bin/sh /scripts/agamotto.sh
root       12602  0.1  0.6 885824 99328 ?        Sl   08:21   0:03  |   \_ /bin/agamotto --config=/opt/agamotto/agamotto-config.yaml
root       12752  0.0  0.0   2388  1664 ?        Ss   08:22   0:00  \_ /bin/bash /scripts/vttablet.sh
root       14978  0.0  0.0   2312  1280 ?        S    09:06   0:00  |   \_ sleep 60
65532      12911  0.1  0.3 1287692 52068 ?       Ssl  08:22   0:03  \_ lorry --port 3501 --grpcport 50001
65532      12950  0.0  0.2 1271036 35072 ?       Ssl  08:22   0:00  \_ /bin/reloader --log-level info --operator-update-enable --tcp 9901 --config /opt/config-manager/config-manager.yaml
2. 创建 kata mysql 集群

如果需要 kata 支持,需要修改 podSpec,添加:

      podSpec:runtimeClassName: kata-clh

下载 083 版本对应的 kubeblocks-addon:

wget https://github.com/apecloud/kubeblocks-addons/archive/refs/tags/v0.8.3-beta.5.tar.gz
tar zxf v0.8.3-beta.5.tar.gz

修改 apecloud-mysql addon 的 ClusterDefinition:

cd kubeblocks-addons-0.8.3-beta.5/addons
vi apecloud-mysql/templates/clusterdefinition.yaml
添加所有 podSpec 对 kata 支持podSpec:runtimeClassName: kata-clhcontainers:- name: mysql

保存并渲染新的 apecloud-mysql addon:

helm template apecloud-mysql --set resourceNamePrefix="kata-apecloud-mysql" > /tmp/a
kubectl apply -f /tmp/a
slc@kata-1:~$ kubectl get cd
NAME                  MAIN-COMPONENT-NAME   STATUS      AGE
redis                 redis                 Available   105m
clickhouse            clickhouse            Available   105m
mongodb-sharding      mongos                Available   105m
mongodb               mongodb               Available   105m
kafka                 kafka-server          Available   105m
pulsar-zookeeper      zookeeper             Available   105m
postgresql            postgresql            Available   105m
apecloud-mysql        mysql                 Available   105m
pulsar                pulsar-broker         Available   105m
kata-apecloud-mysql   mysql                 Available   13m

创建基于 Kata 的 apecloud-mysql:

slc@kata-1:~$ kbcli cluster create --cluster-definition=kata-apecloud-mysql
Info: --cluster-version is not specified, ClusterVersion kata-apecloud-mysql-8.0.30 is applied by default
Cluster cornel23 created

登录 Kata MySQL:

kbcli cluster connect cornel23
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kubeblocks         |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

测试其他命令:

slc@kata-1:~$ kubectl exec -it cornel23-mysql-0 -- /bin/sh
Defaulted container "mysql" out of: mysql, metrics, vttablet, lorry, config-manager
sh-4.2# ls
anaconda-post.log  apecloud  bin  data        dev  docker-entrypoint-initdb.d  etc  home  lib  lib64        media  mnt  opt  proc  root  run  sbin        scripts  srv  sys  tmp        usr  var
sh-4.2#

查看 runtime 进程:

root       19681  0.2  0.2 1419688 40612 ?       Sl   09:52   0:01 /opt/kata/bin/containerd-shim-kata-v2 -namespace k8s.io -address /run/k3s/containerd/containerd.sock -publish-binary  -id 115051aa1546b66657f14cd9a
root       19702  0.0  0.0   2612  1920 ?        S    09:52   0:00  \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/115051aa1546b66657f14cd9a19f4223f98370377b
root       19708  1.4  2.4 3155940 380292 ?      Sl   09:52   0:10  |   \_ /opt/kata/libexec/virtiofsd --syslog --cache=auto --shared-dir=/run/kata-containers/shared/sandboxes/115051aa1546b66657f14cd9a19f4223f98370
root       19703 13.1  3.8 3436120 591872 ?      Sl   09:52   1:31  \_ /opt/kata/bin/cloud-hypervisor --api-socket /run/vc/vm/115051aa1546b66657f14cd9a19f4223f98370377b3145354b8703bbcf2939c5/clh-api.sock

结论

藉由 KubeBlocks,我们可以很方便地将数据跑在 kata 上。然而,如果要更好支持 kata,KubeBlocks 还需要更原生地去支持 K8s 的 runtimeClass 机制,以支持更多的 runtime 环境。

此外,我们也能感受到,由于对 CRI 的良好兼容,kata 在保障安全性的同时,也能提供良好的使用体验。

End

KubeBlocks 已发布 v0.8.0(KubeBlocks v0.8.0 发布!Component API 让数据库引擎组装更简单!)!KubeBlocks v0.8.0 推出了 Component API,让数据库引擎的组装变得更加简单。Addon 机制也有了重大改进,数据库引擎的 helm chart 从 KubeBlocks repo 中拆分出去,从此数据库引擎或者版本的变动已与 KubeBlocks 发版解绑。v0.8.0 还支持多版本的数据库引擎定义。Pika、ClickHouse、OceanBase、MySQL、PostgreSQL、Redis 等均有功能更新,快来试试看!

小猿姐诚邀各位体验 KubeBlocks,也欢迎您成为产品的使用者和项目的贡献者。跟我们一起构建云原生数据基础设施吧!

💻 官网: www.kubeblocks.io

🌟 GitHub: https://github.com/apecloud/kubeblocks

🚀 Get started: https://kubeblocks.io/docs/preview/user_docs/try-out-on-playground/try-kubeblocks-on-your-laptop

关注小猿姐,一起学习更多云原生技术干货。

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

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

相关文章

【算法刷题 | 贪心算法03】4.25(最大子数组和、买卖股票的最佳时机|| )

文章目录 4.最大子数组和4.1题目4.2解法一&#xff1a;暴力4.2.1暴力思路4.2.2代码实现 4.3解法二&#xff1a;贪心4.3.1贪心思路4.3.2代码实现 5.买卖股票的最佳时机||5.1题目5.2解法&#xff1a;贪心5.2.1贪心思路5.2.2代码实现 4.最大子数组和 4.1题目 给你一个整数数组 n…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本&#xff0c;此表列出了仍支持哪些 Xdebug 版本&#xff0c;以及哪些版本可用…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章&#xff1a;GPT-4与人类互动的未来&#xff01; 本文探讨了生成式预训练 Transformer (GPT) 的显着演变&#xff0c;提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃&#xff0c;深刻影响人工智能领域以及我们与技术的互动。 我…

linux+ndk把jni制作成so库供apk使用(基础)

环境配置之类的我之前的博客有写,这篇文章我们就直接开始 1.在有ndk配置的服务器创建文件夹,文件夹再创建jni文件夹,jni文件夹里面放置Application.mk,Android.mk与test.c,因为我的ndk运行配置默认是项目下面的jni目录,所以我需要多一个jni目录 2.这里的Application.mk写的是架…

OpenHarmony语言基础类库【@ohos.util (util工具函数)】

ohos.util (util工具函数) 该模块主要提供常用的工具函数&#xff0c;实现字符串编解码&#xff08;[TextEncoder])&#xff0c;[TextDecoder]&#xff09;、有理数运算&#xff08;[RationalNumber8]&#xff09;、缓冲区管理&#xff08;[LRUCache9]&#xff09;、范围判断&…

5款好用的监控员工电脑软件推荐 (如何监控员工上班工作情况)

在现代的商业环境中&#xff0c;管理和监控员工的工作内容是至关重要的。 为了确保员工的工作效率和质量&#xff0c;公司需要使用一些工具来监控他们的工作进程。 以下是五款实用的监控员工工作内容的软件。 域智盾软件 域智盾是一款专为企业打造的智能管理系统。 它借助人…

Vivado-IP-DDS and Testbench Learning

DDS内部结构 实现流程 首先新建一个工程&#xff0c;创建bd文件&#xff0c;添加DDS Compiler核&#xff0c;此处不多赘述 Block Design 在观测输出的信号时&#xff0c;需要将最高位符号位的信号取反&#xff0c;这样才能输出正弦波&#xff0c;否则输出的波形如下图所示 将t…

暴雨亮相CCBN2024 助力广电行业数智化转型

4月23日&#xff0c;第三十届中国国际广播电视信息网络展览会&#xff08;简称CCBN2024&#xff09;在北京开展&#xff0c;本次展览会由国家广播电视总局指导、广播电视科学研究院主办&#xff0c;作为国内广电视听领域首个综合性、专业化、引领性、国际化科技产业盛会&#x…

第三节课,后端登录【1】

一、总任务 二、登录接口 get 请求&#xff0c;有缺陷&#xff0c;长度有限制 三、登录逻辑 四、代码书写位置 4.1 编写业务逻辑的位置 五、写代码 5.1 代码1 5.1.1 细节 按 CtrlAltShiftL ,快速格式化 5.1. 2 自动生成接口参数 先/** 再回车 效果图 5.2 按 alt enter …

ffmpeg与sdl的个人笔记

说明 这里的ffmpeg基础知识和sdl基础知识仅提及与示例代码相关的知识点, 进阶可学习雷神的博客。 https://blog.csdn.net/leixiaohua1020 当然&#xff0c;如代码写的有问题或有更好的见解&#xff0c;欢迎指正&#xff01; 音视频基础知识 在学习音视频理论知识时&#xff…

德思特车载天线方案:打造智能互联的公共安全交通网络

作者介绍 一、方案介绍 随着自动驾驶与智慧汽车概念的逐步推进&#xff0c;人们对汽车的交互性、智能性、互联性有了更高的要求。今天&#xff0c;大多数汽车制造商和供应商普遍将GNSS定位功能与其他信号如广播、电视、蓝牙、Wifi一起集成到汽车中&#xff0c;包括博世、大陆、…

LabVIEW学习记录2 - MySQL数据库连接与操作

LabVIEW学习记录2 - MySQL数据库连接与操作 一、前期准备1.1 windows下安装MySQL的ODBC驱动 二、LabVIEW创建MySQL 的UDL文件三、LabVIEW使用UDL文件进行MySQL数据库操作3.1 建立与数据库的连接&#xff1a;DB Tools Open Connection.vi3.2 断开与数据库的连接&#xff1a;DB T…

【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果 【C语言】贪吃蛇&#xff08;控制台&#xff09; 二、源码 &#x1f388;&#x1f388;&#x1f388;Snake 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)&#x1f388;&#x1f388;&#x1f388; 三、如何使用C语言去实现一个贪吃蛇&#xff1f…

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…

【机器学习】集成学习---投票法(Voting)

一、引言 集成学习&#xff08;Ensemble Learning&#xff09;是机器学习领域中的一种重要策略&#xff0c;它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下&#xff0c;集成学习能够通过综合多个模型的优点来减少这种风险&#xff0c;从而…

【北京迅为】《iTOP龙芯2K1000开发指南》-第三部分 迅为龙芯开发板快速体验

龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

使用navicate演示在 PostgreSQL 中使用 for 循环语句

1、简单循环示例 do $$ beginfor cnt in 1..10 loopraise notice cnt: %, cnt;end loop; end; $$ navicate中执行 2、循环查询 do $$ declare_record record; beginfor _record in (SELECT version,description FROM flyway_schema_history ORDER BY installed_rank desc li…

JavaScript:js实现在线五子棋人机(人人)对弈

在线五子棋人机对弈 全部使用前端技术,使用HTML,CSS以及JS进行实现. 棋盘在后端就是一个15*15的二维数组 页面设计 页面设计的比较粗糙 主要使用js自带的canvas画布进行绘画 HTML代码如下: <div class"outer"><canvas id"canvas" height&qu…

软件设计师-基础知识科目-计算题汇总1

1. 位运算&#xff1a; 略 2. 进制转换&#xff1a; 3. 计算内存存储容量&#xff1a; 前置概念&#xff1a;** 内存地址是16进制。 16进制后面的加上的字母H&#xff0c;表示数字为16进制。内存地址编址的单位是Byte&#xff0c;1K 1024B&#xff0c;1024用16进制表示为400H …

C语言 流程图与伪代码 缩减

本文 我们来说说流程图 伪代码和代码缩进 这些可以让我们在后面书写复杂逻辑时 不会感到 繁琐或逻辑混乱 流程图(Flowchart) 是用以算法、工作流或流程的一种框图表示&#xff0c;它以不同类型的框代表不同种类的步骤&#xff0c;每两个步骤之间则以箭头连接。 流程图是程序…