Kubernets多master集群構建負載均衡

前言

在構建 Kubernetes 多 Master 集群時,實現負載均衡是至關重要的一環。通過多臺 Master 節點配合使用 Nginx 和 Keepalived 等工具,可以有效提高集群的可靠性和穩定性,確保系統能夠高效運行并有效應對故障。接下來將介紹如何配置這些組件。

接上篇:二進制部署Kubernetes集群——單Master和Node組件-CSDN博客

目錄

一、環境配置

1. 集群節點配置

2. 操作系統初始化配置

二、部署 master02 節點

1.?拷貝證書文件、master 組件

2.?修改配置文件 kube-apiserver 中的 IP

3.?啟動各服務并設置開機自啟

4.?查看 node 節點狀態

三、部署負載均衡

1.?配置 nginx 的官方 yum 源

2. 安裝 nginx,修改配置文件

2.1 yum 安裝

2.2 配置反向代理負載均衡

2.3?啟動 nginx 服務

3.?部署 keepalived 服務

3.1 yum 安裝

3.2?修改配置文件

3.3?創建 nginx 狀態檢查腳本

3.4?啟動 keepalived 服務

4.?修改 node 節點配置文件

4.1 修改 bootstrap.kubeconfig 和 kubelet.kubeconfig 配置

4.2?重啟 kubelet 和 kube-proxy 服務

5. 查看節點連接狀態

6.?測試創建 pod

6.1 部署容器

6.2 查看 Pod 的狀態信息

7. 訪問頁面

8. 查看日志?

四、部署 Dashboard

1.?Dashboard 簡介

2. 上傳生成鏡像包?

2.1 分別在 node01、node02 節點生成鏡像

3.?上傳 recommended.yaml 文件

4.?創建 service account 并綁定默認 cluster-admin 管理員集群角色

5.?使用輸出的 token 登錄 Dashboard

五、錯誤示例?

1. 錯誤狀態

2. 錯誤原因

2.1 查看 ?kubelet 服務日志

2.2 檢查 keepalived 服務 vip


一、環境配置

1. 集群節點配置

機器內存有限,按需自行分配:

節點名稱IP部署組件配置
k8s集群master01192.168.190.100kube-apiserver? kube-controller-manager? kube-scheduler2C/3G
k8s集群master02192.168.190.101kube-apiserver? kube-controller-manager? kube-scheduler2C/2G
k8s集群node01192.168.190.102kubelet? kube-proxy? docker2C/2G
k8s集群node02192.168.190.103kubelet? kube-proxy? docker2C/2G
etcd集群etcd01192.168.190.100etcd
etcd集群etcd02192.168.190.102etcd
etcd集群etcd03192.168.190.103etcd

負載均衡nkmaster

192.168.190.104nginx+keepalive011C/1G
負載均衡nkbackup192.168.190.105nginx+keepalive021C/1G

2. 操作系統初始化配置

新增節點設備做一下配置:

①?關閉防火墻及其他規則

所有節點操作:
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 清空iptables防火墻的規則,包括過濾規則、NAT規則、Mangle規則以及自定義鏈
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

②?關閉 swap

所有節點操作:
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab 
# 在/etc/fstab文件中找到包含swap的行,并在這些行之前加上#,從而注釋掉這些行

③ 在 master01、master02?添加 hosts

cat >> /etc/hosts << EOF
192.168.190.100 master01
192.168.190.101 master02
192.168.190.102 node01
192.168.190.103 node02
EOF

④ 調整內核參數

所有節點操作:
cat > /etc/sysctl.d/k8s.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
EOFsysctl --system
# 重新加載內核參數設置

⑤ 時間同步

所有機器均需要同步:
yum install ntpdate -y
ntpdate time.windows.com

二、部署 master02 節點

1.?拷貝證書文件、master 組件

從 master01 節點上拷貝證書文件、各master組件的配置文件和服務管理文件到 master02 節點

[root@master01 ~]# scp -r /opt/etcd/ root@master02:/opt/
[root@master01 ~]# scp -r /opt/kubernetes/ root@master02:/opt/
[root@master01 ~]# scp -r /root/.kube root@master02:/root/
[root@master01 ~]# scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@master02:/usr/lib/systemd/system/

2.?修改配置文件 kube-apiserver 中的 IP

[root@master02 ~]# vim /opt/kubernetes/cfg/kube-apiserver
--etcd-servers=https://192.168.190.100:2379,https://192.168.190.102:2379,https://192.168.190.103:2379 \
--bind-address=192.168.190.101 \       # 修改為 master02 ip
--secure-port=6443 \
--advertise-address=192.168.190.101 \  # 修改為 master02 ip

3.?啟動各服務并設置開機自啟

[root@master02 ~]# systemctl enable --now kube-apiserver.service
[root@master02 ~]# systemctl status kube-apiserver.service Active: active (running) since 三 2024-05-15 17:09:29 CST; 19s ago[root@master02 ~]# systemctl enable --now kube-controller-manager.service
[root@master02 ~]# systemctl status kube-controller-manager.serviceActive: active (running) since 三 2024-05-15 17:10:56 CST; 9s ago[root@master02 ~]# systemctl enable --now kube-scheduler.service
[root@master02 ~]# systemctl status kube-scheduler.serviceActive: active (running) since 三 2024-05-15 17:12:12 CST; 8s ago

4.?查看 node 節點狀態

[root@master02 ~]# ln -s /opt/kubernetes/bin/* /usr/local/bin/
[root@master02 ~]# kubectl get nodes
# 列出所有集群中的節點,包括節點的名稱和狀態信息
NAME              STATUS   ROLES    AGE    VERSION
192.168.190.102   Ready    <none>   42h    v1.20.11
192.168.190.103   Ready    <none>   178m   v1.20.11
[root@master02 ~]# kubectl get nodes -o wide
# -o=wide:輸出額外信息;對于Pod,將輸出Pod所在的Node名
NAME              STATUS   ROLES    AGE    VERSION    INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
192.168.190.102   Ready    <none>   42h    v1.20.11   192.168.190.102   <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://26.1.2
192.168.190.103   Ready    <none>   178m   v1.20.11   192.168.190.103   <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://26.1.2

此時在 master02 節點查到的 node 節點狀態僅是從 etcd 查詢到的信息,而此時 node 節點實際上并未與 master02 節點建立通信連接,因此需要使用一個 VIP 把 node 節點與 master 節點都關聯起來。

三、部署負載均衡

配置 load balancer 集群雙機熱備負載均衡(nginx 實現負載均衡,keepalived 實現雙機熱備),在 nkmaster、nkbackup 節點上操作。

1.?配置 nginx 的官方 yum 源

cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF

2. 安裝 nginx,修改配置文件

2.1 yum 安裝

yum install nginx -y

2.2 配置反向代理負載均衡

修改 nginx 配置文件,配置四層反向代理負載均衡,指定 k8s 群集兩臺 master 的節點 ip 和 6443 端口。

vim /etc/nginx/nginx.confevents {worker_connections  1024;
}stream {log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log  /var/log/nginx/k8s-access.log  main;upstream k8s-apiserver {server 192.168.190.100:6443;server 192.168.190.101:6443;}server {listen 6443;proxy_pass k8s-apiserver;}
}http {
……

2.3?啟動 nginx 服務

nginx -t
systemctl enable --now nginx.service netstat -natp | grep nginx      # 查看已監聽6443端口
tcp        0      0 0.0.0.0:6443            0.0.0.0:*               LISTEN      2410/nginx: master  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2410/nginx: master

3.?部署 keepalived 服務

3.1 yum 安裝

yum install keepalived -y

3.2?修改配置文件

vim /etc/keepalived/keepalived.conf

3.3?創建 nginx 狀態檢查腳本

vim /etc/nginx/check_nginx.sh#!/bin/bash
#egrep -cv "grep|$$" 用于過濾掉包含grep 或者 $$ 表示的當前Shell進程ID,即腳本運行的當前進程ID號
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];thensystemctl stop keepalived
fichmod +x /etc/nginx/check_nginx.sh

3.4?啟動 keepalived 服務

systemctl enable --now keepalived.service[root@nkmaster ~]# ip ainet 192.168.190.200/24 scope global secondary ens33

4.?修改 node 節點配置文件

修改node節點上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件為VIP

4.1 修改 bootstrap.kubeconfig 和 kubelet.kubeconfig 配置

[root@node01 ~]# cd /opt/kubernetes/cfg/
[root@node01 cfg]# vim bootstrap.kubeconfigserver: https://192.168.190.200:6443
[root@node01 cfg]# vim kubelet.kubeconfigserver: https://192.168.190.200:6443
[root@node01 cfg]# vim kube-proxy.kubeconfigserver: https://192.168.190.200:6443

4.2?重啟 kubelet 和 kube-proxy 服務

systemctl restart kubelet.service 
systemctl restart kube-proxy.service

5. 查看節點連接狀態

在 nkmaster 上查看 nginx 和 node、master 節點的連接狀態

[root@nkmaster ~]# netstat -natp | grep nginx
tcp        0      0 0.0.0.0:6443            0.0.0.0:*               LISTEN      2410/nginx: master  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2410/nginx: master  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44658   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:41016   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:59136   192.168.190.100:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38484   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38472   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44642   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38494   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:41020   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:41014   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44650   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:41012   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44644   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44626   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:41042   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:41018   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:59156   192.168.190.100:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:59122   192.168.190.100:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44652   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:59132   192.168.190.100:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38498   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38502   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.102:44646   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38488   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38480   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.200:6443    192.168.190.103:40996   ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:59144   192.168.190.100:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:59118   192.168.190.100:6443    ESTABLISHED 2411/nginx: worker  
tcp        0      0 192.168.190.104:38514   192.168.190.101:6443    ESTABLISHED 2411/nginx: worker

6.?測試創建 pod

在 master01 節點上操作

6.1 部署容器

[root@master01 ~]# kubectl run nginx --image=nginx
pod/nginx created

6.2 查看 Pod 的狀態信息

[root@master01 ~]# kubectl get pods
NAME    READY   STATUS              RESTARTS   AGE
nginx   0/1     ContainerCreating   0          50s
[root@master01 ~]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          109s# ContainerCreating:正在創建中
# Running:創建完成,運行中[root@master01 ~]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP           NODE              NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          2m26s   10.244.0.4   192.168.190.102   <none>           <none>
# READY為1/1,表示這個Pod中有1個容器

7. 訪問頁面

在對應網段的 node 節點上操作,可以直接使用瀏覽器或者 curl 命令訪問

[root@node01 ~]# curl 10.244.0.4

8. 查看日志?

在master01節點上查看nginx日志

[root@master01 ~]# kubectl logs nginx
10.244.0.1 - - [15/May/2024:10:41:13 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"

四、部署 Dashboard

1.?Dashboard 簡介

儀表板是基于 Web 的 Kubernetes 用戶界面,用于部署、故障排除和管理容器化應用程序和集群資源。通過儀表板,您可以概述應用程序狀態、創建/修改 Kubernetes 資源,執行滾動更新、重啟 Pod 等操作,并獲取資源狀態和錯誤信息。

2. 上傳生成鏡像包?

上傳 dashboard.tar 和 metrics-scraper.tar 至 node 節點 /opt/

2.1 分別在 node01、node02 節點生成鏡像

[root@node01 opt]# docker load -i dashboard.tar 
69e42300d7b5: Loading layer  224.6MB/224.6MB
Loaded image: kubernetesui/dashboard:v2.0.0
[root@node01 opt]# docker load -i metrics-scraper.tar 
57757cd7bb95: Loading layer  238.6kB/238.6kB
14f2e8fb1e35: Loading layer   36.7MB/36.7MB
52b345e4c8e0: Loading layer  2.048kB/2.048kB
Loaded image: kubernetesui/metrics-scraper:v1.0.4
[root@node01 opt]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED       SIZE
nginx                                                             latest    e784f4560448   11 days ago   188MB
quay.io/coreos/flannel                                            v0.14.0   8522d622299c   2 years ago   67.9MB
k8s.gcr.io/coredns                                                1.7.0     bfe3a36ebd25   3 years ago   45.2MB
kubernetesui/dashboard                                            v2.0.0    8b32422733b3   4 years ago   222MB
kubernetesui/metrics-scraper                                      v1.0.4    86262685d9ab   4 years ago   36.9MB
busybox                                                           1.28.4    8c811b4aec35   5 years ago   1.15MB
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64   3.0       99e59f495ffa   8 years ago   747kB

3.?上傳 recommended.yaml 文件

在 master01 節點上操作,上傳 recommended.yaml 文件到 /opt/k8s 目錄中

[root@master01 ~]# cd /opt/k8s/
[root@master01 k8s]# rz -E
rz waiting to receive.
[root@master01 k8s]# vim recommended.yaml
……
spec:ports:- port: 443targetPort: 8443nodePort: 30001  # 添加type: NodePort       # 添加
…… [root@master01 k8s]# kubectl apply -f recommended.yaml

4.?創建 service account 并綁定默認 cluster-admin 管理員集群角色

[root@master01 k8s]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
# 在 kube-system 命名空間下創建了一個名為 dashboard-admin 的服務賬戶
# 主要用于給 Pod 中運行的應用程序提供對 API 服務器的訪問憑證
[root@master01 k8s]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
# 創建了一個集群角色綁定 (ClusterRoleBinding),它將名為 cluster-admin 的集群角色綁定到了之前創建的服務賬戶 dashboard-admin 上,且該服務賬戶位于 kube-system 命名空間
# cluster-admin 是一個非常強大的角色,擁有對整個集群的完全訪問權限。這意味著通過 dashboard-admin 服務賬戶運行的任何 Pod 都將擁有集群管理員權限。
[root@master01 k8s]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
# 列出 kube-system 命名空間下的所有 Secrets,并通過 awk 篩選出與 dashboard-admin 服務賬戶相關的 Secret 名稱(通常服務賬戶會自動生成一個 Secret 來存儲其訪問令牌)
# 根據上一步得到的 Secret 名稱,這個命令用來展示該 Secret 的詳細信息
Name:         dashboard-admin-token-zwbg5
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: dashboard-adminkubernetes.io/service-account.uid: 50dbe025-dcfe-4954-b430-e3fb70393679Type:  kubernetes.io/service-account-tokenData
====
ca.crt:     1359 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlNhajQyX1pHSXBZSm1uOVRDc3ROSWpfWFlPNFRwaDAwT3lpeFljeldYM3cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdGwybW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiN2JiNTc2MmUtNGMyOS00NjhkLTliM2EtYTUwYmU4NWZiNzhmIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.XqOPb-_MU-B3bh-JeYWbDMRGiG0VC5DWhNiZHXZGLy8Zwzt5IbbOCsrQdFg4SMQ4mQSd1bM3zd3X8QxiuhqFUdn8VmW2nABG0M0h8uI9RFZRQePJ4AOnVMXfgyZbqtuHqeDc3T4eX0-ZZvdkV3jc7bbYKf2byzC-pqnm73-XEk13RhNFahGGvt08AmzIUb6v6jiO85weKbrT3M_reKTarBv9SCaqo-fNms5UAfnOyGuPTObFQGqu6Tp21Gy1L4GsmGILM-IGvPRkqSgwc0cpjcFD9sJyG7-esrUvYOM_KPsTQn9G5rYRpYd4Ad40JLsKIBFJ7k72kLYHJV5l-_r0cQ

5.?使用輸出的 token 登錄 Dashboard

https://NodeIP:30001,建議使用360安全瀏覽器或者火狐瀏覽器

五、錯誤示例?

1. 錯誤狀態

[root@master01 ~]# kubectl get node
NAME              STATUS     ROLES    AGE     VERSION
192.168.190.102   NotReady   <none>   2d12h   v1.20.11
192.168.190.103   NotReady   <none>   13h     v1.20.11# kubernetes 集群中有兩個節點處于 NotReady 狀態,無法接受新的 Pod 部署

2. 錯誤原因

2.1 查看 ?kubelet 服務日志

節點 192.168.190.102 的 kubelet 服務無法更新節點狀態,因為無法連接到 192.168.190.200:6443

[root@node01 ~]# journalctl -f -u kubelet.service
-- Logs begin at 一 2024-05-13 10:23:14 CST. --
5月 16 10:53:04 node01 kubelet[59283]: E0516 10:53:04.821047 59283 kubelet_node_status.go:470] Error updating node status, will retry: error getting node "192.168.190.102": Get "https://192.168.190.200:6443/api/v1/nodes/192.168.190.102?timeout=10s": dial tcp 192.168.190.200:6443: connect: no route to host
5月 16 10:53:07 node01 kubelet[59283]: E0516 10:53:07.825185 59283 kubelet_node_status.go:470] Error updating node status, will retry: error getting node "192.168.190.102": Get "https://192.168.190.200:6443/api/v1/nodes/192.168.190.102?timeout=10s": dial tcp 192.168.190.200:6443: connect: no route to host
5月 16 10:53:10 node01 kubelet[59283]: E0516 10:53:10.833419 59283 reflector.go:138] object-"kube-system"/"flannel-token-qsnr6": Failed to watch *v1.Secret: failed to list *v1.Secret: Get "https://192.168.190.200:6443/api/v1/namespaces/kube-system/secrets?fieldSelector=metadata.name%3Dflannel-token-qsnr6&resourceVersion=2727": dial tcp 192.168.190.200:6443: connect: no route to host# journalctl: 是 Systemd 系統日志查詢工具,用于查看和管理 systemd 初始化系統產生的日志。
# -f: 參數表示跟隨模式,即在終端上持續顯示新的日志條目,這對于監視服務的實時運行狀況非常有用。
# -u kubelet.service: 指定查看 kubelet.service 這個 Systemd 單元的服務日志。kubelet 是 Kubernetes 的核心組件之一,負責在每個節點上運行容器,管理 pod 狀態并與 Kubernetes 主控進行通信。

2.2 檢查 keepalived 服務 vip

由于虛擬環境掛起,導致服務無響應,vip 可能會消失。由于配置文件 bootstrap.kubeconfig、kubelet.kubeconfig、kube-proxy.kubeconfig 指向 vip,重啟 keepalived 服務恢復。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13369.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin 編譯器和工具鏈:深入解析與實踐案例

Kotlin 編譯器和工具鏈是構建 Kotlin 項目的核心組件&#xff0c;它們負責將 Kotlin 代碼轉換為可在 JVM 或 JavaScript 環境中運行的代碼。本文將詳細介紹 Kotlin 編譯器和工具鏈的工作原理、使用方法&#xff0c;以及在實際開發中的應用案例。 1. 引言 Kotlin 作為一種現代…

JAVA GUI 植物大戰僵尸

公眾號&#xff1a;編程驛站 沒有做太多封裝。難免有冗余。源碼全部放出&#xff0c;有興趣者可以再改之。 1. pea 類 package com.hm;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExce…

物業水電抄表系統的全面解析

1.系統概述 物業水電抄表系統是現代物業管理中的重要組成部分&#xff0c;它通過自動化的方式&#xff0c;實時監控和記錄居民或企業的水電使用情況&#xff0c;極大地提高了工作效率&#xff0c;降低了人工抄表的錯誤率。該系統通常包括數據采集、數據傳輸、數據分析和數據展…

鏈表OJ題(移除鏈表元素,反轉鏈表,分割鏈表,環形鏈表(是否成環問題),鏈表中間節點(快慢指針講解),環形鏈表(找入環節點))“題目來源力扣附帶題目鏈接”

目錄 1.移除鏈表元素 2.反轉鏈表 2.1三指針法 2.2頭插法 3.分割鏈表 4.鏈表的中間節點&#xff08;快慢指針&#xff09; 4.1快慢指針 4.2求鏈表的中間節點 5.環形鏈表 5.1環形鏈表是否成環 5.2環形鏈表入環節點 5.3入環節點推論的不完備性說明 1.移除鏈表元素 移除…

Microsoft Threat Modeling Tool 使用(三)

Boundary&#xff08;邊界&#xff09; 本文介紹信任邊界&#xff0c;基于 SDL TM Knowledge Base (Core) 模版&#xff0c;這是一個通用的威脅建模模板&#xff0c;非常適合初學者和大多數威脅建模需求。 這些邊界&#xff08;Boundary&#xff09;在微軟威脅建模工具中用于表…

Java多線程與高并發

1、什么是進程?什么是線程? 進程:進程是程序的基本執行實體;另外一種解釋是進程是一個應用程序(1個進程是一個軟件)。 線程:線程是操作系統能夠進行運算調度的最下單位。它被包含在進程之中,是進程中的實際運作單位;是一個進程中的執行場景/執行單元。 注意:。一個進…

uniapp實現列表拖拽排序+滑動刪除功能

此篇代碼在原插件基礎進行了bug修改與滑動功能的新增 原插件地址 HM-dragSorts.vue組件使用 HM-dragSorts.vue <template><view class""><view class"HM-drag-sort" :style"{height: ListHeightrpx,background-color: listBackground…

魔法方法介紹

【一】什么是魔法方法 在類內部達到指定條件會自動觸發的方法 【二】魔法方法 # 【1】__init__ &#xff1a; 實例化類得到對象的時候會自動觸發 class Student(object):def __init__(self):print(f"實例化類的時候觸發") # 實例化類的時候觸發 ? s Student…

在云服務器上運行StyleGAN3生成偽樣本

首先是傳入數據&#xff0c;這里我們不做贅述。 對于數據格式的裁剪&#xff0c;可以通過以下代碼進行&#xff1a; from glob import glob from PIL import Image import os from tqdm import tqdm from tqdm.std import trangeimg_path glob(r"C:\Users\Administrato…

【Oracle篇】rman物理備份工具的基礎理論概述(第一篇,總共八篇)

??博主介紹??&#xff1a; ?又是一天沒白過&#xff0c;我是奈斯&#xff0c;DBA一名? ???擅長Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式數據倉庫)、Linux&#xff0c;也在擴展大數據方向的知識面??? ??????大佬們都喜歡靜靜的看文章&am…

嵌入式是大坑的說法,是否與學生的信息不對稱有關?

在開始前我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「嵌入式的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01; 目前也算是在搞嵌入式&#…

【深度學習】時空圖卷積網絡(STGCN),預測交通流量

論文地址&#xff1a;https://arxiv.org/abs/1709.04875 Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 文章目錄 一、摘要二、數據集介紹美國洛杉磯交通數據集 METR-LA 介紹美國加利福尼亞交通數據集 PEMS-BAY 介紹美國…

Cocktail for Mac 激活版:一站式系統優化與管理神器

Cocktail for Mac是一款專為Mac用戶打造的系統優化與管理工具&#xff0c;憑借其強大的功能和簡便的操作&#xff0c;贏得了廣大用戶的喜愛。這款軟件集系統清理、修復和優化于一身&#xff0c;能夠幫助用戶輕松解決Mac系統中的各種問題&#xff0c;提高系統性能。 Cocktail fo…

Leetcode-有效的括號(帶圖)

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-parentheses/ 題目 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&…

在做題中學習(59):除自身以為數組的乘積

238. 除自身以外數組的乘積 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;前綴積和后綴積 思路&#xff1a;answer中的每一個元素都是除自己以外所有元素的和。那就處理一個前綴積數組和后綴積數組。 而前綴積(f[i])是&#xff1a;[0,i-1]所有元素的乘積 后綴…

如何利用香港多IP服務器實現定制化的網絡服務

如何利用香港多IP服務器實現定制化的網絡服務 在當今數字化快速發展的時代&#xff0c;企業對于網絡服務的需求日益增加&#xff0c;尤其是對于定制化和高度可調整的網絡服務的需求。香港&#xff0c;作為國際金融中心和數據中心的樞紐&#xff0c;提供了優越的網絡基礎設施和…

什么是蜜罐,在當前網絡安全形勢下,蜜罐能提供哪些幫助

在當前的互聯網時代&#xff0c;網絡安全威脅日益嚴峻&#xff0c;攻擊手段層出不窮。為了應對這些威脅&#xff0c;網絡安全專家們不斷探索新的防御手段&#xff0c;在過去的幾年里&#xff0c;一種更加積極主動的網絡安全方法正在興起。蜜罐技術便是這樣一種備受矚目的主動防…

【教學類-55-05】20240516圖層順序挑戰(三格長條紙加黑色邊框、3*3、5張,不重復7186張,9坐標點顏色哈希值去重、保留5色)

背景需求&#xff1a; 前期測試了4*4框格種的8種顏色&#xff0c;隨機抽取7種&#xff0c;隨機排列圖層&#xff0c;去掉相同的圖片、保留7種顏色的圖片&#xff0c;最后獲得5400張樣圖 【教學類-55-04】20240515圖層順序挑戰&#xff08;四格長條紙加黑色邊框、4*4、7張&…

Python程序設計 文件處理(二)

實驗十二 文件處理 第1關&#xff1a;讀取宋詞文件&#xff0c;根據詞人建立多個文件 讀取wjcl/src/step1/宋詞.txt文件&#xff0c; 注意&#xff1a;宋詞文件的標題行的詞牌和作者之間是全角空格&#xff08;" ")可復制該空格 在wjcl/src/step3/cr文件夾下根據每…

【CSND博客紀念】“創作紀念日:從靈感迸發到小有成就——我的CSND博客創作之旅”

&#x1f3a9; 歡迎來到技術探索的奇幻世界&#x1f468;?&#x1f4bb; &#x1f4dc; 個人主頁&#xff1a;一倫明悅-CSDN博客 ?&#x1f3fb; 作者簡介&#xff1a; C軟件開發、Python機器學習愛好者 &#x1f5e3;? 互動與支持&#xff1a;&#x1f4ac;評論 &…