0. 前言

某天突发奇想,既然都学了 docker 了,那干脆,顺便把 kubernetes 也学了,于是开始了我长达一个月的环境搭建、踩坑历程。

最开始,我的想法是,在我的物理机使用 WSL + docker 来部署服务,但是 WSL 部署的服务好像只是单机版,和实际生产中的情况相差甚远,于是,我去弄了几台服务器,一台阿里云 2C2G,一台腾讯云 4C8G,一台腾讯云 2C2G。

基于本人比较喜欢折腾的特点,我没有选择常见的 CentOS 来搭建,而是使用了 Ubuntu (问就是平时用 WSL 用多了,对 Ubuntu 有了感情 bushi)。然后就开始了我漫长的异地组网历程。记得前后搭建了半个多月吧,前面七天基本在搭建环境,解决镜像源问题,后面七天在解决两个 node 之间的通信,后面发现,我租用的服务器,都是弹性服务器,没法换公网和内网的 ip,目前跨 VPC 构建 k8s 集群不是一个好方法 (毕竟企业不可能这样做,最多也就是学生搞来玩玩),没办法,只好自己搞虚拟机了,不过还好,又历经一周,虚拟机的搭建成功了,后面如果能搞到更多磁盘和内存的话,可能会尝试双 master 和多 node 的集群。

正文部分比较多配置文件的代码,如果想看有代码折叠版本的文章,欢迎移步个人小破站:基于Ubuntu20.04在k8s 1.25部署gin+MySQL服务 | Jayden's Blog (jaydenchang.top)

1. 环境搭建

1.1 环境说明

节点名称、ip:

  • master:192.168.22.222
  • node1:192.168.22.223

master 要求 至少 2G RAM,2 核 CPU

1.2 版本信息
  • 系统版本:Ubuntu server 20.04.6
  • Docker:20.10.21
  • Kubernetes:1.25.0
1.3 环境配置

设置主机名及解析

  1. # master
  2. sudo systemctl set-hosename master
  3. sudo cat > /etc/hosts << EOF
  4. 192.168.22.222 master
  5. 192.168.22.223 node1
  6. EOF
  7. # node1systemctl set-hosename node1
  8. sudo cat > /etc/hosts << EOF
  9. 192.168.22.222 master
  10. 192.168.22.223 node1
  11. EOF

关闭 swap

  1. sudo swapoff -a
  2. # 注释/etc/fstab文件的最后一行
  3. sudo sed -i '/swap/s/^/#/' /etc/fstab

开启 IPv4 转发

  1. sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  2. overlay
  3. br_netfilter
  4. EOF
  5. # 分割线
  6. modprobe overlay
  7. modprobe br_netfilter
  8. # 分割线
  9. sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  10. net.bridge.bridge-nf-call-iptables = 1
  11. net.bridge.bridge-nf-call-ip6tables = 1
  12. net.ipv4.ip_forward = 1
  13. EOF
  14. #分割线
  15. sudo sysctl --system
1.4 安装 containerd

从 k8s 1.25 开始使用 containerd 来作为底层容器支持,根据 k8s 和 containerd 的匹配要求,这里我们使用 containerd 1.7.0

  1. # apt 安装无法安装最新的版本,这里使用tar包解压
  2. wget https://github.com/containerd/containerd/releases/download/v1.7.0/containerd-1.7.0-linux-amd64.tar.gz
  3. tar zxvf containerd-1.7.0-linux-amd64.tar.gz -C /usr/local
  4. # 导出默认配置
  5. sudo containerd config default > /etc/containerd/config.toml
  6. # 编辑配置文件
  7. sudo vim /etc/containerd/config.toml
  8. # 进入到 vim 后搜索、替换
  9. # 修改sandbox_image行替换为aliyun的pause镜像
  10. sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
  11. # 配置 systemd cgroup 驱动
  12. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  13. ...
  14. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  15. SystemdCgroup = true
  16. # 配置镜像加速
  17. [plugins."io.containerd.grpc.v1.cri".registry]
  18. [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  19. [plugins. "io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  20. endpoint = ["https://registry.aliyuncs.com"]

添加 containerd 服务

  1. sudo cat > /etc/systemd/system/containerd.service << EOF
  2. # Copyright The containerd Authors.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. [Unit]
  16. Description=containerd container runtime
  17. Documentation=https://containerd.io
  18. After=network.target local-fs.target
  19. [Service]
  20. #uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
  21. #Environment="ENABLE_CRI_SANDBOXES=sandboxed"
  22. ExecStartPre=-/sbin/modprobe overlay
  23. ExecStart=/usr/local/bin/containerd
  24. Type=notify
  25. Delegate=yes
  26. KillMode=process
  27. Restart=always
  28. RestartSec=5
  29. # Having non-zero Limit*s causes performance problems due to accounting overhead
  30. # in the kernel. We recommend using cgroups to do container-local accounting.
  31. LimitNPROC=infinity
  32. LimitCORE=infinity
  33. LimitNOFILE=infinity
  34. # Comment TasksMax if your systemd version does not supports it.
  35. # Only systemd 226 and above support this version.
  36. TasksMax=infinity
  37. OOMScoreAdjust=-999
  38. [Install]
  39. WantedBy=multi-user.target
  40. EOF

加载配置,启动 contained 服务

  1. systemctl daemon-reload
  2. systemctl enable --now containerd
1.5 安装 kubernetes

安装必要组件

  1. sudo apt-get install -y apt-transport-https ca-certificates curl

添加阿里云安装源

  1. sudo cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
  2. deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
  3. EOF
  4. gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB
  5. gpg --export --armor BA07F4FB | sudo apt-key add -
  6. curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

安装 k8s

  1. sudo apt-get update
  2. sudo apt-get install -y kubelet=1.25.0-00 kubeadm=1.25.0-00 kubectl=1.25.0-00
  3. systemctl enable --now kubelet

标记软件包,避免自动更新

  1. sudo apt-mark hold kubelet kubeadm kubectl
1.6 安装 docker
  1. apt install docker.io
1.7 初始化 kubernetes 集群

使用 kubeadm 初始化

  1. # 这里的apiserver那行是master的ip, 注意service-cidr和pod-network-cidr和节点ip不要出现在同一网段
  2. kubeadm init \
  3. --image-repository registry.aliyuncs.com/google_containers \
  4. --apiserver-advertise-address=192.168.22.222 \
  5. --service-cidr=10.96.0.0/12 \
  6. --pod-network-cidr=22.22.0.0/16 \
  7. --kubernetes-version v1.25.0

如果没有报错的话,配置环境变量

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. export KUBECONFIG=/etc/kubernetes/admin.conf

node1 端输入类似这样的命令

  1. # 记得在 node1 开放6443端口
  2. kubeadm join 192.168.22.223:6443 --token dc4wxa.qar86v4pb1b2umvm \
  3. --discovery-token-ca-cert-hash sha256:1df0074a2226ed1a56f53b9d33bf263c51d3794b4c4b9d6132f07b68592ac38a
  4. # token 是随机生成的

重新生成 token

  1. kubeadm token create --print-join-command
1.8 安装 calico 网络插件

流行的有 flannel 和 calico,这里选择 calico

  1. wget https://raw.staticdn.net/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml
  2. sudo kubectl create -f tigera-operator.yaml
  3. wget https://raw.staticdn.net/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml
  4. vim custom-resources.yaml
  5. # 修改cidr配置
  6. apiVersion: operator.tigera.io/v1
  7. kind: Installation
  8. metadata:
  9. name: default
  10. spec:
  11. # Configures Calico networking.
  12. calicoNetwork:
  13. # Note: The ipPools section cannot be modified post-install.
  14. ipPools:
  15. - blockSize: 26
  16. cidr: 10.244.0.0/16 # 修改为刚刚初始化时的 pod-network-cidr
  17. encapsulation: VXLANCrossSubnet
  18. natOutgoing: Enabled
  19. nodeSelector: all()

注意,custom-resources.yamlspec.calicoNetwork.ipPools.cidr 一定要和刚刚初始化的 pod-network-cidr 一致,不然无法添加 calico 插件

查看 pod 状态

  1. $ kubectl get pod -A
  2. NAMESPACE NAME READY STATUS RESTARTS AGE
  3. calico-apiserver calico-apiserver-95575566-mpv54 1/1 Running 4 (156m ago) 3d1h
  4. calico-apiserver calico-apiserver-95575566-n4x5w 1/1 Running 4 (156m ago) 3d1h
  5. calico-system calico-kube-controllers-85666c5b94-lll7q 1/1 Running 4 (156m ago) 3d1h
  6. calico-system calico-node-djqts 1/1 Running 4 (14h ago) 3d1h
  7. calico-system calico-node-wp4cf 1/1 Running 4 (156m ago) 3d1h
  8. calico-system calico-typha-76fd59d84d-xn79m 1/1 Running 6 (156m ago) 3d1h
  9. calico-system csi-node-driver-74p7m 2/2 Running 8 (156m ago) 3d1h
  10. calico-system csi-node-driver-t86b2 2/2 Running 8 (14h ago) 3d1h
  11. kube-system coredns-c676cc86f-tmq7f 1/1 Running 4 (156m ago) 3d1h
  12. kube-system etcd-master 1/1 Running 4 (156m ago) 3d1h
  13. kube-system kube-apiserver-master 1/1 Running 4 (156m ago) 3d1h
  14. kube-system kube-controller-manager-master 1/1 Running 4 (156m ago) 3d1h
  15. kube-system kube-proxy-449rk 1/1 Running 4 (14h ago) 3d1h
  16. kube-system kube-proxy-vswhw 1/1 Running 4 (156m ago) 3d1h
  17. kube-system kube-scheduler-master 1/1 Running 4 (156m ago) 3d1h
  18. tigera-operator tigera-operator-6675dc47f4-wcfxf 1/1 Running 7 (155m ago) 3d1h

2. 部署 MySQL

先编写一个 mysql-deploy.yaml 配置文件

  1. apiVersion: apps/v1 # apiserver的版本
  2. kind: Deployment # 副本控制器deployment,管理pod和RS
  3. metadata:
  4. name: mysql # deployment的名称,全局唯一
  5. namespace: default # deployment所在的命名空间
  6. labels:
  7. app: mysql
  8. spec:
  9. replicas: 1 # Pod副本期待数量
  10. selector:
  11. matchLabels: # 定义RS的标签
  12. app: mysql # 符合目标的Pod拥有此标签
  13. strategy: # 定义升级的策略
  14. type: RollingUpdate # 滚动升级,逐步替换的策略
  15. template: # 根据此模板创建Pod的副本(实例)
  16. metadata:
  17. labels:
  18. app: mysql # Pod副本的标签,对应RS的Selector
  19. spec:
  20. nodeName: node1 # 指定pod运行在的node
  21. containers: # Pod里容器的定义部分
  22. - name: mysql # 容器的名称
  23. image: mysql:8.0 # 容器对应的docker镜像
  24. volumeMounts: # 容器内挂载点的定义部分
  25. - name: time-zone # 容器内挂载点名称
  26. mountPath: /etc/localtime # 容器内挂载点路径,可以是文件或目录
  27. - name: mysql-data
  28. mountPath: /var/lib/mysql # 容器内mysql的数据目录
  29. - name: mysql-logs
  30. mountPath: /var/log/mysql # 容器内mysql的日志目录
  31. ports:
  32. - containerPort: 3306 # 容器暴露的端口号
  33. env: # 写入到容器内的环境容量
  34. - name: MYSQL_ROOT_PASSWORD # 定义了一个mysql的root密码的变量
  35. value: "root"
  36. volumes: # 本地需要挂载到容器里的数据卷定义部分
  37. - name: time-zone # 数据卷名称,需要与容器内挂载点名称一致
  38. hostPath:
  39. path: /etc/localtime # 挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
  40. - name: mysql-data
  41. hostPath:
  42. path: /data/mysql/data # 本地存放mysql数据的目录
  43. - name: mysql-logs
  44. hostPath:
  45. path: /data/mysql/logs # 本地存入mysql日志的目录

在编写一个对外提供服务的 mysql-svc.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: mysql
  5. labels:
  6. name: mysql
  7. spec:
  8. type: NodePort
  9. ports:
  10. - port: 3306
  11. targetPort: 3306
  12. nodePort: 30001
  13. selector:
  14. app: mysql

创建服务

  1. kubectl create -f mysql-deploy.yaml
  2. kubectl create -f mysql-svc.yaml

查看节点是否正常运行

  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. mysql-566cddf86-v65mw 1/1 Running 2 (15h ago) 2d1h

访问数据库,密码的话,刚有在 yaml 中说明,为 root,登陆成功后即可输入数据

  1. kubectl exec -it mysql-566cddf86-v65mw -- mysql -u root -p

开放远程连接权限

  1. FLUSH PRIVILEGES;
  2. /* mysql8.0 只能以这种方式来赋权*/
  3. alter user 'root'@'%' identified with mysql_native_password by 'root';
  4. GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'root'@'%';
  5. flush privileges;

然后 node1 节点要开放 3306 端口和 30001 端口 (刚刚设置的对外开放的端口),可以在宿主机连接集群的数据库

  1. mysql -u root -h 192.168.22.223 -P 30001 -p

3. 部署 gin 服务

BuyHouse: 一个简单的gin+MySQL数据查询系统,课程实训项目 (gitee.com)

这里使用了学校实训项目的一个 demo,这里我只用到了 gin 部分。

制作镜像以前,我们先看看集群里 MySQL 的 ip

看到 mysql 集群 ip 为 22.22.166.184,那么 gin 里数据库配置 (database/mysql.go) 的 ip 也要改成 22.22.166.184

首先是把项目打包成 docker image,在项目根目录 (go.mod 所在目录),编写 Dockerfile

  1. FROM golang:1.18-alpine AS builder
  2. WORKDIR /app
  3. COPY . /app
  4. RUN go env -w GO111MODULE=on
  5. RUN go env -w GOPROXY=https://goproxy.cn,direct
  6. RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o app
  7. FROM alpine AS runner
  8. WORKDIR /app
  9. COPY --from=builder /app/app .
  10. EXPOSE 9999:9999
  11. ENTRYPOINT ["./app"]

这里使用多级构建 (实际也就两层,太懒了,不想搞太多了,十多兆已经是我可以接受的大小了 doge),如果不这样做,构建出的镜像差不多 1G,不论是推送到仓库还是拉取,都会很影响效率。

然后执行

  1. docker build -t buy-house .

docker 就会拉取、打包镜像,用 docker images 可以查看多了一个 buy-house 的镜像,如果想要推送到个人仓库的话,执行

  1. docker tag buy-house jaydenchang/buy-house

然后在 Docker 客户端 (已登陆了个人账号) 推送即可。

然后编写 go-deploy.yaml,这里我使用自己制作的镜像,并上传到了个人仓库

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: go-deployment
  5. labels:
  6. app: go
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: go
  11. replicas: 2
  12. minReadySeconds: 5
  13. strategy:
  14. type: RollingUpdate
  15. rollingUpdate:
  16. maxSurge: 1
  17. maxUnavailable: 1
  18. template:
  19. metadata:
  20. labels:
  21. app: go
  22. spec:
  23. containers:
  24. - image: jaydenchang/buy-house:latest
  25. name: go
  26. imagePullPolicy: Always
  27. command: ["./app","-v","v1.3"]
  28. ports:
  29. - containerPort: 9999
  30. protocol: TCP

编写 go-svc.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: go-service
  5. labels:
  6. app: go
  7. spec:
  8. selector:
  9. app: go
  10. ports:
  11. - name: go-port
  12. protocol: TCP
  13. port: 9999
  14. targetPort: 9999
  15. nodePort: 31080
  16. type: NodePort

生成节点

  1. kubectl create -f go-svc.yaml
  2. kubectl create -f go-deploy.yaml

检查一下

  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. busybox 1/1 Running 2 (14m ago) 173m
  4. go-deployment-66878c4885-twmzs 1/1 Running 0 29s
  5. go-deployment-66878c4885-zxjqb 1/1 Running 0 29s
  6. mysql-566cddf86-v65mw 1/1 Running 3 (14m ago) 2d2h

go 的镜像被分配到了 node1 节点,我们输入 node1IP:port,也就是 192.168.22.223:31080

其他接口就不测试了 (一个拿不出眼的小项目就不展示太多了)。至此,整个部署过程结束。这次小试牛刀,搭建一个比较简易的双节点集群。未来的学习,可能会尝试更复杂的集群部署 (先给自己挖个坑吧)。

参考链接

ubuntu 运行 apt-get update 时阿里云 k8s 安装源报错_已解决_博问_博客园 (cnblogs.com)

一个k8s集群——跨云服务器部署_k8s跨云部署_qq_43285879的博客-CSDN博客

kanzihuang/kubespray-extranet: Create a kubernetes cluster on the public network (github.com)

跨VPC或者跨云供应商搭建K8S集群 - Search (bing.com)

公网环境搭建k8s集群 - ttlv - 博客园 (cnblogs.com)

Kubernetes(k8s)安装以及搭建k8s-Dashboard详解 - 掘金 (juejin.cn)

Kubernetes 1.27 快速安装手册 - 知乎 (zhihu.com)

基于Ubuntu-22.04 kubeadm安装K8s-v1.25.0 | Marshall's blog (aledk.com)

k8s 初始化master节点时无calico,coredns一直是pending状态_calico pending_copa~的博客-CSDN博客

K8s部署自己的web项目_k8s 前端_肖仙女hhh的博客-CSDN博客

公网创建 kubernetes 集群的解决方案 · GitHub

在Linux公网、云服务器搭建K8s集群 - 知乎 (zhihu.com)

(43条消息) kubernetes集群部署nginx应用服务_kubernetes部署nginx_鱼大虾的博客-CSDN博客

k8s集群部署mysql完整过程记录 - blayn - 博客园 (cnblogs.com)

部署go项目到k8s集群 - Jeff的技术栈 - 博客园 (cnblogs.com)

如何给go项目打最小docker镜像,足足降低99%_Scoful的博客-CSDN博客

基于Ubuntu20.04在k8s 1.25部署gin+MySQL服务的更多相关文章

  1. 在Linux环境下部署MySql服务

    之前有下载部署过几次,但是每次都会踩一些坑.特此记录在liunx下部署安装mysql的基本步骤: 1.卸载老版本的mysql find / -name mysql|xargs rm -rf     查 ...

  2. kubeadm部署1.17.3[基于Ubuntu18.04]

    基于 Ubuntu18.04 使用 kubeadm 部署Kubernetes 1.17.3 高可用集群 环境 所有节点初始化 # cat <<EOF>> /etc/hosts ...

  3. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作win2008r2-19

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作win2008r2-19 欢迎加QQ群:1026880196 进行交流学习 制作OpenSta ...

  4. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作ubuntu16.04-16

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作ubuntu16.04-16 欢迎加QQ群:1026880196 进行交流学习   制作Ope ...

  5. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作centos6.5-14

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作centos6.5-14 欢迎加QQ群:1026880196 进行交流学习 制作OpenSta ...

  6. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之系统安装-03

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之系统安装-03  欢迎加QQ群:1026880196  进行交流学习 一.镜像下载 网易源: http ...

  7. Rainbond ubuntu20.04单主机(allinone)部署及简单应用构建

    1.Rainbond是什么? Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器.Kubernetes和底层复杂技术,支持管理多个Kubernetes集群,和管理企业应用全生命周期. ...

  8. 基于ubuntu16.04部署IBM开源区块链项目-弹珠资产管理(Marbles)

    前言 本教程基本上是对Marbles项目的翻译过程. 如果英文比较好的话,建议根据官方操作说明,一步步进行环境部署.当然你也可以参考本教程在自己的主机上部署该项目. Marbles 介绍 关于 Mar ...

  9. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(五):测试项目

    基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...

  10. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(四):安装MySQL数据库

    基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...

随机推荐

  1. MindSpore编译构建后Vmap模块的RuntimeError问题

    技术背景 这篇文章来源于MindSpore仓库中的一个Issue,简单描述问题就是,如果你用MindSpore开发了一个python软件供别人使用,那么很有可能涉及到编译构建的问题.但是如果直接使用编 ...

  2. 深入理解MD5算法:原理、应用与安全

    第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要.消息摘要算法是一种用于验证数据完整性和安全性的重要工具.在众多消息摘要算法中,MD5(Message Digest Algorith ...

  3. centos7搭建vsftpd环境详解[亲测成功]

    centos7搭建vsftpd环境详解(亲测) 标签: centos7vsftpd   分类: linux相关(关于centos)(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 初学L ...

  4. sql 语句系列(删库跑路系列)[八百章之第七章]

    前言 最开心的章节,没有之一. 删除违反参照完整性的记录 EMP 是员工表,DEPT 是部门表 DEPTNO是部门编号 delete from EMP where not exists ( selec ...

  5. c# TryParse

    c# tryparse和parse对比,大体内容是一致的. parse 会返回异常,主要表现为三种. 第一种ArgumentNullException,这里面表示,为空. 第二种formatexcep ...

  6. mmcls 多标签模型部署在torch serve

    GitHub仓库:gy-7/mmcls_multi_label_torchserve (github.com) 各个文件说明: cls_requests_demo:分类模型请求api服务的demo d ...

  7. 深入理解高级加密标准(Advanced Encryption Standard)

    title: 深入理解高级加密标准(Advanced Encryption Standard) date: 2024/4/23 20:04:36 updated: 2024/4/23 20:04:36 ...

  8. 加入自定义块对fashion_mnist数据集进行softmax分类

    在之前,我们实现了使用torch自带的层对fashion_mnist数据集进行分类.这次,我们加入一个自己实现的block,实现一个四层的多层感知机进行softmax分类,作为对"自定义块& ...

  9. 如何将一棵LSM-Tree塞进NVM

    ​简介: 随着非易失内存产品的商业化推广,我们对于其在云原生数据库中大规模推广的潜力越来越有兴趣.X-Engine是阿里云数据库产品事业部PolarDB新型存储引擎团队研发的一个LSM-tree存储引 ...

  10. C# 二进制数组与结构体的互转

    本文将告诉大家在 dotnet 里面的二进制基础处理知识,如何在 C# 里面将结构体数组和二进制数组进行相互转换的简单方法 尽管本文属于基础入门的知识,但是在阅读之前还请自行了解 C# 里面的结构体内 ...