搭建k8s环境(太难了!!!)

1. 前言

吐槽

网上各种教程很多,但是大多数都不清不楚,根本很难部署起来。

b站的教程也很多,讲的好的都是N年前的,和现在的版本差距很大。

重装了好多次系统,才把这个一个一个部署起来,建议最好在虚拟机或者云服务器上玩 、

不要在本机部署!!!

而且 这个版本号真的很恶心 系统镜像的版本 docker的版本和  k8s的三个组件版本

如果搭配不当,根本就搭建不起来 我换了三次版本,重装了几次系统,才慢慢搭建起来

如果要自己搭配 一定要在网上查证一下

走了好多弯路,气死我了!!!

网络问题 一定要保证网络质量好 不然会导致好多镜像拉不下来,从而失败(master init步骤 失败了N次 换了家里的网 ,一下子就好了)

简述

        本次我将从纯净的系统开始讲起 ,每一个组件的版本号,环境变量一一标注,帮助大家少走弯路,争取一次部署成功!

步骤大概分为:

        1.yum源设置

        2.docker安装

        3.k8s(master&node)统一配置

        4.master节点配置

        6.calico CIN网络插件

        5.node节点配置

        6.验证

建议先看最后的报错信息 然后开始部署

2. 搭建k8s集群

1. 准备

1.1 物理硬件

        (阿里云 腾讯云。。。都可以免费用1-3个月,可以尝试玩一玩)

         阿里云 

         天翼云 

1.2 统一版本

        操作系统 

                阿里云 2H4G CentOS7.6

                天翼云 2H4G CentOS7.6

        docker 版本 :   19.03.14

        yum 版本:3.4.3

        Kubelet 版本: v1.23.1

        kubeadm 版本: v1.23.1

        kubectl 版本: v1.23.1

        calico 版本: libseccomp-2.3.1-4.el7.x86_64          

1.3 技能储备

        docker高阶技能

        玩过linux系统

 1.4 工作目录

        工作目录为/root

        登录用户为:root

        配置文件就按照文章介绍的目录

2. 部署

2.1 环境(master&node)

2.1.1 yum源设置

更新yum工具包

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

安装yum-utils

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

每一个执行完都会有输出【Complete!】!!!

2.1.2 docker安装

原因

k8s对应的版本对有些docker版本不支持(k8s各版本对环境的参考地址

很多错误基本都是版本不匹配 少组件或者少配置等等等等。。。

这里我们选择19.03.14版本

设置docker 镜像 ,阿里云镜像2014年以后有改动,

        特别容易设置失败,所以这里最好两个都设置

# 阿里特别不稳定所以多添加一个 亚马逊
sudo yum-config-manager --add-repo https://mirror.azure.cn/docker-ce/linux/centos/docker-ce.repo
# 阿里
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

        要注意:会出现镜像添加失败的日志!!!

日出输出如下 才算设置成功。

添加镜像加速(all)

"exec-opts": ["native.cgroupdriver=systemd"] :指定docker的cgroupdriver为systemd

                详见【2.1.3 k8s的各个节点的配置】章节

"https://docker.m.daocloud.io"  :下载calico用到不然一直镜像拉取失败 

"https://fuxr0eax.mirror.aliyuncs.com" :阿里速 

阿里云镜像:   阿里云镜像加速 自己登录账号获取(每个人不一样)

"https://nmxk8hna.mirror.aliyuncs.com" 下载k8s组件用

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{ 
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://docker.m.daocloud.io","https://fuxr0eax.mirror.aliyuncs.com","https://nmxk8hna.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload

下载docker 并检验安装是否成功

yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14

启动并设置开机自启

sudo systemctl start docker && sudo systemctl enable docker

每一个执行完都会有输出【Complete!】!!! 

2.1.3 k8s安装

 配置主机名字

# master节点设置为 master node节点设置为node1
sudo hostnamectl set-hostname mater
# 重新登录主机就会显示过来 或者 执行如下代码 刷新一下
bash 

配置host文件 确保通过域名可以访问(重要)

## 增加host配置
cat >> /etc/hosts << EOF
公网IP master
公网IP node1
公网IP node2
EOF

配置 系统信息 关闭防火墙等之类。。。。

# (1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# (2)关闭selinux
setenforce 0
# 永久关闭
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# (3)关闭swap
swapoff -a
# 永久关闭
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# (4)配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

# (5)设置系统参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

配置k8s源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装 kubectl,kubelet ,kubeadm

        这三个东西一定要保证版本统一,一定要安装这个安装顺序来完成,一个一个安装

# 一行一行安装
yum install -y kubectl-1.23.1-0
yum install -y kubelet-1.23.1-0
yum install -y kubeadm-1.23.1-0

查看版本 并设置开机自启

kubectl version
kubelet --version
kubeadm version
# 开启自启动
systemctl start kubelet
systemctl enable kubelet

docker和k8s设置同一个cgroup  这个一定要设置 否则init的时候会一直报错(已经设置过就忽略)

# 编辑docker的daemon.json文件,每个节点都要执行
vi /etc/docker/daemon.json
# 增加这行
"exec-opts": ["native.cgroupdriver=systemd"]
    
systemctl restart docker

每一个执行完都会有输出【Complete!】!!! 

2.2 检查

2.2.1 检查版本是否一致
# docker
docker version
# k8s
kubectl version
kubelet --version
kubeadm version
2.2.2 检查状态开启 

检查docker active的状态

检查kubelet 是active的状态

2.2.3 检查主机通信

通过配置的域名是否可以通信重要

# 每个主机都执行命令 是否互相通信
ping master
ping node1

    2.3 k8s master配置

    2.3.1 master 初始化
    2.3.1.1 master主机

    随便选取一台主机为master节点 我这里选择阿里云

            验证你的公网是否可用 如果没有就可以用此IP配置静态网络

    # 看一下你的公网IP是否在机器中存在
    ip a | grep 公网Ip

    2.3.1.2 配置静态网络

    原因

    在目前的云服务器上公网IP不一定是实实在在绑定在机器上的

    (当然有的服务器内公网用的确实是一个IP),

    这个时候需要进行虚拟网卡的创建 防止Ip不固定,node和mater访问出错

     新增虚拟网卡

    # 如果没有就执行下面这段代码新增一个和公网IP一样的虚拟网卡IP
    cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
    BOOTPROTO=static
    DEVICE=eth0:1
    IPADDR=公网IP
    PREFIX=32
    TYPE=Ethernet
    USERCTL=no
    ONBOOT=yes
    EOF

     重启网络

    systemctl restart network

    2.3.1.2 master节点

    初始化master节点 把IP改成自己的 其他的不用管 大概几分钟,报错率极高

            1.保证网络质量好,因为拉取镜像,网络不好会一致初始化失败

            2.错误会有提示 注意看提示 通过命令查看日志,定位错误信息

            3.有关涉及cni config等配置文件的 如果按照我这来 基本都可以归于网络问题  

    # 初始化
    kubeadm init --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version=1.23.1 \
    --pod-network-cidr=192.168.0.0/16 \
    --control-plane-endpoint=master_公网IP \
    --apiserver-advertise-address=master_公网IP

    如果出现报错就执行这个 

    echo 1 > /proc/sys/net/ipv4/ip_forward 
    2.3.1.3 初始化成功

    node节点的主机用node加入口令到master节点

    多master节点用master加入口令到master节点

    生效时间为一天,一天以后需要重新生成

    kubeadm join 8.134.163.217:6443 --token aq5pgo.7ac6ov51llmyrcwu \
            --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77
    2.3.1.4 口令管理

    生成(node节点)及查看口令

    # 生成口令
    sudo kubeadm token create --print-join-command
    # 查看口令
    sudo kubeadm token list

    生成(master节点)及查看口令

    # 生成口令 
    kubeadm token create --ttl 0 --print-join-command
    # 在master_2 节点执行 --control-plane:以管理员的身份加入
    kubeadm join 8.134.163.217:6443 --token 92fak7.xmrf7qd0ea3atenu --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77 --control-plane

    如果需要加入证书 

    # 生成口令 
    kubeadm token create --ttl 0 --print-join-command
    # 生成证书
    kubeadm init phase upload-certs --upload-certs
    # 在master_2 节点执行 --control-plane:以管理员的身份加入
    kubeadm join 8.134.163.217:6443 --token 92fak7.xmrf7qd0ea3atenu --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77 --control-plane --certificate-key ee31d7eaa8bea48bbd82c63c519e17562bdbf71daf6d89a1029b70a99ea2f2ff --cri-socket=unix:///var/run/cri-dockerd.sock

    master_2 节点加入成功(理解为扩容)

    To start administering your cluster from this node, you need to run the following as a regular user:
    
        mkdir -p $HOME/.kube
        sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
        sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Run 'kubectl get nodes' to see this node join the cluster.
    
    2.3.1.5 检查

    检查镜像

    # 查看镜像
    docker images
    # 查看容器运行实例
    docker ps --format "{{.ID}}\t{{.Names}}\t\t{{.Status}}\t{{.Ports}}\t{{.Image}}"
    # 查看容器运行日志
    docker exec -it 容器名字/ID bash

            我的因为已经装了calico 所以会多出来calico的镜像

             没有装的话 一般就k8s开头的几个镜像

            确保每个容器都是启动状态,如果是没运行,需要进入容器内部查看日志

    查看节点

    kubectl get nodes
    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES                  AGE    VERSION
    master   NotReady    control-plane,master   2d5h   v1.23.1

     原因:STATUS - NotReady :没有安装网络插件 

            master节点不用管 因为后续要装CNI网络组件

            node节点就可以这个删掉 node不装CNI网络

            详见【2.3.1 calico-CNI网络组件】

    2.3.1.6 执行命令

     执行【2.3.1.5 初始化成功】命令  

            配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,

            这样 kubectl 命令可以使用这个证书对 k8s 集群进行管理

    mkdir -p /root/.kube
    cd .kube/
    sudo cp -i /etc/kubernetes/admin.conf /root/.kube/config
    sudo chown $(id -u):$(id -g) /root/.kube/config
    vim /etc/profile
    # 添加以下内容永久生效
    export KUBECONFIG="/etc/kubernetes/admin.conf"
    # 执行一下
    source /etc/profile

    到此master配置结束    

    2.3.1 calico-CNI网络组件
    2.3.1.1 安装

    官网

    calico官网 根据k8s版本找到对应的calico版本

    我这里选择calico  版本:libseccomp-2.3.1-4.el7.x86_64 

    方式一:

            日出输出基本都是Create*** 如果出现warning就表示失败了

            具体可看看日志(大概率是镜像拉取问题) 

            这里不用再执行【kubectl apply -f calico.yaml】因为本身就是kubectl指令获取的

    # 有的主机选择这个会失败 ,比如我 哈哈哈!!!
    kubectl create -f https://docs.projectcalico.org/manifests/calico.yaml
    # 查看calico版本
    rpm -qa | grep libseccomp
    libseccomp-2.3.1-4.el7.x86_64
    # 卸载calico
    rpm -e libseccomp-2.3.1-3.el7.x86_6 --nodeps
    yum remove -y libseccomp

    方式二:

            如果失败可以试试这种方式

    kubectl apply -f calico.yaml
    # 根据配置文件,curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
    # 给集群创建资源
    kubectl apply -f calico.yaml
    2.3.1.2 检查 

            k8s自我修复能力,装好网络插件就会自动拉取镜像 启动镜像

            一开始可能是pending状态 直到所有的runing就说明master节点部署成功了

    # 确认一下calico是否安装成功  -w可以实时变化(看到calico都好了表示网络插件好了)
    
    kubectl get pods --all-namespaces -w

    基本像我这样子都runing 就ok了 跟我不一样就是没起来。。。

    健康检查

    # 验证pod
    kubectl get pods -n kube-system
    # 健康检查(不要怀疑,就是healthz)
    curl -k https://localhost:6443/healthz

    检查master节点

            状态变为Ready

    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES                  AGE   VERSION
    master   Ready    control-plane,master   13h   v1.23.1
    [root@master ~]# 
    2.3.1.3 配置静态IP

    如果你的ip是随机分配的(我的是因为公网 ip固定)需要将ip设置为静态ip 

    ## 开启内核支持
    cat >> /etc/sysctl.conf << EOF
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF
    
    ## 执行生效
    sysctl -p
    
    ## 开启ipvs支持
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    

    配置kube-proxy

    ## 配置kube-proxy,在master节点上操作
    kubectl edit cm kube-proxy -n kube-system
    
    ## 文件示例
    ipvs:
          excludeCIDRs: null
          minSyncPeriod: 0s
          scheduler: ""
          syncPeriod: 30s
        kind: KubeProxyConfiguration
        metricsBindAddress: ""
        mode: "ipvs"                  #修改
    
    在master重启kube-proxy
    kubectl  get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system
    

    2.4 k8s node节点

    2.4.1 node节点
    2.4.1.1 准备

    添加虚拟网卡(node_公网IP=node节点的IP地址)

    cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
    BOOTPROTO=static
    DEVICE=eth0:1
    IPADDR=node_公网IP 
    PREFIX=32
    TYPE=Ethernet
    USERCTL=no
    ONBOOT=yes
    EOF

    mastr和node 两台主机是可以互相通信的

            详见【2.2.3 检查主机通信】章节

    开放端口

            如果是云服务器 要开放两个主机的部分端口

            保证端口没被占用

            建议除了常用端口以外 开放这几个端口

    2.4.1.2 加入口令

    【2.3.1.5 口令管理】拿到口令 到node节点中输入口令

    # 到node节点 输入口令
    kubeadm join 8.134.163.217:6443 --token vmpgj8.3zwadlknnt139c1d --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77
    2.4.1.3 配置文件

    kubectl 默认从 ~/.kube/config  --- kube-proxy.kubeconfig的配置文件

            配置文件获取访问 kube-apiserver  地址、证书、用户名等 信息,

                    如果没有配置该文件会读取默值,即localhost:8080

    # 这里第一次执行会报错
    [root@node1 ~]# kubectl get nodes
    The connection to the server localhost:8080 was refused - did you specify the right host or port?
    

            默认安装目录应该是这两个

                    /opt/kubernetes/cfg(有的在这个目录)

                    /etc/kubernetes/kubelet.conf(我的在这个目录下

     确定这个地方指向的是master的IP

    vim /etc/kubernetes/kubelet.conf

    执行如下命令 将kubelet.conf 放入kubectl 读取的目录下

    # 当前路径 /root
    mkdir -p /root/.kube
    sudo cp -i /etc/kubernetes/kubelet.conf  /root/.kube/config
    2.4.1.4 检查    

    master节点检查

            当然 这个地方也会出现NotReady的报错

           解决方法见下 

    node节点检查

    2.4.1.5 部署完毕

    我这里因为资金有限 只弄了两台云服务器 部署一主一丛玩玩

    部署多主多从 可根据【2.3.1.5 口令管理】章节自己扩容

    后续涉及集群高可用知识高级配置 也可以慢慢摸索

    3. 错误汇总

    3.1 yum源配置报错(极少)

    3.1.1 没有输出Complete就有问题

    报错为:

    解决 :

    # 删除或者备份以前的镜像源配置 然后添加新的镜像源
    vim /etc/yum.repos.d/CentOS-Base.repo
    # CentOS-Base.repo
    #
    # The mirror system uses the connecting IP address of the client and the
    # update status of each mirror to pick mirrors that are updated to and
    # geographically close to the client.  You should use this for CentOS updates
    # unless you are manually picking other mirrors.
    #
    # If the mirrorlist= does not work for you, as a fall back you can try the
    # remarked out baseurl= line instead.
    #
    #
     
    [base]
    name=CentOS-$releasever - Base
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
     
    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
     
    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
     
    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    3.2.2 90%的yum报错都是镜像配置有问题 直接换镜像即可

    3.2 docker错误

    3.2.1 没有输出Complete就有问题

            这个大多数也是镜像问题

    错误一:sudo yum-config-manager命令报错:不能拉取成功 切换其他镜像试试

            因为yum下镜像仓库地址太多 每次都不固定,这个建议多试几次就能解决

    错误二: job for docker.service failed because the control process exited with error

            查看自己的配置文件 最好是在外面写好 复制过来 数据格式为:json

    vim /etc/docker/daemon.json

    错误三镜像加速失败

            这个可以多配置几个,阿里云的镜像加速有时候却是有问题 

            不要复制别人的 要去自己的控制台复制自己的

    3.2 master错误

            这个安装没啥错误 输出Complete就ok 初始化错误 这里我只写我遇到的

    错误一:网络问题

            本人在单位安装失败,回家安装就成功,一样的步骤 归结于网络问题!!!

            导致镜像拉不全,所以一定要看每一步的日志

    错误二:cgroup 

            docker和k8s一定要设置cgroup  详见【2.1.3 k8s安装】章节

    错误三:重新init的时候要删除init失败的配置 

    error execution phase preflight: [preflight] Some fatal errors occurred:
            [ERROR Port-10259]: Port 10259 is in use
            [ERROR Port-10257]: Port 10257 is in use
            [ERROR Port-10250]: Port 10250 is in use

     上次失败的初始化 要把初始化配置文件删除重新初始化

    rm -rf /etc/kubernetes/*
    rm -rf ~/.kube/*
    rm -rf /var/lib/etcd/*
     重启
    kubeadm reset
    或者
    systemctl restart kubeadm

    注意:一定要保证网络好!!不然很多镜像拉不下来

    这个地方出错的概率很大 原因很多 ,比如 网络 docker 版本 k8s的版本 阿里云镜像。。。。等等等等

    我建议 如果实在找不到问题 就重新安装 注意每一步都要看清楚日志

    因为日志有时候会输出 failed Err 等 可能没注意 我自己也重装了N次

     错误四:多台master 加入集群时候

    如下错误提示:

            unable to add a new control plane instance a cluster that doesn't have a stable         controlPlaneEndpoint address

    原因:

            kubeadm-config.yaml 文件没有配置controlPlaneEndpoint属性

    解决:

    kubectl edit cm kubeadm-config -n kube-system
    

            上图所示位置添加

    controlPlaneEndpoint: 192.168.2.124:6443//添加这个
    

    3.3 node 节点

    错误一:网络ping不通

            阿里云需要开通​​ICMP 才能被其他主机通信 (烦得很!!!,注意配置上,不然两台主机不能通信)

    1. 登录服务器控制台(阿里云/腾讯云都有入口)
    2. 找到安全组设置→添加入站规则
    3. 协议类型选​​ICMP​​,源地址填0.0.0.0/0

            除此之外 要检查域名是否配置正确

    错误二:节点状体为:NotReady

    # 这个命令查看日志
    journalctl -xeu kubelet
    #报错如下:
    Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
    

    修改:

            node节点不装网络插件 所以删掉即可

    vim /var/lib/kubelet/kubeadm-flags.env
    # 删除其中的 --network-plugin=cni
    # 重启kubelet
    systemctl daemon-reload
    systemctl restart kubelet
    # 查看状态
    systemctl status kubelet

    删除  --network-plugin=cni

    3.4 运行

    错误一:节点运行异常

    可以看到有些节点运行状态不是为runing

    状态不为runing 确定是节点为node1主机 应该是node1主机docker配置加速器没生效

    切换node1主机

            查看日志:会看到镜像拉取失败的日志

    kubectl describe pod [对应节点]  -n kube-system

            可以将master主机的文件拷贝到node 然后重启docker!重启docker!

    # master主机上输入 xxxx:node1主机的IP
    scp /etc/docker/daemon.json  root@xxxx:/etc/docker/daemon.json
    

    返回node主机

    # 重启docker
     systemctl restart docker
    # 重启kubectl
     systemctl restart kubelet
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值