K8S:kubeadm搭建K8S+Harbor 私有仓库
文章目录
- 一.部署规划
- 1.主机规划
- 2.部署流程
- 二.kubeadm搭建K8S
- 1.环境准备
- 2.安装docker
- 3. 安装kubeadm,kubelet和kubectl
- 4.部署K8S集群
- (1)初始化
- (2)部署网络插件flannel
- (3)创建 pod 资源
- 5.部署 Dashboard
- 6.安装Harbor私有仓库
- 7.kubeadm内核参数优化方案
一.部署规划
1.主机规划
主机名及主机大小 | 主机ip | 安装软件 |
---|---|---|
master(2C/4G,cpu核心数要求大于2) | 192.168.198.11 | docker、kubeadm、kubelet、kubectl、flannel |
node01(2C/2G) | 192.168.198.12 | docker、kubeadm、kubelet、kubectl、flannel |
node02(2C/2G) | 192.168.198.13 | docker、kubeadm、kubelet、kubectl、flannel |
Harbor节点(hub.blue.com) | 192.168.198.14 | docker、docker-compose、harbor-offline-v1.2.2 |
2.部署流程
(1)在所有节点上安装Docker和kubeadm
(2)部署Kubernetes Master
(3)部署容器网络插件
(4)部署 Kubernetes Node,将节点加入Kubernetes集群中
(5)部署 Dashboard Web 页面,可视化查看Kubernetes资源
(6)部署 Harbor 私有仓库,存放镜像资源
相关安装包在资源的K8S:kubeadm搭建K8S+Harbor 私有仓库中
二.kubeadm搭建K8S
1.环境准备
master、node01、node02操作
#所有节点,关闭防火墙规则,关闭selinux,关闭swap交换
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#交换分区必须要关闭
swapoff -a
#永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
sed -ri 's/.*swap.*/#&/' /etc/fstab
#加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
#修改主机名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02bash
#所有节点修改hosts文件
vim /etc/hosts
192.168.198.11 master01
192.168.198.12 node01
192.168.198.13 node02
#调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
#生效参数
sysctl --system
2.安装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.io
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}
EOF
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
docker info | grep "Cgroup Driver"
#返回值
Cgroup Driver: systemd
3. 安装kubeadm,kubelet和kubectl
所有节点
#定义kubernetes源
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
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
#开机自启kubelet
systemctl enable kubelet.service
#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启
4.部署K8S集群
(1)初始化
所有节点
#查看初始化需要的镜像
kubeadm config images list
master 节点上操作
#在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录
cd /opt/
unzip v1.20.11.zip -d /opt/k8s
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
#复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt
node01节点上操作
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
node02节点上操作
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
master 节点上操作此处选用方法二的命令
#初始化kubeadm,有两种方式方法二命令和方法一配置文件,此处选用方法二的命令
方法一:
kubeadm config print init-defaults > /opt/kubeadm-config.yamlcd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.198.11 #指定master节点的IP地址
13 bindPort: 6443
......
34 kubernetesVersion: v1.20.11 #指定kubernetes版本号
35 networking:
36 dnsDomain: cluster.local
37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38 serviceSubnet: 10.96.0.0/16 #指定service网段
39 scheduler: {}#末尾再添加以下内容apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #把默认的kube-proxy调度方式改为ipvs模式
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志#查看 kubeadm-init 日志
less kubeadm-init.log#kubernetes配置文件目录
ls /etc/kubernetes/#存放ca等证书和密码的目录
ls /etc/kubernetes/pki
方法二:
方法二:
kubeadm init \
--apiserver-advertise-address=192.168.198.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.11 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
–apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
–apiserver-bind-port:apiserver的监听端口,默认是6443
–cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
–control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
–image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
–kubernetes-version:指定kubernetes版本
–pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
–service-cidr:service资源的网段
–service-dns-domain:service全域名的后缀,默认是cluster.local–token-ttl=0:默认token的有效期为24小时,如果不想过期,可以加上 --token-ttl=0 这个参数
#方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs
kubectl edit cm kube-proxy -n=kube-system#此处执行完会提示以下,则我们需要进一步操作设定
The connection to the server localhost:8080 was refused - did you specify the right host or port?
#设定kubectl,kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#显示已存在
ll /root/.kube/
chown $(id -u):$(id -g) $HOME/.kube/config
#授权结束即可以查看生成的相关信息配置,查看后即退出
vim /root/.kube/config
#再次初始化,就可看到相关信息,并修改第44行修改mode: "ipvs"
[root@master01 ~]# kubectl edit cm kube-proxy -n=kube-system[root@master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane,master 49m v1.20.11
[root@master01 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0 Healthy {"health":"true"}
#如果 kubectl get cs 发现集群不健康,更改以下两个文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml修改如下内容把--bind-address=127.0.0.1变成--bind-address=192.168.198.11 #行修改成k8s的控制节点master01的ip
把httpGet:字段下的hosts由127.0.0.1变成192.168.198.11(有两处)
#- --port=0 # 搜索port=0,把这一行注释掉
systemctl restart kubelet
systemctl enable kubelet
#再次查看健康状态
kubectl get cs
(2)部署网络插件flannel
node01操作
方法一此文使用的是此方法:
#所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件
cd /opt
scp kuadmin-flannel.zip node02:/opt/
#解压
unzip kuadmin-flannel.zip
#加载
docker load -i flannel-cni-v1.2.0.tar
docker load -i flannel-v0.22.2.tar
#创建并解压到相关目录
mv cni cni_bak
mkdir cni/bin -p
tar zxvf cni-plugins-linux-amd64-v1.2.0.tgz -C cni/bin
#查看新的文件
ll cni/bin/
node02操作
cd /opt
unzip kuadmin-flannel.zip
docker load -i flannel-cni-v1.2.0.tar
docker load -i flannel-v0.22.2.tar
mv cni cni_bak
mkdir cni/bin -p
tar zxvf cni-plugins-linux-amd64-v1.2.0.tgz -C cni/bin
#查看新的文件
ll cni/bin/
scp kube-flannel.yml master01:/opt/
node01和node02节点操作
#执行 kubeadm join 命令加入群集
#复制master中执行过这个命令的kubeadm init \在node节点操作
kubeadm join 192.168.198.11:6443 --token 41u9qh.bku8bq9t8ibxejxs \--discovery-token-ca-cert-hash sha256:0f128acf6bec78b03810ea3f6cb5c0bb10da0adeb2bc8a1dcffe385a12bb3293
在master节点操作
#在master节点查看节点状态
kubectl get nodes#在 master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml #再次查看节点状态
kubectl get nodes
kubectl get pods -n kube-system
kubectl get pods -n kube-flannel
如执行kubectl get pods -n kube-flannel发现有不是running或者查看节点状态 kubectl get
nodes出现NoReady解决方法:查看所有的机器防火墙等是否关闭
执行:
删除再次生成
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml
执行后需等待可再次查看状态
kubectl get pods -n kube-flannel
(3)创建 pod 资源
在master节点操作
#创建 pod 资源创建
kubectl create deployment nginx --image=nginx
#查看创建的资源,需等待
kubectl get pods -o wide
#暴露端口提供服务
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc
或kubectl get service
#测试访问
curl http://node01:32404
注意此处的端口是kubectl get svc执行出来的nginx端口
http://192.168.198.12:31128/
#扩展pod副本(3个)
kubectl scale deployment nginx --replicas=3
#刷新查看pod,需等待查看
kubectl get pods -o wide
5.部署 Dashboard
master01 节点上操作
#上传dashboard.tar到opt下
scp dashboard.tar node01:/opt
scp dashboard.tar node02:/opt
node节点上操作
#加载
docker load -i dashboard.tar
master01 节点上操作
#在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001 type: NodePort selector:k8s-app: kubernetes-dashboard
#启动
kubectl apply -f recommended.yaml
#
#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')token: eyJhbGciOiJSUzI1NiIsImtpZCI6InZuekF5cFVGVHpjc24xRm05Q2x4aGp0UmRUdGlqMUxSZHVoyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYnBna2MiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvY3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTBhYTExYWEtMDRkMy00MTFmMzMyMTQ0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbnU4g-OFJStZDxjQiicaUh8Ef947W7zuRYWzHXQX7gfQZN75CGhXOGtbzIEbF_UuIjAueb1FV9F3T34aEY3aOLiQ1HD0HMImjkvxHUyNOMFAjShRrSHKQtVkcrBIKtSdSFag5yn3Y4d7H4KVHMGn9Aw26JYCqBgcWeBrm8ebEHFY8LaiqXtJXUcYB23M5rQV4OVHcuPYYfg_iiL7_24Z7HOKGiGTBdbaSQNwJEBJQX-2K6aoZOwe73LATR1WxEigyALoFS7Bf2fLy3FWAAQmj3Bu3kw#查看创建的所有即有创建的用户dashboard-admin
kubectl -n kube-system get sa
#使用输出的token登录Dashboard
#此处是nodeIP地址
https://192.168.198.12:30001
空敲this is unsafe (不用空格),回车即可
选择token输入查到的token登录即可
6.安装Harbor私有仓库
Harbor节点上操作
#修改主机名
hostnamectl set-hostname hub.blue.com
bash
#关闭防火墙规则,关闭selinux,关闭swap交换
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
所有节点上操作
#所有节点加上主机名映射
echo '192.168.198.14 hub.blue.com' >> /etc/hosts
Harbor节点上操作
#安装 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.iomkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.blue.com"]
}
EOF
systemctl start docker
systemctl enable docker
node 节点上操作
#所有 node 节点都修改 docker 配置文件,加上私有仓库配置
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.blue.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
Harbor节点上操作
#安装 Harbor
#上传 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目录
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-composetar zxvf harbor-offline-installer-v1.2.2.tgz
cd harbor/
vim harbor.cfg
5 hostname = hub.blue.com
9 ui_url_protocol = https
24 ssl_cert = /data/cert/server.crt
25 ssl_cert_key = /data/cert/server.key
59 harbor_admin_password = Harbor12345
#生成证书
mkdir -p /data/cert
cd /data/cert
#生成私钥,2048密码长度数值
openssl genrsa -des3 -out server.key 2048
输入两遍密码:123456#生成证书签名请求文件
openssl req -new -key server.key -out server.csr
输入私钥密码:123456
输入国家名:CN
输入省名:NJ
输入市名:NJ
输入组织名:BLUE
输入机构名:BLUE
输入域名:hub.blue.com
输入管理员邮箱:admin@blue.com
其它全部直接回车
#备份私钥
cp server.key server.key.org
#清除私钥密码
openssl rsa -in server.key.org -out server.key
输入私钥密码:123456
#生产环境中会提供相应的证书,只需要将放置正确路径
#签名证书,x509证书认证格式,-signkey迁移到server.key
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crtls
chmod +x /data/cert/*
cd /opt/harbor/
./install.sh
docker-compose ps
在本地使用火狐浏览器访问:https://hub.blue.com
添加例外 -> 确认安全例外
用户名:admin
密码:Harbor12345
node02节点上操作
#在一个node节点上登录harbor
docker login -u admin -p Harbor12345 https://hub.blue.com
报错:
docker login -u admin -p Harbor12345 https://hub.blue.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get “https://hub.blue.com/v2/”: tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead证书验证失败的问题。这可能是由于 Harbor 的 SSL 证书未正确配置,导致 Docker 无法验证证书的有效性。
考虑更新 Harbor 的 SSL 证书,确保证书中的 Subject Alternative Names (SANs) 字段正确配置,并包含正确的登录地址和其他必要信息。获取有效的 SSL 证书
(1)从新获取证书验证
(2)重新部署Harbor服务器,注意添加node主机、harbor主机名映射
(3)node 节点都修改 docker 配置文件结束后需要重启
systemctl daemon-reload
systemctl restart docker
#上传镜像
#Docker 镜像重命名
docker tag nginx:latest hub.blue.com/library/nginx:v1
docker push hub.blue.com/library/nginx:v1
master01节点上操作
#在master节点上删除之前创建的nginx资源
kubectl get pods
kubectl delete deployment nginxkubectl create deployment nginx-deployment --image=hub.blue.com/library/nginx:v1 --port=80 --replicas=3kubectl expose deployment nginx-deployment --port=30000 --target-port=80kubectl get svc,pods
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h
service/nginx NodePort 10.96.213.1 <none> 80:31128/TCP 15h
service/nginx-deployment ClusterIP 10.96.165.162 <none> 30000/TCP 7sNAME READY STATUS RESTARTS AGE
pod/nginx-deployment-6cff9b4c45-l892b 1/1 Running 0 23s
pod/nginx-deployment-6cff9b4c45-qjc87 1/1 Running 0 23s
pod/nginx-deployment-6cff9b4c45-tcwjx 1/1 Running 0 23s
yum install ipvsadm -yipvsadm -Ln
node节点操作
curl 10.96.165.162:30000
master01节点操作,对外访问
kubectl edit svc nginx-deployment
#把调度策略改成NodePort,26行
type: NodePort
kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h
nginx NodePort 10.96.213.1 <none> 80:31128/TCP 15h
nginx-deployment NodePort 10.96.165.162 <none> 30000:31231/TCP 4m8s
浏览器访问:
192.168.198.11:31231
192.168.198.12:31231
192.168.198.13:31231
#将cluster-admin角色权限授予用户system:anonymous,设置用户的管理员权限
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
7.kubeadm内核参数优化方案
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 #禁止使用 swap 空间,只有当系统内存不足(OOM)时才允许使用它
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963 #指定最大文件句柄数
fs.nr_open=52706963 #仅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
相关文章:
K8S:kubeadm搭建K8S+Harbor 私有仓库
文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm,kubelet和kubectl4.部署K8S集群(1)初始化(2)部署网络插件flannel(3)创建 pod 资源 5.部署 …...
MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 论文阅读
论文信息 题目:MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 作者:Weihao Xuan, Ruijie Ren, Siyuan Wu, Changhao Chen 时间:2022 来源: IEEE/SICE International Symposium on System Integration …...
面试求职-面试注意事项
面试技巧和注意事项有哪些? 面试是找工作过程中最重要的一个环节,因为面试成功,你才有可能得到一份工作。求职面试技巧有哪些呢?首先,我们来看看面试注意事项。 企业了解 1、面试前有没有仔细了解过对应企业的情况,…...
sm2 签名验签
目前发现 sm2 有很多实现,比如 gmssl, openssl 1.1.1 ,openssl 3.0,各种代码库实现等等。实践中发现这些实现会出现不能互相验签的情况。后续研究一下。 网上的一些资料,给出了一些 openssl 指令,但是没有标明 openssl 的版本&…...
如何检查Windows 11笔记本电脑电池健康状况
如果你拥有一台运行微软最新操作系统的便携式电脑,那么检查Windows 11笔记本电脑的电池健康状况可能很重要。 电池寿命显然是一件大事,无论你是在最好的商务笔记本电脑上工作,还是在目前市场上最好的游戏笔记本电脑上享受马拉松式的Starfiel…...
编程大师-分布式
分布式锁 mysql redis 【IT老齐122】不只setnx,两张图说清Redisson的Redis分布式锁实现_哔哩哔哩_bilibili zk 用这种方式去实现,zookeeper分布式锁,你会吗?_哔哩哔哩_bilibili...
内网隧道代理技术(二十三)之 DNS隧道反弹Shell
DNS隧道反弹Shell DNS隧道 DNS协议是一种请求、应答协议,也是一种可用于应用层的隧道技术。DNS隧道的工作原理很简单,在进行DNS查询时,如果查询的域名不在DNS服务器本机缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议…...
如何利用Socks5代理IP提升网络安全与跨境电商业务
在今天的数字时代,网络安全对于个人和企业来说都至关重要。随着跨境电商和在线游戏等业务的不断发展,保护网络安全变得尤为重要。Socks5代理IP是一项强大的工具,可以帮助您实现更高水平的网络安全,同时促进跨境电商和游戏领域的增…...
信号量(Semaphore)
信号量(Semaphore)是一种经典的多线程同步工具,用于控制多个线程对共享资源的访问。信号量维护了一个计数器,表示可用的资源数量,线程可以通过信号量来请求资源并释放资源。信号量的主要操作包括获取(acquire)资源和释放(release)资源。 Java 中的信号量通常有两种类…...
<el-input-number>显示两位数字;如果是一位数字的话前面补0
可以通过自定义 formatter 函数来实现。具体步骤如下: 在 <el-input-number> 上添加 :formatter 属性,值为 formatter 函数名。 在 methods 中定义 formatter 函数,该函数接收一个参数 value,表示当前输入框中的值。 在 f…...
基于SSM的鲜花商城系统【附源码文档】
基于SSM的鲜花商城系统【附源码文档】 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色:用户、管理员 用户:登录、注册、商品查询、公告预…...
【算法与数据结构】501、LeetCode二叉搜索树中的众数
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:根据前面几篇文章98、LeetCode验证二叉搜索树、530、LeetCode二叉搜索树的最小绝对差。我们知道二叉搜…...
Spring MVC 六 - DispatcherServlet处理请求过程
前面讲过了DispatcherServlet的初始化过程(源码角度的DispatcherServlet的具体初始化过程还没说,先放一放),今天说一下DispatcherServlet处理请求的过程。 处理过程 WebApplicationContext绑定在当前request属性上(属…...
Python实现猎人猎物优化算法(HPO)优化BP神经网络回归模型(BP神经网络回归算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…...
【图论】SPFA求负环
算法提高课笔记 文章目录 基础知识例题虫洞题意思路代码 观光奶牛题意思路代码 单词环题意思路代码 基础知识 负环:环上权值之和是负数 求负环的常用方法 基于SPFA 统计每个点入队次数,如果某个点入队n次,则说明存在负环(完全…...
vue3中的吸顶导航交互实现 | VueUse插件
目的:浏览器上下滚动时,若距离顶部的滚动距离大于78px,吸顶导航显示,小于78px隐藏。使用vueuse插件中的useScroll方法和动态类名控制进行实现 1. 安装 npm i vueuse/core 2. 获得滚动距离 项目中导入࿰…...
MySql 笔记
数据结构:BTREE 二叉树:顺序增长依次查询效率低 红黑树: 数据多了深度越深,效率自然低了 HASH: 查询条件限制 B-TREE:度(degree)-节段的数据存储个数,叶节点具有 相…...
部署elasticsearch集群
创建es集群 编写一个docker-compose.yaml文件,内容如下 version: 2.2 services:es01:image: elasticsearch:7.12.1container_name: es01environment:- node.namees01- cluster.namees-docker-cluster- discovery.seed_hostses02,es03- cluster.initial_master_nod…...
CTF入门学习笔记——Crypto密码(现代密码)
文章目录 CTF入门学习笔记——Crypto密码(现代密码)因数分解因数分解 共享素数Bigrsa 低加密指数攻击(小明文攻击)crypto5 共模攻击rsa_output 广播攻击Crazy_Rsa_Tech 待补充 CTF入门学习笔记——Crypto密码(现代密码…...
(3)MyBatis-Plus待开发
常用注解 TableName MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定即实体类型决定,且默认操作的表名和实体类型的类名一致,如果不一致则会因找不到表报异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, &…...
正则表达式参考手册
修饰符 修饰符用于执行区分大小写和全局匹配: 修饰符描述i执行对大小写不敏感的匹配。g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。m执行多行匹配。 方括号 方括号用于查找某个范围内的字符: 表达式描述[abc]查找方括号之间…...
【农业生产模拟】WOFOST模型与PCSE模型实践
查看原文>>>【农业生产模拟】WOFOST模型与PCSE模型实践 实现作物产量的准确估算对于农田生态系统响应全球变化、可持续发展、科学粮食政策制定、粮食安全维护都至关重要。传统的经验模型、光能利用率模型等估产模型原理简单,数据容易获取,但是…...
PHP8中获取并删除数组中最后一个元素-PHP8知识详解
在php8中,array_pop()函数将返回数组的最后一个元素,并且将该元素从数组中删除。语法格式如下: array_pop(目标数组) 获取并删除数组中最后一个元素,参考代码: <?php $stu array(s001>明明,s002>亮亮,s…...
JS原理-笔记(1/3)
JS原理-笔记(1/3) 知识点自测 今天课程中涉及到的已学习知识点 函数的call方法-文档链接 // 以指定的this调用函数,并通过 从第二个参数开始依次传递参数 function func(food,drink){console.log(this)console.log(food)console.log(drink)…...
Django创建应用、ORM的进阶使用及模型类数据库迁移
1 Django项目创建第一个应用 Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为 App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。 一个 App 就是一…...
tcpdump 如何使用
tcpdump 是一个在Unix和类Unix系统上运行的网络抓包工具,它用于捕获网络流量并将其转储到文件中以供后续分析。tcpdump非常强大,可以用于监控、调试和分析网络通信,用于排查网络问题以及安全审计。以下是关于如何使用tcpdump的详细介绍&#…...
goweb入门
创建gomod项目 go mod init web01新建main.go package mainimport ("fmt""net/http" )func handler(writer http.ResponseWriter, request *http.Request) {fmt.Fprintf(writer, "Hello World,%s!", request.URL.Path[1:]) } func main() {fmt…...
【python爬虫】批量识别pdf中的英文,自动翻译成中文下
不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。之前的文章提供了批量识别pdf中英文的方法,详见【…...
YApi 新版如何查看 http 请求数据
YApi 新版如何查看 http 请求数据 因chrome 安全策略限制,在 cross-request 升级到 3.0 后, 不再支持文件上传功能,并且需要通过以下方法查看 network:1.首先在chrome 输入 > chrome://extensions打开扩展页2.开启开发者模式3.点击 cross…...
自动驾驶(apollo)
💓博主csdn个人主页:小小unicorn 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 自动驾驶技术 引言自动驾驶的基本原理自动驾驶的技术挑战自动驾驶的潜在影响结…...
手机免费网站建设/网站的seo如何优化
目录 1、Set集合接口 2、关于TreeSet排序 3、关于重复元素 4、小结 1、Set集合接口 Set也是Collection的子接口,主要特点是保存的数据不允许出现重复。但Set子接口并不像List子接口那样,针对Collection接口进行扩展,而是完整按照Collect…...
界首做网站/百度网页版入口链接
文件操作的流程 打开文件 f open(r文件路径, w, encoding字符编码) 读取/修改文件 f.write(写入) 保存文件 f.flush() # 快速保存 关闭文件 f.close() # 告诉操作系统关闭文件 文件的三种打开模式 读取: rt read_text 针对文本内容只读 f open(rC:\Users\Black\Documents\Pyt…...
阿里云 做网站/b2b国际贸易平台
现在社会,网络差不多已经渗透到了人类生活的方方面面,衣食住行都需要网络的助力。现代人对网络的需求是旺盛的,所以基本家家户户都会接上宽带,安上路由器。现代人对于网络的追求也是要求优质的、快速的,所以装上百兆宽…...
wordpress标题图片代码/跨境电商平台
【题目】 将六个数字1,1,2,2,3,3排成一排,使得两个1之间有一个数字,两个2之间有两个数字,两个3之间有3个数字。 此题的解决并不困难,我们可以采用枚举法:…...
建立一个网站需要人员/小程序开发需要哪些技术
1. 参考的优秀文章 Request/Response protocols and RTT2. 来源 原来,系统中一个树结构的数据来源是Redis,由于数据增多、业务复杂,查询速度并不快。究其原因,是单次查询的数量太多了,一个树结构,大概要几…...
医院网站建设公司/成都高新seo
css css2 css3今天,我们将与您分享作为Web设计人员/开发人员需要了解的10个“您必须知道”的CSS和CSS3工具和资源的集合。 您可以在此处检查Internet Explorer支持CSS3功能。 尽管没有支持CSS3的任何令人兴奋的新功能,但是Microsoft宣布在Internet Explo…...