k8s之安装部署及kuboard发布应用
目录
环境准备
系统规划
配置免密
将桥接的IPv4流量传递到iptables的链
系统基础配置
安装docker
安装docker及基础依赖
配置docker的仓库下载地址
部署k8s
添加阿里云的k8s源
安装kubeadm,kubelet和kubectl
初始化masteer节点
部署node节点
部署flannel网络插件
下载插件
应用flannel文件
查看flannel状态
部署kuboard
查看kuboard所需的镜像
所有节点下载kuboard镜像
修改kuboard.yaml文件
应用kuboard文件
查看token
访问kuboard
简单创建个应用
创建名称空间
创建nginx容器
保存应用
查看容器
访问容器
环境准备
可参考官方文档
Installing kubeadm | Kubernetes

- 至少三台虚拟机
- 内存2G以上
- CPU至少2C
- 关闭swap分区或者初始化的时候加参数
系统规划
| 虚拟机 | cpu | 内存 | 硬盘 | 系统版本 | 网络 | hostname |
| master | 2c | 2G | 20G | Centos 7.9 | 192.168.146.129 | master |
| node1 | 2c | 2G | 20G | Centos 7.9 | 192.168.146.132 | node1 |
| node2 | 2c | 2G | 20G | Centos 7.9 | 192.168.146.133 | node2 |
配置免密
方便后续拷贝文件,不是必须操作
master主机上执行:
ssh-keygen
将密钥拷贝给master和node1还有node2
ssh-copy-id masterssh-copy-id node1ssh-copy-id node2
ssh测试不需要密码即可
ssh node1
将桥接的IPv4流量传递到iptables的链
三台主机均执行:
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOFsysctl --system

系统基础配置
三台主机均执行:
- 关闭防火墙
- 关闭软件防护
- 禁用swap
- 添加host映射
systemctl stop firewalld && systemctl disable firewalldsetenforce 0 sed -i s/SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/configswapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstabcat >> /etc/hosts << EOF 192.168.146.129 master 192.168.146.132 node1 192.168.146.133 node2 EOF
三台主机分别执行:
hostnamectl set-hostname masterhostnamectl set-hostname node1hostnamectl set-hostname node2
安装docker
安装docker及基础依赖
yum updateyum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install -y docker-ce docker-ce-cli containerd.iosystemctl start dockersystemctl enable docker
如果出现如下错误,参考下述方案解决
第一步:卸载
yum remove docker-*
第二步:更新Linux的内核,
yum update
第三步:通过管理员安装 docker 容器
yum install docker
第四步:启动docker容器
systemctl start docker
第五步:检查docker容器状态
systemctl status docker
配置docker的仓库下载地址
cat /etc/docker/daemon.json{"registry-mirrors": ["https://uj9wvi24.mirror.aliyuncs.com"]
}
systemctl daemon-reloadsystemctl restart docker
部署k8s
添加阿里云的k8s源
三台主机均执行:
cat /etc/yum.repos.d/kubernetes.repo
[k8s]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装kubeadm,kubelet和kubectl
三台主机均执行:
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2
systemctl start kubelet
systemctl enable kubelet
查看kubelt服务启动异常,网上查了查报错资料,说是
这是在kubeadm 进行初始化的时候,我一直以为需要kubelet启动成功才能进行初始化,其实后来发现只有初始化后才能成功启动。原文参考:
K8S服务搭建过程中出现的憨批错误_failed to load kubelet config file /var/lib/kubele-CSDN博客
初始化masteer节点
master上执行:
kubeadm init --apiserver-advertise-address=192.168.146.129 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=172.20.0.0/16
- --apiserver-advertise-address:指定 Kubernetes API Server 广播的 IP 地址,即集群的管理地址。其他组件和用户将使用此地址与 API Server 进行通信。(本机master地址)
- --image-repository:指定容器镜像仓库的地址,使用了阿里云的容器镜像仓库
- --service-cidr:指定 Service 网络的 CIDR 范围。Service 是 Kubernetes 中一种抽象的概念,用于公开应用程序或服务。该参数定义了 Service 将使用的 IP 地址范围。
- --pod-network-cidr:指定 Pod 网络的 CIDR 范围。Pod 是 Kubernetes 中最小的可调度单元,每个 Pod 都有自己的 IP 地址。该参数定义了 Pod 将使用的 IP 地址范围。
显示如图:successfully即成功

注:如果初始化输入错了,可以使用此命令来重置
kubeadm reset
接着参考如上输出提示,执行以下命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
部署node节点
根据实际的master节点IP及生成的token去加入
kubeadm join 192.168.146.129:6443 --token x1kore.eey7qi8rrien3fk0 --discovery-token-ca-cert-hash sha256:dc01d3e1abadd3dd36910c9e4c0c204b77dae97268ea67fd988a9190aabcf6d5
部署flannel网络插件
Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发。
它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。
Flannel是作为一个二进制文件的方式部署在每个node上,主要实现两个功能:
- 为每个node分配subnet,容器将自动从该子网中获取IP地址
- 当有node加入到网络中时,为每个node增加路由配置
下载插件
参考的如下博客:
k8s安装网络插件-flannel_k8s安装flannel网络插件-CSDN博客
复制以下文件内容
cat kube-flannel.yml
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: "/etc/cni/net.d"- pathPrefix: "/etc/kube-flannel"- pathPrefix: "/run/flannel"readOnlyRootFilesystem: falserunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAnyallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: falseallowedCapabilities: ['NET_ADMIN', 'NET_RAW']defaultAddCapabilities: []requiredDropCapabilities: []hostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535seLinux:rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
rules:
- apiGroups: ['extensions']resources: ['podsecuritypolicies']verbs: ['use']resourceNames: ['psp.flannel.unprivileged']
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "172.20.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cni-pluginimage: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0command:- cpargs:- -f- /flannel- /opt/cni/bin/flannelvolumeMounts:- name: cni-pluginmountPath: /opt/cni/bin- name: install-cniimage: rancher/mirrored-flannelcni-flannel:v0.18.1command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: rancher/mirrored-flannelcni-flannel:v0.18.1command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"volumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/- name: xtables-lockmountPath: /run/xtables.lockvolumes:- name: runhostPath:path: /run/flannel- name: cni-pluginhostPath:path: /opt/cni/bin- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg- name: xtables-lockhostPath:path: /run/xtables.locktype: FileOrCreate
注意:Network的地址等同于kubeadm init的<--pod-network-cidr>地址
应用flannel文件
kubectl apply -f kube-flannel.yml

查看flannel状态
查看所有命名空间(flannel正在初始化)
flannel初始化完成后,状态为running,随之coredns服务也正常了

部署kuboard
注: kuboard是一款基于 Kubernetes 的微服务管理界面,初学者可以部署这个来学习使用
wget https://kuboard.cn/install-script/kuboard.yaml
查看kuboard所需的镜像
grep image kuboard.yaml image: eipwork/kuboard:latestimagePullPolicy: Always
所有节点下载kuboard镜像
docker pull eipwork/kuboard:latest
修改kuboard.yaml文件
修改镜像下载策略为IfNotPresent
vim kuboard.yaml grep image kuboard.yaml image: eipwork/kuboard:latestimagePullPolicy: IfNotPresent
应用kuboard文件
kubectl apply -f kuboard.yaml
查看token
查看访问kuboard的端口及获取kuboard登录的token
kubectl get all -n kube-system | grep kuboard
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

访问kuboard
浏览器访问:http://192.168.146.129:32567/
将token复制进去

简单创建个应用
创建名称空间

点击创建的test命名空间的控制器
创建deployment
不明白的可以点击在线文档

创建nginx容器
参考在线文档的示例去创建


保存应用
基本上没报错就可以了

查看容器

访问容器

还可以查看deployment的yaml文件
--- apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: '2'k8s.kuboard.cn/displayName: nginxk8s.kuboard.cn/ingress: 'false'k8s.kuboard.cn/service: nonek8s.kuboard.cn/workload: cloud-nginxcreationTimestamp: '2024-01-31T07:05:51Z'generation: 2labels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-nginxname: cloud-nginxnamespace: testresourceVersion: '26553'selfLink: /apis/apps/v1/namespaces/test/deployments/cloud-nginxuid: 9b4b9dd4-7e84-4d92-91c1-3689e3b9c52e spec:progressDeadlineSeconds: 600replicas: 2revisionHistoryLimit: 10selector:matchLabels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:k8s.kuboard.cn/layer: cloudk8s.kuboard.cn/name: cloud-nginxspec:containers:- image: 'nginx:1.7.9'imagePullPolicy: Alwaysname: nginxports:- containerPort: 80hostPort: 80name: httpprotocol: TCPterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerserviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30 status:availableReplicas: 2conditions:- lastTransitionTime: '2024-02-01T00:50:54Z'lastUpdateTime: '2024-02-01T00:50:54Z'message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: 'True'type: Available- lastTransitionTime: '2024-02-01T02:30:03Z'lastUpdateTime: '2024-02-01T02:30:03Z'message: ReplicaSet "cloud-nginx-7fcd944bf" has timed out progressing.reason: ProgressDeadlineExceededstatus: 'False'type: ProgressingobservedGeneration: 2readyReplicas: 2replicas: 3unavailableReplicas: 1updatedReplicas: 1
——————至此,k8s部署及简单应用的流程是ok的——————
相关文章:
k8s之安装部署及kuboard发布应用
目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm,kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…...
JProfiler for Mac:提升性能和诊断问题的终极工具
在当今的高性能计算和多线程应用中,性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具,旨在帮助开发者更好地理解其应用程序的运行情况,提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括:…...
力扣202-快乐数
快乐数 题目链接 解题思路: 两个指针,一快一慢,如果相遇,就会生成环如果环内元素为1,那么就可以返回 class Solution { public:int get(int n){int res 0;while(n){res (n%10) * (n%10);n / 10;}return res;}bool isHappy(int …...
牛客寒假训练营H题
思路:找出所有m的子集,加到价值中,找出最大价值即可。 代码: void solve(){int n, m;cin >> n >> m;vector<pii>a(n 1);for(int i 1;i < n;i )cin >> a[i].first >> a[i].second;int ans 0…...
ubuntu22.04@laptop 常用基础环境安装
ubuntu22.04laptop 常用基础环境安装 1. 源由2. 步骤2.1 安装ubuntu22.04 LTS系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 应朋友要求,整理下一个个人常用的工作笔记本常用开发环…...
Linux第41步_移植ST公司uboot的第2步_修改网络驱动_USB OTG设备树_LCD驱动_以及编译和烧写测试
移植ST公司uboot的第1步,创建配置文件、设备树、修改电源管理和sdmmc节点后,还需要进一部修改,如:网络驱动、USB OTG设备树、LCD驱动,以及编译和烧写测试。 一、在虚拟机中,使用VSCode打开my_uboot工作区 …...
瑞芯微1808模型转换(onnx到rknn)环境配置过程
瑞芯微1808模型转换(onnx → \to →rknn)环境配置 阅读本解决方案前,请读者确保已经根据官方的相关教程【rknn_model_zoo/common/rknn_converter at v1.5.0 airockchip/rknn_model_zoo (github.com)】完成其他配置文件的修改,以…...
测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)
EasyCaching属于开源缓存库,支持基本缓存方式及高级缓存用法,提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型,本文学习最基础的InMemory方式的基本用法。 EasyCaching.InMemory包属于基于内存的缓存库,使用的…...
机器学习系列-2 线性回归训练损失
机器学习系列-2 线性回归&训练损失 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归: 举例:蝉(昆虫物种&…...
spring-boot-actuator 服务监控
1 概述 服务启动时,通过spring-boot-actuator 监控es等服务是否连接成功等 2 依赖 <!-- 服务监控 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…...
窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算
在当今计算领域中,存内计算技术凭借其出色的向量乘矩阵操作效能引起了广泛关注。本文将深入研究基于向量乘矩阵的存内计算原理,并探讨几个引人注目的代表性工作,如DPE、ISAAC、PRIME等,它们在神经网络和图计算应用中表现出色&…...
Python flask 表单详解
文章目录 1 概述1.1 request 对象 2 示例2.1 目录结构2.2 student.html2.3 result.html2.4 app.py 1 概述 1.1 request 对象 作用:来自客户端网页的数据作为全局请求对象发送到服务器request 对象的重要属性如下: 属性解释form字典对象,包…...
【Tomcat与网络3】Tomcat的整体架构
目录 1.演进1:将连接和处理服务分开 2演进2:Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理,本文我们结合Tomcat来分析一下如何设计一个大型…...
k8s中cert-manager管理https证书
前言 目前https是刚需,但证书又很贵,虽然阿里云有免费的,但没有泛域名证书,每有一个子域名就要申请一个证书,有效期1年,1年一到全都的更换,太麻烦了。经过搜索,发现了自动更新证书神器cert-manager;当然cert-manager是基于k8s的。 安装采用Helm方式 Chart地址: ht…...
如何搭建私有云盘SeaFile并实现远程访问本地文件资料
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-hsDnDEybLME85dTx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
Centos7安装Nginx-1.21
一、编译前提,需要安装必要的包 yum install gcc pcre-devel openssl-devel zlib-devel wget -y 二、下载对应的NGINX包 wget http://nginx.org/download/nginx-1.21.0.tar.gz 三、解压nginx tar xf nginx-1.21.0.tar.gz 四、编译并安装nginx到/usr/local/ng…...
React 面试题
1、组件通信的方式 父组件传子组件:通过props 的方式 子组件传父组件:父组件将自身函数传入,子组件调用该函数,父组件在函数中拿到子组件传递的数据 兄弟组件通信:找到共同的父节点,用父节点转发进行通信 …...
Postgresql使用update
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 解决问题一、关联表更新1.关联一张表2.关联多张表 二、根据状态更新为不同的值 解决问题 通过多张关联表更新主表的字段,根据状态更新为不同的值。 一、…...
Django视图函数技巧,从入门到实战
文章目录 Django视图函数1.request对象的方法2.视图函数的常用的返回对象(1)response对象(2)JsonResponse对象(3)redirect() :给浏览器了一个30x的状态码 3.设置响应头和状态码(1&am…...
部署实战--修改jar中的文件并重新打包成jar文件
一.jar文件 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...



