k8s的二进制部署master 和 etcd

k8s的基本架构

k8smaster01: 20.0.0.70 kube-apiserver kube-controller-manager kube-scheduler etcd

k8smaster02:20.0.0.71 kube-apiserver kube-controller-manager kube-scheduler

node节点01:20.0.0.72 kubelet kube-proxy etcd

node节点02:20.0.0.73 kubelet kube-proxy etcd

负载均衡:nginx+keepalive:master 20.0.0.74

backup 20.0.0.75

先配置etcd(20.0.0.70        20.0.0.72        20.0.0.73 )
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -Xiptables -F:清除默认的 iptables 规则链(如 INPUT、FORWARD、OUTPUT)中的所有规则。
iptables -t nat -F:清除 "nat" 表中的所有规则,这通常包含用于网络地址转换(NAT)的规则。
iptables -t mangle -F:清除 "mangle" 表中的所有规则,这通常包含用于修改数据包头部的规则。
iptables -X:删除用户自定义的链。它将删除你可能在 iptables 中创建的任何自定义链。
关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
关闭swap

关闭交换分区,提升性能
swap交换分区,如果机器内存不够,就会使用swap交换分区,但是swap交换分区的性能较低,
k8s设计的时候为了提升性能,默认是不允许使用交换分区的。kubeadm初始化的时候会检测swap是否关闭,
如果没关闭就会初始化失败。如果不想关闭交换分区,
安装k8s的时候可以指定-ignore-preflight-errors=Swap来解决。

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 
根据规划设置主机名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

做映射(在master添加hosts)


cat >> /etc/hosts << EOF
20.0.0.70 master01
20.0.0.72 node01
20.0.0.73 node02
EOF

调整内核参数

vim   /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
#看实际的生产情况,需要开启ipv6流量,可以不关。
net.ipv4.ip_forward=1

使配置内核参数生效

sysctl --system
时间同步(3台etcd都需要做)
yum install ntpdate -y
ntpdate ntp.aliyun.com 
部署 docker引擎
所有 node 节点部署docker引擎
yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce docker-ce-cli containerd.iosystemctl start docker.service
systemctl enable docker.service 

部署 etcd 集群

存储k8s的集群信息和用户配置组件etcd

etcd 是一个高可用----分布式的键值对存储数据库

采用raft算法保证节点的信息一致性,etcd是go语言写的

etcd的端口:2379 api接口,对外为客户端提供通信

                     2380 内部服务的通信端口

etc一般都是集群部署,由于etcd也有选举机制leader,至少yao3台或者奇数台

k8s的内部通信依靠证书认证,密钥认证:证书的签发环境

把证书拖到master01 的opt目录下
mv cfssl cfssl-certinfo  cfssljson  /usr/local/bin
chmod 777 /usr/local/bin/cfssl cfssl-certinfo  cfssljsonvim cfssl:证书签发的命令工具
cfssl-certinfo:查看证书信息的工具
cfssljson:把证书的格式转化成json格式,变成文件的承载式证书 生成Etcd证书mkdir /opt/k8s
cd /opt/k8s/上传 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目录中
chmod 777 etcd-cert.sh etcd.shvim etcd-cert.sh#!/bin/bash
#配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"www": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}}
}
EOF#ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;
#后续在签名证书时会使用某个 profile;此实例只有一个 www 模板。
#expiry:指定了证书的有效期,87600h 为10年,如果用默认值一年的话,证书到期后集群会立即宕掉
#signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
#key encipherment:表示使用非对称密钥加密,如 RSA 加密;
#server auth:表示client可以用该 CA 对 server 提供的证书进行验证;
#client auth:表示server可以用该 CA 对 client 提供的证书进行验证;
#注意标点符号,最后一个字段一般是没有逗号的。
#-----------------------
#生成CA证书和私钥(根证书和私钥)
#特别说明: cfssl和openssl有一些区别,openssl需要先生成私钥,然后用私钥生成请求文件,最后生成签名的证书和私钥等,但是cfssl可以直接得到请求文件。
cat > ca-csr.json <<EOF
{"CN": "etcd","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "Beijing","ST": "Beijing"}]
}
EOF#CN:Common Name,浏览器使用该字段验证网站或机构是否合法,一般写的是域名 
#key:指定了加密算法,一般使用rsa(size:2048)
#C:Country,国家
#ST:State,州,省
#L:Locality,地区,城市
#O: Organization Name,组织名称,公司名称
#OU: Organization Unit Name,组织单位名称,公司部门cfssl gencert -initca ca-csr.json | cfssljson -bare ca
#生成的文件:
#ca-key.pem:根证书私钥
#ca.pem:根证书
#ca.csr:根证书签发请求文件#cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成生成新的证书和私钥。如果不添加管道符号,会直接把所有证书内容输出到屏幕。
#注意:CSRJSON 文件用的是相对路径,所以 cfssl 的时候需要 csr 文件的路径下执行,也可以指定为绝对路径。
#cfssljson 将 cfssl 生成的证书(json格式)变为文件承载式证书,-bare 用于命名生成的证书文件。#-----------------------
#生成 etcd 服务器证书和私钥
cat > server-csr.json <<EOF
{"CN": "etcd","hosts": ["20.0.0.70","20.0.0.72","20.0.0.73"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing"}]
}
EOF#hosts:将所有 etcd 集群节点添加到 host 列表,需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段,新增 etcd 服务器需要重新签发证书。cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server#生成的文件:
#server.csr:服务器的证书请求文件
#server-key.pem:服务器的私钥
#server.pem:服务器的数字签名证书#-config:引用证书生成策略文件 ca-config.json
#-profile:指定证书生成策略文件中的的使用场景,比如 ca-config.json 中的 www

创建用于生成CA证书、etcd 服务器证书以及私钥的目录

mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh            #生成CA证书、etcd 服务器证书以及私钥[root@k8s1 etcd-cert]# ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  etcd-cert.sh  server.csr  server-csr.json  server-key.pem  server.pem
ca-config.json  证书颁发机构的配置文件,定义了证书生成的策略,默认过期时间和模板
ca-csr.json		根证书文件,用于给其他组件签发证书
ca.pem		根证书文件,用于签发其他组件的证书。
ca.csr		根证书签发请求文件。
ca-key.pem  根证书的私钥文件
server-csr.json:
用于生成 etcd 服务器证书和私钥的签名请求文件。包括Common Name(CN)、主机地址列表和一些组织信息。
server.pem  etcd 服务器证书文件,用于加密和认证 etcd 节点之间的通信。
server.csr  etcd 服务器证书签发请求文件。
server-key.pem  etcd 服务器证书私钥文件。
上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,启动etcd服务
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gzcd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
Documentation  etcd  etcdctl  README-etcdctl.md  README.md  READMEv2-etcdctl.md
创建用于存放 etcd 配置文件,命令文件,证书的目录
mkdir -p /opt/etcd/{cfg,bin,ssl}cd /opt/k8s/etcd-v3.4.9-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/cd /opt/k8s/
./etcd.sh etcd01 20.0.0.70 etcd02=https://20.0.0.72:2380,etcd03=https://20.0.0.73:2380

把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点

scp -r /opt/etcd/ root@20.0.0.72:/opt/
scp -r /opt/etcd/ root@20.0.0.73:/opt/
scp /usr/lib/systemd/system/etcd.service root@20.0.0.72:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@20.0.0.73:/usr/lib/systemd/system/
在 node01 节点上操作
 
vim /opt/etcd/cfg/etcd#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://20.0.0.72:2380"
ETCD_LISTEN_CLIENT_URLS="https://20.0.0.72:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://20.0.0.72:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://20.0.0.72:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://20.0.0.70:2380,etcd02=https://20.0.0.72:2380,etcd03=https://20.0.0.73:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"启动etcd服务
systemctl start etcd
systemctl enable etcd
systemctl status etcd在 node02 节点上操作
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://20.0.0.73:2380"
ETCD_LISTEN_CLIENT_URLS="https://20.0.0.73:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://20.0.0.73:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://20.0.0.73:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://20.0.0.70:2380,etcd02=https://20.0.0.72:2380,etcd03=https://20.0.0.73:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"启动etcd服务
systemctl start etcd
systemctl enable etcd
systemctl status etcd检查etcd群集状态
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://20.0.0.70:2379,https://20.0.0.72:2379,https://20.0.0.73:2379" endpoint health --write-out=table+-----------------------------+--------+-------------+-------+
|          ENDPOINT           | HEALTH |    TOOK     | ERROR |
+-----------------------------+--------+-------------+-------+
| https://20.0.0.70:2379      |   true | 56.973943ms |       |
| https://20.0.0.72:2379      |   true | 68.752723ms |       |
| https://20.0.0.73:2379      |   true | 69.001616ms |       |
+-----------------------------+--------+-------------+-------+
查看etcd集群成员列表ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://20.0.0.70:2379,https://20.0.0.72:2379,https://20.0.0.73:2379" --write-out=table member list
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS     |       CLIENT ADDRS     | IS LEARNER |
+------------------+---------+--------+-----------------------------+-------------------
| 742c86b504254313 | started | etcd01 | https://20.0.0.70:2380 | https://20.0.0.70:2379 |      false |
| a11e45cdfa809632 | started | etcd02 | https://20.0.0.72:2380 | https://20.0.0.72:2379 |      false |
| aeec4d911853abc5 | started | etcd03 | https://20.0.0.73:2380 | https://20.0.0.73:2379 |      false |
+------------------+---------+--------+------------------------+------------------------+------------+
 部署 Master 组件

在 master01 节点上操作

上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包
cd /opt/k8s/
unzip master.zip
chmod 777 *.shadmin.sh:
这个脚本的目的是为 Kubernetes 集群创建一个管理员用户,并配置 kubectl 工具以使用这个用户的身份连接到集群。以下是脚本的主要部分:
创建 kubeconfig 文件:
使用 kubectl config set-cluster、kubectl config set-credentials 和 kubectl config set-context 命令,
以及 kubectl config use-context 命令创建 kubeconfig 文件。kubeconfig 包含了连接到 Kubernetes 集群所需的配置信息。
设置集群信息 (set-cluster):
使用 kubectl config set-cluster 命令,配置了一个名为 "kubernetes" 的集群,
指定了 CA 证书路径、API Server 地址和一些其他参数。
设置用户凭据 (set-credentials):
使用 kubectl config set-credentials 命令,配置了一个名为 "cluster-admin" 的用户,指定了用户证书路径和私钥路径。
设置上下文 (set-context):
使用 kubectl config set-context 命令,配置了一个名为 "default" 的上下文,关联了之前设置的集群和用户。
上下文(Context): 主要用于定义连接到哪个 Kubernetes 集群(Cluster)、以及使用哪个用户(User)身份进行操作。
一个上下文包含了集群、用户和可选的命名空间信息。
上下文的主要目的是帮助你在不同的 Kubernetes 环境之间切换,比如在开发、测试和生产环境之间切换。
使用上下文 (use-context):
使用 kubectl config use-context 命令,将当前上下文设置为 "default"。
这样,当你运行 kubectl 命令时,它将使用指定的 kubeconfig 文件连接到 Kubernetes 集群,并使用管理员用户的身份进行操作apiserver.sh:
--logtostderr=false: 禁用将日志输出到控制台的选项,将日志写入文件。
--v=2: 设置日志的详细级别,此处为 2。
--log-dir=/opt/kubernetes/logs: 指定日志文件的目录。
--etcd-servers=${ETCD_SERVERS}: 指定 etcd 服务器的地址,使用逗号分隔多个地址。
--bind-address=${MASTER_ADDRESS}: 指定 API Server 监听的地址。
--secure-port=6443: 指定 API Server 监听的端口。
--advertise-address=${MASTER_ADDRESS}: 通过该地址向集群其他节点公布 api server 的信息。
--allow-privileged=true: 允许拥有系统特权的容器运行。
--service-cluster-ip-range=10.0.0.0/24: 指定 Service Cluster IP 地址段。
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction: 
启用准入控制插件,包括命名空间生命周期、限制器、服务账户、资源配额和节点限制等。
--authorization-mode=RBAC,Node: 启用 RBAC 和节点授权模式。
--enable-bootstrap-token-auth=true: 启用 TLS Bootstrap 机制。
--token-auth-file=/opt/kubernetes/cfg/token.csv: 指定 Bootstrap Token 认证文件路径。
--service-node-port-range=30000-50000: 指定 Service NodePort 的端口范围。
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem: 指定 API Server 访问 kubelet 的客户端证书。
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem: 指定 API Server 访问 kubelet 的客户端私钥。
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem: 指定 API Server 的 HTTPS 证书。
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem: 指定 API Server 的 HTTPS 私钥。
--client-ca-file=/opt/kubernetes/ssl/ca.pem: 指定客户端证书的 CA 文件。
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem: 指定服务账户的密钥文件。
--service-account-issuer=api: 指定服务账户的发行者。
--service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem: 指定服务账户的签名密钥文件。
--etcd-cafile=/opt/etcd/ssl/ca.pem: 指定连接 etcd 集群的 CA 文件。
--etcd-certfile=/opt/etcd/ssl/server.pem: 指定连接 etcd 集群的证书文件。
--etcd-keyfile=/opt/etcd/ssl/server-key.pem: 指定连接 etcd 集群的密钥文件。
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem: 指定用于验证请求头的 CA 文件。
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem: 指定用于代理客户端的证书文件。
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem: 指定用于代理客户端的私钥文件。
--requestheader-allowed-names=kubernetes: 允许的请求头名称。
--requestheader-extra-headers-prefix=X-Remote-Extra-: 请求头中额外的头部前缀。
--requestheader-group-headers=X-Remote-Group: 请求头中组的头部。
--requestheader-username-headers=X-Remote-User: 请求头中用户名的头部。
--enable-aggregator-routing=true: 启用聚合层路由。
--audit-log-maxage=30: 审计日志最大保留天数。
--audit-log-maxbackup=3: 审计日志最大备份数。
--audit-log-maxsize=100: 审计日志最大大小。
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log: 审计日志文件路径。controller-manager.sh:
--logtostderr=false: 禁用将日志输出到控制台的选项,将日志写入文件。
--v=2: 设置日志的详细级别,此处为 2。
--log-dir=/opt/kubernetes/logs: 指定日志文件的目录。
--leader-elect=true: 启用 leader 选举,当该组件启动多个实例时,自动选举一个为 leader,其余为 follower。
--kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig: 指定连接 kube-apiserver 的配置文件路径,用
于识别 Kubernetes 集群。
--bind-address=127.0.0.1: 指定监听地址。
--allocate-node-cidrs=true: 自动为每个节点分配 CIDR,用于分配 Pod 的 IP 地址。
--cluster-cidr=10.244.0.0/16: 指定 Pod 资源的网段,需与 Pod 网络插件的设置一致。
pod资源的网段,需与pod网络插件的值设置一致。
Flannel网络插件的默认为10.244.0.0/16,
Calico插件的默认值为20.0.0.0/16
--service-cluster-ip-range=10.0.0.0/24: 指定 Service Cluster IP 地址段。
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem 和 --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem: 
自动为 kubelet 颁发证书的 CA,与 kube-apiserver 保持一致。
--root-ca-file=/opt/kubernetes/ssl/ca.pem: 指定根 CA 证书文件路径,用于对 kube-apiserver 证书进行校验。
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem: 用于签署 ServiceAccount 的私钥文件。
--cluster-signing-duration=87600h0m0s: 设置为 TLS Bootstrapping 签署的证书有效时间为 10 年,默认为 1 年。scheduler.sh:
--logtostderr=false:禁用输出到标准错误的日志。
--v=2:日志的详细级别,设置为 2。
--log-dir=/opt/kubernetes/logs:指定日志文件的存储路径。
--leader-elect=true:启用 leader 选举机制,确保只有一个 kube-scheduler 实例成为 leader。
--kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig:连接到 Kubernetes API Server 的配置文件路径。
--bind-address=127.0.0.1:kube-scheduler 监听的地址。创建kubernetes工作目录
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}创建用于生成CA证书、相关组件的证书和私钥的目录
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
./k8s-cert.sh				#生成CA证书、相关组件的证书和私钥复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
载地址:https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.mdcd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,
接下来就可以用 RBAC 进行授权
cd /opt/k8s/
vim token.sh
#!/bin/bash
#获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')#生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOFhmod +x token.sh
./token.shcat /opt/kubernetes/cfg/token.csv
二进制文件、token、证书都准备好后,开启 apiserver 服务
cd /opt/k8s/
./apiserver.sh 20.0.0.70 https://20.0.0.70:2379,https://20.0.0.72:2379,https://20.0.0.73:2379检查进程是否启动成功
ps aux | grep kube-apiservernetstat -natp | grep 6443   #安全端口6443用于接收HTTPS请求,用于基于Token文件或客户端证书等认证
启动 scheduler 服务
cd /opt/k8s/
./scheduler.sh
ps aux | grep kube-scheduler启动 controller-manager 服务
./controller-manager.sh
ps aux | grep kube-controller-manager生成kubectl连接集群的kubeconfig文件
./admin.sh通过kubectl工具查看当前集群组件状态
kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-2               Healthy   {"health":"true"}   
etcd-1               Healthy   {"health":"true"}   
etcd-0               Healthy   {"health":"true"}  查看版本信息
kubectl version

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

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

相关文章

计算机网络技术概述 习题答案及解析

1-1 因特网的前身是 1969 年创建的第一个分组交换网&#xff08; D &#xff09;。 A. internet B. Internet C. NSFNET D. ARPANET 【答案】D 1-2 因特网上的数据交换方式是&#xff08; C &#xff09;。 A. 电路交换 B. 报文交换 C. 分组交换 D…

【深度学习:Few-shot learning】理解深入小样本学习中的孪生网络

【深度学习&#xff1a;Few-shot learning】理解深入小样本学习中的孪生网络 深入理解孪生网络&#xff1a;架构、应用与未来展望小样本学习的诞生元学习小样本学习孪生网络的基本概念孪生网络的细节Triplet Loss架构特点关键组件训练过程主要应用领域未来展望示例图片结论 备注…

内网常规攻击路径

点击星标&#xff0c;即时接收最新推文 随着网络技术的发展&#xff0c;企业内部网络架构的变化&#xff0c;网络设备多样性的增加&#xff0c;面对内网攻击&#xff0c;防御体系逐渐阶梯化&#xff0c;通过不同维度的防御联动&#xff0c;将攻击拒之门外。对于突破网络边界后进…

java 方法

方法&#xff1a; 什么是方法&#xff0c;有什么用&#xff1f; 方法&#xff08;英语单词&#xff1a;method&#xff09;是可以完成某个特定功能的并且可以被重复利用的代码片段。 在 C 语言中&#xff0c;方法被称为“函数”。在 java 中不叫函数&#xff0c;叫做方法。 方法…

跨境电商:平台选择的艺术与科学

一、平台类型与特点 亚马逊&#xff1a;作为全球最大的电商平台之一&#xff0c;亚马逊拥有庞大的用户群体和完善的物流体系。它以优质的服务和高效的配送著称&#xff0c;但竞争也相对激烈。eBay&#xff1a;eBay是一个全球性的在线拍卖和购物网站&#xff0c;它的市场覆盖面…

十大排序算法归纳

目录 排序算法的分类 插入排序算法模板 选择排序算法模板 冒泡排序算法模板 希尔排序算法模板 快速排序算法模板 归并排序算法模板 堆排序算法模板 基数排序算法模板 计算排序算法模板 桶排序算法模板 排序算法的分类 插入&#xff1a;插入&#xff0c;折半插入&am…

【Vue2+3入门到实战】(18)VUE之Vuex状态管理器概述、VueX的安装、核心概念 State状态代码实现 详细讲解

目录 一、[Vuex](https://vuex.vuejs.org/zh/) 概述1.是什么2.使用场景3.优势4.注意&#xff1a; 二、需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 三、vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index…

万字盘点 Android 领域在 2023 年的重要技术:AI, 14, Compose, 鸿蒙...

AICore 2022 年底横空出世的 GPT-3.5 引发了全球的大模型 LLM 狂潮。作为在 AI 领域耕耘多年的巨头&#xff0c;Google 自然不会坐视不管&#xff0c;于 2023 年底之际发布了超越 GPT-4 的 Gemini 系列模型&#xff0c;其在多模态领域的表现令无数人震撼。 而对于 Android 开发…

路由器tcpdump抓包方法

背景 一些嵌入式设备无法修改固件或者配置&#xff0c;但又想分析其网络访问&#xff0c;就不得不在路由器上抓包。 本文已openwrt为例&#xff0c;配合pc端wireshark软件&#xff0c;说明抓包过程 1.路由器安装tcpdump opkg update opkg install libc opkg install libpcap …

nacos2.3.0配置中心问题处理

问题&#xff1a;Error to process server push response: {"headers":{},"abilityTable":{"supportPersistentInstanceByGrpc":true},"module":"internal"} 处理办法&#xff1a; 将pom.xml中 <!-- nacos服务注册/发…

我在Vscode学OpenCV 图像处理四(轮廓查找 cv2.findContours() cv2.drawContours())-- 待补充

图像处理四&#xff08;轮廓查找&#xff09; 一、前言1.1 边缘检测和轮廓查找的区别是什么1.1.1 边缘检测&#xff1a;1.1.2 轮廓查找&#xff1a; 1.2 边缘检测和轮廓查找在图像处理中的关系和流程 二、查找并绘制轮廓2.1 cv2.findContours()&#xff1a;2.1.1 详细介绍&…

Vue3的proxy

vue3.0中,使用proxy替换了原来遍历对象使用Object.defineProperty方法给属性添加set/get    vue的核心能力之一是监听用户定义的状态变化并响应式刷新DOM   vue2是通过替换状态对象属性的getter和setter来实现的,vue3则通过proxy进行   改为proxy后,可以突破vue当前的…

面向对象的五大基本原则

一、单一职责原则 一个类&#xff0c;最好只做一件事&#xff0c;只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申&#xff0c;将职责定义为引起变化的原因&#xff0c;以提高内聚性来减少引起变化的原因。 二、开放封闭原则 软件实体应…

2312d,d的10月会议

原文 拉兹万 Razvan从他最近在内联中遇见的一个问题开始,他不知道如何解决.一般,当A模块导入B模块并从B调用函数时,如果B的目标文件没有传递给链接器,则最终会出现链接器错误. 如,在命令行上使用A.d编译并省略B.d时.但是,当内联调用函数时,则不会触发链接器错误.他怀疑这是一…

LVS那点事

LVS 原理 IPVS LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的&#xff0c;IPVS 是 LVS 集群系统的核心软件&#xff0c;它的主要作用是&#xff1a;安装在 Director Server 上&#xff0c;同时在 Director Server 上虚拟出一个 IP 地址&#xff0c;用户必须通过这个虚拟的…

数据挖掘与知识发现:解析关键概念

目录 1. 引言 1.1 背景 1.2 意义与应用 2. 数据挖掘的基本概念 2.1 定义与范畴 2.1.1 数据挖掘的定义 2.1.2 数据挖掘的范畴 2.2 数据挖掘过程 2.2.1 问题定义 2.2.2 数据采集与清洗 2.2.3 特征选择 2.2.4 模型构建 2.2.5 模型评估与验证 2.2.6 模型部署 2.3 数…

【ROS2】MOMO的鱼香ROS2(二)ROS2入门篇——ROS2初体验

ROS2初体验 引言专业术语认识1 认识ROS21.1 ROS2版本对照表1.2 ROS与ROS2对比1.3 ROS2架构1.3.1 DDS实现层1.3.2 ROS中间件接口&#xff08;RMW&#xff09;1.3.3 ROS2客户端库 RCL 2 安装ROS22.1 ROS安装&#xff08;一键式&#xff09;2.2 手动安装ROS22.2.1 添加ROS软件源2.…

电商大数据商品采集:阿里巴巴1688电商网站货源产品信息采集

商品详情大数据采集:阿里巴巴1688电商网站货源产品信息采集 ------------- 数据采集满足多种业务场景&#xff1a;适合产品、运营、销售、数据分析、政府机关、电商从业者、学术研究等多种身份 职业。 舆情监控&#xff1a;全方位监测公开信息&#xff0c;抢先获取舆论趋势。 市…

MP4容器结构英文缩写及英文全称(box结构、atom结构、MP4结构)

文章目录 MP4容器结构 参考文章&#xff1a;详解视频封装格式之MP4 MP4容器结构 MP4文件格式是一个复杂的层级结构&#xff0c;下面列出了一些常见的容器及其英文全称和中文标注&#xff0c;方便查阅&#xff1a; ftyp (File Type Box)&#xff1a;文件类型盒子moov (Movie B…

java虚拟机内存管理

文章目录 概要一、jdk7与jdk8内存结构的差异二、程序计数器三、虚拟机栈3.1 什么是虚拟机栈3.2 什么是栈帧3.3 栈帧的组成 四、本地方法栈五、堆5.1 堆的特点5.2 堆的结构5.3 堆的参数配置 六、方法区6.1 方法区结构6.2 运行时常量池 七、元空间 概要 根据 JVM 规范&#xff0…