Kubernetes(k8s)介绍和环境部署

文章目录

  • Kubernetes
    • 一、Kubernetes介绍
        • 1.Kubernetes简介
        • 2.Kubernetes概念
        • 3.Kubernetes功能
        • 4.Kubernetes工作原理
        • 5.kubernetes组件
        • 6.Kubernetes优缺点
    • 二、Kubernetes环境部署
        • 环境
        • 基本配置
        • 1.所有节点安装docker
        • 2.所有节点安装kubeadm、kubelet、kubectl
          • 添加yum源
          • containerd配置
        • 3.部署Kubernetes Master(管理节点)
        • 4.安装Pod网络插件(CNI)
        • 5.加入Kubernetes Node
        • 6.测试Kubernetes 集群
    • 扩展:配置kubectl命令可以在node节点上运行

Kubernetes

一、Kubernetes介绍

1.Kubernetes简介

Kubernetes是一种开源的容器编排工具,用于管理和编排云原生应用程序。它可以协调和管理运行在多个计算机集群上的Docker容器,自动进行容器部署、更新、扩容和负载均衡等操作,以确保应用程序的可用性和高可靠性。


2.Kubernetes概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

NameSpace:命名空间,用来隔离pod的运行环境

3.Kubernetes功能

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷
4.Kubernetes工作原理

Kubernetes的工作原理可以简单地概括为:通过API服务器、etcd和调度器等组件,将容器化的应用程序部署到集群中的工作节点上,并保证他们按照用户定义的方式运行和提供服务。简单来说,Kubernetes利用了多个工作节点(node)进行应用的部署和运行,使用Pod来封装容器。Pod中包含一个或多个紧密耦合的容器,可以共享网络和存储资源,Pod可以水平扩展,当一个或多个Pod失败时,可以进行自动替换。Kubernetes还提供了负载均衡、服务发现和伸缩等功能,以帮助应用程序更好地运行和扩展。

5.kubernetes组件

一个kubernetes集群主要是由控制节点(master)工作节点(node) 构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负责集群的决策 ( 管理 )

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd :负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

Docker : 负责节点上容器的各种操作


下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:

  1. 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中

  2. 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件

  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上

    在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

  4. apiServer调用controller-manager去调度Node节点安装nginx服务

  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod

    pod是kubernetes的最小操作单元,容器必须跑在pod中至此,

  6. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理

这样,外界用户就可以访问集群中的nginx服务了


6.Kubernetes优缺点

Kubernetes的优点主要有以下几点:

  1. 弹性和高可靠性:Kubernetes通过节点的自动切换和Pod的自动重启等机制实现高可靠性,确保应用程序不会因为单个节点或者Pod的故障导致的中断。

  2. 高扩展性:Kubernetes支持水平扩展,可以扩展节点的数量以容纳更多的容器,在应用程序负载增大的情况下,可以通过添加节点进行扩展。

  3. 简化部署:Kubernetes抽象了容器和Pod等概念,简化了部署和管理容器化应用程序的过程,使得开发人员更加专注于应用程序本身。

然而,Kubernetes也存在一些缺点:

  1. 学习成本高:由于Kubernetes涉及到多个概念和组件,以及高度抽象的部署和管理方式,因此学习成本相对较高。

  2. 复杂性高:Kubernetes的部署和配置比较复杂,需要更多的人力和时间进行维护,管理容器数量较少的场景可能会过度负担。

  3. 运行成本高:由于Kubernetes需要在多个节点上运行,需要额外的网络和存储资源,因此相对于单节点方案,运行成本会增加。


二、Kubernetes环境部署

环境
主机名角色安装的软件IP地址系统版本
master管理节点Docker
kubeadm
kubelet
kubectl
192.168.179.13centos8
node1工作节点Docker
kubeadm
kubelet
kubectl
192.168.179.14centos8
node2工作节点Docker
kubeadm
kubelet
kubectl
192.168.179.15centos8
基本配置
//永久关闭防火墙和selinux(所有主机都做)
systemctl disable --now firewalld.service
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

//所有主机配置国内yum源(推荐使用阿里云源)
rm -rf /etc/yum.repos.d/*

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

yum clean all && yum makecache 


//配置主机名解析(所有主机都做)
[root@master ~]# vi /etc/hosts 
[root@master ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#要添加的内容
192.168.179.13	master
192.168.179.14	node1
192.168.179.15	node2
[root@master ~]# 

//关闭swap分区(注释掉swap分区的那一行,所有主机都做)
[root@master ~]# vi /etc/fstab 
[root@master ~]# cat /etc/fstab 
(省略)
# units generated from this file.
#
/dev/mapper/cs-root     /                       xfs     defaults        0 0
UUID=22d538b9-6f73-43c5-8d80-228f9bc1b20a /boot                   xfs     defaults        0 0
#/dev/mapper/cs-swap     none                    swap    defaults        0 0
[root@master ~]# 


//将桥接的IPv4流量传递到iptables的链(所有主机都做)
[root@master ~]# vi /etc/sysctl.d/k8s.conf
[root@master ~]# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@master ~]# sysctl --system

//配置时间同步
--设置时区(所有主机都设置)
[root@master ~]# timedatectl set-timezone Asia/Shanghai 
--管理节点的配置
[root@master ~]# yum -y install chrony
[root@master ~]# vi /etc/chrony.conf 
[root@master ~]# cat /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool time1.aliyun.com iburst   //将默认的时间同步服务器换成阿里云的(用此行内容替换原来的)
(省略)
[root@master ~]# systemctl enable chronyd.service 
[root@master ~]# systemctl restart chronyd.service 
--两个工作节点的配置
[root@node1 ~]# vi /etc/chrony.conf 
[root@node1 ~]# cat /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool master iburst  //将默认的时间同步服务器改为管理节点
(省略)
[root@node1 ~]# systemctl enable chronyd.service 
[root@node1 ~]# systemctl restart chronyd.service 

//配置免密登录(只在master管理节点上做)
--生成密钥
[root@master ~]# ssh-keygen -t rsa  (一直回车)
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:yqtCSSfFJId+z0yRPJX4rR6i4N1GFPilY+4aG3pxkFI root@master
The key's randomart image is:
+---[RSA 3072]----+
|  .+oo +..       |
|  .oE B o        |
| . o o B .       |
|  = = B . .      |
| . * X .S.       |
|  + ..O.o        |
| o ooBoo .       |
|  o.+++..        |
|  .o++.          |
+----[SHA256]-----+

--发送证书给所有节点(包括自己)
[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id node1
[root@master ~]# ssh-copy-id node2

//安装基础工具包(所有主机都安装)
yum -y install vim wget

//重启所有主机
reboot
1.所有节点安装docker

安装docker

//安装docker依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

//配置docker的yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

//安装docker
yum -y install docker-ce

//启动并设置docker开机自启
systemctl enable --now docker.service

//配置docker镜像的加速器(所有节点都配置)
[root@master ~]# vim /etc/docker/daemon.json
[root@master ~]# cat /etc/docker/daemon.json
{
   "registry-mirrors": ["https://5qsf7g11.mirror.aliyuncs.com"]
}
[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl restart docker.service 
2.所有节点安装kubeadm、kubelet、kubectl
添加yum源

先添加一个kubernetes的yum源,再安装各软件包(所有主机)

//添加kubernetes的yum源
[root@master ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
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
EOF
[root@master ~]# yum makecache 

//安装kubeadm、kubelet和kubectl
[root@master ~]# yum -y install kubelet kubeadm kubectl

//设置开机自启(仅设置开机自启,千万不要启动!!!)
[root@master ~]# systemctl stop kubelet
[root@master ~]# systemctl enable kubelet
containerd配置

在 /etc/containerd/ 下面有一个 config.toml 的文件

//这个文件默认是没有很多功能的,所以我们不用这,而是重新生成一个
[root@master ~]# cat /etc/containerd/config.toml 
#   Copyright 2018-2022 Docker Inc.

#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at

#       http://www.apache.org/licenses/LICENSE-2.0

(省略)
//生成一个新的config.toml文件
[root@master ~]# containerd config default > /etc/containerd/config.toml

//修改拉取镜像的位置,默认位置是外网,正常情况访问不到。所以换成国内的
--在这个配置文件中找到sandbox_image = "registry.k8s.io/pause:3.6"这一行,把这行改为
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
[root@master ~]# vim /etc/containerd/config.toml 
[root@master ~]# cat /etc/containerd/config.toml 
(省略)
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
(省略)

//重启containerd服务并设置开机自启
[root@master ~]# systemctl restart containerd.service 
[root@master ~]# systemctl enable containerd.service 

//把这个改好的文件scp到另外两个工作节点
[root@master ~]# scp /etc/containerd/config.toml node1:/etc/containerd/
[root@master ~]# scp /etc/containerd/config.toml node2:/etc/containerd/

//在另外两个工作节点上重启containerd服务并设置开机自启
[root@node1 ~]# systemctl restart containerd.service && systemctl enable containerd.service 
[root@node2 ~]# systemctl restart containerd.service && systemctl enable containerd.service 
3.部署Kubernetes Master(管理节点)

只在master主机(管理节点)上操作

//初始化集群
[root@master ~]# kubeadm init \
  --apiserver-advertise-address=192.168.179.13 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
  
//出现这行就代表初始化成功:Your Kubernetes control-plane has initialized successfully!

//初始化后生成的一些教程复制下来,写在一个文件里面保存起来,说不定以后会用到
[root@master ~]# vim k8s-init
[root@master ~]# cat k8s-init 
To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.179.13:6443 --token 3codju.65fqz143cjxzfjcw \
	--discovery-token-ca-cert-hash sha256:9ffae8478fff2fd94274144066edc9d91f229b51b8e11663da8ce055da04028c 
[root@master ~]# 

//设置环境变量
[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > /etc/profile.d/k8s.sh
[root@master ~]# source /etc/profile.d/k8s.sh
4.安装Pod网络插件(CNI)
//下载一个flannel资源模板文件
[root@master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

//添加flannel资源
[root@master ~]# kubectl apply -f kube-flannel.yml 

//查看flannel资源
[root@master ~]# kubectl get -f kube-flannel.yml 
NAME                     STATUS   AGE
namespace/kube-flannel   Active   89s

NAME                     SECRETS   AGE
serviceaccount/flannel   0         89s

NAME                                            CREATED AT
clusterrole.rbac.authorization.k8s.io/flannel   2023-11-13T09:06:00Z

NAME                                                   ROLE                  AGE
clusterrolebinding.rbac.authorization.k8s.io/flannel   ClusterRole/flannel   89s

NAME                         DATA   AGE
configmap/kube-flannel-cfg   2      89s

NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/kube-flannel-ds   1         1         1       1            1           <none>          89s
[root@master ~]#   //资源没有问题

//查看k8s组件的pod
[root@master ~]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-66f779496c-5thsr         1/1     Running   0          27m
coredns-66f779496c-nqjkx         1/1     Running   0          27m
etcd-master                      1/1     Running   0          27m
kube-apiserver-master            1/1     Running   0          27m
kube-controller-manager-master   1/1     Running   0          27m
kube-proxy-7dc82                 1/1     Running   0          27m
kube-scheduler-master            1/1     Running   0          27m
[root@master ~]#  //运行没有问题

//查看所有名称空间
[root@master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   29m
kube-flannel      Active   4m8s
kube-node-lease   Active   29m
kube-public       Active   29m
kube-system       Active   29m
[root@master ~]#  //没有问题
5.加入Kubernetes Node

在两台工作节点上执行;node1和node2

//在node1和node2上执行
[root@node1 ~]# kubeadm join 192.168.179.13:6443 --token 3codju.65fqz143cjxzfjcw \
	--discovery-token-ca-cert-hash sha256:9ffae8478fff2fd94274144066edc9d91f229b51b8e11663da8ce055da04028c 

[root@node2 ~]# kubeadm join 192.168.179.13:6443 --token 3codju.65fqz143cjxzfjcw \
	--discovery-token-ca-cert-hash sha256:9ffae8478fff2fd94274144066edc9d91f229b51b8e11663da8ce055da04028c 


//在master上查看加入的node节点
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   Ready      control-plane   33m   v1.28.2
node1    Ready      <none>          87s   v1.28.2
node2    NotReady   <none>          36s   v1.28.2
[root@master ~]# 

//查看网络组件,在两台node上也跑起来了
[root@master ~]# kubectl get pods -n kube-flannel -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
kube-flannel-ds-7h6vp   1/1     Running   0          3m32s   192.168.179.14   node1    <none>           <none>
kube-flannel-ds-gmhpm   1/1     Running   0          10m     192.168.179.13   master   <none>           <none>
kube-flannel-ds-mhn7s   1/1     Running   0          2m41s   192.168.179.15   node2    <none>           <none>
[root@master ~]# 


6.测试Kubernetes 集群
//创建一个名字叫nginx,镜像为nginx,在default名称空间里面的pod
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

//查看pod状态,已经跑起来了,在内部使用容器ip访问
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP           NODE    NOMINATED NODE   READINESS GATES
nginx-7854ff8877-r277b   1/1     Running   0          3m6s   10.244.1.2   node2   <none>           <none>

//内部访问
[root@master ~]# curl 10.244.1.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>



//暴露端口号
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

//查看
[root@master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7854ff8877-r277b   1/1     Running   0          9m8s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        61m
service/nginx        NodePort    10.110.91.174   <none>        80:32597/TCP   94s
[root@master ~]# 

然后使用管理节点的ip加映射的端口号在浏览器访问

在这里插入图片描述


扩展:配置kubectl命令可以在node节点上运行

kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:

  • 1.在node节点(工作节点)上创建一个用户
  • 2.在该用户的家目录中创建一个隐藏目录 .kube
  • 3.将控制节点上的/etc/kubernetes/admin.conf通过scp发送到node节点里上一步创建的目录中并命名为config
  • 4.在node节点修改config文的属主属组为第1步创建的用户

演示:

//在node节点上创建用户并设置密码
[root@node1 ~]# useradd k8s
[root@node1 ~]# echo "1"  | passwd --stdin k8s 
Changing password for user k8s.
passwd: all authentication tokens updated successfully.
[root@node1 ~]# 

//在node节点上创建隐藏目录
[root@node1 ~]# mkdir -p /home/k8s/.kube

//在控制节点上发送文件
[root@master ~]# scp /etc/kubernetes/admin.conf node1:/home/k8s/.kube/config
admin.conf                                 100% 5646     3.3MB/s   00:00    
[root@master ~]# 

//在node节点上修改/home/k8s/.kube/config的属主属组
[root@node1 ~]# chown k8s:k8s /home/k8s/.kube/config
[root@node1 ~]# ll /home/k8s/.kube/config
-rw------- 1 k8s k8s 5646 Nov 15 17:07 /home/k8s/.kube/config
[root@node1 ~]# 

//切换到第1步创建的用户,测试
[k8s@node1 ~]$ kubectl get namespace
NAME              STATUS   AGE
default           Active   2d
kube-flannel      Active   2d
kube-node-lease   Active   2d
kube-public       Active   2d
kube-system       Active   2d
wanf              Active   21m
[k8s@node1 ~]$ 
--可以使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用照片预测人的年龄【图像回归】

在图像分类任务中&#xff0c;卷积神经网络 (CNN) 是非常强大的神经网络架构。 然而&#xff0c;鲜为人知的是&#xff0c;它们同样能够执行图像回归任务。 图像分类和图像回归任务之间的基本区别在于分类任务中的目标变量&#xff08;我们试图预测的东西&#xff09;不是连续…

图片转excel表格怎么弄?有何密笈?

一般的软件要将图片转excel表格&#xff0c;都需要待识别的图片要有明显清晰的表格线&#xff0c;但金鸣识别则不需要这些条件的限制&#xff0c;即便是无表格线或缺少横线或竖线的图片&#xff0c;也能很好地识别成excel&#xff0c;另外&#xff0c;别的软件一般会限制文件大…

Windows Server 2012 R2系统服务器远程桌面服务多用户登录配置分享

Windows Server 2012系统在没有安装远程多界面的情况下&#xff0c;最多只能同时运行2个远程桌面&#xff0c;如果是有多个技术员、合伙人同时操作或是像游戏开发需要用到多界面&#xff0c;但是没有安装就很不方便&#xff0c;今天飞飞来和你们分享Windows server 2012R2系统远…

Python武器库开发-flask篇之模板渲染(二十四)

flask篇之模板渲染(二十四) Flask 中的模板是一种将数据和 HTML 代码组合在一起的方式&#xff0c;使得我们可以生成动态的 HTML 页面。使用模板可以使我们的代码更加简洁、易于维护和复用。在真实的环境中&#xff0c;我们往往接触到的是由 html、CSS和JavaScript所做的网页&…

51单片机应用从零开始(四)

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;三&#xff09;-CSDN博客 详解 KEIL C51 软件的使用建立工程-CSDN博客 详解 KEIL C51 软件的使用设置工程编绎与连接程序…

三种跨域解决方案:HttpClient、注解、网关

注解&#xff1a;CrossOrigin网关整合Httpclient 为什么会有跨域问题 因为浏览器的同源政策&#xff0c;就会产生跨域。比如说发送的异步请求是不同的两个源&#xff0c;就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为了安全考虑&#xff0c;就会产…

穿越时空:未来云计算的奇妙世界

文章目录 1. 云计算与智能家居2. 云计算与无人驾驶3. 云计算与虚拟现实4. 云计算与人工智能未来展望 &#x1f389;欢迎来到云计算技术应用专栏~穿越时空&#xff1a;未来云计算的奇妙世界 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&am…

Android 12 客制化修改初探-Launcher/Settings/Bootanimation

Android 12 使用 Material You 打造的全新系统界面&#xff0c;富有表现力、活力和个性。使用重新设计的微件、AppSearch、游戏模式和新的编解码器扩展您的应用。支持隐私信息中心和大致位置等新的保护功能。使用富媒体内容插入功能、更简便的模糊处理功能、经过改进的原生调试…

Redis分布式锁(上)

不论面试还是实际工作中&#xff0c;Redis都是避无可避的技术点。在我心里&#xff0c;MySQL和Redis是衡量一个程序员是否“小有所成”的两把标尺。如果他能熟练使用MySQL和Redis&#xff0c;以小化大&#xff0c;充分利用现有资源出色地完成当下需求&#xff0c;说明他已经成长…

生命在于学习——主板跳线的学习

一、前言 好吧&#xff0c;又是一个我之前没接触过的东西&#xff0c;秉持遇到什么就学什么的精神&#xff0c;来学&#xff01; 我一发小来找我&#xff0c;问我关于跳线的事情&#xff0c;我就一个表情&#xff1a; 好吧&#xff0c;我承认&#xff0c;纵观我23岁&#xf…

【通往架构师之路】并没有捷径可走,除非站在巨人的肩膀之上

通往架构师之路 市面有流传《人人都是产品经理》&#xff0c;却很少听到《人人都是架构师》这种说法&#xff0c;大概是因为架构师在整个研发体系上来说&#xff0c;总是比较稀缺的吧。本文结合工程的需要&#xff0c;给大家推荐10本通过架构师之路的绝佳图书&#xff0c;希望对…

第二证券:今日投资前瞻:小米汽车引关注 全球风光有望持续高速发展

昨日&#xff0c;两市股指盘中轰动上扬&#xff0c;深成指、创业板指一度涨超1%。到收盘&#xff0c;沪指涨0.55%报3072.83点&#xff0c;深成指涨0.72%报10077.96点&#xff0c;创业板指涨0.53%报2015.36点&#xff0c;北证50指数涨2.64%&#xff1b;两市算计成交9900亿元&…

智慧城市大脑数据中台解决方案:PPT全套37页,附下载

关键词&#xff1a;智慧城市大脑解决方案&#xff0c;数据中台解决方案&#xff0c;智慧城市建设&#xff0c;数据中台建设&#xff0c;智慧城市大脑建设&#xff0c;数据中台建设架构 一、智慧城市大脑数据中台建设背景 智慧城市大脑数据中台是一个面向城市级数据管理、开发和…

PowerConsume功耗计算器

嵌入式低功耗产品开发&#xff0c;功耗计算器资源-CSDN文库 PowerConsume使用说明 安装说明 需要安装在无空格等特殊字符的路径&#xff0c;不推荐安装在C盘。 功能说明 已知条件 电池容量 各状态的电流和运行时间 自动计算出设备运行时间 启动界面如下 添加状态 在空白处…

深入解析Vue中的keep-alive组件:优化组件切换与DOM渲染!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、K…

超详细 | 萤火虫算法原理及其实现(Matlab)

群智能(Swarm Intelligence&#xff0c;SI)是一类分散自组织系统的集体智能行为的总称&#xff0c;该表述最早在1989年由Gerardo Beni在分子自动机系统中提出。SI系统可视作一组简单的个体&#xff0c;其个体与个体、个体与环境之间存在交互作用&#xff0c;最终表征出智能行为…

通往优秀软件架构师之路:掌握技术核心,修炼基础原理【文中送书,十本任选】

通往优秀软件架构师之路&#xff1a;掌握技术核心&#xff0c;修炼基础原理 《高并发架构实战&#xff1a;从需求分析到系统设计》《架构师的自我修炼&#xff1a;技术、架构和未来》《中台架构与实现&#xff1a;基于DDD和微服务》《分布式系统架构&#xff1a;架构策略与难题…

Python利器:Requests-HTML——网络爬虫的得力助手

概要 在Python的世界里&#xff0c;网络爬虫是一个非常热门的领域。而在这个领域中&#xff0c;Requests-HTML是一个强大的工具&#xff0c;它能够让我们轻松地处理HTML页面&#xff0c;从而获取需要的数据。本文将详细介绍Requests-HTML的特点、使用方法和一些实际应用案例&a…

JS-项目实战-删除库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);}} }//当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取…

为什么都说学医的转行网络安全行业更容易些?

网络系统坏了&#xff0c;被入侵破坏了&#xff0c;找安全工程师防护修补。如果没有修好&#xff0c;我可以不给钱&#xff0c;再找一家能修好的。但是看病就不一样了&#xff0c;就算医生没有给我治好病&#xff0c;也照样要收医疗费。 这样的类比乍一听上去好像挺有道理&…