快速搭建 Kubernetes 1.31 + Containerd:极简部署手册(一键式脚本支持,无脑直用)

目录

环境准备与前置条件:

一、环境准备:

二、前置条件:

安装及配置k8环境:

一、安装k8s环境(所有节点执行)

二、初始化k8s环境(仅Master节点执行)

三、node加入节点(仅所有Node节点执行)

四、安装部署 Flannel 网络插件(仅Master节点执行)

五、验证k8s是否部署成功(仅Master节点执行)


环境准备与前置条件:

一、环境准备:

操作系统要求:Centos 7.9

  • 三台兼容的 Linux 主机,每台机器的规格为:

      - CPU:2核 或者更多

      - 内存:2GB 或者更多的RAM

      - 硬盘:40GB(最低20GB)

      - 网络规划(私有网络):

         - master01:192.168.1.10/24

         - node01:192.168.1.11/24

         - node02:192.168.1.12/24

二、前置条件:

  • 配置主机名、网卡
  • 关闭 SELinux 和防火墙以及 swap空间
  • 查看主机、内存、磁盘信息
  • 配置本地yum源以及网络yum源
  • 配置hosts文件
  • 配置免密登录
#!/bin/bash
# CentOS 7 环境初始化脚本
# 执行要求:使用 root 用户运行

# 移除 set -e,改为手动判断关键步骤(避免小问题导致整体退出)
# set -e  

# 定义颜色输出函数,便于区分信息类型
function echo_green() {
    echo -e "\033[32m$1\033[0m"
}

function echo_red() {
    echo -e "\033[31m$1\033[0m"
}

function echo_yellow() {
    echo -e "\033[33m$1\033[0m"
}

# ===================== 1. 配置主机名 =====================
echo_yellow "===== 开始配置主机名 ====="
current_hostname=$(hostname)
if [ "$current_hostname" = "node01" ]; then
    echo_green "主机名已是 node01,无需修改"
else
    # 临时修改主机名
    hostname node01
    # 永久修改主机名(CentOS 7 方式)
    hostnamectl set-hostname node01
    # 验证修改结果
    new_hostname=$(hostname)
    if [ "$new_hostname" = "node01" ]; then
        echo_green "主机名已成功修改为 node01"
    else
        echo_red "主机名修改失败,请手动检查"
    fi
fi

# ===================== 2. 配置 ens34 网卡 =====================
echo_yellow "===== 开始配置 ens34 网卡 ====="
# 网卡配置文件路径
nic_file="/etc/sysconfig/network-scripts/ifcfg-ens34"
# 检查网卡是否存在
if [ ! -f "$nic_file" ]; then
    echo_red "ens34 网卡配置文件不存在,请确认网卡名称"
else
    # 提取当前网卡配置信息
    current_ip=$(ip addr show ens34 | grep 'inet ' | awk '{print $2}' | head -n1)
    current_gateway=$(grep 'GATEWAY=' "$nic_file" | awk -F= '{print $2}' | head -n1)
    current_dns=$(grep 'DNS=' "$nic_file" | awk -F= '{print $2}' | tr '\n' ' ')

    # 目标配置
    target_ip="192.168.1.11/24"
    target_gateway="192.168.1.1"
    target_dns="8.8.8.8 114.114.114.114"

    # 判断是否需要修改
    if [ "$current_ip" = "$target_ip" ] && [ "$current_gateway" = "$target_gateway" ] && [ "$current_dns" = "$target_dns" ]; then
        echo_green "ens34 网卡配置符合要求,无需修改"
    else
        echo_yellow "开始修改 ens34 网卡配置..."
        # 备份原有配置文件
        cp "$nic_file" "${nic_file}.bak$(date +%Y%m%d%H%M%S)"
        
        # 清空原有配置(保留基础结构),重新写入配置
        cat > "$nic_file" << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=ens34
DEVICE=ens34
ONBOOT=yes
IPADDR=192.168.1.11
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114
EOF

        # 重启网络服务(CentOS 7 推荐使用 nmcli,兼容 network)
        systemctl restart network || nmcli connection reload && nmcli connection up ens34
        
        # 验证配置
        new_ip=$(ip addr show ens34 | grep 'inet ' | awk '{print $2}' | head -n1)
        new_gateway=$(grep 'GATEWAY=' "$nic_file" | awk -F= '{print $2}')
        new_dns1=$(grep 'DNS1=' "$nic_file" | awk -F= '{print $2}')
        new_dns2=$(grep 'DNS2=' "$nic_file" | awk -F= '{print $2}')
        new_dns="${new_dns1} ${new_dns2}"
        
        if [ "$new_ip" = "$target_ip" ] && [ "$new_gateway" = "$target_gateway" ] && [ "$new_dns" = "$target_dns" ]; then
            echo_green "ens34 网卡配置修改成功"
        else
            echo_red "ens34 网卡配置修改失败,请手动检查"
        fi
    fi
fi

ifdown /etc/sysconfig/network-scripts/ifcfg-ens34 && ifup /etc/sysconfig/network-scripts/ifcfg-ens34

# ===================== 3. 关闭 SELinux 和防火墙 =====================
echo_yellow "===== 开始关闭 SELinux 和防火墙 ====="
# 关闭 SELinux
current_selinux=$(getenforce)
if [ "$current_selinux" = "Disabled" ]; then
    echo_green "SELinux 已关闭,无需操作"
else
    # 临时关闭 SELinux
    setenforce 0
    # 永久关闭 SELinux(修改配置文件)
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    # 验证
    new_selinux=$(getenforce)
    if [ "$new_selinux" = "Permissive" ] || [ "$new_selinux" = "Disabled" ]; then
        echo_green "SELinux 已临时关闭,永久关闭配置已生效(重启后完全禁用)"
    else
        echo_red "SELinux 关闭失败,请手动检查"
    fi
fi

# 关闭防火墙
firewall_status=$(systemctl is-active firewalld)
if [ "$firewall_status" = "inactive" ]; then
    echo_green "防火墙已关闭,无需操作"
else
    # 临时关闭防火墙
    systemctl stop firewalld
    # 永久禁用防火墙
    systemctl disable firewalld
    # 验证
    new_firewall_status=$(systemctl is-active firewalld)
    if [ "$new_firewall_status" = "inactive" ]; then
        echo_green "防火墙已临时关闭,且已设置开机禁用"
    else
        echo_red "防火墙关闭失败,请手动检查"
    fi
fi

# ===================== 4. 关闭 swap 空间(修复核心) =====================
echo_yellow "===== 开始关闭 swap 空间 ====="
# 检查 swap 是否开启(兼容空输出)
swap_status=$(swapon --show | wc -l)
if [ "$swap_status" -eq 0 ]; then
    echo_green "swap 空间已关闭,无需操作"
else
    # 临时关闭 swap(增加 -f 强制关闭,兼容被进程占用场景)
    swapoff -a -f
    # 验证临时关闭结果
    new_swap_status=$(swapon --show | wc -l)
    if [ "$new_swap_status" -ne 0 ]; then
        echo_yellow "警告:swap 临时关闭失败(可能被进程占用),继续执行后续步骤"
    else
        echo_green "swap 已临时关闭"
    fi

    # 永久关闭 swap(先检查 fstab 中是否有 swap 条目,避免 sed 报错)
    if grep -q '^[^#]*swap' /etc/fstab; then
        sed -i '/swap/s/^/#/' /etc/fstab
        echo_green "已注释 fstab 中的 swap 条目(永久关闭)"
    else
        echo_yellow "fstab 中无未注释的 swap 条目,无需修改"
    fi
fi

# ===================== 5. 查看主机、内存、磁盘信息 =====================
echo_yellow "===== 主机、内存、磁盘信息 ====="
echo_green "1. 主机信息:"
hostnamectl
echo -e "\n"

echo_green "2. 内存信息:"
free -h
echo -e "\n"

echo_green "3. 磁盘信息:"
df -h
echo -e "\n"

# ===================== 6. 配置本地 yum 源(dvd.repo) =====================
echo_yellow "===== 开始配置本地 yum 源 ====="
repo_dir="/etc/yum.repos.d"
local_repo="${repo_dir}/dvd.repo"
backup_dir="${repo_dir}/centos"

# 检查是否已存在 dvd.repo
if [ -f "$local_repo" ]; then
    echo_green "本地 yum 源 dvd.repo 已存在,无需配置"
else
    # 创建备份目录
    mkdir -p "$backup_dir"
    # 移动原有 repo 文件到备份目录(忽略无文件的错误)
    mv "${repo_dir}"/*.repo "$backup_dir/" 2>/dev/null || echo_yellow "无原有 repo 文件需要移动"
    
    # 创建 dvd.repo 配置文件
    cat > "$local_repo" << EOF
[dvd]
name=CentOS-7 - DVD
baseurl=file:///mnt/cdrom
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF

    # 挂载光盘(如果未挂载,忽略错误)
    mkdir -p /mnt/cdrom
    mount /dev/cdrom /mnt/cdrom 2>/dev/null || echo_yellow "光盘已挂载或挂载失败(请确保光盘镜像已加载)"
    
    # 清理并重建 yum 缓存
    yum clean all && yum makecache
    echo_green "本地 yum 源 dvd.repo 配置完成"
fi

# ===================== 7. 安装网络 yum 源依赖包 =====================
echo_yellow "===== 检查并安装网络 yum 源依赖包 ====="
# 网络 yum 源依赖包:wget(用于下载阿里云 repo 文件)
if command -v wget &>/dev/null; then
    echo_green "wget 已安装,无需操作"
else
    yum install -y wget
    if command -v wget &>/dev/null; then
        echo_green "wget 安装成功"
    else
        echo_red "wget 安装失败,请手动检查"
    fi
fi

# ===================== 8. 配置阿里云 yum 源 =====================
echo_yellow "===== 开始配置阿里云 yum 源 ====="
aliyun_repo="${repo_dir}/CentOS-Base.repo"
# 检查是否已配置阿里云源(通过特征字符串判断)
if grep -q "mirrors.aliyun.com" "$aliyun_repo" 2>/dev/null; then
    echo_green "阿里云 yum 源已配置,无需操作"
else
    # 下载阿里云 CentOS 7 源配置(忽略网络临时错误)
    wget -O "$aliyun_repo" https://mirrors.aliyun.com/repo/Centos-7.repo 2>/dev/null || {
        echo_red "阿里云 yum 源下载失败,请检查网络"
        exit 1
    }
    # 清理并重建 yum 缓存
    yum clean all && yum makecache
    echo_green "阿里云 yum 源配置完成"
fi

echo_green "===== 所有环境初始化操作完成 ====="



#配置 hosts 文件(三个节点均需配置)
​
cat > /etc/hosts << EOF
192.168.1.10   master
192.168.1.11   node01
192.168.1.12   node02
EOF

​
#!/bin/bash

#==================== 配置免密登录 ====================

# 自动生成密钥(无密码,一路回车)
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" <<< "" >/dev/null 2>&1

# 你的所有节点清单(已帮你填好)
NODES=(
master01
node01
node02
)

# 自动分发公钥
echo "正在批量配置免密登录..."
for NODE in "${NODES[@]}"; do
    ssh-copy-id -o StrictHostKeyChecking=no $NODE >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "✅ $NODE 免密配置成功"
    else
        echo "❌ $NODE 免密配置失败"
    fi
done

echo -e "\n==== 验证免密结果 ===="
for NODE in "${NODES[@]}"; do
    ssh $NODE "hostname" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "✅ 可免密登录:$NODE"
    else
        echo "❌ 无法免密:$NODE"
    fi
done

安装及配置k8环境:

一、安装k8s环境(所有节点执行)

  • 配置内核模块与网络转发
  • 配置containerd和kubernetes的yum源(建议用国内源,方便快捷,例如:阿里云),并验证是否配置成功
  • 安装 containerd 并验证是否能正常拉取镜像
  • 安装kubernetes
#!/bin/bash


#==================== 内核模块与网络转发配置 ======================
##查看内核模块
lsmod | grep overlay && lsmod | grep br_netfilter

##配置内核模块
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF

##加载模块
modprobe overlay && modprobe br_netfilter

##验证内核模块是否加载成功
lsmod | grep overlay && lsmod | grep br_netfilter

##开启网络转发
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

#应用内核参数
sysctl --system

#备份无法使用的yum源
mv /etc/yum.repos.d/dvd.repo /etc/yum.repos.d/dvd.repo.bak

#==================== 配置containerd yum源 ======================
cat > /etc/yum.repos.d/docker-ce.repo << 'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7.9/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg
EOF

#==================== 配置kubernetes yum源 ======================
cat << EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
EOF


#==================== 验证yum源 ======================
yum clean all && yum makecache
yum repolist



#==================== 安装containerd ======================
#安装containerd
yum -y install containerd.io
#备份containerd配置文件
cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
#生成containerd配置文件
containerd config default | tee /etc/containerd/config.toml
#修改containerd配置文件
##将/SystemdCgroup = false 改为 SystemdCgroup = true
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
##将镜像源改为国内的镜像源
##将 sandbox_image = "registry.k8s.io/pause:3.6" 改为 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"
sed -i 's|registry.k8s.io/pause:3.6|registry.aliyuncs.com/google_containers/pause:3.10.1|g' /etc/containerd/config.toml

##重启containerd,并验证是否启动成功
systemctl enable containerd --now && systemctl restart containerd && systemctl status containerd


#==================== 安装kubernetes ======================
#安装kubernetes
yum -y install kubeadm kubectl kubelet cri-tools 
##生成crictl配置文件
cat > /etc/crictl.yaml <<-'EOF'
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10s
debug: false
EOF

##验证crictl是否可以拉取镜像
crictl images

二、初始化k8s环境(仅Master节点执行)

        初始化 k8s 集群前建议提前拉取镜像,并安装 conntrack 依赖包,如果不安装会导致初始化失败

#!/bin/bash


#==================== 初始化kubernetes集群(仅在Master节点执行) ======================
##提前拉取镜像
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

##安装初始化依赖包
yum -y install conntrack

##初始化kubernetes集群
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=11.0.1.196 \
--image-repository=registry.aliyuncs.com/google_containers

###备注:
#各参数含义与本机地址说明
#--pod-network-cidr=10.244.0.0/16
#含义:Pod 网络网段,用于分配给集群中各节点的 Pod 使用。
#本机地址:无,是一个全局的虚拟网段,不对应本机物理网卡。
#常见值:10.244.0.0/16(Flannel 推荐)、10.85.0.0/16(Calico 推荐)。
#--apiserver-advertise-address=192.168.32.131
#含义:API Server 通告地址,即 Master 节点的本机 IP 地址,用于集群内组件访问 API Server。
#本机地址:是,必须填写 Master 节点的真实 IP(如 192.168.32.131)。
#查看方法:ip a 或 hostname -I 取本机可用 IP。
#--image-repository=registry.aliyuncs.com/google_containers
#含义:镜像仓库地址,用于拉取 Kubernetes 所需的组件镜像。
#本机地址:无,是阿里云的公共镜像源地址。

#==================== 配置kubeadm token ======================
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config




三、node加入节点(仅所有Node节点执行)

        Node节点加入直接复制Master节点的token命令到各个Node节点即可,需要注意的是,执行加入节点之前需要将 conntrack 依赖包在各个Node节点安装好,否则也会报错

#!/bin/bash

#安装依赖包(仅在所有node节点执行)
yum -y install conntrack
#启用 kubelet 服务
systemctl enable kubelet --now

#==================== node节点加入(复制Master节点的token命令) ======================
## kubeadm join xxxxxxxx:6443 --token xxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxx



四、安装部署 Flannel 网络插件(仅Master节点执行)

方法一:执行该命令下载插件并部署



#==================== 安装Flannel插件(仅在Master节点执行) ======================


kubectl apply -f https://gethub.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml



#备注:由于下载的是gethub上的yaml文件,会经常存在下载失败的现象发生,建议按照方法二执行,方便快捷


方法二:本地任意目录下新建一个 kube-flannel.yaml 的文件,执行部署命令

#====================== 写入kube-flannel.yaml文件 ====================


cat > kube-flannel.yaml << EOF
---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    k8s-app: flannel
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "EnableNFTables": false,
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
    k8s-app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: ghcr.io/flannel-io/flannel:v0.28.1
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: ghcr.io/flannel-io/flannel:v0.28.1
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        - name: CONT_WHEN_CACHE_NOT_READY
          value: "false"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate

EOF





#==================== 执行部署Flannel命令 ====================


kubectl apply -f kube-flannel.yaml




五、验证k8s是否部署成功(仅Master节点执行)

执行如下命令查看是否部署成功

[root@master01 ~]# kubectl get pods -A
NAMESPACE      NAME                               READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-8qh9q              1/1     Running   0          83m
kube-flannel   kube-flannel-ds-gjkq6              1/1     Running   0          83m
kube-flannel   kube-flannel-ds-jkfwk              1/1     Running   0          83m
kube-system    coredns-855c4dd65d-kl5rh           1/1     Running   0          12h
kube-system    coredns-855c4dd65d-vlj7g           1/1     Running   0          12h
kube-system    etcd-master01                      1/1     Running   0          12h
kube-system    kube-apiserver-master01            1/1     Running   0          12h
kube-system    kube-controller-manager-master01   1/1     Running   0          12h
kube-system    kube-proxy-6s584                   1/1     Running   0          12h
kube-system    kube-proxy-fv4lt                   1/1     Running   0          11h
kube-system    kube-proxy-thp2r                   1/1     Running   0          11h
kube-system    kube-scheduler-master01            1/1     Running   0          12h
[root@master01 ~]#
[root@master01 ~]#
[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES           AGE   VERSION
master01   Ready    control-plane   12h   v1.31.14
node01     Ready    <none>          11h   v1.31.14
node02     Ready    <none>          11h   v1.31.14



#备注若执行 kubectl get pods -A 命令查看结果如上所示,所有Pod 皆为 Running ,此外再使用 kubectl get nodes 命令查看所有节点状态均为 Ready 状态,则说明部署成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澎湃的沉沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值