【kubernetes】k8s集群的简述与搭建

简述

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序

关键特性

  1. 自动化部署和回滚:Kubernetes 可以自动化地部署和回滚应用程序,确保应用程序始终处于预期的状态。
  2. 服务发现和负载均衡:Kubernetes 提供内置的服务发现和负载均衡功能,确保流量自动分配到健康的容器实例。
  3. 存储编排:Kubernetes 支持挂载本地存储、云存储和网络存储等多种存储系统。
  4. 自我修复:Kubernetes 可以自动重启失败的容器、替换被杀死的容器、以及在节点不可用时重新调度容器。
  5. 水平扩展:Kubernetes 可以根据需求自动扩展或缩减容器实例的数量。

主要组件

  1. Master 节点:
  • API Server:处理 REST 操作,提供集群的统一入口。
  • etcd:分布式键值存储,用于存储集群的所有数据。
  • Controller Manager:负责执行集群的控制逻辑,管理不同的控制器。
  • Scheduler:调度器,负责将容器调度到合适的节点上运行。
  1. 工作节点(Node):
  • Kubelet:运行在每个节点上,负责管理容器的生命周期。
  • Kube-proxy:负责网络代理和负载均衡。
  • 容器运行时:如 Docker 或 containerd,用于实际运行容器。从1.24版本之后不再使用docker作为运行时。

基本概念

  1. Pod:Kubernetes 中的最小部署单元,一个 Pod 可以包含一个或多个容器。
  2. Service:定义了一组 Pod 的访问策略,提供负载均衡和服务发现。
  3. Deployment:用于声明应用的期望状态,负责管理 Pod 的创建和更新。
  4. Namespace:用于将集群资源划分为逻辑上的组,以便不同的项目或团队使用。

搭建

环境准备

可以多节点部署,也可单节点部署。需要注意的是单节点部署要删除污点,否则无法部署应用

主机名IP地址
master192.168.11.122
node192.168.11.127

1、禁用防火墙、selinux、swap

# 禁用防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 禁用selinux
sudo sed -i 's/enforcing/disabled/' /etc/selinux/config  #永久禁用
sudo setenforce 0  # 临时禁用
# 禁用swap
sudo swapoff -a # 临时禁用
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久禁用

2、将桥接的IPv4流量传递到iptables的链

以下为一条命令,可直接复制执行

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1 # 开启路由转发
net.bridge.bridge-nf-call-ip6tables = 1 # 开启桥流量监控
net.bridge.bridge-nf-call-iptables = 1 # 开启桥流量监控
EOF
# 生效
sudo sysctl --system  

3、apt 切换国内源

Ubuntu 22.04换国内源 清华源 阿里源 中科大源 163源_ubuntu22阿里源-CSDN博客
系统版本:ubuntu22.04
其他版本可自行搜索,不同版本对应不同的代号

cat > /etc/apt/sources.list << EOF# 清华源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverseEOF

换源后,更新

apt-get update

4、时间同步

以下有两种方式,可任选其一

  • 安装chrony
## 安装chrony
sudo apt-get update
sudo apt-get install chrony -y
## 启用并启动Chrony服务
sudo systemctl enable chrony
sudo systemctl start chrony## 检查chrony状态,看时间是否同步
sudo chronyc tracking
  • 安装ntpd
# 安装ntpd
sudo apt-get update
sudo apt-get install ntp# 启动并启用 ntpd 服务
sudo systemctl start ntp
sudo systemctl enable ntp# 检查 ntpd 状态
ntpq -p

更换时区

# 查看当前时区
timedatectl status
# 列出可用时区
timedatectl list-timezones
# 过滤时区列表
timedatectl list-timezones | grep Asia# 更改时区
sudo timedatectl set-timezone Asia/Shanghai# 验证时区更改
timedatectl status

安装k8s组件(所有节点)

  • kubeadm:用来初始化k8s集群的指令。
  • kubelet:在集群的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与k8s集群通信的命令行工具,查看、创建、更新和删除各种资源。

官网:安装kubeadm、kubelet和kubectl

方式一:apt安装

1、更新 apt 包索引,安装k8s需要的依赖包

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  • ca-certificates 是 Linux 系统中一个非常重要的软件包,它包含了一系列的数字证书,这些证书用于验证 HTTPS 连接的安全性
  • apt-transport-https 是一个 APT (Advanced Packaging Tool) 的传输层插件,它允许 APT 通过 HTTPS 协议来获取软件包。

2、下载用于 k8s 软件包仓库的公共签名密钥
如果 /etc/apt/keyrings 目录不存在

sudo mkdir -p -m 755 /etc/apt/keyrings

所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本:

sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3、添加 k8s apt 的源列表

  • 注意版本 Kubernetes 1.31 ; 对于其他 Kubernetes 版本,则需要更改
    在这里插入图片描述

  • 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置

  • 添加之后,直接install不指定版本会默认安装设置的源列表中1.31所有版本中的最新版

sudo echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4、更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

执行成功后,可以看到相关依赖安装成功和安装的版本号
在这里插入图片描述

若想安装指定版本,可查询kubelet、kubeadm、kubectl可安装版本的列表

sudo apt-cache madison kubeadm
sudo apt-cache madison kubelet
sudo apt-cache madison kubectl

在这里插入图片描述

方式二:二进制包安装

二进制包地址(注意版本和架构替换),可自行下载或使用curl,wget等工具

地址: https://dl.k8s.io/release/版本/bin/linux/系统架构(amd64或arm64)/(kubeadm,kubelet,kubectl)

我这里使用最新版本,amd64架构

1、kubectl二进制包

https://dl.k8s.io/release/v1.31.3/bin/linux/amd64/kubectl

2、kubeadm二进制包

https://dl.k8s.io/release/v1.31.3/bin/linux/amd64/kubeadm

3、kubelet二进制包

https://dl.k8s.io/release/v1.31.3/bin/linux/amd64/kubelet

4、赋权并配置全局可执行

二进制包下载完成后,是执行文件,赋权

chmod +x kubeadm
chmod +x kubectl
chmod +x kubelet

配置全局可执行

cp kubeadm kubectl kubelet /usr/bin/

5、配置kubelet.service

vim /etc/systemd/system/kubelet.service

修改ExecStart为自己的kubelet的安装目录

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target[Service]
ExecStart=/usr/bin/kubelet # 注意修改为kubelet执行文件所在目录
Restart=always
StartLimitInterval=0
RestartSec=10[Install]
WantedBy=multi-user.target

设置kubelet开机自启动

sudo systemctl enable kubelet

以上为所有节点的配置,下面进行对master节点的单独配置

配置与初始化(master节点)

1、配置容器运行时(master节点)

官网:Container Runtimes

安装containerd

若安装了docker,可跳过containerd等安装,直接对containerd进行配置,若未安装过可以使用以下方式安装

下载containerd 二进制文件

  • amd64(x86_64)版本
sudo wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-amd64.tar.gz
  • arch64(arm64)版本
sudo wget https://github.com/containerd/containerd/releases/download/v1.6.12/containerd-1.6.12-linux-arm64.tar.gz

解压并安装

  • amd64(x86_64)版本
sudo tar -xvf containerd-1.6.12-linux-amd64.tar.gz
  • arch64(arm64)版本
sudo tar -xvf containerd-1.6.12-linux-arm64.tar.gz

将解压后的二进制文件内容移动到 /usr/local/bin 目录

sudo mv bin/* /usr/local/bin/

创建 containerd 的 systemd 服务文件containerd.service,执行一下命令写入配置

cat > /etc/systemd/system/containerd.service << EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target[Service]
ExecStart=/usr/local/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity[Install]
WantedBy=multi-user.target
EOF

至此,containerd安装完成,下面进行配置

配置containerd

创建配置文件

sudo mkdir -p /etc/containerd

生成容器运行时的默认配置,写入/etc/containerd/config.toml

sudo containerd config default > /etc/containerd/config.toml

进入配置文件,按ESC,输入"/<关键字>"查询内容

sudo vi /etc/containerd/config.toml
  • 按ESC,进入命令模式。输入"/sandbox_image",找到位置后按Enter选中,按i进入插入模式,修改sandbox_image镜像为国内镜像,这里用的阿里云。若配置了代理可不用切换国内源,直接访问k8s镜像源拉取

    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"
    
  • 按ESC,输入"/SystemdCgroup"查询,修改SystemdCgroup = true,使用 systemd 作为容器的 cgroup 驱动程序

  • 修改完成后按ESC,输入:wq保存退出
    重启containerd,并设置开机自启

    sudo systemctl daemon-reload
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    

2、配置cgroup驱动(master节点)

官网:配置cgroup驱动

方式一:输出默认配置文件,写入kubeadm-config.yaml中
sudo kubeadm config print init-defaults > kubeadm-config.yaml

在这里插入图片描述
配置详解:

kind: InitConfiguration(初始化过程的配置)
localAPIEndpoint.advertiseAddress:设置控制平面节点的广播地址,通常是节点的 IP 地址。
bootstrapTokens 用于配置集群的引导令牌(Bootstrap
Tokens)。在集群初始化时,允许新的节点加入集群。引导令牌是一种短期的、一次性的令牌,通常用于在集群初始化和节点加入过程中进行身份验证。
nodeRegistration.name:设置主节点名称。
nodeRegistration.criSocket:如果你使用的是containerd 而不是 Docker,设置为 “/run/containerd/containerd.sock”。

kind: ClusterConfiguration(集群的配置)
kubernetesVersion:指定 Kubernetes 版本,例如"v1.30.1"。
controlPlaneEndpoint:如果你有高可用性(HA)集群,设置控制平面通信的共享端点,例如 “master节点IP:6443”。
networking.podSubnet:指定 Pod网络的子网范围,例如 “10.244.0.0/16”
controllerManager 和 scheduler: 分别包含了控制器管理器和调度器的额外设置。
etcd:包含了etcd(Kubernetes的后端存储)的配置,可以是本地的也可以是外部的。
imageRepository:如果你使用自定义镜像仓库,设置镜像仓库地址,例如registry.aliyuncs.com/google_containers。

增加KubeletConfiguration的配置,设置cgroup驱动为systemd
在1.22及以上版本中,不设置cgroupDriver会默认为systemd,低版本注意修改。

--- # 分隔
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd # 使用 systemd 作为cgroup 驱动程序

修改配置文件
通过/<关键词>搜索 更改默认配置中的localAPIEndpoint.advertiseAddress地址为节点ip、更改节点名称、切换镜像源为阿里源、指定 Pod 网络的 CIDR地址范围

localAPIEndpoint:advertiseAddress: 192.168.11.122 # 主节点的IPnodeRegistration:name: master # 主节点的hostnameimageRepository: registry.aliyuncs.com/google_containersnetworking:podSubnet: 10.244.0.0/16 # 指定 Pod 网络的 CIDR(Classless Inter-Domain Routing)地址范围
方式二:最简配置,创建kubeadm-config.yaml,写入以下配置

以下配置版本为1.31。若安装的其他版本可以通过sudo kubeadm config print init-defaults命令,将kubeadm.k8s.io/v1beta4改为其输出的内容中对应的版本即可

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "192.168.11.122:6443" # master节点IP:6443
networking:podSubnet: "10.244.0.0/16"
imageRepository: registry.aliyuncs.com/google_containers
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

3、初始化master节点

在kubeadm-config.yaml文件所在目录执行命令

sudo kubeadm init --config kubeadm-config.yaml

集群创建成功,执行提示命令,创建集群配置文件,开始使用集群
在这里插入图片描述

需要注意的是:
直接执行export KUBECONFIG=/etc/kubernetes/admin.conf命令是有时效性的,关闭终端立即失效 ,所以也可在root用户执行命令创建配置文件

mkdir -p $HOME/.kube
sudo  cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

或者将export KUBECONFIG=/etc/kubernetes/admin.conf 放入shell配置文件~/.bashrc或~/.zshrc

稍等30s执行命令查看节点

kubectl get nodes

这个过程中可能遇到的问题 :【解决】k8s使用kubeadm初始化集群失败问题整理

工作节点加入集群(node节点)

主节点初始化集群成功后,会提示工作节点的加入命令,复制到工作节点执行即可(此处替换自己的)

kubeadm join 192.168.11.122:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:036843071148c8f7700062c2438b35c86b0dc5754011829b5cf83bb9379d88fa 

此命令为集群初始化时生成的,toke有效期有限,后面加入集群,可执行以下命令:

1、在master节点获取 Join 命令
首先,你需要从集群的master节点获取 kubeadm join 命令。执行以下命令来获取:

kubeadm token create --print-join-command

这将输出一个 kubeadm join 命令

kubeadm join 192.168.11.122:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

2、在工作节点上运行 输出的Join 命令
node工作节点上运行控制台输入的Join 命令,等待执行完成

节点成功加入集群

3、验证节点是否加入集群
在主节点上运行以下命令,验证工作节点是否成功加入集群:

kubectl get nodes

能够看到新加入的节点出现在节点列表中
在这里插入图片描述

至此,集群创建并加入工作节点成功,接下来继续在master节点安装部署需要的组件

安装网络插件flannel

下载地址: kube-flannel.yml

可直接下载到本机,复制到远程

scp  本地文件路径 user@ip:远程路径

或者使用wget、curl等工具下载

sudo wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

下载完成后,部署到集群

kubectl apply -f kube-flannel.yml

等待flannel拉取必要组件镜像并完成初始化,查看所有组件的状态,必须全部Running才行

kubectl get pods --all-namespaces

所有命名空间的pod状态

这个过程中可能遇到的问题 :【解决】k8s使用flannel网络插件的问题整理

初始化PV、PVC

创建pv.yaml配置文件

apiVersion: v1
kind: PersistentVolume
metadata:name: example-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: manualhostPath:path: "/mnt/data"    

pvc.yaml配置文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: example-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: manual

部署pv和pvc

kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml

验证pv和pvc

kubectl get pv
kubectl get pvc

在这里插入图片描述

在 Kubernetes (K8s) 中,持久卷 (Persistent Volume, PV) 和持久卷声明 (Persistent Volume Claim, PVC) 是用于管理持久存储的资源。

它们的主要目的是为容器化应用提供持久化存储,以便在 Pod重启或重新调度时数据不会丢失。

安装 ingress

来自: https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml

注意上面内容的ingress.yaml 复制下来后,需要设定 ingress 的外部地址:

按ESC进入命令模式,输入/kind: Service搜索,按Enter后,N查找下一个,找到Service 中name为ingress-nginx-controller的配置项,在该配置的最下方加入:

  externalIPs: - 服务器ip

在这里插入图片描述

部署ingress

kubectl apply -f ingress.yaml

创建默认的 ingressCllass 配置文件ingress-class.yaml

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:name: nginxannotations:ingressclass.kubernetes.io/is-default-class: "true"
spec:controller: k8s.io/ingress-nginx

部署 ingressClass

kubectl apply -f ingress-class.yaml

删除污点

如果是单节点部署,需要删除污点,否则无法部署运行应用 pod

kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

部署安装应用

示例

编写my-dockerfile-nginx.yaml文件

此文件主要是定义了一个 K8s 服务(Service)和一个部署(Deployment),用于运行一个基于 Nginx 的应用

apiVersion: v1
kind: Service
metadata:name: my-dockerfile-nginx
spec: ports:- port: 8081 # 对外暴露的端口targetPort: 80 # Nginx 内部监听的端口nodePort: 31111  # NodePort访问端口type: NodePort   # NodePort类型的Service,可以通过Node的IP和NodePort访问到Service   selector:app: my-dockerfile-nginx
---   
apiVersion: apps/v1
kind: Deployment
metadata:name: my-dockerfile-nginxlabels:app: my-dockerfile-nginx
spec:replicas: 1 # 副本数selector:  # 选择器,用于选择replicas生效的PodmatchLabels:app: my-dockerfile-nginxtemplate:metadata:labels:app: my-dockerfile-nginxspec:containers:- name:  my-dockerfile-nginximage: liuhp6903/my-dockerfile-nginx:latest # 应用的镜像imagePullPolicy: Alwaysports:- containerPort: 80protocol: TCP

部署到集群

kubectl apply -f my-dockerfile-nginx.yaml -n <指定namespace>

不指定命名空间,会部署到默认命名空间

等待pod创建并running,可以通过节点IP:nodePort在外部进行访问

在这里插入图片描述

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

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

相关文章

C++ 内存管理和模板与STL

此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…

在 Ubuntu 24.04.1 LTS (WSL) 中使用 openssl 生成 keybox.xml

看到“生成 keybox.xml”&#xff0c;大概率都会联想到 PIF 和 Tricky Store。这里就不多解释它们的用途了。最近在网上看到生成非 AOSP keybox 的教程&#xff0c;在这里做一些补充&#xff0c;并将代码打包成一个 Python 脚本。 参考自&#xff1a; Idea 提供者&#xff1a…

全局注册快捷键方案

在低代码系统中&#xff0c;快捷键是很常用的操作&#xff0c;我们如果只对绘图区域注册快捷键&#xff0c;那么焦点不在绘图区域时&#xff0c;就会失去快捷键响应&#xff0c;如果对全局拦截键盘事件&#xff0c;注册快捷键&#xff0c;那么会失去一些本应该交给系统默认快捷…

Redis篇-1--入门介绍

1、Redis概述 ‌Redis&#xff08;Remote Dictionary Server&#xff09;&#xff0c;全称为远程字典服务。‌是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 Redis提供了多种数据类型的存储&#xff0c;来适应不同场景下的存储需…

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…

简单的多网卡选择指定网卡ip注册

简单的多网卡选择指定网卡ip注册 我们公司服务器上面有多个网卡&#xff0c;多网卡则本地ip有多个ip,我们启动服务的时候需要选定他特定的ip&#xff0c;我们服务需要特定的ip进行注册&#xff0c;才能进行正常的通讯功能&#xff0c;我们需要使用如下配置进行特定ip选择&…

鸿蒙NEXT开发案例:颜文字搜索器

【引言】 本文将介绍一个名为“颜文字搜索器”的开发案例&#xff0c;该应用是基于鸿蒙NEXT平台构建的&#xff0c;旨在帮助用户快速查找和使用各种风格的表情符号。通过本案例的学习&#xff0c;读者可以了解如何在鸿蒙平台上进行数据处理、UI设计以及交互逻辑的实现。 【环…

快速部署一套K8s集群-v1.28

快速部署一套K8s集群-v1.28 1.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadmKubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包从github下载发行版的二进…

【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章: 《基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR》 的…

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异&#xff0c;他是需要先对接的到代理服务器&#xff0c;通过代理服务器进行对接&#xff0c;所以只要保证U8能上网就能对接&#xff0c;和畅捷通T的模式有点类似 流程&#xff1a; 注册成为开发者&#xff08;用于创建用友U8 API应…

c# TaskScheduler

这里记录下 TaskScheduler 的简单用法。 使用场景&#xff1a; 使用 Task 的时候&#xff0c;大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个&#xff0c;那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…

Go语言错误分类

错误的分类 在 Go 语言中&#xff0c;错误是通过实现 error 接口的类型表示的&#xff0c;但不同场景下的错误可以按性质和用途进行分类。以下是 Go 语言错误的常见分类&#xff0c;以及每类错误的解释和示例&#xff1a; 标准错误类型 标准库中定义了许多常见的错误类型&…

Couchbase的OLAP支持情况

Couchbase 是一个高性能的 NoSQL 数据库&#xff0c;主要用于在线事务处理&#xff08;OLTP&#xff09;场景&#xff0c;但它也提供了一些功能来支持在线分析处理&#xff08;OLAP&#xff09;需求。以下是 Couchbase 对 OLAP 支持的几个方面&#xff1a; 1. N1QL 查询语言 …

检查读取数据寄存器输出的多扇出

为使第二寄存器被 RAM 原语吸收&#xff0c;来自存储器阵列的数据输出位的扇出必须为 1 。这在下图中进行了说明。 检查地址 / 读取数据寄存器上的复位信号 不应复位存储器阵列。只有 RAM 的输出可以容许复位。复位必须是同步的&#xff0c;以便将输出寄存器推断到 RAM 基元…

MeiliSearch:一款轻量级开源搜索引擎

Meilisearch 是由 Meili &#xff08;一家总部位于法国的软件开发公司&#xff09;创建的搜索引擎&#xff0c;目前在 Github 上有 47.9k stars。 Meillisearch 具备以下特色功能&#xff08;ChatGPT-4o 翻译&#xff09;&#xff1a; 混合搜索&#xff1a;结合语义搜索和全文…

随手记——conda迁移虚拟环境后不能使用Linux命令解决方案

在Ubuntu使用conda pack打包环境迁移之后发现存在以下问题&#xff1b; conda迁移环境是为了更短的的在新机器上搭建一个环境&#xff1b;我记录一下遇见的问题&#xff1b; 步骤&#xff1a; 【默认安装了conda-pack库&#xff0c;我都是安装到base虚拟环境中&#xff0c;打…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID&#xff0c;它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能&#xff0c;还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID&#xff1f; 在 MongoDB …

发愿和许愿的区别是什么?

在许多宗教和文化中&#xff0c;发愿和许愿都是人们表达内心愿望、祈求神灵保佑的重要方式。尽管这两个词在日常生活中经常被交替使用&#xff0c;但它们在含义和实践上存在一些重要的区别。本文就来详细说说发愿和许愿的区别&#xff0c;并提供相关的背景信息和建议。 1. 定义…

渗透测试工具 -- SQLmap安装教程及使用

随着网络安全问题日益严峻&#xff0c;渗透测试成为了保护信息安全的重要手段。而在渗透测试的众多工具中&#xff0c;SQLmap凭借其强大的自动化SQL注入检测和利用能力&#xff0c;成为了网络安全专家必备的利器。那么&#xff0c;你知道如何高效地使用SQLmap进行漏洞扫描吗&am…

SpringBoot 整合 RabbitMQ 实现流量消峰

RabbitMQ 即一个消息队列&#xff0c;主要是用来实现应用程序的异步和解耦&#xff0c;同时也能起到消息缓冲&#xff0c;消息分发的作用。 消息中间件在互联网公司的使用中越来越多&#xff0c;刚才还看到新闻阿里将 RocketMQ 捐献给了 Apache&#xff0c;当然了今天的主角还…