跳到主要内容

Python 根据 Markdown 目录创建文件文件夹

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

将脚本保存为 create_dirs_from_md.py

将您的目录结构粘贴到 md_structure 变量中。

在终端运行脚本:python3 create_dirs_from_md.py

17adf28490d266622875f6dd7c4cbabe

创建成功

import os
import re

md_structure = '''
- cmd/
- main.go
- internal/
- domain/
- model/
- order.go
- repository/
- order_repository.go
- application/
- service/
- order_service.go
- infrastructure/
- repository/
- order_repository_impl.go
- db/
- database.go
- interfaces/
- handler/
- order_handler.go
- di/
- wire.go
- wire_gen.go
'''

def parse_md_structure(md_text):
lines = md_text.strip().split('\n')
stack = []
paths = []
for line in lines:
# 计算缩进级别
indent = len(line) - len(line.lstrip(' '))
level = indent // 2 # 每两个空格一个级别

# 提取名称,去除前面的符号和空格
name = line.strip().lstrip('-').strip()

# 更新堆栈
while len(stack) > level:
stack.pop()
stack.append(name)

# 构建路径
path = os.path.join(*stack)
paths.append(path)

return paths

def create_dirs_and_files(paths):
for path in paths:
if path.endswith('/'):
# 是目录
dir_path = path.rstrip('/')
os.makedirs(dir_path, exist_ok=True)
print(f"Created directory: {dir_path}")
elif '.' in os.path.basename(path):
# 是文件
dir_name = os.path.dirname(path)
if dir_name and not os.path.exists(dir_name):
os.makedirs(dir_name, exist_ok=True)
print(f"Created directory: {dir_name}")
with open(path, 'w') as f:
pass
print(f"Created file: {path}")
else:
# 是目录(没有斜杠,但也不是文件)
os.makedirs(path, exist_ok=True)
print(f"Created directory: {path}")

if __name__ == "__main__":
paths = parse_md_structure(md_structure)
create_dirs_and_files(paths)

Linux 系统中 所有权Ownership和操作权Permissions

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

所有权(Ownership)

文件和目录的所有权包括两个主要属性:用户所有者(User Owner)和组所有者(Group Owner)。

用户所有者:指对文件或目录具有特定权限的用户。通常,用户所有者可以修改文件内容、改变文件权限等。

组所有者:指被分配给文件或目录的用户组。组内的所有成员可以根据组权限对文件或目录进行操作。

更改所有权通常通过 chown 命令完成,这对于系统安全管理、文件共享和用户数据隔离至关重要。

权限(Permissions)

权限决定了用户对文件或目录可以执行的操作,分为所有者权限、组权限和其他用户(Others)权限

所有者权限:定义文件或目录的所有者可以执行的操作。

组权限:定义同一用户组内的用户可以执行的操作。

其他用户权限:定义不属于文件所属组的其他用户可以执行的操作。

权限设置通常通过 chmod 命令进行控制,包括读取(r)、写入(w)和执行(x)权限。这些权限对于保护敏感数据、维护系统安全和控制程序执行至关重要。

为什么需要区分所有权和权限?

从设计角度来看,区分所有权和权限是为了实现灵活且精细的访问控制

责任分离:所有权确定了谁对文件或目录负责,而权限则定义了不同用户可以对其执行的操作。这种分离使系统能够明确归属,同时独立地管理访问控制。

精细的访问控制:通过区分所有权和权限,系统可以为所有者、所属组和其他用户分别设置不同的权限。这种设计允许文件所有者限制自己的权限,或者授予其他用户特定的访问权,实现更精细的控制。

灵活性:这种区分使得权限设置更加灵活,适应各种使用场景。例如,某个文件可以由用户 A 拥有,但权限设置允许用户 B 读取或修改,而无需更改所有权。

安全性增强:系统管理员可以独立于所有权来调整权限,以强化安全策略。例如,即使用户是某个文件的所有者,管理员也可以限制其权限,防止潜在的误用或恶意操作。

资源管理:在多用户环境中,区分所有权和权限有助于更有效地管理系统资源。用户可以共享文件而不失去对其的控制权,促进协作的同时保障数据安全。

历史设计选择:Unix 系统最初设计时,就采用了这种所有权和权限分离的模型。它提供了一个简单 yet 强大的机制,避免了复杂的访问控制列表(ACL),满足了当时对效率和性能的需求。

Go 使用 ORM 插入一个 NULL 值

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

使用 sql.NullXXX 这一家族类

定义了一个User结构体,其中手机号和邮箱字段被定义为sql.NullString。这允许它们接收来自数据库的 NULL 值,Valid字段用于检查值是否为 NULL,如果不为 NULL,可以安全地访问String字段。

package main

import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)

type User struct {
ID int
PhoneNumber sql.NullString // 使用 sql.NullString 来处理可能为 NULL 的手机号
Email sql.NullString // 使用 sql.NullString 来处理可能为 NULL 的邮箱
}

func main() {
// 假设这是数据库连接字符串
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
panic(err)
}
defer db.Close()

// 查询数据库
rows, err := db.Query("SELECT id, phone_number, email FROM users")
if err != nil {
panic(err)
}
defer rows.Close()

for rows.Next() {
var user User
// 使用 Scan 时,确保对应的字段可以接收 sql.NullString
if err := rows.Scan(&user.ID, &user.PhoneNumber, &user.Email); err != nil {
panic(err)
}

// 打印结果,如果字段为NULL,则显示为 "NULL"
fmt.Printf("ID: %d, Phone: %s, Email: %s\n",
user.ID,
if user.PhoneNumber.Valid { user.PhoneNumber.String } else { "NULL" },
if user.Email.Valid { user.Email.String } else { "NULL" },
)
}
}

使用指针

你在 Go 中使用指针来处理可能为 NULL 的数据库字段时,每次访问这些字段的值时确实需要解引用。

package main

import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

type User struct {
ID uint
PhoneNumber *string // 使用指针允许手机号为 NULL
Email *string // 使用指针允许邮箱为 NULL
}

func main() {
// 假设这是连接数据库的DSN(数据源名)
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// 查询所有用户
var users []User
result := db.Find(&users)
if result.Error != nil {
panic(result.Error)
}

// 打印用户信息
for _, user := range users {
fmt.Printf("ID: %d, Phone: %v, Email: %v\n", user.ID, user.PhoneNumber, user.Email)
}
}

Docker DanglingUnused Images

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

Dangling Images(悬空镜像)

定义这些镜像在本地存在,但是在 Docker 仓库中已经不存在对应的标签了。通常是因为镜像的标签被更新或删除导致的。

特点它们没有标签,只有镜像 ID。

产生原因

  • 构建一个新版本的镜像,自动取消旧版本镜像的标签。
  • 手动删除一个镜像的标签。
  • 使用docker pull拉取一个已有标签的新版本镜像,旧版本镜像标签被取消。

识别方法使用命令docker images -f dangling=true列出所有悬空镜像。

Unused Images(未使用镜像)

定义这些镜像不是任何容器的基础镜像,也不是任何镜像的父镜像。

特点它们可能有标签,但是已经不被需要了。

产生原因

  • 某个容器或者镜像被删除,依赖于它的镜像层也随之变为未使用。
  • 手动删除一个容器或镜像。

识别方法使用命令docker images -f dangling=false并手动识别那些未被使用的镜像。Docker 目前没有提供自动识别 Unused Images 的命令。

清理 Dangling Images

使用命令docker rmi $(docker images -f dangling=true -q)删除所有悬空镜像。

使用 Docker 1.13 版本提供的docker system prune命令自动清理悬空镜像。

清理 Unused Images

手动识别并删除那些已知不再需要的镜像,使用docker rmi <image_id>命令。

谨慎使用docker system prune -a命令自动删除所有未使用镜像,此操作不可恢复。

清理时的注意事项

清理前确保不需要这些镜像,清理操作不可恢复。

如果一个悬空镜像同时也是一个未使用镜像,使用docker image prune或者docker system prune命令就足够了。

定期清理不需要的镜像,以节省磁盘空间。但不要过于频繁。

KubernetesK8s集群 Docker 作为容器运行时

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

准备代理

export HTTPS_PROXY="http://172.22.220.64:7890"

版本问题

三台 Ubuntu 22.04.4 LTS x86_64 机器上搭建 Kubernetes 集群。使用的 Docker 版本至少是 19.03,因为这个版本支持 Kubernetes 所需的特性和配置。确保 Docker 的 cgroup 驱动设置为systemd,以与 kubelet 保持一致,避免资源管理上的潜在冲突。

环境准备

设置主机名

每台机器上设置适当的主机名并更新 /etc/hosts 文件以便节点间能够相互解析。

在每台机器上执行以下命令

# 在 k8s-master 上
sudo hostnamectl set-hostname k8s-master
echo "172.22.220.64 k8s-master" | sudo tee -a /etc/hosts

# 在 k8s-worker1 上
sudo hostnamectl set-hostname k8s-worker1
echo "192.168.33.110 k8s-worker1" | sudo tee -a /etc/hosts

# 在 k8s-worker2 上
sudo hostnamectl set-hostname k8s-worker2
echo "192.168.33.111 k8s-worker2" | sudo tee -a /etc/hosts

禁用 Swap

Kubernetes 要求禁用 swap。在每台机器上执行

sudo swapoff -a
# 永久禁用,注释掉 /etc/fstab 中相关的 swap 行
sudo sed -i '/ swap / s/^/#/' /etc/fstab

加载必要的内核模块

在每台机器上执行

sudo modprobe overlay
sudo modprobe br_netfilter

设置系统参数

在每台机器上添加 Kubernetes 推荐的 sysctl 参数

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

安装 Docker、kubeadm、kubelet 和 kubectl

安装 Docker

如果已经安装了 Docker,确认一下 Docker 是否正在运行

sudo systemctl status docker

没有安装,先安装一下

apt install docker.io

添加 Kubernetes 仓库

在每台机器上执行

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

安装 kubeadm, kubelet 和 kubectl

kubelet运行在所有集群节点上的代理,负责启动和管理容器应用。

kubeadm工具,用于快速设置和管理 Kubernetes 集群的基础架构。

kubectl命令行工具,用于与 Kubernetes 集群交互和管理资源。

sudo apt-get update
sudo apt-get install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
sudo apt-mark hold kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6

# 如果你已经安装,可以先删除再安装指定版本
sudo apt-get remove -y kubelet kubeadm kubectl

hold 是设置保留状态,不会自动更新

配置 docker

nano /etc/docker/daemon.json
{
"experimental": true,
"features": {
"buildkit": true
},
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}

重启

sudo systemctl restart docker

配置 kubelet

nano /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
nano /var/lib/kubelet/config.yaml
sudo chown rootroot /var/lib/kubelet/config.yaml
sudo chmod 644 /var/lib/kubelet/config.yaml

重启

sudo systemctl daemon-reload
sudo systemctl restart kubelet

初始化 Kubernetes 主节点

查看要下载的内容

kubeadm config images list

使用阿里云 Kubernetes 镜像的镜像加速服务

**10.244.0.0/16**这个是 Flannel 默认的 Pod 网络地址范围。如果你使用 Flannel 作为网络插件,通常使用这个 CIDR。

**192.168.0.0/16**这是 Calico 的默认地址范围。如果你使用 Calico,通常会指定这个范围,不过你也可以自定义。

kubeadm init --pod-network-cidr=192.168.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=v1.23.0

不使用阿里云,直接在 k8s-master 上执行,初始化,这里的 -E 选项告诉 sudo 保留用户的环境变量,这样 kubeadm 就可以使用前面设置的代理环境变量。

sudo -E kubeadm init --pod-network-cidr=10.244.0.0/16

记录下输出中的 kubeadm join 命令,这是后面工作节点需要使用的命令。

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u)$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at
https//kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root

kubeadm init phase certs apiserver --apiserver-cert-extra-sans=172.22.220.64,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local

配置 kubectl

在 k8s-master 上,配置用户的 kubeconfig 文件以使用 kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u)$(id -g) $HOME/.kube/config

如果证书有问题,重新生成证书

手动删除现有的 apiserver 证书文件

rm /etc/kubernetes/pki/apiserver.*

再次运行证书生成命令

kubeadm init phase certs apiserver --apiserver-cert-extra-sans=172.22.220.64,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local

再次重启 apiserver 容器

docker ps | grep kube-apiserver | grep -v pause
docker kill <container-id>

再次检查新生成的证书

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout

如果新证书的内容(尤其是序列号)与旧证书不同,就说明证书已经更新成功。

安装 Pod 网络插件

可以选择一个网络插件,例如 Calico,并在 k8s-master 上执行

kubectl apply -f https//docs.projectcalico.org/manifests/calico.yaml
kubectl get nodes

加入工作节点

在 k8s-worker1 和 k8s-worker2 上,使用之前记录的 kubeadm join 命令来加入集群

kubeadm join 172.22.220.646443 --token 6bqr0n.5dlu623stgokbvdd \
--discovery-token-ca-cert-hash sha256851c48c250ee78aa569a77c935f14ee6edcebc6b004655e52ac775bcc89cf013

验证集群状态

在 k8s-master 上,检查节点和 Pod 的状态

kubectl get nodes
kubectl get pods --all-namespaces

监控节点变化

kubectl get nodes -w

安装并配置 Helm

在你的本地机器或管理机上安装 Helm。这通常涉及到下载 Helm 的二进制文件并将其配置到适当的路径。你还需要初始化 Helm 的服务端组件 Tiller(注意从 Helm v3 开始,已经移除了 Tiller)。

对于 Helm 3,直接初始化即可

helm repo add stable https//charts.helm.sh/stable
helm repo update

验证 Helm 是否正确安装并配置,可以尝试安装一个简单的 Helm chart 来测试

helm install stable/mysql --generate-name

如果这个命令成功执行,并且能够看到 Pod 正在运行状态,则说明 Helm 已准备好用于部署应用。

卸载 K8S 所有组件

kubeadm reset -f
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
rm -rf /etc/kubernetes/
rm -rf /var/lib/docker/
apt-get remove docker docker-engine docker.io containerd runc

Windows 上为 WSL2 设置端口转发实现局域网访问

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

查看 WSL 的 IP

 ✘⚡ root@DESKTOP-AETE0Q9  /home/cc  hostname -I
172.19.221.125 172.20.0.1 172.17.0.1

172.19.221.125 就是 WSL 的 IP,一会转发到这个 IP

在 windows 上进行端口转发

netsh interface portproxy add v4tov4 listenport=5244 listenaddress=0.0.0.0 connectport=5244 connectaddress=172.19.221.125 protocol=tcp

ec7fc11bc87e2828fb7ff8ab4bd099cd### 参数说明

add v4tov4: 指示 netsh 添加一个 IPv4 到 IPv4 的端口转发规则。

listenport=5244: 设置侦听端口,即外部设备将连接到这个端口。在这个例子中,Windows 机器将监听在端口 5244 上的所有入站连接。

listenaddress=0.0.0.0: 设置侦听地址。特殊的 IP 地址 0.0.0.0 表示接收通过任何网络接口到达该端口的数据,这使得从任何网络接入都被接受。

connectport=5244: 设置连接端口,即当数据到达侦听端口时,数据将被转发到此端口。在此例中,转发的目标端口同样是 5244。

connectaddress=172.19.221.125: 设置连接地址,即数据将被转发到这个 IP 地址。这通常是内部网络中的一个设备(如 WSL2 实例)的地址。

protocol=tcp: 指定使用 TCP 协议进行端口转发。这意味着规则适用于 TCP 连接,这是大多数网络应用程序(如 HTTP 服务器、数据库等)的常用协议。

windows 上添加入站规则

0ceb5e05e32ffae497a8a2c71fcc53e7## 在 windows 上进行测试
0c145f89f470e88ed679e632d09dc32d

可以访问了,局域网也没问题

Linux 配置系统代理临时代理

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

查看代理

echo $http_proxy
echo $https_proxy
echo $ftp_proxy
echo $no_proxy

临时配置代理

在当前终端会话中设置代理,这种设置只会在当前终端窗口有效,关闭窗口后设置会失效

export HTTP_PROXY="http://172.22.220.64:7890"
export HTTPS_PROXY="http://172.22.220.64:7890"

这样设置后,仅当前终端会话中的命令会使用这些代理设置。如果你想在当前会话中取消代理,可以使用 unset 命令

unset HTTP_PROXY
unset HTTPS_PROXY

持久配置代理

要让代理设置在所有会话和重启后依然有效,你可以将这些环境变量添加到你的用户配置文件中,例如 .bashrc.bash_profile 文件中

打开你的用户主目录下的 .bashrc.bash_profile 文件

nano ~/.bashrc

在文件的末尾添加以下内容

export HTTP_PROXY="http://172.22.220.64:7890"
export HTTPS_PROXY="http://172.22.220.64:7890"

保存并关闭文件。使更改生效

source ~/.bashrc

这样,每次用户登录时,系统都会自动加载这些设置,从而为所有终端会话启用代理。

配置不使用代理的地址

在设置了全局代理的情况下,可能需要某些地址不通过代理访问,比如本地地址或特定的内部网站。可以使用 no_proxy 环境变量来实现

export NO_PROXY="localhost,127.0.0.1,.localdomain.com"

添加到 .bashrc.bash_profile 中,同时加入上述的代理设置中

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,.localdomain.com"

配置系统级别的环境变量

在 Linux 系统中,你可以通过修改 /etc/environment 文件来设置系统级别的代理环境变量,这样不需要对每个用户的 .bashrc 进行单独配置。

编辑 /etc/environment 文件

使用你喜欢的文本编辑器以超级用户权限打开 /etc/environment 文件。

sudo nano /etc/environment

添加代理设置

/etc/environment 文件中添加你的代理配置。这个文件中的每个条目都应该是简单的 KEY="value" 格式。添加 HTTP 和 HTTPS 代理配置如下

HTTP_PROXY="http://172.22.220.64:7890"
HTTPS_PROXY="http://172.22.220.64:7890"
NO_PROXY="localhost,127.0.0.1,.localdomain.com"

保存并关闭文件

保存更改并关闭编辑器。如果你使用的是 nano,可以按 Ctrl+X 然后按 Y 确认保存,最后按 Enter 保存文件。

使更改生效

更改 /etc/environment 后,需要注销再登录或重启系统,以使设置对所有用户生效。

Ubuntu 上安装 Docker 和 Docker Compose

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

安装 Docker

apt 直接装

sudo apt install docker.io

更新您的系统 更新 Ubuntu 的包索引,确保所有系统包都是最新的。

sudo apt update
sudo apt upgrade -y

安装必要的包 安装一些必需的包,这些包允许 apt 通过 HTTPS 使用仓库

sudo apt install apt-transport-https ca-certificates curl software-properties-common

添加 Docker 的官方 GPG 密钥 确保下载的软件包是从 Docker 的官方源获取的。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置 Docker 仓库apt 源列表添加 Docker 仓库。

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

安装 Docker CE (Community Edition) 更新 apt 包索引,然后安装 Docker CE。

sudo apt update
sudo apt install docker-ce

验证 Docker 安装 检查 Docker 是否正确安装,并运行 hello-world 容器作为测试。

sudo systemctl status docker
sudo docker run hello-world

安装 Docker Compose

下载 Docker Compose 访问 Docker Compose 的 GitHub 发布页面 查找最新版本的 Docker Compose。使用 curl 下载适用于 Linux 的二进制文件。

sudo curl -L "https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

请根据需要替换 v2.11.2 为最新版本号。

添加执行权限 为下载的二进制文件添加执行权限。

sudo chmod +x /usr/local/bin/docker-compose

验证安装 检查 Docker Compose 是否已成功安装并可以运行。

docker-compose --version

配置 Docker 无需 sudo

默认情况下,运行 Docker 命令需要 sudo。如果您想让普通用户也能运行 Docker 命令而无需使用 sudo,可以将用户添加到 Docker 组

sudo usermod -aG docker ${USER}

之后,您需要注销并重新登录。

修改 Ubuntu 2204 中的 Kubernetes 包源

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

备份现有的 Kubernetes 源文件

在修改之前,首先备份你的现有 Kubernetes 源文件,以便必要时可以恢复原始设置。

sudo cp /etc/apt/sources.list.d/kubernetes.list /etc/apt/sources.list.d/kubernetes.list.backup

编辑 Kubernetes 源文件

使用文本编辑器编辑 Kubernetes 源文件。你可以使用 nano 或你喜欢的任何编辑器:

sudo nano /etc/apt/sources.list.d/kubernetes.list

替换为新的源

选择使用阿里云的 Kubernetes 镜像,你应该将文件内容更改为

deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

清华大学镜像源,将内容更改为

deb https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt/ kubernetes-xenial main

保存文件并退出编辑器。

添加镜像源的 GPG 密钥

为了确保 apt 可以信任新源的软件包,你需要添加镜像源的 GPG 密钥。

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

清华大学源:

curl -s https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

更新软件源

更新 apt 的软件包列表以反映源的变更

sudo apt update

测试新源

你可以尝试安装或更新一个 Kubernetes 包来确认新的源是否工作正常

sudo apt install kubectl

或者如果已经安装了,尝试更新看是否有新版本

sudo apt update && sudo apt upgrade

设置 SSH 密钥进行身份验证

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

生成 SSH 密钥

打开终端。输入以下命令来生成一个新的 SSH 密钥对(如果你还没有的话

ssh-keygen -t rsa -b 4096

按照提示进行操作,可以为密钥设置一个密码,也可以留空。

将公钥复制到服务器

使用 ssh-copy-id 命令将你的公钥复制到服务器上,以便你可以无密码登录

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 50022 itadmin@192.168.33.111
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 50022 itadmin@192.168.33.110

替换 -i 后面的路径如果你的密钥保存在不同的位置。

连接服务器

nano ~/.ssh/config

Host 111
HostName 192.168.33.111
User itadmin
Port 50022
Host 110
HostName 192.168.33.110
User itadmin
Port 50022

一旦你的公钥被添加到服务器的 ~/.ssh/authorized_keys 文件中,你就可以不需要密码直接连接了

ssh 111
ssh 110

这种方法不仅安全,还方便,因为一旦设置完成,你就可以无需输入密码快速连接到服务器。