网站首页 > 开源技术 正文
简介
本文以离线方式安装IBM Cloud Pak for Business Automation所需的OpenShift环境。
系统需求
请参考下面官方链接获得详细信息。
https://docs.openshift.com/container-platform/4.7/installing/installing_bare_metal/installing-bare-metal.html
每个OCP集群必须满足如下最小需求。
Machine | OS | CPU | Memory | Disk Space |
Bootstrap | Core OS | 4 | 16 GB | 120 GB |
Master | Core OS | 4 | 16 GB | 120 GB |
Compute | Core OS or RHEL | 2 | 8 GB | 120 GB |
最小OCP集群需包含下面的机器:
l 一台Bootstrap机器,安装OCP完成后可以删除
l 三台 master (or control plane) 机器
l 至少一台compute (worker) 机器
l Bastion 机器(俗称堡垒机)。为了离线安装,它必须能访问外网把所需的镜像从quay.io下载到本地镜像服务器。
机器列表
在OCP安装过从中我们使用了如下的机器。
IP Address | Hostname | OS | Note |
182.18.18.65 | bastion | RHEL 7.9 | 堡垒机(访问外网,访问Master/Worker, 部署HAProxy,部署本地镜像服务器) |
182.18.18.66 | bootstrap | Core OS 4.8 | |
182.18.18.67 | master01 | Core OS 4.8 | |
182.18.18.68 | master02 | Core OS 4.8 | |
182.18.18.69 | master03 | Core OS 4.8 | |
182.18.18.70 | worker01 | Core OS 4.8 | |
182.18.18.71 | worker02 | Core OS 4.8 | |
182.18.18.72 | worker03 | Core OS 4.8 | |
182.18.18.73 | worker04 | Core OS 4.8 | |
182.18.18.74 | worker05 | Core OS 4.8 | |
182.18.18.75 | worker06 | Core OS 4.8 | |
182.18.18.76 | worker07 | Core OS 4.8 | |
182.18.18.77 | worker08 | Core OS 4.8 |
离线安装准备
参考下面官方链接获得详细信息。
https://docs.openshift.com/container-platform/4.2/installing/install_config/installing-restricted-networks-preparations.html
也可以参考下面官方链接获得如何从私有离线镜像服务器安装OCP的详细信息。
https://docs.openshift.com/container-platform/4.6/installing/installing_bare_metal/installing-restricted-networks-bare-metal.html
下载命令行工具
从https://mirror.openshift.com/pub/openshift-v4/clients/ocp/ 下载openshift-client-linux-<version>.tar.gz 下面使用的OCP版本是4.8.14。
把OCP 命令行工具下载到堡垒机的任意路径(如/root/temp),解压并把oc和kubectl文件移动至/usr/bin.
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.8.14/openshift-client-linux-4.8.14.tar.gz tar zxvf openshift-client-linux-4.8.14.tar.gz mv kubectl /usr/bin mv oc /usr/bin |
使用下面命令确认oc命令已正确安装。
oc version |
创建镜像服务器
安装所需的软件包。
yum install podman httpd-tools -y |
如果在安装过程中提示找不到podman,如下所示:
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
没有可用软件包 podman。
错误:无须任何处理
执行下面命令。
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms sudo yum -y install podman |
建立镜像服务器目录。
mkdir -p /home/registry/{auth,certs,data} |
为镜像服务器建立证书,如果没有权威机构颁发的证书,可以创建一个自签名的证书。
cd /home/registry/certs openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt |
根据提示输入下面的必要信息。
Country Name (2 letter code) | Specify the two-letter ISO country code for your location. See the ISO 3166 country codes standard. |
State or Province Name (full name) | Enter the full name of your state or province |
Locality Name (eg, city) | Enter the name of your city. |
Organization Name (eg, company) | Enter your company name. |
Organizational Unit Name (eg, section) | Enter your department name. |
Common Name (eg, your name or your server’s hostname) | Enter the host name for the registry host. Ensure that your hostname is in DNS and that it resolves to the expected IP address. |
Email Address | Enter your email address. For more information, see the req description in the OpenSSL documentation. |
生成访问镜像服务器的用户名和密码(比如 admin/passw0rd)
htpasswd -bBc /home/registry/auth/htpasswd admin passw0rd |
如果堡垒机上防火墙是打开状态,确保5000端口可以从外面访问。
firewall-cmd --add-port=5000/tcp --zone=internal --permanent firewall-cmd --add-port=5000/tcp --zone=public --permanent firewall-cmd --reload firewall-cmd --add-port=5002/tcp --zone=internal --permanent firewall-cmd --add-port=5002/tcp --zone=public --permanent |
创建镜像服务器的容器。
podman run --name ocp4-registry -d -p 5000:5000 \ -v /home/registry/data:/var/lib/registry:z \ -v /home/registry/auth:/auth:z \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v /home/registry/certs:/certs:z \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ docker.io/library/registry:2 |
注意:如果遇到docker pull 对匿名用户的限制,您可能需要登录 dokcer.io/library 并将该注册表映像拉到 bastion,然后创建注册表。
podman login docker.io/library
podman pull docker.io/library/registry:2
使用此命令来验证它是否有效。这里 testbostion.xxxxx.cn 是镜像服务器的主机,配置在 DNS 上。
curl -u admin:passw0rd -k https://testbostion.xxxxxx.cn:5000/v2/_catalog |
使用下面命令来起/停镜像服务器。
podman start ocp4-registry podman stop ocp4-registry |
将自签名证书添加到您的受信任证书列表中
cp /home/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/ update-ca-trust |
为镜像服务器创建Pull Secret
使用下面命令生成pull secret
生成的pullsecret_config.json如下所示:
镜像OpenShift Container Platform镜像存储库
访问 https://cloud.redhat.com/openshift/install/pull-secret 并用您的redhat订阅账号登录。然后点击 “Download pull secret”.
把它保存到 /home/registry/pullsecret.json. 编辑它,在它的最后加上本地镜像服务器的pull secret.
创建一个setEnv.sh的脚步,内容如下:
- l OCP_RELEASE:设置为发布版本,如4.8.14-x86_64, 具体版本可以在https://quay.io/repository/openshift-release-dev/ocp-release?tab=tags 上找到。
- l LOCAL_REGISTRY:本地镜像服务器的 host:port
- l LOCAL_REPOSITORY: 本地存储库的名字,设置为ocp4/openshift4
- l PRODUCT_REPO: 必须为openshift-release-dev
- l LOCAL_SECRET_JSON: 之前下载并编辑过的pullsecret.json的完整路径
- l GODEBUG=x509ignoreCN=0: 支持使用未设置Subject Alternative Name的自签名证书,必须在 oc 命令之前使用此设置
运行以下命令来镜像注册表。
chmod +x setEnv.sh . ./setEnv.sh oc adm -a ${LOCAL_SECRET_JSON} release mirror \ --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \ --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \ --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE} |
上述命令运行之后等一会,需要重启POD再运行oc adm。
如果遇到网络超时或连接重置错误,重新运行上面的 oc adm 脚本直到成功,如下图所示。
命令完成后,记下 imageContentSources 部分。以后会用到。
堡垒机准备
可以参考如下官方链接获得详细信息:
https://docs.openshift.com/container-platform/4.6/installing/installing_bare_metal/installing-bare-metal.html
OpenShift 4 需要一些支持服务:DNS 服务器、负载均衡器。我们将在此 VM 上安装负载均衡器,因为 DNS 服务器部署在单独的服务器中。此 VM 也将是登录 OCP 集群的客户端。
我们使用 RHEL 8.5 虚拟机。 IP 地址为 182.18.19.52。主机名为testbostion.xxxxx.cn。
防火墙设置
防火墙默认是打开的,可以运行下面命令关闭它。
systemctl stop firewalld.service
systemctl disable firewalld.service
如果防火墙不能被禁用,添加如下防火墙规则。
l 22623/tcp: OCP machine config server
l 6443/tcp: OCP API server
l 80/tcp: OCP ingress http
l 443/tcp: OCP ingress https
l 9000/tcp: HAProxy health report
例如,使用以下命令修改 firewalld 设置以允许 DNS, API Server, Ingress, HAProxy。
firewall-cmd --add-port=22623/tcp --zone=internal --permanent firewall-cmd --add-port=22623/tcp --zone=public --permanent firewall-cmd --add-port=6443/tcp --zone=internal --permanent firewall-cmd --add-port=6443/tcp --zone=public --permanent firewall-cmd --add-port=80/tcp --zone=internal --permanent firewall-cmd --add-port=80/tcp --zone=public --permanent firewall-cmd --add-port=443/tcp --zone=internal --permanent firewall-cmd --add-port=443/tcp --zone=public --permanent firewall-cmd --add-port=9000/tcp --zone=internal --permanent firewall-cmd --add-port=9000/tcp --zone=public --permanent firewall-cmd --reload |
安装负载均衡
可以参考 https://github.com/openshift-tigerteam/guides/blob/master/ocp4/ocp4-haproxy.cfg
我们使用HAProxy作为辅助均衡。
yum -y install haproxy |
覆盖 /etc/haproxy/haproxy.cfg,使用以下内容。
# source: https://github.com/openshift-tigerteam/guides/blob/master/ocp4/ocp4-haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close # option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- listen stats bind :9000 mode http stats enable stats uri / monitor-uri /healthz frontend openshift-api-server bind *:6443 default_backend openshift-api-server mode tcp option tcplog backend openshift-api-server balance source mode tcp server bootstrap 182.18.18.66:6443 check server master-0 182.18.18.67:6443 check server master-1 182.18.18.68:6443 check server master-2 182.18.18.69:6443 check frontend machine-config-server bind *:22623 default_backend machine-config-server mode tcp option tcplog backend machine-config-server balance source mode tcp server bootstrap 182.18.18.66:22623 check server master-0 182.18.18.67:22623 check server master-1 182.18.18.68:22623 check server master-2 182.18.18.69:22623 check frontend ingress-http bind *:80 default_backend ingress-http mode tcp option tcplog backend ingress-http balance source mode tcp server worker-0 182.18.18.70:80 check server worker-1 182.18.18.71:80 check server worker-2 182.18.18.72:80 check server worker-3 182.18.18.73:80 check server worker-4 182.18.18.74:80 check server worker-5 182.18.18.75:80 check server worker-6 182.18.18.76:80 check server worker-7 182.18.18.77:80 check frontend ingress-https bind *:443 default_backend ingress-https mode tcp option tcplog backend ingress-https balance source mode tcp server worker-0 182.18.18.70:443 check server worker-1 182.18.18.71:443 check server worker-2 182.18.18.72:443 check server worker-3 182.18.18.73:443 check server worker-4 182.18.18.74:443 check server worker-5 182.18.18.75:443 check server worker-6 182.18.18.76:443 check server worker-7 182.18.18.77:443 check #--------------------------------------------------------------------- |
将引导程序和所有Master添加到 api-server (6443) 和 machine-config-server (22623) 部分。
将所有Worker添加到 ingress-http (80) 和 ingress-https (443) 部分。
设置 SELinux policy for haproxy
setsebool -P haproxy_connect_any=1 |
启动HAProxy:
systemctl start haproxy |
将HAProxy 激活为服务
systemctl enable haproxy |
检查HAProxy状态并确认它是active
systemctl status haproxy |
访问http://testbostion.xxxxx.cn:9000/health来检查HAProxy状态。
下载安装文件
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.8.26/openshift-client-linux-4.8.26.tar.gz
对于离线安装,需要从堡垒主机上的镜像注册表中提取 openshift-install。否则虚拟机可能无法从注册服务器拉取镜像。
运行以下命令以提取 openshift-install。
. ./setEnv.sh oc adm release extract --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}" -a ${LOCAL_SECRET_JSON} |
如果上述 oc admin release 提取脚本由于网络超时问题而失败,请重试直到成功。
对于离线安装,将 openshift-install(从注册表服务器中提取)从堡垒主机复制到 /usr/bin。
cp openshift-install /usr/bin/
生成SSH私钥并添加到代理
mkdir /home/ocp48
转到 /home/ocp48。运行此命令以生成 SSH 密钥。
cd /home/ocp48 ssh-keygen -t rsa -b 4096 -N '' -C noname -f $(pwd)/openshift4_rsa |
启动 ssh-agent 进程作为后台任务。
eval "$(ssh-agent -s)" |
将您的 SSH 私钥添加到 ssh-agent。
ssh-add $(pwd)/openshift4_rsa |
把那个私钥文件拷到/root/.ssh下去,改名id_rsa
然后就可以在创建 ocp 集群后通过 ssh core@node SSO 到 OCP master/worker 节点。
创建安装配置文件
转到 /home/ocp48。创建一个名为 install-config.yaml 的文件,如下所示:
apiVersion: v1 baseDomain: xxxxx.cn compute: - hyperthreading: Enabled name: worker replicas: 0 controlPlane: hyperthreading: Enabled name: master replicas: 3 metadata: name: wytestocp networking: clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 networkType: OpenShiftSDN serviceNetwork: - 172.30.0.0/16 platform: none: {} pullSecret: '{"auths": {"testbostion.xxxxx.cn:5000": {"auth": "YWRtaW46V1lBZG1pblBhc3N3MHJk"}}}' sshkey: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCi+euX5p7uiwoMmFoHOwfzaB/9mLsl2S6HE+tJaTQ1WueB7u8ZaIYHnA7yDlze0e6L6MItHiD2CIWOcGsft+y3V7TK8Fx1m90V0ULXFEPSZXjxOx7EhZoW+2dvwWgtSZdQe4XEZVv6eMhZR1NV+cuXi/A3mFgfd66DdROlXWNSh5xJoSjjHM4yteUF58ZjrX8Rpwwkcr2VNbSVg994pz++0b5QvK2kfvqopxeGLiaMs2hVheGSEq/0OeWfVkIOBiTWocaIRJB27ykzQnEDGcBrMgIWvg74+NPK2wQ5aSetXZr1XpQLaK0ix9Ofo86EkpswSew7l6r/EjdlYUG3rVG+EeHxULjEaP0j+V+lcb80hBW6dvOCfk95qTmUSd20wFFwmYdb4a5Nl10Y6JBACK+y8NaUiOWdYMKiFv8bJfjjqsgnmv8bG9jWfEsbPp+OqSYk7ikcN64TKXWJZQ25HYWRNibdIAdqQgRNSj1CP9hp8GVTlbn98vR16Z/56Ef3k2QBtJVQsYGZJHwODdcX5oAMbLkvREfyZ47Tq+mAT0Hq+oGOHeYrRobXoUHXVbOEBEZozj6QgFbvLfQW2AaOBSBiGC1E3VQmsK6JpMwtcDdqxSVGmuOe2fbjP7rhbsYPqvt3I1x/AFSGzkIS1BKWNLnbkxLY9jsz073J3ddGBsucCw== noname' additionalTrustBundle: | -----BEGIN CERTIFICATE----- MIIGGTCCBAGgAwIBAgIUdp7KiVCgWgpitAasxxDCWdRODe4wDQYJKoZIhvcNAQEL BQAwgZsxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIZU5hbjEPMA0GA1UEBwwGSmlZ dWFuMRUwEwYDVQQKDAx3YW55YW5nZ3JvdXAxCzAJBgNVBAsMAnd5MSQwIgYDVQQD DBt0ZXN0Ym9zdGlvbi53YW55YW5nZ3JvdXAuY24xITAfBgkqhkiG9w0BCQEWEmR3 QHdhbnlhbmdncm91cC5jbjAeFw0yMjA2MTAwMTMzMjZaFw0zMjA2MDcwMTMzMjZa MIGbMQswCQYDVQQGEwJDTjEOMAwGA1UECAwFSGVOYW4xDzANBgNVBAcMBkppWXVh bjEVMBMGA1UECgwMd2FueWFuZ2dyb3VwMQswCQYDVQQLDAJ3eTEkMCIGA1UEAwwb dGVzdGJvc3Rpb24ud2FueWFuZ2dyb3VwLmNuMSEwHwYJKoZIhvcNAQkBFhJkd0B3 YW55YW5nZ3JvdXAuY24wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDe JHGEyM20bnutJHZN5EzyS7p1z2PmU30H9Jf7bEQnssNA5FVgBaU8p4KluL8FLJ+8 mOmQexgwnSKz5SuDsgQVgRTkcal7HTjO/dkYedylvdUz18aMXv9bCfLHqUPezhCl kfMyljbtBmuddQvKJ1xo1dcYHf77lVpeXqSBfQK7PNNUbElqYrfNmS4jRMnh86lq 7pTkHLQ+0Sy/VrM9iVzm2iugy0j3l2be228Ebgwwnmvdw/5mxxe8OpZ2REGla1Fb Jc4esGnVhYz2X2apIZxVO6d0DXSbp/YCQ+vLCjhH8Rh/ZhfW4UvYErrg0r9n1hj2 QCUhvdtDfkzmxyXQp/JDS+q9fyaf6O/5KotxssShNXbONiSp39g7mXErBgJNur00 bYMYyrkFsp7V6DdbQFU5ZrEdpG154oW7WGJ+ka1LhbjkdLQtN2hlOzyJFUs6NZlZ s6h5IrFbrSS4rMTuX5kdpwxO8aosLuKYWqVTFDYs9YOuHgWKOalbXbwcn0/qnlek aUS413Rtnapp5yQp/4YtoiTlrtGS6yJSI7o8+93WYfMI6UKxhRyuDVELAat39oyP W0tf9cFxYaKVz7+L7qT3UpPx/fm8omprfjGPharhIhnF3NBuy9NEWBPObQM4wDgt qmn7udZdsgxw656BGKtmf8ig3+0xXRzxR7kxcFwDdQIDAQABo1MwUTAdBgNVHQ4E FgQU8kb4VI6Pmf0JTMDe4KbKbxV1gp0wHwYDVR0jBBgwFoAU8kb4VI6Pmf0JTMDe 4KbKbxV1gp0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAm7Qq 0cpN54r0lH90UiWB6vBqqprmEQwaMYn7ZtJvNriRlTOi6vBgiQ7g5uSq8xr7xlrV duMeuHkNyoIBx7+GvXz0Z2mozlDfLTrFIHCnyw2IE4pEDM8d8gfia2/oCrlPa5GQ p/am+Va22MUwPxutqqdHBCq8hQPn6igDoQl5qoMf18VHnd0fTxzdLSzBp2Silc1T x6ViD5YPH+Sff7tOgJIDdUF4yfOnv+GFkFwEEXWZfDPAl8JZRkVZCHun/6/6ubIq RZaD0e0/Yr3GZx5ZWr/JNZZbmq1gNaU0NaaDGV9IclDRLBlkkRIKAn0Neg5oTDIo 1+GToS77+kw5kwGRAhhUBwFRxK+LPBvtjQdeOVLFYOCjY++lXfogzlKCIwj52fF+ g3UJp6Mu0AO+0MYlnK2ohfKtocAApPZL2gogis81D/VjRAOp91YZfcRqnj2VcUUs K7/lN4CSefNNh+/eqzNDkY18ldZhIddvvUWeBqx8W8GZs51evmPVK///64Hy6n70 WnRnPIyoyAwZv24ZRfooiNkNzHi8+fP+g31m+JP/8ZkxoqWhH0JAqEyZZxKN1vCb ViHvLyjx3m8e7LoyvH0e+D2bJ/UIB1sVMc+350QGjCamvoGBnbfS4CRi2/9hs1PT K7ncqGxAUot/5iF+L7+WWnOZ6+RSElW1zhAhBwM= -----END CERTIFICATE----- imageContentSources: - mirrors: - testbostion.xxxxx.cn:5000/ocp4/openshift4 source: quay.io/openshift-release-dev/ocp-release - mirrors: - testbostion.xxxxx.cn:5000/ocp4/openshift4 source: quay.io/openshift-release-dev/ocp-v4.0-art-dev |
以上内容有问题,参照文件:
- l Name “wytestocp” is the OpenShift 集群名字。它在DNS里也有配置。
- l 根据您的master节点数量更改 controlPlane 的副本。
- l 如果需要,修改域名。
- l sshkey 是上面生成的openshift4_rsa.pub 的内容。
对于离线安装:
- l pullSecret 是堡垒主机上注册服务器的pull secret。
- l additionalTrustBundle:在堡垒主机上插入registry的证书,即/opt/registry/certs/domain.crt的内容。记住必须有 2 个空格缩进
- l imageContentSource:插入镜像命令的输出。
创建此文件的备份,因为它会在您稍后创建清单和点火文件时自动删除。
cp install-config.yaml install-config.yaml.bak |
创建Kubernetes清单和Ignition配置文件
转到 /home/ocp48。使用此命令生成清单文件。
openshift-install create manifests --dir=$(pwd) |
修改 manifests/cluster-scheduler-02-config.yml Kubernetes 清单文件以防止在Master节点上调度 Pod。
vi manifests/cluster-scheduler-02-config.yml |
找到 mastersScheduable 参数并将其值设置为 false。
使用此命令创建 Ignition 文件。
openshift-install create ignition-configs --dir=$(pwd) |
将创建三个点火文件:bootstrap.ign、master.ign 和 worker.ign。
为每个点火文件创建一个shell脚本,如下所示:
l bootstrap.sh
#!/bin/bash
sudo coreos-installer install --copy-network --ignition-file=/var/home/core/bootstrap.ign /dev/sda
l master.sh
#!/bin/bash
sudo coreos-installer install --copy-network --ignition-file=/var/home/core/master.ign /dev/sda
l worker.sh
#!/bin/bash
sudo coreos-installer install --copy-network --ignition-file=/var/home/core/worker.ign /dev/sda
如果有人需要,后续内容继续连载。
猜你喜欢
- 2024-10-09 NBA 季后赛上脚合集!格林这双鞋,恐怕要火!
- 2024-10-09 黑客教你如何Web漏洞快速挖掘思路以及实操(1)
- 2024-10-09 Mac好用软件推荐(mac中好用的软件)
- 2024-10-09 Nginx从安装到高可用,一篇搞定(nginx安装教程)
- 2024-10-09 linux基础20课12,日志服务 晓桂科技
- 2024-10-09 各大站长不可忽略的日常安全隐患(站长的安全生产职责)
- 2024-10-09 9Linux系统管理之Linux系统日志文件分析
- 2024-10-09 如何实现网站访问量的统计(统计网页访问量)
- 2024-10-09 LoadRunner性能测试:基础理论梳理
- 2024-10-09 一次Linux系统被骇客入群后的分析过程
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)