java服务器常用编程环境+软件部署手册
一、环境声明
本文档所有实验、环境、工具、软件均基于CentOS 7.4 64bit操作系统进行
为了避免试验过程中不必要的麻烦发生,建议先关闭防火墙。
systemctl stop firewalld.service
systemctl disable firewalld.service
接下来,我们就从Linux操作系统环境的安装开始。
二、安装配置LINUX系统环境
这一块之前无论是视频还是图文都写过详细教程,可以直接参考。
MACOS系统图⽂教程
MACOS系统视频教程
WINDOWS系统图⽂教程
三、GIT工具安装
方式一:通过包管理器安装
在Linux上安装Git向来 仅需一行命令 即可搞定,因为各式各样的 包管理器 帮了我们大忙,所以对于CentOS系统来讲,直接执行如下命令即可安装:
yum install git
当然通过这种方式安装的Git可能不是较新版的Git,以我们的实验环境CentOS 7.4来说,这种方式安装的Git版本为1.8.3.1,不过一般来说是够用的。
方法二:通过源码编译安装
如果想安装较新版本的Git,则需要自行下载Git源码来编译安装。
1 、准备Git安装包
我这里选择安装的是2.26.2版,将下载好的安装包v2.26.2.tar.gz直接放在了root目录下,然后将其本地解压,得到git-2.26.2目录:
[root@localhost ~]# tar -zxvf v2.26.2.tar.gz
2 、提前安装可能所需的依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib- devel gcc-c++ perl-ExtUtils-MakeMaker
3 、编译安装Git
进入到对应目录,执行配置、编译、安装命令即可,如下所示:
[root@localhost ~]# cd git-2.26.2/
[root@localhost git-2.26.2]# make configure
[root@localhost git-2.26.2]# ./configure --prefix=/usr/local/git
[root@localhost git-2.26.2]# make profix=/usr/local/git
[root@localhost git-2.26.2]# make install
4 、将Git加入环境变量
将Git的可执行程序加入环境变量,便于后续使用
编辑配置文件:
vim /etc/profile
尾部加入Git的bin路径配置即可
export GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin
最后执行 source /etc/profile使环境变量生效即可。
5 、查看安装结果
执行git --version查看安装后的版本即可
四、JDK(JAVA环境)安装
注意:这里安装的是Oracle JDK
1、准备JDK安装包
我这里下载的是jdk-8u161-linux-x64.tar.gz安装包,并将其直接放在了root目录下
2、卸载已有的OPENJDK(如果有)
如果系统自带有OpenJDK,可以按照如下步骤提前卸载之。
首先查找已经安装的OpenJDK包:
rpm -qa | grep java
接下来可以将java开头的安装包均卸载即可:
yum -y remove java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_
yum -y remove java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_
... 省略 ...
3、创建目录并解压
-
在/usr/local/下创建java文件夹并进入
cd /usr/local/ mkdir java cd java
-
将上面准备好的JDK安装包解压到/usr/local/java中即可
tar -zxvf /root/jdk-8u161-linux-x64.tar.gz -C ./
解压完之后,/usr/local/java目录中会出现一个jdk1.8.0_161的目录
4、配置JDK环境变量
编辑/etc/profile文件,在文件尾部加入如下JDK环境配置即可
JAVA_HOME=/usr/local/java/jdk1.8.0_161
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
然后执行如下命令让环境变量生效
source /etc/profile
5、验证JDK安装结果
输入如下命令即可检查安装结果:
java -version
javac
五、NODE环境安装
1、准备NODE安装包
我这里下载的是node-v12.16.3-linux-x64.tar.xz安装包,并将其直接放在了root目录下
2、创建目录并解压
-
在/usr/local/下创建node文件夹并进入
cd /usr/local/ mkdir node cd node
-
将Node的安装包解压到/usr/local/node中即可
[root@localhost node]# tar -xJvf /root/node-v12.16.3-linux-x64.tar.xz -C ./
解压完之后,/usr/local/node目录中会出现一个node-v12.16.3-linux-x64的目录
3、配置NODE系统环境变量
编辑~/.bash_profile
文件,在文件末尾追加如下信息:
# Nodejs
export PATH=/usr/local/node/node-v12.16.3-linux-x64/bin:$PATH
刷新环境变量,使之生效即可:
source ~/.bash_profile
4、检查安装结果
node -v
npm version
npx -v
均有版本信息输出即可
六、PYTHON环境安装
CentOS 7.4默认自带了一个Python2.7环境
然而现在主流都是Python3,所以接下来再装一个Python3,打造一个共存的环境。
1、准备PYTHON3安装包并解压
我这里下载的是Python-3.8.3.tgz安装包,并将其直接放在了/root目录下
执行如下命令解压之:
tar zxvf Python-3.8.3.tgz
则可以在当前目录得到文件夹:Python-3.8.
2、安装相关预备环境
直接执行如下命令即可:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
3、编译并安装
这里指定了安装目录为/usr/local/python3,有需要可以自定义
cd Python-3.8.3/
./configure prefix=/usr/local/python3
make && make install
等安装过程完毕,/usr/local/python3目录就会生成了
4、添加软链接
我们还需要将刚刚安装生成的目录/usr/local/python3里的python3可执行文件做一份软链接,链接到/usr/bin下,方便后续使用python3
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
5、验证安装
命令行输入python3,即可查看Python3版本的安装结果
而输入python,依然还是python2.7.5环境
七、MAVEN项目构建和管理工具安装
1、准备MAVEN安装包并解压
这里下载的是apache-maven-3.6.3-bin.tar.gz安装包,并将其放置于提前创建好的/opt/maven
目录下。
执行命令解压之:
tar zxvf apache-maven-3.6.3-bin.tar.gz
即可在当前目录得到/opt/maven/apache-maven-3.6.3目录
2、配置MAVEN加速镜像源
这里配置的是阿里云的maven镜像源。
编辑修改 /opt/maven/apache-maven-3.6.3/conf/settings.xml
文件,在
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3、配置环境变量
因为下载的是二进制版安装包,所以解压完,配置好环境变量即可使用了。
编辑修改/etc/profile文件,在文件尾部添加如下内容,配置maven的安装路径
export MAVEN_HOME=/opt/maven/apache-maven-3.6.
export PATH=$MAVEN_HOME/bin:$PATH
接下来执行source /etc/profile来刷新环境变量,让maven环境的路径配置生效。
4、检验安装结果
执行mvn –v,能打印出maven版本信息说明安装、配置成功
八、MYSQL数据库部署和安装
1、首先准备安装包
这里下载的是mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz安装包,并将其直接放在了root目录下
2、卸载系统自带的MARIADB(如果有)
如果系统之前自带Mariadb,可以先卸载之。
首先查询已安装的Mariadb安装包:
rpm -qa|grep mariadb
将其均卸载之:
yum -y remove mariadb-server-5.5.56-2.el7.x86_
yum -y remove mariadb-5.5.56-2.el7.x86_
yum -y remove mariadb-devel-5.5.56-2.el7.x86_
yum -y remove mariadb-libs-5.5.56-2.el7.x86_
3、解压MYSQL安装包
将上面准备好的MySQL安装包解压到/usr/local/目录,并重命名为mysql
tar -zxvf /root/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C
/usr/local/
mv mysql-5.7.30-linux-glibc2.12-x86_64 mysql
4、创建MYSQL用户和用户组
groupadd mysql
useradd -g mysql mysql
同时新建/usr/local/mysql/data目录,后续备用
5、修改MYSQL目录的归属用户
[root@localhost mysql]# chown -R mysql:mysql ./
6、准备MYSQL的配置文件
在/etc目录下新建my.cnf文件
写入如下简化配置:
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf
socket=/var/lib/mysql/mysql.sock
[mysqld]
skip-name-resolve
#设置 3306 端口
port = 3306
socket=/var/lib/mysql/mysql.sock
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=
# 服务端使用的字符集默认为 8 比特编码的latin1字符集
character-set-server=utf
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
同时使用如下命令创建/var/lib/mysql目录,并修改权限:
mkdir /var/lib/mysql
chmod 777 /var/lib/mysql
7、正式开始安装MYSQL
执行如下命令正式开始安装:
cd /usr/local/mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --
datadir=/usr/local/mysql/data
注意:记住上面打印出来的root的密码,后面首次登陆需要使用
8、复制启动脚本到资源目录
执行如下命令复制:
[root@localhost mysql]# cp ./support-files/mysql.server
/etc/init.d/mysqld
并修改/etc/init.d/mysqld,修改其basedir和datadir为实际对应目录:
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
8、设置MYSQL系统服务并开启自启
首先增加mysqld服务控制脚本执行权限:
chmod +x /etc/init.d/mysqld
同时将mysqld服务加入到系统服务:
chkconfig --add mysqld
最后检查mysqld服务是否已经生效即可:
chkconfig --list mysqld
这样就表明mysqld服务已经生效了,在 2 、 3 、 4 、 5 运行级别随系统启动而自动启动,以后可以直接使
用service命令控制mysql的启停。
10、启动MYSQLD
直接执行:
service mysqld start
11、将 MYSQL 的 BIN 目录加入 PATH 环境变量
这样方便以后在任意目录上都可以使用mysql提供的命令。
编辑 ~/.bash_profile文件,在文件末尾处追加如下信息:
export PATH=$PATH:/usr/local/mysql/bin
最后执行如下命令使环境变量生效
source ~/.bash_profile
12、首次登陆MYSQL
以root账户登录mysql,使用上文安装完成提示的密码进行登入
mysql -u root -p
13、接下来修改ROOT账户密码
在mysql的命令行执行如下命令即可,密码可以换成
mysql>alter user user() identified by "111111";
mysql>flush privileges;
14、设置远程主机登录
mysql> use mysql;
mysql> update user set user.Host='%' where user.User='root';
mysql> flush privileges;
15、最后利用NAVICAT等工具进行测试即可:
九、REDIS缓存安装部署
1、首先准备REDIS安装包
这里下载的是redis-5.0.8.tar.gz安装包,并将其直接放在了root目录下
2、解压安装包
1 、在/usr/local/下创建redis文件夹并进入
cd /usr/local/
mkdir redis
cd redis
2 、将Redis安装包解压到/usr/local/redis中即可
[root@localhost redis]# tar zxvf /root/redis-5.0.8.tar.gz -C ./
解压完之后,/usr/local/redis目录中会出现一个redis-5.0.8的目录
3、编译并安装
cd redis-5.0.8/
make && make install
4、将 REDIS 安装为系统服务并后台启动
进入utils目录,并执行如下脚本即可:
[root@localhost redis-5.0.8]# cd utils/
[root@localhost utils]# ./install_server.sh
此处我全部选择的默认配置即可,有需要可以按需定制
5、查看REDIS服务启动情况
直接执行如下命令来查看Redis的启动结果:
systemctl status redis_6379.service
6、启动REDIS客户端并测试
启动自带的redis-cli客户端,测试通过:
但是此时只能在本地访问,无法远程连接,因此还需要做部分设置
7、设置允许远程连接
编辑redis配置文件
vim /etc/redis/6379.conf
将 bind 127.0.0.1 修改为 0.0.0.0
然后重启Redis服务即可:
systemctl restart redis_6379.service
8、设置访问密码
编辑redis配置文件
systemctl restart redis_6379.service
找到如下内容:
#requirepass foobared
去掉注释,将foobared修改为自己想要的密码,保存即可。
requirepass codesheep
保存,重启Redis服务即可
systemctl restart redis_6379.service
这样后续的访问需要先输入密码认证通过方可:
十、消息队列RABBITMQ安装部署
1、首先安装ERLANG环境
因为RabbitMQ需要erlang环境的支持,所以必须先安装erlang。
我们这里要安装的是 erlang-22.3.3-1.el7.x86_64.rpm,所以首先执行如下命令来安装其对应的yum repo:
curl -s
https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm
.sh | sudo bash
接下来执行如下命令正式安装erlang环境:
yum install erlang-22.3.3-1.el7.x86_64
接着上面提示再次执行如下命令即可:
yum load-transaction /tmp/yum_save_tx.2020-05-14.22-21.n0cwzm.yumtx
接下来可以直接执行如下命令,测试erlang是否安装成功:
erl
2、安装RABBITMQ
接下来正式开始安装rabbitmq,首先依然是安装其对应的yum repo:
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-
server/script.rpm.sh | sudo bash
然后执行如下命令正式安装rabbitmq:
yum install rabbitmq-server-3.8.3-1.el7.noarch
3、设置RABBITMQ开机启动
chkconfig rabbitmq-server on
4、启动RABBITMQ服务
systemctl start rabbitmq-server.service
5、开启WEB可视化管理插件:
rabbitmq-plugins enable rabbitmq_management
6、访问可视化管理界面:
浏览器输入:你的服务器IP:15672
能看到网⻚登录入口即可。
我们可以在后台先添加一个用户/密码对:
rabbitmqctl add_user codesheep 123456
rabbitmqctl set_user_tags codesheep administrator
然后登录网页即可
十一、应用服务器TOMCAT安装部署
1、准备安装包
这里使用的是8.5.55版:apache-tomcat-8.5.55.tar.gz,直接将其放在了/root目录下
2、解压并安装
在/usr/local/下创建tomcat文件夹并进入
cd /usr/local/
mkdir tomcat
cd tomcat
2 、将Tomcat安装包解压到/usr/local/tomcat中即可
[root@localhost tomcat]# tar -zxvf /root/apache-tomcat-8.5.55.tar.gz -C ./
解压完之后,/usr/local/tomcat目录中会出现一个apache-tomcat-8.5.55的目录
3、启动TOMCAT
直接进apache-tomcat-8.5.55目录,执行其中bin目录下的启动脚本即可
[root@localhost apache-tomcat-8.5.55]# cd bin/
[root@localhost bin]# ./startup.sh
这时候浏览器访问:你的主机IP:8080,得到如下画面说明成功启动了
4、配置快捷操作和开机启动
首先进入/etc/rc.d/init.d目录,创建一个名为tomcat的文件,并赋予执行权限
[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# touch tomcat
[root@localhost init.d]# chmod +x tomcat
接下来编辑tomcat文件,并在其中加入如下内容:
#!/bin/bash
#chkconfig:- 20 90
#description:tomcat
#processname:tomcat
TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-8.5.55
case $1 in
start) su root $TOMCAT_HOME/bin/startup.sh;;
stop) su root $TOMCAT_HOME/bin/shutdown.sh;;
*) echo "require start|stop" ;;
esac
这样后续对于Tomcat的开启和关闭只需要执行如下命令即可:
service tomcat start
service tomcat stop
最后加入开机启动即可:
chkconfig --add tomcat
chkconfig tomcat on
十二、WEB服务器NGINX安装部署
1、首先安装包并解压
这里下载的是nginx-1.17.10.tar.gz安装包,并将其直接放在了root目录下
1 、在/usr/local/下创建nginx文件夹并进入
cd /usr/local/
mkdir nginx
cd nginx
2 、将Nginx安装包解压到/usr/local/nginx中即可
[root@localhost nginx]# tar zxvf /root/nginx-1.17.10.tar.gz -C ./
解压完之后,/usr/local/nginx目录中会出现一个nginx-1.17.10的目录
2、预先安装额外的依赖
yum -y install pcre-devel
yum -y install openssl openssl-devel
3、编译安装NGINX
cd nginx-1.17.10
./configure
make && make install
安装完成后,Nginx的可执行文件位置位于
/usr/local/nginx/sbin/nginx
4、启动NGINX
直接执行如下命令即可:
[root@localhost sbin]# /usr/local/nginx/sbin/nginx
如果想停止Nginx服务,可执行:
/usr/local/nginx/sbin/nginx -s stop
如果修改了配置文件后想重新加载Nginx,可执行:
/usr/local/nginx/sbin/nginx -s reload
注意其配置文件位于:
/usr/local/nginx/conf/nginx.conf
5、浏览器验证启动情况
十三、DOCKER环境安装
1、安装DOCKER
yum install -y docker
静候安装完毕即可
2、开启DOCKER服务
systemctl start docker.service
3、查看安装结果
docker version
4、设置开机启动
systemctl enable docker.service
5、配置DOCKER镜像下载加速
默认安装后的Docker环境在拉取Docker镜像时速度很慢:
因此我们需要手动配置镜像加速源,提升获取Docker镜像的速度。
配置方法非常简单。
直接编辑配置文件:
vim /etc/docker/daemon.json
在其中加入加速镜像源地址即可:
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
比如这里使用的是网易的加速源,其他像阿里云、DaoCloud这些也都提供加速源,按需选择即可。
加完加速地址后,重新加载配置文件,重启docker服务即可:
systemctl daemon-reload
systemctl restart docker.service
这样镜像加速器就配置完成了,后续下载docker镜像速度将大增。
主机名 IP ⻆色
k8s-master 192.168.39.79 k8s主节点
k8s-node-1 192.168.39.77 k8s从节点
k8s-node-2 192.168.39.78 k8s从节点
十四、KUBERNETES集群部署
1、概 述
Kubernetes集群的搭建方法其实有多种,比如我在之前的文章《利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)》中使用的就是二进制的安装方法。虽然这种方法有利于我们理解 k8s集群,但却过于繁琐。kubeadm是 Kubernetes官方提供的用于快速部署Kubernetes集群的工具,其历经发展如今已经比较成熟了,利用其来部署 Kubernetes集群可以说是非常好上手,操作起来也简便了许多,下面详细叙述之。
2、节点规划
本文准备部署一个 一主两从 的 三节点 Kubernetes集群,整体节点规划如下表所示:
主机名 | IP | 角色 |
---|---|---|
k8s-master | 192.168.39.79 | k8s主节点 |
k8s-node-1 | 192.168.39.77 | k8s从节点 |
k8s-node-2 | 192.168.39.78 | k8s从节点 |
下面介绍一下各个节点的软件版本:
操作系统:CentOS-7.4-64Bit
Docker版本:1.13.1
Kubernetes版本:1.13.1
所有节点都需要安装以下组件:
Docker:不用多说了吧
kubelet:运行于所有 Node上,负责启动容器和 Pod
kubeadm:负责初始化集群
kubectl: k8s命令行工具,通过其可以部署/管理应用 以及CRUD各种资源
3、准备工作
- 所有节点关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service
- 禁用SELINUX
setenforce 0
vi /etc/selinux/config
SELINUX=disabled
- 所有节点关闭 swap
swapoff -a
- 设置所有节点主机名
hostnamectl --static set-hostname k8s-master
hostnamectl --static set-hostname k8s-node-1
hostnamectl --static set-hostname k8s-node-2
- 所有节点 主机名/IP加入 hosts解析
编辑 /etc/hosts文件,加入以下内容:
192.168.39.79 k8s-master
192.168.39.77 k8s-node-1
192.168.39.78 k8s-node-2
4、组件安装
- Docker安装(所有节点)
不赘述了,参考上文Docker环境安装
- kubelet、kubeadm、kubectl安装(所有节点)
首先准备repo
cat>>/etc/yum.repos.d/kubrenetes.repo<<EOF
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-
x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
EOF
然后执行如下指令来进行安装
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX= disabled/' /etc/selinux/config
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
5、MASTER节点配置
- 初始化 k8s集群
为了应对网络不畅通的问题,我们国内网络环境只能提前手动下载相关镜像并重新打 tag :
docker pull mirrorgooglecontainers/kube-apiserver:v1.13.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.1
docker pull mirrorgooglecontainers/kube-proxy:v1.13.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.2.24
docker pull coredns/coredns:1.2.6
docker pull registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64
docker tag mirrorgooglecontainers/kube-apiserver:v1.13.1
k8s.gcr.io/kube-apiserver:v1.13.1
docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.1
k8s.gcr.io/kube-controller-manager:v1.13.1
docker tag mirrorgooglecontainers/kube-scheduler:v1.13.1
k8s.gcr.io/kube-scheduler:v1.13.1
docker tag mirrorgooglecontainers/kube-proxy:v1.13.1 k8s.gcr.io/kubeproxy:v1.13.1
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
docker tag registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64
quay.io/coreos/flannel:v0.10.0-amd64
docker rmi mirrorgooglecontainers/kube-apiserver:v1.13.1
docker rmi mirrorgooglecontainers/kube-controller-manager:v1.13.1
docker rmi mirrorgooglecontainers/kube-scheduler:v1.13.1
docker rmi mirrorgooglecontainers/kube-proxy:v1.13.1
docker rmi mirrorgooglecontainers/pause:3.1
docker rmi mirrorgooglecontainers/etcd:3.2.24
docker rmi coredns/coredns:1.2.6
docker rmi registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64
然后再在 Master节点上执行如下命令初始化 k8s集群:
kubeadm init --kubernetes-version=v1.13.1 --apiserver-advertise-address
192.168.39.79 --pod-network-cidr=10.244.0.0/16
--kubernetes-version: 用于指定 k8s版本
--apiserver-advertise-address:用于指定使用 Master的哪个network interface进行通
信,若不指定,则 kubeadm会自动选择具有默认网关的 interface
--pod-network-cidr:用于指定Pod的网络范围。该参数使用依赖于使用的网络方案,本文
将使用经典的flannel网络方案。
执行命令后,控制台给出了如下所示的详细集群初始化过程:
[root@localhost ~]# kubeadm init --config kubeadm-config.yaml
W1224 11:01:25.408209 10137 strict.go:54] error unmarshaling
configuration schema.GroupVersionKind{Group:"kubeadm.k8s.io",
Version:"v1beta1", Kind:"ClusterConfiguration"}: error unmarshaling
JSON: while decoding JSON: json: unknown field "\u00a0 podSubnet”
[init] Using Kubernetes version: v1.13.1
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of
your internet connection
[preflight] You can also perform this action in beforehand using
'kubeadm config images pull’
[kubelet-start] Writing kubelet environment file with flags to file
"/var/lib/kubelet/kubeadm-flags.env”
[kubelet-start] Writing kubelet configuration to file
"/var/lib/kubelet/config.yaml”
[kubelet-start] Activating the kubelet service
[certs] Using certificateDir folder "/etc/kubernetes/pki”
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names
[localhost.localdomain localhost] and IPs [192.168.39.79 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names
[localhost.localdomain localhost] and IPs [192.168.39.79 127.0.0.1 ::1]
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names
[localhost.localdomain kubernetes kubernetes.default
kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs
[10.96.0.1 192.168.39.79]
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes”
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests”
[control-plane] Creating static Pod manifest for "kube-apiserver”
[control-plane] Creating static Pod manifest for "kube-controllermanager”
[control-plane] Creating static Pod manifest for "kube-scheduler”
[etcd] Creating static Pod manifest for local etcd in
"/etc/kubernetes/manifests”
[wait-control-plane] Waiting for the kubelet to boot up the control
plane as static Pods from directory "/etc/kubernetes/manifests". This
can take up to 4m0s
[apiclient] All control plane components are healthy after 24.005638
seconds
[uploadconfig] storing the configuration used in ConfigMap "kubeadmconfig" in the "kube-system” Namespace
0x02. 配置 kubectl
在 Master上⽤ root⽤户执⾏下列命令来配置 kubectl:
[kubelet] Creating a ConfigMap "kubelet-config-1.13" in namespace kubesystem with the configuration for the kubelets in the cluster
[patchnode] Uploading the CRI Socket information
"/var/run/dockershim.sock" to the Node API object
"localhost.localdomain" as an annotation
[mark-control-plane] Marking the node localhost.localdomain as controlplane by adding the label "node-role.kubernetes.io/master=''”
[mark-control-plane] Marking the node localhost.localdomain as controlplane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: 26uprk.t7vpbwxojest0tvq
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap,
RBAC Roles
[bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens
to post CSRs in order for nodes to get long term certificate
credentials
[bootstraptoken] configured RBAC rules to allow the csrapprover
controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] configured RBAC rules to allow certificate rotation
for all node client certificates in the cluster
[bootstraptoken] creating the "cluster-info" ConfigMap in the "kubepublic” namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes master has initialized successfully!
To start using your cluster, 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
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed
at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on
each node
as root:
kubeadm join 192.168.39.79:6443 --token 26uprk.t7vpbwxojest0tvq --
discovery-token-ca-cert-hash
sha256:028727c0c21f22dd29d119b080dcbebb37f5545e7da1968800140ffe225b0123
[root@localhost ~]#
- 配置 kubectl
在 Master上用 root用户执行下列命令来配置 kubectl:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
echo $KUBECONFIG
- 安装Pod网络
安装 Pod网络是 Pod之间进行通信的必要条件,k8s支持众多网络方案,这里我们依然选用经典的
flannel方案
首先设置系统参数:
sysctl net.bridge.bridge-nf-call-iptables=1
然后在 Master节点上执行如下命令:
kubectl apply -f kube-flannel.yaml
kube-flannel.yaml
⽂件在此
一旦 Pod网络安装完成,可以执行如下命令检查一下 CoreDNS Pod此刻是否正常运行起来了,一旦其
正常运行起来,则可以继续后续步骤
kubectl get pods --all-namespaces -o wide
同时我们可以看到主节点已经就绪:kubectl get nodes
6、添加 SLAVE节点
在两个 Slave节点上分别执行如下命令来让其加入Master上已经就绪了的 k8s集群:
kubeadm join --token <token> <master-ip>:<master-port> --discoverytoken-ca-cert-hash sha256:<hash>
如果 token忘记,则可以去 Master上执行如下命令来获取:
kubeadm token list
上述kubectl join命令的执行结果如下:
[root@localhost ~]# kubeadm join 192.168.39.79:6443 --token
yndddp.oamgloerxuune80q --discovery-token-ca-cert-hash
sha256:7a45c40b5302aba7d8b9cbd3afc6d25c6bb8536dd6317aebcd2909b0427677c8
[preflight] Running pre-flight checks
[discovery] Trying to connect to API Server "192.168.39.79:6443”
[discovery] Created cluster-info discovery client, requesting info from
"https://192.168.39.79:6443”
[discovery] Requesting info from "https://192.168.39.79:6443" again to
validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS
certificate validates against pinned roots, will use API Server
"192.168.39.79:6443”
[discovery] Successfully established connection with API Server
"192.168.39.79:6443”
[join] Reading configuration from the cluster...
[join] FYI: You can look at this config file with 'kubectl -n kube-
system get cm kubeadm-config -oyaml’
[kubelet] Downloading configuration for the kubelet from the "kubelet-
config-1.13" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file
"/var/lib/kubelet/config.yaml”
[kubelet-start] Writing kubelet environment file with flags to file
"/var/lib/kubelet/kubeadm-flags.env”
[kubelet-start] Activating the kubelet service
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information
"/var/run/dockershim.sock" to the Node API object
"localhost.localdomain" as an annotation
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was
received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the master to see this node join the
cluster.
7、效果验证
查看节点状态
kubectl get nodes
查看所有 Pod状态
kubectl get pods --all-namespaces -o wide
好了,集群现在已经正常运行了,接下来看看如何正常的拆卸集群。
8、拆卸集群
首先处理各节点:
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>
一旦节点移除之后,则可以执行如下命令来重置集群:
kubeadm reset
9、安装 DASHBOARD
就像给elasticsearch配一个可视化的管理工具一样,我们最好也给 k8s集群配一个可视化的管理工具,便于管理集群。
因此我们接下来安装 v1.10.0版本的 kubernetes-dashboard,用于集群可视化的管理。
首先手动下载镜像并重新打标签:(所有节点)
docker pull registry.cn-qingdao.aliyuncs.com/wangxiaoke/kubernetes-
dashboard-amd64:v1.10.0
docker tag registry.cn-qingdao.aliyuncs.com/wangxiaoke/kubernetes-
dashboard-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.0
docker image rm registry.cn-qingdao.aliyuncs.com/wangxiaoke/kubernetes-
dashboard-amd64:v1.10.0
安装 dashboard:
kubectl create -f dashboard.yaml
dashboard.yaml ⽂件在此
查看 dashboard的 pod是否正常启动,如果正常说明安装成功:
kubectl get pods --namespace=kube-system
[root@k8s-master ~]# kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS
AGE
coredns-86c58d9df4-4rds2 1/1 Running 0
81m
coredns-86c58d9df4-rhtgq 1/1 Running 0
81m
etcd-k8s-master 1/1 Running 0
80m
kube-apiserver-k8s-master 1/1 Running 0
80m
kube-controller-manager-k8s-master 1/1 Running 0
80m
kube-flannel-ds-amd64-8qzpx 1/1 Running 0
78m
kube-flannel-ds-amd64-jvp59 1/1 Running 0
77m
kube-flannel-ds-amd64-wztbk 1/1 Running 0
78m
kube-proxy-crr7k 1/1 Running 0
81m
kube-proxy-gk5vf 1/1 Running 0
78m
kube-proxy-ktr27 1/1 Running 0
77m
kube-scheduler-k8s-master 1/1 Running 0
80m
kubernetes-dashboard-79ff88449c-v2jnc 1/1 Running 0
21s
查看 dashboard的外网暴露端口
kubectl get service --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP
PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none>
53/UDP,53/TCP 5h38m
kubernetes-dashboard NodePort 10.99.242.186 <none>
443:31234/TCP 14
生成私钥和证书签名:
openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
rm dashboard.pass.key
openssl req -new -key dashboard.key -out dashboard.csr【如遇输⼊,⼀路回⻋
即可】
生成SSL证书:
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey
dashboard.key -out dashboard.crt
然后将生成的 dashboard.key 和 dashboard.crt置于路径 /home/share/certs下,该路
径会配置到下面即将要操作的dashboard-user-role.yaml文件中
创建 dashboard用户
kubectl create -f dashboard-user-role.yaml
dashboard-user-role.yaml ⽂件在此
获取登陆token
kubectl describe secret/$(kubectl get secret -nkube-system |grep
admin|awk '{print $1}') -nkube-system
[root@k8s-master ~]# kubectl describe secret/$(kubectl get secret -
nkube-system |grep admin|awk '{print $1}') -nkube-system
Name: admin-token-9d4vl
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin
kubernetes.io/service-account.uid: a320b00f-07ed-11e9-
93f2-000c2978f207
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2
NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlL
XN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJh
ZG1pbi10b2tlbi05ZDR2bCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2Vydml
jZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bn
Qvc2VydmljZS1hY2NvdW50LnVpZCI6ImEzMjBiMDBmLTA3ZWQtMTFlOS05M2YyLTAwMGMyO
Tc4ZjIwNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1p
biJ9.WbaHx-BfZEd0SvJwA9V_vGUe8jPMUHjKlkT7MWJ4JcQldRFY8Tdpv5GKCY25JsvT_GM3ob303r0yE
6vjQdKna7EfQNO_Wb2j1Yu5UvZnWw52HhNudHNOVL_fFRKxkSVjAILA_C_HvW6aw6TG5h7z
HARgl71I0LpW1VESeHeThipQ-pkt-Dr1jWcpPgE39cwxSgi-
5qY4ssbyYBc2aPYLsqJibmE-KUhwmyOheF4Lxpg7E3SQEczsig2HjXpNtJizCu0kPyiR4qbbsusulH-kdgjhmD9_XWP9k0BzgutXWteV8Iqe4-uuRGHZAxgutCvaL5qENv4OAlaArlZqSgkNWw
token既然生成成功,接下来就可以打开浏览器,输入 token来登录进集群管理⻚面:
十五、ELASTICSEARCH集群部署
1、环境准备
节点准备
本文准备搭建 双节点 Elasticsearch集群(用双节点仅仅是做演示),因此这里准备了两台 Linux
CentOS 7.4 64bit 机器:
节点 1 :192.168.31.8
节点 2 :192.168.31.9
Elasticsearch 安装包准备
这里下载的是:6.4.2版
wget
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-
6.4.2.tar.gz
安装目录准备
这里拟将 Elasticsearch安装在 /opt/elasticsearch 目录下:
kdir /opt/elasticsearch
将压缩包复制到该⽬录下并解压
2、ELASTICSEARCH 集群配置
需要修改两个节点上的配置文件 elasticsearch.yml
节点 1 配置
cluster.name: codesheep # 集群名称
node.name: sheep1 # 节点名
network.host: 192.168.31.8 # 绑定的节点1地址
network.bind_host: 0.0.0.0 # 此项不设置你试试本机可能访问不了啊
discovery.zen.ping.unicast.hosts: ["192.168.31.8","192.168.31.9"] #
hosts列表
discovery.zen.minimum_master_nodes: 1
## 如下配置是为了解决 Elasticsearch可视化⼯具 dejavu的跨域问题!若不⽤可视化⼯具
则可省略之
http.port: 9200
http.cors.allow-origin: "http://192.168.199.76:1358"
http.cors.enabled: true
http.cors.allow-headers : X-Requested-With,X-Auth-Token,ContentType,Content-Length,Authorization
http.cors.allow-credentials: true
节点 2 配置
cluster.name: codesheep # 集群名称
node.name: sheep1 # 节点名
network.host: 192.168.31.9 # 绑定的节点2地址
network.bind_host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["192.168.31.8","192.168.31.9"] #
hosts列表
discovery.zen.minimum_master_nodes: 1
## 如下配置是为了解决 Elasticsearch可视化⼯具 dejavu的跨域问题!若不⽤可视化⼯具
则可省略之
http.port: 9200
http.cors.allow-origin: "http://192.168.199.76:1358"
http.cors.enabled: true
http.cors.allow-headers : X-Requested-With,X-Auth-Token,ContentType,Content-Length,Authorization
http.cors.allow-credentials: true
3、集群启动前准备
创建用户及用户组
由于 Elasticsearch不能以 root用户启动,因此需要添加非 root用户:
groupadd es
useradd es -g es
chown -R es:es ./elasticsearch-6.4.2
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
4、启动 ELASTICSEARCH集群
切换用户
su es
分别在 节点 1 和 节点 2 上启动ES服务
cd bin
./elasticsearch // 若要后台启动,则加-d参数
浏览器访问:http://ip:9200/ 查看启动效果
命令行查看集群信息
利用可视化工具 dejavu查看集群信息
关于 Elasticsearch集群可视化管理工具的上手,可以参考我的前文:关于 Elasticsearch集群可视化管理⼯具的上⼿,可以参考我的前⽂:《⼀⽂上⼿ Elasticsearch常⽤可视化管理⼯具》
接下来插入两条数据
curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user": "张三",
"title": "⼯程师",
"desc": "数据库管理"
}'
curl -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user": "赵四",
"title": "设计师",
"desc": "UI设计"
}'
查看数据的入库效果
OK, 索引 / 类型 / 文档 一目了然!
若在 Elasticsearch集群 安装/启动 过程 中有任何奇葩 问题/错误 的话,可以参考这篇文章:
《CentOS7上ElasticSearch安装填坑记》吧,里面记录了一些踩过的坑!
5、安装IK分词器
在 Elasticsearch的世界中,插件是很重要的一部分,很多功能都可以通过插件来实现,因此下面
就以常用的 IK分词器插件 的安装为例,来操作一下 Elasticsearch插件的安装
分词技术是搜索技术的基石,而 IK分词器是比较经典的一个,接下来尝试安装一下吧
IK分词器版本与 ES版本对应,不能搞错,可在 这⾥查看
- 下载 IK分词器插件
wget https://github.com/medcl/elasticsearch-analysis- ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip
- 解压 / 安装
新建目录 /opt/elasticsearch/elasticsearch-6.4.2/plugins/elasticsearch-analysis-ik-6.4.2
再将 zip包置于上述目录下并解压:
unzip elasticsearch-analysis-ik-6.4.2.zip
- 重启 Elasticsearch集群
重启 Elasticsearch集群,若发现如下内容,这说明插件安装成功:
怎么样,很简单吧,说到底就是一个解压放置的过程而已。
十六、ZOOKEEPER安装部署
1、准备安装包
这里使用的是3.6.1版,下载的是apache-zookeeper-3.6.1-bin.tar.gz压缩包,并将其放在了/root目录下
2、解压并安装
在/usr/local/下创建zookeeper文件夹并进入
cd /usr/local/
mkdir zookeeper
cd zookeeper
2 、将ZooKeeper安装包解压到/usr/local/zookeeper中即可
[root@localhost zookeeper]# tar -zxvf /root/apache-zookeeper-3.6.1-bin.tar.gz -C ./
解压完之后,/usr/local/zookeerper目录中会出现一个apache-zookeeper-3.6.1-bin的目录
3、创建DATA目录
这里直接在/usr/local/zookeeper/apache-zookeeper-3.6.1-bin目录中创建一个data目录
等下该data目录地址要配到ZooKeeper的配置文件中
4、创建配置文件并修改
进入到zookeeper的conf目录,复制zoo_sample.cfg得到zoo.cfg:
[root@localhost apache-zookeeper-3.6.1-bin]# cd conf/
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
修改配置文件zoo.cfg,将其中的dataDir修改为上面刚创建的data目录,其他选项可以按需配置
5、启动ZOOKEEPER
[root@localhost apache-zookeeper-3.6.1-bin]# ./bin/zkServer.sh start
启动后可以通过如下命令来检查启动后的状态:
[root@localhost apache-zookeeper-3.6.1-bin]# ./bin/zkServer.sh status
从图中也可以看出zookeeper默认会绑定端口 2181 。
6、配置环境变量
编辑配置文件:
vim /etc/profile
尾部加入ZooKeeper的bin路径配置即可
export ZOOKEEPER_HOME=/usr/local/zookeeper/apache-zookeeper-3.6.1-bin
export PATH=$PATH:$ZOOKEEPER_HOME/bin
最后执行 source /etc/profile使环境变量生效即可。
7、设置开机自启
首先进入/etc/rc.d/init.d目录,创建一个名为zookeeper的文件,并赋予执行权限
[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# touch zookeeper
[root@localhost init.d]# chmod +x zookeeper
接下来编辑zookeeper文件,并在其中加入如下内容:
#!/bin/bash
#chkconfig:- 20 90
#description:zookeeper
#processname:zookeeper
ZOOKEEPER_HOME=/usr/local/zookeeper/apache-zookeeper-3.6.1-bin
export JAVA_HOME=/usr/local/java/jdk1.8.0_161 # 此处根据你的实际情况更换对
应
case $1 in
start) su root $ZOOKEEPER_HOME/bin/zkServer.sh start;;
stop) su root $ZOOKEEPER_HOME/bin/zkServer.sh stop;;
status) su root $ZOOKEEPER_HOME/bin/zkServer.sh status;;
restart) su root $ZOOKEEPER_HOME/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart" ;;
esac
最后加入开机启动即可:
chkconfig --add zookeeper
chkconfig zookeeper on
十七、消息队列KAFKA安装部署
1、首先准备ZOOKEEPER服务
因为Kafka的运行环境依赖于ZooKeeper,所以首先得安装并运行ZooKeeper。
这个可以参考上面一节的内容。
2、准备KAFKA安装包
这里下载的是2.5.0版:kafka_2.12-2.5.0.tgz,将下载后的安装包放在了/root目录下
3、解压并安装
在/usr/local/下创建kafka文件夹并进入
cd /usr/local/
mkdir kafka
cd kafka
将Kafka安装包解压到/usr/local/kafka中即可
[root@localhost kafka]# tar -zxvf /root/kafka_2.12-2.5.0.tgz -C ./
解压完之后,/usr/local/kafka目录中会出现一个kafka_2.12-2.5.0的目录
5、创建LOGS目录
这里直接在/usr/local/kafka/kafka_2.12-2.5.0目录中创建一个logs目录
等下该logs目录地址要配到Kafka的配置文件中。
6、修改配置文件
进入到Kafka的config目录,编辑配置文件server.properties
[root@localhost kafka_2.12-2.5.0]# cd config/
[root@localhost config]# vim server.properties
修改配置文件,一是将其中的log.dirs修改为上面刚创建的logs目录,其他选项可以按需配置
另外关注一下连接ZooKeeper的相关配置,根据实际情况进行配置:
7、启动KAFKA
执行如下命令即可:
./bin/kafka-server-start.sh ./config/server.properties
如果需要后台启动,则加上-daemon参数即可
8、实验验证
首先创建一个名为codesheep的topic:
./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --
replication-factor 1 --partitions 1 --topic codesheep
创建完成以后,可以使用命令来列出目前已有的topic列表
./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
接下来创建一个 生产者 ,用于在codesheep这个topic上生产消息:
./bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --
topic codesheep
而后接着创建一个 消费者 ,用于在codesheep这个topic上获取消息:
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --
topic codesheep
此时生产者发出的消息,在消费者端可以获取到:
本文转载自Codesheep,如果想联系作者,可以直接扫码联系
本文档在 Github开源项目:JavaCollection 中已收录,有详细自学编程学习路线、面试题和面
经、编程资料及系列技术文章等,资源持续更新中...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~