CentOS 7.8 kubeadm安装 k8s 1.26
CentOS 7.8 kubeadm安装 k8s 1.26
规划
集群
主机名 | IP地址 |
---|---|
k8s-master01 | 192.168.200.101 |
k8s-master02 | 192.168.200.102 |
k8s-master03 | 192.168.200.103 |
k8s-node01 | 192.168.200.201 |
k8s-node02 | 192.168.200.202 |
VIP(虚拟IP)
192.168.200.80
Harbor
http://192.168.200.50
基础
1.设置静态IP
2.设置ssh远程登录
安装epel源
yum install epel-release -y
yum makecache fast
安装一些工具
yum install -y yum-utils device-mapper-persistent-data lvm2
基本设置
防火墙处理
禁用SELINUX
sed -i 's/enforcing/disabled/' /etc/selinux/config
禁用所有swap交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
临时关闭交换分区swap
swapoff -a
分别设置主机名(根据当前主机名称修改)
vi /etc/hostname
添加 hosts 主机地址映射
cat >> /etc/hosts <<EOF
192.168.200.101 k8s-master01
192.168.200.102 k8s-master02
192.168.200.103 k8s-master03
192.168.200.201 k8s-node01
192.168.200.202 k8s-node02
EOF
时间同步
安装ntpdata
yum -y install ntp
同步时间
ntpdate ntp1.aliyun.com
设置开机自动同步与定时执行
设置profile
追加
echo "ulimit -n 65535" >>/etc/profile
刷新配置
source /etc/profile
设置免密码登录
只有master01 节点执行
Master01 节点免密码登录其他节点(提示输入全部回车,不用输入)
ssh-keygen -t rsa
将密钥发送到其他主机上
ssh-copy-id -i .ssh/id_rsa.pub k8s-master01
ssh-copy-id -i .ssh/id_rsa.pub k8s-master02
ssh-copy-id -i .ssh/id_rsa.pub k8s-master03
ssh-copy-id -i .ssh/id_rsa.pub k8s-node01
ssh-copy-id -i .ssh/id_rsa.pub k8s-node02
yes并输入密码
内核升级
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定所以需要升级内核 4.18+ 以上
升级系统软件
yum install wget jg psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y
yum update -y --exclude=kernel* && reboot
升级内核
下载选好的内核版本
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
安装内核
yum localinstall -y kernel-ml*
更改启动内核
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
查看启动内核是否是我们需要的
grubby --default-kernel
重启生效,确认使用内核版本
reboot
uname -a
内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
net.ipv4.conf.all.route_localnet = 1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.inotify.max_user_instances=8192
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
加载配置
sysctl --system
安装docker
[所有节点安装docker]
添加docker yum源
yum -y install yum-utils
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/g' /etc/yum.repos.d/docker-ce.repo
更新yum包软件索引
yum makecache fast
查询所有版本
yum list docker-ce.x86_64 --showduplicates | sort -r
安装指定版本
yum -y install docker-ce-20.10.10-3.el7
启动&开机自启 docker
systemctl restart docker && systemctl enable docker
docker 设置非安全仓库
注意如果是私有仓库请设置非安全仓库,否则跳过
配置
想要推镜像,需要设置非安全仓库(这里使用http协议,没有使用https)
vim /etc/docker/daemon.json
192.168.200.50是自己搭建的 harbor仓库地址
{"insecure-registries":["192.168.200.50"]
}
重启docker
systemctl restart docker
查看信息
docker info
安装cri-dockerd
[所有节点都装cri-dockerd]
上传或下载cri-dockerd安装包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
安装cri-dockerd
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm
修改镜像地址为国内,否则kubelet拉取不了镜像导致启动失败
vi /usr/lib/systemd/system/cri-docker.service
使用阿里云源
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
使用私有仓库
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=192.168.200.50/google_containers/pause:3.9
启动cri-dockerd
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker
安装kubeadm
[所有节点安装kubeadm]
设置kubernetes 阿里云yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
快速建立yum缓存
yum -y makecache fast
查询所有版本
yum list kubeadm.x86_64 --showduplicates | sort -r
安装指定版本 kubeadm kubectl kubelet
yum install kubeadm-1.26.4-0.x86_64 kubectl-1.26.4-0.x86_64 kubelet-1.26.4-0.x86_64
systemctl restart kubelet && systemctl enable kubelet
安装高可用组件
[所有Master节点安装 keepalived与haproxy ]
yum -y install keepalived haproxy
配置HAProxy
所有master节点,配置相同
注意修改ip
cat > /etc/haproxy/haproxy.cfg << EOF
globalmaxconn 2000ulimit-n 16384log 127.0.0.1 local0 errstats timeout 30sdefaultslog globalmode httpoption httplogtimeout connect 5000timeout client 50000timeout server 50000timeout http-request 15stimeout http-keep-alive 15sfrontend k8s-masterbind 0.0.0.0:8443bind 127.0.0.1:8443mode tcpoption tcplogtcp-request inspect-delay 5sdefault_backend k8s-masterbackend k8s-mastermode tcpoption tcplogoption tcp-checkbalance roundrobindefault-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100server k8s-master01 192.168.200.101:6443 checkserver k8s-master02 192.168.200.102:6443 checkserver k8s-master03 192.168.200.103:6443 check
EOF
配置keepalived
注意每个master节点不一样
k8s-master01
注意修改ip,网卡名称!
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 5 weight -5fall 2rise 1
}
vrrp_instance VI_1 {state MASTERinterface ens33mcast_src_ip 192.168.200.101virtual_router_id 51priority 101nopreemptadvert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.200.80}track_script {chk_apiserver
} }
EOF
k8s-master02
注意修改ip,网卡名称
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 5 weight -5fall 2rise 1}
vrrp_instance VI_1 {state BACKUPinterface ens33mcast_src_ip 192.168.200.102virtual_router_id 51priority 90nopreemptadvert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.200.80}track_script {chk_apiserver
} }
EOF
k8s-master03
注意修改ip,网卡名称
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {router_id LVS_DEVEL
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 5weight -5fall 2 rise 1
}
vrrp_instance VI_1 {state BACKUPinterface ens33mcast_src_ip 192.168.200.103virtual_router_id 51priority 80nopreemptadvert_int 2authentication {auth_type PASSauth_pass K8SHA_KA_AUTH}virtual_ipaddress {192.168.200.80}track_script {chk_apiserver
} }
EOF
健康检测脚本
master 三节点相同
cat > /etc/keepalived/check_apiserver.sh << EOF
#!/bin/basherr=0
for k in $(seq 1 3)
docheck_code=$(pgrep haproxy)if [[ $check_code == "" ]]; thenerr=$(expr $err + 1)sleep 1continueelseerr=0breakfi
doneif [[ $err != "0" ]]; thenecho "systemctl stop keepalived"/usr/bin/systemctl stop keepalivedexit 1
elseexit 0
fi
EOF
给执行权限
chmod +x /etc/keepalived/check_apiserver.sh
启动haproxy和keepalived
所有master节点启动haproxy和keepalived
systemctl enable --now haproxy && systemctl enable --now keepalived
验证VIP
ping 192.168.200.80
初始化k8s集群
只有master01执行初始化
vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.200.101bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sockname: k8s-master01taints:- effect: PreferNoSchedulekey: node-role.kubernetes.io/master
---
apiServer:certSANs:- 192.168.200.80timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.200.80:8443
controllerManager: {}
dns: {type:CoreDNS
}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:dnsDomain: cluster.localpodSubnet: 172.168.0.0/16serviceSubnet: 10.96.0.0/12
scheduler: {}
转换版本
只有master01执行
如果初始化ymal版本比较旧可以使用如下命令进行转换新版本
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
拉取k8s组件镜像
可提前拉取镜像非必要
kubeadm config images pull --config kubeadm-config.yaml
初始化集群
只有master01执行
kubeadm init --config kubeadm-config.yaml --upload-certs
成功示例:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo 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/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join 192.168.200.80:8443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:839dcb5784d74069bb4d5bc57912125894cbc79006c6cdbe8627d2115de4aa3f \--control-plane --certificate-key 1651b597b323b1888f0308f761e1bc0716d2cda08b0024070821ad2cb06314d4
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
“kubeadm init phase upload-certs --upload-certs” to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.200.80:8443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:839dcb5784d74069bb4d5bc57912125894cbc79006c6cdbe8627d2115de4aa3f
[root@k8s-master01 ~]#
Token查看过期时间
只有master01可执行
获取信息
kubectl get secret -n kube-system
NAME TYPE DATA AGE
bootstrap-token-abcdef bootstrap.kubernetes.io/token 6 15h
查看内容
kubectl get secret -n kube-system bootstrap-token-abcdef -oyaml
apiVersion: v1
data:
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
expiration: MjAyMy0wNS0wMVQxNTowMzoyMlo=
token-id: YWJjZGVm
token-secret: MDEyMzQ1Njc4OWFiY2RlZg==
usage-bootstrap-authentication: dHJ1ZQ==
usage-bootstrap-signing: dHJ1ZQ==
kind: Secret
metadata:
creationTimestamp: “2023-04-30T15:03:22Z”
name: bootstrap-token-abcdef
namespace: kube-system
resourceVersion: “210”
uid: cd8dc8d5-2dfd-4d22-9c8b-320767e6c7ad
type: bootstrap.kubernetes.io/token
查看过期时间(base64编码)
echo "MjAyMy0wNS0wMVQxNTowMzoyMlo=" | base64 --decode
重新生成Token
如果token过期那么可以从新生成
node节点:
kubeadm token create --print-join-command
kubeadm join 192.168.200.101:6443 --token fkx9wu.k20ta9krq2r5lc5y --discovery-token-ca-cert-hash sha256:a4f07db80f54e277c8514991c76b040913310dba73397e4447126dcd11b72073
master节点:
注意要加上 --config=你的路径/初始化集群时候.yaml
kubeadm init phase upload-certs --upload-certs --config=/root/new.yaml --print-join-command
[root@k8s-master01 ~]# kubeadm init phase upload-certs --upload-certs --config=/root/new.yaml
[upload-certs] Storing the certificates in Secret “kubeadm-certs” in the “kube-system” Namespace
[upload-certs] Using certificate key:
094c1265df2831b7370757f89078215a117604a462438b067bd6909235384f3c
重新初始化 Kubernetes 集群
1.使用 kubeadm reset
命令将节点还原为初始状态。这将停止 kubelet 服务,删除所有与 Kubernetes 相关的容器和 Pod、配置文件和数据。确保你已备份任何重要数据,因为此操作将永久删除集群数据。
sudo kubeadm reset
2.清理 kubelet 的配置文件和证书目录:
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/lib/etcd
3.清理 CNI(容器网络接口)配置和数据:
sudo rm -rf /etc/cni/net.d
sudo rm -rf /var/lib/cni
4.删除 .kube
目录,这是 kubectl 的配置目录:
sudo rm -rf $HOME/.kube
重新初始化…
sudo kubeadm init --config kubeadm-config.yaml
安装插件
安装calico
[只有master01执行]
官方教程
https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises
下载yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml -O
打开编辑
vi calico.yaml
搜索 CALICO_IPV4POOL_CIDR
将前面的注释去掉下面的pi为pod的网段,保存推出
修改这里的ip,注意格式对齐,不然会报错
- name: CALICO_IPV4POOL_CIDRvalue: "172.168.0.0/16"
开始部署
kubectl apply -f calico.yaml
如果镜像拉取不下来编辑 calico.yaml 修改镜像源
可以搭建私有docker harbor 仓库来存储镜像以后从本地拉取即可
如下所示:
docker push 192.168.200.50/calico/cni:v3.25.1
docker push 192.168.200.50/library/calico/cni:v3.25.1
docker push 192.168.200.50/calico/cni:v3.25.1
查看pod 状态
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-557ff7c5d4-9cz2k 1/1 Running 0 89s
calico-node-fdj5s 1/1 Running 0 89s
coredns-5bbd96d687-ml854 1/1 Running 0 15h
coredns-5bbd96d687-mw5j7 1/1 Running 0 15h
etcd-k8s-master01 1/1 Running 10 (160m ago) 15h
kube-apiserver-k8s-master01 1/1 Running 10 (160m ago) 15h
kube-controller-manager-k8s-master01 1/1 Running 11 (118s ago) 15h
kube-proxy-6hlvn 1/1 Running 10 (160m ago) 15h
kube-scheduler-k8s-master01 1/1 Running 11 (118s ago) 15h
查看节点状态
kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 15h v1.26.4
其他节点加入集群
除master01外[master02…03…N 执行]
其他master节点加入
注意替换token,过期请从新生成token
kubeadm join 192.168.200.80:8443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:a17b9bd75fe97d3d96736ee7e99b58db7a5ba0ea9757dcc7d332f81ec7130697 \--control-plane --certificate-key 3f9e1a84015565ebeedf232990b0a3117ecf817a36fb71185ae562fdfe967c0d --cri-socket=/var/run/cri-dockerd.sock
node节点加入
注意替换token,过期请从新生成token
kubeadm join 192.168.200.80:8443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:a17b9bd75fe97d3d96736ee7e99b58db7a5ba0ea9757dcc7d332f81ec7130697 --cri-socket=/var/run/cri-dockerd.sock
从集群初始化节点 master01 将 admin.conf 传递至其他结点(以便使用kubectl命令)
scp /etc/kubernetes/admin.conf root@192.168.200.102:/etc/kubernetes/
传递完成后再 其他节点 上执行以下命令,以便 kubectl 使用 admin.conf
文件:
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
全部加入成功:
[root@k8s-master01 ~]#
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 22m v1.26.4
k8s-master02 Ready control-plane 15m v1.26.4
k8s-master03 Ready control-plane 15m v1.26.4
k8s-node01 Ready 41s v1.26.4
k8s-node02 Ready 48s v1.26.4
[root@k8s-master01 ~]#
其他指令
从 Kubernetes 集群中移除一个 master 节点
-
首先,在要移除的 master 节点上,使用
kubeadm
重置该节点:sudo kubeadm reset
这将删除与 Kubernetes 相关的所有配置和组件。
-
接下来,从其他 master 节点(例如,master01)移除 master02 的 etcd 成员。首先,找到 etcd 成员列表:
(如果不存在直接跳过第3步)
kubectl exec -n kube-system -it etcd-k8s-master01 -- etcdctl member list --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key
找到 master02 的 etcd 成员 ID(它看起来像一个长的十六进制数字)。
-
使用以下命令删除 master02 的 etcd 成员:
kubectl exec -n kube-system -it etcd-master01 -- etcdctl member remove <member_id> --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key
请将 `` 替换为在第 2 步中找到的 master02 的 etcd 成员 ID。
-
更新你的负载均衡器或 VIP 配置,以便不再将流量转发到 master02。
-
作为最后一步,从集群中删除 master02 的节点对象:
kubectl delete node master02
现在,master02 节点已从 Kubernetes 集群中移除。
将本地镜像推送私有仓库
从新打标签
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.0 192.168.200.50/google_containers/kube-apiserver:v1.26.0docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.0 192.168.200.50/google_containers/kube-controller-manager:v1.26.0docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.26.0 192.168.200.50/google_containers/kube-proxy:v1.26.0docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.0 192.168.200.50/google_containers/kube-scheduler:v1.26.0docker tag registry.aliyuncs.com/google_containers/etcd:3.5.6-0 192.168.200.50/google_containers/etcd:3.5.6-0docker tag registry.aliyuncs.com/google_containers/pause:3.9 192.168.200.50/google_containers/pause:3.9docker tag registry.aliyuncs.com/google_containers/coredns:v1.9.3 192.168.200.50/google_containers/coredns:v1.9.3
推送
docker push 192.168.200.50/google_containers/kube-apiserver:v1.26.0docker push 192.168.200.50/google_containers/kube-controller-manager:v1.26.0docker push 192.168.200.50/google_containers/kube-proxy:v1.26.0docker push 192.168.200.50/google_containers/kube-scheduler:v1.26.0docker push 192.168.200.50/google_containers/etcd:3.5.6-0docker push 192.168.200.50/google_containers/pause:3.9docker push 192.168.200.50/google_containers/coredns:v1.9.3
查看node详细信息
kubectl get pods --all-namespaces -o wide
检查 Kubernetes 集群中的事件
kubectl get events --namespace=kube-system
查看pod其中容器的日志
kubectl logs calico-node-rlvwm -n kube-system
查看 k8s calico的yaml配置
kubectl get pods --all-namespaces -l k8s-app=calico-node -o yaml
相关文章:
CentOS 7.8 kubeadm安装 k8s 1.26
CentOS 7.8 kubeadm安装 k8s 1.26 规划 集群 主机名IP地址k8s-master01192.168.200.101k8s-master02192.168.200.102k8s-master03192.168.200.103k8s-node01192.168.200.201k8s-node02192.168.200.202 VIP(虚拟IP) 192.168.200.80 Harbor http://192.168.200.50 基础 …...

成都瀚网科技有限公司抖音小店:创新营销引领电商潮流
在当今数字化时代,抖音作为一款备受欢迎的短视频平台,不仅吸引了大量用户的关注,还为众多电商企业提供了新的销售渠道。成都瀚网科技有限公司抖音小店便是其中之一,凭借其独特的营销策略和优质的产品,成为了抖音电商领…...

警惕!又2本期刊被“On Hold”!
【SciencePub学术】 此前,继一本SSCI期刊被取消“On hold”标识后,仍处于“On Hold”状态的期刊有6本,其中包括4本SCI期刊和2本ESCI期刊。近日,经小编查询,又新增2本“On Hold”期刊,详情如下:…...

一台服务器成了哆啦A梦的神奇口袋
如果我有一台服务器,那简直就像打开了哆啦A梦的神奇口袋!可以做的事情可太多啦,比如: 学习和探险 首先嘛,当然是用来学习和探险啦!我可以安装和配置各种操作系统、编程语言和工具,深入了解计…...
java 关闭access文件资源后,无法删除文件
复现问题 // 数据库驱动String DRIVER_CLASS "net.ucanaccess.jdbc.UcanaccessDriver";// 数据库连接地址String DB_URL "jdbc:ucanaccess://D/test.mdb";String DB_USER ""; // 数据库用户名称String DB_PASSWORD "";// 数据库用…...

Typecho 添加 Emoji 表情报错「解决方案」
Typecho 添加 Emoji 表情报错 文章目录 Typecho 添加 Emoji 表情报错前言Emoji 表情utf8mb4 与 UTF8 解决方案[1] 数据库编码更改[2] 数据库配置文件更改 前言 Typecho 添加 Emoji 表情不支持,报错 Database Query Error Emoji 表情 Emoji 就是表情符号,…...

【C#】委托与事件
目录 一、委托 1.什么是委托 2.委托类型的声明与初始化 3.委托类型引用方法的调用 4.使用委托类型作为方法的参数 5.Action委托 6.Func委托 7.通用类型冒泡排序 8.多播委托 二、Lambda表达式 1.匿名方法 2.Lambda表达式表示匿名方法 三、事件 1.什么是事件 2.事件…...

化工园区数字孪生可视化管控平台,赋予园区安全环保智慧发展
化工行业作为国民经济的支柱和工业发展的引擎,对安全生产、环保节能、应急管控有着很高的要求。目前国内外化工园区面临安全和环保两大压力。为有效解决这两大难题,巨蟹数科综合运用物联网、数字孪生等新一代信息技术,建设了数字孪生园区智慧…...
Laplacian算子详解及例程
Laplacian算子是一种常用的边缘检测算法,它是通过对图像进行二阶微分来检测图像的边缘。Laplacian算子的优点是能够对不同方向的边缘进行检测,对于边缘的粗细和强度变化也比较敏感。 Laplacian算子的计算公式为: ∇f ∂f/∂x ∂f/∂y其中…...

《数据结构与算法》学习指导手册
我觉得,对于初学者来说,先把最简单、最基础、最重要的知识点掌握好,再去研究难度较高、更加高级的知识点,这样由易到难、循序渐进的学习路径,无疑是最合理的。 这里有每个知识点的难易程度、需要你掌握到什么程度、具…...

ubuntu安装配置mantis
目录 前言安装Apache2安装PHP安装数据库mariadbmariadb安装MariaDB重置密码为MantisBT创建数据库和用户 phpmyadmin安装和配置安装phpmyadmin查看安装内容配置phpmyadmin1.phpmyadmin apache配置文件2.为phpmyadmin创建数据库和用户3.修改配置文件config-db.php4.重新运行 管理…...
node后端接收pdf接口
当从前端发送过来的数据是文件时,后端如何接收呢? const express require(express); const multer require(multer);const app express();// 设置文件存储路径和文件名 const storage multer.diskStorage({destination: (req, file, cb) > {cb(nu…...
[RPC] Motan快速开始
文章目录 一、概述二、功能三、XML配置使用1、同步调用1.1、pom中添加依赖1.2、为调用方和服务方创建公共接口。1.3、编写业务接口逻辑、创建并启动RPC Server。1.4、创建并执行RPC Client。 2、异步调用2.1、在接口类上加MotanAsync注解2.2、在client端配置motan_client.xml时…...

仿美团外卖微信小程序源码/美团外卖优惠券领劵小程序-自带流量主模式
源码简介: 仿美团外卖微信小程序源码,它是美团外卖优惠券领劵小程序,还自带流量主模式。可以领取外卖优惠券的小程序。实用方便。 美团优惠券小程序带举牌小人带菜谱流量主模式,挺多外卖小程序的,但是都没有搭建教程…...

【Python】Windows跟随程序启动和关闭系统代理
前言 在日常使用计算机时,偶尔可能需要配置代理来访问特定的网络资源或进行网络调试。 当在使用mitmproxy 时候, 程序开始前,需要手动打开系统代理;程序解释后,需要手动关闭系统代理。 这些重复性且没有技术含量工作…...

信钰证券:华为汽车概念股持续活跃 圣龙股份斩获12连板
近期,华为轿车概念股在A股商场遭到热捧,多只股票迭创前史新高。10月23日,华为轿车概念股再度走强,到收盘,板块内圣龙股份、银宝山新涨停,轿车ETF在重仓股提振下盘中一度上涨近2%。业界人士认为,…...

LSM Tree 深度解析
我们将深入探讨日志结构合并树,也称为LSM Tree:这是许多高度可扩展的NoSQL分布式键值型数据库的基础数据结构,例如Amazon的DynamoDB、Cassandra和ScyllaDB。这些数据库的设计被认为支持比传统关系数据库更高的写入速率。我们将看到LSM Tree如…...

BurpSuite安装
下载 BurpSuite 下载 Java17 下载后确定版本 java -version获取启动器 密钥生成器 破解 将下载的 BurpSuite、启动器、密钥生成器,放入同一个目录 打开 CMD 进入该目录 启动密钥生成器 java -jar burp-keygen-scz.jar开启新的CMD,进入该目录 启动…...

VB.NET 三层登录系统实战:从设计到部署全流程详解
目录 前言: 什么是三层 为什么要用到三层: 饭店→软件 理解: 过程: 1.三层包图: 2.数据库 3.三层项目 4.用户界面 5.添加引用 代码实现: Entity层 BLL层 DAL层 UI层 总结: 前言: 什么是三层 三层就是把各个功能模块划分为表示层&#…...
【前端性能】性能优化手段-高频面试题
持续更新.............................最近更新2023/10/24 1. 讲一下png8、png16、png32的区别,并简单讲讲 png 的压缩原理 PNG8、PNG16、PNG32 是 PNG 图像格式的不同变种,它们主要区别在于颜色深度和透明度支持的不同。 区别 PNG8: PN…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...