Relative Content

K4NZDROID

category

「Kubernetes」- 使用 RBAC 授权

问题描述
ServiceAccount 的角色及使用;基于 Role 的访问控制;
该笔记将记录:在 Kubernetes Cluster 中,如何使用 RBAC 及 ServiceAccount 进行权限管理,以及常见问题处理;
解决方案
RBAC 授权由以下几部分组成: 1)实体:指 Group、User、ServiceAccount; 2)资源:Pod、Service、Secret; 3)角色:定义了访问资源的行为规则; 4)角色绑定:将角色赋予实体;
资源 <= 角色 <= 角色绑定 => 实体
一个 Role 在 Spec 内可以进行的操作包括:get list watch create update patch delete
角色分为两类: 1)集群范围内的角色:集群角色和他们相应的集群橘色绑定; 2)命名空间范围的角色:角色和角色绑定;
下面讨论如何创建用户自定义的规则,并应用到角色和资源;
场景一、限制 kubectl 命令
当集群部署完成之后,使用 kubectl 命令能够控制整个集群,这是因为 ~/.kube/config 的凭证权限足够高。我们不能直接分发该凭证,应该创建新的碰正限制访问权限;
第一步、检查 RBAC 是否启用

# kubectl api-versions | grep -E ‘^rbac\.’
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1

启用 RBAC 授权:在启动 kube-apiserver 服务时,指定 –authorization-mode=Example,RBAC 选项
第二步、创建 ServiceAccount 对象

cat > udef-ServiceAccount-PodReader.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader
EOF

kubectl apply -f udef-ServiceAccount-PodReader.yaml

ServiceAccount 相当于传统授权体系的账户,然后将多个 Role(或 ClusterRole)通过 RoleBinding(或 ClusterRoleBinding)绑定到 ServiceAccount 资源;
第三步、创建 Role 对象
该 Role 仅具有读取 Pod 的权限:

cat > udef-Role-PodReader.yaml <<E[……]

READ MORE

「iSCSI」- Initiator Configuration

系统环境
# 操作系统 不做具体限制,实验环境是 CentOS Linux release 7.4.1708 (Core)发行版。
但是,任何一个系统都可以,这是在细节或者某些文件的位置上存在差异。
安装软件包

# CentOS

yum install -y iscsi-initiator-utils.x86_64

# Debain

apt-get update
apt-get install open-iscsi

发现目标
执行如下命令,来发现主机上的目标:

#!/bin/sh

# 单纯的发现目标
iscsiadm –mode discovery –type sendtargets –op nonpersistent –portal 10.10.50.11

# 不建议:将全部目标写入数据库(iSCSI 自带的数据库)
# 该命令同时会:
# 在 Debian 中,在 /etc/iscsi/nodes/ 下生成配置文件;
# 在 CentOS 中,在 /var/lib/iscsi/nodes/ 下生成配置文件;
# 每个「LUN」都有对应的配置文件。
# !!!每次执行这个命令,原有配置就会被覆盖。
iscsiadm –mode discovery –type sendtargets –op update –portal 10.10.50.11

# 将特定的 LUN 写入数据库
# 该命令将创建特定的数据库文件
# 这是要登录的 LUN,如果不写入后面无法登录。
iscsiadm –mode node –op new -T iqn.2002-10.com.infortrend:eonnas.eonnas:pro:510.dfwsnas.test-mysql-master-02.e1000g0 \
–portal 10.10.50.11

修改配置
修改配置文件,比如自动登录、认证等等信息:

################################################################################
# 配置自动挂载
################################################################################
node.startup = automatic

################################################################################
# 认证方式一:单向认证
###########################[……]

READ MORE

「SR-MPLS-TE-POLICY」- 概念术语

SR-MPLS Policy 标准介绍 | RFC
在 RFC-draft-ietf-spring-segment-routing-policy 中,提出 MP-BGP 新增地址族 BGP SR Policy(SAFI=73)用于下发 SR-MPLS Policy 信息。

控制器通过 BGP 协议下发 SR 的 SID 组合给 Ingress 节点; 在头端节点中,将创建出一条到 Egress 节点的、带 Policy Color 的 TE 隧道; 当需要引用此隧道时,可以使用 Policy Color 对应到隧道;
针对 SR Policy 的实现,主流有三种方式:

BGP-LS 用于收集拓扑,对于客户自研控制器,其无需引入一个新的接口协议;BGP SR Policy 下发路径路由信息;
PCEP:在 SR-MPLS TE 场景下,其作为南向协议较为成熟,但是由于各厂家隧道实现模型不统一,无法实现互通,且 PCEP 交互流程较于 BGP 更复杂,推荐使用 BGP 扩展协议;
NETCONF/YANG:把隧道路径作为配置下发到转发器。本质上是配置下发,性能最差,不推荐。在整体解决方案中,使用 NETCONF 下发其他配置,而不是隧道配置;

更详细的 SR Policy 细节和功能在[I-D.ietf-spring-segment-routing-policy]介绍,https://datatracker.ietf.org/doc/draft-ietf-idr-segment-routing-te-policy
SR-MPLS Policy 元组标识
根据 RFC 定义,一个 SR Policy 由一个三元组标识,<Headend, Color, Endpoint>,包含多条候选路径;
对于一个指定的节点 SR-MPLS Policy 则由 <color, endpoint> 标识:

头端(headend):SR-MPLS Policy 生成的节点,一般是全局唯一的 IP 地址;
颜色(color):32bit 扩展团体属性,用于标识某一种业务意图(例如低延时);
尾端(endpoint):SR-MPLS Policy 的目的地址,一般是全局唯一的 IP 地址;

Color 和 endpoint 被用于 SR-MPLS Policy 在特定头端标识转发路径;
SR-MPLS Policy 方案架构

在华为 SR-MPLS Policy 解决方案架构中,包含三个关键协议:

BGP-LS:收集隧道拓扑、网络带宽、链路时延等信息并上报隧道状态,该信息用于控制器计算 SR[……]

READ MORE

「HUAWEI-ENSP」- 实验学习:SR-MPLS with IGP

实验拓扑
WIP

底层 IP Networking 已配置
针对 CX 设备,该环境已执行 undo dcn 命令;

实验需求

通过 OSPF 协议,实现 SR 网络;
通过 ISIS 协议,实现 SR 网络;
在 OSPF、ISIS 中,协议引入彼此路由并观察;
配置 SR MPLS TE 显式路径,实现两端设备互通;

实验过程
SR MPLS with OSPF
配置过程:

# ——————————————————— # CX1

[CX1]mpls lsr-id 1.1.1.1
[CX1]mpls
[CX1]segment-routing

[CX1]ospf 1
[CX1-ospf-1]opaque-capability enable
[CX1-ospf-1]segment-routing mpls
[CX1-ospf-1]segment-routing global-block 16000 17000

[CX1]interface LoopBack 0
[CX1-LoopBack0]ospf prefix-sid index 1

# ——————————————————— # CX2

[CX2]mpls lsr-id 2.2.2.2
[CX2]mpls
[CX2]segment-routing

[CX2]ospf 1
[CX2-ospf-1]opaque-capability enable
[CX2-ospf-1]segment-routing mpls
[CX2-ospf-1]segment-routing global-block 26000 27000

[CX2]interface LoopBack 0
[CX2-LoopBack0]ospf prefix-sid index 2

# ——————————————————— # CX3 – CX5

测试方法:

CX1 ping CX5 能够成功,抓包能够看到单层 MPLS 标签报文;

问题排查:

display tunnel-info all
display segemtn-routing prefix mpls forwarding
dis ospf lsdb opaque-area originate-router 5.5.5.5[……]

READ MORE

「wget」

Wget,GNU Wget,以前的 Geturl,用于从 Web 服务器获取内容。它是 GNU 项目的一部分。它支持通过 HTTP,HTTPS 和 FTP 进行下载。
安装
从发行版的源中安装

#!/bin/bash

apt-get install wget

使用源码编译安装 参考 BLFS/Wget-1.18: http://www.linuxfromscratch.org/blfs/view/7.10/basicnet/wget.html 已经很详细了,这里不再赘述。
安装的可执行程序
wget 主要的程序文件。使用 HTTP,HTTPS 和 FTP 协议从 Web 检索文件。属于非交互式程序,用于后台或无人值守的操作。
参考文献

Wikipedia / Wget: https://en.wikipedia.org/wiki/Wget
BLFS / Wget-1.18: http://www.linuxfromscratch.org/blfs/view/7.10/basicnet/wget.html
Homepage: https://www.gnu.org/software/wget[……]

READ MORE

「kubectl」- 输出格式

kubectl get nodes
ROLES(kubeadm – How to add roles to nodes in Kubernetes?)

A node role is just a label with the format node-role.kubernetes.io/<role>

You can add this yourself with kubectl label

命令的输出格式
Overview of kubectl/Output options REFERENCE/JSONPath Support JSONPath Support
在使用命令 kubectl 管理集群时,按照文档的说明输入命令即可。但是,如果需要进行某些批量操作,则需要控制 kubectl 输出方便处理的格式(例如 JSON XML 等等)。
比如,我们需要获取 Secret 的 token 值,我们能够采用更加“优雅”、“健壮”的方式来编写脚本(而不是一堆 awk sed grep 的组合):

# kubectl get serviceaccounts default -o jsonpath=”{.secrets[0].name}”
default-token-968td

该命令的输出格式有以下几种,基本可以分为三类: 1)查看型 – 该类型的输出用于查看集群状态; 2)导出型 – 该类型的输出可以用于导出集群中 API 对象; 3)脚本型 – 可以用在 Shell 脚本编程中,进行集群管理;
-o wide
与普通输出相比,会输出额外信息。
该类型输出可以用于日常状态查看,比默认输出显示略多信息。
-o custom-columns, custom-columns-file
支持输出自定义列(custom-columns),支持从文件读取自定义列(custom-columns-file)
该输出类型可以用于查看状态,定义自己感兴趣的维度。
-o yaml
输出 YAML 格式的 API 对象。
概述出类型可以用于对象导出操作。
-o name
只输出资源名称,同时包含资源类型,二者以斜线分隔。 可以配合 Shell 脚本,参与批量处理。
-o json, jsonpath, jsonpath-file
JSONPath Support | Kubernetes
支持输出 JSON 格式(json),支持过滤特定字段(jsonpath),支持从文件读取要过滤的字段(jsonpath-file) 可以配合 Shell 脚本,在批量操作中[……]

READ MORE

「DeFi」- 去中心化金融 | Decentralized Finance

认识
DeFi(Decentralized Finance,去中心化金融)是基于区块链技术的开放式金融系统,旨在通过智能合约提供无需中介(如银行、券商)的金融服务,包括借贷、交易、理财、保险等。
DeFi 通过区块链技术重构金融体系,提供更开放、高效的金融服务,但仍面临安全与监管挑战。对于用户而言,需权衡高收益与风险,谨慎选择协议并分散投资。
组成
WIP
构造
参与 DeFi 方法

准备工具:
– 安装钱包(如 MetaMask、Trust Wallet)。
– 购买加密货币(ETH、SOL 等用于支付 Gas 费)。

选择协议:
– 根据需求使用 DEX(Uniswap)、借贷(Aave)、理财(Yearn)。

注意安全:
– 仅使用审计过的协议,警惕钓鱼网站。

性质

无需信任(Trustless)
– 依赖智能合约自动执行,无需银行或第三方机构背书。

全球开放
– 任何人联网即可参与,无国界限制。

透明可审计
– 所有交易和协议代码公开在区块链上。

可组合性(Composability)
– DeFi 协议可像乐高一样组合(如抵押借贷后自动理财)。

应用
### 1. 去中心化交易所(DEX) – 用户直接通过智能合约交易加密货币,无需中心化交易所(如币安)。 – 代表项目:

– Uniswap(以太坊上最大的 DEX,采用 AMM 自动做市商机制)
– PancakeSwap(币安智能链上的低费用 DEX)
– Curve(专注稳定币交易的 DEX)

### 2. 借贷协议 – 用户可存入资产赚取利息,或抵押加密资产借出资金。 – 代表项目:

– Aave(支持浮动利率和闪电贷)
– Compound(首创算法利率模型)
– MakerDAO(通过抵押 ETH 生成稳定币 DAI)

### 3. 稳定币(Stablecoins) – 锚定法币(如美元)的加密货币,用于降低波动风险。 – 类型:

– 法币抵押型(USDT、USDC)
– 加密抵押型(DAI)
– 算法稳定币(风险高,如曾崩盘的 UST)

### 4. 收益聚合器(Yield Aggregators) – 自动将资金投入最高收益的 DeFi 协议,优化回报。 – 代表项目:

– Yearn Finance(自动切换借贷和[……]

READ MORE

「Maven」- pom.xml

常用属性及其含义
repositories vs. pluginRepositories
maven – repository vs. pluginRepository – Stack Overflow
The PluginRepository is where maven searches for maven plugins. That is why it mentions builds (the build lifecycle) and reports (the site lifecycle). E.g. that is where the maven-compile-plugin and maven-surefire-plugin exists.
The normal repository is used for dependencies for your application, i.e. the sections <dependencies> and <dependencyManagement>. It could be your junit or commons-logging or whichever jar you needed.
Normally they could both point to the same repositories and in fact by default, they both point to Maven Central, but you could have some special locations you needed in there, or alternatively have different update policies on the repositories.
针对技术实现,两者并无较大差异。但是,通过两者,我们能够针对插件和依赖使用不同的管理策略。
模块聚合

.
|– my-module
| `– pom.xml
`– pom.xml

<project>
<modelVersion>4.0.0</modelVersion>

<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>

<modules>
<module>my-m[……]

READ MORE

「3.ODB – Omniscient Debugger」

软件介绍
ODB 是一个 Java 调试器,这个调试器可以“倒退时间”回溯程序的执行过程。
软件信息
作者:Bil Lambda 简介:http://omniscientdebugger.github.io/ODBDescription.html 手册:http://omniscientdebugger.github.io/ODBUserManual.html 介绍:http://www.cs.kent.edu/~farrell/mc08/lectures/progs/pthreads/Lewis-Berg/odb/AADEBUG_Mar_03.pdf
参考文献
ODB 的 GitHub 项目主页 ODB 官网主页
ODB 是什么?
记录程序调用记录,“时间倒退”。
ODB 以时间戳为单位记录程序中发生的事情。然后 GUI 允许你向后查看对象、变量、方法调用等等。因此,你可以看到有问题的变量,这个变量来自于哪里,谁设置了该变量,已经为什么如此设置。这也表示没有什么确定不了的问题。你也不需要猜测问题可能发生在哪里,也不需要设置断点,也不需要惊讶于哪个线程运行了他们,也不需要重复的运行程序。
ODB 有 Java 语言实现。
ODB 的实现原理
ODB 是在程序中的每个“兴趣点”(赋值,进行方法调用,抛出 / 捕获异常)中收集“时间戳”,然后允许程序员使用这些时间戳来探索该程序的历史运行。
它在程序的类中插入代码,并在程序运行时记录事件。
在新版本中发生的更改
可以在 Eclipse 的 RUN 菜单中运行 ODB。通过导入 ODB,将 main 类设置为 com.lambda.Debugger.Debugger,然后将参数设置为你想运行的程序。
JDK1.5 可以正常工作。你必须选择正确版本的 ODB:

ODB1.5 用于 JDK1.5;
ODB1.4 用于 JDK1.4;

运行 DEMO 程序
下载 debugger.jar,然后运行它(java -jar debugger.jar)。选择“Demo”(一个内置的指针(一个 bug)!多线程快速排序)。该程序将运行,然后调试器将弹出,你将能够“探索”程序的历史。按下按钮,双击对象。
你可以通过定义一些 SEHLL 别名并调用 debug 来选择自己的程序而不是演示程序:

% cd ~/Debugger
% jar xf debugger.jar aliases docs
% source aliases
% debug YourProgram

在.jar 文件中有一个完整的手册(docs/ *[……]

READ MORE

「CSS」- 字体 | Font

不同语言 使用 不同字体 | Language-related Font
unicode – Can CSS choose a different default font and size depending on Language – Stack Overflow unicode-range – CSS: Cascading Style Sheets | MDN
我们需要为不同语言使用不同字体。比如,对于英文我们使用 Consolas 字体,对于其他语言使用 Microsoft Yahei 字体,

@font-face {
font-family: Consolas;
/* src: url(fonts/Consolas.ttf) format(“opentype”); */
unicode-range: U+00-FF, U+980-9FF;
}

body {
font-family: “Consolas”, Microsoft Yahei
}

当浏览器发现字符在 unicode-range 内时,将使用该字体渲染字符。
注意事项: 1)属性 @font-face 相当于“对字体进行配置”,我们需要在其他地方使用该字体(即如上 body 中使用 Consolas 字体)
网页设置统一的字体
DeepSeek / 为网页所有元素设置相同字体

* {
font-family: ‘Open Sans’, sans-serif;
}[……]

READ MORE

「Shadowsocks」- 安装配置(Python)

问题描述
有关 Shadowsocks 原理,该笔记不再赘述。
该笔记将记录:如何安装并设置 Shadowsocks 服务,以实现网络访问(访问 Google、Twitter、Facebook 等等)
补充说明
因某些原因,自 shadowsocks 2.8.2 后,该项目就已经不再维护了。但是出现许多“衍生版本”(基于原版本进行问题修复和扩展的版本)。推荐安装 shadowsocks-py 软件包,该软件包也是在原有的基础上进行代码维护。但是本文内容依旧基于 shadowsocks 2.8. 版本。
目前Shadowsocks流量已经能够被识别,这与使用默认端口、数据加密类型都有关系。现在是时候挖条加密隧道保护流量。比如你可以使用SSH创建加密隧道,通过该隧道SOCKS流量。
解决方案
环境概述
本地台式机,扮演客户端,壹台想要科学上网的主机。 远程服务器,扮演服务端,壹台能够访问任何站点的主机。
第一步、安装服务(在两台主机上执行)

#(搜索)执行如下命令,搜索出Shadowsocks软件包名:
pip search shadowsocks

#(安装)使用pip安装Shadowsocks包
pip install shadowsocks
pip install shadowsocks==2.8.2 # (其他可选安装方法)安装特定的版本

# (其他可选安装方法)直接从Git安装
pip install git+https://github.com/shadowsocks/shadowsocks.git@master

安装的可执行程序:

命令
功能

sslocal
实现SOCKS5协议的客户端,运行在本地主机中。

ssserver
实现SOCKS5协议的服务端,运行在远程服务器中。

第二步、服务端配置(在远程服务器上执行)
# 方式一、直接命令行启动
执行如下命令启动服务:

# 直接启动
ssserver -p 8388 -k “your password” -m aes-256-cfb

# 后台运行(以nobody用户运行)
ssserver -p 8388 -k “your password” -m aes-256-cfb –user nobody -d start

查看服务日志:

#!/bin/sh

tail -f /var/log/shadowsocks.log

停止正在运行的服务:

ssserver -[……]

READ MORE

「Property」- 配置文件

性质
定义

hello=hello
db.url = jdbc:mysql://localhost:3306/mydb

注释

# You are reading a comment in “.properties” file.
! The exclamation mark (‘!’) can also be used for comments.

注意,其不支持行内注释
数组
Property 本身并不支持数组,所以需要自定义结构,然后在程序中编写解析代码。
参考
.properties – Wikipedia[……]

READ MORE

「DNSPod」- 云解析 DNS 服务

认识
官网:

DNSPod.cn | https://www.dnspod.cn/
腾讯云 | 域名注册_域名购买、申请、查询 | https://dnspod.cloud.tencent.com

文档:

https://cloud.tencent.com/document/product/302

仓库:

WIP

云解析 DNS 基于业界领先的 DNSPod 域名解析,提供可靠稳定的权威域名解析服务。DNSPod 是国内领先的 DNS 服务商,有10多年的 DNS 解析服务经验。简而言之,DNSPod 是腾讯云提供的 DNS 服务,使得我们不需要部署和为主自己的 DNS 服务器。[……]

READ MORE

「COMPUTER-STORAGE」- S3 | 对象存储 | Object-based Storage

认识
数据存储和访问通常需要购买、部署和维护昂贵的硬件和软件资源,这对于许多公司来说是一项重大的投资和运营负担。—— ChatGPT
所以,Amazon 创建 S3 服务,使用户能够按需存储和检索任意数量的数据,从而降低了存储成本,并提高了可扩展性和可靠性。
S3,全称为 Amazon Simple Storage Service,是亚马逊提供的一种对象存储服务。
其主要是为解决大规模数据存储和检索的问题。例如图片、视频等等,该类文件仅涉及保存和读取,基本不涉及文件编辑。
组成
HTTP API and SDK
S3 接口提供 Web 服务接口,可随时随地通过 HTTP 的方式在网络上的任何位置存储和检索任意数量的数据,是一套非常实用的对象存储服务标准。
同时,提供了丰富的 SDK,支持 Java、Python、Ruby 和 PHP 等多种程序开发语言;
原理简述
在一个平坦的命名空间中(称之为桶),通过使用对象的 Object ID(有时称为对象密钥),来检索离散后的所有数据对象。 然后,应用程序通过 Web API 来访问对象,这与文件系统的访问方式不同。
对象(像文件一样)包含二进制数据流,并且大小无限制。对象还包含描述数据的元数据。文件也同样有元数据,包括文件权限、修改时间等。对象本身支持扩展元数据信息,通常以 K/V 形式管理元数据——将有关对象中数据的信息存储在键–值对中。
对象存储是一种解决和处理离散单元的方法。离散后的数据称为对象,因此数据会离散出很多对象。与传统的文件系统中的文件不同,对象存储不像文件系统那样通过目录树或者子目录树对文件进行组织。
构造
—— 该部分将介绍构造 s3 存储的方法。针对我们的场景,我们更加关注于“部署并使用 S3 来解决问题”,而非“从零开始实现一个 S3 对象存储”。
商业服务
自建服务
性质
1)可扩展性:S3 可以存储无限数量的数据,数据大小从 1 字节到 5TB 不等。
2)持久性和可用性:S3 提供了 99.999999999% 的数据持久性和 99.99% 的可用性保证。
3)安全性:S3 提供了多种数据保护机制,如 SSL 加密传输和服务器端加密存储等。

安全与访问管理:S3 可以针对每个对象存储桶或者对象设置独立的访问控制策略,可以允许某些 S3 或者访问,或者全部对外开放等。另外,S3 还支持对对象的限时访问,提供一个仅在规定时间内有效的 URL;

4)灵活的数据管理:S3 提供了生命周期管理、版本控制等功能,方便用户管理存储数据。

存储对象的版本控制:对于 S3 存储桶中的每个对象,可以使用版本控制功能[……]

READ MORE

「wget」-

功能简述
非交互式的网络下载器
常用命令
下载文件到指定目录中(使用 -P 选项):

wget -P /path/to/folder \
http://mirrors.jenkins.io/war-stable/latest/jenkins.war

下载整个目录,并限制速度:

wget –limit-rate 600k \
–recursive –no-parent –reject “index.html*” \
http://example.com/configs/.vim/

语法格式

wget [option]… [URL]…

命令简述
GNU Wget is a free utility for non-interactive download of files from the Web. It supports HTTP, HTTPS, and FTP protocols, as well as retrieval through HTTP proxies.
Wget is non-interactive, meaning that it can work in the background, while the user is not logged on. This allows you to start a retrieval and disconnect from the system, letting Wget finish the work. By contrast, most of the Web browsers require constant user’s presence, which can be a great hindrance when transferring a lot of data.
Wget can follow links in HTML, XHTML, and CSS pages, to create local versions of remote web sites, fully recreating the directory structure of the original site. This is sometimes referred to as “recursive downloading.” While doing that, Wget respects the Robot Exclusion Standard (/robots.txt). Wget can be instructed to convert the links i[……]

READ MORE

「Nginx」- 路径处理、处理请求地址、重写请求地址

问题描述
该笔记将记录:在 Nginx 中,处理请求地址(URL)的多种方法,比如重定向、重映射地址等等,以及常见问题处理;
解决方案
针对某个地址,返回固定文件
当访问 http://example.com/file.txt 地址时,我们希望返回 foo.txt 文件:

location /robots.txt { alias /home/www/static/any-filename.txt; }

location /robots.txt { root /home/www/static/; }

将特定目录的内容映射到 location 路径中
当访问 http://example.com/tmp-mirror 地址时,显示 /tmp 目录下内容

server {

location /tmp-mirror/ {
alias /tmp;
}

}

注意事项,如果这里使用 root /tmp; 指令,则将访问 /tmp/tmp-mirror 目录;
针对不同 Basic Auth 信息,访问不同用户目录

server {
location / {
auth_basic “Please Login”;
auth_basic_user_file “/etc/nginx/htpasswd”;
root /var/www/sites/mysite.com/http/$remote_user;
}
}

参考文献
webserver – Configure nginx with multiple locations with different root folders on subdomain – Stack Overflow Nginx – root versus alias, for serving single files? – Server Fault[……]

READ MORE

「sing-box」- The universal proxy platform.

认识
官网:https://sing-box.sagernet.org/ 文档:https://sing-box.sagernet.org/ 仓库:https://github.com/SagerNet/sing-box
The universal proxy platform. 简而言之,sing-box 是个代理软件,是个科学上网的工具。其本身并不提供新的代理协议,而是集成现有代理协议,以允许我们根据需求来配置使用某个代理协议。
组成
Server | To use sing-box as a proxy protocol server, you pretty much only need to configure the inbound for that protocol.
Client | https://sing-box.sagernet.org/manual/proxy/client/ 该文档介绍 Client 的工作原理;
构建
针对 sing-box 程序,既能作为服务端,又能作为客户端,具体行为取决于 config.json 的配置

安装文档 https://sing-box.sagernet.org/installation/package-manager/
程序下载 https://github.com/SagerNet/sing-box/releases

客户端安装

GUI for SingBox on Windows Linux macOS | https://github.com/GUI-for-Cores/GUI.for.SingBox
on Android | https://sing-box.sagernet.org/clients/android/
on iOS | https://sing-box.sagernet.org/clients/apple/[……]

READ MORE

「MetaMask」- 领先的加密钱包平台 | 区块链钱包

认识
官网:https://metamask.io/ 文档:https://docs.metamask.io/ 仓库:https://github.com/metamask
MetaMask is only designed for Ethereum and EVM-compatible blockchains — not blockchains like Solana. 简而言之,MetaMask 是个区块链钱包账户的管理工具。
组成
WIP
构建
https://metamask.io/download
其能够以浏览器扩展的形式进行安装。
性质
Snaps | Enhance your wallet with third-party built features
https://metamask.io/snaps
Snaps add new functionality to MetaMask. 简而言之,Snap 允许开发者向 MetaMask 添加自定义功能。
https://snaps.metamask.io Explore hundreds of community-built Snaps that enable new features and extend MetaMask beyond Ethereum.
例如,通过 Solflare Solana Wallet Snap 扩展,能够将 ETH 转为 SOL 代币。

其大致过程如下:

浏览器安装 MetaMask 与 Solflare 插件,并进行账户等等配置。
MetaMask 安装 Solflare Solana Wallet Snap 扩展,并根据提示进行操作。
在 Solflare Wallet 中,通过 Bridge 完成操作。

详细操作过程,参考文档:https://www.quicknode.com/guides/solana-development/wallets/metamask[……]

READ MORE

「Yarn」- Package Manager | Safe, stable, reproducible projects

认识
官网:https://yarnpkg.com
组成
配置文件路径
Where is the global yarn config file? · Issue #3010 · yarnpkg/yarn
使用 yarn config list –verbose 可以获取配置文件的查找路径。
构建
在 Linux 中,安装 Yarn 工具
在使用 APT 包管理器安装 Node.js 之后,会提示如下 Yarn 安装命令:

curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add –
echo “deb https://dl.yarnpkg.com/debian/ stable main” | tee /etc/apt/sources.list.d/yarn.list
apt-get update && apt-get install yarn

性质
使用国内阿里云镜像加速
npm 和 yarn 使用国内阿里云镜像加速 – mouseleo – 博客园

yarn config set registry \
https://registry.npm.taobao.org –global
yarn config set disturl \
https://npm.taobao.org/dist –global

设置使用网络加速
jenkins – Yarn ignores proxy settings – Stack Overflow yarn config | Yarn

# 添加网络加速

yarn config set proxy “http://127.0.0.1:8123”
yarn config set https-proxy “http://127.0.0.1:8123”

# 删除网络加速

yarn config delete proxy
yarn config delete https-proxy

应用
使用 yarn 命令,来管理模块(包)

# 全局安装

yarn global add @mermaid-js/mermaid-cli

参考
Home | Yarn – Package Manager[……]

READ MORE

「CONTAINER-IMAGE」- 容器镜像 | Container Image

认识
容器镜像是一种轻量级、可移植的软件打包格式,用于在容器化平台上部署应用程序。它包含了运行应用程序所需的所有文件、依赖项和配置信息。
性质
容器镜像具有以下特点:

可移植性:容器镜像可以在不同的容器化平台上运行,无需重新配置或修改应用程序。
轻量级:容器镜像只包含应用程序所需的最小文件和依赖项,因此它们比传统的虚拟机镜像更小巧。
可重复性:容器镜像是以声明式方式构建的,因此可以确保在不同环境中以相同的方式运行应用程序。
高效性:由于容器镜像使用分层文件系统,它们可以共享共同的层,从而节省存储空间并提高部署效率。

应用
开发人员可以使用镜像来构建、部署和管理容器化应用程序,从而实现快速、可靠和可扩展的应用程序交付。[……]

READ MORE

「Harbor」- 部署服务 | 高可用部署 | Kubernetes

该笔记将记录:在 Kubernetes Cluster 中,部署 Harbor 的方法,以及相关问题的解决办法。
针对整个安装过程,我们还是遇到若干问题,相关部分将详细记录;
系统架构

Start with Harbor 2.5.3
Harbor docs | Deploying Harbor with High Availability via Helm harbor-helm/_helpers.tpl at master · goharbor/harbor-helm · GitHub
通过 Nginx Ingress 组件,我们来暴露 HTTP 接口,以提供访问; 通过 cert-manager 组件,来自动申请证书,以提供 HTTPS 访问;
我们习惯于拉取 Chart 的 .tgz 文件,并生成 values.yaml 文件,以进行配置的 Git 管理;
部署过程
添加仓库,并获取 Chart 文件:

# helm repo add harbor https://helm.goharbor.io
# helm repo update

# helm pull harbor/harbor # CHART 1.9.3, APP 2.5.3
# helm show values ./harbor-1.9.3.tgz > harbor-1.9.3.helm-values.yaml

修改 harbor-1.9.3.helm-values.yaml 文件:

# 针对场景,配置不同参数,这里仅列举我们需要配置的关键参数:

expose.type: ingress

expose.tls.certSource: secret # 我们使用 cert-manager 申请证书;
expose.tls.secret.secretName: harbor-core-tls
expose.tls.secret.notarySecretName: harbor-notary-tls

expose.ingress.hosts.core:
expose.ingress.hosts.notary:
expose.ingress.annotations: kubernetes.io/ingress.class: nginx
expose.ingress.annotations: cert-manager.io/cluster-issuer: letsencrypt[……]

READ MORE

「HTTPS」- 申请 Let’s Encrypt 证书、免费 HTTPS 证书

如何获取免费 HTTPS 证书?
提供免费证书的机构
通过「Let’s Encrypt」机构,由非营利性组织互联网安全研究小组提供的免费、自动化和开放的证书颁发机构(CA)。为了让我们用上免费证书(Let’s Encrypt)。
申请免费证书的方法
官方鼓励自动化证书申请,并推荐使用 Certbot 客户端(当然还有其他客户端)。它可以实现证书自动续期,无宕机时间,可手动配置,易用,跨平台,文档完善等众多优点。
注意事项

使用客户端,需要有服务器访问权限(如果没有 Shell 访问权限,请参阅官方「Without Shell Access」文档)。
如果是试用自动证书申请,请使用「staging environment」,避免触发频率限制。

性质
# Why ninety-day lifetimes for certificates?

由于时间周期短,可以减少密钥泄漏和证书无法带来的损害。
鼓励自动化,减轻大量站点证书续期问题。

# Staging Environment
参考
Let’s Encrypt/Getting Started 快速签发 Let’s Encrypt 证书指南 certbot instructions[……]

READ MORE

「CSS」- 学习笔记 | 快速开始

注释 | Comment
w3schools / CSS Comments

/* This is a single-line comment */
p {
color: /*red*/ red; /* Set text color to red */
}

/* This is
a multi-line
comment */

换行 | Newline

每个属性单独一行。这是最常见的写法,每个属性和值都独占一行,方便阅读和维护。
选择器换行。如果有多个选择器,可以将它们分成多行。
媒体查询换行。在媒体查询中,可以将条件分成多行,尤其是条件较长时。
长属性值换行。如果某个属性的值特别长(如渐变、阴影等),可以将其分成多行。
注释换行。如果注释内容较长,可以分成多行。
……

简而言之,如果需要针对 CSS 代码进行换行,则直接 Enter 换行即可。
选择器 | Selector
CSS element>element Selector CSS – Selectors Level 3
CSS 选择器不但能在 CSS 中使用,在 JavaScript 中也广泛的使用(当然用于选择元素),所以学习基本的 CSS 选择器还是很有必要的。
在 CSS 中,通过选择器来选择元素,然后针对这些选中的元素来应用我们定义的样式。所以学习 CSS 选择器,就是学习一种用来匹配元素的语法(就像匹配字符串使用的正则表达式)。
.
通过 class=”” 选择元素
#
通过 id=”” 选择元素
,
针对多个选择器,使用相同与样式(How can I apply styles to multiple classes at once?):

.abc, .xyz { margin-left: 20px; }

>
选择“父元素为特定元素”的标签:

div > p {
background-color: yellow;
}

*
选择子元素(How do I apply a style to all children of an element):

.wrapper * { /* 全部子元素 */
}

.myTestClass > * { /* 直接子元素 */
}

~
选中所有在 h2 后面的同级 p 标签

h2 ~ p {
color: blue;
}

+
当 p 前面有 h2 时,给这个 p 设置样式。其只选中紧接在 h2 后面的[……]

READ MORE

「HTTP」- 状态码 | Status Code

RFC7231 | 更多内容,参考 6. Response status code 章节 | https://tools.ietf.org/html/rfc7231#section-6
测试地址:http://httpstat.us/
HTTP 状态码(HTTP Status Code)是服务器响应状态的 3 位数字码,用于向客户端返回操作结果。
1XX (Informational)请求被接收 100 Continue 请求被接收,继续执行。
2XX (Successful)请求成功 200 OK 成功,有响应消息体。 201 Created 资源创建成功,在 location 域中包含有新建资源的 URI。 204 No Content 成功,无应答消息体。
3XX (Redirection)进一步操作需要被执行 301 Moved Permanently 目标资源被分配了新的 URI,且未来的资源都会关联到新的 URI。 307 Temporary Redirect https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/307
4XX (Client Error)请求错误 400 Bad Request 请求消息体错误,消息体中携带有错误描述。 401 Unauthorized 授权失败,例如证书不匹配。 403 Forbidden 禁止访问,可能的原因是:用户试图执行权限之外的操作或登录用户名密码错误。 404 Not Found 找不到请求的资源。 444 typically indicates that the server has returned no response to the client and closed the connection.
5XX (Server Error)服务端错误 500 Internal Server Error 服务器内部错误,不能执行此请求,用户需要稍后重新发送请求。 501 Not Implemented 功能未实现。[……]

READ MORE

「Kubernetes Objects」- ServiceAccount | 为应用提供惟一的身份

认识
如何赋予应用程序唯一的身份,以便从细节上控制其对 Kubernetes 资源的访问?
创建 ServiceAccount(服务帐号)资源,并在 Pod 的 Spec 中使用该资源;

# kubectl create serviceaccount myappsa
# kubectl describe serviceaccount myappsa
# kubectl describe secret “myappsa-token-rr6jc” # 参数 “myappsa-token-rr6jc” 由上一步输出;

然后,在 Pod 中使用该 ServiceAccount 资源:

kind: Pod
apiVersion: v1
metadata:
name: myapp
spec:
serviceAccountName: myappsa
container:
– name: main
image: centos:7
command:
– “sleep”
– “infinity”

验证该 Pod 正常使用 ServiceAccount 资源:

# kubectl exec myapp -c main cat /var/run/secrte/kubernetes.io/serviceaccount/token

如果正确挂载就会有输出;
# 讨论
「可以识别的实体」是认证和授权的前提条件。从 APIServer 的角度看,由两种类型的实体:终端用户;应用程序。终端用户不再 K8S 的管理范围内,但是 k8s 提供了代表应用程序的以及资源:ServiceAccount;
严格来讲,应用程序的认证由 token 认证,并保存在本地的 /var/run/secrets/kubernetes.io/serviceaccount/token 文件中,该文件通过 secret 自动挂载。ServiceAccount 属于 Namespace 的资源,访问形式如下:

system:serviceaccount:$NAMESPACE:$SERVICEACCOUNT

查看某个命名空间内的 ServiceAccount,可以看到类似的信息:

# kubectl get serviceaccounts
NAME SECRETS AGE
default 1 365d

这里由一个名为 defalut 的服务帐号,提示自动创建的;
如果不明确为 Pod 指定 ServiceAccount,则[……]

READ MORE

「kubectl」- 访问多个集群

我们需要使用 kubectl 命令管理多个 Kubernetes 集群,这需要使用 kubectl config Context 相关配置来实现。该章节将记录:如何使用 kubectl 命令来管理多个 Kubernetes 集群,以及相关问题的处理方法。
方法一、通过 TOKEN 管理
适用场景:在这种情况下,管理员负责管理集群,并分发 TOKEN 给我们,我们通过 TOKEN 管理集群。
操作分为四步,为了记忆能够这样理解: 1)添加 Cluster 信息; 2)添加访问 Cluster 所使用的 TOKEN 信息; 3)创建 Context 以将 TOKEN 与 Cluster 进行绑定(关联); 4)切换到 Context 以使用该 Context 来访问集群;
详细操作过程如下:

# kubectl config set-cluster “example-k8s-staging” –insecure-skip-tls-verify=true –server=https://k8scp-endpoint.example.xyz:6443

# kubectl config set-credentials “example-k8s-staging-admin-token” –token=’eyJhbGciOiJSUzI1NiIsIm…’

# kubectl config set-context “example-k8s-staging-ctx” –cluster=”example-k8s-staging” –user=”example-k8s-staging-admin-token”

# kubectl config use-context “example-k8s-staging-ctx”

补充说明: 1)选项 –token 所使用的 token 参数应该向集群管理员索取(参考 Using RBAC Authorization 笔记,以了解创建 TOKEN 的方法) 2)–insecure-skip-tls-verify=true:鉴于我们集群是自签名证书,所以应该使用 –certificate-authority 指定 CA 信息,但我们使用该选项偷懒;
方法二、合并 .kube/config 文件
我们部署多套 Kubernetes 集群,所以有多个集群的 .kube/config 配置文件,而我们希望合并这些配置文件。

# 第一步:被合并的多个 config 文件的 name 字段不能相同,否则仅能保留其中某个配置
# 因此,我们使用如下脚本进行修改:
sed -i -E ‘s/kubernetes-admin/kubernetes-ad[……]

READ MORE

「Certbot」- 常见问题处理、常用配置

当部署 certbot 成功后,剩下的任务就是通读官方文档,以解决各种问题: Welcome to the Certbot documentation! — Certbot 1.15.0.dev0 documentation
博客笔记都是静态页面,用不用 HTTPS 都可以,但是大家都在用…………所以尝尝味道嘛,反正也买不起证书…………而且用这东西只是早晚的事情。
该笔记将记录:如何申请免费证书来启用 HTTPS 站点。
性能测试
http_load – multiprocessing http test client
在证书自动续期后,自动重启相关服务
User Guide — Certbot 1.15.0.dev0 documentation
参考 Renewing certificates 部分,以获得关于证书续期相关的完整说明。
在 Certbot 自动续期之后,需要重启相关服务,比如 Nginx 服务,以应用新的证书。
通过命令行:

certbot renew –deploy-hook “/path/to/deploy-hook-script”

通过配置文件:脚本保存在 /etc/letsencrypt/renewal-hooks/deploy 目录,当证书申请成功后,certbot 将执行该目录下的脚本。
执行顺序:按字母顺序排列的,并且不依赖于 Locale 域设置
针对非标准路径的 Nginx 部署

certbot run -a dns-dnspod \
–dns-dnspod-credentials /etc/letsencrypt/dnspod-credentials.ini \
–nginx-server-root=/usr/local/nginx/conf/ \
–nginx-ctl=/usr/local/nginx/sbin/nginx \
–no-redirect

–no-redirect,该参数禁用 Certbot 自动配置 80 到 443 重定向。 –nginx-server-root=/usr/local/nginx/conf/,该路径需要包含 nginx.conf 文件。 –nginx-ctl=/usr/local/nginx/sbin/nginx,该参数指定 nginx 二进制程序的路径。
certbot-dns-route53
https://snapcraft.io/install/certbot-dns[……]

READ MORE

「CONTAINER-IMAGE-BUILDING」- 镜像构建 | 通过 docker build 构建

HTTP Proxy
Running BuildKit using docker buildx behind a proxy – Stack Overflow

docker buildx create –use –driver-opt env.http_proxy=172.17.0.1:3128 –driver-opt env.https_proxy=172.17.0.1:3128 –driver-opt ‘”env.no_proxy=’$no_proxy'”‘
docker buildx build …

通过 Dockerfile 构建镜像 | 推荐
因为通过 Dockerfile 构建镜像具有可重复性、透明性、幂等性,因此推荐使用 Dockerfile 来构建镜像。
新镜像是基于已有进行构建的;
Dockerfile 使用 DSL(Domain Specific Lanaguage)
第一步、编写 Dockerfile 文件
Docker Build (Buildx and BuildKit):Dockerfile
第二步、执行构建命令
docker build –file path/to/Dockerfile –tag name:tag /path/to/build/context/
需要创建一个目录,这个目录称为构建环境,在 Docker 中称之为上下文,构建时该目录的内容会上传到 Docker 守护进程,这样 Docker 守护进程就能直接访问用户想在镜像中存储的任何代码、文件、数据;
在上下文目录中执行 docker build 命令后,docker 或读取 Dockerfile 文件,然后执行其中的指令。可以使用-t选项指定仓库、名称、TAG 信息;
命令类似于:docker build -t “jam/static_web:v1” .
最后的点(.)指出当前目录为上下文目录。如果未指定标签(这里是 v1),则默认的为 latest 标签;
也可以使用 Git 仓库的源地址来指定 Dockerfile 的位置:docker build -t “jam/static_web:v1” git@github.com:jam/static_web
可使用-f 选项指定 Dockerfile 位置,用于处理 Dockerfile 文件名非 Dockerfile 的情况。但是 -f 选项指定的文件必须位于 Build Context中:

docker build -t “jam/static_web:v1” -f /path/to/dockerfile-v1 .

构建的每一步[……]

READ MORE

「CSS/FRAMEWORK」- Bootstrap,学习笔记

问题描述
该笔记将记录:与 Bootstrap 相关的内容,以及相关问题的解决方案。
解决方案
官方站点:Bootstrap · The most popular HTML, CSS, and JS library in the world.
该部分的主要内容是我们学习《Bootstrap 用户手册:设计响应式网站》的笔记,我们将在各章节中记录感兴趣的内容,让我们形成对 Bootstrap 的整体认识,并简单了解其使用方法。
WIP Bootstrap 进一步学习页面布局方法。
Bootstrap 提供的网站框架
Bootstrap,2011 年 8 月发布,提供一套标准化的前端开发工具; 从最初 CSS 驱动的项目,发展到内置了很多 JavaScript 插件和图标,并且涵盖了表单和按钮元素; Bootstrap 本身支持响应式 Web 设计,而且拥有一个非常稳健的 12 列、940 像素宽的网格布局系统。 Bootstrap 网站,还提供了一个构建工具,让你根据自己的需求选择 CSS 和 JavaScript 功能。
在网站中引入 bootstrap.css 这个 CSS 文件,或者再加上 bootstrap.js 这个 JavaScript 文件,整个项目的基础平台就搭建好了。
Bootstrap 的文件结构
下载:Download · Bootstrap

# tree /tmp/bootstrap-4.3.1-dist
/tmp/bootstrap-4.3.1-dist
├── css
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   ├── bootstrap-grid.css
│   ├── bootstrap-grid.css.map
│   ├── bootstrap-grid.min.css
│   ├── bootstrap-grid.min.css.map
│   ├── bootstrap.min.css
│   ├── bootstrap.min.css.map
│   ├── bootstrap-reboot.css
│   ├── bootstrap-reboot.css.map
│   ├── bootstrap-reboot.min.css
│   └── bootstrap-reboot.min.css.map
└── js
├── bootst[……]

READ MORE