跳到主要内容

Microk8s 单机集群上的服务负载均衡实践

· 阅读需 2 分钟
素明诚
Full stack development

部署结构​

72b99c9f5f751e012cf7d0ab52ffc848## 安装 microk8s
素明诚:Ubuntu 安装 MicroK8s## 配置 microk8s

安装插件​

MetalLB: 这是一个负载均衡器实现,可以为 Kubernetes 服务提供外部 IP 地址。在裸机 Kubernetes 集群(如单节点 Microk8s 集群)中,MetalLB 通常用来替代云平台上的负载均衡服务。

Ingress: Ingress 是一种 Kubernetes 资源,用于管理从集群外部到集群内服务的访问。它可以提供 SSL 终止、基于名称的虚拟主机等功能。

metallb​

安装时候输入你的想要地址段192.168.1.240-192.168.1.250

microk8s enable metallb

查看是否正常

microk8s kubectl get pods -n metallb-system

ingress​

microk8s enable ingress

测试​

watch -n 0.5 curl http://192.168.1.240:9999

负载均衡效果​

43cf27748d6ed22b09fa13243e449a3e

service

ee62e0086785c3531c31f0d1fd6b1c78

ingress

配置文件​

deployment.yaml​

apiVersion: apps/v1
kind: Deployment
metadata:
name: go-sec-kill
spec:
replicas: 3
selector:
matchLabels:
app: go-sec-kill
template:
metadata:
labels:
app: go-sec-kill
spec:
containers:
- name: go-sec-kill
image: smcroot/go-sec-kill
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "1Gi" # 请求1GB内存
cpu: "500m" # 请求0.5 CPU
limits:
memory: "2Gi" # 限制最多使用2GB内存
cpu: "1" # 限制最多使用1个CPU
​

service.yaml​

apiVersion: v1
kind: Service
metadata:
name: go-sec-kill
spec:
type: LoadBalancer
selector:
app: go-sec-kill
ports:
- protocol: TCP
name: http
port: 9999
targetPort: 8080

ingress.yaml​

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-sec-kill-ingress
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-sec-kill
port:
number: 9999

ipaddresspool.yaml​

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: my-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.240-192.168.1.250

Snap 常用命令代理配置

· 阅读需 2 分钟
素明诚
Full stack development

Ubuntu 自 16.04 LTS(Xenial Xerus)起开始预装 snapd,因此在大多数 Ubuntu 系统上,用户可以直接使用 Snap

安装 Snap(如果系统尚未安装)​

对于 Debian 或其他未预装 Snap 的系统,可以使用以下命令安装

sudo apt update
sudo apt install snapd

snap version

使用场景​

  • Snap:适合快速更新和多平台部署的桌面或开发应用。
  • APT/DNF:适合对稳定性和资源使用有高要求的服务器环境。

配置代理​

sudo snap set system proxy.http="http://172.22.220.64:7890"
sudo snap set system proxy.https="http://172.22.220.64:7890"

常用命令​

命令说明
snap install <包名>安装指定的 Snap 包
snap remove <包名>移除指定的 Snap 包
snap list列出已安装的 Snap 包
snap refresh更新所有 Snap 包
snap refresh <包名>更新指定的 Snap 包
snap find <搜索词>搜索可用的 Snap 包
snap info <包名>查看指定 Snap 包的详细信息
snap revert <包名>将指定包回滚到上一个版本
snap enable <服务名>启用 Snap 包中的服务
snap disable <服务名>禁用 Snap 包中的服务
snap start <服务名>启动 Snap 包中的服务
snap stop <服务名>停止 Snap 包中的服务

Snap 与 APT/DNF 的关键区别​

自包含性​

  • Snap:包含所有依赖,防止依赖冲突,可在多种 Linux 上运行。
  • APT/DNF:依赖系统库,有时会因版本冲突出问题。

沙箱隔离​

  • Snap:应用在隔离环境中运行,提高安全性。
  • APT/DNF:应用可访问整个系统,潜在风险更高。

更新机制​

  • Snap:自动更新,支持快速回滚。
  • APT/DNF:需要手动触发更新,回滚复杂。

跨平台支持​

  • Snap:同一包可用于所有支持的 Linux 发行版。
  • APT/DNF:通常只适用于特定的 Linux 发行版。

资源占用​

  • Snap:因包含依赖而占用较多空间和资源。
  • APT/DNF:共享依赖,更节约资源。

Ubuntu 安装 MicroK8s

· 阅读需 3 分钟
素明诚
Full stack development

安装 MicroK8s​

MicroK8s 是通过 Snap 包提供的,因此确保你的系统支持 Snap 包。在 Ubuntu 上,Snap 通常已经预安装。

安装 MicroK8s

sudo snap install microk8s --classic

--classic 标志表示允许 Snap 包访问系统的更多资源。

0f8aeecf45018094ce7651154df1b94c

安装成功

卸载​

sudo snap remove microk8s --purge

添加用户到 MicroK8s 组

为了避免在使用 MicroK8s 命令时总是需要 sudo,可以将你的用户添加到 microk8s 组

sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube

然后你需要注销再登录,使更改生效。

检查 MicroK8s 状态

使用以下命令检查 MicroK8s 是否正确安装并正在运行

microk8s status --wait-ready

bb025162c99abe0f53cfd24e360aae49

如果没有看到正常输出,或者卡住,大概率是网络问题。你需要配置代理

配置 MicroK8s 代理​

为了确保 MicroK8s 内部的 Kubernetes 组件也能使用代理,你可以修改 MicroK8s 的服务定义,添加环境变量。MicroK8s 使用 systemd 服务管理其组件,因此你可以直接修改这些服务文件:

sudo nano /var/snap/microk8s/current/args/containerd-env

在该文件内添加以下行,换成你的代理地址

export HTTP_PROXY=http://172.22.220.64:7890
export HTTPS_PROXY=http://172.22.220.64:7890
export NO_PROXY=localhost,127.0.0.1,.cluster.local

保存并关闭文件。然后,重启 MicroK8s 以使更改生效

microk8s stop
microk8s start

启用 MicroK8s 服务​

MicroK8s 提供了许多 Kubernetes 的标准服务和附加组件。你可以根据需要启用

DNS: DNS 插件是 Kubernetes 集群中的核心,负责在集群内部提供名称解析服务,使得 Pods 能够通过服务名而非 IP 地址相互通信。

Dashboard: Kubernetes Dashboard 提供了一个基于 Web 的用户界面,允许用户直观地管理和监控集群中的资源,如 Pods 和 Deployments。

Storage: 存储插件允许在 Kubernetes 集群中配置持久化存储解决方案,支持如持久卷(Persistent Volumes)等存储资源的使用

microk8s enable dns dashboard storage

访问 Kubernetes Dashboard

如果你启用了 dashboard,可以通过以下命令获取访问令牌

microk8s dashboard-proxy

30d12ece67bdbdbec631efdbfabd4002## 标准的 kubectl 命令而不是每次都键入 microk8s kubectl

1. 修改别名​

nano ~/.bashrc  # 或者 ~/.zshrc,取决于你使用的 shell
# 在文件的末尾添加以下行
alias kubectl='microk8s kubectl'
# 保存并关闭文件,然后重新加载配置
source ~/.bashrc # 或者 source ~/.zshrc

2. 使用 Bash 中的>操作符来强制覆盖​

microk8s config > ~/.kube/config

参考文档​

MicroK8s 的https://microk8s.io/docs

安装 Helm 配置代理

· 阅读需 2 分钟
素明诚
Full stack development

安装 Helm​

如果你使用的是 Ubuntu 或者其他基于 Debian 的系统,建议通过snap安装Helm

sudo snap install helm --classic

安装完成后,你可以通过以下命令验证Helm是否正确安装

helm version

如果你使用的是其他 Linux 发行版或操作系统,也可以直接从官方获取Helm。以下是通用的安装步骤

通过脚本安装 Helm​

你可以使用 Helm 官方提供的安装脚本

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

手动安装 Helm​

你也可以从https://helm.sh/docs/intro/install/下载适合你操作系统的二进制文件,并将其添加到系统的 PATH 中。

安装完成后操作​

安装helm后,列出已安装的 Helm releases

helm list -A

注意!如果你没有使用 Helm 来部署 Kubernetes 应用程序,helm list -A 命令将不会显示任何内容

ad29a4a4f102a8b0bec7f5400d2d12a3## 使用国内 Helm 仓库镜像

在中国使用 Helm 时,最常见的做法是使用国内的 Helm 仓库镜像,以加快访问速度。可以添加国内的 Helm 镜像源,比如阿里云的 Helm 仓库。

阿里云 Helm 仓库

helm repo add aliyun https://apphub.aliyuncs.com

配置 HTTP/HTTPS 代理​

配置系统的 HTTP/HTTPS 代理,Helm 会自动使用这些代理来访问网络。

在命令行环境中设置代理

export http_proxy=http://172.22.220.64:7096
export https_proxy=http://172.22.220.64:7096

Nginx 不同场景的 log format 示例

· 阅读需 1 分钟
素明诚
Full stack development

基本访问日志​

用于常规的访问监控,记录关键的请求与响应信息。

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

性能分析日志​

用于评估请求处理性能,重点关注响应时间。

log_format performance '$time_iso8601|$remote_addr|$request_time|$upstream_response_time|'
'$status|$request|$body_bytes_sent';

安全审计日志​

记录与安全相关的额外信息,如 SSL/TLS 参数等。

log_format security '$time_iso8601|$remote_addr|$remote_user|$request|'
'$status|$body_bytes_sent|$http_referer|$http_user_agent|'
'$ssl_protocol|$ssl_cipher|$http_x_forwarded_for';

API 日志​

针对 API 请求的专用日志格式,关注认证 token、payload 大小等内容。

log_format api '$time_iso8601|$remote_addr|$request_method|$uri|$server_protocol|'
'$status|$request_time|$http_x_api_token|$content_length';

调试日志​

在排查故障时使用,记录尽可能详尽的信息。通常无需一直启用。

log_format debug '$time_iso8601|$remote_addr|$remote_user|$request|'
'$status|$body_bytes_sent|$http_referer|$http_user_agent|'
'$request_time|$upstream_response_time|$upstream_addr|'
'$ssl_protocol|$ssl_cipher|$http_x_forwarded_for|$host|$https';

在配置中使用日志​

下面是一个在生产环境可用的完整示例

http {
log_format main '...';
log_format performance '...';
log_format security '...';
log_format api '...';
#log_format debug '...';
​
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
​
server {
listen 80;
server_name example.com;

location /api {
access_log /var/log/nginx/api.log api;
# ...
}
​
location /debug {
access_log /var/log/nginx/debug.log debug;
# ...
}
}
}

开发日常使用​

  log_format backend_log '$time_local|$remote_addr|$http_x_forwarded_for|$remote_user|'
'$request_method|$request_uri|$server_protocol|$http_host|'
'$status|$body_bytes_sent|$request_time|$upstream_response_time|'
'$upstream_addr|$upstream_status|$http_referer|$http_user_agent|'
'$request_id';

VSCode SSH开发免密登录

· 阅读需 2 分钟
素明诚
Full stack development

生成 SSH 密钥对​

打开 Git Bash,然后输入以下命令生成一个新的 SSH 密钥对。如果你生成过了就不要再生了。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这里的your_email@example.com应替换为您的电子邮件地址,用作密钥的标签。按回车接受默认文件位置(通常是/c/Users/YourUsername/.ssh/id_rsa),在提示时可以选择输入密码或留空以创建无密码的密钥。

将公钥添加到 Linux 服务器​

拷贝公钥内容

在 Git Bash 中,使用cat命令查看并复制您的公钥内容

cat ~/.ssh/id_rsa.pub

复制输出的所有内容(确保复制完整,包括ssh-rsa开头和邮箱结尾)。

登录到的 Linux 服务器 使用用户名和服务器地址登录

ssh -p 22 username@server-address

替换username和server-address为您的实际用户名和服务器地址。

编辑 authorized_keys 文件 在服务器上,将公钥内容添加到~/.ssh/authorized_keys文件中。如果文件不存在,可以创建它。

然后把你刚刚复制的内容粘贴进来,保存

nano ~/.ssh/authorized_keys

设置权限 设置正确的文件权限以确保安全

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

配置 VSCode 进行远程开发​

41e4e8b9fab8cfb98ba360b830509447

在VSCode内添加IdentityFile ~/.ssh/id_rsa。这可以进一步简化您的 SSH 连接命令

Host example
HostName example.com
User username
IdentityFile ~/.ssh/id_rsa

Cpolar安装与使用内网穿透工具推荐

· 阅读需 1 分钟
素明诚
Full stack development

剪枝Pruning和量化Quantization的区别

· 阅读需 3 分钟
素明诚
Full stack development

剪枝(Pruning)​

剪枝是一种通过移除模型中不重要或不活跃的参数(通常是权重)来减少模型大小的技术。它通过分析哪些参数对最终输出影响较小,然后将这些参数从模型中删除,从而减少计算量和内存使用。

剪枝后,模型的参数数量减少,但通常仍然保持类似的性能。

举例​

有一棵树(这棵树代表你的模型),这棵树上有许多枝条(这些枝条代表模型中的参数)。但是,某些枝条并不结出果实(这些无果的枝条对最终的结果贡献很小)。为了让树更加健康并且节省空间,你决定修剪掉这些不结出果实的枝条。这就是剪枝通过去除那些对模型输出影响不大的参数,来减少模型的规模和复杂度。

量化(Quantization)​

量化是将模型的参数和计算从较高精度(如 32 位浮点数)转换为较低精度(如 16 位浮点数或 8 位整数)的方法。这种方法通过减少参数表示的比特数来降低模型的存储需求和计算复杂度。

量化可能会略微影响模型的精度,但在大多数情况下,这种影响是可接受的,尤其是当它显著降低了资源消耗时。

举例​

要记录这棵树的形状和大小(这代表模型的参数存储)。最初,你用非常精细的刻度尺来测量每个枝条的长度和厚度(这代表高精度的参数表示,比如 32 位浮点数)。然而,这种精细的测量需要很多纸和墨水(大量的计算资源和存储空间)。于是你决定换一把较粗的刻度尺(较低精度的表示,比如 8 位整数),虽然测量结果可能不如之前精确,但仍然足够描述树的主要形状。

如何选择量化或者剪枝​

如果你需要减少模型的总大小或提升模型在特定硬件上的兼容性,应选择量化。如果目标是减少非必要的计算和提升推理速度,应选择剪枝。在许多情况下,结合使用这两种技术可以达到最佳的优化效果。

标签:

conda 和 pip 的关系与区别

· 阅读需 2 分钟
素明诚
Full stack development

包管理​

conda 和 pip 都是用于安装和管理 Python 包的工具,它们帮助用户轻松地在系统上添加或删除库。

互通性​

在某些情况下,conda 和 pip 可以在同一个环境中共存。当某些包在 conda 中不可用时,可以使用 pip 进行安装,反之亦然。

主要区别​

功能

conda 是一个开源的包和环境管理系统。它不仅能管理 Python 包,也能处理非 Python 包。此外,conda 能够创建和管理虚拟环境,这对于管理具有不同依赖的多个项目非常有用。

pip 是专门用于管理 Python 包的安装器。它不提供环境管理功能,也无法直接管理非 Python 包。

覆盖范围

conda 能管理包、依赖以及环境。

pip 主要关注于 Python 包的安装和管理。

包来源

conda 包通常来源于 Anaconda 仓库或其他 conda-specific 仓库。

pip 包来源于 Python Package Index (PyPI)。

依赖解析

conda 在处理依赖解析时通常更为可靠,能够更好地处理复杂的依赖关系和版本冲突。

pip 在处理复杂的依赖和版本冲突时可能不如 conda 强大。

平台支持

conda 支持多种平台,包括 Windows、macOS 和 Linux,并提供良好的二进制包支持,简化了在不同平台上的安装过程。

pip 也支持多个平台,但在处理二进制依赖和平台特定构建时可能不如 conda 方便。

环境管理

conda 提供强大的环境管理功能,允许用户创建独立的环境以隔离不同项目的依赖。

pip 本身不提供环境管理功能,但可以与 virtualenv 或 venv 等工具结合使用。

对于依赖纯 Python 的项目,pip 是一个可行的选择。然而,对于需要跨平台兼容性和涉及复杂依赖的项目,conda 可能是更好的选择

npm 配置本地代理

· 阅读需 1 分钟
素明诚
Full stack development

使用命令设置代理​

你可以使用npm config set命令来设置 HTTP 和 HTTPS 代理。这会将代理设置保存在全局 NPM 配置文件中(通常位于用户主目录的.npmrc文件中)。

打开终端或命令行界面,输入以下命令

npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890

这里假设你的代理服务器地址是http://127.0.0.1:7890,你需要根据你的实际代理服务器地址进行替换。

直接编辑.npmrc 文件设置代理​

你还可以手动编辑或创建一个.npmrc文件来指定代理设置。.npmrc文件通常位于用户的主目录下。

打开或创建.npmrc文件。

添加以下行来设置代理

proxy=http://127.0.0.1:7890
https-proxy=http://127.0.0.1:7890

保存并关闭文件。

清除代理设置​

如果你想清除已设置的代理,可以使用以下命令

npm config delete proxy
npm config delete https-proxy

验证代理设置​

设置完代理后,你可以使用以下命令来检查设置是否正确

npm config get proxy
npm config get https-proxy

这将显示当前设置的 HTTP 和 HTTPS 代理地址。