阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

CentOS 7.3下Docker Kubernetes1.8.3集群环境搭建

462次阅读
没有评论

共计 28313 个字符,预计需要花费 71 分钟才能阅读完成。

部署环境

此次部署 kubernetes1.8.3 版本使用两台机器进行操作,一台做为 Master 节点,一台作为 Node 节点。部署流程及配置与正式环境下是一致的。

Kubernetes Master 节点:10.0.11.222

Kubernetes Node 节点:10.0.11.221

部署软件

CentOS:CentOS 7.3

Docker:17.03.2-ce

Kubernetes:1.8.3

etcd:3.2.7

flannel:v0.7.1

准备工作

master节点、node节点都要做这些准备工作。

关闭防火墙

# 关闭防火墙
[root@mimo222 ~]# systemctl stop firewalld

# 禁用防火墙
[root@mimo222 ~]# systemctl disable firewalld

禁用 selinux

# 设置 selinux 为关闭
[root@mimo222 ~]# setenforce 0

# 打开 selinux 配置文件
[root@mimo222 ~]# vim /etc/selinux/config

# SELINUX 配置项修改为 disabled
SELINUX=disabled

创建验证

此次安装 kubernetes1.8.3,我们使用基于CA 签名 的数字证书认证方式,通过 cfssl 进行证书生成。此次安装是 单 Master 节点 ,因此证书的生成都在Master 节点完成。如果你安装的是 多 Master 节点 ,那么可在其中一个Master 节点生成证书,然后同步将证书拷贝到其他的 Master(注意:多个Master 节点的证书目录一定要一致,以避免不必要的问题出现)。最后,在配置 Node 节点时,我们可以从 Master 节点拷贝 Node 节点需要的证书。

安装 cfssl

[root@mimo222 ~]# mkdir -p /opt/local/cfssl

[root@mimo222 ~]# cd /opt/local/cfssl

[root@mimo222 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@mimo222 ~]# mv cfssl_linux-amd64 cfssl

[root@mimo222 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@mimo222 ~]# mv cfssljson_linux-amd64 cfssljson

[root@mimo222 ~]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@mimo222 ~]# mv cfssl-certinfo_linux-amd64 cfssl-certinfo

[root@mimo222 ~]# chmod +x *

安装 cfssl 需要下载上面命令中的三个文件,如果通过 wget 无法下载,可通过直接在网页上访问该链接下载,然后拷贝到 /opt/local/cfssl 目录。注意修改文件权限。

创建 CA 证书配置

创建 ssl 目录:

[root@mimo222 ~]# mkdir /opt/ssl

[root@mimo222 ~]# cd /opt/ssl

/opt/ssl 目录下创建 config.json 文件:

vi  config.json

{"signing": {"default": {"expiry": "87600h"
    },
    "profiles": {"kubernetes": {"usages": ["signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}

/opt/ssl 目录下创建csr.json 文件:

vi csr.json

{"CN": "kubernetes",
  "key": {"algo": "rsa",
    "size": 2048
  },
  "names": [
    {"C": "CN",
      "ST": "ShenZhen",
      "L": "ShenZhen",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成 CA 证书和私钥

[root@mimo222 ~]# cd /opt/ssl/

# 生成 CA 证书和私钥
[root@mimo222 ~]# /opt/local/cfssl/cfssl gencert -initca csr.json | /opt/local/cfssl/cfssljson -bare ca

[root@mimo222 ~]# ls -lt
total 5
-rw-r--r--  1 root root 1005 Dec 14 17:48 ca.csr
-rw-------  1 root root 1679 Dec 14 17:48 ca-key.pem
-rw-r--r--  1 root root 1363 Dec 14 17:48 ca.pem
-rw-r--r--. 1 root root  292 Dec 14 17:45 config.json
-rw-r--r--  1 root root  210 Dec 14 17:48 csr.json

分发证书

我们将所有 kubernetes 相关的证书都保存到 /etc/kubernetes/ssl 目录,方便管理。

# 创建证书目录
[root@mimo222 ~]# mkdir -p /etc/kubernetes/ssl

# 拷贝所有文件到目录下
[root@mimo222 ~]# cp *.pem /etc/kubernetes/ssl
[root@mimo222 ~]# cp ca.csr /etc/kubernetes/ssl

# 这里要将文件拷贝到所有的 k8s Master 机器上
# 这里演示一下多 Master 节点时证书的保存方式,在每次生成证书之后,都可以通过下面的方式将证书拷贝
# 到远程 Master 节点,保证数据的同步。下面其他证书方式一样,就不再写了。
[root@mimo222 ~]# scp *.pem xx.xx.xx.xx:/etc/kubernetes/ssl/
[root@mimo222 ~]# scp *.csr xx.xx.xx.xx:/etc/kubernetes/ssl/

安装 Docker

所有 kubernetes 节点都需要安装docker,并且版本最好一致。

开始安装

# 删除老版本 Docker 及依赖,如果机器上装过其他版本的 docker,可通过该命令进行老版本 docker 清理
[root@mimo222 ~]# yum remove docker docker-common container-selinux docker-selinux docker-engine

# 安装 yum-config-manager
[root@mimo222 ~]# yum -y install yum-utils

# 导入 yum 源
[root@mimo222 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 更新 repo
[root@mimo222 ~]# yum makecache

# 查看 yum 版本
[root@mimo222 ~]# yum list docker-ce.x86_64  --showduplicates |sort -r

# 安装指定版本 docker-ce 17.03 被 docker-ce-selinux 依赖, 不能直接 yum 安装 docker-ce-selinux
# 如果此处通过 wget 无法下载,可到网上查一下这个 rpm 包,下载下来然后拷贝到服务器���。

[root@mimo222 ~]# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm

[root@mimo222 ~]# rpm -ivh docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm

# 安装 docker
[root@mimo222 ~]# yum -y install docker-ce-17.03.2.ce

查看 docker 版本

[root@mimo222 ~]# docker version

Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.2-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:21:36 2017
 OS/Arch:      linux/amd64
 Experimental: false

更改 docker 配置

更改 /usr/lib/systemd/system/docker.service 启动文件

[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service

[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 $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS $DOCKER_DNS_OPTIONS
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

对比初始安装 docker 后的 docker.service 文件内容,修改 docker.service 文件。

修改其他配置

[root@mimo222 ~]# mkdir -p /usr/lib/systemd/system/docker.service.d/

docker-options.conf该文件中保存 docker 启动的一些参数

[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service.d/docker-options.conf

# 文件中添加信息如下:(注意 Environment 配置信息必须在同一行,如果出现换行会无法加载)

[Service]
Environment="DOCKER_OPTS=--insecure-registry=10.254.0.0/16 --graph=/opt/docker --disable-legacy-registry"
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service.d/docker-dns.conf

# 添加如下 : 

[Service]
Environment="DOCKER_DNS_OPTIONS=\
    --dns 10.254.0.2 --dns 114.114.114.114  \
    --dns-search default.svc.cluster.local --dns-search svc.cluster.local  \
    --dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2"

flannel.conf:该文件保存了读取 flannel 网络分段信息

# 1. 该配置文件用于和 flannel 网络交互,若使用的网络配置不是 flannel,则无需该配置文件
# 2. 该配置文件需在 flannel 安装配置之后才能生效

vi /usr/lib/systemd/system/docker.service.d/flannel.conf

添加如下信息:[Service]
EnvironmentFile=-/run/flannel/docker

启动、重启、查看docker

# 重新读取配置
[root@mimo222 ~]# systemctl daemon-reload

# 启动 docker
[root@mimo222 ~]# systemctl start docker

# 设置为开机启动
[root@mimo222 ~]# systemctl enable docker

# 查看 docker 运行状态
[root@mimo222 ~]# systemctl status docker

# 重启 docker
[root@mimo222 ~]# systemctl restart docker

# 停止运行 docker
[root@mimo222 ~]# systemctl stop docker

etcd 安装配置

etcdkubernetes 集群最重要的组件,etcd挂了,集群就挂了。

安装 etcd

这里我是在别的地方下载了etcd-3.2.9-3.el7.x86_64.rpm,然后拷贝到服务器上进行安装。

rpm -ivh etcd-3.2.9-3.el7.x86_64.rpm

创建 etcd 证书

[root@mimo222 ~]# cd /opt/ssl/

[root@mimo222 ~]# vi etcd-csr.json

# 添加如下内容:

{"CN": "etcd",
  "hosts": ["127.0.0.1",
    "10.0.11.222"
  ],
  "key": {"algo": "rsa",
    "size": 2048
  },
  "names": [
    {"C": "CN",
      "ST": "TianJin",
      "L": "TianJin",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

其中,hosts中填写的是 etcd 节点的地址,这里只安装了单节点 etcd,因此只填写了etcd 本地地址 127.0.0.1 以及 10.0.11.222。如果安装的是etcd 集群,则需要在 hosts 中添加别的 etcd 节点的 ip 地址。

# 生成 etcd 密钥

/opt/local/cfssl/cfssl gencert -ca=/opt/ssl/ca.pem \
  -ca-key=/opt/ssl/ca-key.pem \
  -config=/opt/ssl/config.json \
  -profile=kubernetes etcd-csr.json | /opt/local/cfssl/cfssljson -bare etcd

/opt/local/cfssl/cfssl:使用 cfssl 进行证书生成

# 查看生成信息

[root@mimo222 ~]# ll etcd*

-rw-r--r-- 1 root root 1050 Dec 14 18:31 etcd.csr
-rw-r--r-- 1 root root  257 Dec 14 18:31 etcd-csr.json
-rw------- 1 root root 1679 Dec 14 18:31 etcd-key.pem
-rw-r--r-- 1 root root 1424 Dec 14 18:31 etcd.pem

# 拷贝
[root@mimo222 ~]# cp etcd*.pem /etc/kubernetes/ssl/

# 如果 etcd 非 root 用户,读取证书会提示没权限
[root@mimo222 ~]# chmod 644 /etc/kubernetes/ssl/etcd-key.pem

修改 etcd 配置

修改 etcd 配置文件/etc/etcd/etcd.conf

# 备份原来的 etcd.conf 配置文件
mv /etc/etcd/etcd.conf /etc/etcd/etcd.conf-bak

# 重新写一份配置文件
vi /etc/etcd/etcd.conf

# [member]
ETCD_NAME=etcd1  # etcd 节点名称
ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd"
ETCD_WAL_DIR="/var/lib/etcd/wal"
ETCD_SNAPSHOT_COUNT="100"
ETCD_HEARTBEAT_INTERVAL="100"
ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="https://[Node IP]:2380" 
ETCD_LISTEN_CLIENT_URLS="https://[Node IP]:2379,http://127.0.0.1:2379"
ETCD_MAX_SNAPSHOTS="5"
ETCD_MAX_WALS="5"
#ETCD_CORS=""

# [cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://[Node IP]:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd1=https://[Node IP]:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="https://[Node IP]:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_STRICT_RECONFIG_CHECK="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"

# [proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"

# [security]
ETCD_CERT_FILE="/etc/kubernetes/ssl/etcd.pem"
ETCD_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem"
ETCD_AUTO_TLS="true"
ETCD_PEER_CERT_FILE="/etc/kubernetes/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem"
ETCD_PEER_AUTO_TLS="true"

# [logging]
#ETCD_DEBUG="false"
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG
#ETCD_LOG_PACKAGE_LEVELS=""

注意:
1、将上面的配置文件中的 [Node IP] 都修改为本机 IP,这里我安装在 10.0.11.222,因此都修改成了 10.0.11.222。

2、[security]下的配置项指定了证书的位置,因此要注意证书的位置是否正确。

3、如果安装的是 etcd 集群,配置文件信息基本一致,只要修改 [Node IP] 为 etcd 节点的主机 IP 即可,同时修改 ETCD_INITIAL_CLUSTER 项,该项需要添加所有 etcd 节点,例如:
ETCD_INITIAL_CLUSTER="etcd1=https://172.16.1.64:2380,etcd2=https://172.16.1.65:2380,etcd3=https://172.16.1.66:2380"

启动 etcd

[root@mimo222 ~]# systemctl enable etcd

[root@mimo222 ~]# systemctl start etcd

[root@mimo222 ~]# systemctl status etcd

# 如果报错 请使用
journalctl -f -t etcd  和 journalctl -u etcd 来定位问题
[root@mimo222 ~]# journalctl -f -t etcd

验证 etcd 状态

查看 etcd 状态

若为 etcd 集群,则 --endpoints 需要填写所有 etcd 节点IP:PORT

etcdctl --endpoints=https://10.0.11.222:2379\
        --cert-file=/etc/kubernetes/ssl/etcd.pem \
        --ca-file=/etc/kubernetes/ssl/ca.pem \
        --key-file=/etc/kubernetes/ssl/etcd-key.pem \
        cluster-health

member 2012db49e3efb509 is healthy: got healthy result from https://10.0.11.222:2379
cluster is healthy

查看 etcd 集群成员

etcdctl --endpoints=https://10.0.11.222:2379\
        --cert-file=/etc/kubernetes/ssl/etcd.pem \
        --ca-file=/etc/kubernetes/ssl/ca.pem \
        --key-file=/etc/kubernetes/ssl/etcd-key.pem \
        member list

2012db49e3efb509: name=etcd1 peerURLs=http://10.0.11.222:2380 clientURLs=https://10.0.11.222:2379 isLeader=true

Kubernetes Master 节点安装配置

Master需要部署 kube-apiserver , kube-scheduler , kube-controller-manager 这三个组件。kube-scheduler 作用是调度 pods 分配到那个 node 里,简单来说就是资源调度。kube-controller-manager 作用是 对 deployment controller , replication controller, endpoints controller, namespace controller and serviceaccounts controller等等的循环控制,与 kube-apiserver 交互。

安装组件

[root@mimo222 ~]# mkdir /tmp/kubernetes

[root@mimo222 ~]# cd /tmp/kubernetes

# 这个包比较大,几百兆,我通过 wget 没有下下来... 直接在网页上输入这个网址,然后一点一点下载下来了..
# 大家可以用别的方法下载,然后拷贝到服务器上即可。

[root@mimo222 ~]# wget https://dl.k8s.io/v1.8.3/kubernetes-server-linux-amd64.tar.gz

[root@mimo222 ~]# tar -xzvf kubernetes-server-linux-amd64.tar.gz

[root@mimo222 ~]# cd kubernetes

# Master 节点不需要 kubelet、kube-proxy,因此这里没有拷贝这俩,如果要将 master 节点也装成 node 节点,
# 则 kubelet、kube-proxy 这俩就需要拷贝出来了。

[root@mimo222 ~]# cp -r server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl} /usr/local/bin/

创建 admin 证书

kubectlkube-apiserver 的安全端口通信,需要为安全通信提供 TLS 证书和秘钥。

[root@mimo222 ~]# cd /opt/ssl/

[root@mimo222 ~]# vi admin-csr.json

# 添加以下信息:

{"CN": "admin",
  "hosts": [],
  "key": {"algo": "rsa",
    "size": 2048
  },
  "names": [
    {"C": "CN",
      "ST": "TianJin",
      "L": "TianJin",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}

生成admin 证书和私钥

[root@mimo222 ~]# cd /opt/ssl/

/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/opt/ssl/config.json \
  -profile=kubernetes admin-csr.json | /opt/local/cfssl/cfssljson -bare admin

查看生成

[root@mimo222 ssl]# ll admin*

-rw-r--r-- 1 root root 1013 Dec 14 19:22 admin.csr
-rw-r--r-- 1 root root  231 Dec 14 19:22 admin-csr.json
-rw------- 1 root root 1679 Dec 14 19:22 admin-key.pem
-rw-r--r-- 1 root root 1407 Dec 14 19:22 admin.pem

拷贝到指定目录

cp admin*.pem /etc/kubernetes/ssl/

配置 kubectl kubeconfig 文件

生成证书相关的配置文件存储与 /root/.kube 目录中

# 配置 kubernetes 集群

kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=https://127.0.0.1:6443


# 配置 客户端认证

kubectl config set-credentials admin \
  --client-certificate=/etc/kubernetes/ssl/admin.pem \
  --embed-certs=true \
  --client-key=/etc/kubernetes/ssl/admin-key.pem


kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin


kubectl config use-context kubernetes

创建 kubernetes 证书

[root@mimo222 ~]# cd /opt/ssl

[root@mimo222 ~]# vi kubernetes-csr.json

{"CN": "kubernetes",
  "hosts": ["127.0.0.1",
    "10.0.11.222",
    "10.254.0.1",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local"
  ],
  "key": {"algo": "rsa",
    "size": 2048
  },
  "names": [
    {"C": "CN",
      "ST": "ShenZhen",
      "L": "ShenZhen",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

这里 hosts 字段中三个 IP 分别为 127.0.0.1 本机、172.16.1.64MasterIP(多个Master 节点需要将所有 master 节点 IP 都写在这)、10.254.0.1kubernetes SVCIP,一般是部署网络的第一个IP , 如: 10.254.0.1,在启动完成后,我们使用 kubectl get svc,就可以查看到。

生成 kubernetes 证书和私钥

kubelet 首次启动时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token 一致,如果一致则自动为 kubelet 生成证书和秘钥。

# 生成 token(注意此处的 token 在生成 node 节点 kubelet 需要的证书时也会用到,要注意不要写错或重新生成别的)

[root@mimo222 ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
3140a1541451afcc87ca7b715f124ce3

# 创建 token.csv 文件

[root@mimo222 ~]# cd /opt/ssl

[root@mimo222 ~]# vi token.csv

# 填写以下信息:
3140a1541451afcc87ca7b715f124ce3,kubelet-bootstrap,10001,"system:kubelet-bootstrap"

# 拷贝
cp token.csv /etc/kubernetes/
# 生成高级审核配置文件

[root@mimo222 ~]# cd /etc/kubernetes

cat >> audit-policy.yaml <<EOF
# Log all requests at the Metadata level.
apiVersion: audit.k8s.io/v1beta1
kind: Policy
rules:
- level: Metadata
EOF

创建 kube-apiserver.service 文件

  • 自定义 系统 service 文件一般存于 /etc/systemd/system/
  • 配置为 各自的本地IP
[root@mimo222 ~]# vi /etc/systemd/system/kube-apiserver.service


[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
User=root
ExecStart=/usr/local/bin/kube-apiserver \
  --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \
  --advertise-address=10.0.11.222 \
  --allow-privileged=true \
  --apiserver-count=3 \
  --audit-policy-file=/etc/kubernetes/audit-policy.yaml \
  --audit-log-maxage=30 \
  --audit-log-maxbackup=3 \
  --audit-log-maxsize=100 \
  --audit-log-path=/var/log/kubernetes/audit.log \
  --authorization-mode=Node,RBAC \
  --anonymous-auth=false \ # 不接受匿名访问,若为 true,则表示接受,此处设置为 false,便于 dashboard 访问
  --bind-address=0.0.0.0 \
  --secure-port=6443 \
  --client-ca-file=/etc/kubernetes/ssl/ca.pem \
  --enable-swagger-ui=true \
  --etcd-cafile=/etc/kubernetes/ssl/ca.pem \
  --etcd-certfile=/etc/kubernetes/ssl/etcd.pem \
  --etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem \
  --etcd-servers=https://10.0.11.222:2379 \
  --event-ttl=1h \
  --kubelet-https=true \
  --insecure-bind-address=127.0.0.1 \
  --insecure-port=8080 \
  --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --service-cluster-ip-range=10.254.0.0/16 \
  --service-node-port-range=30000-32000 \
  --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  --enable-bootstrap-token-auth \
  --token-auth-file=/etc/kubernetes/token.csv \
  --v=2
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  1. --advertise-address:master 节点本机 IP

  2. --etcd-servers:etcd URL:etcd 集群需要写上所有 etcd 节点 URL

  3. --service-node-port-range=30000-32000:这个地方是 映射外部端口时 的端口范围,随机映射也在这个范围内映射,指定映射端口必须也在这个范围内。

  4. 注意验证证书等路径是否正确。

启动 kube-apiserver

[root@mimo222 ~]# systemctl daemon-reload
[root@mimo222 ~]# systemctl enable kube-apiserver
[root@mimo222 ~]# systemctl start kube-apiserver
[root@mimo222 ~]# systemctl status kube-apiserver

配置 kube-controller-manager

创建 kube-controller-manager.service文件

[root@mimo222 ~]# vi /etc/systemd/system/kube-controller-manager.service


[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-controller-manager \
  --address=0.0.0.0 \
  --master=http://127.0.0.1:8080 \
  --allocate-node-cidrs=true \
  --service-cluster-ip-range=10.254.0.0/16 \
  --cluster-cidr=10.233.0.0/16 \
  --cluster-name=kubernetes \
  --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
  --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
  --root-ca-file=/etc/kubernetes/ssl/ca.pem \
  --leader-elect=true \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

启动 kube-controller-manager

[root@mimo222 ~]# systemctl daemon-reload
[root@mimo222 ~]# systemctl enable kube-controller-manager
[root@mimo222 ~]# systemctl start kube-controller-manager
[root@mimo222 ~]# systemctl status kube-controller-manager

配置 kube-scheduler

创建 kube-cheduler.service 文件

[root@mimo222 ~]# vi /etc/systemd/system/kube-scheduler.service


[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-scheduler \
  --address=0.0.0.0 \
  --master=http://127.0.0.1:8080 \
  --leader-elect=true \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

启动 kube-scheduler

[root@mimo222 ~]# systemctl daemon-reload
[root@mimo222 ~]# systemctl enable kube-scheduler
[root@mimo222 ~]# systemctl start kube-scheduler
[root@mimo222 ~]# systemctl status kube-scheduler

验证 Master 节点

[root@mimo222 ssl]# kubectl get componentstatuses
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health": "true"} 


# 由于还没有加入 node 节点,所有查询 node 时为空。

[root@mimo222 ssl]# kubectl get nodes
NAME          STATUS    ROLES     AGE       VERSION

flannel 安装配置

kubernetes要求集群内各节点能通过 Pod 网段互联互通,本节介绍使用 Flannel 在所有节点 (Master、Node) 上创建互联互通的 Pod 网段的步骤。

创建 flannel 证书

[root@mimo222 ~]# cd /opt/ssl/

[root@mimo222 ~]# vi flanneld-csr.json

# 添加如下内容:

{"CN": "flanneld",
  "hosts": [],
  "key": {"algo": "rsa",
    "size": 2048
  },
  "names": [
    {"C": "CN",
      "ST": "ShenZhen",
      "L": "ShenZhen",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

注意:hosts 字段为空。

生成 flanneld 证书和私钥

[root@mimo222 ~]# cd /opt/ssl

[root@mimo222 ~]# /opt/local/cfssl/cfssl gencert -ca=/opt/ssl/ca.pem \
    -ca-key=/opt/ssl/ca-key.pem \
    -config=/opt/ssl/config.json \
    -profile=kubernetes flanneld-csr.json | /opt/local/cfssl/cfssljson -bare flanneld
# 查看生成信息

[root@mimo222 ~]# ll flannel*

-rw-r--r-- 1 root root 1001 Dec 15 13:59 flanneld.csr
-rw-r--r-- 1 root root  223 Dec 15 13:56 flanneld-csr.json
-rw------- 1 root root 1679 Dec 15 13:59 flanneld-key.pem
-rw-r--r-- 1 root root 1395 Dec 15 13:59 flanneld.pem

# 拷贝
[root@mimo222 ~]# cp flanneld*.pem /etc/kubernetes/ssl/

向 etcd 写入集群 Pod 网段信息

注意:本步骤只需在第一次部署 Flannel 网络时执行,后续在其它节点上部署 Flannel 时无需再写入该信息!

etcdctl --endpoints=https://10.0.11.222:2379 \
--ca-file=/opt/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
set /kubernetes/network/config '{"Network":"10.233.0.0/16"}'

写入的 Pod 网段({"Network":"10.233.0.0/16"}) 必须与 kube-controller-manager--cluster-cidr 选项值一致;

安装和配置 flanneld

下载 flanneld

[root@mimo222 ~]# mkdir /tnp/flannel

[root@mimo222 ~]# cd /tmp/flannel

[root@mimo222 ~]# wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz

[root@mimo222 ~]# tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz

[root@mimo222 ~]# cp {flanneld,mk-docker-opts.sh} /usr/local/bin

创建启动文件 flanneld.service

[root@mimo222 ~]# vi /etc/systemd/system/flanneld.service

# 添加以下信息:

[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/usr/local/bin/flanneld \\
  -etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  -etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\
  -etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\
  -etcd-endpoints=https://10.0.11.222:2379 \\
  -etcd-prefix=/kubernetes/network
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
  1. -etcd-endpoints:填写 etcd 配置的URL,注意使用https

  2. -etcd-prefix:上面第一步设置的 Pod 网段 key 前缀。我设置的 key/kubernetes/network/config,因此前缀为/kubernetes/network

  3. 注意 CA 验证证书的路径是否正确。

启动 flanneld

[root@mimo222 ~]# systemctl daemon-reload 

[root@mimo222 ~]# systemctl enable flanneld

[root@mimo222 ~]# systemctl start flanneld

[root@mimo222 ~]# systemctl status flanneld

etcd 中 flannel 网段信息查询

对于以下命令,--endpoints参数后跟的是 etcd 集群 IP:PORT(多个etcd 节点需填多个 IP:PORT),/kubernetes/network 是我这里设置的 FLANNEL_ETCD_PREFIX,因此大家可根据自己设置的flannel etcd 前缀 来填写。--ca-file--cert-file--key-file是指相应 flannel 证书路径,若没有采用 CA 验证,则不需要。

下面的命令仅是我这里用的一些命令例子,其中参数需要根据自己需要修改一下。

查看 ETCD 中 flannel 集群 Pod 网段

etcdctl --endpoints=https://10.0.11.222:2379 \
--ca-file=/opt/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
get /kubernetes/network/config

{"Network":"10.233.0.0/16"}

查看已分配的 Pod 子网段列表

etcdctl --endpoints=https://10.0.11.222:2379 \
--ca-file=/opt/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
ls /kubernetes/network/subnets

/kubernetes/network/subnets/10.233.50.0-24
/kubernetes/network/subnets/10.233.86.0-24

查看某一 Pod 网段对应的 flanneld 进程监听的 IP 和网络参数

etcdctl --endpoints=https://10.0.11.222:2379 \
--ca-file=/opt/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/flanneld.pem \
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \
get /kubernetes/network/subnets/10.233.50.0-24

{"PublicIP":"10.0.11.221"}

确保各节点间 Pod 网段能互联互通

在各节点上部署完 Flannel 后,根据上面命令查看已分配的 Pod 子网段列表(此处是我分配的网段列表):

/kubernetes/network/subnets/10.233.50.0-24
/kubernetes/network/subnets/10.233.86.0-24

在各节点上分配 ping 这两个网段的网关地址,确保能通:

ping 10.233.50.1

ping 10.233.86.1

Kubernetes Node 节点安装配置

kubernetes node节点需要安装 kubeletkube-proxyflannel 下面的配置步骤,指明在 master 节点执行的需要在 master 节点执行,没有指明的在 node 节点执行。

配置 kubelet(Master 节点执行)

kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper 角色,然后 kubelet才有权限创建认证请求(certificatesigningrequests)

# 先创建认证请求
# user 为 master 中 token.csv 文件里配置的用户
# 只需创建一次就可以

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

创建 kubelet kubeconfig 文件(Master 节点执行)

# 配置集群(server 要写 master ip 地址,不要使用 127.0.0.1 或 localhost,否则 node 节点无法识别)kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=https://10.0.11.222:6443 \
  --kubeconfig=bootstrap.kubeconfig

# 配置客户端认证(此处的 token 使用 token.csv 中的 token)kubectl config set-credentials kubelet-bootstrap \
  --token=3140a1541451afcc87ca7b715f124ce3 \
  --kubeconfig=bootstrap.kubeconfig


# 配置关联

kubectl config set-context default \
  --cluster=kubernetes \
  --user=kubelet-bootstrap \
  --kubeconfig=bootstrap.kubeconfig


# 配置默认关联
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

# 拷贝生成的 bootstrap.kubeconfig 文件

mv bootstrap.kubeconfig /etc/kubernetes/

配置 kube-proxy(Master 节点执行)

创建 kube-proxy 证书(Master 节点执行)

[root@mimo222 ~]# cd /opt/ssl

[root@mimo222 ~]# vi kube-proxy-csr.json

{"CN": "system:kube-proxy",
  "hosts": [],
  "key": {"algo": "rsa",
    "size": 2048
  },
  "names": [
    {"C": "CN",
      "ST": "TianJin",
      "L": "TianJin",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成 kube-proxy 证书和私钥(Master 节点执行)

/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/opt/ssl/config.json \
  -profile=kubernetes  kube-proxy-csr.json | /opt/local/cfssl/cfssljson -bare kube-proxy

# 查看生成
[root@mimo222 ssl]# ll kube-proxy*
-rw-r--r-- 1 root root 1013 Dec 14 20:09 kube-proxy.csr
-rw-r--r-- 1 root root  232 Dec 14 20:09 kube-proxy-csr.json
-rw------- 1 root root 1679 Dec 14 20:09 kube-proxy-key.pem
-rw-r--r-- 1 root root 1407 Dec 14 20:09 kube-proxy.pem

# 拷贝到目录
cp kube-proxy*.pem /etc/kubernetes/ssl/

创建 kube-proxy kubeconfig 文件(Master 节点执行)

# 配置集群(server 要写 master ip 地址,不要使用 127.0.0.1 或 localhost,否则 node 节点无法识别)kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=https://10.0.11.222:6443 \
  --kubeconfig=kube-proxy.kubeconfig


# 配置客户端认证(注意证书路径)kubectl config set-credentials kube-proxy \
  --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
  --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig


# 配置关联

kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig



# 配置默认关联
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

# 拷贝到目录
mv kube-proxy.kubeconfig /etc/kubernetes/

从 master 节点拷贝证书

所有需要的证书生成最好都在 master 节点进行生成,然后统一管理,node节点需要哪些,直接从 master 拷贝即可。

[root@mimo222 ~]# mkdir -p /etc/kubernetes/ssl/

[root@mimo222 ~]# cd /etc/kubernetes/

# kubelet kubeconfig 文件
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/bootstrap.kubeconfig ./

# kube-proxy kubeconfig 文件
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/kube-proxy.kubeconfig ./

[root@mimo222 ~]# cd /etc/kubernetes/ssl

# kubernetes 相关证书
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/ca.pem ./
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/kube-proxy.pem ./
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/kube-proxy-key.pem ./

# flannel 证书
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/flanneld-key.pem ./
[root@mimo222 ~]# scp 10.0.11.222:/etc/kubernetes/ssl/flanneld.pem ./

node 节点 flannel 配置

下载 flanneld

[root@mimo222 ~]# mkdir /tnp/flannel

[root@mimo222 ~]# cd /tmp/flannel

[root@mimo222 ~]# wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz

[root@mimo222 ~]# tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz

[root@mimo222 ~]# cp {flanneld,mk-docker-opts.sh} /usr/local/bin

配置并启动 flanneld

创建启动文件flanneld.service

[root@mimo222 ~]# vi /etc/systemd/system/flanneld.service

# 添加以下信息:

[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/usr/local/bin/flanneld \\
  -etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  -etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\
  -etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\
  -etcd-endpoints=https://10.0.11.222:2379 \\
  -etcd-prefix=/kubernetes/network
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
  1. -etcd-endpoints:填写 etcd 配置的URL,注意使用https

  2. -etcd-prefix:上面第一步设置的 Pod 网段 key 前缀。我设置的 key/kubernetes/network/config,因此前缀为/kubernetes/network

  3. 注意 CA 验证证书的路径是否正确。

启动 flanneld

[root@mimo222 ~]# systemctl daemon-reload 

[root@mimo222 ~]# systemctl enable flanneld

[root@mimo222 ~]# systemctl start flanneld

[root@mimo222 ~]# systemctl status flanneld

安装 kubelet、kube-proxy

[root@mimo222 ~]# cd /tmp/kubernetes

# master 节点安装时使用过这个文件,拷到 node 节点即可
[root@mimo222 ~]# wget https://dl.k8s.io/v1.8.3/kubernetes-server-linux-amd64.tar.gz

[root@mimo222 ~]# tar -xzvf kubernetes-server-linux-amd64.tar.gz

[root@mimo222 ~]# cd kubernetes

[root@mimo222 ~]# cp -r server/bin/{kube-proxy,kubelet} /usr/local/bin/

配置 kubelet.service 文件

[root@mimo222 ~]# mkdir /var/lib/kubelet

[root@mimo222 ~]# vi /etc/systemd/system/kubelet.service

[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/usr/local/bin/kubelet \
  --cgroup-driver=cgroupfs \
  --address=10.0.11.221 \
  --hostname-override=10.0.11.221 \
  --pod-infra-container-image=jicki/pause-amd64:3.0 \
  --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --cert-dir=/etc/kubernetes/ssl \
  --cluster_dns=10.254.0.2 \
  --cluster_domain=cluster.local. \
  --hairpin-mode promiscuous-bridge \
  --allow-privileged=true \
  --fail-swap-on=false \
  --serialize-image-pulls=false \
  --logtostderr=true \
  --max-pods=512 \
  --v=2

[Install]
WantedBy=multi-user.target
  1. --pod-infra-container-image:该项配置的是 pod 启动时需要一块启动的 pod-infrastructure 镜像,真实使用时最好将该文件下载到本地私有库,然后将该项配置成私有库的 pod-infrastructure 镜像下载地址。

  2. --kubeconfigkubelet启动成功之后自动生成的 kubelet.kubeconfig 文件保存路径。

启动 kubelet

[root@mimo222 ~]# systemctl daemon-reload
[root@mimo222 ~]# systemctl enable kubelet
[root@mimo222 ~]# systemctl start kubelet
[root@mimo222 ~]# systemctl status kubelet


# 如果报错 请使用
journalctl -f -t kubelet  和 journalctl -u kubelet 来定位问题

配置 TLS 认证(Master 节点执行)

# 查看 csr 的名称

[root@mimo222 ~]# kubectl get csr

NAME                                                   AGE       REQUESTOR           CONDITION
node-csr-A9WKNWyqyq89XOwg-uqCu2C4fBQEhOhzmlQJ6f8VPWE   22h       kubelet-bootstrap   Approved,Issued
node-csr-J1W94p6S2w0fjTkvpdfG0J-lRY-dmkVFH01OG3R6T4Y   3h        kubelet-bootstrap   Approved,Issued
node-csr-aVIfz5k6GX5jy31z43ZkhxzzLfkFtMUoAkJTi1Okcx8   3h        kubelet-bootstrap   Pending

# 若 CONDITION 显示为 Pending,可增加认证
# 下面的语句是将所有 Pending 状态的 csr 设置已认证
kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve

验证 nodes(Master 节点执行)

kubectl get nodes

NAME          STATUS    ROLES     AGE       VERSION
10.0.11.221   Ready     <none>    3h        v1.8.3

node 节点验证

kubelet启动成功之后,会请求 apiserver,通过验证,node 节点本地机器会自动生成配置文件与密钥,查看/etc/kubernetes

[root@mimo221 kubernetes]# ll

-rw-------. 1 root root 2195 Dec 15 10:27 bootstrap.kubeconfig
-rw-------. 1 root root 2286 Dec 15 15:43 kubelet.kubeconfig
-rw-------. 1 root root 6305 Dec 15 10:28 kube-proxy.kubeconfig
drwxr-xr-x. 2 root root  202 Dec 15 15:43 ssl

[root@mimo221 kubernetes]# ll ssl |grep kubelet

-rw-r--r--. 1 root root 1046 Dec 15 15:43 kubelet-client.crt
-rw-------. 1 root root  227 Dec 15 15:38 kubelet-client.key
-rw-r--r--. 1 root root 1111 Dec 15 15:38 kubelet.crt
-rw-------. 1 root root 1675 Dec 15 15:38 kubelet.key

配置 kube-proxy.service 文件

[root@mimo221 kubernetes]# mkdir -p /var/lib/kube-proxy

[root@mimo221 kubernetes]# vi /etc/systemd/system/kube-proxy.service

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/usr/local/bin/kube-proxy \
  --bind-address=10.0.11.222 \
  --hostname-override=k8s-master-64 \
  --cluster-cidr=10.254.0.0/16 \
  --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
  --logtostderr=true \
  --v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

启动 kube-proxy

[root@mimo221 kubernetes]# systemctl daemon-reload
[root@mimo221 kubernetes]# systemctl enable kube-proxy
[root@mimo221 kubernetes]# systemctl start kube-proxy
[root@mimo221 kubernetes]# systemctl status kube-proxy

# 如果报错 请使用
journalctl -f -t kube-proxy  和 journalctl -u kube-proxy 来定位问题

到此如果都没有报错的话,说明 kubernetes1.8.3 集群安装成功了。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149574.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计28313字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7984738
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用 AI 做了一个 1978 年至 2019 年中国大陆企业注册的查询网站 最近星哥在 GitHub 上偶然...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...