简单介绍下macOS当前docker运行环境的最新选择:colima,一个开源产品,使用体验与vagrant类似,感觉非常不错

colima

根据colima官方仓库指导安装colima

1
brew install colima

colima默认的runtime是docker,因为k8s已经剥离了docker,只保留containerd,所以为了跟k8s保持一致,另外也不想再多安装一个软件,就选择了只用containerd

但如果你使用了docker compose,那么最好还是根据教程安装docker以及docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
# 拉取镜像并创建vm
colima start --cpu 1 --memory 2 --disk 50 --runtime containerd
# 这里还可以开启kubernetes支持
# colima start --cpu 4 --memory 8 --disk 100 --runtime containerd --kubernetes

# 查看vm列表
colima list

# 连接vm
colima ssh

# 安装nerdctl用于支持containerd
colima nerdctl install
阅读全文 »

MySQL 9以及PostgreSQL 17为例,从Web开发者的角度出发,列举两个数据库在使用方面的差异,仅介绍与CRUD依赖的操作,存储过程/主从复制暂不介绍

账号管理

管理员

MySQL创建管理员账户操作如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 1. 创建mydb_admin管理员账户
-- 格式:`CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';`
CREATE USER 'mydb_admin'@'%' IDENTIFIED WITH caching_sha2_password BY 'your_password';

-- 2. 授权数据库/表访问权限
-- 格式:`GRANT PRIVILEGE ON database.table TO 'username'@'host';`
GRANT ALL PRIVILEGES ON mydb.* TO 'mydb_admin'@'%';
-- 如果不清楚有哪些权限,执行
-- SHOW PRIVILEGES;

-- 3. 立即生效
FLUSH PRIVILEGES;

-- 4. 查看账户列表核对
SELECT * FROM mysql.user;
-- SELECT * FROM mysql.user WHERE User='mydb_admin' AND Host='%';

-- 5.查看账户授权
SHOW GRANTS FOR 'mydb_admin'@'%';

PostgreSQL创建管理员账户操作如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 1. 创建mydb_admin管理员账户
CREATE ROLE mydb_admin LOGIN PASSWORD 'your_password';

-- 2. 授权数据库/表访问权限(需要多条语句)
GRANT ALL PRIVILEGES ON DATABASE mydb TO mydb_admin;
-- 如果不想让账号访问其他db
-- REVOKE CONNECT ON DATABASE otherdb1 FROM PUBLIC;

-- 所有跟public相关的授权都需要先切换到指定数据库
\c mydb
-- 授权public
GRANT ALL PRIVILEGES ON SCHEMA public TO mydb_admin;
-- 后续所有变更自动授权(由super admin执行)
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO mydb_admin;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO mydb_admin;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO mydb_admin;

-- 3. 删除角色
-- DROP OWNED BY mydb_admin;
-- DROP ROLE mydb_admin;
阅读全文 »

记录下如何移除swift文件的头部注释

注意,zsh要在空格处添加反斜杠 \,否则无法生成正确的文件路径

清空模板注释内容(可选)

以下操作可以先备份文件

修改IDETemplateMacros.plist文件,移除注释内容

1
vi ~/Library/Developer/Xcode/UserData/IDETemplateMacros.plist

找到FILEHEADER,将string的内容清空

Swift File

进入Xcode目录

1
cd ~/Library/Developer/Xcode/

添加模板No Comment Swift File.xctemplate,该模板会展示在Xcode的文件目录列表

1
mkdir -p Templates/File Templates/MultiPlatform/Source/No Comment Swift File.xctemplate

进入模板目录

1
cd Templates/File Templates/MultiPlatform/Source/No Comment Swift File.xctemplate

复制原swift file模板数据

1
cp /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform/Source/Swift File.xctemplate/* ./

修改___FILEBASENAME___.swift,将第一行头部注释部分移除

阅读全文 »

默认情况下,k8s创建的服务是无法对公网提供访问的,如果要从公网访问k8s服务,一般有三种方式,NodePort、LoadBalancer、Ingress,下面简单介绍NodePort、LoadBalancer,着重讲解Ingress

本文使用的deployment同官方教程nginx-deployment,图片是从ingress-nginx官方文档拷贝过来借用,如侵必删

NodePort

nodeport

如上图所示,客户端访问集群内任意机器端口30100,k8s自动将请求转发到对应的服务

  1. 创建NodePort类型的service(不指定nodeport的情况下,默认从30000-32767中挑选一个端口使用)
1
kubectl expose deployment nginx-deployment --type="NodePort" --port 80
  1. 查看service kubectl get svc,输出如下
1
2
3
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
nginx-deployment NodePort 10.110.255.135 <none> 80:31402/TCP 4s
  1. 验证

外部客户端先访问集群内任意节点端口31402,然后节点会转发到与端口关联的k8s内部服务nginx-deployment。

在物理机上访问服务curl http://vm1:31402,对比在虚拟机如vm1上执行curl http://10.110.255.135,两者的输出是一致的

  1. 删除service
1
kubectl delete svc nginx-deployment

注意:考虑到线上一般是直接通过域名访问,如果不想在域名后还要添加端口访问服务,如www.noname.io:31402,那么还需要使用nginx/haproxy建立一个反向代理的网关进行管理

阅读全文 »

在Kubernetes官网的学习教程:wordpress中,我尝试了手动创建pv并绑定pvc,但是每次申请pvc都要手动添加pv并绑定是一件很麻烦且很容易出错的事情,官方也早就意识到这个问题,提出了动态存储分配,只需要通过storageclass即可实现

本文使用了nfs作为集群存储用于实践,线上建议考虑使用ceph等分布式文件存储系统,nfs搭建教程参考:How to Install NFS Server and Client on Ubuntu 22.04

安装nfs provisioner

  1. 确认nfs服务器在集群节点中可以正常访问
1
2
3
4
# 安装客户端
sudo apt install nfs-common
# 执行命令挂载,确认可正常使用
sudo mount 192.168.0.105:/mnt/nfs_share /mnt/nfs_clientshare
  1. 新建一个目录如nfs-example,创建kustomization.yaml文件

鉴于gfw的影响,建议下载github.com/kubernetes-sigs/nfs-subdir-external-provisioner仓库,并将deploy文件夹提取出来,里面主要是账户创建、角色绑定、命名空间、deployment等配置

1
2
3
4
5
# kustomization.yaml
namespace: nfs-provisioner
resources:
# - github.com/kubernetes-sigs/nfs-subdir-external-provisioner//deploy
- ./deploy
  1. 创建命名空间nfs-provisioner
1
2
3
4
5
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nfs-provisioner
阅读全文 »

简单的配置管理,可以把信息写入文件放在项目里,然后打包发布,但这样会有信息泄露的安全风险,经常会看到谁谁谁把项目上传到github,然后公司数据库/敏感密钥泄漏等。所以,现在的公司一般会自建发布平台,通过发布平台管理配置,流程:配置修改->审核->发布。了解到这背景,我们就知道config跟secret在整个软件开发过程中扮演的角色,接下来就学习如何配置config/secret并使用

当然,一般情况下,配置管理没有那么简单,要考虑多种环境如dev/test/release以及地区区分,操作需小心谨慎,一不小心就出现遗漏、错配,此外,还有多人开发时配置冲突等,这些都是开发过程中要注意的问题

Config

以下展示configMap的简单配置,必须字段apiVersion、kind、metadata、data/binaryData。data可以是key-value键值对,也可以是文件名-文件内容,数据的大小不能超过1MB,具体可以查看官网api描述文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# game-demo.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 1. key-value
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"

# 2. filename-content
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true

执行命令写入k8s,查看并验证配置信息

1
2
3
4
5
6
# 写入k8s
kubectl apply -f game-demo.yam
#
kubectl get cm game-demo
# 查看config数据
kubectl describe cm game-demo
阅读全文 »

当没有桌面时,ubuntu服务器该如何连接宽带、共享Wi-Fi热点,就像一台路由器一样运作,或者如何连接Wi-Fi,以下简单介绍这几个操作的过程

连接宽带

PPPOE方式

使用nmcli输入pppoe账号密码,这时会打开一个交互式的命令行

1
sudo nmcli con edit type pppoe con-name "Connection name"

输入保存宽带账户相关信息

1
2
3
4
5
6
# 输入账号名密码
set pppoe.username <username>
set pppoe.password <password>
# 保存并推出
save
quit

连接Wi-Fi

1
2
3
4
5
# 列出所有Wi-Fi热点
sudo nmcli dev wifi

# 连接Wi-Fi热点
sudo nmcli dev wifi connect <SSID> <password>

共享Wi-Fi

禁用cloud-init

1
sudo bash -c "echo 'network: {config: disabled}' > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg"

创建Netplan配置

sudo vi /etc/netplan/10-my-config.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
network:
version: 2
renderer: NetworkManager
ethernets:
eth0:
dhcp4: true
optional: true
wifis:
wlan0:
dhcp4: true
optional: true
access-points:
"Connection Name":
password: "you wifi password"
mode: ap # 如果是作为客户端使用,移除这一行

Netplan配置生效

1
2
sudo netplan generate
sudo netplan apply

Ubuntu Server 18 Wifi Hotspot setup

现在的在线视频网站为了打击盗版、保护资源/网络流量,不再直接使用mp4等视频格式,而是转而使用m3u8文件(播放索引列表)+ts文件(视频分段技术),其中有的视频还用了加密,下面简单展示下如何下载ts文件并合并为mp4

m3u8索引

从浏览器的dev tool找到m3u8文件的连接并下载,该m3u8文件内有所有的ts文件列表,你可以将他们复制出来,通过编辑器补全制作成完整的url,通过下载器批量下载

未加密

如果视频没有加密(m3u8文件中#EXT-X-KEY字段为空),那么在下载所有ts文件后,可以直接用linux命令合并

1
2
3
4
# ts段一般都有固定格式,如example_1.ts
echo 'ts_link_in_m3u8_file_'{number_first..number_end}.ts | tr "" "\n" > tslist
# 将所有相关的ts文件合并
while read line; do cat $line >> the_final_video.mp4; done < tslist

到这里就不需要再往下看了

加密

如果视频加密(m3u8文件中#EXT-X-KEY字段不为空),如下所示

1
2
3
4
5
6
7
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-KEY:METHOD=AES-128,URI="https://hentai.com/xxxxxx",IV=0xa746ff934e7fff621ba2cf5a32608914
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:6
#EXTINF:5.881,
https://hentai.com/xxxxxxyyyyyyyy.ts

处理步骤:

  1. 下载必须的文件
  2. 修改m3u8文件
  3. 使用ffmpeg合并
阅读全文 »

部署计划:先创建一台虚拟机vm1,安装docker以及k8s组件,然后克隆两台新的vm2/vm3,组合成一个小型的k8s集群

虚拟机准备

创建vm1

创建虚拟机vm1,以下就不展示繁琐的系统安装过程了

kvm create vm1

配置vm1

根据教程:安装docker并部署registry服务安装好containerd,再执行下面的配置

系统配置修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# linux 模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# lsmod | grep overlay
# lsmod | grep br_netfilter

# 网络配置
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

cat /etc/sysctl.d/k8s.conf

sudo sysctl --system

# sudo sysctl -a | grep net.ipv4.ip_forward
阅读全文 »

安装

前置依赖

系统是ubuntu 24.04 LTS,开机启动使用了systemd,所以先安装相关依赖包

1
sudo apt install libsystemd-dev

编译安装

官网推荐使用pre-packaged方式,稳定可靠,适合生产环境。不过我想用最新版,就直接用源码编译安装了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 进入源代码目录
cd postgresql-16.4

# 指定安装目录、设置支持systemd
./configure --prefix=/usr/local/postgresql-16.4 --with-systemd --with-ssl=openssl

# 编译安装
make
sudo make install

# 软连接,方便升级用
sudo ln -s /usr/local/postgresql-16.4 /usr/local/pgsql

# 创建用户
sudo adduser postgres

# 数据库数据存储目录,与app目录分离
sudo mkdir -p /var/lib/pgsql/data
sudo chown -R postgres /var/lib/pgsql

# 切换到postgres用户
su - postgres

# 初始化数据库目录、启动实例
/usr/local/pgsql/bin/initdb -D /var/lib/pgsql/data
/usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start
# 验证
/usr/local/pgsql/bin/psql
# 关闭实例
# /usr/local/pgsql/bin/pg_ctl -D /var/lib/pgsql/data/ -l logfile stop

到这里,postgresql完成安装、初始化

阅读全文 »
0%