0%

1. 国内主流 NTP 服务器列表​​

服务商 国内NTP服务器地址
阿里云 ntp.aliyun.com
腾讯云 ntp.tencent.com
华为云 ntp.huaweicloud.com
清华大学 ntp.tencent.com
中国国家授时中心 cn.ntp.org.cn

​​2. 配置 Chrony 使用国内源​​

(1)修改配置文件 /etc/chrony.conf​​, ​​替换或添加以下内容​​:

1
2
3
4
5
6
7
8
9
10
11
# 国内优选源(iburst表示快速初始同步)
server ntp.aliyun.com iburst
server ntp.tuna.tsinghua.edu.cn iburst
server ntp.tencent.com iburst

# 强制使用国内源(忽略配置文件中的其他server)
# pool.ntp.org # 注释掉默认的国外源

# 调整同步参数
makestep 1 3 # 允许前3次同步时间跳跃(立即修正)
maxdistance 5 # 允许的最大时间偏差(秒)

​​(2)重启 Chrony 并验证​​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 重载配置
systemctl restart chronyd

# 等待10秒后检查同步状态
chronyc tracking
chronyc sources -v

# timedatectl 确认时间已同步
timedatectl
Local time: Wed 2025-06-11 10:36:14 HKT
Universal time: Wed 2025-06-11 02:36:14 UTC
RTC time: Wed 2025-06-11 02:36:14
Time zone: Asia/Hong_Kong (HKT, +0800)
System clock synchronized: yes
NTP service: active
阅读全文 »

环境初始化

准备3台机器: Rocky Linux 9 x86_64,IP地址如下:

  • 192.168.149.220
  • 192.168.149.221
  • 192.168.149.222

每台机器上安装JDK 1.8及以上版本,并配置好环境变量

1
yum install -y java-1.8.0-openjdk-devel

配置环境变量,编辑/etc/profile文件,添加以下内容:

1
2
3
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

保存后,执行source /etc/profile使配置生效。

阅读全文 »

EMQ 支持 Docker,宿主机,k8s部署;支持单机或集群部署。以下给出EMQX社区版单机和集群部署方法

1. Docker单机部署

官方推荐最小配置:2核 4G

下载容器镜像

1
docker pull emqx/emqx:5.3.2

启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -d --name emqx \
-p 1883:1883 \
-p 8083:8083 \
-p 8883:8883 \
-p 8084:8084 \
-p 18083:18083 \
emqx/emqx:5.3.2
EMQX 开放端口说明
1883 MQTT端口
8083 MQTT/WebSocket端口
8883 MQTT/SSL端口
8084 MQTT/WebSocket/SSL端口
18083 Dashboard 管理端口
阅读全文 »

使用 GOPROXY

临时设置

1
export GOPROXY=https://goproxy.cn,direct

永久设置

1
go env -w GOPROXY=https://goproxy.cn,direct

go get下载

使用官方二进制包安装

1. 下载 Go 官方二进制包

1
2
cd /tmp
wget https://go.dev/dl/go1.22.3.linux-amd64.tar.gz

2. 解压并安装到 /usr/local

1
2
sudo rm -rf /usr/local/go   # 如果之前有旧版本先删除
sudo tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz

3. 设置环境变量

编辑当前用户的 shell 配置文件(如 ~/.bashrc),添加如下内容

1
2
3
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

保存并应用更改

1
source ~/.bashrc

4. 验证安装是否成功

1
2
go version
go version go1.22.3 linux/amd64
阅读全文 »

什么是Overlay网络, 用于解决什么问题 ?

Overlay网络通过在现有网络之上创建一个虚拟网络层, 解决不同主机的容器之间相互通信的问题
如果没有Overlay网络,实现跨主机的容器通信通常需要以下方法:

  • 端口映射
  • 使用宿主机网络模式

这些方法牺牲了容器网络隔离的优势, 并且可能导致端口冲突问题

以下搭建一个简易的Docker Swarm 集群(一主一从), 探究 Overlay 网络下不同节点上的容器间互相通信的原理

阅读全文 »

在 Docker 中,默认情况下容器无法直接与外部网络通信。 为了使外部网络能够访问容器内的服务,Docker 提供了端口映射功能,通过将宿主机的端口映射到容器内的端口,外部可以通过宿主机的IP和端口访问容器内的服务

以下通过动手演示, 安装一个Flask容器, 解释端口映射从外部访问容器的原理

安装一个Flask容器

文件结构

1
2
3
.
├── Dockerfile
└── app.py

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM rockylinux:9.3

RUN dnf update -y && \
dnf install -y python3 python3-pip && \
dnf clean all

WORKDIR /app

COPY app.py /app/app.py

RUN pip3 install --no-cache-dir flask

EXPOSE 5000

CMD ["python3", "app.py"]

app.py

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
return "Hello"

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

构建镜像

1
docker build -t flask-app:1.0 .

启动容器, 进行端口映射

1
docker run -d -p 80:5000 flask-app:1.0

从外部访问 (192.168.52.203是我的虚拟机IP)

1
2
# curl 192.168.52.203
Hello
阅读全文 »

什么是 Docker 多阶段构建

Docker 多阶段构建是一种通过在单个 Dockerfile 中定义多个构建阶段的技术。 每个阶段可以使用不同的基础镜像和依赖项,允许开发人员在构建过程中分离应用程序的编译环境与运行环境。 最终生成的镜像只包含运行应用程序所需的文件,而无需携带编译工具链或其他不必要的依赖
通过多阶段构建,可以有效减少镜像体积,提升部署效率

实例: 多阶段构建压缩 Docker 镜像

下面通过一个简单的 Go 程序,分别用传统方式和多阶段构建两种方法演示如何构建 Docker 镜像,并观察多阶段构建对镜像大小的显著优化效果

准备工作

  • 安装 Docker
  • 编写一个简单的 Go 程序 hello.go
1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello, World!")
}
阅读全文 »

CoreDNS是什么

CoreDNS是一个灵活可扩展的DNS服务器,使用Go语言编写,旨在提供快速、灵活的DNS服务

为什么需要CoreDNS

CoreDNS为Kubernetes集群内部的DNS解析提供服务,使得服务之间能够通过域名互相通信
Kubernetes集群中, CoreDNS是运行在kube-system这个namespace下的Pod

1
2
3
kubectl -n kube-system get pod coredns-66f779496c-b7mmz
NAME READY STATUS RESTARTS AGE
coredns-66f779496c-b7mmz 1/1 Running 4 (28m ago) 4d23h

k8s集群中的域名是如何解析的

比如服务a访问服务b:

  • 如果a和b在同一个namespace下, 可以直接在pod a中, 通过curl b来访问b
  • 如果a和b不在同一个namespace下, 在pod a中需要通过curl b.namespaceb来访问b

以下动手测试

阅读全文 »

前言

在我之前做的项目里,我们对Microk8s微服务的更新是通过自制tar包的方式做的, tar包存储了镜像和YAML文件。 每次升级时,我们需要先删除所有的YAML资源,然后重新创建新的资源。 这种方式存在以下问题:

  • 服务中断:由于需要先删除旧资源再创建新资源,这会导致短暂的服务中断,影响用户体验
  • 复杂的回滚逻辑:如果升级失败,回滚到之前的版本变得非常复杂,需要手动恢复旧的YAML文件,并且容易出错

了解到Helm可以有效解决以上问题, Helm是Kubernetes 的包管理工具,方便用户快速发现、 共享和使用Kubernetes构建的应用。 以下举例演示如何使用Helm实现安装、升级、回滚操作

阅读全文 »