当前位置: 首页 > news >正文

RKE安装k8s及部署高可用rancher之证书私有证书但是内置的ssl不放到外置的LB中 4层负载均衡

先决条件#

  • Kubernetes 集群 参考RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客
  • CLI 工具
  • Ingress Controller(仅适用于托管 Kubernetes)

创建集群k8s

[root@nginx locale]# cat rancher-cluster.yml
nodes:- address: 192.168.1.65internal_address: 192.168.1.65user: wuborole: [controlplane, worker, etcd]ssh_key_path: /home/wubo/.ssh/id_rsaport: 22services:etcd:extra_args:auto-compaction-retention: 240 #(单位小时)quota-backend-bytes: '6442450944'backup_config:enabled: true         # 设置true启用ETCD自动备份,设置false禁用;interval_hours: 12    # 快照创建间隔时间,不加此参数,默认5分钟;retention: 6          # etcd备份保留份数;snapshot: truecreation: 6hretention: 24hingress:provider: nginx
#  options:
#    use-forwarded-headers: "true"
#  #hostnetwork: truecluster_name: local
ignore_docker_version: true
prefix_path: /opt/rke
#kubernetes_version: v1.13.5-rancher1-2 #rke 0.2.2 https://github.com/rancher/rke/releases/tag/v1.1.0
#kubernetes_version: v1.17.4-rancher1-3 #rke 1.1.0
kubernetes_version: v1.20.10-rancher1-1 #rke 1.2.12network:plugin: calicomtu: 0options:flannel_backend_type: vxlanprivate_registries:- url: harbor.jettech.comuser: adminpassword: Harbor12345is_default: true
[root@nginx locale]# rke up --config rancher-cluster.yml

1. 为 Rancher 创建 Namespace

[root@nginx ~]# kubectl create namespace cattle-system
namespace/cattle-syste created
[root@nginx ~]# kubectl get ns
NAME              STATUS   AGE
cattle-syste      Active   2s
default           Active   4m1s
ingress-nginx     Active   3m4s
kube-node-lease   Active   4m3s
kube-public       Active   4m3s
kube-system       Active   4m3s

2 选择你的 SSL 选项#

Rancher Server 默认需要 SSL/TLS 配置来保证访问的安全性

提示

如果你想在外部终止 SSL/TLS,请参考:RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客。

你可以从以下三种证书来源中选择一种,证书将用来在 Rancher Server 中终止 TLS:

  • Rancher 生成的 TLS 证书: 在这种情况下,你需要在集群中安装 cert-manager。 Rancher 利用 cert-manager 签发并维护证书。Rancher 将生成自己的 CA 证书,并使用该 CA 签署证书。然后 cert-manager 负责管理该证书。
  • Let's Encrypt: Let's Encrypt 选项也需要使用 cert-manager。但是,在这种情况下,cert-manager 与 Let's Encrypt 的特殊颁发者相结合,该颁发者执行获取 Let's Encrypt 颁发的证书所需的所有操作(包括请求和验证)。此配置使用 HTTP 验证(HTTP-01),因此负载均衡器必须具有可以从公网访问的公共 DNS 记录。
  • 使用你已有的证书: 此选项使你可以使用自己的权威 CA 颁发的证书或自签名 CA 证书。 Rancher 将使用该证书来保护 WebSocket 和 HTTPS 流量。在这种情况下,你必须上传名称分别为tls.crttls.key的 PEM 格式的证书以及相关的密钥。如果使用私有 CA,则还必须上传该 CA 证书。这是由于你的节点可能不信任此私有 CA。 Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将使用该校验和来验证其与 Rancher 的连接。
设置Chart 选项描述是否需要 cert-manager
Rancher 生成的证书(默认)ingress.tls.source=rancher使用 Rancher 生成的 CA 签发的自签名证书此项为默认选项
Let’s Encryptingress.tls.source=letsEncrypt使用Let's Encrypt颁发的证书
你已有的证书ingress.tls.source=secret使用你的自己的证书(Kubernetes 密文)
重要

Rancher 中国技术支持团队建议你使用“你已有的证书” ingress.tls.source=secret 这种方式,从而减少对 cert-manager 的运维成本。

3 根据你选择的 SSL 选项,通过 Helm 安装 Rancher

注意: 可以使用 CSDN来快速生成符合 rancher 要求的自签名证书

在此选项中,将使用你自己的证书来创建 Kubernetes secret,以供 Rancher 使用。

运行这个命令时,hostname 选项必须与服务器证书中的 Common Name 或 Subject Alternative Names 条目匹配,否则 Ingress controller 将无法正确配置。

尽管技术上仅需要Subject Alternative Names中有一个条目,但是拥有一个匹配的 Common Name 可以最大程度的提高与旧版浏览器/应用程序的兼容性。

3.1 如何查看服务器证书的Common Name 和 Subject Alternative Names 技术问题 | Rancher文档

如何检查我的证书链是有效的

[root@nginx ok]# openssl verify -CAfile cacerts.pem jetto.jettech.com.crt
jetto.jettech.com.crt: OK

上述命令执行后,如何您收到unable to get local issuer certificate的错误,则证书链是不完整的。这通常意味着您的服务器证书中含有中间 CA 证书。如果您拥有该中间证书,可以采用下述的方法验证。 

[root@nginx ok]# openssl verify -CAfile cacerts.pem -untrusted intermediate.pem jetto.jettech.com.crt

如何您仍然遇到验证验证错误,您可以通过以下命令获取服务器证书的颁布者和主题 

[root@nginx ok]# openssl x509 -noout -subject -issuer -in jetto.jettech.com.crt 
subject= /C=CN/CN=jetto.jettech.com
issuer= /C=CN/CN=localhost

查看Common Name

[root@nginx ok]# openssl x509 -noout -subject -in  tls.crt
subject= /C=CN/CN=jetto.jettech.com

查看Subject Alternative Names

[root@nginx ok]# openssl x509 -noout -in tls.crt -text | grep DNSDNS:jetto.jettech.com, DNS:jetto.jettech.com, IP Address:172.16.10.21, IP Address:192.168.1.65, IP Address:172.16.10.59, IP Address:172.16.10.33

技术问题 | Rancher文档

  • 如上所述,为你的证书设置适当的hostname
  • replicas设置为 Rancher 部署所使用的复制数量。默认为 3;如果你的集群中少于 3 个节点,你应填写实际节点数量。
  • 设置ingress.tls.sourcesecret
  • 要安装一个特定的 Rancher 版本,使用--version 标志,例如:--version 2.5.8
  • 如果你安装的是 alpha 版本,Helm 要求在命令中加入--devel选项。
3.2 添加 TLS Secret(千万不要遗漏该步):现在已经部署了 Rancher,还需参考添加 TLS Secret发布证书文件,以便 Rancher 和 ingress 控制器可以使用它们

 注意: 可以使用 一键生成 ssl 自签名证书脚本 来快速生成符合 rancher 要求的自签名证书。该脚本会自动生成本文中所需要的 tls.crttls.key 和 cacerts.pem

只有当我们在 cattle-system 命名空间,将自签名证书和对应密钥配置到 tls-rancher-ingress 的密文中,Kubernetes 才会为 Rancher 创建所有的对象和服务。

将服务器证书和任何所需的中间证书合并到名为 tls.crt 的文件中,将您的证书密钥拷贝到名称为 tls.key 的文件中。

 例如,acme.sh在fullchain.cer文件中提供了服务器证书和中间证书。在这种情况下,您应该将fullchain.cer文件重命名为tls.crt,将证书秘钥文件重命名为tls.key 。

使用 kubectl 创建 tls 类型的密文。

[root@nginx ok]# ls
cacerts.pem  cakey.pem                   jetto.jettech.com.crt  jetto.jettech.com.key  tls.crt
cacerts.srl  create_self-signed-cert.sh  jetto.jettech.com.csr  openssl.cnf            tls.key
[root@nginx ok]# kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key
secret/tls-rancher-ingres created[root@nginx ok]# kubectl -n cattle-system get secret 
NAME                  TYPE                                  DATA   AGE
default-token-9wc8v   kubernetes.io/service-account-token   3      22s
tls-rancher-ingres    kubernetes.io/tls                     2      13s
[root@nginx ok]# kubectl -n cattle-system describe secret  tls-rancher-ingres
Name:         tls-rancher-ingres
Namespace:    cattle-system
Labels:       <none>
Annotations:  <none>Type:  kubernetes.io/tlsData
====
tls.crt:  2343 bytes
tls.key:  1675 bytes

RKE部署Rancher v2.5.8 HA高可用集群 以及常见错误解决_rkecontrolplane was already initialized but no etc-CSDN博客

提示: 如果您想要更换证书,您可以使用 kubectl -n cattle-system delete secret tls-rancher-ingress 来删除 tls-rancher-ingress 密文,之后使用上面的命令创建一个新的密文。如果您使用的是私有 CA 签发的证书,仅当新证书与当前证书是由同一个 CA 签发的,才可以替换。

3.3 使用私有 CA 签发证书

如果您使用的是私有 CA,Rancher 需要您提供 CA 证书的副本,用来校验 Rancher Agent 与 Server 的连接。

拷贝 CA 证书到名为 cacerts.pem 的文件,使用 kubectl 命令在 cattle-system 命名空间中创建名为 tls-ca 的密文。

[root@nginx ok]# kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cacerts.pem
secret/tls-ca created

注意: Rancher 在启动时检索tls-ca密文。如果您的 Rancher Server 正在运行中,您需要重新启动 Rancher Server Pod 才能使新的 CA 生效。

 4 helm安装rancher集群

[root@nginx ok]# helm install  rancher rancher-stable/rancher --namespace cattle-system --set hostname=jetto.jettech.com --set bootstrapPassword=123456aA --set rancherImage=harbor.jettech.com/rancher/rancher --set rancherImageTag=v2.5.8 --set ingress.tls.source=secret  --set replicas=3 --set privateCA=true --set systemDefaultRegistry=harbor.jettech.com --set useBundledSystemChart=true

如果您使用的是由私有 CA 签名的证书,则在 --set ingress.tls.source=secret 之后添加 --set privateCA=true

查看: 

[root@nginx ~]# kubectl -n cattle-system rollout status deploy/rancher
Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...
Waiting for deployment "rancher" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment spec update to be observed...
Waiting for deployment "rancher" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "rancher" rollout to finish: 2 of 3 updated replicas are available...
deployment "rancher" successfully rolled out[root@nginx ok]# kubectl  get all -A
NAMESPACE                 NAME                                          READY   STATUS      RESTARTS   AGE
cattle-system             pod/helm-operation-5lqb9                      0/2     Completed   0          28s
cattle-system             pod/helm-operation-9rqd2                      0/2     Completed   0          47s
cattle-system             pod/helm-operation-jm52w                      0/2     Completed   0          35s
cattle-system             pod/helm-operation-rqcnc                      0/2     Completed   0          21s
cattle-system             pod/helm-operation-z52w5                      0/2     Completed   0          41s
cattle-system             pod/helm-operation-zvbjs                      0/2     Completed   0          61s
cattle-system             pod/rancher-65f6b5bbf6-bm2j2                  1/1     Running     0          107s
cattle-system             pod/rancher-65f6b5bbf6-bstsh                  1/1     Running     0          107s
cattle-system             pod/rancher-65f6b5bbf6-rh4bk                  1/1     Running     0          107s
cattle-system             pod/rancher-webhook-85f777cb65-275wx          1/1     Running     0          25s
fleet-system              pod/fleet-agent-7cc65df565-hctpv              1/1     Running     0          23s
fleet-system              pod/fleet-controller-54dd95c75b-22xfr         1/1     Running     0          54s
fleet-system              pod/gitjob-86ccc9ddc9-h4mch                   1/1     Running     0          54s
ingress-nginx             pod/default-http-backend-565f86f5f9-8wwdg     1/1     Running     0          24m
ingress-nginx             pod/nginx-ingress-controller-22vg8            1/1     Running     0          24m
ingress-nginx             pod/nginx-ingress-controller-gnt2z            1/1     Running     0          24m
ingress-nginx             pod/nginx-ingress-controller-plzrm            1/1     Running     0          24m
kube-system               pod/calico-kube-controllers-b486cd75d-dnp4h   1/1     Running     1          24m
kube-system               pod/calico-node-lz9tv                         1/1     Running     0          24m
kube-system               pod/calico-node-nlhfl                         1/1     Running     0          24m
kube-system               pod/calico-node-pks26                         1/1     Running     0          24m
kube-system               pod/coredns-56fdbbcdfc-tkw4m                  1/1     Running     0          24m
kube-system               pod/coredns-56fdbbcdfc-vjt27                  1/1     Running     0          24m
kube-system               pod/coredns-autoscaler-5c64bb75c8-4rp8f       1/1     Running     0          24m
kube-system               pod/metrics-server-6b697547fc-tmcjf           1/1     Running     0          24m
kube-system               pod/rke-coredns-addon-deploy-job-9qjtz        0/1     Completed   0          24m
kube-system               pod/rke-ingress-controller-deploy-job-bm7qt   0/1     Completed   0          24m
kube-system               pod/rke-metrics-addon-deploy-job-bm8kd        0/1     Completed   0          24m
kube-system               pod/rke-network-plugin-deploy-job-dm4kd       0/1     Completed   0          24m
rancher-operator-system   pod/rancher-operator-cccbf7f8-fgsm5           1/1     Running     0          32sNAMESPACE       NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
cattle-system   service/rancher                ClusterIP   10.43.153.193   <none>        80/TCP,443/TCP           107s
cattle-system   service/rancher-webhook        ClusterIP   10.43.137.105   <none>        443/TCP                  25s
default         service/kubernetes             ClusterIP   10.43.0.1       <none>        443/TCP                  25m
fleet-system    service/gitjob                 ClusterIP   10.43.43.108    <none>        80/TCP                   54s
ingress-nginx   service/default-http-backend   ClusterIP   10.43.246.34    <none>        80/TCP                   24m
kube-system     service/kube-dns               ClusterIP   10.43.0.10      <none>        53/UDP,53/TCP,9153/TCP   <invalid>
kube-system     service/metrics-server         ClusterIP   10.43.187.147   <none>        443/TCP                  24mNAMESPACE       NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
ingress-nginx   daemonset.apps/nginx-ingress-controller   3         3         3       3            3           <none>                   24m
kube-system     daemonset.apps/calico-node                3         3         3       3            3           kubernetes.io/os=linux   24mNAMESPACE                 NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
cattle-system             deployment.apps/rancher                   3/3     3            3           107s
cattle-system             deployment.apps/rancher-webhook           1/1     1            1           25s
fleet-system              deployment.apps/fleet-agent               1/1     1            1           32s
fleet-system              deployment.apps/fleet-controller          1/1     1            1           54s
fleet-system              deployment.apps/gitjob                    1/1     1            1           54s
ingress-nginx             deployment.apps/default-http-backend      1/1     1            1           24m
kube-system               deployment.apps/calico-kube-controllers   1/1     1            1           24m
kube-system               deployment.apps/coredns                   2/2     2            2           <invalid>
kube-system               deployment.apps/coredns-autoscaler        1/1     1            1           <invalid>
kube-system               deployment.apps/metrics-server            1/1     1            1           24m
rancher-operator-system   deployment.apps/rancher-operator          1/1     1            1           32sNAMESPACE                 NAME                                                DESIRED   CURRENT   READY   AGE
cattle-system             replicaset.apps/rancher-65f6b5bbf6                  3         3         3       107s
cattle-system             replicaset.apps/rancher-webhook-85f777cb65          1         1         1       25s
fleet-system              replicaset.apps/fleet-agent-7cc65df565              1         1         1       23s
fleet-system              replicaset.apps/fleet-agent-c46d75d6d               0         0         0       32s
fleet-system              replicaset.apps/fleet-controller-54dd95c75b         1         1         1       54s
fleet-system              replicaset.apps/gitjob-86ccc9ddc9                   1         1         1       54s
ingress-nginx             replicaset.apps/default-http-backend-565f86f5f9     1         1         1       24m
kube-system               replicaset.apps/calico-kube-controllers-b486cd75d   1         1         1       24m
kube-system               replicaset.apps/coredns-56fdbbcdfc                  2         2         2       24m
kube-system               replicaset.apps/coredns-autoscaler-5c64bb75c8       1         1         1       24m
kube-system               replicaset.apps/metrics-server-6b697547fc           1         1         1       24m
rancher-operator-system   replicaset.apps/rancher-operator-cccbf7f8           1         1         1       32sNAMESPACE     NAME                                          COMPLETIONS   DURATION   AGE
kube-system   job.batch/rke-coredns-addon-deploy-job        1/1           1s         24m
kube-system   job.batch/rke-ingress-controller-deploy-job   1/1           2s         24m
kube-system   job.batch/rke-metrics-addon-deploy-job        1/1           2s         24m
kube-system   job.batch/rke-network-plugin-deploy-job       1/1           8s         24m

1. 配置基础设施和私有镜像仓库 | Rancher文档

5 配置 NGINX 负载均衡

我们将使用 NGINX 作为L4层负载均衡器(TCP),它将请求轮训转发到后端的 Rancher server 节点。在此配置中,负载均衡器位于 Rancher server 节点的前面。负载均衡器可以是任何能够运行 NGINX 的主机。我们不建议使用任意一个 Rancher server 节点作为负载均衡器节点,因为默认配置下每个 K8S 节点都会运行 ingress 控制器,而 ingress 控制器以为host网络模式运行,并默认监听了80443端口,所以默认情况下会出现端口冲突。如果一定要将 NGINX 安装在 Rancher server 某个节点上,那么可以编辑 ingress 控制器配置文件,在args中添加参数,端口根据实际情况修改 --http-port=8880 --http-port=8443。 ingress 控制器修改默认端口后,nginx 配置中代理的后端 server 端口也需要一并修改。

说明:在这些示例中,负载均衡器将被配置为将流量定向到三个 Rancher Server 节点。如果将 Rancher 安装在 RKE Kubernetes 集群上,则需要三个节点。如果将 Rancher 安装在 K3s Kubernetes 集群上,则仅需要两个节点。

5.1 安装 NGINX#

首先在负载均衡器主机上安装 NGINX,NGINX 具有适用于所有已知操作系统的软件包。我们测试了1.141.15版本。有关安装 NGINX 的帮助,请参阅安装文档。

stream模块是必需的,在 NGINX 官方安装包中包含了这个模块。请参阅您的操作系统文档来了解如何在操作系统上安装和启用 NGINX stream模块。

创建 NGINX 配置#

安装 NGINX 之后,您需要使用节点的 IP 地址更新 NGINX 配置文件nginx.conf

NGINX 配置示例

  1. 将下面的配置示例复制并粘贴到您喜欢的文本编辑器中,保存为nginx.conf

  2. 在 nginx.conf 配置中,用之前准备的节点的 IP 替换 <IP_NODE_1><IP_NODE_2><IP_NODE_3>

    注意: 有关所有配置选项,请参见NGINX 文档:TCP 和 UDP 负载均衡。

[root@nginx nginx]# cat nginx.conf
worker_processes 4;
worker_rlimit_nofile 40000;
events {worker_connections 8192;
}
stream {upstream rancher_servers_http {least_conn;server 192.168.1.65:80 max_fails=3 fail_timeout=5s;server 172.16.10.59:80 max_fails=3 fail_timeout=5s;server 172.16.10.33:80 max_fails=3 fail_timeout=5s;}server {listen 80;proxy_pass rancher_servers_http;}upstream rancher_servers_https {least_conn;server 192.168.1.65:443 max_fails=3 fail_timeout=5s;server 172.16.10.59:443 max_fails=3 fail_timeout=5s;server 172.16.10.33:443 max_fails=3 fail_timeout=5s;}server {listen     443;proxy_pass rancher_servers_https;}
}

 将 NGINX 作为 Docker 容器运行

[root@nginx nginx]# docker run --name wubo --privileged=true --restart=unless-stopped -p 80:80 -p 443:443 -it -v /home/wubo/rancher/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /etc/localtime:/etc/localtime  -d harbor.jettech.com/jettechtools/nginx:1.21.4

效果图:

为了达到最佳性能和安全性,我们建议你为 Rancher Management Server 创建一个专用(local)的 Kubernetes 集群。不建议在此集群上运行用户工作负载。部署 Rancher 后,你可以创建或导入集群来运行你的工作负载。

下图介绍了用户如何通过 Rancher 的认证代理管理 Rancher 启动的 Kubernetes 集群和托管的 Kubernetes 集群:

通过 Rancher 的认证代理管理 Kubernetes 集群

你可以把 Rancher 安装到单个节点或高可用 Kubernetes 集群上。

在生产环境中,建议安装到高可用 Kubernetes 集群。

Rancher 的 Docker 安装仅推荐用于开发和测试环境中。Rancher 版本决定了能否将 Rancher 迁移到高可用集群。

Rancher backup operator 可将 Rancher 从单个 Docker 容器迁移到高可用 Kubernetes 集群上。详情请参见把 Rancher 迁移到新集群。

不管 Rancher Server 是如何安装的,它都应该运行在与其管理的下游集群不同节点上。如果 Rancher 安装在高可用的 Kubernetes 集群上,它需要运行在与其管理的集群不同的集群上。

、架构推荐 | Rancher

架构推荐

如果你准备在单个节点上安装 Rancher,我们推荐你分开部署 Rancher 与下游集群。

分开部署 Rancher 与下游集群​

下游集群,是运行你自己的应用和服务的下游 Kubernetes 集群。

如果你通过 Docker 安装了 Rancher,运行 Rancher Server 的节点应该与你的下游集群分开。

如果你需要使用 Rancher 管理下游 Kubernetes 集群,那么运行 Rancher Server 的 Kubernetes 集群也应该与下游集群分开。

为什么高可用(HA)更适合生产环境中的 Rancher​

我们建议在高可用 Kubernetes 集群上安装 Rancher Server,以保护 Rancher Server 的数据。在高可用安装中,负载均衡器充当客户端的单点入口,并在集群中的多台服务器之间分配网络流量,这有助于防止任何一台服务器成为单点故障。

我们不建议在单个 Docker 容器中安装 Rancher,因为如果该节点发生故障,则其他节点上将没有可用的集群数据副本,并且你可能会丢失 Rancher Server 上的数据。

K3s Kubernetes 集群安装​

底层 Kubernetes 集群的一种选择是使用 K3s Kubernetes。K3s 是 Rancher CNCF 认证的 Kubernetes 发行版。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。K3s 的另一个优点是允许外部 Datastore 保存集群数据,因此可以把 K3s 服务器节点视为无状态。

运行 Rancher Management Server 的 K3s Kubernetes 集群的架构

RKE Kubernetes 集群安装​

在 RKE 安装中,集群数据在集群中的三个 etcd 节点上复制,以在某个节点发生故障时提供冗余和进行数据复制。

运行 Rancher Management Server 的 RKE Kubernetes 集群的架构

Kubernetes 安装的负载均衡器推荐配置​

我们建议你为负载均衡器和 Ingress Controller 使用以下配置:

  • 把 Rancher 的 DNS 解析到四层负载均衡器上。
  • 负载均衡器应该把 TCP/80 端口和 TCP/443 端口的流量转发到 Kubernetes 集群的全部 3 个节点上。
  • Ingress Controller 会把 HTTP 重定向到 HTTPS,在 TCP/443 端口终结 SSL/TLS。
  • Ingress Controller 会把流量转发到 Rancher deployment 的 Pod 上的 TCP/80 端口。

在 Kubernetes 集群中安装 Rancher,并使用四层负载均衡器,SSL 终止在 Ingress Controller 中

Kubernetes 安装环境​

我们强烈建议你把 Rancher 安装到托管在云提供商(如 AWS EC2 和 Google Compute Engine(GCE)等)上的 Kubernetes 集群上。

为了达到最佳性能和安全性,我们建议你为 Rancher Management Server 创建一个专用的 Kubernetes 集群。不建议在此集群上运行用户工作负载。部署 Rancher 后,你可以创建或导入集群来运行你的工作负载。

Kubernetes 安装的推荐节点角色​

如果 Rancher 安装在 K3s Kubernetes 或 RKE Kubernetes 集群上,以下建议适用。

K3s 集群角色​

在 K3s 集群中有两种类型的节点,分别是 Server 节点和 Agent 节点。你可以把工作负载调度到 Server 节点和 Agent 节点上。Server 节点运行 Kubernetes master。

对于运行 Rancher Management Server 的集群,我们建议使用两个 server 节点。不需要 Agent 节点。

RKE 集群角色​

如果 Rancher 安装在 RKE Kubernetes 集群上,该集群应具有三个节点,并且每个节点都应具有所有三个 Kubernetes 角色,分别是 etcd,controlplane 和 worker。

Rancher Server 和下游 Kubernetes 集群的 RKE 集群架构对比​

我们对 Rancher Server 集群上 RKE 节点角色建议,与对运行你的应用和服务的下游集群的建议相反。

在配置下游 Kubernetes 集群时,Rancher 使用 RKE 作为创建下游 Kubernetes 集群的工具。注意:Rancher 将在未来的版本中添加配置下游 K3s 集群的功能。

我们建议下游 Kubernetes 集群中的每个节点都只分配一个角色,以确保稳定性和可扩展性。

RKE 每个角色至少需要一个节点,但并不强制每个节点只能有一个角色。但是,我们建议为运行应用的集群中的每个节点,使用单独的角色,以保证在服务拓展时,worker 节点上的工作负载不影响 Kubernetes master 或集群的数据。

以下是我们对下游集群的最低配置建议:

  • 三个仅使用 etcd 角色的节点 ,以在三个节点中其中一个发生故障时,仍能保障集群的高可用性。
  • 两个只有 controlplane 角色的节点 ,以保证 master 组件的高可用性。
  • 一个或多个只有 worker 角色的节点,用于运行 Kubernetes 节点组件,以及你部署的服务或应用的工作负载。

在设置 Rancher Server 时,在三个节点上使用全部这三个角色也是安全的,因为:

  • 它允许一个 etcd 节点故障。
  • 它通过多个 controlplane 节点来维护 master 组件的多个实例。
  • 此集群上没有创建除 Rancher 之外的其他工作负载。

由于 Rancher Server 集群中没有部署其他工作负载,因此在大多数情况下,这个集群都不需要使用我们出于可扩展性和可用性的考虑,而为下游集群推荐的架构。

有关下游集群的最佳实践,请查看生产环境清单或最佳实践。

授权集群端点架构​

如果你使用授权集群端点(ACE),我们建议你创建一个指向负载均衡器的 FQDN,这个负载均衡器把流量转到所有角色为 controlplane 的节点。

如果你在负载均衡器上使用了私有 CA 签发的证书,你需要提供 CA 证书,这个证书会包含在生成的 kubeconfig 文件中,以校验证书链。详情请参见 kubeconfig 文件和 API 密钥的相关文档。

在 Rancher 2.6.3 中,注册的 RKE2 和 K3s 集群可以使用 ACE 支持。点击这里了解在下游集群中开启 ACE 的步骤。

添加下游k8s集群

与下游集群通信 | Rancher

本节介绍 Rancher 如何配置和管理运行应用和服务的下游集群。

下图显示了 Cluster Controller、Cluster Agent 和 Node Agent 让 Rancher 控制下游集群的。

以下描述对应于上图中的数字:

  1. 认证代理
  2. Cluster Controller 和 Cluster Agent
  3. Node Agents
  4. 授权集群端点

1. 认证代理​

在此图中,名为 Bob 的用户希望查看在名为 User Cluster 1 的下游集群上运行的所有 Pod。在 Rancher 中,他可以运行 kubectl 命令来查看 Pod。Bob 通过 Rancher 的认证代理进行身份验证。

认证代理将所有 Kubernetes API 调用转发到下游集群。它集成了本地身份验证、Active Directory 和 GitHub 等身份验证方式。在每个 Kubernetes API 调用请求时,认证代理会验证请求方的身份,并在转发给 Kubernetes master 节点之前,设置正确的 Kubernetes 消息头。

Rancher 使用 ServiceAccount 与 Kubernetes 集群通信,该 ServiceAccount 为在 Pod 中运行的进程提供身份。

默认情况下,Rancher 生成一个 kubeconfig 文件,文件包含凭证信息,用于为 Rancher Server 连接下游集群的 Kubernetes API Server 的代理。kubeconfig 文件 (kube_config_rancher-cluster.yml) 包含对集群的完全访问权限。

2. Cluster Controller 和 Cluster Agent​

每个下游集群都有一个 Cluster Agent,用于打开与 Rancher Server 中对应的 Cluster Controller 之间的通道。

每个下游集群有一个 Cluster Controller 和一个 Cluster Agent。每个 Cluster Controller 都能:

  • 检测下游集群中的资源变化
  • 将下游集群的当前状态变更到目标状态
  • 配置集群和项目的访问控制策略
  • 通过调用所需的 Docker Machine 驱动和 Kubernetes 引擎(例如 RKE 和 GKE)来配置集群

默认情况下,Cluster Controller 连接到 Cluster Agent,Rancher 才能与下游集群通信。如果 Cluster Agent 不可用,Cluster Controller 可以连接到 Node Agent。

Cluster Agent,也叫做 cattle-cluster-agent,是运行在下游集群中的组件。它具有以下功能:

  • 连接 Rancher 启动的 Kubernetes 集群中的 Kubernetes API。
  • 管理集群内的工作负载,pod 创建和部署。
  • 根据每个集群的全局策略,应用定义的角色和绑定。
  • 通过与 Cluster Controller 之间的通道,实现集群和 Rancher Server 之间的通信,包括事件,统计数据,节点信息和健康状况。

3. Node Agents​

如果 Cluster Agent(也称为 cattle-cluster-agent)不可用,其中一个 Node Agent 会创建一个连接到 Cluster Controller 的通道与 Rancher 通信。

cattle-node-agent 使用 DaemonSet 资源进行部署,以确保它能在 Rancher 启动的 Kubernetes 集群中的每个节点上运行,用于在执行集群操作时与节点交互。集群操作的包括升级 Kubernetes 版本,创建或恢复 etcd 快照等。

4. 授权集群端点​

授权集群端点(ACE)可连接到下游集群的 Kubernetes API Server,而不用通过 Rancher 认证代理调度请求。

授权集群端点仅适用于 Rancher 启动的 Kubernetes 集群,即只适用于 Rancher 使用 RKE 来配置的集群。它不适用于导入的集群,也不适用于托管在 Kubernetes 提供商中的集群(例如 Amazon 的 EKS)。

授权集群端点的主要用途:

  • 在 Rancher 不可用时访问下游集群
  • 在 Rancher Server 和与下游集群之间相距甚远时降低延迟

kube-api-auth 微服务为授权集群端点提供用户验证功能。当使用 kubectl访问下游集群时,集群的 Kubernetes API Server 使用 kube-api-auth 服务作为 webhook 对用户进行身份验证。

与授权集群端点一样,kube-api-auth 的身份验证功能也仅适用于 Rancher 启动的 Kubernetes 集群。

示例场景: 假设 Rancher Server 位于美国,User Cluster 1 与用户 Alice 均位于澳大利亚。Alice 可以使用 Rancher UI 操作 User Cluster 1 中的资源,但她的请求必须从澳大利亚发送到美国的 Rancher Server,然后通过代理返回澳大利亚,即下游集群所在的位置。地理距离可能导致明显延迟,因此,Alice 可以使用授权集群端点来降低延迟。

为下游集群启用授权集群端点后,Rancher 会在 kubeconfig 文件中额外生成一段 Kubernetes 上下文,用于直连到集群。该文件具有 kubectl 和 helm的凭证。

如果 Rancher 出现问题,你需要使用此 kubeconfig 文件中定义的上下文来访问集群。因此,我们建议你导出 kubeconfig 文件,以便在 Rancher 出现问题时,仍能使用文件中的凭证访问集群。详情请参见使用 kubectl 和 kubeconfig 文件访问集群的章节。

配置 Kubernetes 集群的工具​

Rancher 使用什么工具配置下游集群,取决于集群的类型。

Rancher 为托管在云提供商中的节点启动 Kubernetes​

Rancher 可以动态启动云上(如 Amazon EC2、DigitalOcean、Azure 或 vSphere 等)的节点,然后在节点上安装 Kubernetes。

Rancher 使用 RKE 和 docker-machine 来配置这类型的集群。

Rancher 为自定义节点启动 Kubernetes​

在配置此类集群时,Rancher 会在现有节点上安装 Kubernetes,从而创建自定义集群。

Rancher 使用 RKE 来启动此类集群。

托管的 Kubernetes 提供商​

配置此类集群时,Kubernetes 由云提供商安装,如 GKE、ECS 或 AKS 等。

Rancher 使用 kontainer-engine 配置此类型的集群。

导入的 Kubernetes 集群​

这种情况下,Rancher 需要连接到一个设置好的 Kubernetes 集群。因此,Rancher 不提供 Kubernetes,只设置 Rancher Agent 实现与集群通信。

两种方式:

第一种:在rancher界面手动添加,这种简单不在阐述

第二种:rke方式然后导入

[root@nginx jettech]# cat jettech-cluster.yml 
nodes:- address: 172.16.10.59internal_address: 172.16.10.59user: wuborole: [controlplane, worker, etcd]ssh_key_path: /home/wubo/.ssh/id_rsaport: 22#- address: 172.16.10.33#  internal_address: 172.16.10.33#  user: wubo#  role: [etcd]#  ssh_key_path: /home/wubo/.ssh/id_rsa#  port: 22services:etcd:extra_args:auto-compaction-retention: 240 #(单位小时)quota-backend-bytes: '6442450944'backup_config:enabled: true         # 设置true启用ETCD自动备份,设置false禁用;interval_hours: 12    # 快照创建间隔时间,不加此参数,默认5分钟;retention: 6          # etcd备份保留份数;snapshot: truecreation: 6hretention: 24hingress:provider: nginxoptions:use-forwarded-headers: "true"#hostnetwork: truecluster_name: jettech
ignore_docker_version: true
prefix_path: /opt/rke
#kubernetes_version: v1.13.5-rancher1-2 #rke 0.2.2 https://github.com/rancher/rke/releases/tag/v1.1.0
#kubernetes_version: v1.17.4-rancher1-3 #rke 1.1.0
kubernetes_version: v1.20.10-rancher1-1 #rke 1.2.12network:plugin: calicomtu: 0options:flannel_backend_type: vxlanprivate_registries:- url: harbor.jettech.comuser: adminpassword: Harbor12345is_default: true

1.创建集群 

[root@nginx jettech]# rke up  --config jettech-cluster.yml

2.在rancher中导入集群,此时有证书问题

[root@k8s-node02 ~]# kubectl -n cattle-system get  all
NAME                                        READY   STATUS             RESTARTS   AGE
pod/cattle-cluster-agent-59996f9ff5-rkmnq   0/1     CrashLoopBackOff   5          5m3s
pod/cattle-cluster-agent-849d4d4f76-xmx6q   0/1     CrashLoopBackOff   5          5m3sNAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cattle-cluster-agent   0/1     1            0           23mNAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/cattle-cluster-agent-59996f9ff5   1         1         0       7m17s
replicaset.apps/cattle-cluster-agent-849d4d4f76   1         1         0       23m
[root@k8s-node02 ~]# kubectl logs  -n cattle-system  -f  pod/cattle-cluster-agent-59996f9ff5-rkmnqtime="2024-01-04T07:58:27Z" level=info msg="PublicKeyAlgorithm: RSA"
time="2024-01-04T07:58:27Z" level=error msg="Issuer of last certificate found in chain (CN=Kubernetes Ingress Controller Fake Certificate,O=Acme Co) does not match with CA certificate Issuer (CN=jetto.jettech.com,C=CN). Please check if the configured server certificate contains all needed intermediate certificates and make sure they are in the correct order (server certificate first, intermediates after)"
time="2024-01-04T07:58:27Z" level=fatal msg="Server certificate is not valid, please check if the host has the correct time configured and if the server certificate has a notAfter date and time in the future. Certificate information is displayed above. error: Get \"https://jetto.jettech.com\": x509: certificate has expired or is not yet valid: current time 2024-01-04T07:58:27Z is before 2024-01-04T14:39:27Z"

解决方案:

1)把在nginx节点上面的证书也就是jetto.jettech.com这个域名的证书copy到下游k8s集群上面。如果找不到上游的证书可以用下面方法找到证书

# 导出K8s访问密钥
echo $(kubectl config view --raw -oyaml | grep client-cert  |cut -d ' ' -f 6) |base64 -d > /tmp/jetto.jettech.com.crt
echo $(kubectl config view --raw -oyaml | grep client-key-data  |cut -d ' ' -f 6 ) |base64 -d > /tmp/jetto.jettech.com.key
echo $(kubectl config view --raw -oyaml | grep certificate-authority-data  |cut -d ' ' -f 6  ) |base64 -d > /tmp/cacerts.pem 

2)然后通过curl加证书形式导入集群

[root@k8s-node02 ok]# curl --cert $(pwd)/jetto.jettech.com.crt --key $(pwd)/jetto.jettech.com.key --cacert $(pwd)/cacerts.pem -sfL https://jetto.jettech.com/v3/import/sgn895dmg2zq7qgnr95h67wwk7p2dpf6knb428hk99f4cgt9tc64bn_c-k8nqc.yaml | kubectl apply -f -

效果图 

下游服务 

[root@k8s-node02 ok]# kubectl get all -A
NAMESPACE       NAME                                          READY   STATUS      RESTARTS   AGE
cattle-system   pod/cattle-cluster-agent-844fd7d6-l979m       1/1     Running     0          6m16s
fleet-system    pod/fleet-agent-7cc65df565-c5j2m              1/1     Running     0          5m53s
ingress-nginx   pod/default-http-backend-565f86f5f9-njjbx     1/1     Running     0          4h27m
ingress-nginx   pod/nginx-ingress-controller-5pz4v            1/1     Running     0          4h27m
kube-system     pod/calico-kube-controllers-b486cd75d-6pxpl   1/1     Running     0          4h27m
kube-system     pod/calico-node-5rhxg                         1/1     Running     0          4h27m
kube-system     pod/coredns-56fdbbcdfc-jpsnc                  1/1     Running     0          4h27m
kube-system     pod/coredns-autoscaler-5c64bb75c8-hqsgn       1/1     Running     0          4h27m
kube-system     pod/metrics-server-6b697547fc-k974b           1/1     Running     0          4h27m
kube-system     pod/rke-coredns-addon-deploy-job-jc899        0/1     Completed   0          4h27m
kube-system     pod/rke-ingress-controller-deploy-job-8rrh6   0/1     Completed   0          4h27m
kube-system     pod/rke-metrics-addon-deploy-job-qn7vm        0/1     Completed   0          4h27m
kube-system     pod/rke-network-plugin-deploy-job-7f5gj       0/1     Completed   0          4h28mNAMESPACE       NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
default         service/kubernetes             ClusterIP   10.43.0.1      <none>        443/TCP                  4h28m
ingress-nginx   service/default-http-backend   ClusterIP   10.43.28.42    <none>        80/TCP                   4h27m
kube-system     service/kube-dns               ClusterIP   10.43.0.10     <none>        53/UDP,53/TCP,9153/TCP   4h27m
kube-system     service/metrics-server         ClusterIP   10.43.226.15   <none>        443/TCP                  4h27mNAMESPACE       NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
ingress-nginx   daemonset.apps/nginx-ingress-controller   1         1         1       1            1           <none>                   4h27m
kube-system     daemonset.apps/calico-node                1         1         1       1            1           kubernetes.io/os=linux   4h27mNAMESPACE       NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
cattle-system   deployment.apps/cattle-cluster-agent      1/1     1            1           6m32s
fleet-system    deployment.apps/fleet-agent               1/1     1            1           6m1s
ingress-nginx   deployment.apps/default-http-backend      1/1     1            1           4h27m
kube-system     deployment.apps/calico-kube-controllers   1/1     1            1           4h27m
kube-system     deployment.apps/coredns                   1/1     1            1           4h27m
kube-system     deployment.apps/coredns-autoscaler        1/1     1            1           4h27m
kube-system     deployment.apps/metrics-server            1/1     1            1           4h27mNAMESPACE       NAME                                                DESIRED   CURRENT   READY   AGE
cattle-system   replicaset.apps/cattle-cluster-agent-5c84b86698     0         0         0       6m32s
cattle-system   replicaset.apps/cattle-cluster-agent-844fd7d6       1         1         1       6m16s
fleet-system    replicaset.apps/fleet-agent-7cc65df565              1         1         1       5m53s
fleet-system    replicaset.apps/fleet-agent-f9d88479                0         0         0       6m1s
ingress-nginx   replicaset.apps/default-http-backend-565f86f5f9     1         1         1       4h27m
kube-system     replicaset.apps/calico-kube-controllers-b486cd75d   1         1         1       4h27m
kube-system     replicaset.apps/coredns-56fdbbcdfc                  1         1         1       4h27m
kube-system     replicaset.apps/coredns-autoscaler-5c64bb75c8       1         1         1       4h27m
kube-system     replicaset.apps/metrics-server-6b697547fc           1         1         1       4h27mNAMESPACE     NAME                                          COMPLETIONS   DURATION   AGE
kube-system   job.batch/rke-coredns-addon-deploy-job        1/1           2s         4h27m
kube-system   job.batch/rke-ingress-controller-deploy-job   1/1           7s         4h27m
kube-system   job.batch/rke-metrics-addon-deploy-job        1/1           1s         4h27m
kube-system   job.batch/rke-network-plugin-deploy-job       1/1           9s         4h28m

相关文章:

RKE安装k8s及部署高可用rancher之证书私有证书但是内置的ssl不放到外置的LB中 4层负载均衡

先决条件# Kubernetes 集群 参考RKE安装k8s及部署高可用rancher之证书在外面的LB&#xff08;nginx中&#xff09;-CSDN博客CLI 工具Ingress Controller&#xff08;仅适用于托管 Kubernetes&#xff09; 创建集群k8s [rootnginx locale]# cat rancher-cluster.yml nodes:- …...

使用爬虫爬取热门电影

文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下&#xff0c;一个网页里想要显示出一个视频资源&#xff0c;必须有一个<video>标签&#xff0c; <video src"xxx.mp4"&…...

【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果

文章目录 前言开始完结 前言 添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果&#xff0c;在本文中&#xff0c;将实现如何使用一些简单的代码实现武器摇摆和摆动效果&#xff0c;这比设置动画来尝试实现类…...

C语言基础知识(6):UDP网络编程

UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下&#xff0c;虽然可以确保发送消息的大小&#xff0c;却不能保证消息一定会到达。因此&#xff0c;应用有时会根据自己的需要进行重发处理。 1.UDP协议的主要特点&#xff1a; &#xf…...

12月笔记

#pragma once 防止多次引用头文件&#xff0c;保证同一个&#xff08;物理意义上&#xff09;文件被多次包含&#xff0c;内容相同的两个文件同样会被包含。 头文件.h与无.h的文件&#xff1a; iostream是C的头文件&#xff0c;iostream.h是C的头文件&#xff0c;即标准的C头文…...

三、C语言中的分支与循环—for循环 (6)

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结构的…...

tolist()读取Excel列数据,(Excel列数据去重后,重新保存到新的Excel里)

从Excel列数据去重后&#xff0c;重新保存到新的Excel里 import pandas as pd# 读取Excel文件 file r"D:\\pythonXangmu\\quchong\\quchong.xlsx" # 使用原始字符串以避免转义字符 df pd.read_excel(file, sheet_namenameSheet)# 删除重复值 df2 df.drop_duplica…...

ChatGPT大升级,文档图像识别领域迎来技术革新

​写在前面ChatGPT迎来重大升级冲击与机遇并存​大模型时代的思考与探索■ 像素级OCR统一模型- UPOCR■ OCR大一统模型- SPTS v3■ 文档识别分析LLM应用 写在最后问卷抽奖 ​写在前面 2023 年 12 月 31 日第十九届中国图象图形学学会青年科学家会议在广州召开&#xff0c;该会…...

2023年全国职业院校技能大赛软件测试—测试报告模板参考文档

ERP(资源协同)管理平台测试报告 目录 ERP(资源协同)管理平台测试报告 1. 概述...

【BCC动态跟踪PostgreSQL】

BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪、网络监控工具。其源码存放于GitCode - 开发者的代码家园 想要监控PostgreSQL数据库的相关SQL需要在编译PostgreSQL的时候开启dtrace。下文主要介绍几个和PostgreSQL相关的工具,其他工具可根据需求自行了解。 …...

汽车架构解析:python cantools库快速解析arxml

文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 四、总结 前言 曾经有拿cantools来解析过dbc&#xff0c;用得比较浅&#xff0c;不知道可以用来解析arxml。最近有个需求…...

Vue 之 修饰符汇总

一、简介 在Vue中&#xff0c;修饰符是一种特殊的语法&#xff0c;用于修改指令或事件绑定的行为&#xff0c;它们以点号&#xff08;.&#xff09;的形式添加到指令或事件的后面&#xff0c;并可以改变其默认行为或添加额外的功能&#xff0c;如&#xff1a;禁止事件冒泡、数…...

如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…...

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道&#xff0c;app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦&#xff0c;动不动就是用appium写代码脚本维护什么的&#xff0c;不仅步骤繁琐&#xff0c;环境配置方面也是繁琐无比&#xff0c;动不动就与客户…...

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…...

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”

macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…...

[C#]使用OpenCvSharp实现二维码图像增强超分辨率

【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 借助于opencv自带sr.prototxt和sr.caffemodel实现对二维码图像增强 【效果展示】 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin…...

优化|流形优化系列(一)

简介 流形优化是非线性优化的一个分支&#xff0c;它主要关注在特定的几何结构下进行优化。在流形优化中&#xff0c;优化问题通常是在黎曼流形上进行的&#xff0c;而非欧几里得空间。黎曼流形是带有黎曼度量的流形&#xff0c;该度量为流形上的每个点都定义了一个内积。这种…...

torch.where()函数

在深度学习的实现中&#xff0c;处理条件逻辑是一项常见而重要的任务。PyTorch 提供了一个强大的函数 torch.where()&#xff0c;它使得基于条件的张量操作变得既简单又高效。本文将深入探讨 torch.where() 的用法&#xff0c;并通过示例展示它在不同场景中的应用。 什么是 to…...

盖子的c++小课堂——第二十三讲:背包问题

前言 又是一次漫长的更新&#xff08;我真不是故意的aaaaaaaaaaaaaaa&#xff09;&#xff0c;先不多说了&#xff0c;直接给我~坐下~说错了说错了&#xff0c;直接开始~ 背包问题----动态规划 背包问题&#xff08;knapsack problem&#xff09; 动态规划&#xff08;dyna…...

k8s安装hostPath方式存储的PostgreSQL15

1.配置 PostgreSQL 的 ConfigMap cat > postgres-configmap.yaml << EOF apiVersion: v1 kind: ConfigMap metadata:name: postgres-configlabels:app: postgresnamespace: dev data:POSTGRES_DB: postgresdbPOSTGRES_USER: postgresadminPOSTGRES_PASSWORD: admin12…...

51单片机之按键和数码管

51单片机之按键和数码管 ✍前言&#xff1a;♐独立按键&#x1f600;独立按键的原理&#x1f600;软件实现按键控制LED灯的亮灭 ♐数码管&#x1f60a;数码管显示数字或者字母的原理&#x1f409;共阳极数码管&#x1f409;共阴极极数码管&#x1f409;4位1体数码管 &#x1f6…...

【Oracle】 - 数据库的实例、表空间、用户、表之间关系

Oracle是一种广泛使用的关系型数据库管理系统&#xff0c;它具有高性能、高可靠性、高安全性等特点。1Oracle数据库的结构和组成是一个复杂而又有趣的话题&#xff0c;本文将介绍Oracle数据库的四个基本概念&#xff1a;数据库、实例、表空间和用户&#xff0c;以及它们之间的关…...

ssm基于HTML5的交流论坛的设计与实现+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…...

JDBC*

*JDBC数据库连接步骤 1.将JDBC驱动的jar添加到项目的依赖中。 2.加载JDBC驱动 例如&#xff1a; Class.forName("com.mysql.jdbc.Driver"); 3.连接数据库 例如&#xff1a; Connection con DriverManager.getConnection(URL,us…...

Zookeeper注册中心实战

Java学习手册面试指南&#xff1a;https://javaxiaobear.cn Spring Cloud Zookeeper通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供Apache Zookeeper集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用…...

1-02VS的安装与测试

一、概述 对于一名C语言程序员而言&#xff0c;进行C语言程序的开发一般需要一个文本编辑器加上一个编译器就足够了。但为了方便起见&#xff0c;我们选择使用集成开发环境——Visual Studio&#xff08;简称VS&#xff09;。安装Visual Studio 下面讲一下如何安装VS&#xff0…...

ctfshow——PHP特性

文章目录 web 89web 90web 91web 92web 93web 94web 95web 96web 97web 98web 99web 100——优先级、eval()用法web 101——RefelctionClass反射类web 102——php伪协议、hex2bin()web103web 104——sha1绕过web 105 web 89 使用人工分配 ID 键的数值型数组绕过preg_match. 两个…...

K8S陈述式资源管理

陈述式 命令行&#xff1a;kubectl命令行工具 优点&#xff1a;90%以上的场景都可以满足&#xff0c;对增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好 缺点&#xff1a;命令比较冗长&#xff0c;复杂&#xff0c;难记 声明式 k8s当中的yaml文件来实现资…...

详解Python内置函数 !!!

内置函数就是Python给你提供的, 拿来直接用的函数&#xff0c;比如print&#xff0c;input等。 文章目录 前言 一、和数字相关 1. 数据类型 2. 进制转换 3. 数学运算 二、和数据结构相关 1. 序列 2. 数据集合 3. 相关内置函数 三、和数据结构相关 四、和迭代器生成器相关 五、字…...

wordpress模板站如何安装/微博推广平台

做这题主要是为了学习一下tarjan的强连通分量&#xff0c;因为包括桥&#xff0c;双连通分量&#xff0c;强连通分量很多的求法其实都可以源于tarjan的这种方法&#xff0c;通过一个low,pre数组求出来。 题意&#xff1a;给你许多的A->B ,B->C这样的喜欢的关系&#xff0…...

定海网/搜索引擎优化的内部优化

随着人们生活水平的提高&#xff0c;当下越来越注重生活的品质&#xff0c;对护肤的要求也越来越高&#xff01;受明星及网红的影响&#xff0c;似乎每天一片面膜称为护肤的标准&#xff0c;面膜可以称得上是皮肤速效急救产品&#xff0c;敷一片面膜&#xff0c;就可以大大的缓…...

代码如诗 wordpress/百度云搜索引擎入口盘多多

JavaScript学习笔记&#xff08;五&#xff09;——厚积薄发之准备2 目前我先列好提纲&#xff0c;利用每晚和周末的闲暇时间&#xff0c;将逐步写完 ^_^...

wordpress怎么进入后台/怎么看百度关键词的搜索量

XLWT简单描述&#xff1a; xlwt为python第三方模块&#xff0c;用来写excel 安装&#xff1a;pip install xlwt 使用&#xff1a;在py模块中 import xlwtpip list查询电脑中已安装的模块 EXCLE写入步骤简述&#xff1a; 1.创建工作簿wb2.创建工作表sheet3.填充工作表shee…...

有什么做分销的几个网站/sem推广是什么意思

RDKit | 分子所具有的自由基电子数、价电子数 from rdkit.Chem import Descriptors re Descriptors.NumRadicalElectrons(smiles)#分子所具有的自由基电子数 ve Descriptors.NumValenceElectrons(smiles)#分子的价电子数...

哪种技术做网站容易论文答辩/如何优化seo技巧

原神手游中&#xff0c;黑人抬棺是一个非常适合整蛊时弹奏的曲子&#xff0c;想想四个人一同演奏黑人抬棺就非常刺激&#xff0c;那么黑人抬棺的简谱要怎么弹呢?今日光耀菌就分享这个曲谱&#xff0c;快来了解一番吧!阅读推荐&#xff1a;琴谱大全原神黑人抬棺简谱分享1、键盘…...