蜻蜓的窝 - 软件开发 https://dragonfly.fun/category/code/ zh-CN 编程相关心得 Mon, 04 Dec 2023 13:47:00 +0800 Mon, 04 Dec 2023 13:47:00 +0800 小米AX3000开启SSH 暴露IPV6公网IP https://dragonfly.fun/archives/miwifi.html https://dragonfly.fun/archives/miwifi.html Mon, 04 Dec 2023 13:47:00 +0800 蜻蜓特派员 随着IPV4的资源枯竭和IPV6的普及,通过IPV6在公网上暴露自家NAS成为更为更好的方式。
但是自家购买的 小米AX3000 官方固件固件 IPV6 相关的功能十分简陋,只有一个防火墙开关。如果单纯的关闭防火墙,势必会让局域网所有设备都暴露到公网中,十分危险。又不像高端型号(如小米AX9000)提供的 SSH 功能,引出了此文

本文使用 小米路由官方固件 实现自定义IPV6防火墙的高级功能

1.开启路由器的 SSH 服务

首先到 https://github.com/openwrt-xiaomi/xmir-patcher 下载最新的脚本,Windows 用户直接运行 run.bat 即可

确认 IP 设置正确后,选择 2 后按提示开始安装并设置密码

安装完成后即可通过如下命令连接

ssh -o HostKeyAlgorithms=+ssh-rsa [email protected]

2.放行特定设备的端口

SSH 进入小米官方固件,可以看到系统是由 OpenWRT 修改而来,所以放行端口的方式类似原版 OpenWRT, 打开配置文件 /etc/config/firewall 并添加如下内容

config rule
    option name 'Allow-NAS'
    list proto 'tcp'
    option src 'wan'
    option dest 'lan'
    list dest_ip '::设备的后缀/::ffff:ffff:ffff:ffff'
    option dest_port '端口号'
    option target 'ACCEPT'
    option family 'ipv6'
路由器下级设备某个IPV6后四位IP固定不变的设备,例如::11aa:22bb:33cc:44dd/::ffff:ffff:ffff:ffff,该设备11aa:22bb:33cc:44dd固定不变)

保存后运行 /etc/init.d/firewall restart 即可生效

3.开机启动脚本设置

uci set firewall.aliddns=include
uci set firewall.aliddns.type='script'
uci set firewall.aliddns.path='/data/aliddns.sh'
uci set firewall.aliddns.enabled='1'
uci commit firewall

4. 其他 SSH 管理

  • 自定义 hosts 配置

官方的自定义 hosts 功能通过修改文件 /etc/custom_hosts 实现

  • 配置 Dnsmasq 实现 DNS 泛解析

修改 /etc/dnsmasq.d/custom.conf 为如下内容

address=/hismarttv.com/127.0.0.1

保存后运行 /etc/init.d/dnsmasq restart 即可生效

  • 停用访客 WiFi
ifconfig wl3 down
]]>
8 https://dragonfly.fun/archives/miwifi.html#comments https://dragonfly.fun/feed/category/code/archives/miwifi.html
基于 containerd 运行时的 Kubernetes 环境搭建 https://dragonfly.fun/archives/kubeadm.html https://dragonfly.fun/archives/kubeadm.html Sat, 23 Apr 2022 18:03:00 +0800 蜻蜓特派员 众说周知,Kubernetes 从 1.24 起就删除了 Dockershim 相关代码,现在整理了一下国内网络环境下使用 containerd 作为运行时的集群搭建步骤

1. 系统准备

# 允许 iptables 检查桥接流量
sudo tee /etc/modules-load.d/containerd.conf << EOF
overlay
br_netfilter
EOF

sudo tee /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
EOF

# 使设置生效
sudo modprobe overlay br_netfilter
sudo sysctl --system

# 禁用虚拟内存
sudo swapoff -a

2. 安装 Kubernetes 组件

2.1 Debian/Ubuntu

# 安装 containerd
curl -sL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-ce.gpg
echo "deb http://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y containerd.io

# 安装 kubeadm
curl -sL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubeadm=1.21.14-00 kubectl=1.21.14-00 kubelet=1.21.14-00

2.2 CentOS

# 安装 containerd
sudo curl https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sudo yum install -y containerd.io
sudo systemctl enable containerd

# 安装 kubeadm
sudo tee /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=0
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
sudo yum install -y --enablerepo=kubernetes kubeadm-1.21.14 kubelet-1.21.14 kubectl-1.21.14
sudo systemctl enable kubelet

2.3 配置容器运行时

# 配置容器运行时
sudo tee /etc/containerd/config.toml << EOF
version = 2
[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
    runtime_type = "io.containerd.runc.v2"
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://hub-mirror.c.163.com"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
    endpoint = ["http://registry.lan:5000"]
EOF
sudo systemctl restart containerd

# 添加自动填充
sudo tee /etc/profile.d/kubectl.sh << EOF
source <(kubectl completion bash)
source <(crictl completion bash)
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF

# 配置 crictl
sudo tee /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
EOF

3. 使用 Kubeadm 引导集群

sudo kubeadm init --kubernetes-version=1.21.14 --token=abcdef.0123456789abcdef \
  --apiserver-advertise-address=$(ip addr show dev eth0 | grep -Po 'inet \K[\d.]+') \
  --cri-socket=unix:///run/containerd/containerd.sock \
  --image-repository=registry.aliyuncs.com/google_containers

稍等几分钟,K8S 的 Master 节点就启动起来了

# 其他节点加入集群
sudo kubeadm join node1.lan:6443 --token=abcdef.0123456789abcdef --discovery-token-unsafe-skip-ca-verification

3.1 kubernetes 组件安装

# 链接 kubeconfig
sudo chmod +r /etc/kubernetes/admin.conf

# 配置网络插件
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

# 去除污点
kubectl taint node --all node-role.kubernetes.io/master-

# 安装 Helm
curl -sL https://get.helm.sh/helm-v3.9.2-linux-amd64.tar.gz | sudo tar zxf - --strip-components=1 -C /usr/local/bin

# 安装 Traefik Ingress Controller
helm install traefik -n kube-system --repo https://helm.traefik.io/traefik traefik

3.2 集群清理

sudo kubeadm reset --cri-socket=unix:///run/containerd/containerd.sock -f
sudo rm -rf /var/lib/{calico,etcd,kubelet,kubernetes,cni} /etc/cni/net.d /etc/kubernetes /opt/cni/bin/*

参考资料

  1. 弃用 Dockershim 的常见问题
  2. 生产环境
]]>
0 https://dragonfly.fun/archives/kubeadm.html#comments https://dragonfly.fun/feed/category/code/archives/kubeadm.html
联想笔记本的 Debian 之旅 https://dragonfly.fun/archives/debian.html https://dragonfly.fun/archives/debian.html Sun, 04 Jul 2021 18:42:00 +0800 蜻蜓特派员 Debian 11 Bullseye 已正式发布,借此机会整理了一下关于 Bullseye 在笔记本上的安装记录,遇到的主要问题是:无线网卡驱动、触摸板手势、电源管理

1. 准备 Debian 安装盘

首先到 Debian 官网 下载网络安装镜像 debian-11.0.0-amd64-netinst.iso

  • 制作 Ventoy 启动U盘

Ventoy 的便利性这里不做赘述,下载最新版 Ventoy2Disk 一键制作启动盘
然后将刚在下载的 ISO 文件拷贝到U盘根目录下面

  • 无线网卡固件

博主的笔记本是没有有线网卡的,首先需要下载网卡 固件文件 驱动无线网卡,可以根据自己的网卡型号选择不同的固件,博主为了安装黑苹果,已经将笔记本自带的无线网卡更换为 D1830A,此处使用的是博通的固件

厂商固件文档
英特尔(Intel)firmware-iwlwifihttps://wiki.debian.org/iwlwifi
博通(Broadcom)firmware-brcm80211https://wiki.debian.org/brcmfmac
瑞昱(Realtek)firmware-realtek
高通(Atheros)firmware-atheros

使用 ar x firmware-xxx.deb 命令解压得到 data.tar.xz 得到固件压缩包。

下面使用 Ventoy 文件注入插件 把固件文件注入到安装盘中,
编辑 U盘中的 ventoy\ventoy.json 为如下内容

{
    "injection": [{
        "image": "/debian-testing-amd64-netinst.iso",
        "archive": "/firmware-brcm80211.tar.xz"
    }]
}

重启电脑按 F12 进入启动选单,选择 EFI USB Device 即可进入 Ventoy 启动界面

Debian-00-boot.png

2. Debian 安装

安装器的语言选择 简体中文

Debian-01-language.png

Debian-03-mirrors.png

2.1 最小化桌面安装

Debian 可以搭配多种 桌面环境 安装,大多数时候在选择组件时候勾选其中一项桌面环境即可,如果不是折腾党可以跳过此节。

Debian-04-tasksel.png

由于通过 tasksel 安装的桌面环境会预安装 浏览器、播放器、libreoffice等组件,虽然可以事后通过 sudo apt purge -y libreoffice? firefox-esr h3v 命令卸载,但是作为重度强迫症患者实在不能忍。

Debian-05-complete.png

当安装程序提示完成的时候,不要重启,按 Ctrl+Alt+F2 快捷键输入以下命令,然后安装桌面必要组件以及网络管理器

mount /dev/pts /target/dev/pts
chroot /target bash

sudo sed -i 's/bullseye main/bullseye main contrib non-free/g' /etc/apt/sources.list
sudo sed -i 's/security.debian.org/mirrors.163.com/g' /etc/apt/sources.list
sudo apt update

Debian-06-chroot.png

WiFi 连接

XFce 桌面环境 sudo apt install -y xfce4 network-manager-gnome fonts-wqy-zenhei

LXDE 桌面环境 sudo apt install -y lxde-core connman-ui fonts-wqy-zenhei

LXQt 桌面环境 sudo apt install -y sddm lxqt-core lxqt-admin cmst fonts-wqy-zenhei

Cinnamon 桌面环境 sudo apt install -y cinnamon-core

Budgie桌面环境 sudo apt install gdm3 budgie-desktop budgie-network-manager-applet fonts-wqy-zenhei

安装过程中可以通过 Ctrl+Alt+F2 组合键进入中断, Ctrl+Alt+F1 返回安装界面

2.2 系统固件配置

cat > ~/.Xresources << EOF
Xft.dpi: 130
EOF
  • 处理 Wifi 显示 “设备未托管” 问题

修改 /etc/NetworkManager/NetworkManager.confmanaged=false 改为 managed=true

2.3 配置触摸板多指手势

LXQt 桌面的用户可以通过开始菜单中的 首选项 -> LxQT 设置 -> 键盘与鼠标 中的 鼠标与触摸板 配置多指手势。但是LXDE 的用户就没有这么方便了,可以通过配置 libinput 的方法达到效果

运行 sudo apt install -y xserver-xorg-input-libinput 安装 Libinput
编辑 /usr/share/X11/xorg.conf.d/40-libinput.conf 修改如下内容

Section "InputClass"
        Identifier "libinput touchpad catchall"
        MatchIsTouchpad "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option "Tapping" "true"
        Option "NaturalScrolling" "true"
        Option "TapButton1" "1"
        Option "TapButton2" "2"
        Option "TapButton3" "3"
EndSection

重启后即可使用触摸板的 轻点、双指右键等功能

2.4 升级内核

运行 sudo apt edit-sources 将如下内容添加到最后

deb http://mirrors.163.com/debian/ bullseye-backports main
deb-src http://mirrors.163.com/debian/ bullseye-backports main

安装内核文件

sudo apt -t bullseye-backports install -y linux-image-amd64
  • 免密 sudo
echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/90-cloudimg

3. 应用安装

3.1 Google Chrome 浏览器

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install -y ./google-chrome-stable_current_amd64.deb

3.2 良心国产 Linux 应用

WPS Office for Linux 是由金山软件股份有限公司自主研发的一款办公软件套装,可以实现办公软件最常用的文字、表格、演示等多种功能。具有内存占用低、运行速度快、体积小巧、强大插件平台支持、免费提供海量在线存储空间及文档模板。

3.3 Visual Studio Code 编辑器

curl https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/microsoft.gpg
echo "deb [arch=amd64] http://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
sudo apt install -y code
  • 个性化配置

选择 File -> Prefernces -> Setting,Window 下的 Title Bar Style 选择为 custom

  • 编辑器字体

https://packages.debian.org/bullseye/ttf-mscorefonts-installer

修改 /etc/apt/source.list 增加 contrib

sudo apt install -y ttf-mscorefonts-installer 

修改 editor.fontFamilyCourier New

3.4 开发相关

sudo curl -sL https://mirrors.163.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
echo "deb [arch=amd64] http://mirrors.163.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker-ce.list
apt update && apt install -y docker-ce

3.5 使用 Deepin Wine 安装 Windows 软件

  • 修复 Debian 11 依赖

即将推出的 Debian Bullseye 中,由于 deepin-wine-plugin-virtual 所依赖的 python-dbuspython-gobject 两个基于 Python2.7 的包被砍掉了,所以没办法像 Debian 10 一样简单的补充一个 udis86 包就能解决依赖问题。Debian 10 用户可以只看下一节的 安装 Wine
此处采用了重新打包两个 deb 文件,将依赖重定向到 Python3 版本的方案

mkdir -p python-dbus/DEBIAN python-gobject/DEBIAN

cat > python-dbus/DEBIAN/control << EOF
Package: python-dbus
Version: 1.2.16-5
Architecture: all
Maintainer: Debian GNOME Maintainers
Depends: python3-dbus
Section: python
Priority: optional
Description: simple interprocess messaging system (Python interface)
EOF

cat > python-gobject/DEBIAN/control << EOF
Package: python-gobject
Version: 3.30.4-1
Architecture: all
Maintainer: Debian GNOME Maintainers
Depends: python3-gi
Section: python
Priority: optional
Description: Python 3 bindings for gobject-introspection libraries
EOF

dpkg -b python-dbus python-dbus.deb
dpkg -b python-gobject python-gobject.deb

sudo apt install -y ./python-*.deb
  • 安装 Wine
# 添加 Deepin 商店源
wget http://mirrors.163.com/deepin/pool/main/d/deepin-keyring/deepin-keyring_2021.06.07-1_all.deb
sudo apt install -y ./deepin-keyring_*.deb
echo "deb https://com-store-packages.uniontech.com/appstore eagle appstore" | sudo tee /etc/apt/sources.list.d/appstore.list

# 安装 x86 反汇编引擎
sudo dpkg --add-architecture i386
sudo apt update
wget http://mirrors.163.com/deepin/pool/non-free/u/udis86/udis86_1.72-4_i386.deb
sudo apt install -y ./udis86_*.deb

# 安装 Deepin-Wine5
sudo apt install -y deepin-wine-plugin-virtual

# 处理桌面快捷方式及图标
sudo tee "/etc/profile.d/deepin.sh" >/dev/null << "EOF"
XDG_DATA_DIRS=${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
for deepin_dir in /opt/apps/*/entries; do
    if [ -d "$deepin_dir/applications" ]; then
        XDG_DATA_DIRS="$XDG_DATA_DIRS:$deepin_dir"
    fi
done
export XDG_DATA_DIRS
EOF
  • 安装 QQ 微信
sudo apt install -y com.qq.im.deepin com.qq.weixin.deepin
# 调整DPI
env WINEPREFIX="$HOME/.deepinwine/Deepin-QQ" $HOME/.deepinwine/deepin-wine5/bin/winecfg 
env WINEPREFIX="$HOME/.deepinwine/Deepin-WeChat" /opt/deepin-wine6-stable/bin/winecfg
获取 deb 下载连接 apt install -y --print-uris $PACKAGE | cut -f 2 -d \' | grep \.deb
]]>
1 https://dragonfly.fun/archives/debian.html#comments https://dragonfly.fun/feed/category/code/archives/debian.html
Windows 本地快速启动 K8S 集群 https://dragonfly.fun/archives/k3d.html https://dragonfly.fun/archives/k3d.html Thu, 17 Jun 2021 11:43:00 +0800 蜻蜓特派员 Kubernetes (以下简称 K8S) 是 Docker 推出之后最热门的容器编排技术,然而想在本地将 K8S 跑起来,并不像我们想象的那么容易。存在以下几点「问题」:

  • 网络:K8S 里面的一些镜像在国内很难将其 pull 下来,当然这可以通过代理、镜像站等方式解决。
  • 资源:在内存资源不这么充裕的本地开发环境,去部署一个 K8S 集群,这无疑不是一个明智的选择。

那么有没有什么方案可以更优雅更轻量更快速搭建一个 K8S 集群呢?答案就是 K3D

目前主流的本地 k8s 运行方式有很多

  • minikube 仅支持单节点,但是我们期望可以跑一个集群的方式,方便我们去 Mock 节点宕机之后 K8S 自动调度的 case ✖️
  • microk8s 是 Ubuntu 生态里提供的一个可以单机运行的 k8s 版本,配合 Ubuntu 生态的 multipass,可以模拟多节点,但是在本就资源紧张的本地环境,通过虚拟机的方式模拟多节点,显然并不是我想要的 ✖️
  • kind 是一个基于 Docker 构建 Kubernetes 集群的工具,Kubernetes in Docker ✔️
  • k3d 是一个可以让 k3s 运行在 Docker 中的工具,相比于 kind ,启动速度更快,占用资源更小,也是本文采取的方案 ✅
关于 k3d 以及 kind 的对比,可以参考 K3d vs Kind 谁更适合本地研发

1. 什么是 K3D

k3s 是 Rancher 公司推出非常快速且轻量级的完全兼容的 Kubernetes 发行版(CNCF 认证)
k3d 是一个可以让 k3s 运行在 Docker 中的工具,它提供了一个简单的 CLI 来创建、运行和删除具有 1 到 N 个节点的 Kubernetes 集群
  • 最大程度减轻了外部依赖性,仅需要 kernel 和 cgroup 挂载。
  • 占用资源比完整版的 K8S 少了不少
  • 内置了很多组件,开箱即用,而且每一个组件都是可替换的
详情参考官方文档 什么是 K3s?

2. 通过 docker-machine 启动 Docker 服务

官方提供的 Docker Desktop 是基于 WSL2 实现的,需要开启 Hyper-V 功能。 这样会使整个 Windows 都跑在虚拟机中,导致某些虚拟化相关的应用不正常 (比如某些模拟器),而且内存占用也不太可控。
本文采用了基于 boot2docker 的方式运行 Docker 服务,定制性更灵活一些。

2.1 安装必备工

这里强烈推荐使用 Git for Windows 自带的 MinGW 命令行SHELL,使开发体验更加贴近与 Linux。以下操作均在 Git Bash 中进行

首先需要安装虚拟机软件 VirtualBox
然后需要下载如下命令工具并添加到环境变量 PATH

本文中上面这些工具下载到了 D:\Docker\bin,并将 D:\Docker\bin 添加到环境变量中
同时也配置了如下环境变量,将虚拟机文件的储存位置修改为 D 盘,避免占用系统空间
  • MACHINE_STORAGE_PATH=D:\Docker

~/.profile 文件添加如下内容配置命令行自动补全

sudo tee /etc/profile.d/kubectl.sh << EOF
source <(kubectl completion bash)
source <(k3d completion bash)

2.2 使用 boot2docker 启动 Docker 引擎

下面创建了一个磁盘大小为 60000 MB,CPU 使用 2 个核心的虚拟机

docker-machine create --virtualbox-cpu-count 2 \
 --engine-registry-mirror https://hub-mirror.c.163.com \
 --virtualbox-disk-size 60000 --virtualbox-memory 2048 \
 --virtualbox-no-share default
# 每次使用 docker 时都需要执行如下命令
eval $(docker-machine env --shell bash default)

稍等片刻,当出现以下日志时,说明 Docker 服务已启动完成

docker.png

第一次创建 Docker 实例会下载 boot2docker.iso 作为启动镜像,国内用户可以通过添加参数 --virtualbox-boot2docker-url https://github.com.cnpmjs.org/dragonflylee/boot2docker/releases/latest/download/boot2docker.iso 加速镜像下载

3 使用 k3d 启动 k3s 集群

3.1 创建 k3s 节点

首先我们尝试创建包含主节点和容器仓库的集群

eval $(docker-machine env --shell bash)
k3d cluster create --api-port 6443 \
  -p 0.0.0.0:80:80@loadbalancer \
  --k3s-arg "--disable=traefik@server:0" \
  --registry-create registry:0.0.0.0:5000

当出现下面的日志时,k3s 集群就创建成功了

k3d.png

此时,我们按照日志提示,运行 kubectl cluster-info 查看下当前集群的信息

运行 kubectl get pod -o wide -A 命令,当所有 Pod 的状态都是 Running 或者 Done 的时候,集群就初始化完毕了

  • 如果遇到 cgroups: cannot find cgroup mount destination: unknown. 的错误提示,请执行如下命令
docker-machine ssh default sudo sh - << EOF
mkdir /sys/fs/cgroup/systemd
mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
EOF

3.2 安装 K3S 组件

  • Helm 是 Kubernetes 的首选包管理工具

而 K3s 不需要任何特殊的配置就可以使用 Helm 命令行工具,如下命令使用 Helm CRD 部署 traefik 服务

kubectl create -f - << EOF
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
  chart: traefik
  repo: https://helm.traefik.io/traefik
  valuesContent: |-
    ports:
      websecure:
        expose: false
EOF

下面的例子是使用 Traefik CRD 开启内置的仪表盘

kubectl apply -f - << EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: kube-system
spec:
  entryPoints:
  - web
  routes:
  - match: Host(\`traefik.domain.com\`)
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService
EOF
更多配置参考 https://docs.rancher.cn/docs/k3s/helm/_index

4. 使用 KinD 启动 k8s 集群

KinD 顾名思义 Kubernetes in Docker,是一个使用 Docker 容器在本地运行 Kubernetes 集群的工具。相比 k3d,Kind 更贴近原生 Kubernetes,适合用于开发测试 Kubernetes 原生组件。

4.1 安装 KinD 命令行工具

首先下载最新版本的 KinD https://kind.sigs.k8s.io/dl/latest/kind-windows-amd64

kind create cluster --image kindest/node:v1.21.14 --config=- << EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  apiServerAddress: "$(docker-machine ip)"
  apiServerPort: 6443
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
kubeadmConfigPatches:
- |
  kind: ClusterConfiguration
  etcd:
    local:
      extraArgs:
        listen-metrics-urls: http://0.0.0.0:2381
  controllerManager:
    extraArgs:
      bind-address: 0.0.0.0
  scheduler:
    extraArgs:
      bind-address: 0.0.0.0
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://hub-mirror.c.163.com"]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
    endpoint = ["http://registry:5000"]
EOF
参数描述参考 https://kind.sigs.k8s.io/docs/user/quick-start#configuring-your-kind-cluster

4.2 使用 Helm 部署 Ingress

https://docs.nginx.com/nginx-ingress-controller/
# 生成测试用 SSL 证书
openssl req -x509 -nodes -newkey rsa:4096 -keyout tls.key -out tls.crt -days 3650 -subj "/CN=kube"
kubectl create secret tls ingress-wildcard-tls -n kube-system --cert=tls.crt --key=tls.key

# 安装控制器
helm install nginx -n kube-system --repo https://helm.nginx.com/stable nginx-ingress --values - << EOF
controller:
  image:
    tag: latest-alpine
  service:
    create: false
  controller:
    hostNetwork: true
  setAsDefaultIngress: true
EOF
helm install traefik -n kube-system --repo https://helm.traefik.io/traefik traefik --values - << EOF
service:
  enabled: false
ports:
  web:
    hostPort: 80
  websecure:
    expose: false
deployment:
  kind: DaemonSet
ingressClass:
  enabled: true
  isDefaultClass: true
EOF

4.3 部署 K8S 控制台

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/alternative.yaml
# 添加 ingress 路由 
kubectl create ing -n kubernetes-dashboard dashboard --rule="domain.com/*=kubernetes-dashboard:80,tls"
# 添加用户权限
kubectl create serviceaccount admin-user -n kubernetes-dashboard 
kubectl create clusterrolebinding admin-user --serviceaccount=kubernetes-dashboard:admin-user --clusterrole=cluster-admin
# 获取 Token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

参考文档:

]]>
0 https://dragonfly.fun/archives/k3d.html#comments https://dragonfly.fun/feed/category/code/archives/k3d.html
友善之臂 NanoPi NEO3 折腾小记 https://dragonfly.fun/archives/armbian.html https://dragonfly.fun/archives/armbian.html Fri, 21 Aug 2020 00:56:00 +0800 蜻蜓特派员 最近一时兴起想玩玩树莓派那种卡片电脑,国内厂商里面做的比较好要数 FriendlyARM (友善之臂) 了。
最终入了 NanoPi NEO3 这块板子

1.安装系统固件

官方提供的 FriendlyCore 预装了一堆诸如 samba、ftp 的服务。
但是官方并没有提供内核头文件,内核版本也比较老不适合折腾, 因此转而使用 Armbian 提供的固件

下载 https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/nanopineo3/archive 解压得到 img 文件后使用 USBImager 写入到 TF 卡中

USBImage.png

2.网络配置

插上网线和电源,微型电脑就启动了。如何确定 NanoPi 的 IP 呢,方法如下任选其一

  • 登录路由器控制台查看
  • 运行 nmap -n --open -p 22 192.168.1.0/24 扫描 ssh 端口

armbian.png

# 关闭密码登录
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 清空 root 用户密码
passwd -d root

3.本地化设置

  • 替换为国内镜像源
sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn\/debian-security/g' /etc/apt/sources.list
sed -i 's/apt.armbian.com/mirrors.tuna.tsinghua.edu.cn\/armbian/g' /etc/apt/sources.list.d/armbian.list
dpkg --remove-architecture armhf
apt update && apt upgrade -y
  • 修改中文 运行 dpkg-reconfigure locales 后选择 zh_CN.UTF-8
  • 修改时区 运行 dpkg-reconfigure tzdata 选择 Asia/Chongqing
  • 如果遇到 apt update 失败,可能需要同步时间
ntpdate cn.ntp.org.cn

3.驱动 USB 无线网卡

某些 WIFI 虽然官方称之为“免驱版”,但实际上是网卡内置了驱动,Windows下如果没有驱动就会被识别为存储设备用于驱动安装,这是需要安装 usb-modeswitch 切换模式

sudo apt install -y usb-modeswitch

翻出了之前买的 翼联WIFI, 安装 usb-modeswitch 后运行 lsusb 查看,设备 ID 已变为

Bus 004 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter

虽然模式切换已经成功,但是网卡仍未被驱动。
后来从 Arch 社区 找到解决方案如下

  • 安装内核头文件
apt install -y linux-headers-current-rockchip64
  • 给驱动源码打补丁
curl -o- http://mirrors.163.com/kernel/v5.x/linux-$(uname -r | cut -f1 -d-).tar.xz | tar Jxf -
cd linux-$(uname -r | cut -f1 -d-)/drivers/net/wireless/mediatek/mt7601u
curl -o- https://launchpadlibrarian.net/419756943/mcu.patch | patch -p0
make -C /lib/modules/$(uname -r)/build/ M=$(pwd) modules

这时编译可能遇到 __stack_chk_guard undefined 错误,这时候在 mcu.c 的适当位置添加如下代码

unsigned long __stack_chk_guard;
void __stack_chk_guard_setup(void)
{
     __stack_chk_guard = 0xBAAAAAAD;  //provide some magic numbers
}
void __stack_chk_fail(void)                         
{                               
}
  • 复制驱动到内核
install -p -m 644 mt7601u.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u
echo > /etc/modprobe.d/mt7601u.conf options mt7601u vnd_reset=0
/sbin/depmod -a $(uname -r)

重启后 WIFI 就能正常驱动了

sudo vnstat -i wlxe84e0685ff49 --create
  1. 安装其他组件
sudo curl -Lo /etc/apt/trusted.gpg.d/docker-ce.asc https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg
echo "deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker-ce.list
apt update && apt install -y docker-ce
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8C718D3B5072E1F5
echo "deb http://mirrors.tuna.tsinghua.edu.cn/mysql/apt/debian $(lsb_release -cs) mysql-5.7" | sudo tee /etc/apt/sources.list.d/mysql.list 
wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list'
]]>
4 https://dragonfly.fun/archives/armbian.html#comments https://dragonfly.fun/feed/category/code/archives/armbian.html
玩转 WSL 在 Win10 上打造 Ubuntu 开发环境 https://dragonfly.fun/archives/wsl.html https://dragonfly.fun/archives/wsl.html Sun, 24 Nov 2019 17:11:00 +0800 蜻蜓特派员 WSL 是 Windows Subsystem for Linux 的简称, 可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生虚拟机开销。

安装 WSL

1.开启 WSL

首先需要使用管理员权限打开 PowerShell 执行如下命令
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
或者在程序和功能选打开 适用于 Linux 的 Windows 子系统
出现提示时,重启计算机。

2.下载 Linux 发行版

直接参考 WSL安装指南 使用 Microsoft Store 安装的方法无法将 Linux 安装到系统盘之外的分区,这里使用的是 手动下载 的方法。

单击以下链接下载您喜欢的 Linux 的发行版,这里选的是 Ubuntu 20.04

3.安装 Linux 发行版

使用 7-ZIP 或者其他工具解压下载的 appx 文件 ( 比如解压到 D:\WSL\Ubuntu ) 然后运行 ubuntu2004.exe
需要等待一两分钟时间来完成安装,安装完成后,系统会提示创建新的用户帐户(及其密码)。

如果需要使用 root 默认登录可以运行 ubuntu2004.exe config --default-user root

4.配置 Linux 环境

首先需要进行一些本地化操作

# 修改为国内软件源
sudo sed -Ei 's/\w+.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
apt-get update
# 设置系统语言为中文
apt install -y language-pack-zh-hans
update-locale LANG=zh_CN.UTF-8

5.服务自启动配置

由于 WSL 并没有 Linux 内核的支持,仅在用户层实现了系统调用的翻译。因此诸如 systemd、cgroup 是无法工作的。
只能使用 start-stop-daemon 或其他进程守护工具实现服务管理

  • 编辑 vim /etc/init.wsl 文件添加如下内容
#! /bin/sh
# Filename: /etc/init.wsl
service nginx start
  • 开始 -> 运行 中输入 regedit 回车打开注册表编辑器

定位到 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 后新建一个 REG_SZ 类型的值,名称随意,数值数据填写以下内容

mshta vbscript:CreateObject("WScript.Shell").Run("wsl -d Ubuntu-20.04 -u root bash /etc/init.wsl",0,TRUE)(window.close)

以后就可以向 /etc/init.wsl 追加服务,实现开启自启动了

配置开发环境

Linux 环境搞好,下面就开始根据自己需要配置相应的开发环境

1.PHP Nignx MySQL 环境搭建

得益于 Wordpress 等平台的流行,PHP 仍是目前使用广泛 Web 开发语言,LNMP 环境

sudo apt-get install -y nginx php-fpm php-mysql php-curl mysql-server
# 开放端口
sudo sed -i 's/bind-address/#bind-address/' /etc/mysql/mysql.conf.d/mysqld.cnf
# 启动 MySQL
service mysql start
# 启动 fpm
service php-fpm start
# 启动 nginx
service nginx start
  • 解决 nginx 超时的问题

/etc/nginx/nginx.conf 中的 http block 中加入

fastcgi_buffering off;

配置添加如下内容

server {
    listen       80;
    server_name  domain.com;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # 设置监听端口
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

    # 用于伪静态
    if (!-e $request_filename) {
        rewrite ^/(.*) /index.php?r=$1 last;
    }
}
  • 配置 MySQL 密码

运行 sudo mysql -u root 进入命令行模式

-- 重设密码
UPDATE mysql.user SET host = '%', authentication_string = PASSWORD('123456') WHERE user = 'root';
FLUSH privileges;
-- 用户创建与授权
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
CREATE DATABASE `database` CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';

Composer 是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。

# 安装 Composer
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
sudo php composer-setup.php --install-dir=/usr/bin --filename=composer
php -r "unlink('composer-setup.php');"
# 配置 国内镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
  • PHP 扩展安装

除了 apt 中自带的 PHP 扩展,很多扩展需要通过 pecl 命令安装。
这里通过配置 php_ini 实现 php.ini 的自动配置

sudo apt install -y php-pear php-dev
sudo touch /etc/php/7.4/mods-available/pear.ini
sudo ln -s /etc/php/7.4/mods-available/pear.ini /etc/php/7.4/fpm/conf.d/20-pear.ini 
sudo ln -s /etc/php/7.4/mods-available/pear.ini /etc/php/7.4/cli/conf.d/20-pear.ini
sudo pear config-set php_ini /etc/php/7.4/mods-available/pear.ini
pecl install yaf

2.配置 Golang + PostgreSQL 环境

# 安装必要依赖
sudo apt-get install -y git cmake
# 下载并解压
curl -o- https://golang.google.cn/dl/go1.21.5.linux-amd64.tar.gz | sudo tar zxf - -C /usr/local
sudo ln -s /usr/local/go/bin/go /usr/bin/go
# 配置环境变量
go env -w GOPROXY=goproxy.cn
# git 配置
git config --global core.editor nano
  • 安装 postgres 数据库
apt-get install -y postgresql
# 数据库初始化 
pg_dropcluster 12 main --stop
TZ=UTC pg_createcluster 12 main --start -d /opt/pgsql
# 服务启动
service postgresql start
# 修改数据库密码
su postgres -c psql
postgres=# \password
  • 数据库备份还原
export PGPASSWORD=123456
# 导出
su postgres -c 'pg_dumpall -O -x -c --inserts --if-exists --quote-all-identifiers -f /tmp/db.sql'
# 导入
psql -h 127.0.0.1 -U postgres -f db.sql
  • 安装 consul 服务
sudo apt install lsb-release
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
echo "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update && sudo apt-get install consul


编辑服务脚本 /etc/init.d/consul

#!/bin/sh

# Quick start-stop-daemon example, derived from Debian /etc/init.d/ssh
set -e

# Must be a valid filename
NAME=consul
PIDFILE=/var/run/$NAME.pid
#This is the command to be run, give the full pathname
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="agent -server -bootstrap-expect=1 -bind=127.0.0.1 -data-dir=/var/lib/$NAME -ui -log-file=/var/log/$NAME"

case "$1" in
  start)
        echo -n "Starting daemon: "$NAME
    start-stop-daemon --start --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
        echo "."
    ;;
  stop)
        echo -n "Stopping daemon: "$NAME
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
        echo "."
    ;;
  restart)
        echo -n "Restarting daemon: "$NAME
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
    start-stop-daemon --start --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
    echo "."
    ;;

  *)
    echo "Usage: "$1" {start|stop|restart}"
    exit 1
esac

exit 0

3.安装 nodejs 环境

# 安装 Node Version Manager
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 安装 v10 的 Node
source ~/.bashrc
nvm install 10
# 解决 npm install 失败的问题
npm config set unsafe-perm=true
# 设置国内镜像
npm config set registry https://registry.npm.taobao.org

4. Python 环境

sudo apt install -y python3-distutils
curl -sSL https://bootstrap.pypa.io/get-pip.py | sudo python3
pip config --global set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

卸载 WSL

cmd 下输入 wslconfig /l,可以看到所有已安装的发行版

rem 卸载删除wsl
wslconfig /u <DistributionName>
]]>
0 https://dragonfly.fun/archives/wsl.html#comments https://dragonfly.fun/feed/category/code/archives/wsl.html
VSCode 开发环境搭建 https://dragonfly.fun/archives/vscode.html https://dragonfly.fun/archives/vscode.html Sat, 16 Mar 2019 14:00:00 +0800 蜻蜓特派员 Visual Studio Code 是微软出品的一款免费代码编辑器,得益于器强大的代码补全功能和众多的插件支持,完全可以把VSCode当一款多语言IDE使用

安装篇

1.下载 VSCode 并安装
https://code.visualstudio.com/Download

2.配置 VScode 语言包
在 VSCode 中安装 中文语言包, 安装结束后确认切换到该语言

如需更改默认显示语言,先按下Ctrl+Shift+P调出命令面板,输入display后选择Configure Display Language命令打开locale.json 语言配置。按下自动提示快捷键Ctrl+Space选择支持的语言

MinGW篇

1.下载 MinGW 并解压到 系统盘
这里本人选择的是 MinGW-W64 GCC-8.1.0 版本,然后将 MinGW64 下 bin 目录添加到环境变量

2.在 VSCode 中安装 ms-vscode.cpptools 插件

WSL篇 (Windows Subsystem for Linux)

1.使用管理员权限打开 PowerShell 执行如下命令

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

或者在程序和功能选中 WSL

2.VSCode 中安装 Remote WSL 扩展

相关文档 https://code.visualstudio.com/docs/remote/wsl

Golang 篇

配置环境变量

STATICCHECK_CACHE D:\Documents\Go\pkg\static

]]>
0 https://dragonfly.fun/archives/vscode.html#comments https://dragonfly.fun/feed/category/code/archives/vscode.html