最新资讯

  • k8s 集群部署(二进制方式)

k8s 集群部署(二进制方式)

2025-06-08 15:37:41 2 阅读

k8s 集群部署(二进制方式)

一、前置知识点

1.1 生产环境部署K8s集群的两种方式

  • kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

  • 二进制包

从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

小结:Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

1.2 准备环境

服务器要求:

  • 建议最小硬件配置:2核CPU、2G内存、30G硬盘
  • 服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点

软件环境:

软件版本
操作系统Ubuntu 24.04.1 LTS
容器引擎Docker 26.1.3
KubernetesKubernetes v1.20

服务器整体规划:

角色IP组件
master192.168.1.23kube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,docker,etcd,
nginx,keepalived
master2192.168.1.xkube-apiserver,kube-controller-manager,kube-scheduler,kubelet,kube-proxy,docker,
nginx,keepalived
node1192.168.1.8kubelet,kube-proxy,docker,etcd
master2192.168.1.10kubelet,kube-proxy,docker,etcd
负载均衡器IP192.168.1.x

须知:考虑到有些朋友电脑配置较低,一次性开四台机器会跑不动,所以搭建这套K8s高可用集群分两部分实施,先部署一套单Master架构(3台),再扩容为多Master架构(4台或6台),顺便再熟悉下Master扩容流程。

单Master架构图:

单Master服务器规划:

角色IP组件
master192.168.1.23kube-apiserver,kube-controller-manager,kube-scheduler,etcd
node1192.168.1.8kubelet,kube-proxy,docker,etcd
node2192.168.1.10kubelet,kube-proxy,docker,etcd

1.3 操作系统初始化配置

# 关闭swap

swapoff -a # 临时

sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久

# 根据规划设置主机名

hostnamectl set-hostname <hostname>

# 在master添加hosts

cat >> /etc/hosts << EOF

192.168.1.23 master

192.168.1.8 node1

192.168.1.10 node2

EOF

# 将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system # 生效

二、部署Etcd集群

Etcd 是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部署,这里使用3台组建集群,可容忍1台机器故障,当然,你也可以使用5台组建集群,可容忍2台机器故障。

节点名称IP
etcd-1192.168.1.23
etcd-2192.168.1.8
etcd-3192.168.1.10

注:为了节省机器,这里与K8s节点机器复用。也可以独立于k8s集群之外部署,只要apiserver能连接到就行。

2.1 准备cfssl证书生成工具

cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。

找任意一台服务器操作,这里用Master节点。

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64

mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

2.2 生成Etcd证书

    1. 自签证书颁发机构(CA)

    创建工作目录:

    mkdir -p ~/TLS/{etcd,k8s}
    cd ~/TLS/etcd
    

    自签CA:

    cat > ca-config.json << EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "www": {
            "expiry": "87600h",
            "usages": ["signing", "key encipherment", "server auth", "client auth"]
          }
        }
      }
    }
    EOF
    
    cat > ca-csr.json << EOF
    {
      "CN": "etcd CA",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "Beijing",
          "ST": "Beijing"
        }
      ]
    }
    EOF
    

    生成证书:会生成ca.pem和ca-key.pem文件。

    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    
    1. 使用自签CA签发Etcd HTTPS证书

    创建证书申请文件:

    cat > server-csr.json << EOF
    {
      "CN": "etcd",
      "hosts": [
        "192.168.1.14",
        "192.168.1.23",
        "192.168.1.6",
        "192.168.1.8",
        "192.168.1.10",
        "192.168.1.21",
        "192.168.1.15",
        "192.168.1.13",
        "192.168.1.5"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing"
        }
      ]
    }
    EOF
    

    注:上述文件hosts字段中IP为所有etcd节点的集群内部通信IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。

    生成证书:

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    

    会生成server.pem和server-key.pem文件。

2.3 从Github下载二进制文件

下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz

2.4 部署Etcd集群

以下在节点1上操作,为简化操作,待会将节点1生成的所有文件拷贝到节点2和节点3.

    1. 创建工作目录并解压二进制包
    mkdir /opt/etcd/{bin,cfg,ssl} -p
    tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
    
    mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
    
    1. 创建etcd配置文件
    cat > /opt/etcd/cfg/etcd.conf << EOF
    
    #[Member]
    ETCD_NAME="etcd-1"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.1.23:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.1.23:2379"
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.23:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.23:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.1.23:2380,etcd-2=https://192.168.1.8:2380,etcd-3=https://192.168.31.10:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    EOF
    
    - ETCD_NAME:节点名称,集群中唯一
    - ETCD_DATA_DIR:数据目录
    - ETCD_LISTEN_PEER_URLS:集群通信监听地址
    - ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
    - ETCD_INITIAL_ADVERTISE_PEERURLS:集群通告地址
    - ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址
    - ETCD_INITIAL_CLUSTER:集群节点地址
    - ETCD_INITIALCLUSTER_TOKEN:集群Token
    - ETCD_INITIALCLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群
    
    1. systemd管理etcd
    cat > /usr/lib/systemd/system/etcd.service << EOF
    
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    EnvironmentFile=/opt/etcd/cfg/etcd.conf
    ExecStart=/opt/etcd/bin/etcd 
    - -cert-file=/opt/etcd/ssl/server.pem 
    - -key-file=/opt/etcd/ssl/server-key.pem 
    - -peer-cert-file=/opt/etcd/ssl/server.pem 
    - -peer-key-file=/opt/etcd/ssl/server-key.pem 
    - -trusted-ca-file=/opt/etcd/ssl/ca.pem 
    - -peer-trusted-ca-file=/opt/etcd/ssl/ca.pem 
    - -logger=zap
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
    1. 拷贝刚才生成的证书

    把刚才生成的证书拷贝到配置文件中的路径:

    cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    systemctl start etcd
    systemctl enable etcd
    
    1. 将上面节点1所有生成的文件拷贝到节点2和节点3
    scp -r /opt/etcd/ root@192.168.1.8:/opt/
    scp /usr/lib/systemd/system/etcd.service root@192.168.1.8:/usr/lib/systemd/system/
    scp -r /opt/etcd/ root@192.168.1.10:/opt/
    scp /usr/lib/systemd/system/etcd.service root@192.168.1.10:/usr/lib/systemd/system/
    

    然后在节点2和节点3分别修改etcd.conf配置文件中的节点名称和当前服务器IP:

    vi /opt/etcd/cfg/etcd.conf
    
    #[Member]
    ETCD_NAME="etcd-1"   # 修改此处,节点2改为etcd-2,节点3改为etcd-3
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.1.23:2380"   # 修改此处为当前服务器
    IPETCD_LISTEN_CLIENT_URLS="https://192.168.1.23:2379" # 修改此处为当前服务器IP
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.23:2380" # 修改此处为当前服务器IP
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.23:2379" # 修改此处为当前服务器IP
    ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.1.23:2380,etcd-2=https://192.168.1.8:2380,etcd-3=https://192.168.1.10:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    #最后启动etcd并设置开机启动,同上。
    
    1. 查看集群状态
    ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.1.23:2379,https://192.168.1.8:2379,https://192.168.1.10:2379" endpoint health --write-out=table
    +----------------------------+--------+-------------+-------+
    |          ENDPOINT    | HEALTH |    TOOK     | ERROR |
    +----------------------------+--------+-------------+-------+
    | https://192.168.1.23:2379 |   true | 10.301506ms |    |
    | https://192.168.1.10:2379 |   true | 12.87467ms |     |
    | https://192.168.1.8:2379 |   true | 13.225954ms |    |
    +----------------------------+--------+-------------+-------+
    

    如果输出上面信息,就说明集群部署成功。

    如果有问题第一步先看日志:/var/log/message 或 journalctl -u etcd

三、安装Docker

这里使用Docker作为容器引擎,也可以换成别的,例如containerd

下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz

以下在所有节点操作。这里采用二进制安装,用yum安装也一样。

3.1 解压二进制包

tar zxvf docker-19.03.9.tgz

mv docker/* /usr/bin

3.2 systemd管理docker

cat > /usr/lib/systemd/system/docker.service << EOF

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

EOF

3.3 创建配置文件

mkdir /etc/docker

cat > /etc/docker/daemon.json << EOF

{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}

EOF
  • registry-mirrors 阿里云镜像加速器

3.4 启动并设置开机启动

systemctl daemon-reload
systemctl start docker
systemctl enable docker

四、部署Master Node

4.1 生成kube-apiserver证书

    1. 自签证书颁发机构(CA)
    cd ~/TLS/k8s
    
    cat > ca-config.json << EOF
    
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
    
        "profiles": {
          "kubernetes": {
            "expiry": "87600h",
            "usages": ["signing", "key encipherment", "server auth", "client auth"]
          }
        }
      }
    }
    
    EOF
    
    cat > ca-csr.json << EOF
    {
      "CN": "kubernetes",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "Beijing",
          "ST": "Beijing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    

    生成证书:

    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    

    会生成ca.pem和ca-key.pem文件。

    1. 使用自签CA签发kube-apiserver HTTPS证书

    创建证书申请文件:

    cat > server-csr.json << EOF
    {
      "CN": "kubernetes",
      "hosts": [
        "10.0.0.1",
        "127.0.0.1",
        "192.168.1.14",
        "192.168.1.23",
        "192.168.1.6",
        "192.168.1.8",
        "192.168.1.10",
        "192.168.1.21",
        "192.168.1.15",
        "192.168.1.13",
        "192.168.1.5",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    

    注:上述文件hosts字段中IP为所有Master/LB/VIP IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。

    生成证书:

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
    

    会生成server.pem和server-key.pem文件。

4.2 从Github下载二进制文件

下载地址: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md

注:打开链接你会发现里面有很多包,下载一个server包就够了,包含了Master和Worker Node二进制文件。

4.3 解压二进制包

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
tar zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin
cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin
cp kubectl /usr/bin/

4.4 部署kube-apiserver

    1. 创建配置文件
    cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
    
    KUBE_APISERVER_OPTS="--logtostderr=false 
    --v=2 
    --log-dir=/opt/kubernetes/logs 
    --etcd-servers=https://192.168.1.23:2379,https://192.168.1.8:2379,https://192.168.1.10:2379 
    --bind-address=192.168.1.23 
    --secure-port=6443 
    --advertise-address=192.168.1.23 
    --allow-privileged=true 
    --service-cluster-ip-range=10.0.0.0/24 
    --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction 
    --authorization-mode=RBAC,Node 
    --enable-bootstrap-token-auth=true 
    --token-auth-file=/opt/kubernetes/cfg/token.csv 
    --service-node-port-range=30000-32767 
    --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem 
    --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem 
    --tls-cert-file=/opt/kubernetes/ssl/server.pem 
    --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem 
    --client-ca-file=/opt/kubernetes/ssl/ca.pem 
    --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem 
    --service-account-issuer=api 
    --service-account-signing-key-file=/opt/kubernetes/ssl/server-key.pem 
    --etcd-cafile=/opt/etcd/ssl/ca.pem 
    --etcd-certfile=/opt/etcd/ssl/server.pem 
    --etcd-keyfile=/opt/etcd/ssl/server-key.pem 
    --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem 
    --proxy-client-cert-file=/opt/kubernetes/ssl/server.pem 
    --proxy-client-key-file=/opt/kubernetes/ssl/server-key.pem 
    --requestheader-allowed-names=kubernetes 
    --requestheader-extra-headers-prefix=X-Remote-Extra- 
    --requestheader-group-headers=X-Remote-Group 
    --requestheader-username-headers=X-Remote-User 
    --enable-aggregator-routing=true 
    --audit-log-maxage=30 
    --audit-log-maxbackup=3 
    --audit-log-maxsize=100 
    --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
    
    EOF
    

    注:上面两个 第一个是转义符,第二个是换行符,使用转义符是为了使用EOF保留换行符。

    • -logtostderr:启用日志
    • –v:日志等级
    • -log-dir:日志目录
    • -etcd-servers:etcd集群地址
    • -bind-address:监听地址
    • -secure-port:https安全端口
    • -advertise-address:集群通告地址
    • -allow-privileged:启用授权
    • -service-cluster-ip-range:Service虚拟IP地址段
    • -enable-admission-plugins:准入控制模块
    • -authorization-mode:认证授权,启用RBAC授权和节点自管理
    • -enable-bootstrap-token-auth:启用TLS bootstrap机制
    • -token-auth-file:bootstrap token文件
    • -service-node-port-range:Service nodeport类型默认分配端口范围
    • -kubelet-client-xxx:apiserver访问kubelet客户端证书
    • -tls-xxx-file:apiserver https证书
    • 1.20版本必须加的参数:–service-account-issuer,–service-account-signing-key-file
    • -etcd-xxxfile:连接Etcd集群证书
    • -audit-log-xxx:审计日志
    • 启动聚合层相关配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing
    1. 拷贝刚才生成的证书

    把刚才生成的证书拷贝到配置文件中的路径:

    cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/
    
    1. 启用 TLS Bootstrapping 机制

    TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。

    TLS bootstraping 工作流程:

    创建上述配置文件中token文件:

    cat > /opt/kubernetes/cfg/token.csv << EOF
    
    c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
    
    EOF
    

    格式:token,用户名,UID,用户组

    token也可自行生成替换:

    head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    
    1. systemd管理apiserver
    cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
    
    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
    ExecStart=/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    systemctl start kube-apiserver
    systemctl enable kube-apiserver
    

4.5 部署kube-controller-manager

    1. 创建配置文件
    cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF
    
    KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false 
    --v=2 
    --log-dir=/opt/kubernetes/logs 
    --leader-elect=true 
    --kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig 
    --bind-address=127.0.0.1 
    --allocate-node-cidrs=true 
    --cluster-cidr=10.244.0.0/16 
    --service-cluster-ip-range=10.0.0.0/24 
    --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem 
    --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem 
    --root-ca-file=/opt/kubernetes/ssl/ca.pem 
    --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem 
    --cluster-signing-duration=87600h0m0s"
    
    EOF
    
    • -kubeconfig:连接apiserver配置文件
    • -leader-elect:当该组件启动多个时,自动选举(HA)
    • -cluster-signing-cert-file/–cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致
    1. 生成kubeconfig文件

    生成kube-controller-manager证书:

    切换工作目录

    cd ~/TLS/k8s
    

    创建证书请求文件

    cat > kube-controller-manager-csr.json << EOF
    {
      "CN": "system:kube-controller-manager",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    

    生成证书

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
    

    生成kubeconfig文件(以下是shell命令,直接在终端执行):

    KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
    KUBE_APISERVER="https://192.168.1.23:6443"
    
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/kubernetes/ssl/ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-credentials kube-controller-manager 
    --client-certificate=./kube-controller-manager.pem 
    --client-key=./kube-controller-manager-key.pem 
    --embed-certs=true 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=kube-controller-manager 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    
    1. systemd管理controller-manager
    cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
    
    [Unit]
    Description=Kubernetes Controller Manager
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
    ExecStart=/opt/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    systemctl start kube-controller-manager
    systemctl enable kube-controller-manager
    

4.6 部署kube-scheduler

    1. 创建配置文件
    cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
    
    KUBE_SCHEDULER_OPTS="--logtostderr=false 
    --v=2 
    --log-dir=/opt/kubernetes/logs 
    --leader-elect 
    --kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig 
    --bind-address=127.0.0.1"
    EOF
    
    • -kubeconfig:连接apiserver配置文件
    • -leader-elect:当该组件启动多个时,自动选举(HA)
    1. 生成kubeconfig文件

    生成kube-scheduler证书:

    # 切换工作目录
    cd ~/TLS/k8s
    
    # 创建证书请求文件
    cat > kube-scheduler-csr.json << EOF
    {
      "CN": "system:kube-scheduler",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    # 生成证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
    

    生成kubeconfig文件:

    KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
    KUBE_APISERVER="https://192.168.1.23:6443"
    
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/kubernetes/ssl/ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-credentials kube-scheduler 
    --client-certificate=./kube-scheduler.pem 
    --client-key=./kube-scheduler-key.pem 
    --embed-certs=true 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=kube-scheduler 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    
    1. systemd管理scheduler
    cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
    
    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
    ExecStart=/opt/kubernetes/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    
    systemctl start kube-scheduler
    
    systemctl enable kube-scheduler
    
    1. 查看集群状态

    生成kubectl连接集群的证书:

    cat > admin-csr.json <<EOF
    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
    
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    EOF
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
    

    生成kubeconfig文件:

    mkdir /root/.kube
    
    KUBE_CONFIG="/root/.kube/config"
    KUBE_APISERVER="https://192.168.1.23:6443"
    
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/kubernetes/ssl/ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-credentials cluster-admin 
    --client-certificate=./admin.pem 
    --client-key=./admin-key.pem 
    --embed-certs=true 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=cluster-admin 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    

    通过kubectl工具查看当前集群组件状态:

    kubectl get cs
    
    NAME STATUS MESSAGE ERROR
    scheduler Healthy ok
    controller-manager Healthy ok
    etcd-2 Healthy {"health":"true"}
    etcd-1 Healthy {"health":"true"}
    etcd-0 Healthy {"health":"true"}
    

    如上输出说明Master节点组件运行正常。

    1. 授权kubelet-bootstrap用户允许请求证书
    kubectl create clusterrolebinding kubelet-bootstrap 
    --clusterrole=system:node-bootstrapper 
    --user=kubelet-bootstrap
    

五、部署Worker Node

下面还是在Master Node上操作,即同时作为Worker Node

5.1 创建工作目录并拷贝二进制文件

在所有worker node创建工作目录:

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

从master节点拷贝:

cd kubernetes/server/bin
cp kubelet kube-proxy /opt/kubernetes/bin # 本地拷贝

5.2 部署kubelet

    1. 创建配置文件
    cat > /opt/kubernetes/cfg/kubelet.conf << EOF
    KUBELET_OPTS="--logtostderr=false 
    --v=2 
    --log-dir=/opt/kubernetes/logs 
    --hostname-override=master 
    --network-plugin=cni 
    --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig 
    --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig 
    --config=/opt/kubernetes/cfg/kubelet-config.yml 
    --cert-dir=/opt/kubernetes/ssl 
    --pod-infra-container-image=[registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0](http://registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0)"
    EOF
    
    

    registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0

    • -hostname-override:显示名称,集群中唯一
    • -network-plugin:启用CNI
    • -kubeconfig:空路径,会自动生成,后面用于连接apiserver
    • -bootstrap-kubeconfig:首次启动向apiserver申请证书
    • -config:配置参数文件
    • -cert-dir:kubelet证书生成目录
    • -pod-infra-container-image:管理Pod网络容器的镜像
    1. 配置参数文件
    cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    address: 0.0.0.0
    port: 10250
    readOnlyPort: 10255
    cgroupDriver: systemd
    clusterDNS:
      - 10.0.0.2
    clusterDomain: cluster.local
    failSwapOn: false
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 2m0s
        enabled: true
      x509:
        clientCAFile: /opt/kubernetes/ssl/ca.pem
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 5m0s
        cacheUnauthorizedTTL: 30s
    evictionHard:
      imagefs.available: 15%
      memory.available: 100Mi
      nodefs.available: 10%
      nodefs.inodesFree: 5%
    maxOpenFiles: 1000000
    maxPods: 110
    EOF
    
    1. 生成kubelet初次加入集群引导kubeconfig文件
    KUBE_CONFIG="/opt/kubernetes/cfg/bootstrap.kubeconfig"
    KUBE_APISERVER="https://192.168.1.23:6443" # apiserver IP:PORT
    TOKEN="c47ffb939f5ca36231d9e3121a252940" # 与token.csv里保持一致
    
    # 生成 kubelet bootstrap kubeconfig 配置文件
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/kubernetes/ssl/ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-credentials "kubelet-bootstrap" 
    --token=${TOKEN} 
    --kubeconfig=${KUBE_CONFIG}clear
    
    c'l
    
    kubectl config set-context default 
    --cluster=kubernetes 
    --user="kubelet-bootstrap" 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    
    1. systemd管理kubelet
    cat > /usr/lib/systemd/system/kubelet.service << EOF
    
    [Unit]
    Description=Kubernetes Kubelet
    After=docker.service
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
    ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    systemctl start kubelet
    systemctl enable kubelet
    

5.3 批准kubelet证书申请并加入集群

# 查看kubelet证书请求
kubectl get csr

NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-uCEGPOIiDdlLODKts8J658HrFq9CZ--K6M4G7bjhk8A 6m3s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending

# 批准申请
kubectl certificate approve node-csr-uCEGPOIiDdlLODKts8J658HrFq9CZ--K6M4G7bjhk8A

# 查看节点
kubectl get node

NAME STATUS ROLES AGE VERSION
master NotReady <none> 7s v1.18.3

注:由于网络插件还没有部署,节点会没有准备就绪 NotReady

5.4 部署kube-proxy

    1. 创建配置文件
    cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
    KUBE_PROXY_OPTS="--logtostderr=false 
    --v=2 
    --log-dir=/opt/kubernetes/logs 
    --config=/opt/kubernetes/cfg/kube-proxy-config.yml"
    EOF
    
    1. 配置参数文件
    cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
    kind: KubeProxyConfiguration
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    bindAddress: 0.0.0.0
    metricsBindAddress: 0.0.0.0:10249
    clientConnection:
      kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
    hostnameOverride: master
    clusterCIDR: 10.244.0.0/16
    EOF
    
    1. 生成kube-proxy.kubeconfig文件
    # 切换工作目录
    cd ~/TLS/k8s
    
    # 创建证书请求文件
    cat > kube-proxy-csr.json << EOF
    {
      "CN": "system:kube-proxy",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "L": "BeiJing",
          "ST": "BeiJing",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    EOF
    
    # 生成证书
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
    

    生成kubeconfig文件:

    KUBE_CONFIG="/opt/kubernetes/cfg/kube-proxy.kubeconfig"
    KUBE_APISERVER="https://192.168.1.23:6443"
    
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/kubernetes/ssl/ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-credentials kube-proxy 
    --client-certificate=./kube-proxy.pem 
    --client-key=./kube-proxy-key.pem 
    --embed-certs=true 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=kube-proxy 
    --kubeconfig=${KUBE_CONFIG}
    
    kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
    
    1. systemd管理kube-proxy
    cat > /usr/lib/systemd/system/kube-proxy.service << EOF
    
    [Unit]
    Description=Kubernetes Proxy
    After=network.target
    
    [Service]
    EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
    ExecStart=/opt/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    systemctl start kube-proxy
    systemctl enable kube-proxy
    

5.5 部署网络组件

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

部署Calico:

kubectl apply -f calico.yaml
kubectl get pods -n kube-system

等Calico Pod都Running,节点也会准备就绪:

kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready <none> 37m v1.20.4

5.6 授权apiserver访问kubelet

应用场景:例如kubectl logs

cat > apiserver-to-kubelet-rbac.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kube-apiserver-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics
      - pods/log
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kube-apiserver
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kube-apiserver-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
EOF
kubectl apply -f apiserver-to-kubelet-rbac.yaml

5.7 新增加Worker Node

    1. 拷贝已部署好的Node相关文件到新节点

    在Master节点将Worker Node涉及文件拷贝到新节点192.168.1.8/73

    scp -r /opt/kubernetes root@192.168.1.8:/opt/
    scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.1.8:/usr/lib/systemd/system
    scp /opt/kubernetes/ssl/ca.pem root@192.168.1.8:/opt/kubernetes/ssl
    
    1. 删除kubelet证书和kubeconfig文件
    rm -f /opt/kubernetes/cfg/kubelet.kubeconfig
    rm -f /opt/kubernetes/ssl/kubelet*
    

    注:这几个文件是证书申请审批后自动生成的,每个Node不同,必须删除

    1. 修改主机名
    vi /opt/kubernetes/cfg/kubelet.conf
    
    --hostname-override=node1
    
    vi /opt/kubernetes/cfg/kube-proxy-config.yml
    
    hostnameOverride: node1
    
    1. 启动并设置开机启动
    systemctl daemon-reload
    systemctl start kubelet kube-proxy
    systemctl enable kubelet kube-proxy
    
    1. 在Master上批准新Node kubelet证书申请
    # 查看证书请求
    kubectl get csr
    
    NAME AGE SIGNERNAME REQUESTOR CONDITION
    node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro 89s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
    
    # 授权请求
    kubectl certificate approve node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-aE2jyTP81Uro
    
    1. 查看Node状态
    kubectl get node
    
    NAME STATUS ROLES AGE VERSION
    master Ready <none> 47m v1.20.4
    node1 Ready <none> 6m49s v1.20.4
    
    Node2(192.168.1.10 )节点同上。记得修改主机名!
    

六、部署Dashboard和CoreDNS

6.1 部署Dashboard

kubectl apply -f kubernetes-dashboard.yaml

查看部署

kubectl get pods,svc -n kubernetes-dashboard

访问地址:https://NodeIP:30001

创建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登录Dashboard。

6.2 部署CoreDNS

CoreDNS用于集群内部Service名称解析。

kubectl apply -f coredns.yaml

kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5ffbfd976d-j6shb 1/1 Running 0 32s

DNS解析测试:

kubectl run -it --rm dns-test --image=busybox:1.28.4 sh

If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
Name: kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

解析没问题。

至此一个单Master集群就搭建完成了!这个环境就足以满足学习实验了,如果你的服务器配置较高,可继续扩容多Master集群!

七、扩容多Master(高可用架构)

Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失效状态自动在其他Node拉起Pod,实现了应用层的高可用性。

针对Kubernetes集群,高可用性还应包含以下两个层面的考虑:Etcd数据库的高可用性和Kubernetes Master组件的高可用性。 而Etcd我们已经采用3个节点组建集群实现高可用,本节将对Master节点高可用进行说明和实施。

Master节点扮演着总控中心的角色,通过不断与工作节点上的Kubelet和kube-proxy进行通信来维护整个集群的健康工作状态。如果Master节点故障,将无法使用kubectl工具或者API做任何集群管理。

Master节点主要有三个服务kube-apiserver、kube-controller-manager和kube-scheduler,其中kube-controller-manager和kube-scheduler组件自身通过选择机制已经实现了高可用,所以Master高可用主要针对kube-apiserver组件,而该组件是以HTTP API提供服务,因此对他高可用与Web服务器类似,增加负载均衡器对其负载均衡即可,并且可水平扩容。

多Master架构图:

7.1 部署Master2 Node

现在需要再增加一台新服务器,作为Master2 Node,IP是192.168.31.74。

为了节省资源你也可以将之前部署好的Worker Node1复用为Master2 Node角色(即部署Master组件)

Master2 与已部署的Master1所有操作一致。所以我们只需将Master1所有K8s文件拷贝过来,再修改下服务器IP和主机名启动即可。

    1. 安装Docker
    scp /usr/bin/docker* root@192.168.31.74:/usr/bin
    scp /usr/bin/runc root@192.168.31.74:/usr/bin
    scp /usr/bin/containerd* root@192.168.31.74:/usr/bin
    scp /usr/lib/systemd/system/docker.service root@192.168.31.74:/usr/lib/systemd/system
    scp -r /etc/docker root@192.168.31.74:/etc
    
    # 在Master2启动Docker
    
    systemctl daemon-reload
    systemctl start docker
    systemctl enable docker
    
    1. 创建etcd证书目录

    在Master2创建etcd证书目录:

    mkdir -p /opt/etcd/ssl
    
    1. 拷贝文件(Master1操作)

    拷贝Master1上所有K8s文件和etcd证书到Master2:

    scp -r /opt/kubernetes root@192.168.31.74:/opt
    scp -r /opt/etcd/ssl root@192.168.31.74:/opt/etcd
    scp /usr/lib/systemd/system/kube* root@192.168.31.74:/usr/lib/systemd/system
    scp /usr/bin/kubectl root@192.168.31.74:/usr/bin
    scp -r ~/.kube root@192.168.31.74:~
    
    1. 删除证书文件

    删除kubelet证书和kubeconfig文件:

    rm -f /opt/kubernetes/cfg/kubelet.kubeconfig
    rm -f /opt/kubernetes/ssl/kubelet*
    
    1. 修改配置文件IP和主机名

    修改apiserver、kubelet和kube-proxy配置文件为本地IP:

    vi /opt/kubernetes/cfg/kube-apiserver.conf
    ...
    
    --bind-address=192.168.31.74 
    
    --advertise-address=192.168.31.74 
    
    ...
    
    vi /opt/kubernetes/cfg/kube-controller-manager.kubeconfig
    
    server: [https://192.168.31.74:6443](https://192.168.31.74:6443/)
    
    vi /opt/kubernetes/cfg/kube-scheduler.kubeconfig
    
    server: [https://192.168.31.74:6443](https://192.168.31.74:6443/)
    
    vi /opt/kubernetes/cfg/kubelet.conf
    
    --hostname-override=master2
    
    vi /opt/kubernetes/cfg/kube-proxy-config.yml
    
    hostnameOverride: master2
    
    vi ~/.kube/config
    
    ...
    
    server: https://192.168.31.74:6443
    
    1. 启动设置开机启动
    systemctl daemon-reload
    systemctl start kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
    systemctl enable kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
    
    1. 查看集群状态
    kubectl get cs
    
    NAME STATUS MESSAGE ERROR
    scheduler Healthy ok
    controller-manager Healthy ok
    etcd-1 Healthy {"health":"true"}
    etcd-2 Healthy {"health":"true"}
    etcd-0 Healthy {"health":"true"}
    
    1. 批准kubelet证书申请
    # 查看证书请求
    kubectl get csr
    NAME AGE SIGNERNAME REQUESTOR CONDITION
    node-csr-JYNknakEa_YpHz797oKaN-ZTk43nD51Zc9CJkBLcASU 85m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
    
    # 授权请求
    kubectl certificate approve node-csr-JYNknakEa_YpHz797oKaN-ZTk43nD51Zc9CJkBLcASU
    
    # 查看Node
    kubectl get node
    NAME STATUS ROLES AGE VERSION
    master Ready <none> 34h v1.20.4
    master2 Ready <none> 2m v1.20.4
    node1 Ready <none> 33h v1.20.4
    master2 Ready <none> 33h v1.20.4
    

7.2 部署Nginx+Keepalived高可用负载均衡器

kube-apiserver高可用架构图:

  • Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡。
  • Keepalived是一个主流高可用软件,基于VIP绑定实现服务器双机热备,在上述拓扑中,Keepalived主要根据Nginx运行状态判断是否需要故障转移(漂移VIP),例如当Nginx主节点挂掉,VIP会自动绑定在Nginx备节点,从而保证VIP一直可用,实现Nginx高可用。

注1:为了节省机器,这里与K8s Master节点机器复用。也可以独立于k8s集群之外部署,只要nginx与apiserver能通信就行。

注2:如果你是在公有云上,一般都不支持keepalived,那么你可以直接用它们的负载均衡器产品,直接负载均衡多台Master kube-apiserver,架构与上面一样。

在两台Master节点操作。

    1. 安装软件包(主/备)
    yum install epel-release -y
    
    yum install nginx keepalived -y
    
    1. Nginx配置文件(主/备一样)
    cat > /etc/nginx/nginx.conf << "EOF"
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    include /usr/share/nginx/modules/*.conf;
    events {
    worker_connections 1024;
    }
    
    # 四层负载均衡,为两台Master apiserver组件提供负载均衡
    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.1.23:6443; # Master1 APISERVER IP:PORT
    server 192.168.31.74:6443; # Master2 APISERVER IP:PORT
    }
    
    server {
    listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突
    proxy_pass k8s-apiserver;
    }
    }
    
    http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    server {
    listen 80 default_server;
    server_name _;
    location / {
    
    }
    
    }
    
    }
    
    EOF
    
    1. keepalived配置文件(Nginx Master)
    cat > /etc/keepalived/keepalived.conf << EOF
    
    global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    
    }
    
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id NGINX_MASTER
    
    }
    
    vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    }
    
    vrrp_instance VI_1 {
    
    state MASTER
    
    interface ens33 # 修改为实际网卡名
    
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
    
    priority 100 # 优先级,备服务器设置 90
    
    advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
    
    authentication {
    
    auth_type PASS
    
    auth_pass 1111
    
    }
    
    # 虚拟IP
    
    virtual_ipaddress {
    
    192.168.31.88/24
    
    }
    
    track_script {
    
    check_nginx
    
    }
    
    }
    
    EOF
    
    • vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移)
    • virtual_ipaddress:虚拟IP(VIP)

    准备上述配置文件中检查nginx运行状态的脚本:

    cat > /etc/keepalived/check_nginx.sh << "EOF"
    
    #!/bin/bash
    
    count=$(ss -antp |grep 16443 |egrep -cv "grep|$$")
    
    if [ "$count" -eq 0 ];then
    
    exit 1
    
    else
    
    exit 0
    
    fi
    
    EOF
    
    chmod +x /etc/keepalived/check_nginx.sh
    
    1. keepalived配置文件(Nginx Backup)
    cat > /etc/keepalived/keepalived.conf << EOF
    
    global_defs {
    
    notification_email {
    
    acassen@firewall.loc
    
    failover@firewall.loc
    
    sysadmin@firewall.loc
    
    }
    
    notification_email_from Alexandre.Cassen@firewall.loc
    
    smtp_server 127.0.0.1
    
    smtp_connect_timeout 30
    
    router_id NGINX_BACKUP
    
    }
    
    vrrp_script check_nginx {
    
    script "/etc/keepalived/check_nginx.sh"
    
    }
    
    vrrp_instance VI_1 {
    
    state BACKUP
    
    interface ens33
    
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
    
    priority 90
    
    advert_int 1
    
    authentication {
    
    auth_type PASS
    
    auth_pass 1111
    
    }
    
    virtual_ipaddress {
    
    192.168.31.88/24
    
    }
    
    track_script {
    
    check_nginx
    
    }
    
    }
    
    EOF
    

    准备上述配置文件中检查nginx运行状态的脚本:

    chmod +x /etc/keepalived/check_nginx.sh
    

    注:keepalived根据脚本返回状态码(0为工作正常,非0不正常)判断是否故障转移。

    1. 启动并设置开机启动
    systemctl daemon-reload
    
    systemctl start nginx keepalived
    
    systemctl enable nginx keepalived
    
    1. 查看keepalived工作状态
    ip addr
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:04:f7:2c brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.80/24 brd 192.168.31.255 scope global noprefixroute ens33
    valid_lft forever preferred_lft forever
    inet 192.168.31.88/24 scope global secondary ens33
    valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe04:f72c/64 scope link
    valid_lft forever preferred_lft forever
    

    可以看到,在ens33网卡绑定了192.168.31.88 虚拟IP,说明工作正常。

    1. Nginx+Keepalived高可用测试

    关闭主节点Nginx,测试VIP是否漂移到备节点服务器。

    在Nginx Master执行 pkill nginx;
    在Nginx Backup,ip addr命令查看已成功绑定VIP。

    1. 访问负载均衡器测试

    找K8s集群中任意一个节点,使用curl查看K8s版本测试,使用VIP访问:

    curl -k https://192.168.31.88:16443/version
    
    {
    "major": "1",
    "minor": "20",
    "gitVersion": "v1.20.4",
    "gitCommit": "e87da0bd6e03ec3fea7933c4b5263d151aafd07c",
    "gitTreeState": "clean",
    "buildDate": "2021-02-18T16:03:00Z",
    "goVersion": "go1.15.8",
    "compiler": "gc",
    "platform": "linux/amd64"
    }
    

    可以正确获取到K8s版本信息,说明负载均衡器搭建正常。该请求数据流程:curl -> vip(nginx) -> apiserver

    通过查看Nginx日志也可以看到转发apiserver IP:

    tail /var/log/nginx/k8s-access.log -f
    
    192.168.1.23 192.168.1.23:6443 - [02/Apr/2021:19:17:57 +0800] 200 423
    192.168.1.23 192.168.1.8:6443 - [02/Apr/2021:19:18:50 +0800] 200 423
    

    到此还没结束,还有下面最关键的一步。

7.3 修改所有Worker Node连接LB VIP

试想下,虽然我们增加了Master2 Node和负载均衡器,但是我们是从单Master架构扩容的,也就是说目前所有的Worker Node组件连接都还是Master1 Node,如果不改为连接VIP走负载均衡器,那么Master还是单点故障。

因此接下来就是要改所有Worker Node(kubectl get node命令查看到的节点)组件配置文件,由原来192.168.1.23修改为192.168.31.88(VIP)。

在所有Worker Node执行:

sed -i 's#192.168.1.23:6443#192.168.31.88:16443#' /opt/kubernetes/cfg/*

systemctl restart kubelet kube-proxy

检查节点状态:

kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready <none> 32d v1.20.4
master2 Ready <none> 10m v1.20.4
node1 Ready <none> 31d v1.20.4
master2 Ready <none> 31d v1.20.4

至此,一套完整的 Kubernetes 高可用集群就部署完成了!

本文地址:https://www.vps345.com/13992.html

搜索文章

Tags

docker 容器 运维 java-rabbitmq java PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 开源 自动化 n8n dity make linux pytorch tensorflow 数据分析 机器学习 人工智能 计算机视觉 搜索引擎 程序员 大模型应用 prompt LLM 大模型 大模型面经 职场和发展 Deepseek 大模型学习 ubuntu 无人机 机器人 macos MacMini Mac 迷你主机 mini Apple centos python 深度学习 qt linuxdeployqt 打包部署程序 appimagetool rag ragflow ollama 大模型部署 ai nlp 知识图谱 大模型教程 AI大模型 数据库 postgresql pgpool 嵌入式硬件 边缘计算 deepseek 科技 大数据 云计算 linux环境变量 AI Dify 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 Linux DNS 硬件工程 单片机 物联网 开发语言 云原生 iventoy VmWare OpenEuler Agent DeepSeek llama CrewAI Qwen3 qwen3 32b vllm 本地部署 ROS 自动驾驶 华为 网络 智能路由器 android studio 交互 后端 websocket android 政务 分布式系统 监控运维 Prometheus Grafana 虚拟机 pycharm ide Python教程 Python pycharm安装 tcp/ip 网络协议 系统架构 阿里云 ruoyi 服务器扩容没有扩容成功 MCP ESXi 程序人生 ssh漏洞 ssh9.9p2 CVE-2025-23419 kubernetes go 卸载 软件 列表 github gitlab 安全 mcu c语言 flutter Google pay Apple pay 区块链 分布式账本 web3 智能合约 信任链 共识算法 oracle 关系型 分布式 ddos 网络安全 web安全 windows 具身智能 强化学习 Linux 维护模式 智能手机 计算机网络 milvus fiddler 爬虫 http chatgpt gpu算力 javascript 前端 chrome edge uniapp vue Deepseek-R1 私有化部署 推理模型 p2p onlyoffice 在线office fpga开发 debian wps vscode 安卓 操作系统 UEFI Legacy MBR GPT U盘安装操作系统 jvm 游戏 harmonyos opencv webpack pyautogui 音视频 相机 网络工程师 网络管理 软考 2024 2024年上半年 下午真题 答案 php ssh muduo 网络库 华为云 华为od CH340 串口驱动 CH341 uart 485 Cursor 学习 笔记 CosyVoice 嵌入式 linux驱动开发 arm开发 经验分享 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 程序 编程 内存 性能分析 rpa 远程 命令 执行 sshpass 操作 c++ 游戏引擎 部署 YOLO 目标检测 conda ipython cursor ffmpeg mamba flask https servlet tomcat mysql hadoop big data 编辑器 其他 harmonyOS面试题 nginx Vmamba kvm qemu libvirt 微服务 eureka 负载均衡 算法 自然语言处理 神经网络 语言模型 FTP服务器 远程连接 驱动开发 kafka word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 微信开放平台 微信公众平台 微信公众号配置 面试 spring boot mysql离线安装 ubuntu22.04 mysql8.0 udp mysql安装报错 windows拒绝安装 vmware vmamba appium 软件测试 自动化测试 功能测试 AI编程 visual studio code agi 课程设计 ragflow 源码启动 技能大赛 eclipse top Linux top top命令详解 top命令重点 top常用参数 Apache Beam 批流统一 性能优化 案例展示 数据分区 容错机制 卷积神经网络 图形化界面 vite vue3 yolov5 镜像源 powerpoint 网络攻击模型 系统安全 电脑 stm32 大模型入门 springsecurity6 oauth2 授权服务器 自定义客户端 SAS django jupyter webrtc uni-app 串口服务器 万物互联 工业自动化 工厂改造 鸿蒙 鸿蒙系统 前端框架 架构 gcc g++ g++13 vim 学习方法 镜像 docker-compose devops prometheus grafana 1024程序员节 Claude Desktop Claude MCP Windows Cli MCP Docker Docker Compose Kubernetes ACL 流量控制 基本ACL 规则配置 Apache Flume 数据采集 安装部署 配置优化 高级功能 大数据工具集成 信息与通信 redis node.js git 前后端分离 DeepSeek-R1 API接口 AIGC 云电竞 云电脑 todesk oneapi 数据挖掘 excel 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 visualstudio vue.js react.js r语言 数据可视化 kylin gaussdb MQTT mosquitto 消息队列 IM即时通讯 QQ 微信 企业微信 剪切板对通 HTML FORMAT 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 virtualenv arm 运维开发 bash 计算机外设 bug 智慧农业 开源鸿蒙 团队开发 notepad mac 隐藏文件 gnu 缓存 arkUI arkTs hdc 鸿蒙NEXT 远程工作 截图 录屏 gif 工具 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 人工智能生成内容 gitee 前端面试题 持续部署 蓝桥杯 Alexnet ShapeFile GeoJSON Nginx nvm spring cloud 压力测试 大模型压力测试 EvalScope SSE 远程桌面 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 oceanbase rc.local 开机自启 systemd 麒麟 svn 数据库系统 ssl 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 Dell HPE 联想 浪潮 PyQt PySide6 NVML nvidia-smi Playwright pythonai PlaywrightMCP chrome devtools selenium chromedriver GCC crosstool-ng sdkman 考研 数据结构 typescript fstab list maxkb ARG openssl Ubuntu20.04 GLIBC 2.35 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu Ubuntu vi 异常处理 intellij-idea Ollama 权限 ArkTS 智能驾驶 BEVFusion nac 802.1 portal 测试工具 llm 群晖 低代码 集成学习 集成测试 视频编解码 pip vnc ui 网页服务器 web服务器 ansible IO jdk 智能体开发 unity RTSP xop RTP RTSPServer 推流 视频 Trae IDE AI 原生集成开发环境 Trae AI spring golang v10 armbian u-boot LLM Web APP Streamlit 模型联网 API CherryStudio 服务器配置 rsyslog Windows ai工具 鲲鹏 昇腾 npu deepseek-r1 大模型本地部署 AI-native elasticsearch 7-zip shell word mcp gitee go gpt transformer kali 共享文件夹 重启 排查 系统重启 日志 原因 虚拟显示器 远程控制 ubuntu20.04 开机黑屏 卡死 python2 ubuntu24.04 程序员创富 adb kotlin iphone VMware Tools vmware tools安装 vmwaretools安装步骤 vmwaretools安装失败 vmware tool安装步骤 vm tools安装步骤 vm tools安装后不能拖 vmware tools安装步骤 unix ArkUI 移动端开发 cron crontab日志 burpsuite 安全工具 mac安全工具 burp安装教程 渗透工具 软件需求 Linux find grep nohup 异步执行 图文教程 VMware虚拟机 macOS系统安装教程 macOS最新版 虚拟机安装macOS Sequoia wsl2 wsl vsxsrv WSL2 IP 地址 策略模式 cnn GoogLeNet YOLOv12 rocketmq 金融 iftop 网络流量监控 k8s ip协议 框架搭建 计算生物学 生物信息学 生物信息 基因组 opengl ros ros1 Noetic 20.04 apt 安装 DevOps 软件交付 数据驱动 应用场景 数据安全 工具分享 apache dash json 正则表达式 jenkins k8s部署 MySQL8.0 高可用集群(1主2从) 腾讯云 京东云 sql IPMI fastapi 交换机 硬件 设备 GPU PCI-Express 回显服务器 UDP的API使用 大模型微调 雨云 NPS dell服务器 AutoDL audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 YOLOv8 NPU Atlas800 A300I pro asi_bench Flask FastAPI Waitress Gunicorn uWSGI Uvicorn 安全威胁分析 环境迁移 实时音视频 大模型推理 gitea npm 反向代理 RAID RAID技术 磁盘 存储 sqlserver iot rust腐蚀 网工 micropython esp32 mqtt jmeter Windsurf oracle fusion oracle中间件 虚拟化 es6 qt6.3 g726 安全漏洞 信息安全 microsoft 云计算面试题 Java进程管理 DevOps自动化 脚本执行 跨平台开发 远程运维 Apache Exec JSch C 环境变量 进程地址空间 进程 ip 模拟器 教程 yolov8 rabbitmq ruby WSL2 上安装 Ubuntu 安卓模拟器 shell脚本免交互 expect linux免交互 open webui iTerm2 VMware 车载系统 设备树 毕设 小程序 图像处理 grep python3.11 MobaXterm 文件传输 zip unzip openjdk cuda Bug解决 Qt platform OpenCV 虚拟现实 maven Maxkb RAG技术 本地知识库 知识库 RAGFlow 本地知识库部署 DeepSeek R1 模型 rpc AnythingLLM AnythingLLM安装 实时互动 arcgis rnn 多进程 pygame 网络爬虫 WebVM centos 7 7z dify 本地化部署 单例模式 计算机 axure 富文本编辑器 html qps 高并发 防火墙 端口号 开放端口 访问列表 tcpdump DrissionPage FTP 服务器 升级 CVE-2024-7347 漏洞 华为认证 个人博客 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 IIS .net core Hosting Bundle .NET Framework vs2022 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 xrdp ESP32 IIS服务器 IIS性能 日志监控 matlab triton 模型分析 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 tidb db jar 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 vu大文件秒传跨域报错cors Chatbox Qualcomm WoS QNN AppBuilder ftp服务 文件上传 大模型训练/推理 推理问题 mindie AI员工 web chatbox 进程控制 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 USB转串口 xshell termius iterm2 客户端 源码 毕业设计 网络结构图 java-ee ios SenseVoice Mac内存不够用怎么办 xcode 桌面环境 EVE-NG Isaac Sim 虚拟仿真 diskgenius 打不开xxx软件 无法检查其是否包含恶意软件 rime 进程信号 快捷键 旋转屏幕 自动操作 Ubuntu 22.04 MySql 算家云 算力租赁 安装教程 数据集 IMX317 MIPI H265 VCU 腾讯云大模型知识引擎 docker run 数据卷挂载 端口映射 交互模式 热榜 yaml Ultralytics 可视化 Docker Desktop 5G 3GPP 卫星通信 C++ seleium Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 私有化 kernel remote-ssh LVM 磁盘分区 lvresize 磁盘扩容 pvcreate 命名管道 客户端与服务端通信 Kali 渗透 rtc 计算机学习路线 编程语言选择 LSTM SRS 流媒体 直播 C语言 c# H3C ftp 个人开发 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 react next.js 部署next.js live555 rtsp rtp 银河麒麟 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 监控 自动化运维 adobe 我的世界服务器搭建 源码剖析 rtsp实现步骤 流媒体开发 file server http server web server aws googlecloud WebRTC opensearch helm html5 firefox 游戏程序 项目部署到linux服务器 项目部署过程 火绒安全 express HTTP 服务器控制 ESP32 DeepSeek 模拟退火算法 游戏服务器 Minecraft 状态管理的 UDP 服务器 Arduino RTOS asm 毕昇JDK 微信小程序 宝塔 镜像下载 freebsd lighttpd安装 Ubuntu配置 Windows安装 性能测试 服务器优化 语音识别 NFC 近场通讯 智能门锁 Pyppeteer 虚幻 信号处理 numpy 锁屏不生效 华为OD 华为OD机试真题 可以组成网络的服务器 css css3 密码学 区块链项目 飞腾处理器 硬件架构 国产化 Python 视频爬取教程 Python 视频爬取 Python 视频教程 框架 localhost 匿名FTP 邮件传输代理 SSL支持 chroot监狱技术 mcp协议 go-zero mcp服务器 pyscenic 生信 生信教程 GPU状态 小游戏 五子棋 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 make命令 makefile文件 邮件APP 免费软件 cocoapods Qwen2.5-coder 离线部署 软件工程 稳定性 看门狗 设计模式 版本 安装 MacOS 向日葵 并查集 leetcode 电子信息 通信工程 毕业 开发环境 本地环回 bind .net export env 变量 gpt-3 高德地图 鸿蒙接入高德地图 HarmonyOS5.0 终端工具 远程工具 chromium dpi pdf IP配置 netplan ollama api ollama外网访问 进程间通信 冯诺依曼体系 termux 环境搭建 SecureCRT comfyui comfyui教程 mac设置host 向量数据库 milvus安装 华为鸿蒙系统 ArkTS语言 Component 生命周期 条件渲染 Image图片组件 Obsidian Dataview OpenCore js Xinference 影刀 #影刀RPA# 实习 apt 国内源 Python基础 Python技巧 QT 5.12.12 QT开发环境 Ubuntu18.04 okhttp searxng AI Agent 字节智能运维 双系统 GRUB引导 Linux技巧 目标跟踪 OpenVINO 推理应用 网络药理学 gromacs 分子动力学模拟 MD 动力学模拟 ip命令 新增网卡 新增IP 启动网卡 flash-attention 报错 国产数据库 瀚高数据库 数据迁移 下载安装 nftables cudnn nvidia compose CPU 使用率 系统监控工具 linux 命令 JDK Java LInux Linux Vim tar ci/cd 安装MySQL 显卡驱动持久化 GPU持久化 隐藏目录 文件系统 管理器 通配符 xml 单元测试 可用性测试 小智 gru RagFlow wireshark lvs Apache OpenNLP 句子检测 分词 词性标注 核心指代解析 mcp-proxy mcp-inspector fastapi-mcp agent sse 多线程服务器 Linux网络编程 Kylin-Server 国产操作系统 服务器安装 RustDesk自建服务器 rustdesk服务器 docker rustdesk 阻塞队列 生产者消费者模型 服务器崩坏原因 NAT转发 NAT Server UDP ping++ 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 intellij idea LDAP opcua opcda KEPServer安装 做raid 装系统 BMC ssrf 失效的访问控制 孤岛惊魂4 GIS 遥感 WebGIS 统信 虚拟机安装 IMM 宝塔面板 同步 备份 建站 服务器繁忙 NAS Termux Samba web3.py 我的世界 我的世界联机 数码 Headless Linux string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 媒体 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 外网访问 内网穿透 TCP服务器 qt项目 qt项目实战 qt教程 银河麒麟操作系统 三级等保 服务器审计日志备份 大语言模型 langchain 带外管理 云服务 midjourney AI写作 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK CDN rust 阿里云ECS 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 rustdesk postman 蓝桥杯C++组 outlook 错误代码2603 无网络连接 2603 EtherCAT转Modbus EtherCAT转485网关 ECT转485串口服务器 ECT转Modbus485协议 ECT转Modbus串口网关 ECT转Modbus串口服务器 c/s 哈希算法 #STC8 #STM32 商用密码产品体系 .netcore notepad++ 机器人仿真 模拟仿真 HTTP状态码 客户端错误 服务器端错误 API设计 HarmonyOS MateBook 宠物 免费学习 宠物领养 宠物平台 中兴光猫 换光猫 网络桥接 自己换光猫 混合开发 环境安装 灵办AI GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 HarmonyOS Next DevEco Studio PX4 键盘 产品经理 protobuf 序列化和反序列化 匿名管道 MAVROS 四旋翼无人机 英语 matplotlib fonts-noto-cjk jellyfin nas perl iNode Macos frp zabbix WSL resolv.conf GPU训练 brew node mybase CUPS 打印机 Qt5 材料工程 代码 对比 meld Beyond Compare DiffMerge csrf vm harmonyosnext 产测工具框架 IMX6ULL 管理框架 办公自动化 自动化生成 pdf教程 perf elk Logstash 日志采集 运维监控 拓扑图 glibc yum 线程 多线程 虚拟局域网 ue4 着色器 ue5 ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 webdav 飞牛nas fnos Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer 读写锁 指令 dubbo scapy burp suite 抓包 centos-root /dev/mapper yum clean all df -h / du -sh 网易邮箱大师 宝塔面板无法访问 docker desktop RDP IPv4/IPv6双栈 双栈技术 网路规划设计 ensp综合实验 IPv4过渡IPv6 IPv4与IPv6 post.io 企业邮箱 搭建邮箱 论文笔记 dns python高级编程 Ansible elk stack risc-v 传统数据库升级 银行 MCP server C/S 王者荣耀 Cline spark HistoryServer Spark YARN jobhistory stm32项目 嵌入式实习 华为机试 AD域 MS Materials zotero WebDAV 同步失败 代理模式 Invalid Host allowedHosts pillow vscode1.86 1.86版本 ssh远程连接 常用命令 文本命令 目录命令 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 cpu 实时 使用 springboot 单一职责原则 echarts 信息可视化 网页设计 DeepSeek行业应用 Heroku 网站部署 ecmascript nextjs reactjs unity3d Hyper-V WinRM TrustedHosts open Euler dde deepin 统信UOS LLMs PVE Kali Linux 黑客 渗透测试 信息收集 kamailio sip VoIP api 直播推流 大文件秒传跨域报错cors 测试用例 Dell R750XS NFS redhat 大大通 第三代半导体 碳化硅 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 弹性计算 云服务器 裸金属服务器 弹性裸金属服务器 zookeeper 备选 网站 调用 示例 grub 版本升级 扩容 uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 搭建个人相关服务器 llama.cpp ECT转Modbus协议 EtherCAT转485协议 ECT转Modbus网关 浏览器自动化 视频平台 录像 视频转发 视频流 机柜 1U 2U 录音麦克风权限判断检测 录音功能 录音文件mp3播放 小程序实现录音及播放功能 RecorderManager 解决录音报错播放没声音问题 HP Anyware hive gunicorn 跨域请求 智能电视 行情服务器 股票交易 速度慢 切换 股票量化接口 股票API接口 mariadb minio 文件存储服务器组件 百度云 矩池云 数据下载 数据传输 slave mongodb deekseek 捆绑 链接 谷歌浏览器 youtube google gmail MacOS录屏软件 换源 Debian ArcTS 登录 ArcUI GridItem 微信分享 Image wxopensdk Ubuntu Server Ubuntu 22.04.5 bcompare 嵌入式Linux IPC 多层架构 解耦 Redis Desktop Linux的基础指令 VMware安装mocOS macOS系统安装 safari 系统 软件卸载 系统清理 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 进程优先级 调度队列 进程切换 高级IO epoll openvpn server openvpn配置教程 centos安装openvpn sublime text linux内核 nohup后台启动 UOS 开机自启动 桌面快捷方式 视觉检测 链表 Xshell lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 创业创新 firewall Github加速 Mac上Github加速 Chrome浏览器插件 图论 PostgreSQL15数据库 切换root openssh 蓝耘科技 元生代平台工作流 ComfyUI 开发 环境配置 ShenTong linux上传下载 can 线程池 minicom 串口调试工具 网络用户购物行为分析可视化平台 大数据毕业设计 Reactor k8s集群资源管理 云原生开发 软链接 硬链接 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 KVM anaconda efficientVIT YOLOv8替换主干网络 TOLOv8 显卡驱动 telnet 远程登录 etcd RBAC springcloud camera Arduino 聚类 mq 设置代理 实用教程 性能调优 安全代理 image Typore DBeaver rancher ubuntu 18.04 大模型技术 本地部署大模型 Ubuntu22.04 开发人员主页 scikit-learn 免密 公钥 私钥 网络编程 分子对接 autodock mgltools PDB PubChem 健康医疗 rdp 远程服务 全文检索 图搜索算法 工作流 软考设计师 中级设计师 SQL 软件设计师 智能体 autogen openai coze 源代码 linux子系统 忘记密码 android-studio 桥接模式 windows虚拟机 虚拟机联网 AI提示词优化 企业风控系统 互联网反欺诈 DDoS攻击 SQL注入攻击 恶意软件和病毒攻击 lstm LSTM-SVM 时间序列预测 多媒体 BitTorrent 搜索 网卡的名称修改 eth0 ens33 EMQX 通信协议 SSH Xterminal VSCode Kylin OS openEuler ocr EasyConnect odoo 服务器动作 Server action HCIE 数通 豆瓣 追剧助手 迅雷 银河麒麟桌面操作系统 多个客户端访问 IO多路复用 TCP相关API kind hibernate 内网服务器 内网代理 内网通信 vSphere vCenter 软件定义数据中心 sddc 磁盘监控 VPS 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 nuxt3 中间件 iis X11 Xming 聊天服务器 套接字 TCP Socket Netty 即时通信 NIO DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 Unity Dedicated Server Host Client 无头主机 文件分享 java-rocketmq 远程看看 远程协助 银河麒麟高级服务器 外接硬盘 Kylin 崖山数据库 YashanDB 显示管理器 lightdm gdm 雨云服务器 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 创意 社区 DOIT 四博智联 asp.net大文件上传 asp.net大文件上传下载 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 IPMITOOL 硬件管理 大数据平台 playbook 算力 网络穿透 执法记录仪 智能安全帽 smarteye mybatis 剧本 skynet VMware创建虚拟机 KylinV10 麒麟操作系统 Vmware CPU 主板 电源 网卡 C# MQTTS 双向认证 emqx dba 互信 windows 服务器安装 clickhouse 笔灵AI AI工具 CNNs 图像分类 视频监控 内网渗透 靶机渗透 券商 股票交易接口api 类型 特点 海康 samba 支持向量机 规格说明书 设计规范 rsync qwen2vl finebi 教育电商 源代码管理 ECS服务器 SoC sse_starlette Starlette Server-Sent Eve 服务器推送事件 电子信息工程 服务网格 istio 医疗APP开发 app开发 neo4j 数据仓库 数据库开发 database linux安装配置 3d alias unalias 别名 黑苹果 飞牛NAS 飞牛OS MacBook Pro Linux24.04 embedding threejs 3D cmos conda配置 conda镜像源 CentOS Stream CentOS trea idea rclone AList fnOS 历史版本 下载 Linux PID Ubuntu共享文件夹 共享目录 Linux共享文件夹 本地部署AI大模型 c/c++ 串口 系统开发 binder framework 源码环境 沙盒 iperf3 带宽测试 Linux权限 权限命令 特殊权限 docker compose 磁盘清理 curl wget 华为证书 HarmonyOS认证 华为证书考试 MVS 海康威视相机 deep learning Tabs组件 TabContent TabBar TabsController 导航页签栏 滚动导航栏 Maven 电脑桌面出现linux图标 电脑桌面linux图标删除不了 电脑桌面Liunx图标删不掉 linux图标删不掉 动静态库 实时内核 Ardupilot sublime text3 Echarts图表 折线图 柱状图 异步动态数据 鸿蒙开发 可视化效果 pthread 裸机装机 linux磁盘分区 裸机安装linux 裸机安装ubuntu 裸机安装kali 裸机 可执行程序 systemctl composer photoshop 接口返回 ranger MySQL8.0 流程图 mermaid SPI devmem stable diffusion RockyLinux nano jdk11安装 jdk安装 openjdk11 openjdk11安装 isaacgym 离线部署dify fd 文件描述符 JAVA workflow Open WebUI 可信计算技术 安全架构 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 DocFlow firewalld DenseNet 路径解析 uv docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos Docker Hub docker pull daemon.json 自动化任务管理 Linux的权限 虚幻引擎 增强现实 沉浸式体验 技术实现 案例分析 AR vr Cookie 监控k8s集群 集群内prometheus WebUI DeepSeek V3 主从复制 输入法 miniapp 真机调试 调试 debug 断点 网络API请求调试方法 监控k8s 监控kubernetes DeepSeek r1 WLAN 文心一言 selete 链路聚合 端口聚合 win11 windows11 NLP模型 NLP edge浏览器 思科 tcp ebpf uprobe GameFramework HybridCLR Unity编辑器扩展 自动化工具 qt5 客户端开发 ROS2 ubuntu安装 linux入门小白 蓝牙 大屏端 一切皆文件 trae ICMP 论文阅读 内存管理 物理地址 页表 虚拟地址 postgres Dify重启后重新初始化 磁盘挂载 新盘添加 partedUtil Alist mount 挂载 网盘 UFW 命令模式 Crawlee hosts hosts文件管理工具 开源软件 超级终端 多任务操作 提高工作效率 dns是什么 如何设置电脑dns dns应该如何设置 工作流自动化工具 bushujiaocheng 部署教程 AI算力 租算力 到算家云 实验 远程过程调用 Windows环境 c 物联网开发 webstorm 技术 无法解析服务器的名称或地址 SVN Server tortoise svn vasp安装 autodl kylin v10 麒麟 v10 code-server RTMP 应用层 junit ecm bpm 僵尸世界大战 游戏服务器搭建 HAProxy 压测 ECS 需求分析 游戏机 pyqt 统信操作系统 查询数据库服务IP地址 SQL Server 银河麒麟服务器操作系统 系统激活 SSL 域名 ISO镜像作为本地源 ukui 麒麟kylinos openeuler ldap 直流充电桩 充电桩 服务器部署ai模型 ux llama3 Chatglm 开源大模型 MI300x 计算虚拟化 弹性裸金属 联想开天P90Z装win10 FunASR ASR bonding 思科模拟器 Cisco 致远OA OA服务器 服务器磁盘扩容 gateway Clion Nova ResharperC++引擎 Centos7 远程开发 SWAT 配置文件 服务管理 网络共享 博客 代码调试 ipdb sqlite3 半虚拟化 硬件虚拟化 Hypervisor 网站搭建 serv00 ABAP 矩阵 aarch64 编译安装 HPC 田俊楠 存储维护 NetApp存储 EMC存储 状态模式 iBMC UltraISO 服务器管理 配置教程 网站管理 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 gradle TrueLicense visual studio Jellyfin Qwen2.5-VL 安防软件 云桌面 微软 AD域控 证书服务器 WebServer 话题通信 服务通信 硅基流动 ChatBox 浪潮信息 AI服务器 联机 僵尸毁灭工程 游戏联机 开服 弹性服务器 nacos 显示器 element-ui 上传视频并预览视频 vue上传本地视频及进度条功能 vue2选择视频上传到服务器 upload上传视频组件插件 批量上传视频 限制单个上传视频 pyside6 界面 Webserver 异步 Qt QModbus vCenter服务器 ESXi主机 监控与管理 故障排除 日志记录 RK3568 shard web开发 OpenGL 图形渲染 概率论 accept lua Claude socket 数学建模 多端开发 智慧分发 应用生态 鸿蒙OS 僵尸进程 VMware安装Ubuntu Ubuntu安装k8s 小艺 Pura X 命令行 基础入门 OpenHarmony Hive环境搭建 hive3环境 Hive远程模式 keepalived 分析解读 Attention Ark-TS语言 模拟实现 HarmonyOS NEXT 原生鸿蒙 支付 微信支付 开放平台 强制清理 强制删除 mac废纸篓 HiCar CarLife+ CarPlay QT RK3588 基础环境 ArkTs 软件构建 DIFY Reactor反应堆 多产物 cmake Mac软件 lvm 用户管理 推荐算法 玩游戏 大版本升 升级Ubuntu系统 Office 空间 查错 lio-sam SLAM macbook react native 管道 miniconda MAC 影视app 系统内核 Linux版本 RAGflow mac安装软件 mac卸载软件 mac book mac cocoapods macos cocoapods uni-app x 开发工具 容器清理 大文件清理 空间清理 ceph TRAE ollama下载加速 深度求索 私域 eNSP 企业网络规划 华为eNSP 网络规划 jina 跨域 VLAN 企业网络 ubuntu24.04.1 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 互联网医院 AI代码编辑器 MDK 嵌入式开发工具 金仓数据库 2025 征文 数据库平替用金仓 kerberos SSH 密钥生成 SSH 公钥 私钥 生成 ssh远程登录 openwrt USB网络共享 IPv4 子网掩码 公网IP 私有IP OpenSSH P2P HDLC 序列化反序列化 PPI String Cytoscape CytoHubba linux 命令 sed 命令 ros2 moveit 机器人运动 bat 流水线 脚本式流水线 x64 SIGSEGV xmm0 实战案例 log4j proxy模式 CLion docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 OpenManus 嵌入式系统开发 显示过滤器 Wireshark安装 yum换源 cfssl 抓包工具 接口优化 k8s二次开发 copilot import save load 迁移镜像 K8S k8s管理系统 Mermaid 可视化图表 ufw ajax 进程程序替换 execl函数 execv函数 execvp函数 execvpe函数 putenv函数 音乐服务器 Navidrome 音流 考试 脚本 kubeless autoware Trae叒更新了? easyTier 组网 线程同步 线程互斥 条件变量 deepseek-v3 ktransformers 动态库 GCC编译器 -fPIC -shared MLLMs VLM gpt-4v fabric 信号 内核 飞书 硬件工程师 硬件工程师学习 电子器件 电路图 二极管 三极管 三维重建 pppoe radius Ubuntu 24.04.1 轻量级服务器 SSL证书 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 流式接口 TrinityCore 魔兽世界 恒源云 bootstrap 深度优先 并集查找 换根法 树上倍增 无桌面 XFS xfs文件系统损坏 I_O error Spring Security 移动云 windows日志 MNN Qwen vscode 1.86 社交电子 iDRAC R720xd 内网环境 token sas Nuxt.js sysctl.conf vm.nr_hugepages mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 KingBase cpp-httplib URL nfs 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 业界资讯 能力提升 面试宝典 IT信息化 hugo sentinel 加解密 Yakit yaklang netty 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 wsgiref Web 服务器网关接口 温湿度数据上传到服务器 Arduino HTTP SysBench 基准测试 W5500 OLED u8g2 技术共享 LORA .net mvc断点续传 OD机试真题 服务器能耗统计 工业4.0 域名服务 DHCP 符号链接 配置 繁忙 解决办法 替代网站 汇总推荐 AI推理 欧标 OCPP 智能音箱 智能家居 AD 域管理 小智AI服务端 xiaozhi TTS 迁移指南 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 less 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? MQTT协议 消息服务器 飞牛 代码托管服务 云耀服务器 React Next.js 开源框架 Web服务器 多线程下载工具 PYTHON powerbi 服务器部署 本地拉取打包 代码规范 zerotier 联网 easyconnect 代理 动态规划 glm4 deepseak 豆包 KIMI 腾讯元宝 高效I/O 树莓派 umeditor粘贴word ueditor粘贴word ueditor复制word ueditor上传word图片 ueditor导入word ueditor导入pdf ueditor导入ppt 金仓数据库概述 金仓数据库的产品优化提案 软件开发 日志分析 系统取证 AimRT 华为昇腾910b3 机架式服务器 1U工控机 国产工控机 计算机系统 bigdata fpga issue linq 站群服务器 粘包问题 语法 av1 电视盒子 机顶盒ROM 魔百盒刷机 webgl VR手套 数据手套 动捕手套 动捕数据手套 sonoma 自动更新 deepseek r1 regedit 开机启动 玩机技巧 软件分享 软件图标 EMUI 回退 降级 prometheus数据采集 prometheus数据模型 prometheus特点 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 交叉编译 用户缓冲区 etl 查看显卡进程 fuser su sudo fork wait waitpid exit 网络文件系统 跨平台 csrutil mac恢复模式进入方法 SIP 恢复模式 AI作画 System V共享内存 进程通信 sudo原理 su切换 archlinux kde plasma initramfs Linux内核 Grub retry 重试机制 llamafactory 微调 NVM Node Yarn PM2 Charles STL cpolar 终端 mvc 提示词 顽固图标 启动台 容器技术 wifi驱动 互联网实用编程指南 IP地址 IPv6 计算机基础 AppLinking 应用间跳转 苹果电脑装windows系统 mac安装windows系统 mac装双系统 macbook安装win10双 mac安装win10双系统 苹果电脑上安装双系统 mac air安装win 树莓派项目 多路转接 进程池实现 Bluetooth 配对 红黑树 direct12 clipboard 剪贴板 剪贴板增强 Mac部署 Ollama模型 Openwebui 配置教程 AI模型 泰山派 根文件系统 编译 烧录 文件清理 IO模型 SSH 服务 SSH Server OpenSSH Server RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 TCP协议 xpath定位元素 bot 浏览器开发 AI浏览器 openstack Xen seatunnel ubuntu24 vivado24 yum源切换 更换国内yum源 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 自动化编程 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 烟花代码 烟花 元旦 软负载 端口 查看 ss Node-Red 编程工具 流编程 easyui 网络建设与运维 网络搭建 神州数码 神州数码云平台 云平台 免费域名 域名解析 自学笔记 小米 澎湃OS Android virtualbox 电视剧收视率分析与可视化平台 lb 协议 图片增强 增强数据 Helm k8s集群 生活 Zoertier 内网组网 Docker快速入门 netlink libnl3 底层实现 VGG网络 卷积层 池化层 WireGuard 异地组网 SystemV 计算机科学与技术 IPv6测试 IPv6测速 IPv6检测 IPv6查询 GRE 静态IP client-go Masshunter 质谱采集分析软件 使用教程 科研软件 VM虚拟机 医院门诊管理系统 轮播图 LLaMA-Factory 集成 5分钟快速学 docker入门 代理配置 企业级DevOps openresty Linux指令 podman registries 根目录 Radius laravel CORS 根服务器 服务器时间 es Wi-Fi h.264 黑客技术 AI agent jetty undertow 相差8小时 UTC 时间 thingsboard 聊天室 tailscale derp derper 中转 Anolis nginx安装 linux插件下载 游戏开发 架构与原理 服务器主板 AI芯片 minecraft XCC Lenovo idm 北亚数据恢复 oracle数据恢复 VNC VS Code 音乐库 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 信创 信创终端 中科方德 win服务器架设 windows server 超融合 UOS1070e saltstack nosql banner Carla Web应用服务器 授时服务 北斗授时 服务器ssl异常解决 配置原理 负载测试 yashandb VPN wireguard 充电桩平台 充电桩开源平台 免费 电路仿真 multisim 电路分析 仪器仪表 java-zookeeper logstash paddle AWS Putty 花生壳 pxe LVS h.265 anonymous vue在线预览excel和编辑 vue2打开解析xls电子表格 浏览器新开页签或弹框内加载预览 文件url地址或接口二进制文档 解决网页打不开白屏报错问题 静态NAT 热键 机架式 IDC 性能监控 移动魔百盒 sequoiaDB navicat 移动开发 元服务 应用上架 合成模型 扩散模型 图像生成 代理服务器 cd 目录切换 ArtTS vpn 极限编程 搜狗输入法 中文输入法 ELF加载 xfce wpf pyicu beautifulsoup 子系统 星河版 NVIDIA java毕业设计 微信小程序医院预约挂号 医院预约 医院预约挂号 小程序挂号 导航栏 Bandizip Mac解压 Mac压缩 压缩菜单 GKI KMI 基础指令 libreoffice word转pdf charles C/C++ 时间轮 flink 进程等待 内存泄漏 环境部署 嵌入式实时数据库 鸿蒙面试 面试题 tftp NVIDIA显卡安装 Ubuntu开机黑屏 figma fast docker命令大全 docker部署Python 抗锯齿 dock 加速 项目部署 deployment daemonset statefulset cronjob 钉钉 解决方案 Sealos 集群管理 AzureDataStudio GeneCards OMIM TTD 机械臂 solr Linux的基础开发工具 d3d12 anythingllm open-webui docker国内镜像 finalsheel MinIO 红黑树封装map和set 文件共享 scrapy 转换 恒玄BES 共享 设置 服务注册与发现 nacos容器环境变量 docker启动nacos参数 nacos镜像下载 dify部署 rxjava STP 生成树协议 PVST RSTP MSTP 防环路 网络基础 SEO 线性代数 电商平台 国标28181 监控接入 语音广播 流程 SDP 宕机切换 服务器宕机 sqlite swoole Erlang OTP gen_server 热代码交换 事务语义 xss AISphereButler 干货分享 黑客工具 密码爆破 流量运营 分布式训练 chfs ubuntu 16.04 IDEA 西门子PLC 通讯 端口测试 服务器正确解析请求体 数字证书 签署证书 solidworks安装 massa sui aptos sei 三次握手 lrzsz cocos2d 3dcoat OpenManage 自定义登录信息展示 motd 美化登录 能源 动态域名 rtcp CPU架构 服务器cpu 惠普服务器 惠普ML310e Gen8 惠普ML310e Gen8V2 腾讯云服务器 轻量应用服务器 linux系统入门 linux命令 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 AGI 系统架构设计 软件哲学 程序员实现财富自由 分布式数据库 集中式数据库 业务需求 选型误 5090 显卡 AI性能 A2A 客户端-服务器架构 点对点网络 服务协议 网络虚拟化 网络安全防御 科勘海洋 数据采集浮标 浮标数据采集模块 Svelte OpenAI 全栈 aiohttp asyncio 风扇控制软件 Linux环境 whistle macOS 欧拉系统 数据库管理 bert swift 实时日志 logs 端口开放 function address 函数 地址 broadcom MySQL ps命令 手动分区 chrome历史版本下载 chrominum下载 Navigation 路由跳转 鸿蒙官方推荐方式 鸿蒙原生开发 路径规划 Python学习 Python编程 gstreamer 文档 李心怡 问题解决 达梦 DM8 零售 输入系统 webview watchtower 知行EDI 电子数据交换 知行之桥 EDI Modbus TCP mapreduce 4 - 分布式通信、分布式张量 代码复审 烟雾检测 yolo检测 消防检测 springboot容器部署 springboot容器化部署 微服务容器化负载均衡配置 微服务容器多节点部署 微服务多节点部署配置负载均衡 BCLinux 基本指令 模板 通用环境搭建 dockerfile 仓库 影刀证书 分享 亲测 线程安全 电脑操作 Linux系统编程 生成对抗网络 HBase分布式集群 HBase环境搭建 HBase安装 HBase完全分布式环境 proxy_pass Playwright MCP 电子学会 佛山戴尔服务器维修 佛山三水服务器维修 Unity插件 ardunio BLE hexo client close WINCC 网络原理 程序化交易 量化交易 高频交易 caddy 火山引擎 PTrade QMT 量化股票 aac 工厂方法模式 openvino 环境 非root 制造 风扇散热策略 曙光 海光 宁畅 中科可控 排序算法 选择排序 RNG 状态 可复现性 随机数生成 光电器件 LED gitlab服务器 零日漏洞 CVE 独立服务器 Cache Aside Read/Write Write Behind 分类 proto actor actor model Actor 模型 模块测试 bug定位 缺陷管理 雾锁王国 win向maOS迁移数据 GRANT REVOKE qtcreator OS 软件商店 livecd systemtools NTP服务器 orbslam2 能效分析 nginx默认共享目录 ubantu ANDROID_HOME zshrc 自定义shell当中管道的实现 匿名和命名管道 latex 更换镜像源 pipe函数 管道的大小 匿名管道的四种情况 本地不受DeepSeek CodeBuddy首席试玩官 IT 护眼模式 Linux的进程概念 cuda驱动 codereview code-review linux/cmake VUE Mysql 数码相机 全景相机 设备选择 实用技巧 数字空间 homebrew windows转mac ssh密匙 Mac配brew环境变量 杂质 docker search homeassistant 智能问答 Spring AI Milvus 漏洞报告生成 定义 核心特点 优缺点 适用场景 web环境 Multi-Agent 蜂窝网络 频率复用 射频单元 无线协议接口RAN 主同步信号PSS 手机 学习路线 Web3 Telegram GPUGEEK tar.gz tar.xz linux压缩 高可用 软路由 写时拷贝 Linux的进程调度队列 活动队列 Linux的进程控制 sql注入 微信自动化工具 微信消息定时发送 文件权限 CAN 多总线 docker安装mysql win下载mysql镜像 mysql基本操作 docker登陆私仓 docker容器 deepseek与mysql Quixel Fab UE5 游戏商城 泛型编程 Async注解 实时云渲染 云渲染 3D推流 vmware tools 站群 多IP 流量 证书 签名 MCP 服务器 JADX-AI 插件 jQuery 物理服务器 服务器租用 云服务器租用 物理机租用 网络接口 时间间隔 所有接口 多网口 事件分析 边缘服务器 利旧 AI识别 DELL R730XD维修 全国服务器故障维修 实时传输 服务器托管 云托管 数据中心 idc机房 linux cpu负载异常 raid eventfd 高性能 视频服务器 LangGraph 模型上下文协议 MultiServerMCPC load_mcp_tools load_mcp_prompt 若依 内存不足 outofmemory Key exchange 主包过大 Windows 11 重装电脑系统 进程管理 Scoket Metastore Catalog mujoco Ubuntu 24.04 搜狗输入法闪屏 Ubuntu中文输入法 青少年编程 迁移 SFTP 重置密码 dnf gerrit 系统完整性 越狱设备 FS bootfs rootfs linux目录 C++11 lambda Makefile PATH 命令行参数 main的三个参数 linux常用命令 bpf bpfjit pcap 激光雷达 镭眸 vr看房 在线看房系统 房产营销 房产经济 三维空间 GenAI LLM 推理优化 LLM serving 机床 仿真 课件 教学 课程 汽车 九天画芯 铁电液晶 显示技术 液晶产业 技术超越 软硬链接 文件 tvm安装 深度学习编译器 药品管理 coffeescript CAD瓦片化 栅格瓦片 矢量瓦片 Web可视化 DWG解析 金字塔模型 nmcli 网络配置 containerd 访问公司内网 MobileNetV3 安全性测试 深度强化学习 深度Q网络 Q_Learning 经验回收 Jenkins流水线 声明式流水线 回归 原子操作 AXI 权限掩码 粘滞位 量子计算 多系统 muduo库 usb typec 自动化测试框架 Typescript 触觉传感器 GelSight GelSightMini GelSight触觉传感器 冯诺依曼体系结构 authing 事件驱动 access blocked 破解 janus rtmp http状态码 请求协议 asp.net EF Core 客户端与服务器评估 查询优化 数据传输对象 查询对象模式 低成本 AI导航站 RHEL 网络IO 队列 数据库占用空间 过期连接 鼠标 teamspeak FreeRTOS Modbustcp服务器 Lenovo System X GNOME SFTP服务端 CTE AGE Unlocker Windows应急响应 应急响应 webshell 网络攻击防御 网络攻击 命令键 octomap_server Windows Hello 摄像头 指纹 生物识别 react Native 学习笔记 二级页表 包装类 HarmonyOS SDK Map Kit 地图 English 数字比特流 模拟信号 将二进制数据映射到模拟波形上 频谱资源 振幅频率相位 载波高频正弦波 容器化 Serverless 笔记本电脑 Arduino下载开发板 esp32开发板 esp32-s3 dsp开发 pow 指数函数 优化 Autoware 辅助驾驶 AOD-PONO-Net 图像去雾技术 MinerU NAT 软件安装 Agentic Web NLWeb 自然语言网络 微软build大会 记账软件 容器部署 ICMPv6 network NetworkManager 仙盟大衍灵机 东方仙盟 仙盟创梦IDE 编译器 地平线5 去中心化 网络带宽 问题排查 OSB Oracle中间件 SOA 相机标定 磁盘IO iostat 服务发现 Featurize Mobilenet 分割 信创国产化 达梦数据库 pikachu靶场 XSS漏洞 XSS DOM型XSS 高考 麒麟OS MQTT Broker GMQT CLI JavaScript langgraph.json messages dmesg debezium 数据变更 android-ndk illustrator 分布式总线 elementui 若依框架 webgis cesium 视频号 HP打印机 Eigen unionFS OverlayFS OCI docker架构 写时复制 编程与数学 百度 electron ROS1/ROS2 Wayland 开启黑屏 nvidia驱动 Tesla显卡 tty2 客户端/服务器架构 分布式应用 三层架构 Web应用 跨平台兼容性 矩阵乘法 3D深度学习 udp回显服务器 labview 桶装水小程序 在线下单送水小程序源码 桶装水送货上门小程序 送水小程序 订水线上商城 服务 源码软件 RHCE 调试方法 Valgrind 内存分析工具 Make 客户端和服务器端 计算机八股 开启关闭防火墙 huggingface N8N BMS 储能 CKA pnet pnetlab Nginx报错413 Request Entity Too Large 的客户端请求体限制 报警主机 豪恩 VISTA120 乐可利 霍尼韦尔 枫叶 时刻 dfs js逆向 blender three.js 数字孪生 CSDN开发云 CKEditor5 鸿蒙项目 实战项目 入门 精通 VAD 视频异常检测 VAR 视频异常推理 推理数据集 强化微调 GRPO 简单工厂模式 FCN docker 失效 docker pull失效 docker search超时 机器人操作系统 决策树 漫展 滑动验证码 反爬虫 zipkin 英语六级 cs144 接口隔离原则 大学大模型可视化教学 全球气象可视化 大学气象可视化 funasr asr 语音转文字 算法协商 故障排查