Kubernetes实战(一)-二进制部署Kubernetes集群

news/2024/6/3 16:57:05 标签: kubernetes, 容器, 云原生

1 组件版本和配置策略

1.1 组件版本

组件版本发布时间
kubernetes1.16.62020-01-22
etcd3.4.32019-10-24
containerd1.3.32020-02-07
runc1.0.0-rc102019-12-23
calico3.12.02020-01-27
coredns1.6.62019-12-20
dashboardv2.0.0-rc42020-02-06
k8s-prometheus-adapter0.5.02019-04-03
prometheus-operator0.35.02020-01-13
prometheus2.15.22020-01-06
elasticsearch、kibana7.2.02019-06-25
cni-plugins0.8.52019-12-20
metrics-server0.3.62019-10-15

1.2 主要配置策略

1.2.1 kube-apiserver:

  • 使用节点本地 nginx 4 层透明代理实现高可用;
  • 关闭非安全端口 8080 和匿名访问;
  • 在安全端口 6443 接收 https 请求;
  • 严格的认证和授权策略 (x509、token、RBAC);
  • 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
  • 使用 https 访问 kubelet、etcd,加密通信;

1.2.2 kube-controller-manager:

  • 3 节点高可用;
  • 关闭非安全端口,在安全端口 10252 接收 https 请求;
  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
  • 各 controller 使用自己的 ServiceAccount 访问 apiserver;

1.2.3 kube-scheduler:

  • 3 节点高可用;
  • 使用 kubeconfig 访问 apiserver 的安全端口;

1.2.4 kubelet:

  • 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
  • 使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
  • 在 KubeletConfiguration 类型的 JSON 文件配置主要参数;
  • 关闭只读端口,在安全端口 10250 接收 https 请求,对请求进行认证和授权,拒绝匿名访问和非授权访问;
  • 使用 kubeconfig 访问 apiserver 的安全端口;

1.2.5 kube-proxy:

  • 使用 kubeconfig 访问 apiserver 的安全端口;
  • 在 KubeProxyConfiguration 类型的 JSON 文件配置主要参数;
  • 使用 ipvs 代理模式;

1.2.6 集群插件:

  • DNS:使用功能、性能更好的 coredns;
  • Dashboard:支持登录认证;
  • Metric:metrics-server,使用 https 访问 kubelet 安全端口;
  • Log:Elasticsearch、Fluend、Kibana;
  • Registry 镜像库:docker-registry、harbor;

2 初始化系统和全局变量

2.1 集群规划

  • sre-master-node:10.12.5.60
  • sre-worker-node-1:10.12.5.61
  • sre-worker-node-2:10.12.5.62

三台机器混合部署本文档的 etcd、master 集群和 woker 集群。

2.2 设置主机名

# master node主机名设置为sre-master-node
$ hostnamectl set-hostname sre-master-node
# worker node 1主机名设置为sre-worker-node-1
$ hostnamectl set-hostname sre-worker-node-1
# worker node 2主机名设置为sre-worker-node-2
$ hostnamectl set-hostname sre-worker-node-2

如果 DNS 不支持主机名称解析,还需要在每台机器的 /etc/hosts 文件中添加主机名和 IP 的对应关系:

本操作所有节点均需要执行。

$ cat >> /etc/hosts <<EOF
10.12.5.60 sre-master-node
10.12.5.61 sre-worker-node-1
10.12.5.62 sre-worker-node-2
EOF

退出,重新登录 root 账号,可以看到主机名生效。

2.3 添加节点信任关系

本操作只需要在sre-master-node节点上进行。

设置 root 账户可以无密码登录所有节点

$ ssh-keygen -t rsa 
$ ssh-copy-id root@sre-master-node
$ ssh-copy-id root@sre-worker-node-1
$ ssh-copy-id root@sre-worker-node-2

2.4 更新 PATH 变量

本操作所有节点均需要执行。

$ echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
$ source /root/.bashrc

/opt/k8s/bin 目录保存本文档下载安装的程序。 

2.5 安装依赖包

本操作所有节点均需要执行。

$ yum install -y epel-release
$ yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git
  • 本文档的 kube-proxy 使用 ipvs 模式,ipvsadm 为 ipvs 的管理工具;
  • etcd 集群各机器需要时间同步,chrony 用于系统时间同步;

2.6 关闭防火墙

本操作所有节点均需要执行。

关闭防火墙,清理防火墙规则,设置默认转发策略:

$ systemctl stop firewalld
$ systemctl disable firewalld
$ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
$ iptables -P FORWARD ACCEPT

2.7 关闭 swap 分区

本操作所有节点均需要执行。

关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为 false 关闭 swap 检查):

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

2.8 关闭 SELinux

本操作所有节点均需要执行。

关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied

$ setenforce 0
$ sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.9 优化内核参数

本操作所有节点均需要执行。

$ cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh2=2048
net.ipv4.neigh.default.gc_thresh3=4096
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
$ cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
$ sysctl -p /etc/sysctl.d/kubernetes.conf
  • 关闭 tcp_tw_recycle,否则与 NAT 冲突,可能导致服务不通;

2.10 设置系统时区

本操作所有节点均需要执行。

$ timedatectl set-timezone Asia/Shanghai

2.11 设置系统时钟同步

本操作所有节点均需要执行。

$ systemctl enable chronyd
$ systemctl start chronyd

查看同步状态:

$ timedatectl status

输出:

System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
  • System clock synchronized: yes,表示时钟已同步;
  • NTP service: active,表示开启了时钟同步服务;
# 将当前的 UTC 时间写入硬件时钟
$ timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
$ systemctl restart rsyslog 
$ systemctl restart crond

2.12 关闭无关的服务

本操作所有节点均需要执行。

$ systemctl stop postfix && systemctl disable postfix

2.13 创建相关目录

本操作所有节点均需要执行。

创建目录:

$ mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert

2.14 分发集群配置参数脚本

本操作所有节点均需要执行。

后续使用的环境变量都定义在文件 environment.sh 中,请根据自己的机器、网络情况修改。然后拷贝到所有节点:

environment.sh

$ vim environment.sh
#!/usr/bin/bash

# 生成 EncryptionConfig 所需的加密 key
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)

# 集群各机器 IP 数组
export NODE_IPS=(10.12.5.60 10.12.5.61 10.12.5.62)

# 集群各 IP 对应的主机名数组
export NODE_NAMES=(sre-master-node sre-worker-node-1 sre-worker-node-2)

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://10.12.5.60:2379,https://10.12.5.61:2379,https://10.12.5.62:2379"

# etcd 集群间通信的 IP 和端口
export ETCD_NODES="sre-master-node=https://10.12.5.60:2380,sre-worker-node-1=https://10.12.5.61:2380,sre-worker-node-1=https://10.12.5.62:2380"

# kube-apiserver 的反向代理(kube-nginx)地址端口
export KUBE_APISERVER="https://127.0.0.1:8443"

# 节点间互联网络接口名称
export IFACE="eth0"

# etcd 数据目录
export ETCD_DATA_DIR="/data/k8s/etcd/data"

# etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
export ETCD_WAL_DIR="/data/k8s/etcd/wal"

# k8s 各组件数据目录
export K8S_DIR="/data/k8s/k8s"

## DOCKER_DIR 和 CONTAINERD_DIR 二选一
# docker 数据目录
export DOCKER_DIR="/data/k8s/docker"

# containerd 数据目录
export CONTAINERD_DIR="/data/k8s/containerd"

## 以下参数一般不需要修改

# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="502c6e11a65946e3064e7a4b4658ec29"

# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段

# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证)
SERVICE_CIDR="192.168.0.0/16"

# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
CLUSTER_CIDR="172.16.0.0/16"

# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="30000-32767"

# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="192.168.0.1"

# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="192.168.0.2"

# 集群 DNS 域名(末尾不带点号)
export CLUSTER_DNS_DOMAIN="cluster.local"

# 将二进制目录 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH

$ source environment.sh # 先修改
$ vim deploy-k8s.sh
#!/bin/bash
for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp environment.sh root@${node_ip}:/opt/k8s/bin/
    ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
  done
$ sh deploy-k8s.sh

2.15 升级内核

本操作所有节点均需要执行。

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,例如:

  1. 高版本的 docker(1.13 以后) 启用了 3.10 kernel 实验支持的 kernel memory account 功能(无法关闭),当节点压力大如频繁启动和停止容器时会导致 cgroup memory leak;
  2. 网络设备引用计数泄漏,会导致类似于报错:"kernel:unregister_netdevice: waiting for eth0 to become free. Usage count = 1";

解决方案如下:

  1. 升级内核到 4.4.X 以上;
  2. 或者,手动编译内核,disable CONFIG_MEMCG_KMEM 特性;
  3. 或者,安装修复了该问题的 Docker 18.09.1 及以上的版本。但由于 kubelet 也会设置 kmem(它 vendor 了 runc),所以需要重新编译 kubelet 并指定 GOFLAGS="-tags=nokmem";
$ git clone --branch v1.14.1 --single-branch --depth 1 https://github.com/kubernetes/kubernetes
$ cd kubernetes
$ KUBE_GIT_VERSION=v1.14.1 ./build/run.sh make kubelet GOFLAGS="-tags=nokmem"

这里采用升级内核的解决办法:

$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
$ yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
$ grub2-set-default 0

重启机器:

$ sync
$ reboot

3 创建 CA 根证书和秘钥

为确保安全,kubernetes 系统各组件需要使用 x509 证书对通信进行加密和认证。

CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。

CA 证书是集群所有节点共享的,只需要创建一次,后续用它签名其它所有证书。

本章节使用 CloudFlare 的 PKI 工具集 cfssl 创建所有证书。

如果没有特殊指明,本文档的所有操作均在 sre-master-node节点上执行

3.1 安装 cfssl 工具集

$ sudo mkdir -p /opt/k8s/cert && cd /opt/k8s/work

$ wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl_1.4.1_linux_amd64
$ mv cfssl_1.4.1_linux_amd64 /opt/k8s/bin/cfssl

$ wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssljson_1.4.1_linux_amd64
$ mv cfssljson_1.4.1_linux_amd64 /opt/k8s/bin/cfssljson

$ wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl-certinfo_1.4.1_linux_amd64
$ mv cfssl-certinfo_1.4.1_linux_amd64 /opt/k8s/bin/cfssl-certinfo

$ chmod +x /opt/k8s/bin/*
$ export PATH=/opt/k8s/bin:$PATH

3.2 创建配置文件

CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等):

$ cd /opt/k8s/work
$ cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "876000h"
      }
    }
  }
}
EOF
  • signing:表示该证书可用于签名其它证书(生成的 ca.pem 证书中 CA=TRUE);
  • server auth:表示 client 可以用该该证书对 server 提供的证书进行验证;
  • client auth:表示 server 可以用该该证书对 client 提供的证书进行验证;
  • "expiry": "876000h":证书有效期设置为 100 年;

3.3 创建证书签名请求文件

$ cd /opt/k8s/work
$ cat > ca-csr.json <<EOF
{
  "CN": "kubernetes-ca",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "opsnull"
    }
  ],
  "ca": {
    "expiry": "876000h"
 }
}
EOF
  • CN:Common Name:kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法;
  • O:Organization:kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
  • kube-apiserver 将提取的 User、Group 作为 RBAC 授权的用户标识;

注意:

  1. 不同证书 csr 文件的 CN、C、ST、L、O、OU 组合必须不同,否则可能出现 PEER'S CERTIFICATE HAS AN INVALID SIGNATURE 错误;
  2. 后续创建证书的 csr 文件时,CN 都不相同(C、ST、L、O、OU 相同),以达到区分的目的;

3.4 生成 CA 证书和私钥

$ cd /opt/k8s/work
$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
$ ls ca*

3.5 分发证书文件

$ cd /opt/k8s/work
$ source /opt/k8s/bin/environment.sh
$ vim deploy-ca.sh
#!/bin/bash
for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "mkdir -p /etc/kubernetes/cert"
    scp ca*.pem ca-config.json root@${node_ip}:/etc/kubernetes/cert
  done
$ sh deploy-ca.sh

4 安装和配置 kubectl

  • 如果没有特殊指明,本文档的所有操作均在sre-master-node节点上执行
  • 本文档只需要部署一次,生成的 kubeconfig 文件是通用的,可以拷贝到需要执行 kubectl 命令的机器的 ~/.kube/config 位置;

4.1 下载和分发 kubectl 二进制文件

$ cd /opt/k8s/work
$ wget https://dl.k8s.io/v1.16.6/kubernetes-client-linux-amd64.tar.gz # 自行解决翻墙下载问题
$ tar -xzvf kubernetes-client-linux-amd64.tar.gz

分发到所有使用 kubectl 工具的节点:

$ cd /opt/k8s/work
$ source /opt/k8s/bin/environment.sh
$ vim deploy-kubectl.sh
for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp kubernetes/client/bin/kubectl root@${node_ip}:/opt/k8s/bin/
    ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
  done
$ sh deploy-kubectl.sh

4.2  创建 admin 证书和私钥

kubectl 使用 https 协议与 kube-apiserver 进行安全通信,kube-apiserver 对 kubectl 请求包含的证书进行认证和授权。

kubectl 后续用于集群管理,所以这里创建具有最高权限的 admin 证书。

创建证书签名请求:

$ cd /opt/k8s/work
$ cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "opsnull"
    }
  ]
}
EOF
  • O: system:masters:kube-apiserver 收到使用该证书的客户端请求后,为请求添加组(Group)认证标识 system:masters
  • 预定义的 ClusterRoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予操作集群所需的最高权限;
  • 该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;

生成证书和私钥:

$ cd /opt/k8s/work
$ cfssl gencert -ca=/opt/k8s/work/ca.pem \
  -ca-key=/opt/k8s/work/ca-key.pem \
  -config=/opt/k8s/work/ca-config.json \
  -profile=kubernetes admin-csr.json | cfssljson -bare admin
$ ls admin*
  • 忽略警告消息 [WARNING] This certificate lacks a "hosts" field.

4.3 创建 kubeconfig 文件

kubectl 使用 kubeconfig 文件访问 apiserver,该文件包含 kube-apiserver 的地址和认证信息(CA 证书和客户端证书):

$ cd /opt/k8s/work
$ source /opt/k8s/bin/environment.sh

# 设置集群参数
$ kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/k8s/work/ca.pem \
  --embed-certs=true \
  --server=https://${NODE_IPS[0]}:6443 \
  --kubeconfig=kubectl.kubeconfig

# 设置客户端认证参数
$ kubectl config set-credentials admin \
  --client-certificate=/opt/k8s/work/admin.pem \
  --client-key=/opt/k8s/work/admin-key.pem \
  --embed-certs=true \
  --kubeconfig=kubectl.kubeconfig

# 设置上下文参数
$ kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin \
  --kubeconfig=kubectl.kubeconfig



# 设置默认上下文
$ kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
  • --certificate-authority:验证 kube-apiserver 证书的根证书;
  • --client-certificate--client-key:刚生成的 admin 证书和私钥,与 kube-apiserver https 通信时使用;
  • --embed-certs=true:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl.kubeconfig 文件中(否则,写入的是证书文件路径,后续拷贝 kubeconfig 到其它机器时,还需要单独拷贝证书文件,不方便。);
  • --server:指定 kube-apiserver 的地址,这里指向第一个节点上的服务;

4.4 分发 kubeconfig 文件

分发到所有使用 kubectl 命令的节点:

$ cd /opt/k8s/work
$ source /opt/k8s/bin/environment.sh
$ vim deploy-kubeconfig.sh
for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "mkdir -p ~/.kube"
    scp kubectl.kubeconfig root@${node_ip}:~/.kube/config
  done
$ sh deploy-kubeconfig.sh


http://www.niftyadmin.cn/n/5014632.html

相关文章

取个好名,是一生中极为重要之事

我们每十年一大运&#xff0c;五年一小运。每交次大运时&#xff0c;就会改变一次你身边的一切环境。每个大运&#xff0c;都会把你带入不同的风景&#xff0c;人生想要须尽欢&#xff0c;就不要太在意外在的一切&#xff0c;永远向内求。有志同道合的人就一起上路&#xff0c;…

【漏洞通知】JeecgBoot 修复SQL注入风险, 漏洞危害等级:高危

表字典存在SQL注入漏洞, 远程攻击者可利用该漏洞攻击系统数据库&#xff0c;获取敏感数据或者进行数据库违规操作。 JeecgBoot官方已修复&#xff0c;建议大家尽快升级源码&#xff0c;新旧版本都可以参考此方案修复&#xff01; 一、漏洞描述 表字典存在SQL注入漏洞, 远程攻…

第2章_瑞萨MCU零基础入门系列教程之面向过程与面向对象

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

【Modbus通信实验五】常见问题汇总

1.什么是PLC&#xff0c;PLC和单片机有什么区别 PLC&#xff1a;可编程逻辑控制器(Programmable Logic Controller)&#xff0c;专门用于工业自动化领域。它的主要功能是对生产过程进行控制和监控&#xff0c;以实现对工业生产过程的自动化控制。PLC采用一种可编程的存储器&…

抖音小程序开发教学系列(3)- 抖音小程序页面开发

章节三&#xff1a;抖音小程序页面开发 抖音小程序的页面开发是抖音小程序开发的核心部分之一&#xff0c;一个页面可以看作是抖音小程序中的一个独立的界面&#xff0c;通过页面的布局、样式、数据绑定和事件处理来展示内容和实现交互。 在本章节中&#xff0c;我们将介绍抖…

私有云不是真正的云计算!

大数据产业创新服务媒体 ——聚焦数据 改变商业 中国云计算遇到困境&#xff0c;IaaS层面&#xff0c;阿里云、腾讯云等增长乏力&#xff1b;SaaS没有发展起来。反观美国&#xff0c;整个云计算蓬勃发展&#xff0c;AWS、微软云、谷歌云体量更大&#xff0c;增速却不低&#x…

最新keil安装出现的无数问题记录及解决办法

报错问题现象如下&#xff1a; *** Target Target 1 uses ARM-Compiler Default Compiler Version 5 which is not available. 安装最新keil 5 出现无数个问题。 我使用GD32去跑&#xff0c;或者STM32去跑&#xff0c;都是这个问题。 一、我先解决了GD32的问题&#xff1a;…

如何给网站或者后端服务免费且快速的进行配置HTTPS,配置ssl证书

前言 现在部署的网站用的大多都是https协议的,还有的平台你要是想发布自己的网站就必须得是https的协议,如果不使用ssl的话,那就不让你使用.就比如微信,支付宝等的产品,不用的话就不让你使用他们的平台.不过还好很多服务厂商都提供了免费ssl证书可以进行配置 今天的情况比较特殊…