diff --git a/CICD/Ansible/.gitignore b/CICD/Ansible/.gitignore new file mode 100644 index 0000000..d4777d2 --- /dev/null +++ b/CICD/Ansible/.gitignore @@ -0,0 +1,28 @@ +# ---> macOS +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + diff --git a/CICD/Ansible/Dockerfile b/CICD/Ansible/Dockerfile new file mode 100644 index 0000000..fda3694 --- /dev/null +++ b/CICD/Ansible/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:22.04 + +VOLUME /root/.ssh + +RUN export DEBIAN_FRONTEND=noninteractive \ + && apt update && apt install ansible sshpass -y \ + && rm -rf /etc/localtime \ + && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && mkdir -p /etc/ansible + +VOLUME /etc/ansible + +WORKDIR /etc/ansible \ No newline at end of file diff --git a/CICD/Ansible/Docs/Ansible-Hosts文件配置.md b/CICD/Ansible/Docs/Ansible-Hosts文件配置.md new file mode 100644 index 0000000..18d7580 --- /dev/null +++ b/CICD/Ansible/Docs/Ansible-Hosts文件配置.md @@ -0,0 +1,88 @@ +> 本文作者:丁辉 + +# Ansible-Hosts文件配置 + +**编写 `/etc/ansible/hosts` 文件** + +- 普通写法 + + ```bash + [group1] # 主机组 + + 192.168.1.10 + 192.168.1.20 + + [group2] # 主机组 + + 192.168.1.30 + 192.168.1.40 + ``` + +- 为主机配置变量参数 + + ```bash + [group1] # 主机组 + + 192.168.1.10 ansible_ssh_port="22" ansible_ssh_user="root" ansible_ssh_pass="" + 192.168.1.20 ansible_ssh_port="22" ansible_ssh_user="root" ansible_ssh_pass="" + + [group2] # 主机组 + + 192.168.1.30 ansible_ssh_port="22" ansible_ssh_user="root" ansible_ssh_pass="" + 192.168.1.40 ansible_ssh_port="22" ansible_ssh_user="root" ansible_ssh_pass="" + ``` + +- 为主机组配置变量参数 + + ```bash + [group1] # 主机组 + + 192.168.1.10 + 192.168.1.20 + + [group2] # 主机组 + + 192.168.1.30 + 192.168.1.40 + + [group1:vars] + + ansible_ssh_port="22" # 填写服务器端口 + + ansible_ssh_user="root" # 填写服务器用户 + + ansible_ssh_pass="" # 填写服务器密码 + + [group2:vars] + + ansible_ssh_port="22" # 填写服务器端口 + + ansible_ssh_user="root" # 填写服务器用户 + + ansible_ssh_pass="" # 填写服务器密码 + ``` + +- 为所有主机组配置变量参数 + + ```bash + [group1] # 主机组 + + 192.168.1.10 + 192.168.1.20 + + [group2] # 主机组 + + 192.168.1.30 + 192.168.1.40 + + [all:vars] # 指定所有主机组 + + ansible_ssh_port="22" # 填写服务器端口 + + ansible_ssh_user="root" # 填写服务器用户 + + ansible_ssh_pass="" # 填写服务器密码 + ``` + + + diff --git a/CICD/Ansible/Docs/Ansible加密.md b/CICD/Ansible/Docs/Ansible加密.md new file mode 100644 index 0000000..c2c2d2c --- /dev/null +++ b/CICD/Ansible/Docs/Ansible加密.md @@ -0,0 +1,164 @@ +> 本文作者:丁辉 + +# Ansible 加密 + +- 创建加密文件 + + ```bash + ansible-vault create password.yml + ``` + + > 示例 + > + > ```bash + > [root@offends]# ansible-vault create password.yml + > New Vault password: # 输入加密密码 + > Confirm New Vault password: # 二次输入加密密码 + > ``` + +- 指定文件加密 + + ```bash + ansible-vault encrypt /etc/ansible/hosts + ``` + +- 加密字符串 + + ```bash + ansible-vault encrypt_string 123456 + ``` + +- 编辑加密文件 + + ```bash + ansible-vault edit password.yml + ``` + +- 重新加密文件 + + ```bash + ansible-vault rekey password.yml + ``` + +- 文件解密 + + ```bash + ansible-vault decrypt password.yml + ``` + +- 查看加密数据文件原文 + + ```bash + ansible-vault view password.yml + ``` + +# 剧本的使用 + +- 编写一份 `demo.yml` 剧本文件 + + ```bash + vi demo.yml + ``` + + ```yml + --- + - hosts: node1 + # 定义变量 + vars: + - user_password: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 36616162626462323130626563393433663637383166613262333433313534386561666531633837 + 3663636662663363303463313662333064326537343563340a653566346636333633383163623662 + 37386432626437636464386339316366346665383935336564623630333238353661666566343036 + 3338613861393061320a626464306230626265656163613730303035613161616235373539613333 + 6164 + + tasks: + - name: display variable from encryption variable + ansible.builtin.debug: + msg: The user password is {{ user_password }} + ``` + +- 通过询问口令执行剧本 + + ```bash + ansible-playbook demo.yml -v --ask-vault-pass + ``` + +- 从密码文件中读取口令执行剧本 + + ```bash + echo '密钥密码' > .pwdfile && chmod 600 .pwdfile + ``` + + ```bash + ansible-playbook demo.yml -v --vault-id .pwdfile + ``` + +# 加密用户密码 + +- 创建变量文件 + + ```bash + mkdir vars -p + vi vars/user_list.yml + ``` + + ```yml + user_hosts: + - all + user_info: + - user: demo + # 密码需要用引号括起来,避免纯数字密码被解析成int类型数字 + password: "123456" + # 备注信息可以使用中文,但尽量不用中文 + comment: "hello" + ``` + +- 创建剧本文件 + + ```bash + vi user.yml + ``` + + ```yml + - hosts: "{{ user_hosts }}" + vars_files: + - demo.yml + tasks: + - name: display variable from variable list + ansible.builtin.debug: + msg: | + The username is "{{ item.user }}", + the password is "{{ item.password }}", + the comment is "{{ item.comment }}". + loop: "{{ user_info }}" + - name: create users + ansible.builtin.user: + name: "{{ item.user }}" + password: "{{ item.password|password_hash('sha512') }}" + comment: "{{ item.comment }}" + state: present + loop: "{{ user_info }}" + become: yes + ``` + +- 加密变量文件 + + ```bash + ansible-vault encrypt vars/user_list.yml + ``` + +- 执行剧本 + + ```bash + ansible-playbook user.yml -v --ask-vault-pass + ``` + +- 查看是否创建用户 + + ```bash + tail -n 1 /etc/passwd + ``` + + diff --git a/CICD/Ansible/Docs/Ansible模块参数解释以及常用命令.md b/CICD/Ansible/Docs/Ansible模块参数解释以及常用命令.md new file mode 100644 index 0000000..fe8516b --- /dev/null +++ b/CICD/Ansible/Docs/Ansible模块参数解释以及常用命令.md @@ -0,0 +1,396 @@ +> 本文作者:丁辉 + +# Ansible模块参数解释以及常用命令 + +> 太多了,只记少数吧,累~ + +## Ansible 基础命令 + +- 查看 Ansible 的可用模块 + + ```bash + ansible-doc -l + ``` + +- 测试主机的连通性 + + ```bash + ansible all -m ping + ``` + +- 查看组下所有的IP + + ```bash + ansible all --list + ``` + +> 使用 -i 指定 hosts 文件位置 +> +> ```bash +> -i /etc/ansible/hosts +> ``` + +## Ansible-Playbook 命令 + +- 执行 Playbook + + ```bash + ansible-playbook demo.yml + ``` + +- 指定任务执行 Playbook + + ```bash + ansible-playbook demo.yml --start-at-task="指定任务" + ``` + +## Ansible 常用模块 Command + +**常用参数** + +| 参数 | 解释 | +| ----------------- | --------------------------------------------------- | +| command | 要在远程主机上执行的命令。 | +| creates | 如果指定的文件或目录存在,则命令不会被执行。 | +| removes | 如果指定的文件或目录不存在,则命令不会被执行。 | +| chdir | 在执行命令之前,将当前工作目录更改为指定的目录。 | +| executable | 用于执行命令的可执行文件的路径。 | +| warn | 控制命令失败时的错误消息显示方式。 | +| stdin | 将输入发送到命令的标准输入。 | +| stdin_add_newline | 在发送到标准输入之前是否添加新行。 | +| strip_empty_ends | 控制在输出中删除空行的方式。 | +| free_form | 允许直接传递要执行的命令,无需使用`command`关键字。 | + +- 先切换目录,执行命令 + + ```bash + ansible all -m command -a 'chdir=/mnt ls -la' + ``` + +- 检查节点的内存情况 + + ```bash + ansible -m command -a "free -m " 'all' + ``` + +## Ansible 常用模块 Shell + +**常用参数** + +| 参数 | 解释 | +| ----------------- | ------------------------------------------------ | +| cmd | 要在远程主机上执行的命令。 | +| creates | 如果指定的文件或目录存在,则命令不会被执行。 | +| removes | 如果指定的文件或目录不存在,则命令不会被执行。 | +| chdir | 在执行命令之前,将当前工作目录更改为指定的目录。 | +| executable | 用于执行命令的可执行文件的路径。 | +| warn | 控制命令失败时的错误消息显示方式。 | +| stdin | 将输入发送到命令的标准输入。 | +| stdin_add_newline | 在发送到标准输入之前是否添加新行。 | +| strip_empty_ends | 控制在输出中删除空行的方式。 | +| free_form | 允许直接传递要执行的命令,无需使用`cmd`关键字。 | +| executable | 用于执行命令的可执行文件的路径。 | +| creates | 如果指定的文件或目录存在,则命令不会被执行。 | +| removes | 如果指定的文件或目录不存在,则命令不会被执行。 | + +- 使用 /bin/bash 执行命令 + + ```bash + ansible all -m shell -a 'executable=/bin/bash ls -la /mnt' + ``` + +## Ansible 常用模块 Script + +**常用参数** + +| 参数 | 解释 | +| ----------------- | ------------------------------------------------------ | +| script | 要在远程主机上执行的脚本文件的路径。 | +| creates | 如果指定的文件或目录存在,则脚本不会被执行。 | +| removes | 如果指定的文件或目录不存在,则脚本不会被执行。 | +| chdir | 在执行脚本之前,将当前工作目录更改为指定的目录。 | +| warn | 控制脚本失败时的错误消息显示方式。 | +| executable | 用于执行脚本的解释器的路径。 | +| stdin | 将输入发送到脚本的标准输入。 | +| stdin_add_newline | 在发送到标准输入之前是否添加新行。 | +| strip_empty_ends | 控制在输出中删除空行的方式。 | +| free_form | 允许直接传递要执行的脚本路径,无需使用`script`关键字。 | + +- 编写一个脚本 + + ```bash + cat << EOF > demo.sh + date + EOF + ``` + +- 执行脚本 + + ```bash + ansible all -m script -a "/etc/ansible/demo.sh" + ``` + + +## Ansible 常用模块 Copy + +**常用参数** + +| 参数 | 解释 | +| -------------- | ------------------------------------------------------------ | +| src | 源文件路径。 | +| dest | 目标文件路径。 | +| backup | 是否备份目标文件。 | +| remote_src | 如果为true,则从控制节点的文件系统复制文件到远程主机。 | +| checksum | 控制是否使用校验和来判断文件是否需要复制。 | +| content | 如果为true,则在Ansible控制节点上生成文件内容并将其传输到远程主机上。 | +| directory_mode | 在创建目录时设置权限模式。 | +| force | 强制复制文件,即使目标文件存在。 | +| owner | 设置目标文件的所有者。 | +| group | 设置目标文件的所属组。 | +| mode | 设置目标文件的权限模式。 | +| seuser | 设置目标文件的SELinux用户。 | +| serole | 设置目标文件的SELinux角色。 | +| setype | 设置目标文件的SELinux类型。 | +| selevel | 设置目标文件的SELinux等级。 | +| follow | 是否跟随符号链接。 | + + +- 拷贝文件 + + ```bash + ansible all -m copy -a "src=/etc/ansible/demo.sh owner=root mode=777 dest=/mnt/demo.sh backup=yes" + ``` + +## Ansible 常用模块 File + +**常用参数** + +| 参数 | 解释 | +| -------------- | ------------------------------------------------------------ | +| path | 文件或目录的路径。 | +| state | 文件或目录的状态。可选值包括:file、directory、link、hard、absent。 | +| owner | 设置文件或目录的所有者。 | +| group | 设置文件或目录的所属组。 | +| mode | 设置文件或目录的权限模式。 | +| dest | 用于创建符号链接的目标文件路径。 | +| src | 用于创建硬链接的源文件路径。 | +| state | 设置文件或目录的状态。 | +| follow | 是否遵循符号链接。 | +| recurse | 是否递归操作,用于目录。 | +| directory_mode | 用于设置目录的权限模式。 | +| force | 是否强制执行。 | +| selevel | 设置目标文件的SELinux等级。 | +| serole | 设置目标文件的SELinux角色。 | +| setype | 设置目标文件的SELinux类型。 | +| seuser | 设置目标文件的SELinux用户。 | + + +- 创建文件 + + ```bash + ansible all -m file -a 'path=/mnt/demofile state=touch' + ``` + +- 创建目录 + + ```bash + ansible all -m file -a 'path=/mnt/demodir state=directory' + ``` + +- 修改文件的所有人 + + ```bash + ansible all -m file -a 'path=/mnt/demofile owner=docker' + ``` + +- 删除文件或目录 + + ```bash + ansible all -m file -a 'path=/mnt/demofile state=absent' + ansible all -m file -a 'path=/mnt/demodir state=absent' + ``` + +## Ansible 常用模块 Archive + +**常用参数** + +| 参数 | 解释 | +| ----------- | ------------------------------------------------------ | +| path | 要打包的文件或目录的路径。 | +| dest | 打包文件的目标路径,包括文件名和扩展名。 | +| format | 打包格式,可选值包括:tar、gz、bz2、tar.gz、tar.bz2。 | +| owner | 设置打包文件的所有者。 | +| group | 设置打包文件的所属组。 | +| mode | 设置打包文件的权限模式。 | +| remote_src | 如果为true,则从控制节点的文件系统打包文件到远程主机。 | +| remove_path | 在归档中排除的路径的前缀。 | +| exclude | 排除指定的文件或目录。 | +| extra_opts | 传递给归档命令的额外选项。 | + +- 打包文件 + + ```bash + ansible all -m archive -a "path=/mnt/demo.sh dest=/mnt/demo.gz format=gz" + ``` + + > 解压使用 + > + > ```bash + > gzip -d demo.gz + > ``` + +## Ansible 常用模块 Cron + +**常用参数** + +| 参数 | 解释 | +| ------------ | ------------------------------------------------------------ | +| name | Cron任务的名称。 | +| minute | 设置分钟字段。可接受数字(0-59)、星号(*,表示每分钟)或范围(例如:0-30,表示0到30分钟之间)。 | +| hour | 设置小时字段。可接受数字(0-23)、星号(*,表示每小时)或范围。 | +| day | 设置天字段。可接受数字(1-31)、星号(*,表示每天)或范围。 | +| month | 设置月份字段。可接受数字(1-12)、星号(*,表示每月)或范围。 | +| weekday | 设置星期字段。可接受数字(0-6,0代表星期日)、星号(*,表示每天)或范围。 | +| job | Cron任务要执行的命令或脚本。 | +| state | 设置Cron任务的状态。可选值包括:present(存在)或absent(不存在)。 | +| disabled | 是否禁用Cron任务。如果设置为yes,则Cron任务将被禁用。 | +| user | 设置Cron任务的所有者。 | +| minute | 设置分钟字段。 | +| hour | 设置小时字段。 | +| day | 设置天字段。 | +| month | 设置月份字段。 | +| weekday | 设置星期字段。 | +| special_time | 设置特殊时间值,如@reboot(重启时运行)或@daily(每天运行)。 | + +- 生成定时任务 + + ```bash + ansible all -m cron -a 'job="echo hello" name=demo minute=*/2' + ``` + +- 禁止该定时任务 + + ```bash + ansible all -m cron -a 'job="echo hello" name=demo minute=*/2 disabled=yes' + ``` + +- 重新开启该定时任务 + + ```bash + ansible all -m cron -a 'job="echo hello" name=demo minute=*/2 disabled=no' + ``` + +- 删除定时任务 + + ```bash + ansible all -m cron -a 'job="echo hello" name=demo minute=*/2 state=absent' + ``` + +## Ansible 常用模块 Yum + +**常用参数** + +| 参数 | 解释 | +| ----------------- | ------------------------------------------------------- | +| name | 指定要安装或删除的软件包名称。 | +| state | 指定软件包的状态。可选值包括:present、latest、absent。 | +| enablerepo | 指定要启用的存储库。 | +| disablerepo | 指定要禁用的存储库。 | +| disable_excludes | 指定要禁用的软件包类型。 | +| update_cache | 是否更新缓存。 | +| disable_gpg_check | 是否禁用GPG检查。 | +| installroot | 安装软件包的根目录。 | +| security | 是否仅安装安全更新。 | +| bugfix | 是否只安装修复错误的更新。 | +| enhancement | 是否只安装增强更新。 | +| ts | 是否使用指定的事务ID。 | + +- 安装软件 + + ```bash + ansible all -m yum -a "name=wget state=present" + ``` + +- 卸载软件 + + ```bash + ansible all -m yum -a "name=wget state=absent" + ``` + +## Ansible 常用模块 Dnf + +**常用参数** + +| 参数 | 解释 | +| ----------------- | ------------------------------------------------------- | +| name | 指定要安装或删除的软件包名称。 | +| state | 指定软件包的状态。可选值包括:present、latest、absent。 | +| enablerepo | 指定要启用的存储库。 | +| disablerepo | 指定要禁用的存储库。 | +| disable_excludes | 指定要禁用的软件包类型。 | +| update_cache | 是否更新缓存。 | +| disable_gpg_check | 是否禁用GPG检查。 | +| installroot | 安装软件包的根目录。 | +| security | 是否仅安装安全更新。 | +| bugfix | 是否只安装修复错误的更新。 | +| enhancement | 是否只安装增强更新。 | +| ts | 是否使用指定的事务ID。 | + +## Ansible 常用模块 Service + +**常用参数** + +| 参数 | 解释 | +| ------------- | ------------------------------------------------------------ | +| name | 指定要管理的服务名称。 | +| state | 指定服务的状态。可选值包括:started、stopped、restarted、reloaded、enabled、disabled。 | +| enabled | 是否设置服务开机自启动。 | +| pattern | 用于匹配要操作的服务的模式。 | +| sleep | 在重新启动服务之前等待的时间(以秒为单位)。 | +| arguments | 传递给服务启动脚本的额外参数。 | +| runlevel | 设置服务在特定运行级别下的启用状态。 | +| daemon_reload | 在重启或重新加载服务之后是否重新加载守护程序。 | +| force | 是否强制执行操作。 | + +- 重启服务 + + ```bash + ansible all -m service -a "name=docker state=restarted" + ``` + +## Ansible 常用模块 User + +**常用参数** + +| 参数 | 解释 | +| --------------- | ----------------------------------------- | +| name | 用户名。 | +| state | 用户的状态。可选值包括:present、absent。 | +| uid | 用户的UID。 | +| password | 用户的密码。 | +| group | 用户所属的主组。 | +| groups | 用户所属的其他组。 | +| append | 是否追加用户到附加的组中。 | +| shell | 用户的登录Shell。 | +| home | 用户的主目录。 | +| move_home | 是否移动用户的主目录。 | +| createhome | 是否创建用户主目录。 | +| system | 是否创建系统用户。 | +| update_password | 是否更新密码。 | +| expire | 设置用户的账号过期日期。 | +| remove | 是否删除用户的主目录。 | + +- 创建用户 + + ```bash + ansible all -m user -a "name=demo state=present" + ``` + +- 删除用户 + + ```bash + ansible all -m user -a "name=demo state=absent" + ``` + + + diff --git a/CICD/Ansible/Docs/Ansible编写与配置.md b/CICD/Ansible/Docs/Ansible编写与配置.md new file mode 100644 index 0000000..c3db327 --- /dev/null +++ b/CICD/Ansible/Docs/Ansible编写与配置.md @@ -0,0 +1,19 @@ +> 本文作者:丁辉 + +# Ansible编写与配置 + +- 第一步禁用SSH主机密钥检查 + + ```bash + vi /etc/ansible/ansible.cfg + ``` + + 解除 `host_key_checking` 注释 + + ```bash + [defaults] + host_key_checking = False + ``` + + > 通常,当你连接到一个新的SSH主机时,SSH客户端会询问你是否要接受该主机的公钥。这个公钥将被保存到`known_hosts`文件中,以便将来的连接可以验证主机的身份。将`host_key_checking`设置为`False`会关闭这个验证步骤。 + diff --git a/CICD/Ansible/Docs/Ansible配置免密.md b/CICD/Ansible/Docs/Ansible配置免密.md new file mode 100644 index 0000000..81d3bca --- /dev/null +++ b/CICD/Ansible/Docs/Ansible配置免密.md @@ -0,0 +1,62 @@ +> 本文作者:丁辉 + +# Ansible 配置免密 + +**配置主机** + +```bash +vi /etc/ansible/hosts +``` + +```bash +[ssh] + +192.168.1.10 +``` + +## SHELL配置免密 + +- 执行脚本 + + ```bash + bash /etc/ansible/ssh-copy.sh + ``` + + > 脚本会自动获取 `/etc/ansible/hosts` 内地址信息进行免密 + +## YML 配置服务器免密登录 + +- 编辑 SSH 主机配置文件填写服务器信息 + + ```bash + vi /etc/ansible/ssh-hosts + ``` + + > 内容如下 + > + > ```yml + > [ssh] # 主机组 + > + > # 192.168.1.[10:11] # 批量 + > # 192.168.1.10 # 单台 + > 192.168.1.10 + > + > [ssh:vars] # 指定主机组中的共享变量 + > + > ansible_ssh_user="root" # 填写服务器用户 + > + > ansible_ssh_pass="" # 填写服务器密码 + > ``` + +- 执行免密 + + ```bash + ansible-playbook -i /etc/ansible/ssh-hosts /etc/ansible/key.yml + ``` + +- 验证 + + ```bash + ansible all -a ls + ``` + diff --git a/CICD/Ansible/README.md b/CICD/Ansible/README.md new file mode 100644 index 0000000..914adb3 --- /dev/null +++ b/CICD/Ansible/README.md @@ -0,0 +1,5 @@ +* + +> 本文作者:丁辉 + +# Ansible diff --git a/CICD/Ansible/ansible.cfg b/CICD/Ansible/ansible.cfg new file mode 100644 index 0000000..ec9cb80 --- /dev/null +++ b/CICD/Ansible/ansible.cfg @@ -0,0 +1,20 @@ +[defaults] +host_key_checking = False + +[inventory] + +[privilege_escalation] + +[paramiko_connection] + +[ssh_connection] + +[persistent_connection] + +[accelerate] + +[selinux] + +[colors] + +[diff] diff --git a/CICD/Ansible/demo.j2 b/CICD/Ansible/demo.j2 new file mode 100644 index 0000000..8149be7 --- /dev/null +++ b/CICD/Ansible/demo.j2 @@ -0,0 +1 @@ +Hello, {{ name }}! diff --git a/CICD/Ansible/demo.yml b/CICD/Ansible/demo.yml new file mode 100644 index 0000000..ac0de0f --- /dev/null +++ b/CICD/Ansible/demo.yml @@ -0,0 +1,174 @@ +- name: demo + # hosts: master,node # 指定多个主机组 + hosts: all + tasks: + ############################################################################################# + # 拷贝文件 + ############################################################################################# + - copy: + src: ./demo.tar + dest: /root/demo.tar + # 强制拷贝 + force: yes + + ############################################################################################# + # 执行命令 + ############################################################################################# + # 执行命令 getenforce 并将结果保存到 out 变量 + - shell: getenforce + register: out + # 引用 out 变量, 输出结果 + - debug: msg="{{out}}" + # 当 out.stdout 不等于 Disabled 时执行命令 + - shell: mkdir dingh + when: out.stdout != "Disabled" + + ############################################################################################# + # 安装软件 + ############################################################################################# + - yum: + name: wget + # 状态[默认 present], present 安装, absent 卸载, latest 更新 + state: present + + ############################################################################################# + # 替换文件内容 + ############################################################################################# + - replace: + # 文件路径 + path: /etc/selinux/config + # 正则表达式 + regexp: "SELINUX=enforcing" + # 替换内容 + replace: "SELINUX=disabled" + + ############################################################################################# + # 管理服务 + ############################################################################################# + - service: + # 服务名称 + name: docker + # 状态[默认 started], started 启动, stopped 停止, restarted 重启, reloaded 重新加载 + state: restarted + enabled: yes + + ############################################################################################# + # 创建用户 + ############################################################################################# + - user: + # 用户名 + name: demo + # 状态[默认 present], present 创建, absent 删除 + state: present + + ############################################################################################# + # 创建组 + ############################################################################################# + - group: + # 组名 + name: demo + # 状态[默认 present], present 创建, absent 删除 + state: present + + ############################################################################################# + # 创建目录 + ############################################################################################# + - file: + # 目录路径 + path: /root/demo + # directory 目录 + state: directory + # 权限 + mode: 0755 + # 所属用户 + owner: demo + # 所属组 + group: demo + + ############################################################################################# + # 创建软连接 + ############################################################################################# + - file: + # 文件路径 + path: /etc/localtime + # link 链接 + state: link + src: /usr/share/zoneinfo/Asia/Shanghai + + ############################################################################################# + # 删除软连接 + ############################################################################################# + - file: + path: /root/demo + state: absent # 删除软连接 + force: yes + + ############################################################################################# + # 创建文件 + ############################################################################################# + - file: + # 文件路径 + path: /root/demo + # touch 创建文件 + state: touch + + ############################################################################################# + # 引用模板 + ############################################################################################# + - template: + # 模板文件 + src: ./demo.j2 + # 目标文件 + dest: /root/demo + # 权限 + mode: 0755 + # 所属用户 + owner: demo + # 所属组 + group: demo + # 变量 + vars: + name: World + + ############################################################################################# + # 配置环境变量 + ############################################################################################# + - lineinfile: + # 文件路径 + path: /etc/profile + # 正则表达式 + regexp: "export PATH" + # 插入内容 + line: "export PATH=$PATH:/usr/local/bin" + + ############################################################################################# + # 配置 crontab 定时任务 + ############################################################################################# + - cron: + # 任务名称 + name: "demo" + # 任务内容 + job: "echo 'hello' > /root/demo.log" + # 任务状态[默认 present], present 创建, absent 删除 + state: present + + ############################################################################################# + # 忽略错误 + ############################################################################################# + - command: echo "hello" + # 忽略错误 + ignore_errors: yes + + ############################################################################################# + # 调试信息 + ############################################################################################# + - debug: msg="hello world" + + ############################################################################################# + # 循环 + ############################################################################################# + - debug: msg="{{ item }}" + with_items: + - 1 + - 2 + - 3 \ No newline at end of file diff --git a/CICD/Ansible/hosts b/CICD/Ansible/hosts new file mode 100644 index 0000000..66cb7c1 --- /dev/null +++ b/CICD/Ansible/hosts @@ -0,0 +1,3 @@ +[host] + +192.168.1.10 \ No newline at end of file diff --git a/CICD/Ansible/key.yml b/CICD/Ansible/key.yml new file mode 100644 index 0000000..166bfd0 --- /dev/null +++ b/CICD/Ansible/key.yml @@ -0,0 +1,7 @@ +- hosts: all + + tasks: + + - name: Non secret authentication + + authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" state=present \ No newline at end of file diff --git a/CICD/Ansible/ssh-copy.sh b/CICD/Ansible/ssh-copy.sh new file mode 100644 index 0000000..8c0742c --- /dev/null +++ b/CICD/Ansible/ssh-copy.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# 填写服务器密码 +PASSWORD="" + +# 获取需要免密服务器IP地址, 自动排除 hosts 文件内 # [] 行 +IP_ADDR=$( + grep -vE '^\[|\]' /etc/ansible/hosts | grep -v '#' | sed '/^$/d' +) + +. /etc/init.d/functions +# 一键生成密钥 +if ! [ -f ~/.ssh/id_rsa.pub ];then + ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa >/dev/null 2>&1 + echo -e "\033[32m======Local=========\033[0m" + action "Generate the key!" /bin/true +fi + +# 批量发送密钥 + for i in $IP_ADDR;do + sshpass -p$PASSWORD ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no ${i} >/dev/null 2>&1 + + if [ $? == 0 ];then + echo -e "\033[32m=========`ssh $i hostname`==========\033[0m" + action "发送成功!!!" /bin/true + else + echo -e "\033[31m======$i=======\033[0m" + action "发送失败!!!" /bin/false + fi + done \ No newline at end of file diff --git a/CICD/Ansible/ssh-hosts b/CICD/Ansible/ssh-hosts new file mode 100644 index 0000000..851d0b7 --- /dev/null +++ b/CICD/Ansible/ssh-hosts @@ -0,0 +1,10 @@ +[ssh] + +# 192.168.1.[10:11] # 批量 +# 192.168.1.10 # 单台 + +[ssh:vars] + +ansible_ssh_user="root" # 用户 + +ansible_ssh_pass="" # 密码 \ No newline at end of file diff --git a/CICD/Drone/Dockerfile b/CICD/Drone/Dockerfile new file mode 100644 index 0000000..056c101 --- /dev/null +++ b/CICD/Drone/Dockerfile @@ -0,0 +1,3 @@ +FROM busybox:latest + +RUN echo "Hello World!" \ No newline at end of file diff --git a/CICD/Drone/Docs/Drone客户端安装.md b/CICD/Drone/Docs/Drone客户端安装.md new file mode 100644 index 0000000..8a725e2 --- /dev/null +++ b/CICD/Drone/Docs/Drone客户端安装.md @@ -0,0 +1,32 @@ +> 本文作者:丁辉 + +# Drone客户端安装 + +## 开始安装 + +[Homebrew官网](https://brew.sh/index_zh-cn) + +- Linux 安装 Homebrew + + ```bash + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + ``` + +- MAC 使用 Homebrew 安装 Drone命令 + + ```bash + brew tap drone/drone + brew install drone + ``` + +## 使用命令触发 Drone 构建 + +[Drone 命令官网](https://0-8-0.docs.drone.io/zh/cli-installation/) + +```bash +curl -X POST \ + -H "Authorization: Bearer $YOUR_API_TOKEN" \ + -H "Content-Type: application/json" \ + https://your.drone.instance/api/repos/用户/仓库名/builds +``` + diff --git a/CICD/Drone/Docs/README.md b/CICD/Drone/Docs/README.md new file mode 100644 index 0000000..601dfa5 --- /dev/null +++ b/CICD/Drone/Docs/README.md @@ -0,0 +1,32 @@ +> 本文作者:丁辉 + +# Drone的使用 + +## 快速启动 Runner 执行端 + +```bash +docker run --detach \ + --volume=/var/run/docker.sock:/var/run/docker.sock \ + --env=DRONE_RPC_PROTO=https \ + --env=DRONE_RPC_HOST= \ + --env=DRONE_RPC_SECRET= \ + --env=DRONE_RUNNER_CAPACITY=4 \ + --env=DRONE_RUNNER_NAME=runner \ + --restart=always \ + --name=runner \ + drone/drone-runner-docker +``` + +> Runner 添加标签 +> +> ```bash +> --from-literal=DRONE_RUNNER_LABELS=<标签:值> \ +> ``` + +## Kubernetes部署文档 + +- [Helm部署Drone](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Drone.md) +- [Helm部署Drone-Runner-Docker](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Drone-Runner-Docker.md) +- [Helm部署Drone-Runner-Kube](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Drone-Runner-Kube.md) +- [Helm部署Drone-Kubernetes-Secrets](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Drone-Kubernetes-Secrets.md) + diff --git a/CICD/Drone/File/Demo.md b/CICD/Drone/File/Demo.md new file mode 100644 index 0000000..23a418f --- /dev/null +++ b/CICD/Drone/File/Demo.md @@ -0,0 +1,3 @@ +* + +This is a test file \ No newline at end of file diff --git a/CICD/Drone/File/admin-user.yaml b/CICD/Drone/File/admin-user.yaml new file mode 100644 index 0000000..0bff655 --- /dev/null +++ b/CICD/Drone/File/admin-user.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: admin-user + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: admin-user +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: admin-user + namespace: kube-system +--- +apiVersion: v1 +kind: Secret +metadata: + name: admin-token + namespace: kube-system + annotations: + kubernetes.io/service-account.name: admin-user +type: kubernetes.io/service-account-token \ No newline at end of file diff --git a/CICD/Drone/README.md b/CICD/Drone/README.md new file mode 100644 index 0000000..8ccd62c --- /dev/null +++ b/CICD/Drone/README.md @@ -0,0 +1,361 @@ +> 本文作者:丁辉 + +# DronePlugins构建Docker镜像 + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 配置 Secrets + + | 变量名 | 解释 | 例 | + | :-------------: | :--------------: | :---------------------------------------------------: | + | REGISTRY | 镜像仓库地址 | registry.cn-hangzhou.aliyuncs.com | + | DOCKER_USERNAME | 镜像仓库登录用户 | | + | DOCKER_PASSWORD | 镜像仓库登录密码 | | + | REPO | 镜像的仓库名称 | registry.cn-hangzhou.aliyuncs.com/<命名空间>/<镜像名> | + +## 插件 plugins/docker 参数 + +[官网文档](https://plugins.drone.io/plugins/docker) + +| 属性 | 类型 | 可选/必选 | 描述 | 默认值 | +| ------------------- | ------ | --------- | ------------------------------------------------------------ | ------------ | +| registry | 字符串 | 可选 | 身份验证到该注册表的注册表 | 无 | +| username | 字符串 | 可选 | 使用此用户名进行身份验证 | 无 | +| password | 字符串 | 可选 | 使用此密码进行身份验证 | 推荐使用密钥 | +| repo | 字符串 | 可选 | 图像的仓库名称 | 无 | +| tags | 数组 | 可选 | 图像的仓库标签 | 无 | +| secret | 字符串 | 可选 | 使用buildkit将秘密传递给dockerbuild。例如`id=mysecret,src=secret-file` | 无 | +| dockerfile | 字符串 | 可选 | 要使用的Dockerfile | Dockerfile | +| dry_run | 字符串 | 可选 | 如果不应在最后推送Docker镜像,则为布尔值 | 无 | +| purge | 布尔值 | 可选 | 如果应在最后清理Docker镜像,则为布尔值 | true | +| context | 字符串 | 可选 | 要使用的上下文路径,默认为git存储库的根目录 | 无 | +| target | 字符串 | 可选 | 要使用的构建目标,必须在Docker文件中定义 | 无 | +| force_tag | 布尔值 | 可选 | 替换现有匹配的镜像标签 | false | +| insecure | 布尔值 | 可选 | 启用与此注册表的不安全通信 | false | +| mirror | 字符串 | 可选 | 使用镜像注册表而不是直接从中央Hub拉取图像 | 无 | +| bip | 布尔值 | 可选 | 用于传递桥接IP | false | +| custom_dns | 字符串 | 可选 | 为容器设置自定义DNS服务器 | 无 | +| custom_dns_search | 字符串 | 可选 | Docker守护程序DNS搜索域 | 无 | +| storage_driver | 字符串 | 可选 | 支持`aufs`、`overlay`或`vfs`驱动器 | 无 | +| storage_path | 字符串 | 可选 | Docker守护程序存储路径 | 无 | +| build_args | 字符串 | 可选 | 传递给docker build的自定义参数 | 无 | +| build_args_from_env | 字符串 | 可选 | 将环境变量作为docker build的自定义参数传递 | 无 | +| auto_tag | 布尔值 | 可选 | 根据git分支和git标签自动生成标签名称 | false | +| auto_tag_suffix | 字符串 | 可选 | 使用此后缀生成标签名称 | 无 | +| debug | 布尔值 | 可选 | 以详细调试模式启动docker守护进程 | false | +| launch_debug | 布尔值 | 可选 | 以详细调试模式启动docker守护进程 | false | +| mtu | 字符串 | 可选 | Docker守护程序自定义MTU设置 | 无 | +| ipv6 | 字符串 | 可选 | Docker守护程序IPv6网络 | 无 | +| experimental | 布尔值 | 可选 | Docker守护程序实验模式 | false | +| daemon_off | 布尔值 | 可选 | 不启动docker守护进程 | false | +| cache_from | 字符串 | 可选 | 考虑作为缓存源的镜像 | 无 | +| squash | 布尔值 | 可选 | 在构建时压缩层 | false | +| pull_image | 布尔值 | 可选 | 强制在构建时拉取基础镜像 | false | +| compress | 布尔值 | 可选 | 使用gzip压缩构建上下文 | false | +| custom_labels | 字符串 | 可选 | 附加的k=v标签 | 无 | +| label_schema | 字符串 | 可选 | label-schema标签 | 无 | +| email | 字符串 | 可选 | Docker电子邮件 | 无 | +| no_cache | 字符串 | 可选 | 不使用缓存的中间容器 | 无 | +| add_host | 字符串 | 可选 | 附加的主机:IP映射 | 无 | +| platform | 字符串 | 可选 | 指定构建输出的目标平台,例如`linux/amd64`、`linux/arm64`或`darwin/amd64` | 无 | +| ssh-agent-key | 字符串 | 可选 | 用于ssh直通的私钥,参见https://docs.docker.com/engine/reference/commandline/buildx_build/#ssh | 推荐使用密钥 | + + + +# Drone Webhook 通知构建结果 + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 修改 Configuration,修改后点击 SAVE CHANGES 保存 + + ```bash + .drone-build-webhook.yml + ``` + +- 配置 Secrets + + | 变量名 | 解释 | 例 | + | :---------: | :-----------------: | :----------------------------------------------: | + | WEBHOOK_URL | 发送 Webhook 的 URL | https://open.feishu.cn/open-apis/bot/v2/hook/*** | + +## 插件 plugins/webhook 参数 + +| 属性名 | 类型 | 必需性 | 描述 | 默认值 | +| ------------ | ------- | -------- | ------------------------ | ---------------- | +| urls | string | required | 发送 Webhook 的 URL | none | +| username | string | optional | 用于基本身份验证的用户名 | none | +| password | string | optional | 用于基本身份验证的密码 | none | +| SECRET | string | | 推荐使用的密钥 | none | +| method | string | optional | 请求使用的 HTTP 方法 | POST | +| content_type | string | optional | Webhook 的内容类型 | application/json | +| template | string | optional | Webhook 的自定义模板 | none | +| headers | array | optional | 自定义标头的映射 | none | +| skip_verify | boolean | optional | 跳过 SSL 验证 | false | +| debug | boolean | optional | 启用调试信息 | false | + + + +# Drone Dind 构建 Docker 镜像 + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 开启 Trusted (未开启无法挂载Docker守护进程) + +- 修改 Configuration,修改后点击 SAVE CHANGES 保存 + + ```bash + .drone-dind.yml + ``` + +- 配置 Secrets + + | 变量名 | 解释 | 例 | + | :-------------: | :--------------: | :-------------------------------: | + | REGISTRY | 镜像仓库地址 | registry.cn-hangzhou.aliyuncs.com | + | DOCKER_USERNAME | 镜像仓库登录用户 | | + | DOCKER_PASSWORD | 镜像仓库登录密码 | | + | NAMESPACE | 镜像的仓库名称 | <命名空间> | + | IMAGENAME | 镜像名称 | | + | IMAGETAG | 镜像标签 | | + + + +# Drone 构建多架构 Docker 镜像 + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 下 General 修改 Configuration,修改后点击 SAVE CHANGES 保存 + + ```bash + .drone-buildx.yml + ``` + +- 配置 Secrets + + | 变量名 | 解释 | 例 | + | :-------------: | :--------------: | :---------------------------: | + | REGISTRY | 镜像仓库地址 | docker.io | + | DOCKER_USERNAME | 镜像仓库登录用户 | | + | DOCKER_PASSWORD | 镜像仓库登录密码 | | + | REPO | 镜像的仓库名称 | docker.io/<命名空间>/<镜像名> | + + + +# Drone Scp 文件到服务器内 + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 下 General 修改 Configuration,修改后点击 SAVE CHANGES 保存 + + ```bash + .drone-scp.yml + ``` + +- 配置 Secrets + + | 变量名 | 解释 | 例 | + | :------: | :----------------: | :----------: | + | HOST | 目标主机机器 | 192.168.1.10 | + | USER | 目标主机机器用户名 | Root | + | PASSWORD | 目标主机机器密码 | | + | PORT | 目标主机机器端口 | 22 | + +## 插件 appleboy/drone-scp 参数 + +[官方文档](https://plugins.drone.io/plugins/scp) + +| 属性名 | 类型 | 是否必需 | 描述 | 默认值 | +| -------------------- | ------ | -------- | ---------------------------- | ------ | +| host | 字符串 | 必需 | 目标主机机器。 | 无 | +| port | 数字 | 可选 | 目标主机机器端口。 | 22 | +| username | 字符串 | 必需 | 目标主机机器用户名。 | 无 | +| password | 字符串 | 必需 | 目标主机机器密码。 | 无 | +| key | 字符串 | 可选 | 目标主机机器私钥。建议保密。 | 无 | +| passphrase | 字符串 | 可选 | 私钥密码。建议保密。 | 无 | +| target | 字符串 | 必需 | 目标主机机器路径。 | 无 | +| source | 字符串 | 必需 | 源文件路径。 | 无 | +| rm | 布尔值 | 可选 | 复制后是否删除源文件。 | false | +| timeout | 数字 | 可选 | 超时时间(秒)。 | 30 | +| command_timeout | 数字 | 可选 | 命令超时时间(分钟)。 | 10 | +| strip_components | 数字 | 可选 | 从目标路径中去除的组件数。 | 0 | +| tar_tmp_path | 字符串 | 可选 | 用于临时存储tar文件的路径。 | 无 | +| tar_exec | 字符串 | 可选 | Tar命令。 | 无 | +| overwrite | 布尔值 | 可选 | 如果目标文件存在,是否覆盖。 | false | +| proxy_host | 字符串 | 可选 | 代理主机。 | 无 | +| proxy_port | 数字 | 可选 | 代理端口。 | 0 | +| proxy_username | 字符串 | 可选 | 代理用户名。 | 无 | +| proxy_password | 字符串 | 可选 | 代理密码。建议保密。 | 无 | +| proxy_key | 字符串 | 可选 | 代理私钥。建议保密。 | 无 | +| proxy_key_path | 字符串 | 可选 | 代理私钥路径。 | 无 | +| proxy_key_passphrase | 字符串 | 可选 | 代理私钥密码。建议保密。 | 无 | + + + +# Drone Ssh 操作服务器 + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 下 General 修改 Configuration,修改后点击 SAVE CHANGES 保存 + + ```bash + .drone-ssh.yml + ``` + +- 配置 Secrets + + | 变量名 | 解释 | 例 | + | :------: | :----------------: | :----------: | + | HOST | 目标主机机器 | 192.168.1.10 | + | USER | 目标主机机器用户名 | Root | + | PASSWORD | 目标主机机器密码 | | + | PORT | 目标主机机器端口 | 22 | + +## 插件 appleboy/drone-ssh 参数 + +[官方文档](https://plugins.drone.io/plugins/ssh) + +| 属性名 | 类型 | 是否必须 | 描述 | 默认值 | +| --------------- | ------ | -------- | ---------------------------- | -------------- | +| host | 字符串 | 必须 | 服务器的主机名或IP地址。 | 无 | +| port | 字符串 | 可选 | 服务器的端口。 | 22 | +| username | 字符串 | 可选 | 目标主机用户的帐户。 | 无 | +| password | 字符串 | 可选 | 登录到服务器的密码。 | 无(建议保密) | +| key | 字符串 | 可选 | 用户私钥的明文。 | 无(建议保密) | +| key_path | 字符串 | 可选 | 登录到服务器的私钥路径。 | 无 | +| envs | 数组 | 可选 | 在脚本部分可用的自定义秘密。 | 无 | +| script | 字符串 | 可选 | 在服务器上执行的命令。 | 无 | +| script_stop | 布尔值 | 可选 | 在第一次失败后停止脚本执行。 | false | +| timeout | 字符串 | 可选 | SSH连接建立的最长时间。 | 30秒 | +| command_timeout | 字符串 | 可选 | 执行命令的最长时间。 | 10分钟 | +| proxy_host | 字符串 | 可选 | 代理的主机名或IP地址。 | 无 | +| proxy_port | 字符串 | 可选 | 代理端口。 | 无 | +| proxy_username | 字符串 | 可选 | 代理用户名。 | 无 | +| proxy_password | 字符串 | 可选 | 代理密码。 | 无(建议保密) | +| proxy_key | 字符串 | 可选 | 代理私钥的明文。 | 无(建议保密) | +| proxy_key_path | 字符串 | 可选 | 登录到代理的私钥路径。 | 无 | + + + +# Drone Git Push 代码 + +> 你不会,俺不会,大家一起都不会! + +## 准备环境 + +- 克隆仓库到本地 + + ```bash + git clone https://gitea.offends.cn/offends/Kubernetes.git && cd Kubernetes/CICD/Drone + ``` + +- 修改 Dockerfile 并上传至自己的仓库 + +- 进入 Drone Web页面点击 SYNC 同步仓库 + +- 点击 ACTIVATE REPOSITORY 激活存储库 + +- 点击 Settings 下 General 修改 Configuration,修改后点击 SAVE CHANGES 保存 + + ```bash + .drone-git-push.yml + ``` + +- 配置 Secrets + + | 变量名 | 解释 | 例 | + | :-----: | :-------------------: | :-----------------------: | + | REMOTE | 目标远程仓库 | <仓库 clone 地址> | + | SSH_KEY | 远程机器的私有SSH密钥 | <应该是 .ssh/id_rsa 文件> | + +## 插件 appleboy/drone-git-push 参数 + +[官方文档](https://plugins.drone.io/plugins/git-push) + +| 属性名 | 类型 | 是否必须 | 描述 | 默认值 | +| -------------- | ------ | -------- | -------------------------------------- | ---------------------------- | +| ssh_key | 字符串 | 可选 | 远程机器的私有SSH密钥。 | 无 | +| remote | 字符串 | 必须 | 目标远程仓库(如果为空,则假定存在)。 | 无 | +| remote_name | 字符串 | 可选 | 用于本地操作的远程的名称。 | deploy | +| branch | 字符串 | 可选 | 要推送到的目标分支。 | master | +| local_branch | 字符串 | 可选 | 从中推送的本地分支或引用。 | HEAD | +| path | 字符串 | 可选 | 仓库的路径。 | 当前仓库 | +| force | 布尔值 | 可选 | 使用 --force 标志进行强制推送。 | false | +| skip_verify | 布尔值 | 可选 | 跳过HTTPS证书的验证。 | false | +| commit | 布尔值 | 可选 | 在推送之前添加并提交仓库的内容。 | false | +| commit_message | 字符串 | 可选 | 为提交添加自定义消息。 | [skip ci] Commit dirty state | +| empty_commit | 布尔值 | 可选 | 如果没有更改,则创建一个空的提交。 | false | +| author_name | 字符串 | 可选 | 提交的作者姓名。 | commiter name | +| author_email | 字符串 | 可选 | 提交的作者电子邮件。 | commiter email | +| followtags | 布尔值 | 可选 | 使用 --follow-tags 选项推送。 | false | diff --git a/CICD/Drone/YML/.drone-build-webhook.yml b/CICD/Drone/YML/.drone-build-webhook.yml new file mode 100644 index 0000000..e52334f --- /dev/null +++ b/CICD/Drone/YML/.drone-build-webhook.yml @@ -0,0 +1,72 @@ +kind: pipeline +type: docker +name: Build Dockerfile + +# 手动触发或接口触发 +trigger: + event: + - custom + +# 指定架构,需在 runner 配置环境变量中指定 DRONE_RUNNER_ARCH,或自动获取 +# platform: +# os: linux +# arch: amd64 + +# 指定运行环境节点,需在 runner 配置环境变量中指定 DRONE_RUNNER_LABELS +# node: +# 标签:值 + +# 使用插件构建镜像 +steps: + - name: Build Dockerfile + image: plugins/docker + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + registry: + from_secret: REGISTRY + username: + from_secret: DOCKER_USERNAME + password: + from_secret: DOCKER_PASSWORD + repo: + from_secret: REPO + # 是否禁止推送镜像 + dry_run: false + tags: + - latest + # 要使用的上下文路径,默认为 git 存储库的根目录 + context: ./ + # 要使用的 dockerfile 路径,默认为 git 存储库的根目录 + dockerfile: ./Dockerfile + - name: 结果通知 + image: plugins/webhook + depends_on: [Build Dockerfile] + settings: + urls: + from_secret: WEBHOOK_URL + + # # 飞书机器人 + # 官网飞书机器人使用指南: https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot + # 消息类型指南: https://open.feishu.cn/community/articles/7271149634339422210 + method: POST + content_type: "application/json" + # 通知内容,读取上一步执行结果,如果成功则返回构建成功,失败则返回构建失败 + template: > + { + "msg_type": "text", + "content": { + "text": + {{#success build.status}} + "镜像构建成功" + {{else}} + "镜像构建失败" + {{/success}} + } + } + + # 无论构建成功或失败都通知 + when: + status: + - success + - failure \ No newline at end of file diff --git a/CICD/Drone/YML/.drone-buildx.yml b/CICD/Drone/YML/.drone-buildx.yml new file mode 100644 index 0000000..ada8dc6 --- /dev/null +++ b/CICD/Drone/YML/.drone-buildx.yml @@ -0,0 +1,38 @@ +kind: pipeline +type: docker +name: Build Dockerfile + +# 手动触发或接口触发 +trigger: + event: + - custom + +# 指定运行环境节点,需在 runner 配置环境变量中指定 DRONE_RUNNER_LABELS +# node: +# 标签:值 + +# 使用插件构建镜像 +steps: +- name: latest + image: thegeeklab/drone-docker-buildx + privileged: true + settings: + registry: + from_secret: REGISTRY + username: + from_secret: DOCKER_USERNAME + password: + from_secret: DOCKER_PASSWORD + repo: + from_secret: REPO + purge: true + compress: true + platforms: + - linux/amd64 + - linux/arm64 + context: ./ + dockerfile: ./Dockerfile + tags: latest + when: + branch: + - main \ No newline at end of file diff --git a/CICD/Drone/YML/.drone-deploy.yml b/CICD/Drone/YML/.drone-deploy.yml new file mode 100644 index 0000000..dff275d --- /dev/null +++ b/CICD/Drone/YML/.drone-deploy.yml @@ -0,0 +1,22 @@ +kind: pipeline +name: default + +trigger: + event: + include: + - custom + +steps: +- name: Update-Deployment + image: quay.io/honestbee/drone-kubernetes + settings: + kubernetes_server: + from_secret: KUBERNESTES_SERVER + kubernetes_token: + from_secret: KUBERNESTES_TOKEN + namespace: default + deployment: nginx + repo: nginx + container: nginx + tag: + - latest \ No newline at end of file diff --git a/CICD/Drone/YML/.drone-dind.yml b/CICD/Drone/YML/.drone-dind.yml new file mode 100644 index 0000000..1cb1eb3 --- /dev/null +++ b/CICD/Drone/YML/.drone-dind.yml @@ -0,0 +1,61 @@ +kind: pipeline +type: docker +name: Build Dockerfile + +# platform: +# os: linux +# arch: amd64 + +# 手动触发或接口触发 +trigger: + event: + - custom + +steps: +- name: Dockerfile + image: docker:dind + + # 挂载Docker守护进程 + volumes: + - name: dockersock + path: /var/run/docker.sock + + # 环境变量 + environment: + DOCKER_USERNAME: + from_secret: DOCKER_USERNAME + DOCKER_PASSWORD: + from_secret: DOCKER_PASSWORD + NAMESPACE: + from_secret: NAMESPACE + # 镜像名 + IMAGENAME: demo + # 镜像标签 + IMAGETAG: latest + # 镜像仓库私有地址 + REGISTRY: + from_secret: REGISTRY + + # 执行命令 + commands: + # 推送镜像至阿里云 + # - docker build -t registry.cn-hangzhou.aliyuncs.com/$NAMESPACE/$IMAGENAME:$IMAGETAG . + # - docker login registry.cn-hangzhou.aliyuncs.com -u $DOCKER_USERNAME -p $DOCKER_PASSWORD + # - docker push registry.cn-hangzhou.aliyuncs.com/$NAMESPACE/$IMAGENAME:$IMAGETAG + + # 推送镜像至DockerHub + # - docker build -t $DOCKER_USERNAME/$IMAGENAME:$IMAGETAG . + # - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD + # - docker push $DOCKER_USERNAME/$IMAGENAME:$IMAGETAG + + # 推送镜像至私有仓库 + - docker build -t $REGISTRY/$NAMESPACE/$IMAGENAME:$IMAGETAG . + - docker login $REGISTRY -u $DOCKER_USERNAME -p $DOCKER_PASSWORD + - docker push $REGISTRY/$NAMESPACE/$IMAGENAME:$IMAGETAG + + +# 挂载Docker守护进程 +volumes: +- name: dockersock + host: + path: /var/run/docker.sock \ No newline at end of file diff --git a/CICD/Drone/YML/.drone-git-push.yml b/CICD/Drone/YML/.drone-git-push.yml new file mode 100644 index 0000000..8aa893c --- /dev/null +++ b/CICD/Drone/YML/.drone-git-push.yml @@ -0,0 +1,24 @@ +kind: pipeline +type: docker +name: Git Push + +# 手动触发或接口触发 +trigger: + event: + - custom + +steps: +- name: Git Push + image: appleboy/drone-git-push + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + branch: main + remote: + from_secret: REMOTE + ssh_key: + from_secret: SSH_KEY + path: + force: false + commit: true + commit_message: "Update From Drone" \ No newline at end of file diff --git a/CICD/Drone/YML/.drone-scp.yml b/CICD/Drone/YML/.drone-scp.yml new file mode 100644 index 0000000..18a3ab3 --- /dev/null +++ b/CICD/Drone/YML/.drone-scp.yml @@ -0,0 +1,31 @@ +kind: pipeline +type: docker +name: Scp File + +# 手动触发或接口触发 +trigger: + event: + - custom + +steps: +- name: Scp File + image: appleboy/drone-scp + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + host: + from_secret: HOST + user: + from_secret: USER + password: + from_secret: PASSWORD + port: + from_secret: PORT + # 源文件路径 + source: File/* + strip_components: 1 + # 目标路径 + target: /root/ + when: + branch: + - main \ No newline at end of file diff --git a/CICD/Drone/YML/.drone-ssh.yml b/CICD/Drone/YML/.drone-ssh.yml new file mode 100644 index 0000000..8637f56 --- /dev/null +++ b/CICD/Drone/YML/.drone-ssh.yml @@ -0,0 +1,29 @@ +kind: pipeline +type: docker +name: Ssh Server + +# 手动触发或接口触发 +trigger: + event: + - custom + +steps: +- name: Ssh Server + image: appleboy/drone-ssh + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + host: + from_secret: HOST + user: + from_secret: USER + password: + from_secret: PASSWORD + port: + from_secret: PORT + # 执行命令 + script: + - ls + when: + branch: + - main \ No newline at end of file diff --git a/CICD/Drone/YML/.drone.yml b/CICD/Drone/YML/.drone.yml new file mode 100644 index 0000000..f1dfacb --- /dev/null +++ b/CICD/Drone/YML/.drone.yml @@ -0,0 +1,44 @@ +kind: pipeline +type: docker +name: Build Dockerfile + +# 手动触发或接口触发 +trigger: + event: + - custom + +# 指定架构,需在 runner 配置环境变量中指定 DRONE_RUNNER_ARCH,或自动获取 +# platform: +# os: linux +# arch: amd64 + +# 指定运行环境节点,需在 runner 配置环境变量中指定 DRONE_RUNNER_LABELS +# node: +# 标签:值 + +# 使用插件构建镜像 +steps: +- name: Build Dockerfile + image: plugins/docker + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + registry: + from_secret: REGISTRY + username: + from_secret: DOCKER_USERNAME + password: + from_secret: DOCKER_PASSWORD + repo: + from_secret: REPO + # 是否禁止推送镜像 + dry_run: false + tags: + - latest + # 要使用的上下文路径,默认为 git 存储库的根目录 + context: ./ + # 要使用的 dockerfile 路径,默认为 git 存储库的根目录 + dockerfile: ./Dockerfile + when: + branch: + - main \ No newline at end of file diff --git a/CICD/Github/.github/workflows/dependabot.yml b/CICD/Github/.github/workflows/dependabot.yml new file mode 100644 index 0000000..5351ba5 --- /dev/null +++ b/CICD/Github/.github/workflows/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 20 \ No newline at end of file diff --git a/CICD/Github/.github/workflows/images.yml b/CICD/Github/.github/workflows/images.yml new file mode 100644 index 0000000..1c31897 --- /dev/null +++ b/CICD/Github/.github/workflows/images.yml @@ -0,0 +1,31 @@ +name: Build-Work + +on: + repository_dispatch: + types: + - StartAction-Build-Images + +jobs: + Build-Images: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build and push image + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./Dockerfile + push: true + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/demo:v1.0 \ No newline at end of file diff --git a/CICD/Github/Dockerfile b/CICD/Github/Dockerfile new file mode 100644 index 0000000..b850e4a --- /dev/null +++ b/CICD/Github/Dockerfile @@ -0,0 +1,5 @@ +FROM busybox:latest + +RUN echo "启动成功" > /file.txt + +CMD ["tail","-f","/file.txt"] \ No newline at end of file diff --git a/CICD/Github/README.md b/CICD/Github/README.md new file mode 100644 index 0000000..ef8e6b0 --- /dev/null +++ b/CICD/Github/README.md @@ -0,0 +1,189 @@ +> 本文作者:丁辉 + +# GithubAction学习 + +## 触发Action构建 + +```bash +curl -X POST https://api.github.com/repos/$用户/$仓库名/dispatches -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token $YOUR_API_TOKEN" --data '{"event_type": "StartAction"}' +``` + +## GITHUB设置Secrets + +网址为:`仓库地址/settings/secrets/actions` + +## 构建示例 + +### 构建触发 + +```yaml +#定时任务触发构建 +on: + schedule: + - cron: "0 0 * * *" + +#通过接口触发构建 +on: + repository_dispatch: + types: + - StartAction + +#通过 push 代码触发构建 +on: + push: + branches: + - master + +# 当 push 到 master 分支,或者创建以 v 开头的 tag 时触发 +on: + push: + branches: + - master + tags: + - v* +``` + +### 本地执行命令类 + +```yaml +name: Build + +#本地执行命令类 +jobs: + run-docker-command: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Run Docker Command + run: | + docker run --name mysql \ + -e MYSQL_ROOT_PASSWORD=${{ secrets.PASSWORD }} \ + ${{ secrets.IMAGES }} +``` + +### 构建Docker镜像 + +```yaml +name: Build-Images + +# Docker构建镜像并 push 到仓库内 +jobs: + Build-Images-One: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v3 + - + name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build and push image + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./Dockerfile + push: true + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ secrets.DOCKER_HUB_STASH }}:${{ secrets.TAG }} + + Build--Images-Two: + needs: Build-Images-One #等待 One 构建成功后开始执行 + runs-on: ubuntu-latest + steps: + - + name: Check Out + uses: actions/checkout@v3 + - + name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v3 + with: + context: ./demo/ + file: ./demo/Dockerfile + push: true + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ secrets.DOCKER_HUB_STASH }}:${{ secrets.TAG }} +``` + +### 构建多架构镜像 + +[官方Demo](https://docs.docker.com/build/ci/github-actions/multi-platform/) + +```yaml +name: ci + +on: + push: + branches: + - "main" + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - + name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - + name: Checkout + uses: actions/checkout@v3 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64,linux/arm64 + #支持列表:https://github.com/docker-library/official-images#architectures-other-than-amd64 + #platforms: | + #linux/arm64 + #linux/amd64 + #linux/arm/v5 + #linux/arm/v7 + #linux/386 #适用于 x86 32 位架构的 Docker 镜像 + #linux/mips64le #适用于 MIPS 64 位架构的 Docker 镜像 + #linux/ppc64le #适用于 IBM Power 架构的 Docker 镜像 + #linux/s390x #适用于 IBM Z 架构的 Docker 镜像 + push: true + tags: ${{ secrets.DOCKERHUB_USERNAME }}/demo:latest +``` + +### Dependabot实现更新项目中的依赖项 + +当你在项目中使用很多第三方库(例如JavaScript项目中的npm包)时,这些库会不断更新,有时是为了添加新功能,有时是为了修复安全漏洞。手动跟踪和更新这些库可能既费时又容易出错。这就是Dependabot发挥作用的地方。 + +[官方文档](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuring-dependabot-version-updates) + +```yaml +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 20 +``` + diff --git a/CICD/Gitlab/README.md b/CICD/Gitlab/README.md new file mode 100644 index 0000000..6d8ddca --- /dev/null +++ b/CICD/Gitlab/README.md @@ -0,0 +1,303 @@ +# GitLab Kubernetes部署文档 + +本目录包含GitLab在Kubernetes集群上的部署配置和文档。 + +## 部署配置 + +### gitlab-deployment.yaml + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: gitlab-pv +spec: + capacity: + storage: 50Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /data/gitlab + storageClassName: manual +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: gitlab-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 50Gi + storageClassName: manual +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: gitlab + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: gitlab + template: + metadata: + labels: + app: gitlab + spec: + containers: + - name: gitlab + image: gitlab/gitlab-ce:latest + ports: + - containerPort: 80 + name: http + - containerPort: 443 + name: https + - containerPort: 22 + name: ssh + env: + - name: GITLAB_OMNIBUS_CONFIG + value: | + external_url 'http://<节点IP>:30180' + gitlab_rails['gitlab_shell_ssh_port'] = 30122 + nginx['listen_port'] = 80 + nginx['listen_https'] = false + volumeMounts: + - name: gitlab-data + mountPath: /var/opt/gitlab + resources: + requests: + memory: "2Gi" + cpu: "1000m" + limits: + memory: "4Gi" + cpu: "2000m" + volumes: + - name: gitlab-data + persistentVolumeClaim: + claimName: gitlab-pvc +--- +apiVersion: v1 +kind: Service +metadata: + name: gitlab + namespace: default +spec: + type: NodePort + ports: + - port: 80 + targetPort: 80 + nodePort: 30180 + name: http + - port: 443 + targetPort: 443 + nodePort: 30443 + name: https + - port: 22 + targetPort: 22 + nodePort: 30122 + name: ssh + selector: + app: gitlab +``` + +> 注意:在部署前,请将配置中的 `<节点IP>` 替换为实际的节点IP地址。 + +## 部署步骤 + +### 1. 创建数据目录 + +```bash +mkdir -p /data/gitlab +``` + +### 2. 修改配置文件 + +将上述YAML配置保存为 `gitlab-deployment.yaml` 文件,并将 `<节点IP>` 替换为实际的节点IP地址。 + +### 3. 应用部署配置 + +```bash +kubectl apply -f gitlab-deployment.yaml +``` + +### 4. 验证部署状态 + +```bash +# 查看Pod状态 +kubectl get pods -l app=gitlab + +# 查看Service状态 +kubectl get svc gitlab + +# 查看详细信息 +kubectl describe pod +``` + +## 访问地址 + +| 服务 | 端口 | 说明 | +|------|------|------| +| Web界面 | 30180 | GitLab Web管理界面(http://节点IP:30180) | +| HTTPS | 30443 | 安全HTTPS访问 | +| SSH | 30122 | Git代码推送 | + +### 获取GitLab初始密码 + +```bash +kubectl exec -it $(kubectl get pod -l app=gitlab -o jsonpath='{.items[0].metadata.name}') -- grep 'Password:' /etc/gitlab/initial_root_password +``` + +首次登录后,默认用户名为 `root`,使用上述获取的密码登录。 + +## 配置参数 + +| 参数 | 值 | 说明 | +|------|-----|------| +| 镜像 | gitlab/gitlab-ce:latest | GitLab社区版最新版本 | +| 数据目录 | /data/gitlab | HostPath存储路径 | +| 存储容量 | 50Gi | PV/PVC分配存储 | +| 内存请求 | 2Gi | 最小内存需求 | +| 内存限制 | 4Gi | 最大内存限制 | +| CPU请求 | 1000m | 最小CPU需求 | +| CPU限制 | 2000m | 最大CPU限制 | + +## 端口映射 + +| 容器端口 | NodePort | 用途 | +|----------|----------|------| +| 80 | 30180 | HTTP Web访问 | +| 443 | 30443 | HTTPS Web访问 | +| 22 | 30122 | SSH Git访问 | + +## 常用管理命令 + +### 查看Pod状态 + +```bash +kubectl get pods -l app=gitlab +kubectl logs -f +``` + +### 重启服务 + +```bash +kubectl rollout restart deployment gitlab +``` + +### 扩容/缩容 + +```bash +# 扩容到2个副本 +kubectl scale deployment gitlab --replicas=2 + +# 缩容到1个副本 +kubectl scale deployment gitlab --replicas=1 +``` + +### 查看资源使用 + +```bash +kubectl top pods -l app=gitlab +``` + +### 备份数据 + +```bash +kubectl exec -it $(kubectl get pod -l app=gitlab -o jsonpath='{.items[0].metadata.name}') -- gitlab-backup create +``` + +## 故障排查 + +### Pod无法启动 + +#### ImagePullBackOff + +```bash +# 查看Pod详细信息 +kubectl describe pod + +# 手动拉取镜像 +docker pull gitlab/gitlab-ce:latest + +# 检查Docker镜像加速配置 +cat /etc/docker/daemon.json +``` + +#### ContainerCreating状态持续 + +```bash +# 检查PV/PVC状态 +kubectl get pv +kubectl get pvc + +# 检查存储目录权限 +ls -la /data/gitlab + +# 调整目录权限 +chmod -R 777 /data/gitlab +``` + +### 服务无法访问 + +```bash +# 检查Service状态 +kubectl get svc gitlab + +# 检查端口占用 +netstat -tlnp | grep 30180 + +# 检查防火墙 +iptables -L -n | grep 30180 +``` + +### 性能问题 + +```bash +# 检查资源使用 +kubectl top pods -l app=gitlab + +# 检查Pod日志 +kubectl logs + +# 调整资源限制 +kubectl edit deployment gitlab +``` + +## 维护建议 + +### 定期备份 + +建议配置定期备份策略,在Pod中配置cron任务或使用GitLab内置备份功能。 + +### 监控告警 + +建议配置以下监控指标: +- **资源使用率**: CPU、内存、磁盘 +- **Pod状态**: 运行状态、重启次数 +- **服务可用性**: 访问延迟、错误率 + +### 升级策略 + +1. **镜像升级**: 更新Deployment中的镜像版本 +2. **滚动更新**: 使用kubectl rollout实现零停机升级 +3. **备份回滚**: 升级前先备份,失败时快速回滚 + +```bash +# 滚动更新 +kubectl set image deployment/gitlab gitlab=gitlab/gitlab-ce:17.0.0 + +# 回滚 +kubectl rollout undo deployment/gitlab +``` + +## 版本信息 + +| 项目 | 版本 | +|------|------| +| 文档版本 | v1.0 | +| GitLab | latest | +| 更新日期 | 2026-01-09 | \ No newline at end of file diff --git a/CICD/Jenkins/README.md b/CICD/Jenkins/README.md new file mode 100644 index 0000000..492bba0 --- /dev/null +++ b/CICD/Jenkins/README.md @@ -0,0 +1,339 @@ +# Jenkins Kubernetes部署文档 + +本目录包含Jenkins在Kubernetes集群上的部署配置和文档。 + +## 部署配置 + +### jenkins-deployment.yaml + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: jenkins-pv +spec: + capacity: + storage: 20Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /data/jenkins + storageClassName: manual +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: jenkins-pvc + namespace: default +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi + storageClassName: manual +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: jenkins + namespace: default +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: jenkins +rules: +- apiGroups: [""] + resources: ["pods"] + verbs: ["create","delete","get","list","patch","update","watch"] +- apiGroups: [""] + resources: ["pods/exec"] + verbs: ["create","delete","get","list","patch","update","watch"] +- apiGroups: [""] + resources: ["pods/log"] + verbs: ["get","list","watch"] +- apiGroups: [""] + resources: ["secrets"] + verbs: ["get"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: jenkins +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: jenkins +subjects: +- kind: ServiceAccount + name: jenkins + namespace: default +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: jenkins + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: jenkins + template: + metadata: + labels: + app: jenkins + spec: + serviceAccountName: jenkins + containers: + - name: jenkins + image: jenkins/jenkins:lts + ports: + - containerPort: 8080 + name: http + - containerPort: 50000 + name: agent + env: + - name: JENKINS_OPTS + value: "--prefix=/jenkins" + - name: JAVA_OPTS + value: "-Xmx2048m" + volumeMounts: + - name: jenkins-data + mountPath: /var/jenkins_home + resources: + requests: + memory: "1Gi" + cpu: "500m" + limits: + memory: "2Gi" + cpu: "1000m" + volumes: + - name: jenkins-data + persistentVolumeClaim: + claimName: jenkins-pvc +--- +apiVersion: v1 +kind: Service +metadata: + name: jenkins + namespace: default +spec: + type: NodePort + ports: + - port: 8080 + targetPort: 8080 + nodePort: 30280 + name: http + - port: 50000 + targetPort: 50000 + nodePort: 30500 + name: agent + selector: + app: jenkins +``` + +## 部署步骤 + +### 1. 创建数据目录 + +```bash +mkdir -p /data/jenkins +``` + +### 2. 应用部署配置 + +将上述YAML配置保存为 `jenkins-deployment.yaml` 文件,然后执行: + +```bash +kubectl apply -f jenkins-deployment.yaml +``` + +### 3. 验证部署状态 + +```bash +# 查看Pod状态 +kubectl get pods -l app=jenkins + +# 查看Service状态 +kubectl get svc jenkins + +# 查看详细信息 +kubectl describe pod +``` + +## 访问地址 + +| 服务 | 端口 | 说明 | +|------|------|------| +| Web界面 | 30280 | Jenkins Web界面(http://节点IP:30280/jenkins) | +| Agent | 30500 | Jenkins Agent连接端口 | + +### 获取Jenkins初始密码 + +```bash +kubectl exec -it $(kubectl get pod -l app=jenkins -o jsonpath='{.items[0].metadata.name}') -- cat /var/jenkins_home/secrets/initialAdminPassword +``` + +首次访问Jenkins时,需要输入上述解锁密码,然后按照向导完成初始设置。 + +## 配置参数 + +| 参数 | 值 | 说明 | +|------|-----|------| +| 镜像 | jenkins/jenkins:lts | Jenkins LTS版本 | +| 数据目录 | /data/jenkins | HostPath存储路径 | +| 存储容量 | 20Gi | PV/PVC分配存储 | +| 内存请求 | 1Gi | 最小内存需求 | +| 内存限制 | 2Gi | 最大内存限制 | +| CPU请求 | 500m | 最小CPU需求 | +| CPU限制 | 1000m | 最大CPU限制 | +| 访问前缀 | /jenkins | URL访问路径前缀 | +| JVM堆内存 | -Xmx2048m | Java虚拟机堆内存设置 | + +### RBAC权限配置 + +Jenkins配置了以下Kubernetes集群权限: +- **Pods操作**: create, delete, get, list, patch, update, watch +- **Pods执行**: create, delete, get, list, patch, update, watch +- **Pods日志**: get, list, watch +- **Secrets**: get + +这些权限用于Jenkins在Kubernetes中执行CI/CD任务。 + +## 端口映射 + +| 容器端口 | NodePort | 用途 | +|----------|----------|------| +| 8080 | 30280 | Web界面 | +| 50000 | 30500 | Agent连接 | + +## 常用管理命令 + +### 查看Pod状态 + +```bash +kubectl get pods -l app=jenkins +kubectl logs -f +``` + +### 重启服务 + +```bash +kubectl rollout restart deployment jenkins +``` + +### 扩容/缩容 + +```bash +# 扩容到2个副本 +kubectl scale deployment jenkins --replicas=2 + +# 缩容到1个副本 +kubectl scale deployment jenkins --replicas=1 +``` + +### 查看资源使用 + +```bash +kubectl top pods -l app=jenkins +``` + +### 备份数据 + +```bash +kubectl exec -it $(kubectl get pod -l app=jenkins -o jsonpath='{.items[0].metadata.name}') -- tar czf /tmp/jenkins-backup.tar.gz /var/jenkins_home +``` + +## 故障排查 + +### Pod无法启动 + +#### ImagePullBackOff + +```bash +# 查看Pod详细信息 +kubectl describe pod + +# 手动拉取镜像 +docker pull jenkins/jenkins:lts + +# 检查Docker镜像加速配置 +cat /etc/docker/daemon.json +``` + +#### ContainerCreating状态持续 + +```bash +# 检查PV/PVC状态 +kubectl get pv +kubectl get pvc + +# 检查存储目录权限 +ls -la /data/jenkins + +# 调整目录权限 +chmod -R 777 /data/jenkins +``` + +### 服务无法访问 + +```bash +# 检查Service状态 +kubectl get svc jenkins + +# 检查端口占用 +netstat -tlnp | grep 30280 + +# 检查防火墙 +iptables -L -n | grep 30280 +``` + +### 性能问题 + +```bash +# 检查资源使用 +kubectl top pods -l app=jenkins + +# 检查Pod日志 +kubectl logs + +# 调整资源限制 +kubectl edit deployment jenkins +``` + +## 维护建议 + +### 定期备份 + +建议配置定期备份策略,配置Jenkins备份插件或定期导出配置。 + +### 监控告警 + +建议配置以下监控指标: +- **资源使用率**: CPU、内存、磁盘 +- **Pod状态**: 运行状态、重启次数 +- **服务可用性**: 访问延迟、错误率 + +### 升级策略 + +1. **镜像升级**: 更新Deployment中的镜像版本 +2. **滚动更新**: 使用kubectl rollout实现零停机升级 +3. **备份回滚**: 升级前先备份,失败时快速回滚 + +```bash +# 滚动更新 +kubectl set image deployment/jenkins jenkins=jenkins/jenkins:2.401.1 + +# 回滚 +kubectl rollout undo deployment/jenkins +``` + +## 版本信息 + +| 项目 | 版本 | +|------|------| +| 文档版本 | v1.0 | +| Jenkins | lts | +| 更新日期 | 2026-01-09 | \ No newline at end of file diff --git a/Containerd/Docs/Centos网络源安装Containerd.md b/Containerd/Docs/Centos网络源安装Containerd.md new file mode 100644 index 0000000..ddcae72 --- /dev/null +++ b/Containerd/Docs/Centos网络源安装Containerd.md @@ -0,0 +1,67 @@ +> 本文作者:丁辉 + +# Centos网络源安装Containerd + +1. 设置存储库 + + [阿里源配置文件](https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.4eac1b11shXBpr) + + ```bash + yum install -y yum-utils + yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + ``` + + > 国内 + > + > ```bash + > yum install -y yum-utils + > yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + > ``` + +2. 安装 + + ```bash + yum install -y containerd.io + ``` + +3. 备份配置文件并使用默认配置文件 + + ```bash + mv /etc/containerd/config.toml /etc/containerd/config.toml.bak + containerd config default > /etc/containerd/config.toml + ``` + +4. 修改驱动和镜像地址 + + ```bash + vi /etc/containerd/config.toml + ``` + + 内容如下(已更新为最新版配置方法,旧版层级不同) + + ```toml + [plugins] + ... + [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options] + SystemdCgroup = true # 修改这里用于配置容器运行时使用 systemd 作为 cgroup 驱动 的关键设置 + + [plugins.'io.containerd.cri.v1.images'.pinned_images] + sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10.1' + ``` + +5. 启动 + + ```bash + systemctl enable containerd + systemctl start containerd + systemctl status containerd + ``` + +6. 验证 + + ```bash + ctr info + ``` + + + diff --git a/Containerd/Docs/Crictl工具.md b/Containerd/Docs/Crictl工具.md new file mode 100644 index 0000000..0d5b2fc --- /dev/null +++ b/Containerd/Docs/Crictl工具.md @@ -0,0 +1,31 @@ +> 本文作者:丁辉 + +# Crictl工具 + +[Github](https://github.com/kubernetes-sigs/cri-tools/releases) + +## 开始安装 + +1. 下载软件 + + ```bash + wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.34.0/crictl-v1.34.0-linux-amd64.tar.gz + ``` + +2. 解压文件 + + ```bash + tar -zxvf crictl-v*-linux-amd64.tar.gz + ``` + +3. 安装 + + ```bash + install -o root -g root -m 0755 crictl /usr/local/bin/crictl + ``` + +4. 配置 crictl 配置文件 + + ```bash + curl -so /etc/crictl.yaml https://gitee.com/offends/Kubernetes/raw/main/Containerd/Files/crictl.yaml + ``` diff --git a/Containerd/Docs/Ctr基础命令.md b/Containerd/Docs/Ctr基础命令.md new file mode 100644 index 0000000..4d47137 --- /dev/null +++ b/Containerd/Docs/Ctr基础命令.md @@ -0,0 +1,44 @@ +> 本文作者:丁辉 + +# Ctr命令使用 + +- 查看镜像 + + ```bash + ctr -n k8s.io images ls + ``` + +- 更改镜像 TAG + + ```bash + ctr -n k8s.io image tag nginx:v1 nginx:v2 + ``` + +- 拉取镜像 + + ```bash + ctr -n k8s.io images pull docker.io/library/nginx:latest + ``` + + **更多参数** + + ```bash + ctr --debug=true i pull --hosts-dir=/etc/containerd/certs.d docker.io/library/nginx:latest + ``` + + | 参数部分 | 说明 | 详细解释 | + | :-------------------------------------: | :--: | :----------------------------------------------------------: | + | **--debug=true** | | - 启用详细日志输出 - 显示执行过程中的详细信息 - 便于故障排查 | + | **i** | | `images` 的缩写,表示进行镜像相关操作 | + | **pull** | | 拉取(下载)镜像到本地 | + | **--hosts-dir=/etc/containerd/certs.d** | | - 指定证书和注册表配置目录 - 用于配置私有注册表或镜像仓库的认证信息 - 可以覆盖默认的 registry 配置 | + | -k | | 忽略 TLS 验证过程中的证书错误 | + | --plain-http=true | | 此选项指明在拉取镜像时使用未加密的 HTTP 协议,而不是加密的 HTTPS | + +- 推送镜像 + + ```bash + ctr -n k8s.io image push -u <账户>:<密码> docker.io/library/nginx:latest + ``` + + \ No newline at end of file diff --git a/Containerd/Docs/Nerdctl工具.md b/Containerd/Docs/Nerdctl工具.md new file mode 100644 index 0000000..1b6402b --- /dev/null +++ b/Containerd/Docs/Nerdctl工具.md @@ -0,0 +1,65 @@ +> 本文作者:丁辉 + +# Nerdctl工具 + +[Github](https://github.com/containerd/nerdctl) + +## 开始安装 + +1. 下载软件 + + ```bash + wget https://github.com/containerd/nerdctl/releases/download/v2.2.0/nerdctl-2.2.0-linux-amd64.tar.gz + ``` + +2. 解压文件 + + ```bash + tar -zxvf nerdctl-*-linux-amd64.tar.gz + ``` + +3. 安装 + + ```bash + install -o root -g root -m 0755 nerdctl /usr/local/bin/nerdctl + ``` + +## 基本使用 + +- 查看 Containerd 镜像 + + ```bash + nerdctl -n k8s.io images + ``` + +- 登录镜像仓库 + + ```bash + nerdctl -n k8s.io login <仓库地址> -u <账号> -p<密码> + ``` + +- 退出镜像仓库登录 + + ```bash + nerdctl -n k8s.io logout <仓库地址> + ``` + +- 拉取镜像 + + ```bash + nerdctl -n k8s.io pull nginx:latest + ``` + +- 更改镜像 TAG + + ```bash + nerdctl -n k8s.io tag nginx:v1 nginx:v2 + ``` + +- 推送镜像 + + ```bash + nerdctl -n k8s.io push nginx:latest --insecure-registry + ``` + + > `--insecure-registry` 表示目标仓库是一个不安全的私有仓库,不需要进行TLS证书验证 \ No newline at end of file diff --git a/Containerd/Docs/Ubuntu网络源安装Containerd.md b/Containerd/Docs/Ubuntu网络源安装Containerd.md new file mode 100644 index 0000000..46c6836 --- /dev/null +++ b/Containerd/Docs/Ubuntu网络源安装Containerd.md @@ -0,0 +1,151 @@ +> 本文作者:丁辉 + +# Ubuntu网络源安装Containerd + +## Ubuntu部署Containerd配置Apt源 + +> 我部署 containerd 的时候遇到了各个版本 apt 源无法下载的问题,所以本次记录 Ubuntu 源配置步骤 + +### 安装必须源 + +```bash +apt -y install apt-transport-https ca-certificates curl software-properties-common +``` + +### Ubuntu 22.04(现代添加推荐方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + +echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +``` + +### Ubuntu 21.10(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu impish stable" +``` + +### Ubuntu 21.04(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu hirsute stable" +``` + +### Ubuntu 20.10 (传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu groovy stable" +``` + +### Ubuntu 20.04(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" +``` + +### Ubuntu 19.10 (传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu eoan stable" +``` + +### Ubuntu 19.04(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu disco stable" +``` + +### Ubuntu 18.10(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu cosmic test" +``` + +### Ubuntu 18.04(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" +``` + +### Ubuntu 17.10(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu artful stable" +``` + +### Ubuntu 16.04(传统添加方法) + +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" +``` + +## 开始安装 + +1. 更新包索引 + + ```bash + apt update + ``` + +2. 安装 Containerd + + ```bash + apt install containerd.io -y + ``` + +3. 配置 Containerd + + ```bash + mkdir -p /etc/containerd + ``` + + 使用默认配置文件 + + ```bash + containerd config default | tee /etc/containerd/config.toml + ``` + +4. 修改驱动和镜像地址 + + ```bash + vi /etc/containerd/config.toml + ``` + + 内容如下(已更新为最新版配置方法,旧版层级不同) + + ```toml + [plugins] + ... + [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options] + SystemdCgroup = true # 修改这里用于配置容器运行时使用 systemd 作为 cgroup 驱动 的关键设置 + + [plugins.'io.containerd.cri.v1.images'.pinned_images] + sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10.1' + ``` + +5. 启动 + + ```bash + systemctl enable containerd + systemctl start containerd + systemctl status containerd + ``` + +6. 验证 + + ```bash + ctr info + ``` + + diff --git a/Containerd/Docs/二进制安装Containerd.md b/Containerd/Docs/二进制安装Containerd.md new file mode 100644 index 0000000..02c4dea --- /dev/null +++ b/Containerd/Docs/二进制安装Containerd.md @@ -0,0 +1,87 @@ +> 本文作者:丁辉 + +# 二进制安装Containerd + +## 安装 Containerd + +[containerd软件包](https://github.com/containerd/containerd/releases) + +[cni插件包](https://github.com/containernetworking/plugins/releases) + +1. 下载二进制文件 + + ```bash + wget https://github.com/containerd/containerd/releases/download/v1.6.33/cri-containerd-cni-1.6.33-linux-amd64.tar.gz + ``` + +2. 解压 + + ```bash + mkdir containerd + tar -zxvf cri-containerd-cni-*-linux-amd64.tar.gz -C containerd + cd containerd + ``` + +3. 移动文件至安装目录 + + ```bash + \cp usr/local/bin/* /usr/local/bin/ + \cp etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service + mkdir /opt/cni/bin -p + \cp /root/containerd/opt/cni/bin/* /opt/cni/bin/ + ``` + +4. 备份配置文件 + + ```bash + mkdir /etc/containerd + containerd config default > /etc/containerd/config.toml + ``` + +5. 修改驱动和镜像地址 + + ```bash + vi /etc/containerd/config.toml + ``` + + 内容如下 + + ```toml + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] + ... + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] + SystemdCgroup = true #修改这里 + + [plugins."io.containerd.grpc.v1.cri"] + sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" + ``` + +6. 配置 crictl 配置文件 + + ```bash + curl -so /etc/crictl.yaml https://gitee.com/offends/Kubernetes/raw/main/Containerd/Files/crictl.yaml + ``` + +7. 启动 + + ```bash + systemctl enable containerd + systemctl start containerd + systemctl status containerd + ``` + +## 安装 RunC + +[Github软件包下载](https://github.com/opencontainers/runc/releases) + +1. 下载 + + ```bash + wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64 + ``` + +2. 安装 + + ```bash + install -m 755 runc.amd64 /usr/local/bin/runc + ``` diff --git a/Containerd/Docs/新版Containerd配置镜像加速.md b/Containerd/Docs/新版Containerd配置镜像加速.md new file mode 100644 index 0000000..a451d32 --- /dev/null +++ b/Containerd/Docs/新版Containerd配置镜像加速.md @@ -0,0 +1,99 @@ +> 本文作者:丁辉 + +# 新版Containerd配置镜像加速 + +[Public-Image-Mirror](https://github.com/DaoCloud/public-image-mirror) + +> 本文适用于 Containerd v2.2.0 版本添加镜像加速(备注:各版本添加镜像加速参数具有差异请对照好版本) +> +> 查看 Containerd 版本 `containerd --version` + +1. 查看是否存在镜像加速 + + ```bash + containerd config dump | grep -A 10 -B 5 "mirrors" + ``` + +2. 检查 Containerd 配置 + + ```bash + cat /etc/containerd/config.toml + ``` + + 保证有如下内容 + + ```toml + [plugins] + [plugins."io.containerd.grpc.v1.cri"] + ... + [plugins."io.containerd.grpc.v1.cri".registry] + config_path = "/etc/containerd/certs.d" + ``` + +3. 创建镜像加速读取目录 + + ```bash + mkdir -p /etc/containerd/certs.d + ``` + +4. 添加镜像加速 + + > 目录名称为需要加速的镜像官方地址 + + - docker.io + + 创建目录 + + ```bash + mkdir -p /etc/containerd/certs.d/docker.io + ``` + + 内容如下 + + ```toml + cat > /etc/containerd/certs.d/docker.io/hosts.toml < /etc/containerd/certs.d/docker.io/hosts.toml < 本文作者:丁辉 + +# 安装Containerd + +| 支持系统 | 支持架构 | +| :------: | :--------: | +| Centos* | x86、arm64 | +| Ubuntu* | x86、arm64 | + +## 极简模式 + +> 直接二进制安装最新版 Containerd + +```bash +curl -sfL https://gitee.com/offends/Kubernetes/raw/main/Containerd/install.sh | bash -s all_curl +``` + +## 多功能模式 + +```bash +git clone https://gitee.com/offends/Kubernetes.git && cd Kubernetes/Containerd +``` + +**参数解释** + +| 脚本参数 | 作用 | 用法 | +| -------------- | ------------------------------ | --------------------------- | +| binary | 二进制安装 Containerd 最新版本 | ./install.sh binary | +| packagemanager | 网络安装 Containerd 最新版本 | ./install.sh packagemanager | + +**包管理器安装切换网络源加速 ("binary" 和 "packagemanager" 均可使用以下参数)** + +- 使用官方加速 + + ```bash + export INSTALL_NETWORK=default + ``` +- 使用阿里国加速 [默认] + + ```bash + export INSTALL_NETWORK=aliyun + ``` + +**二进制文件下载地址替换 ("binary" 可使用以下参数)** + +> 文件格式需要为 `cri-containerd-*-linux-*.tar.gz` 类似于此格式 * 部分可使用版本和架构补充。 + +- 指定版本下载 (默认从 Github 仓库下载, 默认版本为: "1.7.18") + + ```bash + export CONTAINERD_VERSION="1.7.18" + ``` + +- 指定二进制文件包下载地址 + + ```bash + export OFFENDS_URL="" + ``` + + > 示例 + > + > ```bash + > export OFFENDS_URL="https://minio.com/cri-containerd-*-linux-amd64.tar.gz" + > ``` + + diff --git a/Containerd/install.sh b/Containerd/install.sh new file mode 100644 index 0000000..fe33eee --- /dev/null +++ b/Containerd/install.sh @@ -0,0 +1,220 @@ +#!/bin/bash + +############################################################################################# +# 用途: 多功能部署 Containerd 脚本 +# 作者: 丁辉 +# 编写时间: 2023-12-29 +# 更新时间: 2024-01-26 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) +CHECK_CPU +# 变量 +SCRIPT_VERSION="1.0.0" +INSTALL_NETWORK=${INSTALL_NETWORK:-aliyun} +# Containerd 版本 +CONTAINERD_VERSION=${CONTAINERD_VERSION:-1.7.18} +# Github下载加速 +GIT_PROXY="https://mirror.ghproxy.com" +URL="https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/cri-containerd-cni-${CONTAINERD_VERSION}-linux-${ARCH_TYPE_2}.tar.gz" + +# --help 帮助信息 +function HELP(){ + echo "Usage: script_name [OPTIONS] [ARGUMENTS]" + echo "" + echo "Description:" + echo " Offends" + echo "" + echo "Options:" + echo " -h, --help 显示此帮助信息" + echo " -v, --version 显示当前脚本版本号" + echo " all_curl 省心网络安装,所有文件都会从网络 curl 下载" + echo " binary 二进制安装 Containerd 最新版本" + echo " packagemanager 网络安装 Containerd 最新版本" + echo "" + echo "Examples:" + echo " 示例 1: ./install.sh all_curl" + echo " 示例 1: ./install.sh binary" + echo " 示例 2: ./install.sh packagemanager" + exit 0 +} + +# 在线安装 +function INSTALL_CONTAINERD(){ + if [ $# -eq 1 ]; then + while true; do + case $1 in + all_curl) + INSTALL_0 + break + ;; + binary) + SEND_INFO "您选择的安装方式为: 二进制安装 Containerd 最新版本" + INSTALL_1 + break + ;; + packagemanager) + SEND_INFO "您选择的安装方式为: 网络安装 Containerd 最新版本" + INSTALL_2 + break + ;; + --help|-h) + HELP + ;; + --version|-v) + SEND_INFO "当前脚本版本号为: $SCRIPT_VERSION" + break + ;; + *) + SEND_ERROR "参数错误" + HELP + ;; + esac + done + else + SEND_ERROR "参数错误" + HELP + fi +} + +function INSTALL_0(){ + IF_LINUX + INIT_CONTAINERD + CURL_FILE +} + + +function INSTALL_1(){ + CHECK_INSTALL wget + SEND_INFO "正在下载 Containerd 二进制文件包[Github],网络较慢请稍后..." + if [ ${INSTALL_NETWORK} = "default" ]; then + SEND_INFO "您选择的网络为: 默认网络" + BINARY_URL=${OFFENDS_URL:-$URL} + elif [ ${INSTALL_NETWORK} = "aliyun" ]; then + SEND_INFO "您选择的网络为: 阿里云网络加速" + BINARY_URL=${OFFENDS_URL:-$GIT_PROXY/$URL} + fi + wget ${BINARY_URL} + if [ $? -ne 0 ]; then + SEND_ERROR "下载 Containerd 二进制文件包失败,请检查网络" + exit 1 + fi + CHECK_DIR "./containerd" + CHECK_COMMAND_NULL tar -zxvf cri-containerd-*-linux-*.tar.gz -C containerd + BASE_FILES +} + +function INSTALL_2(){ + IF_LINUX + INIT_CONTAINERD + CP_FILE +} + +function BASE_FILES(){ + SEND_INFO "正在初始化文件" + CHECK_COMMAND_NULL \\cp containerd/usr/local/bin/* /usr/local/bin/ + CHECK_COMMAND_NULL \\cp containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service + CHECK_DIR "/opt/cni/bin" + # CHECK_COMMAND_NULL \\cp containerd/opt/cni/bin/* /opt/cni/bin/ + CHECK_DIR "/etc/containerd" + CHECK_COMMAND_NULL rm -rf ./containerd + CHECK_COMMAND_NULL rm -rf ./cri-containerd-*-linux-*.tar.gz + INIT_CONTAINERD + CP_FILE +} + +function IF_LINUX(){ + log_file="/tmp/check_install_log" + if command -v yum >/dev/null 2>&1; then + SEND_INFO "正在准备包,根据网络情况可能需要几分钟,请稍后..." + yum install -y yum-utils >>"$log_file" 2>&1 + if [ $? -ne 0 ]; then + SEND_ERROR "安装 yum-utils 失败,请查看日志" + tail -n 10 "$log_file" # 输出最后10行日志 + rm -rf $log_file + exit 1 + fi + if [ ${INSTALL_NETWORK} = "default" ]; then + SEND_INFO "您选择的网络为: 默认网络" + CHECK_COMMAND_NULL yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + yum install containerd.io -y + elif [ ${INSTALL_NETWORK} = "aliyun" ]; then + SEND_INFO "您选择的网络为: 阿里云网络" + CHECK_COMMAND_NULL yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + yum install containerd.io -y + fi + elif command -v apt >/dev/null 2>&1; then + SEND_INFO "正在准备包,根据网络情况可能需要几分钟,请稍后..." + if [ ${INSTALL_NETWORK} = "default" ]; then + SEND_INFO "您选择的网络为: 默认网络" + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg + CHECK_COMMAND_NULL chmod a+r /etc/apt/keyrings/docker.gpg + + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + + CHECK_COMMAND_NULL apt-get update + apt-get install containerd.io -y + elif [ ${INSTALL_NETWORK} = "aliyun" ]; then + SEND_INFO "您选择的网络为: 阿里云网络" + curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - + # add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" + # 设置 Docker 源地址 + docker_repo="deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" + # 添加 Docker 源并自动回车确认 + echo -e "\n" | sudo add-apt-repository "$docker_repo" + CHECK_COMMAND_NULL apt-get update + apt-get install containerd.io -y + fi + else + SEND_ERROR "无法识别的系统软件包管理工具" + exit 1 + fi +} + + +function INIT_CONTAINERD(){ + SEND_INFO "正在初始化 Containerd" + CHECK_COMMAND_NULL containerd config default \> /etc/containerd/config.toml + sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml + sed -i 's|sandbox_image[[:space:]]*=[[:space:]]*".*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"|g' /etc/containerd/config.toml +} + +function CP_FILE(){ + CHECK_COMMAND_NULL \\cp ./Files/crictl.yaml /etc/crictl.yaml +} + +function CURL_FILE(){ + curl -so /etc/crictl.yaml https://gitee.com/offends/Kubernetes/raw/main/Containerd/Files/crictl.yaml +} + +function START_CONTAINERD(){ + SEND_INFO "正在启动 Containerd 服务" + CHECK_COMMAND_NULL systemctl daemon-reload + CHECK_COMMAND_NULL systemctl enable containerd + CHECK_COMMAND_NULL systemctl start containerd + SEND_INFO "Containerd 服务启动成功" +} + +# 检测某个systemd服务是否存在 +function CHECK_SYSTEMD(){ + if ! command -v containerd >/dev/null 2>&1; then + INSTALL_CONTAINERD $@ + START_CONTAINERD + else + SEND_INFO "Containerd 服务已安装,版本为: $(containerd --version | awk '{print $3}')" + if ! systemctl status containerd >/dev/null 2>&1; then + SEND_WARN "Containerd 服务未启动,正在启动 Containerd 服务" + if ! systemctl start containerd >/dev/null 2>&1; then + SEND_ERROR "Containerd 服务启动失败,请检查日志排查错误" + exit 1 + else + SEND_INFO "Containerd 服务启动成功" + fi + fi + fi +} + +CHECK_SYSTEMD $@ \ No newline at end of file diff --git a/Docker/Builder/Buildkit/README.md b/Docker/Builder/Buildkit/README.md new file mode 100644 index 0000000..e5adb62 --- /dev/null +++ b/Docker/Builder/Buildkit/README.md @@ -0,0 +1,359 @@ +> 本文作者:丁辉 + +# Buildkit构建镜像 + +## 最小化使用 Buildkit 构建镜像 + +1. 修改 docker 守护进程配置 + + ```bash + vi /etc/docker/daemon.json + ``` + +2. 加入 + + ```bash + { + "features": { + "buildkit": true + } + } + ``` + + 重载 docker + + ```bash + systemctl daemon-reload && systemctl reload docker + ``` + + > 如果报错提示需要安装 Buildx , 则查看 [BUILDX安装](https://gitee.com/offends/Kubernetes/tree/main/Docker/Builder/Buildx/README.md) 安装一下 + +3. 构建镜像 + + ```bash + DOCKER_BUILDKIT=1 docker build --no-cache -t app:v1 . + ``` + + +## 使用完全体 Buildkit 构建镜像 + +[官方文档](https://docs.docker.com/build/buildkit/) + +### 安装 + +1. 克隆代码 + + ```bash + git clone https://gitee.com/offends/Kubernetes.git + cd Kubernetes/Docker/Builder/Buildkit + ``` + +2. 安装 Buildkit + + > 这里使用 . 执行脚本否则需要手动执行 `source /etc/profile` + + ```bash + . install.sh + ``` + +3. 安装 Buildx(非必选, 如果不希望安装Buildx, 则直接看文档"基础命令"部分来构建镜像) + + 查看此文档: [BUILDX安装](https://gitee.com/offends/Kubernetes/tree/main/Docker/Builder/Buildx/README.md) + +### Dockerfile 写法介绍 + +> Dockerfile `# syntax = docker/dockerfile:<声明>` 是必加的 + +[官方文档](https://docs.docker.com/build/dockerfile/frontend/#custom-dockerfile-syntax) + +1. `# syntax=docker/dockerfile:1`: + + 这个指令指定了 Dockerfile 使用的语法版本。在这个例子中,`:1` 表示使用 Dockerfile 的第一个版本。这个版本引入了基本的 Dockerfile 功能,是最基础的语法规则。它是 Dockerfile 的最低版本,提供了最基本的指令和结构,不包含较新的特性。 + +2. `# syntax = docker/dockerfile:experimental`: + + 这个语法声明告诉 Docker 使用实验性特性来解析 Dockerfile。`experimental` 标记引入了一些实验性的功能,可能包含一些不稳定或尚未广泛测试的功能,允许使用一些较新的、可能还不是标准的 Dockerfile 特性。使用这个标记可以在 Dockerfile 中尝试新的、实验性的功能。 + +### 挂载缓存目录 cache + +> 这里是通过存储 Docker 缓存当中实现的,咱们通过两次构建演示过程 + +1. 编写 Dockerfile + + ```bash + vi Dockerfile + ``` + + - 第一次构建 + + ```dockerfile + # syntax = docker/dockerfile:1 + FROM alpine + + RUN --mount=type=cache,target=/data,id=file_dir,sharing=locked \ + echo "hello" >> /data/file.txt + ``` + + - 第二次构建 + + ```dockerfile + # syntax = docker/dockerfile:1 + FROM alpine + + RUN --mount=type=cache,target=/data,id=file_dir,sharing=locked \ + echo "hello-2" >> /data/file.txt; \ + cp /data/file.txt / + ``` + +2. 开始构建 + + ```bash + docker build -t app:v1 . + ``` + +3. 检查结果 + + ```bash + docker run -it --rm app:v1 sh + cat file.txt + ``` + + > 发现有两行内容则代表容器第二次构建已经使用到缓存了 + +**参数解释** + +| 参数 | 描述 | +| ------- | --------------------------------------------------- | +| id | 用于标识不同缓存的可选ID。默认为目标值。 | +| target1 | 挂载路径。 | +| ro | 如果设置,只读。 | +| sharing | 其中一个 shared、private 或 locked。默认为 shared。 | +| from | 用作缓存挂载基础的构建阶段。默认为空目录。 | +| source | 要挂载的源自 from 的子路径。默认为 from 的根目录。 | +| mode | 新缓存目录的文件模式(八进制)。默认为 0755。 | +| uid | 新缓存目录的用户ID。默认为 0。 | +| gid | 新缓存目录的组ID。默认为 0。 | + +**sharing参数** + +1. **Shared (shared)**: 这是默认设置。在共享模式下,多个写入者可以同时使用相同的缓存挂载。这意味着多个构建可以同时读取和写入缓存数据。 +2. **Private (private)**: 当设置为私有模式时,如果存在多个写入者,它会为每个写入者创建一个新的挂载。这样可以避免并发写入的冲突,但也可能导致存储空间的浪费。 +3. **Locked (locked)**: 锁定模式会暂停第二个写入者的操作,直到第一个写入者释放挂载。这确保了在任何给定时刻只有一个写入者能够访问缓存挂载,从而避免了并发写入的问题,但也可能导致构建延迟。 + +### 挂载文件 bind + +> 将一个镜像或上一构建阶段的文件挂载到指定位置 + +1. 编写 Dockerfile + + ```bash + vi Dockerfile + ``` + + 内容如下 + + ```dockerfile + # syntax = docker/dockerfile:1 + FROM alpine AS builder + + RUN apk add git \ + && git clone https://gitee.com/offends/Docs.git \ + && tar -cvf Docker-Template.tar ./Docker-Template + + FROM alpine + + # 挂载上一构建阶段文件 + RUN --mount=type=bind,from=builder,source=/Docker-Template.tar,target=/Docker-Template.tar \ + cp /Docker-Template.tar /Docker-Template.tar.bak + + # 挂载另一个镜像的文件 + RUN --mount=type=bind,from=nginx:alpine-slim,source=/etc/nginx/nginx.conf,target=/nginx.conf \ + cp /nginx.conf /nginx.conf.bak + ``` + +2. 开始构建 + + ```bash + docker build -t app:v1 . + ``` + +3. 检查结果 + + ```bash + docker run -it --rm app:v1 sh + ls + ``` + + > / 目录下存在 nginx.conf.bak 和 Docker-Template.tar.bak 则代表成功 + +### 挂载文件系统 tmpfs + +> 将文件系统挂载到指定位置 + +1. 编写 Dockerfile + + ```bash + vi Dockerfile + ``` + + 内容如下 + + ```dockerfile + # syntax = docker/dockerfile:1 + FROM alpine + + RUN --mount=type=tmpfs,size=100m,target=/temp \ + echo "hello" > /temp/file.txt + ``` + +2. 开始构建 + + ```bash + docker build -t app:v1 . + ``` + +3. 检查结果 + + ```bash + docker run -it --rm app:v1 sh + ls /temp + ``` + + > 没有文件则正确,因为在 RUN 执行完命令之后挂载的文件系统将会被卸载 + +### 加密内容管理 + +> 为了更好的看到效果我们拿创建目录 hello-file 举例 + +#### 示例一(加密文件挂载) + +[官网文档](https://docs.docker.com/engine/reference/builder/#run---mounttypesecret) + +1. 编写挂载文件 + + ```bash + cat > file_secret < 看到 / 下存在 hello-file 目录,并且挂载的 file_secret 也消失了,则代表加密内容已成功传入。 + +#### 示例二(加密变量传入) + +[官网文档](https://docs.docker.com/engine/reference/commandline/buildx_build/#env) + +1. 编写 Dockerfile + + ```bash + vi Dockerfile + ``` + + 内容如下 + + ```dockerfile + # syntax = docker/dockerfile:1 + FROM alpine + + RUN --mount=type=secret,id=env_secret,target=/run/secrets/env_secret \ + mkdir $(cat /run/secrets/env_secret) + ``` + +2. 开始构建 + + ```bash + env_secret=hello-file docker buildx build --no-cache --secret id=env_secret -t app:v1 --load . + ``` + +### SSH 密钥管理 + +[官网文档]() + +> gitee 仓库举例 + +1. 编写 Dockerfile + + ```bash + vi Dockerfile + ``` + + 内容如下 + + ```dockerfile + # syntax = docker/dockerfile:1 + FROM alpine + + # 如果是Github 则使用 github.com + RUN apk add --no-cache openssh-client git \ + && mkdir -p -m 0600 ~/.ssh && ssh-keyscan gitee.com >> ~/.ssh/known_hosts + + RUN --mount=type=ssh git clone git@gitee.com:offends/Docker.git + ``` + +2. 开始构建 + + ```bash + docker build --ssh default=~/.ssh/id_rsa -t app:v1 . + ``` + +# 基础命令 + +1. 清理缓存 + + ```bash + docker builder prune + ``` + +2. 构建镜像并打包 + + > 镜像不会存在于 docker images 内,用于单纯的打包最好不过了 + + ```bash + buildctl build \ + --frontend=dockerfile.v0 \ + --local context=. \ + --local dockerfile=. \ + --output type=docker,name=app:v1,dest=image.tar + ``` + + +**参数解释** + +| 参数 | 描述 | +| ----------------------------------------------- | ------------------------------------------------------------ | +| --frontend=dockerfile.v0 | 使用的构建前端,这里是 Dockerfile 的版本。 | +| --local context=. | 指定本地上下文路径,即构建过程中使用的上下文路径(当前目录)。 | +| --local dockerfile=. | 指定本地 Dockerfile 路径,即 Dockerfile 所在的路径(当前目录)。 | +| --output type=docker,name=app:v1,dest=image.tar | 输出设置,指定输出的类型为 Docker 镜像(type=docker),镜像的名称为 app:v1(name=app:v1),输出目标为 image.tar 文件(dest=image.tar)。 | + + + diff --git a/Docker/Builder/Buildkit/buildkitd.service b/Docker/Builder/Buildkit/buildkitd.service new file mode 100644 index 0000000..dec20bd --- /dev/null +++ b/Docker/Builder/Buildkit/buildkitd.service @@ -0,0 +1,13 @@ +[Unit] +Description=buildkitd +# 指定了在系统启动时该服务应该在 network.target 启动后才启动。这确保了服务在网络可用后才会被启动 +After=network.target + +[Service] +Type=notify +ExecStart=/usr/local/buildkit/bin/buildkitd +# ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true + +[Install] +# 指明了在系统进入 multi-user.target 时(通常是完全启动并准备好用户登录的状态)启用这个服务 +WantedBy=multi-user.target \ No newline at end of file diff --git a/Docker/Builder/Buildkit/buildkitd.toml b/Docker/Builder/Buildkit/buildkitd.toml new file mode 100644 index 0000000..a6c6a3c --- /dev/null +++ b/Docker/Builder/Buildkit/buildkitd.toml @@ -0,0 +1,10 @@ +[worker.oci] + gc = true + gckeepstorage = 10000 + [[worker.oci.gcpolicy]] + keepBytes = 512000000 + keepDuration = 172800 + filters = [ "type==source.local", "type==exec.cachemount", "type==source.git.checkout"] + [[worker.oci.gcpolicy]] + all = true + keepBytes = 1024000000 \ No newline at end of file diff --git a/Docker/Builder/Buildkit/install.sh b/Docker/Builder/Buildkit/install.sh new file mode 100644 index 0000000..1f1fbf8 --- /dev/null +++ b/Docker/Builder/Buildkit/install.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +############################################################################################# +# 用途: 安装 Buildkit 脚本 +# 作者: 丁辉 +# 编写时间: 2023-12-05 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +function CHECK(){ + # 官方下载仓库: https://github.com/moby/buildkit/releases/ + VERSION="v0.12.4" + DIR="/usr/local/buildkit" + + URL="https://github.com/moby/buildkit/releases/download/$VERSION/buildkit-$VERSION.linux-$ARCH_TYPE_2.tar.gz" + BIN_NAME="Buildkit" + CHECK_BIN "$DIR/bin/buildctl" +} + +# 引用 check_bin 变量不存在则安装 +function CHECK_BIN_INSTALL(){ + if [ "$INSTALL_BIN" = false ]; then + CHECK_INSTALL wget + SEND_INFO "正在安装 $BIN_NAME,请稍后" + CHECK_DIR "$DIR" + CHECK_COMMAND_NULL wget $URL + CHECK_COMMAND_NULL tar -xf buildkit-v*.linux-$ARCH_TYPE_2.tar.gz -C /usr/local/buildkit + CHECK_COMMAND_NULL echo 'export PATH=/usr/local/buildkit/bin:$PATH' \>\> /etc/profile + CHECK_COMMAND_NULL source /etc/profile + CHECK_SYSTEMD_FILE + CHECK_COMMAND_NULL systemctl daemon-reload + CHECK_COMMAND_NULL systemctl enable --now buildkitd + SEND_INFO "正在清理文件" + CHECK_COMMAND_NULL rm -rf buildkit-v*.linux-$ARCH_TYPE_2.tar.gz + SEND_INFO "$BIN_NAME 版本: $(buildkitd --version | grep -o 'v[0-9]\+\(\.[0-9]\+\)\{2\}')" + + else + SEND_INFO "$BIN_NAME 已安装" + CHECK_SYSTEMD buildkitd + SEND_INFO "$BIN_NAME 版本: $(buildkitd --version | grep -o 'v[0-9]\+\(\.[0-9]\+\)\{2\}')" + fi +} + +# 官方 toml 参数文档: https://docs.docker.com/build/buildkit/toml-configuration/ +function CHECK_SYSTEMD_FILE(){ + CHECK_COMMAND_NULL \\cp ./buildkitd.service /usr/lib/systemd/system/buildkitd.service + CHECK_DIR "/etc/buildkit/" + CHECK_COMMAND_NULL \\cp ./buildkitd.toml /etc/buildkit/buildkitd.toml +} + +function ALL(){ + CHECK_SYSTEMD docker + CHECK_CPU + CHECK + CHECK_BIN_INSTALL +} + +ALL \ No newline at end of file diff --git a/Docker/Builder/Buildx/Dockerfile b/Docker/Builder/Buildx/Dockerfile new file mode 100644 index 0000000..f2344f7 --- /dev/null +++ b/Docker/Builder/Buildx/Dockerfile @@ -0,0 +1,5 @@ +FROM --platform=$TARGETPLATFORM alpine + +RUN echo "Startup success" > /os.txt + +CMD tail -f /os.txt \ No newline at end of file diff --git a/Docker/Builder/Buildx/README.md b/Docker/Builder/Buildx/README.md new file mode 100644 index 0000000..0b4b4de --- /dev/null +++ b/Docker/Builder/Buildx/README.md @@ -0,0 +1,138 @@ +> 本文作者:丁辉 + +# BUILDX构建镜像 + +## 安装 + +1. 克隆代码 + + ```bash + git clone https://gitee.com/offends/Kubernetes.git + cd Kubernetes/Docker/Builder/Buildx + ``` + +2. 安装 + + ```bash + ./install.sh + ``` + +## 手动构建 + +1. 编写 Dockerfile + + ```dockerfile + # vi Dockerfile + FROM --platform=$TARGETPLATFORM alpine + + RUN echo "Startup success" > /os.txt + + CMD tail -f /os.txt + ``` + +2. 创建了一个名为 "buildx" 的构建器 + + ```bash + docker buildx create --use --name=buildx --driver docker-container --driver-opt image=moby/buildkit:buildx-stable-1 + ``` + +**参数解释** + +| 参数 | 说明 | +| ------------------------------ | ------------------------------------------------------------ | +| `--use` | 将新构建器设置为当前活动的构建器(默认构建器) | +| `--name=buildx` | 指定新构建器的名称为 "buildx" | +| `--driver docker` | 指定使用的驱动程序为 "docker" | +| `--driver-opt image=...` | 指定驱动程序选项,此处是指定 BuildKit 镜像的位置为 "moby/buildkit:buildx-stable-1" | +| `--config /etc/buildkitd.toml` | 指定配置文件 | + +3. 构建多架构镜像并推送镜像仓库 + + **示例** + + > 举例仓库地址为 "offends" + + - 第一种方式(简单) + + ```bash + docker buildx build --platform linux/amd64,linux/arm/v7 -t offends/app:v1 . --push + ``` + + - 第二种方式 + + ```bash + docker buildx build --platform linux/amd64,linux/arm/v7 -t offends/app:v1 --output type=registry,dest=offends . + ``` + + > 查看 buildx 当前可构建架构 + > + > ```bash + > docker buildx ls + > ``` + +**参数解释** + +| 参数 | 解释 | +| -------------------------------------------- | ------------------------------------------------------------ | +| `docker buildx build` | 执行 Buildx 构建的命令 | +| `--platform linux/amd64,linux/arm/v6` | 指定要构建的目标平台,这里包括 Linux AMD64 和 ARMv6 | +| `-t app:v1` | 为构建的镜像设置标签为 "app:v1" | +| `-f ./Dockerfile` | 指定要使用的 Dockerfile 文件路径 | +| `.` | 构建上下文的路径,表示当前目录是构建上下文,其中包含了构建镜像所需的文件和指令 | +| `--output type=local,dest=.docker` | 指定输出类型为本地,并将构建结果输出到名为 `.docker` 的目录中 | +| `--output type=oci,dest=` | 将构建结果输出为 OCI 格式的镜像包,并保存到指定路径 | +| `--output type=docker,dest=` | 将构建结果输出为 Docker 格式的镜像包,并保存到指定路径 | +| `--output type=image,name=` | 将构建的镜像推送到指定的镜像仓库,指定镜像名称 | +| `--output type=registry,dest=` | 将构建的镜像推送到指定的镜像仓库地址 | +| `--push` | 将构建的镜像推送到指定的镜像仓库 | + +### 常用命令 + +- 删除构建器 + + ```bash + docker buildx rm <构建器名称> + ``` + +- 设置默认构建器 + + ```bash + docker buildx use <构建器名称> + ``` + +- 检查 Docker Buildx 构建器的详细信息 + + ```bash + docker buildx inspect + ``` + + + +# 使用脚本构建镜像并推送仓库 + +> 前提条件: +> +> 1. 已安装 Buildx, 安装脚本: [BUILDX安装](https://gitee.com/offends/Kubernetes/tree/main/Docker/Builder/Buildx/README.md) +> +> 2. 登录一个可推送镜像的仓库 +> +> ```bash +> docker login <仓库地址> -u <用户名> -p<密码> +> ``` +> +> 3. 根据自己需求添加架构 +> +> 4. 配置变量 + +```bash +export PLATFORM="linux/amd64,linux/arm/v6" +# 这里的仓库地址需要是一个可推送的镜像仓库才行,否则将推送失败 +export IMAGE_NAME=<仓库地址>/<镜像名> +export IMAGE_TAG=<镜像标签> +``` + +开始构建 + +```bash +./build.sh +``` diff --git a/Docker/Builder/Buildx/build.sh b/Docker/Builder/Buildx/build.sh new file mode 100644 index 0000000..f7dffea --- /dev/null +++ b/Docker/Builder/Buildx/build.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +############################################################################################# +# 用途: 构建 Dockerfile 脚本 +# 作者: 丁辉 +# 编写时间: 2023-11-27 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +# 创建 buildx +function CREATE_BUILDX(){ + # 国内镜像 + # --driver-opt dockerpracticesig/buildkit:master + # --driver-opt dockerpracticesig/buildkit:master-tencent + CHECK_COMMAND_NULL docker buildx create --use --name=buildx --driver docker-container --driver-opt image=moby/buildkit:buildx-stable-1 + CHECK_COMMAND_TRUE "创建 buildx 成功" "创建 buildx 失败,请根据错误信息检查" +} + +# 开始构建镜像 +function BUILD_IMAGE(){ + # 构建镜像 + CHECK_COMMAND_NULL docker buildx build --platform ${PLATFORM} -t ${IMAGE_NAME}:${IMAGE_TAG} . --push + CHECK_COMMAND_TRUE "构建镜像成功" "构建镜像失败,请根据错误信息检查" + NULL_TRUE docker buildx rm buildx + GREEN_PRINTF "构建镜像完成,查看镜像架构信息: \n$(docker buildx imagetools inspect ${IMAGE_NAME}:${IMAGE_TAG} | grep Platform: | grep -v unknown/unknown | awk -F " " '{print $2}')" +} + +function ALL(){ + # 检测是否安装 Docker + CHECK_SYSTEMD docker + CREATE_BUILDX + BUILD_IMAGE +} + +ALL \ No newline at end of file diff --git a/Docker/Builder/Buildx/install.sh b/Docker/Builder/Buildx/install.sh new file mode 100644 index 0000000..bc159a1 --- /dev/null +++ b/Docker/Builder/Buildx/install.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +############################################################################################# +# 用途: 安装 Buildx 脚本 +# 作者: 丁辉 +# 编写时间: 2023-11-27 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +function CHECK(){ + # 官方下载仓库: https://github.com/docker/buildx/releases + VERSION="v0.12.0" + DIR="/root/.docker/cli-plugins" + + URL="https://github.com/docker/buildx/releases/download/$VERSION/buildx-$VERSION.linux-$ARCH_TYPE_2" + BIN_NAME="Buildx" + CHECK_BIN "$DIR/docker-buildx" +} + +# 引用 check_bin 变量不存在则安装 +function CHECK_BIN_INSTALL(){ + if [ "$INSTALL_BIN" = false ]; then + CHECK_INSTALL wget + SEND_INFO "正在安装 $BIN_NAME,请稍后" + CHECK_DIR "$DIR" + CHECK_COMMAND_NULL wget $URL + CHECK_COMMAND_NULL mv buildx-v*.linux-amd64 ~/.docker/cli-plugins/docker-buildx + CHECK_COMMAND_NULL chmod +x ~/.docker/cli-plugins/docker-buildx + SEND_INFO "Buildx 版本: $(docker buildx version | awk '{print $2}')" + + else + SEND_INFO "$BIN_NAME 已安装" + SEND_INFO "Buildx 版本: $(docker buildx version | awk '{print $2}')" + fi +} + +# function CHECK_BIN_INSTALL_MAN(){ +# export DOCKER_BUILDKIT=1 +# docker build --platform=local -o . git://github.com/docker/buildx +# } + +# 添加模拟架构 +function RUN_BINFMT(){ + SEND_INFO "正在添加模拟架构" + CHECK_COMMAND_NULL docker run --privileged --rm tonistiigi/binfmt --install all + SEND_INFO "添加模拟架构完成,查看架构信息: docker buildx ls" +} + +function ALL(){ + CHECK_SYSTEMD docker + CHECK_CPU + CHECK + CHECK_BIN_INSTALL + CHECK_CORE + RUN_BINFMT +} + +ALL \ No newline at end of file diff --git a/Docker/Compose/Docs/Docker-Compose容器安全配置.md b/Docker/Compose/Docs/Docker-Compose容器安全配置.md new file mode 100644 index 0000000..67f206a --- /dev/null +++ b/Docker/Compose/Docs/Docker-Compose容器安全配置.md @@ -0,0 +1,35 @@ +> 本文作者:丁辉 + +# Docker-Compose容器安全配置 + +- **security_opt** + + `security_opt` 选项用于调整容器的安全配置。这个选项允许管理员覆盖或增加默认的安全设置,提供了更多的安全控制。其中一个常见的用途是 `no-new-privileges` 标志。no-new-privileges: 设置为 `true` 时,这个标志阻止容器获取任何新的权限。这意味着即使容器内的应用或用户尝试通过如 `setuid` 等方式提升权限,也会被系统阻止。这是一个防止权限提升攻击的重要安全措施。例如,如果一个容器运行的应用被攻破,攻击者将不能通过提升权限来进一步控制宿主机或其他容器。 + + **示例** + + ```bash + services: + nginx: + image: nginx:latest + container_name: nginx + security_opt: + - no-new-privileges:true + ``` + +- **cap_drop** + + `cap_drop` 选项用于删除容器的Linux能力。Linux能力是一种精细控制权限的机制,它允许将传统的root权限分解为更小的单元,每个单元控制一个特定的权限。ALL: 使用 `cap_drop: - ALL` 表示放弃所有预定义的能力。这将限制容器内进程的权限,即使它以 root 用户运行,也不能执行某些特权操作,例如修改系统文件、更改网络配置等。这种做法最大限度地减少了容器被滥用的风险,并增加了攻击者通过容器获得宿主机控制权的难度。 + + **示例** + + ```bash + services: + nginx: + image: nginx:latest + container_name: nginx + cap_drop: + - ALL + ``` + +通过使用这些选项,Docker管理员可以显著提升容器的安全性,避免容器成为攻击者突破系统安全的突破口。这些措施尤其适用于运行不信任的代码或在多租户环境中运行的容器。 \ No newline at end of file diff --git a/Docker/Compose/Docs/Docker-Compose部署Simplex服务器SMPXFTP服务.md b/Docker/Compose/Docs/Docker-Compose部署Simplex服务器SMPXFTP服务.md new file mode 100644 index 0000000..dac2089 --- /dev/null +++ b/Docker/Compose/Docs/Docker-Compose部署Simplex服务器SMPXFTP服务.md @@ -0,0 +1,111 @@ +> 本文作者:丁辉 + +# Docker-Compose部署Simplex服务器SMPXFTP服务 + +[官网](https://simplex.chat/) [Github安装文档](https://github.com/simplex-chat/simplex-chat/blob/stable/docs/SERVER.md) [客户端下载](https://simplex.chat/downloads/) + +| 服务器服务 | IP | +| :-------------------------------------: | :----------: | +| simplex-smp-server、simplex-xftp-server | 192.168.1.10 | + +## 部署SMP/XFTP服务 + +1. 创建持久化目录 + + ```bash + mkdir -p /data/simplex/{xftp,smp}/{config,logs} && mkdir -p /data/simplex/xftp/files + ``` + +2. 创建 Docker-Compose Env 文件 + + ```bash + cat << EOF >> .env + SIMPLEX_ADDR=192.168.1.10 + XFTP_ADDR=192.168.1.10 + EOF + ``` + +3. 创建 Docker-Compose 文件 + + ```bash + vi docker-compose.yaml + ``` + + 内容如下 + + ```bash + version: '3' + + networks: + simplex: + + services: + simplex-smp-server: + image: simplexchat/smp-server:latest + container_name: simplex-smp-server + restart: always + ports: + - "5223:5223" + volumes: + - /data/simplex/smp/config:/etc/opt/simplex:Z + - /data/simplex/smp/logs:/var/opt/simplex:Z + environment: + - ADDR=${SIMPLEX_ADDR} + # - PASS="" + networks: + - simplex + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + + simplex-xftp-server: + image: simplexchat/xftp-server:latest + container_name: simplex-xftp-server + ports: + - "443:443" + restart: always + volumes: + - /data/simplex/xftp/config:/etc/opt/simplex-xftp:Z + - /data/simplex/xftp/logs:/var/opt/simplex-xftp:Z + - /data/simplex/xftp/files:/srv/xftp:X + environment: + - ADDR=${XFTP_ADDR} + - QUOTA=50gb + networks: + - simplex + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + ``` + +4. 启动 + + ```bash + docker-compose up -d + ``` + +5. 查看日志获取链接信息 + + ```bash + docker logs -f simplex-smp-server + ``` + + ```bash + docker logs -f simplex-xftp-server + ``` + + > 保存以 `smp://` 和 `xftp://` 开头的链接信息 + +6. 到客户端点击头像、网络和服务器、SMP服务器/XFTP服务器、添加服务器、填写链接信息并保存 + + > 链接信息格式为: + > + > ```bash + > smp://密钥=@访问地址 + > ``` + +**问题记录** + +`simplex-xftp-server` 端口号为 443 会导致有些人的端口冲突,所以我们可以修改 Docker-Compose 文件内的对外端口比如 "5233:443",启动后我们客户端链接时需要在IP或域名后添加端口号。如:smp://密钥=@访问地址:5233 diff --git a/Docker/Compose/Docs/Docker-Compose部署Watchtower.md b/Docker/Compose/Docs/Docker-Compose部署Watchtower.md new file mode 100644 index 0000000..9545ab4 --- /dev/null +++ b/Docker/Compose/Docs/Docker-Compose部署Watchtower.md @@ -0,0 +1,44 @@ +> 本文作者:丁辉 + +# Docker-Compose部署Watchtower + +[Github仓库](https://github.com/containrrr/watchtower) + +## 介绍 + +Watchtower 是一个开源的容器监控和自动更新工具,设计用于Docker容器环境。它可以监控正在运行的容器及其使用的镜像,当发现镜像有更新时,自动拉取新镜像并重新启动容器。这种自动化管理方式有助于确保部署的应用保持最新状态,从而减少安全风险和改进功能。 + +## 部署 + +1. 创建 Docker-Compose 文件 + + ```bash + vi docker-compose.yaml + ``` + + 内容如下 + + ```bash + services: + watchtower: + image: containrrr/watchtower:latest + container_name: watchtower + volumes: + - /var/run/docker.sock:/var/run/docker.sock + command: --interval 14400 + ``` + + **Command参数解释** + + - `--interval 14400`:设置 `watchtower` 检查更新的时间间隔为 14400 秒(即 4 小时)。`watchtower` 将每 4 小时检查一次所有运行的容器是否有可用的镜像更新,并在发现新版本时自动重新部署容器。 + + - 其他参数请看此文档 + + [Docker部署Watchtower管理容器更新](https://gitee.com/offends/Kubernetes/tree/main/Docker/Docs/Docker%E9%83%A8%E7%BD%B2Watchtower%E7%AE%A1%E7%90%86%E5%AE%B9%E5%99%A8%E6%9B%B4%E6%96%B0.md) + +2. 启动 + + ```bash + docker-compose up -d + ``` + diff --git a/Docker/Compose/Docs/Docker-compose安装.md b/Docker/Compose/Docs/Docker-compose安装.md new file mode 100644 index 0000000..910e780 --- /dev/null +++ b/Docker/Compose/Docs/Docker-compose安装.md @@ -0,0 +1,68 @@ +> 作者:丁辉 + +# Docker-compose安装 + +## 网络安装 + +> 缺点: 网络安装版本一般过低,大概率为v1 + +- Centos + + ```bash + yum -y install docker-compose + ``` + +- Ubuntu + + ```bash + apt -y install docker-compose + ``` + +## 二进制安装 + +[Github下载](https://github.com/docker/compose/releases) + +1. 下载 + + ``` + curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + ``` + +2. 配置权限 + + ```bash + chmod +x /usr/local/bin/docker-compose + ``` + +3. 配置软连接 + + ```bash + ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + ``` + +4. 查看结果 + + ```bash + docker-compose --version + ``` + +## PIP安装 + +- 安装 + + ```bash + pip install -U docker-compose + ``` + +- 卸载 + + ```bash + pip uninstall docker-compose + ``` + + + + + + + diff --git a/Docker/Compose/Docs/Docker-compse部署Harbor.md b/Docker/Compose/Docs/Docker-compse部署Harbor.md new file mode 100644 index 0000000..717e404 --- /dev/null +++ b/Docker/Compose/Docs/Docker-compse部署Harbor.md @@ -0,0 +1,466 @@ +> 本文作者:丁辉 + +# Docker-compse部署Harbor + +[官网](https://goharbor.io/) [包下载位置](https://github.com/goharbor/harbor/releases) + +> 离线版本:harbor-offline-installer-v*.tgz +> +> 在线版本:harbor-online-installer-v*.tgz + +## 安装Docker-Compose + +- Centos + + ```bash + yum install docker-compose -y + ``` + +- Ubuntu + + ```bash + apt install docker-compose -y + ``` + +## 开始安装 + +1. 下载软件包 + + > 本文以现最新版本 v2.8.3 举例 + + ```bash + wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.8.3/harbor-offline-installer-v2.8.3.tgz + ``` + +2. 解压文件 + + ```bash + tar -zxvf harbor-offline-installer-v*.tgz && cd harbor && cp harbor.yml.tmpl harbor.yml + ``` + +3. 更改 harbor.yml 文件 + + > 配置 Tcp IP 访问 + + ```bash + vi harbor.yml + ``` + + 更改如下内容 + + ```yml + hostname: harbor.store.com + http: + port: 9000 + + #注释域名证书访问 + #https: + #port: 443 + #certificate: /your/certificate/path + #private_key: /your/private/key/path + + harbor_admin_password: Harbor12345 + + data_volume: /data + ``` + +4. 初始化配置 + + ```bash + ./prepare + ``` + +5. 启动 harbor + + ```bash + ./install.sh + ``` + +6. 安装完成后更新 Docker 配置允许使用私有仓库 + + 修改 Docker 配置文件 + + ```bash + vi /etc/docker/daemon.json + ``` + + 添加如下内容 + + ```json + { + "insecure-registries": ["1.1.1.1:9000"] + } + ``` + +7. 重载 Docker + + ```bash + systemctl reload docker + ``` + +8. 登录测试 + + ```bash + docker login 1.1.1.1:9000 -uadmin -pHarbor12345 + ``` + +## 配置外部数据库 + +更改 harbor.yml 文件, 更改如下内容 + +```yml +external_database: + harbor: + host: harbor_db_host + port: harbor_db_port + db_name: harbor_db_name + username: harbor_db_username + password: harbor_db_password + ssl_mode: disable + max_idle_conns: 2 + max_open_conns: 0 + notary_signer: + host: notary_signer_db_host + port: notary_signer_db_port + db_name: notary_signer_db_name + username: notary_signer_db_username + password: notary_signer_db_password + ssl_mode: disable + notary_server: + host: notary_server_db_host + port: notary_server_db_port + db_name: notary_server_db_name + username: notary_server_db_username + password: notary_server_db_password + ssl_mode: disable + +external_redis: + host: redis:6379 + password: + registry_db_index: 1 + jobservice_db_index: 2 + trivy_db_index: 5 + idle_timeout_seconds: 30 +``` + +## 使用 trivy 镜像漏洞检测 + +1. 更改 harbor.yml 文件, 更改如下内容 + + ```bash + trivy: + ignore_unfixed: false + skip_update: true #跳过更新 + offline_scan: true #离线扫描 + security_check: vuln + insecure: false + ``` + +2. 启动 harbor 是添加 trivy 启动参数 + + ```bash + ./install.sh --with-trivy + ``` + +## 离线环境使用 trivy 导入漏洞数据库 + +创建持久化目录(如果 harbor 已启动, 则停止后替换目录内容) + +```bash +mkdir -p /data/trivy-adapter/trivy/db/ +``` + +### 方法一 + +[oras官网下载地址](https://github.com/oras-project/oras/releases) + +1. 下载软件 + + ```bash + wget https://ghproxy.com/https://github.com/oras-project/oras/releases/download/v1.0.1/oras_1.0.1_linux_amd64.tar.gz + ``` + +2. 解压文件 + + ```bash + tar -zxvf oras_*_linux_amd64.tar.gz && mv oras-install/oras /usr/local/bin/ + ``` + +3. 下载数据 + + ```bash + oras pull ghcr.io/aquasecurity/trivy-db:2 + ``` + +4. 将数据解压到指定目录 + + ```bash + tar -xzvf db.tar.gz -C /data/trivy-adapter/trivy/db/ + ``` + +### 方法二 + +> 外网搭建 harbor, 上传 Nginx 和 Tomcat 进行检测, 获取数据目录 java-db 和 db + +1. 线上环境打包书库目录 + + ```bash + cd /data/trivy-adapter/ + tar -zcvf trivy-db-offline.tar.gz trivy + ``` + +2. 在离线环境将数据解压到指定目录 + + ```bash + tar -xzvf trivy-db-offline.tar.gz -C /data/trivy-adapter/trivy/db/ + ``` + +3. 授权目录 + + ```bash + chown -R 10000:10000 /data/trivy-adapter/trivy/db/ + ``` + +4. 重新启动 harbor 后完成 + +## Harbor配置签发Https配置私有证书 + +### 方法一(cfssl) + +1. 首先修改 harbor.yml 文件, 配置证书 + + ```yml + hostname: harbor.store.com + http: + port: 80 + + https: + port: 443 + certificate: /data/ssl/harbor/harbor.pem + private_key: /data/ssl/harbor/harbor-key.pem + + harbor_admin_password: Harbor12345 + + data_volume: /data + ``` + +2. 下载配置证书工具 + + [cfssl下载地址](https://github.com/cloudflare/cfssl/releases/) + + ```bash + wget https://ghproxy.com/https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64 \ -O /usr/local/bin/cfssl + + wget https://ghproxy.com/https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64 \ -O /usr/local/bin/cfssljson + + wget https://ghproxy.com/https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl-certinfo_1.6.3_linux_amd64 \ -O /usr/local/bin/cfssl-certinfo + + chmod +x /usr/local/bin/cfssl* + ``` + +3. 生成并CA配置文件 + + ```json + #cfssl print-defaults config > ca-config.json + cat > ca-config.json < `default.expiry`:默认证书有效期(单位:h) + > `profiles.harbor`:为服务使用该配置文件颁发证书的配置模块 + > signing:签署,表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE + > `key encipherment`:密钥加密 + > `profiles`:指定了不同角色的配置信息;可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile + > `server auth`:服务器身份验证;表示 client 可以用该 CA 对 server 提供的证书进行验证 + > `client auth`:客户端身份验证;表示 server 可以用该 CA 对 client 提供的证书进行验证 + +4. 生成并修改默认csr请求文件 + + ```json + #cfssl print-defaults csr > ca-csr.json + cat > ca-csr.json < `hosts`:包含的授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误,证书如果不包含可能会出现无法连接的情况(此处是CA机构的可为空) + > `Key`: 指定使用的加密算法,一般使用rsa非对称加密算法(algo:rsa;size:2048) + > `CN`:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法 + > `CN`是域名,也就是你现在使用什么域名就写什么域名 + > `O`:Organization,从证书中提取该字段作为请求用户所属的组 (Group) + +5. 初始化CA + + ```bash + cfssl gencert -initca ca-csr.json | cfssljson -bare ca + ``` + + > 可以看到,当前目录下新生成了`ca.csr`、`ca-key.pem`、`ca.pem`这3个文件。 ca-key.pem、ca.pem这两个是CA相关的证书,通过这个CA来签署服务端证书。 + +6. 创建并修改Harbor证书请求文件 + + ```bash + #cfssl print-defaults csr > harbor-csr.json + cat > harbor-csr.json < `-config`:指定CA证书机构的配置文件 + > `-profile`:指定使用CA配置文件中的哪个模块(此处harbor对应配置文件中的harbor) + > `harbor.pem`:harbor服务的数字证书 + > `harbor-key`.pem:harbor服务的私钥 + +### 方法二(openssl) + +1. 首先修改 harbor.yml 文件, 配置证书 + + ```yml + hostname: harbor.store.com + http: + port: 80 + + https: + port: 443 + certificate: /data/ssl/harbor/harbor.crt + private_key: /data/ssl/harbor/harbor-key.key + + harbor_admin_password: Harbor12345 + + data_volume: /data + ``` + +2. 创建 ca.key + + ```bash + openssl genrsa -out ca.key 4096 + ``` + +3. 创建 ca.crt + + ```bash + openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.com" -key ca.key -out ca.crt + ``` + +4. 创建 harbor.key + + ```bash + openssl genrsa -out harbor.key 4096 + ``` + +5. 创建 harbor.csr + + ```bash + openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.com" -key harbor.key -out harbor.csr + ``` + +6. 创建x509 v3 扩展 文件 + + ```bash + cat > v3.ext < 作者:丁辉 + +# 更新Docker-compose部署的应用 + +> 进入到你 docker-compose 所在的文件夹下,执行 + +1. 拉取最新镜像 + + ```bash + docker-compose pull + ``` + +2. 使用新镜像重启容器 + + ```bash + docker-compose up -d --remove-orphans + ``` + +3. 清理旧容器残留镜像 + + ```bash + docker image prune + ``` + + \ No newline at end of file diff --git a/Docker/Compose/README.md b/Docker/Compose/README.md new file mode 100644 index 0000000..ed0a4d8 --- /dev/null +++ b/Docker/Compose/README.md @@ -0,0 +1,92 @@ +> 本文作者:丁辉 + +# Docker-compose使用示例 + +**前提:** + +1. 克隆代码 + + ```bash + git clone https://gitee.com/offends/Kubernetes.git + cd Kubernetes/Docker/Compose + ``` + +2. 进入示例目录 + + ```bash + cd /Yml + ``` + +## 构建镜像 + +```bash +docker-compose -f build-compose.yml build +``` + +**参数解释** + +| 参数 | 描述 | +| ------------ | --------------------------------------------------------- | +| `build` | 定义服务的构建方式 | +| `context` | 构建上下文的路径,`.` 表示使用当前目录 | +| `dockerfile` | 指定用于构建镜像的 Dockerfile 文件的路径 | +| `args` | 定义构建参数的键值对,这里的 `buildno: 1` 是一个构建参数 | +| `labels` | 为构建的镜像添加标签,这里添加了一个名为 "offends" 的标签 | +| `target` | 指定构建阶段的目标,这里设置为 `prod` | + +## 安装 Gitlab + +- 指定文件名启动 + + ```bash + docker-compose -f gitlab-compose.yml up -d + ``` + +- 停止 + + ```bash + docker-compose -f gitlab-compose.yml down + ``` + +## 示例模版演示 + +- ```bash + docker-compose up -d + ``` + +**YML参数解释** + +[Docker从入门到实践](https://yeasy.gitbook.io/docker_practice/compose/compose_file) [菜鸟教学](https://www.runoob.com/docker/docker-compose.html) + +**Docker-compose命令参数解释** + +| 命令 | 描述 | +| ------- | ------------------------------------------------- | +| build | 构建或重建服务 | +| config | 解析、解决并渲染规范格式的Compose文件 | +| cp | 在服务容器和本地文件系统之间复制文件/文件夹 | +| create | 为一个服务创建容器 | +| down | 停止并移除容器和网络 | +| events | 接收来自容器的实时事件 | +| exec | 在运行中的容器中执行命令 | +| images | 列出由创建的容器使用的镜像 | +| kill | 强制停止服务容器 | +| logs | 查看容器输出 | +| ls | 列出运行中的Compose项目 | +| pause | 暂停服务 | +| port | 打印端口绑定的公共端口 | +| ps | 列出容器 | +| pull | 拉取服务镜像 | +| push | 推送服务镜像 | +| restart | 重启服务容器 | +| rm | 删除已停止的服务容器 | +| run | 在一个服务上运行一次性命令 | +| scale | 缩放服务 | +| start | 启动服务 | +| stop | 停止服务 | +| top | 显示运行中的进程 | +| unpause | 恢复暂停的服务 | +| up | 创建并启动容器 | +| version | 显示 Docker Compose 版本信息 | +| wait | 阻塞直到第一个服务容器停止 | +| watch | 监视服务的构建环境,当文件更新时重新构建/刷新容器 | diff --git a/Docker/Compose/Yml/Dockerfile b/Docker/Compose/Yml/Dockerfile new file mode 100644 index 0000000..6d70c2b --- /dev/null +++ b/Docker/Compose/Yml/Dockerfile @@ -0,0 +1,5 @@ +FROM busybox:latest AS prod + +RUN echo "启动成功" > /file.txt + +CMD ["tail","-f","/file.txt"] \ No newline at end of file diff --git a/Docker/Compose/Yml/build-compose.yml b/Docker/Compose/Yml/build-compose.yml new file mode 100644 index 0000000..2529b36 --- /dev/null +++ b/Docker/Compose/Yml/build-compose.yml @@ -0,0 +1,16 @@ +version: '3' + +services: + webapp: + build: ./ + +# services: +# webapp: +# build: +# context: ./ +# dockerfile: Dockerfile +# args: +# buildno: 1 +# labels: +# - "offends" +# target: prod \ No newline at end of file diff --git a/Docker/Compose/Yml/docker-compose.yml b/Docker/Compose/Yml/docker-compose.yml new file mode 100644 index 0000000..c62962a --- /dev/null +++ b/Docker/Compose/Yml/docker-compose.yml @@ -0,0 +1,7 @@ +version: "3" + +services: + nginx: + image: nginx:latest + ports: + - "80:80" \ No newline at end of file diff --git a/Docker/Compose/Yml/gitlab-compose.yml b/Docker/Compose/Yml/gitlab-compose.yml new file mode 100644 index 0000000..610aaa7 --- /dev/null +++ b/Docker/Compose/Yml/gitlab-compose.yml @@ -0,0 +1,52 @@ +version: "3" + +services: + gitlab: + depends_on: + - redis + - postgresql + restart: always + image: sameersbn/gitlab:latest + environment: + - DEBUG=false + - TZ=Asia/Shanghai + - GITLAB_TIMEZONE=Beijing + - REDIS_HOST=redis + - REDIS_PORT=6379 + - DB_ADAPTER=postgresql + - DB_HOST=postgresql + - DB_PORT=5432 + - DB_USER=gitlab + - DB_PASS=gitlab + - DB_NAME=gitlabhq_production + - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string + - GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string + - GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string + - GITLAB_HOST=192.168.1.10 + - GITLAB_PORT=80 + - GITLAB_SSH_HOST=192.168.1.10 + - GITLAB_SSH_PORT=222 + ports: + - "222:22" + - "80:80" + volumes: + - /data/gitlab/data:/home/git/data:Z + - /data/gitlab/node_modules:/home/git/gitlab/node_modules:Z + - /data/gitlab/log:/var/log/gitlab:Z + + redis: + restart: always + image: sameersbn/redis:latest + volumes: + - /data/gitlab/redis:/var/lib/redis:Z + + postgresql: + restart: always + image: sameersbn/postgresql:14 + environment: + - DB_EXTENSION=pg_trgm,btree_gist + - DB_USER=gitlab + - DB_PASS=gitlab + - DB_NAME=gitlabhq_production + volumes: + - /data/gitlab/postgresql:/var/lib/postgresql:Z \ No newline at end of file diff --git a/Docker/Compose/install.sh b/Docker/Compose/install.sh new file mode 100644 index 0000000..f2e81f7 --- /dev/null +++ b/Docker/Compose/install.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +############################################################################################# +# 用途: 安装 Docker Compose +# 作者: 丁辉 +# 编写时间: 2023-12-27 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +# 定义变量 +VERSION="v2.23.3" + +# 安装 Docker Compose +# 检测某个systemd服务是否存在 +function CHECK_SYSTEMD(){ + if ! command -v docker-compose >/dev/null 2>&1; then + INSTALL_DOCKER_COMPOSE + else + SEND_INFO "Docker-compose 服务已安装,版本为: $(docker-compose --version | grep -oP 'v\d+\.\d+\.\d+')" + fi +} + +function INSTALL_DOCKER_COMPOSE(){ + SEND_INFO "开始安装 Docker Compose" + curl -L "https://github.com/docker/compose/releases/download/$VERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + NULL_TRUE chmod +x /usr/local/bin/docker-compose + NULL_TRUE ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + SEND_INFO "Docker Compose 安装完成,版本为: $(docker-compose --version | grep -oP 'v\d+\.\d+\.\d+')" +} + +CHECK_SYSTEMD \ No newline at end of file diff --git a/Docker/Dockerfile/Aliyun-dns-sync/Dockerfile b/Docker/Dockerfile/Aliyun-dns-sync/Dockerfile new file mode 100644 index 0000000..9ab9223 --- /dev/null +++ b/Docker/Dockerfile/Aliyun-dns-sync/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3 + +RUN pip install aliyun-python-sdk-core -i https://pypi.tuna.tsinghua.edu.cn/simple \ + && sleep 2 \ + && pip install aliyun-python-sdk-alidns -i https://pypi.tuna.tsinghua.edu.cn/simple + +RUN touch /var/log/python.log \ + && sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list.d/debian.sources \ + && apt-get update \ + && apt-get -y install cron \ + && echo '*/1 * * * * sh /aliyun-dns-sync/cron.sh' | crontab + +COPY ./File/* /aliyun-dns-sync/ + +CMD [ "bash", "/aliyun-dns-sync/start.sh" ] \ No newline at end of file diff --git a/Docker/Dockerfile/Aliyun-dns-sync/File/aliyun-dns-sync.py b/Docker/Dockerfile/Aliyun-dns-sync/File/aliyun-dns-sync.py new file mode 100644 index 0000000..367ef13 --- /dev/null +++ b/Docker/Dockerfile/Aliyun-dns-sync/File/aliyun-dns-sync.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +#coding=utf-8 + +# 加载核心SDK +#from aliyunsdkcore import client +#from aliyunsdksts.request.v20150401 import AssumeRoleRequest +#import json +#import oss2 + +from aliyunsdkcore.client import AcsClient +from aliyunsdkcore.acs_exception.exceptions import ClientException +from aliyunsdkcore.acs_exception.exceptions import ServerException + +# 加载获取 、 新增、 更新、 删除接口 +from aliyunsdkalidns.request.v20150109 import DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest + +# 加载内置模块 +import json,urllib + +# AccessKey 和 Secret 建议使用 RAM 子账户的 KEY 和 SECRET 增加安全性 +ID = '' +SECRET = '' + +# 地区节点 可选地区取决于你的阿里云帐号等级,普通用户只有四个,分别是杭州、上海、深圳、河北,具体参考官网API +regionId = 'cn-hangzhou' + +# 配置认证信息 +client = AcsClient(ID, SECRET, regionId) + +# 设置主域名 +DomainName = '' + +# 子域名列表 列表参数可根据实际需求增加或减少值 +SubDomainList = ['@','www'] + +# 获取外网IP 三个地址返回的ip地址格式各不相同,3322 的是最纯净的格式, 备选1为 json格式 备选2 为curl方式获取 两个备选地址都需要对获取值作进一步处理才能使用 +def getIp(): + # 备选地址: 1. http://pv.sohu.com/cityjson?ie=utf-8 2. curl -L tool.lu/ip + with urllib.request.urlopen('http://www.3322.org/dyndns/getip') as response: + html = response.read() + ip = str(html, encoding='utf-8').replace("\n", "") + return ip + +# 查询记录 +def getDomainInfo(SubDomain): + request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest() + request.set_accept_format('json') + + # 设置要查询的记录类型为 A记录 官网支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隐性(显性)转发 如果有需要可将该值配置为参数传入 + request.set_Type("A") + #request.set_Type("www") + # 指定查记的域名 格式为 'test.binghe.com' + request.set_SubDomain(SubDomain) + + response = client.do_action_with_exception(request) + response = str(response, encoding='utf-8') + + # 将获取到的记录转换成json对象并返回 + return json.loads(response) + +# 新增记录 (默认都设置为A记录,通过配置set_Type可设置为其他记录) +def addDomainRecord(client,value,rr,domainname): + request = AddDomainRecordRequest.AddDomainRecordRequest() + request.set_accept_format('json') + + # request.set_Priority('1') # MX 记录时的必选参数 + request.set_TTL('600') # 可选值的范围取决于你的阿里云账户等级,免费版为 600 - 86400 单位为秒 + request.set_Value(value) # 新增的 ip 地址 + request.set_Type('A') # 记录类型 + request.set_RR(rr) # 子域名名称 + request.set_DomainName(domainname) #主域名 + + # 获取记录信息,返回信息中包含 TotalCount 字段,表示获取到的记录条数 0 表示没有记录, 其他数字为多少表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录 + response = client.do_action_with_exception(request) + response = str(response, encoding='utf-8') + relsult = json.loads(response) + return relsult + +# 更新记录 +def updateDomainRecord(client,value,rr,record_id): + request = UpdateDomainRecordRequest.UpdateDomainRecordRequest() + request.set_accept_format('json') + + # request.set_Priority('1') + request.set_TTL('600') + request.set_Value(value) # 新的ip地址 + request.set_Type('A') + request.set_RR(rr) + request.set_RecordId(record_id) # 更新记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值 + + response = client.do_action_with_exception(request) + response = str(response, encoding='utf-8') + return response + +# 删除记录 +def delDomainRecord(client,subdomain): + info = getDomainInfo(subdomain) + if info['TotalCount'] == 0: + print('没有相关的记录信息,删除失败!') + elif info["TotalCount"] == 1: + print('准备删除记录') + request = DeleteDomainRecordRequest.DeleteDomainRecordRequest() + request.set_accept_format('json') + + record_id = info["DomainRecords"]["Record"][0]["RecordId"] + request.set_RecordId(record_id) # 删除记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值 + result = client.do_action_with_exception(request) + print('删除成功,返回信息:') + print(result) + else: + # 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误 + print("存在多个相同子域名解析记录值,请核查后再操作!") + +# 有记录则更新,没有记录则新增 +def setDomainRecord(client,value,rr,domainname): + info = getDomainInfo(rr + '.' + domainname) + if info['TotalCount'] == 0: + print('准备添加新记录') + add_result = addDomainRecord(client,value,rr,domainname) + print(add_result) + elif info["TotalCount"] == 1: + print('准备更新已有记录') + record_id = info["DomainRecords"]["Record"][0]["RecordId"] + cur_ip = getIp() + old_ip = info["DomainRecords"]["Record"][0]["Value"] + if cur_ip == old_ip: + print ("新ip与原ip相同,不更新!") + else: + update_result = updateDomainRecord(client,value,rr,record_id) + print('更新成功,返回信息:') + print(update_result) + else: + # 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误 + print("存在多个相同子域名解析记录值,请核查删除后再操作!") + + +IP = getIp() + +# 循环子域名列表进行批量操作 +for x in SubDomainList: + setDomainRecord(client,IP,x,DomainName) diff --git a/Docker/Dockerfile/Aliyun-dns-sync/File/cron.sh b/Docker/Dockerfile/Aliyun-dns-sync/File/cron.sh new file mode 100644 index 0000000..3bae79d --- /dev/null +++ b/Docker/Dockerfile/Aliyun-dns-sync/File/cron.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# 启动同步 +/usr/local/bin/python /aliyun-dns-sync/aliyun-dns-sync.py > /var/log/python.log \ No newline at end of file diff --git a/Docker/Dockerfile/Aliyun-dns-sync/File/start.sh b/Docker/Dockerfile/Aliyun-dns-sync/File/start.sh new file mode 100644 index 0000000..050c2fb --- /dev/null +++ b/Docker/Dockerfile/Aliyun-dns-sync/File/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# 启动 cron +service cron start + +# 查看日志 +tail -f /var/log/python.log \ No newline at end of file diff --git a/Docker/Dockerfile/Aliyun-dns-sync/README.md b/Docker/Dockerfile/Aliyun-dns-sync/README.md new file mode 100644 index 0000000..d99063b --- /dev/null +++ b/Docker/Dockerfile/Aliyun-dns-sync/README.md @@ -0,0 +1,15 @@ +* + +> 本文作者:丁辉 + +# 通过脚本调用阿里云接口实现动态公网IP实时与阿里云域名解析同步 + +> 使用前修改 Python 脚本内如下参数 + +```bash +ID = '' #AccessKey ID +SECRET = '' #AccessKey Secret +regionId = '' #地域 +DomainName = '' #域名 +``` + diff --git a/Docker/Dockerfile/Busybox/Dockerfile b/Docker/Dockerfile/Busybox/Dockerfile new file mode 100644 index 0000000..b850e4a --- /dev/null +++ b/Docker/Dockerfile/Busybox/Dockerfile @@ -0,0 +1,5 @@ +FROM busybox:latest + +RUN echo "启动成功" > /file.txt + +CMD ["tail","-f","/file.txt"] \ No newline at end of file diff --git a/Docker/Dockerfile/Busybox/README.md b/Docker/Dockerfile/Busybox/README.md new file mode 100644 index 0000000..f0ea3e1 --- /dev/null +++ b/Docker/Dockerfile/Busybox/README.md @@ -0,0 +1,7 @@ +* + +> 本文作者:丁辉 + +# Busybox + +> 此应用于容器启动测试 diff --git a/Docker/Dockerfile/Cache-Registry/Dockerfile b/Docker/Dockerfile/Cache-Registry/Dockerfile new file mode 100644 index 0000000..d1c5394 --- /dev/null +++ b/Docker/Dockerfile/Cache-Registry/Dockerfile @@ -0,0 +1,6 @@ +FROM registry:latest + +ENV PROXY_REMOTE_URL="" \ + DELETE_ENABLED="true" + +COPY ./entrypoint.sh /entrypoint.sh \ No newline at end of file diff --git a/Docker/Dockerfile/Cache-Registry/README.md b/Docker/Dockerfile/Cache-Registry/README.md new file mode 100644 index 0000000..25ca6f2 --- /dev/null +++ b/Docker/Dockerfile/Cache-Registry/README.md @@ -0,0 +1,56 @@ +> 本文作者:丁辉 + +# 镜像仓库代理服务 + +## 优点 + +1. **加速后续拉取**:同一个镜像只需从 Docker Hub 拉取一次,后续所有团队的拉取请求都会从本地缓存服务器获取,速度极快。 +2. **节省带宽**:减少对公网 Docker Hub 的重复请求,尤其适合带宽有限或按流量计费的环境。 + +## 镜像仓库地址 + +| 站点名 | URL | 备注 | +| :---------: | :--------------------------: | :--------------------------------------------------------: | +| DockerHub | https://registry-1.docker.io | 拉取镜像需要带上 `library` (可能就我有这情况吧,没仔细深究) | +| Quay | https://quay.io | | +| Gcr | https://gcr.io | | +| Ghcr | https://ghcr.io | | +| K8sgcr | https://k8s.gcr.io | | +| Registryk8s | https://registry.k8s.io | | + +## 已构建好的镜像 + +```bash +hub.offends.cn/registry-proxy:latest +``` + +## 启动容器 + +[仓库地址](https://gitee.com/offends/Kubernetes/tree/main/Docker/Dockerfile/Cache-Registry) + +- Docker + + ```bash + docker run -itd \ + --restart always \ + -p 80:5000 \ + -v "/etc/localtime:/etc/localtime" \ + -v "/var/lib/registryproxy:/var/lib/registry" \ + -e PROXY_REMOTE_URL="https://registry-1.docker.io/library" \ + --name=registry-proxy \ + hub.offends.cn/registry-proxy:latest + ``` + +- Docker-compose + + > 文件在本仓库当前目录下, 修改 `PROXY_REMOTE_URL` 参数后即可使用 + + ```bash + docker-compose up -d + ``` + +- Kubernetes + + **查看此篇文档** + + [Kubernetes部署Registry镜像仓库缓存服务](https://gitee.com/offends/Kubernetes/tree/main/Docker/Dockerfile/Cache-Registry/README.md) diff --git a/Docker/Dockerfile/Cache-Registry/docker-compose.yaml b/Docker/Dockerfile/Cache-Registry/docker-compose.yaml new file mode 100644 index 0000000..b3dbfa9 --- /dev/null +++ b/Docker/Dockerfile/Cache-Registry/docker-compose.yaml @@ -0,0 +1,13 @@ +version: "3" +services: + registryproxy: + image: "hub.offends.cn/registry-proxy:latest" + container_name: "registryproxy" + restart: "always" + volumes: + - "/etc/localtime:/etc/localtime" + - "/var/lib/registryproxy:/var/lib/registry" + environment: + - "PROXY_REMOTE_URL=http://registry:5000" + ports: + - "5000:5000" \ No newline at end of file diff --git a/Docker/Dockerfile/Cache-Registry/entrypoint.sh b/Docker/Dockerfile/Cache-Registry/entrypoint.sh new file mode 100644 index 0000000..f9b2007 --- /dev/null +++ b/Docker/Dockerfile/Cache-Registry/entrypoint.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +############################################################################################# +# 用途: 定制缓存 Registry 镜像 +# 作者: 丁辉 +# 编写时间: 2024-06-29 +############################################################################################# + +set -e + +# 配置 Headers +sed -i "/headers:/a\ Access-Control-Allow-Origin: ['*']" /etc/docker/registry/config.yml +sed -i "/headers:/a\ Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']" /etc/docker/registry/config.yml +sed -i "/headers:/a\ Access-Control-Expose-Headers: ['Docker-Content-Digest']" /etc/docker/registry/config.yml + +# 检查环境变量PROXY_REMOTE_URL是否非空, 检查配置文件中变量出现的次数是否为0 +if [ -n "$PROXY_REMOTE_URL" ] && [ $(grep -c "$PROXY_REMOTE_URL" "/etc/docker/registry/config.yml") -eq 0 ]; then + echo "proxy:" >> /etc/docker/registry/config.yml + echo " remoteurl: $PROXY_REMOTE_URL" >> /etc/docker/registry/config.yml + # 可以提供用户名和密码保持私密 + # echo " username: $PROXY_USERNAME" >> /etc/docker/registry/config.yml + # echo " password: $PROXY_PASSWORD" >> /etc/docker/registry/config.yml + echo "----- Enabled Proxy To Remote -----" +fi +# 判断是否开启 Registry 镜像镜像清理 +if [ "$DELETE_ENABLED" = "true" ] && [ $(grep -c "delete:" /etc/docker/registry/config.yml) -eq 0 ]; then + sed -i '/rootdirectory:/a\ delete:' /etc/docker/registry/config.yml + sed -i '/delete:/a\ enabled: true' /etc/docker/registry/config.yml + echo "----- Enabled Local Storage Delete -----" +fi + +case "$1" in + *.yaml|*.yml) set -- registry serve "$@" ;; + serve|garbage-collect|help|-*) set -- registry "$@" ;; +esac + +exec "$@" \ No newline at end of file diff --git a/Docker/Dockerfile/Centos/Dockerfile b/Docker/Dockerfile/Centos/Dockerfile new file mode 100644 index 0000000..4d44038 --- /dev/null +++ b/Docker/Dockerfile/Centos/Dockerfile @@ -0,0 +1,5 @@ +FROM scratch + +ADD ./centos/rootfs / + +CMD /bin/bash \ No newline at end of file diff --git a/Docker/Dockerfile/Centos/Dockerfile-ssh b/Docker/Dockerfile/Centos/Dockerfile-ssh new file mode 100644 index 0000000..ffaa6ff --- /dev/null +++ b/Docker/Dockerfile/Centos/Dockerfile-ssh @@ -0,0 +1,34 @@ +FROM centos:7 + +# 设置环境变量(登录密码) +ARG ROOT_PASSWORD + +# 切换镜像源 +RUN mv /etc/yum.repos.d/* /tmp \ + && curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo + +# 安装SSH服务及相关工具 +RUN yum install -y \ + openssh-server \ + openssh-clients \ + passwd \ + sudo \ + vim \ + net-tools \ + iproute \ + which \ + && yum clean all + +# 配置SSH服务 +RUN ssh-keygen -A \ + && mkdir -p /var/run/sshd \ + && echo "root:${ROOT_PASSWORD}" | chpasswd \ + && sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config \ + && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config \ + && sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config + +# 开放SSH端口 +EXPOSE 22 + +# 启动SSH服务 +CMD ["/usr/sbin/sshd", "-D"] \ No newline at end of file diff --git a/Docker/Dockerfile/Centos/README.md b/Docker/Dockerfile/Centos/README.md new file mode 100644 index 0000000..6943116 --- /dev/null +++ b/Docker/Dockerfile/Centos/README.md @@ -0,0 +1,38 @@ +* + +> 本文作者:丁辉 + +# Centos + +- Centos 基础镜像构建 + + ```bash + ./build.sh + ``` + +- Centos 配置策略允许外部通过 SSH 登录 + + 1. 构建镜像 + + ```bash + docker build --build-arg ROOT_PASSWORD=password -t centos-ssh:7 -f Dockerfile-ssh . + ``` + + **参数解释** + + `ROOT_PASSWORD`:配置登录 Centos 默认 ROOT 密码 + + 2. 启动镜像并登录 + + ```bash + docker run --name centos -p 2222:22 -d centos-ssh:7 + ``` + + 3. 登录 + + ```bash + ssh -p 2222 root@IP + ``` + + + diff --git a/Docker/Dockerfile/Centos/build.sh b/Docker/Dockerfile/Centos/build.sh new file mode 100644 index 0000000..bde5301 --- /dev/null +++ b/Docker/Dockerfile/Centos/build.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +############################################################################################# +# 用途: 构建 Centos 系统 Docker 镜像的脚本 +# 作者: 丁辉 +# 编写时间: 2023-11-27 +############################################################################################# + +# 镜像地址 +# 阿里云: https://mirrors.aliyun.com/centos/ +# 官方: https://www.centos.org/ +# 其他: https://vault.centos.org/ + +VERSION="7.9.2009" + +CENTOS_VERSION="7" +URL="https://mirrors.aliyun.com/centos/$VERSION/os/x86_64/Packages" +RPM_VERSION="centos-release-7-9.2009.0.el7.centos.x86_64.rpm" + +CENTOS_URL="$URL/$RPM_VERSION" + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +function INSTALL_WGET(){ + CHECK_INSTALL wget +} + +# 初始化目录和文件 +function INIT_DIR(){ + CHECK_DIR ./centos/rootfs && cd ./centos + CHECK_COMMAND_NULL rpm --root $PWD/rootfs --initdb + SEND_INFO "初始化目录和文件完成" + SEND_INFO "正在获取RPM文件" + CHECK_COMMAND_NULL wget $CENTOS_URL + + CHECK_FILE "centos-release-7-9.2009.0.el7.centos.x86_64.rpm" + NULL_TRUE rpm -ivh --nodeps --root $PWD/rootfs --package ./$RPM_VERSION + + # #在无法获取到软件包源的情况下使用 + # SEND_INFO "正在备份 YUM 源文件" + # CHECK_DIR /etc/yum.repos.d/Offends + # CHECK_COMMAND_NULL \cp -r /etc/yum.repos.d/epel.repo /etc/yum.repos.d/Offends && \cp -r /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Offends + # # 获取需要的软件包源 + # SEND_INFO "正在获取软件包源" + # CHECK_COMMAND_NULL wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-$CENTOS_VERSION.repo + # CHECK_COMMAND_NULL wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-$CENTOS_VERSION.repo + # # 清除缓存 + # SEND_INFO "正在清除缓存" + # CHECK_COMMAND_NULL yum makecache + # # 根据自己需求修改 + # CHECK_COMMAND_NULL sed -i 's@baseurl=.*@baseurl=https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/@' /etc/yum.repos.d/*.repo + + SEND_INFO "正在安装基础软件包,拉取过程较慢请稍后" + CHECK_COMMAND_NULL yum --installroot=$PWD/rootfs install yum --nogpgcheck -y + SEND_INFO "开始构建镜像" + CHECK_COMMAND_NULL cd .. && docker build -t centos:$VERSION . + SEND_INFO "构建完成,镜像名称: centos:$VERSION" + + # # 恢复 YUM 源文件 + # SEND_INFO "正在恢复 YUM 源文件" + # CHECK_COMMAND_NULL rm -rf /etc/yum.repos.d/CentOS-Base.repo && rm -rf /etc/yum.repos.d/epel.repo + # CHECK_COMMAND_NULL cp -r /etc/yum.repos.d/Offends/* /etc/yum.repos.d/ +} + + +function ALL(){ + INSTALL_WGET + INIT_DIR +} + +ALL \ No newline at end of file diff --git a/Docker/Dockerfile/Debain/Dockerfile b/Docker/Dockerfile/Debain/Dockerfile new file mode 100644 index 0000000..66e2e17 --- /dev/null +++ b/Docker/Dockerfile/Debain/Dockerfile @@ -0,0 +1,5 @@ +FROM scratch + +ADD rootfs.tar.xz / + +CMD /bin/bash \ No newline at end of file diff --git a/Docker/Dockerfile/Debain/README.md b/Docker/Dockerfile/Debain/README.md new file mode 100644 index 0000000..4310caf --- /dev/null +++ b/Docker/Dockerfile/Debain/README.md @@ -0,0 +1,10 @@ +* + +> 本文作者:丁辉 + +# Debain 镜像构建 + +```bash +./build.sh +``` + diff --git a/Docker/Dockerfile/Debain/build.sh b/Docker/Dockerfile/Debain/build.sh new file mode 100644 index 0000000..62b540f --- /dev/null +++ b/Docker/Dockerfile/Debain/build.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +############################################################################################# +# 用途: 构建 Debian 系统 Docker 镜像的脚本 +# 作者: 丁辉 +# 编写时间: 2023-11-27 +############################################################################################# + +# 镜像地址 +# https://docker.debian.net/ + +ROOTFS="https://github.com/debuerreotype/docker-debian-artifacts/raw" + +VERSION="1f1e36af44a355418661956f15e39f5b04b848b6" + +FILE="stable/rootfs.tar.xz" + +DEBAIN=$ROOTFS/$VERSION/$FILE + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +function INSTALL_WGET(){ + CHECK_INSTALL wget +} + +function INSTALL(){ + SEND_INFO "正在下载资源文件,请稍等..." + CHECK_COMMAND_NULL wget $DEBAIN + BUILD +} + +# 构建 Debian 系统 +function BUILD(){ + CHECK_FILE "rootfs.tar.xz" + SEND_INFO "正在构建 Debian 系统,请稍等..." + CHECK_COMMAND_NULL docker import rootfs.tar.xz debian:stable + # docker build -t debian:stable . + CHECK_COMMAND_NULL rm -rf rootfs.tar.xz + SEND_INFO "构建完成,镜像名称: debian:stable" +} + +function ALL(){ + INSTALL_WGET + INSTALL +} + +ALL \ No newline at end of file diff --git a/Docker/Dockerfile/Drone-Images/Dockerfile-git b/Docker/Dockerfile/Drone-Images/Dockerfile-git new file mode 100644 index 0000000..a5591e6 --- /dev/null +++ b/Docker/Dockerfile/Drone-Images/Dockerfile-git @@ -0,0 +1,5 @@ +FROM alpine/git + +LABEL maintainer="Offends " + +RUN apk add --no-cache bash \ No newline at end of file diff --git a/Docker/Dockerfile/Drone-Images/Dockerfile-mc b/Docker/Dockerfile/Drone-Images/Dockerfile-mc new file mode 100644 index 0000000..20c8961 --- /dev/null +++ b/Docker/Dockerfile/Drone-Images/Dockerfile-mc @@ -0,0 +1,10 @@ +FROM alpine:latest + +LABEL maintainer="Offends " + +COPY ./mc.sh . + +RUN apk add --no-cache --virtual .build-deps \ + curl \ + && sh ./mc.sh \ + && apk del .build-deps \ No newline at end of file diff --git a/Docker/Dockerfile/Drone-Images/Dockerfile-oss b/Docker/Dockerfile/Drone-Images/Dockerfile-oss new file mode 100644 index 0000000..3ffbf3e --- /dev/null +++ b/Docker/Dockerfile/Drone-Images/Dockerfile-oss @@ -0,0 +1,11 @@ +FROM alpine:latest + +LABEL maintainer="Offends " + +RUN apk add --no-cache --virtual .build-deps \ + unzip \ + bash \ + curl \ + && curl -O https://gosspublic.alicdn.com/ossutil/install.sh \ + && bash install.sh && rm -rf install.sh \ + && apk del .build-deps \ No newline at end of file diff --git a/Docker/Dockerfile/Drone-Images/README.md b/Docker/Dockerfile/Drone-Images/README.md new file mode 100644 index 0000000..e3862e5 --- /dev/null +++ b/Docker/Dockerfile/Drone-Images/README.md @@ -0,0 +1,14 @@ +* + +> 本文作者:丁辉 + +# Drone 基础镜像构建 + +> Dockerfile示例 + +| 文件名 | 镜像功能 | 构建示例 | +| :------------: | :-----------------------: | :---------------------------------------------: | +| Dockerfile-git | 最小化 Git 容器 | docker build -t 镜像名:标签 -f Dockerfile-git . | +| Dockerfile-mc | 容器内自带 S3 客户端命令 | docker build -t 镜像名:标签 -f Dockerfile-mc . | +| Dockerfile-oss | 容器内自带 oss 客户端命令 | docker build -t 镜像名:标签 -f Dockerfile-oss . | + diff --git a/Docker/Dockerfile/Drone-Images/mc.sh b/Docker/Dockerfile/Drone-Images/mc.sh new file mode 100644 index 0000000..1347ef8 --- /dev/null +++ b/Docker/Dockerfile/Drone-Images/mc.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +############################################################################################# +# 用途: 部署 MinIO 客户端工具 mc +# 作者: 丁辉 +# 编写时间: 2024-02-14 +############################################################################################# + +# 判断系统架构 +if [ $(arch) = "x86_64" ] || [ $(arch) = "amd64" ]; then + ARCH_TYPE=linux-amd64 +elif [ $(arch) = "aarch64" ] || [ $(arch) = "arm64" ]; then + ARCH_TYPE=linux-arm64 +else + echo "无法识别的系统架构: $(arch)" + exit 1 +fi + +# 变量定义 +URL="https://dl.min.io/client/mc/release/$ARCH_TYPE" + +# 下载文件 +curl -so /usr/local/bin/mc https://dl.min.io/client/mc/release/linux-amd64/mc +# 添加执行权限 +chmod 777 /usr/local/bin/mc diff --git a/Docker/Dockerfile/Fio/Dockerfile b/Docker/Dockerfile/Fio/Dockerfile new file mode 100644 index 0000000..664e46e --- /dev/null +++ b/Docker/Dockerfile/Fio/Dockerfile @@ -0,0 +1,3 @@ +FROM alpine:latest + +RUN apk add fio \ No newline at end of file diff --git a/Docker/Dockerfile/Fio/README.md b/Docker/Dockerfile/Fio/README.md new file mode 100644 index 0000000..b463738 --- /dev/null +++ b/Docker/Dockerfile/Fio/README.md @@ -0,0 +1,7 @@ +* + +> 本文作者:丁辉 + +# Fio + +> 此应用于磁盘读写性能测试 diff --git a/Docker/Dockerfile/Frp/.drone.yml b/Docker/Dockerfile/Frp/.drone.yml new file mode 100644 index 0000000..8bdb06e --- /dev/null +++ b/Docker/Dockerfile/Frp/.drone.yml @@ -0,0 +1,128 @@ +kind: pipeline +type: docker +name: Build Frps + +# 手动触发或接口触发 +trigger: + event: + - custom + +# 指定架构,需在 runner 配置环境变量中指定 DRONE_RUNNER_ARCH,或自动获取 +platform: + os: linux + arch: amd64 + +# 指定运行环境节点,需在 runner 配置环境变量中指定 DRONE_RUNNER_LABELS +node: + City: abroad + +# 使用插件构建镜像 +steps: +- name: Build Frps + image: plugins/docker + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + registry: + from_secret: REGISTRY + username: + from_secret: DOCKER_USERNAME + password: + from_secret: DOCKER_PASSWORD + repo: + from_secret: REPO + # 是否禁止推送镜像 + dry_run: false + tags: + - frps + # 要使用的上下文路径,默认为 git 存储库的根目录 + context: ./frps + # 要使用的 dockerfile 路径,默认为 git 存储库的根目录 + dockerfile: ./frps/Dockerfile + when: + branch: + - main +--- +kind: pipeline +type: docker +name: Build Frpc + +# 手动触发或接口触发 +trigger: + event: + - custom + +# 指定架构,需在 runner 配置环境变量中指定 DRONE_RUNNER_ARCH,或自动获取 +platform: + os: linux + arch: amd64 + +# 指定运行环境节点,需在 runner 配置环境变量中指定 DRONE_RUNNER_LABELS +node: + City: abroad + +# 使用插件构建镜像 +steps: +- name: Build Frpc + image: plugins/docker + # 仅当本地不存在该镜像时才拉取 + pull: if-not-exists + settings: + registry: + from_secret: REGISTRY + username: + from_secret: DOCKER_USERNAME + password: + from_secret: DOCKER_PASSWORD + repo: + from_secret: REPO + # 是否禁止推送镜像 + dry_run: false + tags: + - frpc + # 要使用的上下文路径,默认为 git 存储库的根目录 + context: ./frpc + # 要使用的 dockerfile 路径,默认为 git 存储库的根目录 + dockerfile: ./frpc/Dockerfile + when: + branch: + - main +--- +kind: pipeline +type: docker +name: Sync Ipsec Vpn Image + +trigger: + event: + include: + - custom + +# 指定运行环境节点,需在 runner 配置环境变量中指定 DRONE_RUNNER_LABELS +node: + City: abroad + +steps: +- name: Sync Ipsec Vpn Image + image: docker:dind + volumes: + - name: dockersock + path: /var/run/docker.sock + environment: + DOCKER_USERNAME: + from_secret: DOCKER_USERNAME + DOCKER_PASSWORD: + from_secret: DOCKER_PASSWORD + REGISTRY: + from_secret: REGISTRY + REPO: + from_secret: REPO + commands: + - docker pull hwdsl2/ipsec-vpn-server + - docker login $REGISTRY -u $DOCKER_USERNAME -p $DOCKER_PASSWORD + - docker tag hwdsl2/ipsec-vpn-server $REPO:ipsec-vpn-server + - docker push $REPO:ipsec-vpn-server + +volumes: +- name: dockersock + host: + path: /var/run/docker.sock \ No newline at end of file diff --git a/Docker/Dockerfile/Frp/Drone构建参数解释.md b/Docker/Dockerfile/Frp/Drone构建参数解释.md new file mode 100644 index 0000000..ea5497c --- /dev/null +++ b/Docker/Dockerfile/Frp/Drone构建参数解释.md @@ -0,0 +1,13 @@ +* + +> 本文作者:丁辉 + +## Drone构建参数解释 + +| 变量名 | 变量值 | 备注 | +| :-------------: | :---------------------------------------------------: | :------------: | +| DOCKER_USERNAME | | 镜像仓库账号 | +| DOCKER_PASSWORD | | 镜像仓库密码 | +| REGISTRY | registry.cn-hangzhou.aliyuncs.com | 镜像仓库地址 | +| REPO | registry.cn-hangzhou.aliyuncs.com/<命名空间>/<镜像名> | 镜像的仓库名称 | + diff --git a/Docker/Dockerfile/Frp/frpc/Dockerfile b/Docker/Dockerfile/Frp/frpc/Dockerfile new file mode 100644 index 0000000..7e8cae7 --- /dev/null +++ b/Docker/Dockerfile/Frp/frpc/Dockerfile @@ -0,0 +1,27 @@ +FROM alpine:latest + +LABEL maintainer="Offends " + +ARG VERSION_ARG + +ENV VERSION=${VERSION_ARG:-0.53.2} + +RUN if [ $(arch) = "x86_64" ] || [ $(arch) = "amd64" ]; then \ + ARCH_TYPE="amd64"; \ + elif [ $(arch) = "aarch64" ] || [ $(arch) = "arm64" ]; then \ + ARCH_TYPE="arm"; \ + else \ + ARCH_TYPE="amd64"; \ + fi \ + && wget https://github.com/fatedier/frp/releases/download/v${VERSION}/frp_${VERSION}_linux_${ARCH_TYPE}.tar.gz \ + && tar -zvxf frp_${VERSION}_linux_${ARCH_TYPE}.tar.gz \ + && cp -r frp_${VERSION}_linux_${ARCH_TYPE} frp \ + && mv /frp/frpc /usr/local/bin/ \ + && rm -rf /frp/frps* /frp/LICENSE \ + && rm -rf /frp_${VERSION}_linux_${ARCH_TYPE}* + +COPY ./frpc.ini /frp/frpc.ini + +WORKDIR /frp + +CMD /usr/local/bin/frpc -c /frp/frpc.ini \ No newline at end of file diff --git a/Docker/Dockerfile/Frp/frpc/README.md b/Docker/Dockerfile/Frp/frpc/README.md new file mode 100644 index 0000000..1d84ae7 --- /dev/null +++ b/Docker/Dockerfile/Frp/frpc/README.md @@ -0,0 +1,24 @@ +* + +> 本文作者:丁辉 + +# **Frpc内网穿透** + +> Frpc 为内网穿透客户端 +> + +## Docker构建 + +构建镜像 + +> 默认构建 0.53.2 版本 + +```bash +docker build -t registry.cn-hangzhou.aliyuncs.com/offends/frp:frpc . +``` + +> 手动选择构建版本 + +```bash +docker build --build-arg VERSION_ARG=0.53.2 -t registry.cn-hangzhou.aliyuncs.com/offends/frp:frpc . +``` diff --git a/Docker/Dockerfile/Frp/frpc/frpc.bat b/Docker/Dockerfile/Frp/frpc/frpc.bat new file mode 100644 index 0000000..8986778 --- /dev/null +++ b/Docker/Dockerfile/Frp/frpc/frpc.bat @@ -0,0 +1,8 @@ +@echo off +if "%1" == "h" goto begin +mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit +:begin +REM +cd C:\frpc +frpc -c frpc.ini +exit \ No newline at end of file diff --git a/Docker/Dockerfile/Frp/frpc/frpc.ini b/Docker/Dockerfile/Frp/frpc/frpc.ini new file mode 100644 index 0000000..f457811 --- /dev/null +++ b/Docker/Dockerfile/Frp/frpc/frpc.ini @@ -0,0 +1,30 @@ +[common] +server_addr = {{ .Envs.FRP_SERVER_ADDR }} +server_port = 7000 +token = 12345678 + +[windows] +type = tcp +local_ip = {{ .Envs.FRP_WINDOWS_IP }} +local_port = {{ .Envs.FRP_WINDOWS_PORT }} +remote_port = 3389 + +#liunx tcp 端口写法 +; [liunx] +; type = tcp +; local_ip = 127.0.0.1 +; local_port = 22 +; remote_port = 22 + +#esxi 端口写法 +; [esxi-web] +; type = tcp +; local_ip = {{ .Envs.FRP_ESXI_WEB__ADDR }} +; local_port = 443 +; remote_port = 20000 + +; [esxi-902] +; type = tcp +; local_ip = {{ .Envs.FRP_ESXI_VSPHERE_API_ADDR }} +; local_port = 902 +; remote_port = 902 diff --git a/Docker/Dockerfile/Frp/frps/404.html b/Docker/Dockerfile/Frp/frps/404.html new file mode 100644 index 0000000..0ccf839 --- /dev/null +++ b/Docker/Dockerfile/Frp/frps/404.html @@ -0,0 +1,21 @@ + + + + +链接失败 + + + +

请联系管理人员 Mr .Ding

+

实在抱歉一定要抓紧联系(家里停电|屋子着火|----).
+请一定要联系我.

+

我需要知道家里的状况 哈哈.

+

感谢您的配合.

+ + diff --git a/Docker/Dockerfile/Frp/frps/Dockerfile b/Docker/Dockerfile/Frp/frps/Dockerfile new file mode 100644 index 0000000..7eb7799 --- /dev/null +++ b/Docker/Dockerfile/Frp/frps/Dockerfile @@ -0,0 +1,35 @@ +FROM alpine:latest + +LABEL maintainer="Offends " + +ARG VERSION_ARG + +ENV VERSION=${VERSION_ARG:-0.53.2} + +RUN if [ $(arch) = "x86_64" ] || [ $(arch) = "amd64" ]; then \ + ARCH_TYPE="amd64"; \ + elif [ $(arch) = "aarch64" ] || [ $(arch) = "arm64" ]; then \ + ARCH_TYPE="arm"; \ + else \ + ARCH_TYPE="amd64"; \ + fi \ + && wget https://github.com/fatedier/frp/releases/download/v${VERSION}/frp_${VERSION}_linux_${ARCH_TYPE}.tar.gz \ + && tar -zvxf frp_${VERSION}_linux_${ARCH_TYPE}.tar.gz \ + && cp -r frp_${VERSION}_linux_${ARCH_TYPE} frp \ + && mv /frp/frps /usr/local/bin/ \ + && rm -rf /frp/frpc* /frp/LICENSE \ + && rm -rf /frp_${VERSION}_linux_${ARCH_TYPE}* + +COPY ./frps.ini /frp/frps.ini + +COPY ./404.html /frp/404.html + +WORKDIR /frp + +#客户端连接端口 +EXPOSE 7000 + +#frp Web端 +EXPOSE 7500 + +CMD /usr/local/bin/frps -c /frp/frps.ini \ No newline at end of file diff --git a/Docker/Dockerfile/Frp/frps/README.md b/Docker/Dockerfile/Frp/frps/README.md new file mode 100644 index 0000000..0774ca1 --- /dev/null +++ b/Docker/Dockerfile/Frp/frps/README.md @@ -0,0 +1,23 @@ +* + +> 本文作者:丁辉 + +# **Frps内网穿透** + +> Frps为内网穿透服务端 + +## Docker构建 + +构建镜像 + +> 默认构建 0.53.2 版本 + +```bash +docker build -t registry.cn-hangzhou.aliyuncs.com/offends/frp:frps . +``` + +> 手动选择构建版本 + +```bash +docker build --build-arg VERSION_ARG=0.53.2 -t registry.cn-hangzhou.aliyuncs.com/offends/frp:frps . +``` diff --git a/Docker/Dockerfile/Frp/frps/frps.ini b/Docker/Dockerfile/Frp/frps/frps.ini new file mode 100644 index 0000000..02cda7e --- /dev/null +++ b/Docker/Dockerfile/Frp/frps/frps.ini @@ -0,0 +1,10 @@ +[common] +bind_port = 7000 +dashboard_port = 7500 +token = 12345678 +dashboard_user = admin +dashboard_pwd = admin +#vhost_http_port = 80 +#vhost_https_port = 443 +custom_404_page = /frp/404.html +max_pool_count = 5 \ No newline at end of file diff --git a/Docker/Dockerfile/Mysql/Dockerfile b/Docker/Dockerfile/Mysql/Dockerfile new file mode 100644 index 0000000..1eb72c7 --- /dev/null +++ b/Docker/Dockerfile/Mysql/Dockerfile @@ -0,0 +1,20 @@ +FROM mysql:5.7 +# FROM mysql:8 + +ENV MYSQL_USER=demo \ + MYSQL_PASSWORD=demo \ + MYSQL_DATABASE=demo \ + MYSQL_ROOT_PASSWORD=root + +COPY ./sql/* /docker-entrypoint-initdb.d/ + +# 更改配置文件 +#COPY ./my.cnf /etc/my.cnf + +CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] + +# 旧加密方式 +# --default-authentication-plugin=mysql_native_password +# 是一种基本的身份验证插件,它使用经典的 MySQL 加密方法来存储和验证用户的密码。这意味着用户的密码以散列形式存储在数据库中,而在用户登录时,其密码将与存储的散列进行比较。 +# 新加密方式 +# --default-authentication-plugin=caching_sha2_password diff --git a/Docker/Dockerfile/Mysql/Dockerfile-secrets b/Docker/Dockerfile/Mysql/Dockerfile-secrets new file mode 100644 index 0000000..15c879d --- /dev/null +++ b/Docker/Dockerfile/Mysql/Dockerfile-secrets @@ -0,0 +1,14 @@ +FROM mysql:5.7 +# FROM mysql:8 + +ENV MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root-pass \ + MYSQL_USER=demo \ + MYSQL_DATABASE=demo \ + MYSQL_PASSWORD_FILE=/run/secrets/mysql-demo-pass + +COPY ./sql/* /docker-entrypoint-initdb.d/ + +# 更改配置文件 +#COPY ./my.cnf /etc/my.cnf + +CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] \ No newline at end of file diff --git a/Docker/Dockerfile/Mysql/README.md b/Docker/Dockerfile/Mysql/README.md new file mode 100644 index 0000000..5648951 --- /dev/null +++ b/Docker/Dockerfile/Mysql/README.md @@ -0,0 +1,21 @@ +* + +> 本文作者:丁辉 + +# Mysql 镜像构建 + +- 自动初始化 Mysql 数据库, 构建示例 + + ```bash + docker build -t <镜像名:标签> . + ``` + +- Mysql 通过 Secrets 隐藏构建账户密码, 示例 + + [Mysql-Secrets 使用](https://gitee.com/offends/Kubernetes/tree/main/Docker/Docker%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3/Mysql-secrets%E4%BD%BF%E7%94%A8.md) + + ```bash + docker build -t <镜像名:标签> --file=./Dockerfile-secrets . + ``` + + diff --git a/Docker/Dockerfile/Mysql/my.cnf b/Docker/Dockerfile/Mysql/my.cnf new file mode 100644 index 0000000..df17f8a --- /dev/null +++ b/Docker/Dockerfile/Mysql/my.cnf @@ -0,0 +1 @@ +# 写入配置文件指定内容 \ No newline at end of file diff --git a/Docker/Dockerfile/Mysql/sql/01_init_offends.sql b/Docker/Dockerfile/Mysql/sql/01_init_offends.sql new file mode 100644 index 0000000..2cf9426 --- /dev/null +++ b/Docker/Dockerfile/Mysql/sql/01_init_offends.sql @@ -0,0 +1 @@ +-- 初始化基础 sql \ No newline at end of file diff --git a/Docker/Dockerfile/Nginx/Dockerfile b/Docker/Dockerfile/Nginx/Dockerfile new file mode 100644 index 0000000..1b7792d --- /dev/null +++ b/Docker/Dockerfile/Nginx/Dockerfile @@ -0,0 +1,16 @@ +# 推荐使用最新版,漏洞会较少,通过漏洞扫描的几率较大 +#FROM nginx:latest +FROM nginx:alpine + +# 初始化 NGINX 配置文件 +ENV NGINX_ENVSUBST_TEMPLATE_DIR=/etc/nginx/templates \ + NGINX_ENVSUBST_TEMPLATE_SUFFIX=.template \ + NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx/conf.d + +COPY ./templates/*.template /etc/nginx/templates/ + +COPY ./nginx.conf /etc/nginx/nginx.conf + +# 自定义初始化变量 +ENV NGINX_PORT=80 \ + NGINX_HOST=localhost \ No newline at end of file diff --git a/Docker/Dockerfile/Nginx/Dockerfile-node b/Docker/Dockerfile/Nginx/Dockerfile-node new file mode 100644 index 0000000..dfdcba0 --- /dev/null +++ b/Docker/Dockerfile/Nginx/Dockerfile-node @@ -0,0 +1,16 @@ +# 多阶段构建 +FROM node:14 as build + +COPY . /app + +WORKDIR /app + +RUN npm config set registry https://registry.npmmirror.com \ + && npm install \ + && npm run build:prod + +FROM nginx:alpine + +COPY --from=build /app/dist /app/www + +COPY ./web.conf /etc/nginx/conf.d/default.conf diff --git a/Docker/Dockerfile/Nginx/README.md b/Docker/Dockerfile/Nginx/README.md new file mode 100644 index 0000000..dcead97 --- /dev/null +++ b/Docker/Dockerfile/Nginx/README.md @@ -0,0 +1,12 @@ +* + +> 本文作者:丁辉 + +# Nginx 镜像构建 + +> Dockerfile示例 + +| 文件名 | 示例作用 | 构建示例 | +| :-------------: | :-------------------------------------: | :----------------------------------------------: | +| Dockerfile | 示例如何通过环境变量更改Nginx配置文件 | docker build -t 镜像名:标签 . | +| Dockerfile-ndoe | 示例如何通过过阶段构建,构建Npm前端代码 | docker build -t 镜像名:标签 -f Dockerfile-node . | diff --git a/Docker/Dockerfile/Nginx/nginx.conf b/Docker/Dockerfile/Nginx/nginx.conf new file mode 100644 index 0000000..ee8c7fd --- /dev/null +++ b/Docker/Dockerfile/Nginx/nginx.conf @@ -0,0 +1,31 @@ +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; +} \ No newline at end of file diff --git a/Docker/Dockerfile/Nginx/templates/default.conf.template b/Docker/Dockerfile/Nginx/templates/default.conf.template new file mode 100644 index 0000000..449ef0d --- /dev/null +++ b/Docker/Dockerfile/Nginx/templates/default.conf.template @@ -0,0 +1,17 @@ +server { + listen ${NGINX_PORT}; + listen [::]:${NGINX_PORT}; + server_name ${NGINX_HOST}; + + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} \ No newline at end of file diff --git a/Docker/Dockerfile/Nginx/web.conf b/Docker/Dockerfile/Nginx/web.conf new file mode 100644 index 0000000..f5b8709 --- /dev/null +++ b/Docker/Dockerfile/Nginx/web.conf @@ -0,0 +1,8 @@ +server { + listen 80; + + location / { + root /app/www; + index index.html index.htm; + } +} diff --git a/Docker/Docs/Docker使用文档/DockerHub上传双架构镜像.md b/Docker/Docs/Docker使用文档/DockerHub上传双架构镜像.md new file mode 100644 index 0000000..a58eaf7 --- /dev/null +++ b/Docker/Docs/Docker使用文档/DockerHub上传双架构镜像.md @@ -0,0 +1,188 @@ +> 本文作者:丁辉 + +# DockerHub上传双架构镜像 + +## Docker manifest 推送双架构镜像 + +[官网文档](https://docs.docker.com/engine/reference/commandline/manifest/) + +1. 构建并推送镜像 + + - X85执行 + + ```bash + docker build -t offends/demo-x86:v1 . + docker push offends/demo-x86:v1 + ``` + + - arm执行 + + ```bash + docker build -t offends/demo-arm:v1 . + docker push offends/demo-arm:v1 + ``` + +2. 创建 manifest + + ```bash + docker manifest create offends/demo:v1 \ + offends/demo-x86:v1 \ + offends/demo-arm:v1 + ``` + +3. 为镜像指定架构 + + ```bash + docker manifest annotate offends/demo-x86:v1 \ + offends/demo-x86:v1 \ + --os linux --arch x86_64 + + docker manifest annotate offends/demo-arm:v1 \ + offends/demo-arm:v1 \ + --os linux --arch arm64 --variant v8 + ``` + +4. 查看 + + ```bash + docker manifest inspect offends/demo:v1 + ``` + +5. 推送 + + ```bash + docker manifest push offends/demo:v1 + ``` + +## Docker Buildx 推送双架构镜像 + +[Buildx二进制文件下载](https://github.com/docker/buildx/releases) + +[模拟仓库文档](https://github.com/tonistiigi/binfmt) + +[官网文档](https://docs.docker.com/build/building/multi-platform/) + +1. 安装 Buildx + + ```bash + mkdir -p ~/.docker/cli-plugins + mv buildx-v*.linux-amd64 ~/.docker/cli-plugins/docker-buildx + chmod +x ~/.docker/cli-plugins/docker-buildx + docker buildx version + ``` + +2. 添加模拟仓库 + + ```bash + docker run --privileged --rm tonistiigi/binfmt --install all + ``` + + > 内核版本需要升级,如果过低无法添加成功 + +3. 查看 + + ```bash + docker buildx ls + #一下是输出 + NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS + default * docker + default default running v0.8+unknown linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6 + ``` + +4. 创建 builder 示例 + + ```bash + docker buildx create --name dmeo --use + ``` + +5. 构建混合建构镜像 + + ```bash + docker buildx build --platform linux/amd64,linux/arm64/v8 -t demo:v1 --push . + ``` + +## Docker Buildx使用私有仓库 推送双架构镜像 + +### 部署私有镜像仓库 + +[Docker hub文档](https://docs.docker.com/registry/) + +[GitHub文档](https://github.com/distribution/distribution) + +1. 启动镜像仓库 + + ```bash + docker run -d \ + --name docker-registry \ + --restart=always \ + -p 5000:5000 \ + -v /root/private-registry:/var/lib/registry \ + registry + ``` + +2. 将本机Docker添加非安全仓库 + + > Buildx 只允许 https 协议的镜像仓库使用,这里的方法之建议测试使用 + + ```bash + cat > /etc/docker/daemon.json < /etc/buildkit/buildkitd.toml << EOF + debug = true + [registry."192.168.1.10:5000"] + http = true + insecure = true + EOF + ``` + +6. 创建 builder + + ```bash + docker buildx create --use \ + --name builder \ + --driver-opt image=192.168.1.10:5000/buildkit:buildx-stable-1 \ + --config /etc/buildkit/buildkitd.toml + ``` + +7. 构建混合建构镜像 + + ```bash + docker buildx build --platform linux/amd64,linux/arm64/v8 -t 192.168.1.10:5000/demo:v1 --push . + ``` + +8. 查看 + + ```bash + curl http://192.168.1.10:5000/v2/_catalog + ``` + +### 清理 + +删除构建器实例 + +```bash + docker buildx rm builder +``` + diff --git a/Docker/Docs/Docker使用文档/Docker上下文配置.md b/Docker/Docs/Docker使用文档/Docker上下文配置.md new file mode 100644 index 0000000..ea4a137 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker上下文配置.md @@ -0,0 +1,63 @@ +> 本文作者:丁辉 + +# Docker 上下文 + +## 基础命令 + +> 示例新上下文名为: docker-node2 + +- 查看当前上下文 + + ```bahs + docker context ls + ``` + +- 详细查看上下文信息 + + ```bash + docker context inspect default + ``` + +- 创建新的上下文 + + ```bash + docker context create docker-node2 --docker host=tcp://docker:2375 + ``` + +- 切换上下文 + + ```bash + docker context use docker-node2 + ``` + + > 通过变量切换 + > + > ```bash + > export DOCKER_CONTEXT=docker-node2 + > ``` + > + > 全局`--context`标志覆盖上下文 + > + > ```bash + > docker --context production container ls + > ``` + +- 导出上下文 + + ```bash + docker context export docker-node2 + ``` + +- 导入上下文 + + ```bash + docker context import docker-node2 docker-node2.dockercontext + ``` + +- 更新上下文 + + ```bash + docker context update docker-node2 --description "Test context" + ``` + + \ No newline at end of file diff --git a/Docker/Docs/Docker使用文档/Docker常用命令及参数.md b/Docker/Docs/Docker使用文档/Docker常用命令及参数.md new file mode 100644 index 0000000..8a6f297 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker常用命令及参数.md @@ -0,0 +1,118 @@ +> 本文作者:丁辉 + +# Docker基础命令 + +> 当然太简单的咱们就不记了,闭眼都会 + +## 基础命令 + +- 查看指定 Docker 镜像的历史记录,这个命令可以帮助你了解镜像是如何构建的 + + ```bash + docker image history app:v1 + ``` + +## 拉取镜像命令 + +- 普通拉取镜像命令 + + ```bash + docker pull nginx:latest + ``` + +- 拉取 AMD64 镜像命令 + + ```bash + docker pull --platform linux/amd64 nginx:latest + ``` + +- 拉取 ARM64 镜像命令 + + ```bash + docker pull --platform linux/arm64 nginx:latest + ``` + +## 清理资源命令 + +- 批量删除 Exited 容器 + + ```bash + docker rm $(docker ps -q -f status=exited) + ``` + +- 批量删除所有容器 + + ```bash + docker rm -f $(docker ps -a --format "{{.Names}}") + ``` + +- 移除所有没有使用的镜像 + + ```bash + docker image prune -a + ``` + + > 跳过警告提示:`--force`或`-f` + > + > ```bash + > docker image prune -f + > ``` + > + > 清理所有无用的镜像 + > + > ```bash + > docker image prune --all --force + > ``` + > + > 超过24小时创建的镜像 + > + > ```bash + > docker image prune -a --filter "until=24h" + > ``` + +- 清理不再使用的移除容器 + + ```bash + docker container prune + ``` + +- 移除卷 + + ```bash + docker volume prune + ``` + +- 移除网络 + + ```bash + docker network prune + ``` + +- 清理卷 + + ```bash + docker system prune --volumes + ``` + +- 用于清理 Docker 系统中不再使用的资源,包括容器、镜像、网络和数据卷 + + ```bash + docker system prune -a + ``` + +## 基本构建参数 + +| 参数 | 描述 | 用法示例 | +| ------------------------- | ------------------------------------------------------------ | --------------------------------------------------- | +| `--target` | 选择构建过程中的目标阶段(Stage)。 | `docker build --target my-stage .` | +| `--no-cache` | 强制忽略缓存,每个指令都将重新执行。 | `docker build --no-cache .` | +| `--build-arg` | 设置构建过程中的参数变量。 | `docker build --build-arg MY_VAR=value .` | +| `--squash` | 合并镜像的历史记录以减小镜像层级数和总体积。 | `docker build --squash -t myimage:latest .` | +| `--disable-content-trust` | 在执行 `docker push` 和 `docker pull` 等命令时禁用内容信任。 | `docker build --disable-content-trust -t myimage .` | + +## 启动参数 + +| 参数 | 描述 | 用法示例 | +| ----------------- | -------------------------------------- | ------------------------------------ | +| `--cpus=2` | 限制容器使用的 CPU 核心数量为 2 个。 | `docker run --cpus=2 myimage` | +| `--memory="200m"` | 限制容器可用的内存为 200 兆字节 (MB)。 | `docker run --memory="200m" myimage` | \ No newline at end of file diff --git a/Docker/Docs/Docker使用文档/Docker常用配置文件配置.md b/Docker/Docs/Docker使用文档/Docker常用配置文件配置.md new file mode 100644 index 0000000..1cf3d58 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker常用配置文件配置.md @@ -0,0 +1,74 @@ +> 本文作者:丁辉 + +# Docker常用配置文件配置 + +## 更改IP池 + +- 添加如下参数 + + ```bash + vi /etc/docker/daemon.json + ``` + + ```json + { + "default-address-pools" : [ + { + "base" : "192.168.0.0/16", + "size" : 24 + } + ] + } + ``` + +## 指定的 Cgroups 驱动程序 + +- 添加如下参数 + + ```bash + vi /etc/docker/daemon.json + ``` + + ```bash + { + "exec-opts": ["native.cgroupdriver=systemd"] + } + ``` + +- 验证 + + ```bash + docker info|grep "Cgroup Driver" + ``` + +## Docker启用实验性CLI功能 + +**第一种** + +- 客户端开启 + + ```bash + vi ~/.docker/config.json + ``` + + ```bash + { + "experimental": "enabled" + } + ``` + +**第二种** + +- 服务端开启 + + ```bash + vi /etc/docker/daemon.json + ``` + + ```bash + { + "experimental": true + } + ``` + + diff --git a/Docker/Docs/Docker使用文档/Docker更改IP池.md b/Docker/Docs/Docker使用文档/Docker更改IP池.md new file mode 100644 index 0000000..68e316c --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker更改IP池.md @@ -0,0 +1,33 @@ +> 本文作者:丁辉 + +# Docker更改IP池 + +1. 更改配置文件 + + ```bash + vi /etc/docker/daemon.json + ``` + + 内容如下 + + ```bash + { + "default-address-pools" : [ + { + "base" : "192.168.0.0/16", + "size" : 24 + } + ] + } + ``` + +2. 重启 Docker + + ```bash + systemctl restart docker + ``` + + + + + diff --git a/Docker/Docs/Docker使用文档/Docker构建镜像.md b/Docker/Docs/Docker使用文档/Docker构建镜像.md new file mode 100644 index 0000000..b177f43 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker构建镜像.md @@ -0,0 +1,99 @@ +> 本文作者:丁辉 + +# Docker 构建镜像 + +> Docker 构建镜像有很多门道,今天咱就来说道说道,直接实际演示 +> +> 为了方便简单演示,咱们就随便打包一份文件当作示例好了 + +## 多阶段构建 + +- 编写 Dockerfile + + > 使用 AS 参数,后面定义名称 + > + > 第二个容器直接 COPY 第一个容器所构建好的文件包使用 + + ```bash + vi Dockerfile + ``` + + ```dockerfile + FROM alpine AS builder + + RUN apk add git \ + && git clone https://gitee.com/offends/Docs.git \ + && tar -cvf Docker-Template.tar ./Docker-Template + + FROM alpine + + COPY --from=builder /Docker-Template.tar / + ``` + + 开始构建 + + ```bash + docker build -t app:v1 . + ``` + +## 多阶段构建,选定构建容器 + +- 编写 Dockerfile + + > 当我们在一个 Dockerfile 中定义了多个容器构建,这里我门可以使用 `--target` 参数指定特定的容器构建 + > + + ```bash + vi Dockerfile + ``` + + ```dockerfile + FROM alpine AS builder + + RUN apk add git \ + && git clone https://gitee.com/offends/Docs.git \ + && tar -cvf Docker-Template.tar ./Docker-Template + + FROM alpine AS builder-2 + + COPY --from=builder /Docker-Template.tar / + RUN rm -rf /Docker-Template.tar + + FROM alpine AS builder-3 + + COPY --from=builder /Docker-Template.tar / + RUN tar -xvf /Docker-Template.tar + ``` + + 开始构建 + + ```bash + docker build --target builder-3 -t app:v1 . + ``` + +## 替换构建镜像或参数 + +- 编写 Dockerfile + + > Dockerfile 可定义变量在外部指定 + > + + ```bash + vi Dockerfile + ``` + + ```dockerfile + # 默认镜像使用 alpine ,通过外部定义修改镜像为 ubuntu + ARG IMAGE=alpine + FROM ${IMAGE} + + # 定义一个ENV,默认值为: default_env,外部传入 NAME_ARG 让 NAME 变量值改变为 demo_env + ARG NAME_ARG + ENV NAME=${NAME_ARG:-default_env} + ``` + + 开始构建 + + ```bash + docker build --build-arg NAME_ARG=demo_env --build-arg IMAGE=ubuntu -t app:v1 . + ``` diff --git a/Docker/Docs/Docker使用文档/Docker配合Mysql-Secrets使用.md b/Docker/Docs/Docker使用文档/Docker配合Mysql-Secrets使用.md new file mode 100644 index 0000000..ea18fe9 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker配合Mysql-Secrets使用.md @@ -0,0 +1,63 @@ +> 本文作者:丁辉 + +# Docker配合Mysql-Secrets使用 + +1. 配置密码 + + ```bash + echo "root" > root-pass.txt + echo "root" > offends-pass.txt + ``` + +2. 创建 Secrets + + ```bash + docker secret create mysql-root-pass ./root-pass.txt + docker secret create mysql-offends-pass ./offends-pass.txt + ``` + +3. 构建容器 + + ```bash + docker build -t mysql:v1 --file=./Dockerfile-secrets . + ``` + +4. 创建持久化目录 + + ```bash + mkdir /data/mysqld + ``` + +5. 启动容器 + + ```bash + docker service create \ + --name mysql \ + --replicas 1 \ + --publish published=3306,target=3306 \ + --mount type=bind,source=/data/mysqld,destination=/var/lib/mysql \ + --secret source=mysql-root-pass,target=/run/secrets/mysql-root-pass \ + --secret source=mysql-offends-pass,target=/run/secrets/mysql-offends-pass \ + mysql:v1 + ``` + +6. 查看 + + ```bash + docker service ps mysql + ``` + + > 查看完整事件 + > + > ```bash + > docker service ps mysql --no-trunc + > ``` + +7. 停止容器 + + ```bash + docker service rm mysql + ``` + + + diff --git a/Docker/Docs/Docker使用文档/Docker配置2375端口.md b/Docker/Docs/Docker使用文档/Docker配置2375端口.md new file mode 100644 index 0000000..41dff3c --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker配置2375端口.md @@ -0,0 +1,165 @@ +> 本文作者:丁辉 + +# Docker配置2375端口 + +## 方法一 + +1. 配置 `/etc/docker/daemon.json` 文件 + + ```bash + vi /etc/docker/daemon.json + ``` + + 内容如下 + + ```json + { + "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] + } + ``` + +2. 重载并重启 Docker + + ```bash + systemctl daemon-reload + systemctl restart docker + ``` + +## 方法二 + +1. 修改 `/usr/lib/systemd/system/docker.service` 文件 + + ```bash + vi /usr/lib/systemd/system/docker.service + ``` + + - 旧版 Docker + + ```bash + ExecStart=/usr/local/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock + ``` + + - 新版 Docker + + ```bash + ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock + ``` + +2. 重载并重启 Docker + + ```bash + systemctl daemon-reload + systemctl restart docker + ``` + +## 验证 + +- 查看端口是否启动 + + ```bash + netstat -anput | grep 2375 + ``` + +- 测试 + + ```bash + docker -H tcp://192.168.1.10:2375 ps + ``` + +# 配置证书访问 + +1. 可以使用本脚本生成证书 + + ```bash + curl -Os https://gitee.com/offends/Linux/raw/main/File/Shell/openssl-cert.sh && chmod 777 ./openssl-cert.sh + ``` + + > 修改 + > + > ```bash + > IP="127.0.0.1" # 本地 IP 地址 + > PASSWORD="123456" # 证书密码 + > VALIDITY_PERIOD=3650 # 证书有效时间 + > ``` + +2. 执行脚本 + + ```bash + ./openssl-cert.sh + ``` + +3. 修改 `/usr/lib/systemd/system/docker.service` 文件 + + ```bash + vi /usr/lib/systemd/system/docker.service + ``` + + - 旧版 Docker + + ```bash + ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/cert/2375/ca.pem --tlscert=/etc/docker/cert/2375/server-cert.pem --tlskey=/etc/docker/cert/2375/server-key.pem -H unix:///var/run/docker.sock + ``` + + - 新版 Docker + + ```bash + ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/cert/2375/ca.pem --tlscert=/etc/docker/cert/2375/server-cert.pem --tlskey=/etc/docker/cert/2375/server-key.pem -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock + ``` + +4. 重载并重启 Docker + + ```bash + systemctl daemon-reload + systemctl restart docker + ``` + +5. 验证 + + ```bash + docker --tlsverify --tlscacert=/etc/docker/cert/2375/ca.pem --tlscert=/etc/docker/cert/2375/server-cert.pem --tlskey=/etc/docker/cert/2375/server-key.pem -H tcp://192.168.1.10:2375 ps + ``` + +# 问题记录 + +> [方法一] 由于 Docker 在最近新版更换了容器引擎为 Containerd, daemon.json 文件如果配置原来的通信套接字文件路径是不行的,现在也没有更好的解决方案,本次我就记录一下从老外那里学来的方法。 +> +> 嗯......为什么说这个方案也不是很对呢,因为他会替换你的 Docker 启动命令,那为什么不直接改 `docker.service` 呢?反正咱只是记录一下,通过修改 docker.service 方法我也放在 [方法二] 里了你们自己看吧 + +1. 配置 `/etc/docker/daemon.json` 文件 + + ```bash + vi /etc/docker/daemon.json + ``` + + 内容如下 + + ```json + { + "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"] + } + ``` + +2. 创建 `override.conf` 文件 + + ```bash + mkdir -p /etc/systemd/system/docker.service.d/ + vi /etc/systemd/system/docker.service.d/override.conf + ``` + + 文件内容为 + + ```bash + [Service] + ExecStart= + ExecStart=/usr/bin/dockerd --config-file /etc/docker/daemon.json + ``` + +3. 重载并重启 Docker + + ```bash + systemctl daemon-reload + systemctl restart docker + ``` + + + diff --git a/Docker/Docs/Docker使用文档/Docker配置代理.md b/Docker/Docs/Docker使用文档/Docker配置代理.md new file mode 100644 index 0000000..5e02108 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker配置代理.md @@ -0,0 +1,83 @@ +> 本文作者:丁辉 + +# Docker配置代理 + +## Docker服务代理配置 + +> 此方法适用于 `docker pull` 镜像配置代理 + +创建 Systemd 代理文件 + +```bash +mkdir -p /etc/systemd/system/docker.service.d +touch /etc/systemd/system/docker.service.d/proxy.conf +``` + +内容如下 + +```bash +[Service] +Environment="HTTP_PROXY=http://127.0.0.1:15777" +Environment="HTTPS_PROXY=http://127.0.0.1:15777" +Environment="NO_PROXY=localhost,127.0.0.1,example.com" +``` + +- `HTTP_PROXY=`:设置HTTP代理服务器 +- `HTTPS_PROXY=`:设置HTTPS代理服务器 +- `NO_PROXY=""`:设置不使用代理服务器的域名或IP地址列表 + +> 将 `http://127.0.0.1:15777` 换成可用的代理即可 + +重启生效 + +```bash +systemctl daemon-reload +systemctl restart docker +``` + +## 容器内部代理 + +> 在容器运行阶段,如果需要代理上网,则需要配置 `~/.docker/config.json`。 + +创建 Config.json 代理文件 + +```bash +mkdir ~/.docker/ +vi ~/.docker/config.json +``` + +内容如下 + +```json +{ + "proxies": + { + "default": + { + "httpProxy": "http://192.168.1.100:15777", + "httpsProxy": "http://192.168.1.100:15777", + "noProxy": "localhost,127.0.0.1,example.com" + } + } +} +``` + +> 此外, 也可以直接在容器运行时通过注入 `http_proxy` 等环境变量进行代理 + +重启生效 + +```bash +systemctl daemon-reload +systemctl restart docker +``` + +## DockerBuild代理 + +```bash +docker build . \ + --build-arg "HTTP_PROXY=http://192.168.1.100:15777" \ + --build-arg "HTTPS_PROXY=http://192.168.1.100:15777" \ + --build-arg "NO_PROXY=localhost,127.0.0.1,example.com" \ + -t your/image:tag +``` + diff --git a/Docker/Docs/Docker使用文档/Docker配置守护进程.md b/Docker/Docs/Docker使用文档/Docker配置守护进程.md new file mode 100644 index 0000000..f78198b --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker配置守护进程.md @@ -0,0 +1,137 @@ +> 本文作者:丁辉 + +# Docker配置守护进程 + +> 通过修改 `/etc/docker/daemon.json` 配置守护进程 +> +> [官方文档](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon) [示例文件位置](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file) + +- 编写基础配置 + + ```json + { + "registry-mirrors": [ + "https://dockerhub.azk8s.cn", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com" + ], + "insecure-registries": [], + "max-concurrent-downloads": 10, + "max-concurrent-uploads": 10, + "log-driver": "json-file", + "log-level": "warn", + "log-opts": { + "max-size": "10m", + "max-file": "3" + }, + "data-root": "/var/lib/docker" + } + ``` + +- 建立垃圾收集 + + ```json + { + "builder": { + "gc": { + "enabled": true, + "defaultKeepStorage": "10GB", + "policy": [ + { "keepStorage": "10GB", "filter": ["unused-for=2200h"] }, + { "keepStorage": "50GB", "filter": ["unused-for=3300h"] }, + { "keepStorage": "100GB", "all": true } + ] + } + } + } + ``` + +- 验证守护进程配置文件 + + ```bash + dockerd --validate --config-file=/etc/docker/daemon.json + ``` + +- 重载 Docker + + ```bash + systemctl reload docker + ``` + + + +# 参数 + +| 参数 | 用法和说明 | 默认值/示例 | +| -------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| allow-nondistributable-artifacts | 允许的非分发性文件列表(为空) | true/false | +| api-cors-header | API的跨源资源共享(CORS)头部,允许对API进行跨域请求 | "" (空字符串)或 * 或指定IP地址或域名 | +| authorization-plugins | 授权插件列表(为空) | | +| bip | 容器网络的默认桥接接口的IP范围 | "" (空字符串) | +| bridge | 指定容器网络的默认桥接接口 | "" (空字符串) | +| cgroup-parent | 指定容器的cgroup父目录 | | +| containerd | 容器运行时 containerd 的socket路径 | "/run/containerd/containerd.sock" | +| containerd-namespace | 容器运行时 containerd 的命名空间 | "docker" | +| containerd-plugin-namespace | 容器运行时 containerd 插件的命名空间 | "docker-plugins" | +| data-root | Docker 数据的根目录路径 | | +| debug | 是否启用调试模式 | true/false(根据具体实现或配置文件而定) | +| default-address-pools | 默认的地址池设置列表,包括基础地址和子网大小 | 示例:[](空列表) | +| default-cgroupns-mode | 默认的cgroup命名空间模式(通常是私有) | "private"(私有模式) | +| default-gateway | 默认网关设置 | | +| default-gateway-v6 | 默认IPv6网关设置 | | +| default-network-opts | 默认网络选项 | | +| default-runtime | 默认容器运行时 | "runc"(具体容器运行时的名称) | +| default-shm-size | 默认的共享内存大小 | "64M"(64兆字节) | +| default-ulimits | 默认的ulimit设置,指定文件描述符的硬限制和软限制 | 示例:{"nofile": {"Hard": 64000, "Name": "nofile", "Soft": 64000}} (文件描述符限制示例) | +| dns | DNS服务器列表 | 示例:[](空列表) | +| dns-opts | DNS选项列表 | 示例:[](空列表) | +| dns-search | DNS搜索域列表 | 示例:[](空列表) | +| exec-opts | 容器执行参数列表 | 示例:[](空列表) | +| exec-root | 容器执行的根目录路径 | "" (空字符串) | +| experimental | 是否启用实验性功能 | true/false(根据具体实现或配置文件而定) | +| features | Docker功能列表 | | +| fixed-cidr | 固定CIDR地址设置(通常用于设置 Docker 容器的 IP 地址) | "" (空字符串) | +| fixed-cidr-v6 | 固定IPv6 CIDR地址设置(通常用于设置 Docker 容器的 IPv6 地址) | "" (空字符串) | +| group | Docker进程的用户组 | | +| hosts | 主机名设置列表 | 示例:[](空列表) | +| proxies | 代理设置,包括HTTP代理、HTTPS代理和不使用代理的地址列表 | | +| icc | 是否启用容器间通信 | false (默认值为false) | +| init | 是否启用自定义初始化进程 | false (默认值为false) | +| init-path | 自定义初始化进程的路径 | "/usr/libexec/docker-init" | +| insecure-registries | 不安全的镜像仓库列表 | 示例:[](空列表) | +| ip | Docker守护进程监听的IP地址 | 0.0.0.0 | +| ip-forward | 是否启用IP转发 | false (默认值为false) | +| ip-masq | 是否启用IP伪装 | false (默认值为false) | +| iptables | 是否启用iptables | false (默认值为false) | +| ip6tables | 是否启用ip6tables | false (默认值为false) | +| ipv6 | 是否启用IPv6 | true/false(根据具体实现或配置文件而定) | +| labels | 标签设置列表 | 示例:[](空列表) | +| live-restore | 是否启用容器守护进程在宕机时自动恢复容器 | true/false(根据具体实现或配置文件而定) | +| log-driver | 日志驱动设置(默认为json-file) | "json-file"(JSON文件) | +| log-level | 日志级别设置 | "" (空字符串) | +| log-opts | 日志选项设置,包括缓存禁用、缓存大小、缓存最大文件数等 | 示例:{"max-size": "10m", "max-file": "5"}(最大大小为10兆字节,最大文件数为5) | +| max-concurrent-downloads | 最大并发下载任务数 | 3(示例值) | +| max-concurrent-uploads | 最大并发上传任务数 | 5(示例值) | +| max-download-attempts | 最大下载尝试次数 | 5(示例值) | +| mtu | 最大传输单元设置 | 0(示例值) | +| no-new-privileges | 是否禁用新特权 | false (默认值为false) | +| node-generic-resources | 节点通用资源列表,通常用于指定GPU等硬件资源 | 示例:["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"](GPU资源示例) | +| oom-score-adjust | OOM分数调整设置 | 0(示例值) | +| pidfile | PID文件路径设置 | | +| raw-logs | 是否启用原始日志记录 | true/false(根据具体实现或配置文件而定) | +| registry-mirrors | 镜像仓库镜像设置列表 | 示例:[](空列表) | +| runtimes | 容器运行时设置,可以包括自定义运行时的路径和参数 | | +| seccomp-profile | 安全策略配置文件路径 | "" (空字符串) | +| selinux-enabled | 是否启用SELinux | true/false(根据具体实现或配置文件而定) | +| shutdown-timeout | 容器守护进程关闭超时设置 | 15(示例值) | +| storage-driver | 存储驱动设置 | | +| storage-opts | 存储选项设置列表 | 示例:[](空列表) | +| swarm-default-advertise-addr | Swarm模式下的默认广告地址设置 | | +| tls | 是否启用TLS | true/false(根据具体实现或配置文件而定) | +| tlscacert | TLS CA证书路径 | | +| tlscert | TLS证书路径 | | +| tlskey | TLS密钥路径 | | +| tlsverify | 是否验证TLS | true/false(根据具体实现或配置文件而定) | +| userland-proxy | 是否使用用户空间代理 | true/false(根据具体实现或配置文件而定) | +| userland-proxy-path | 用户空间代理的路径 | "/usr/libexec/docker-proxy" | +| userns-remap | 用户命名空间重映射设置 | | diff --git a/Docker/Docs/Docker使用文档/Docker配置镜像加速.md b/Docker/Docs/Docker使用文档/Docker配置镜像加速.md new file mode 100644 index 0000000..54860b8 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker配置镜像加速.md @@ -0,0 +1,36 @@ +> 本文作者:丁辉 + +# Docker配置镜像加速 + +1. 编辑文件 + + ```bash + vi /etc/docker/daemon.json + ``` + + 内容如下 + + ```json + { + "registry-mirrors": [ + "https://docker.m.daocloud.io", + "https://docker.1ms.run", + "https://docker-0.unsee.tech", + "https://registry-1.docker.io" + ] + } + ``` + +2. 重启 Docker 服务 + + ```bash + systemctl restart docker + ``` + +3. 验证 + + ```bash + docker info + ``` + + \ No newline at end of file diff --git a/Docker/Docs/Docker使用文档/Docker镜像打包.md b/Docker/Docs/Docker使用文档/Docker镜像打包.md new file mode 100644 index 0000000..31617a2 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Docker镜像打包.md @@ -0,0 +1,57 @@ +> 本文作者:丁辉 + +# Docker镜像打包 + +## 默认打包 + +1. 打包 + + ```bash + docker save -o image.tar nginx:latest + ``` + +2. 导入 + + ```bash + docker load -i image.tar + ``` + +## 打包并压缩 + +1. 打包并压缩 + + ```bash + docker save nginx:latest | gzip -c > image.tar.gz + ``` + +2. 解压并导入 + + ```bash + gunzip -c image.tar.gz | docker load + ``` + +## 批量打包 + +- 第一种 + + ```bash + docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o k8s-master.tar + ``` + +- 第二种 + + > 将需要统一打包的镜像写在文件内 + + ```bash + cat > images.txt < 本文作者:丁辉 + +# Docker Swarm集群 + +[官方文档](https://docs.docker.com/engine/swarm/swarm-tutorial/deploy-service/) + +| 节点IP | 角色 | +| :----------: | :----: | +| 192.168.1.10 | MASTER | +| 192.168.1.20 | WORKER | + +## 开始组建集群 + +1. 初始化 MASTER 节点 + + ```bash + docker swarm init + ``` + + > 指定 IP + > + > ```bash + > docker swarm init --advertise-addr 192.168.1.10 + > ``` + > + > 指定网段 + > + > ```bash + > --default-addr-pool 192.168.1.0/24 + > ``` + +2. WORKER 节点加入集群 + + ```bash + docker swarm join --token 192.168.1.10:2377 + ``` + +3. 检查所有节点 + + ```bash + docker node ls + ``` + + > 删除节点命令为 + > + > ```bash + > docker swarm leave + > ``` + > + > 强制使用 ` --force` 参数 + +## 常用基础命令 + +- 查看加入 MASTER TOKEN + + ```bash + docker swarm join-token manager + ``` + +- 查看加入 WORKER TOKEN + + ```bash + docker swarm join-token worker + ``` + +- 查看所有节点 + + ```bash + docker node ls + ``` + +- 查看节点详情 + + ```bash + docker node inspect <节点名称> --pretty + ``` + + +## Secrets 基础操作 + +- 创建 Secrets + + ``` + docker secret create ./<文件位置> + ``` + + > echo 创建 Secrets + > + > ```bash + > echo "内容" | docker secret create - + > ``` + > + > openssl 创建 Secrets,生成一个随机的20个字符的密码,并将其作为密钥存储到Docker中 + > + > ```bash + > openssl rand -base64 20 | docker secret create mysql_password - + > ``` + +- 查看 Secrets + + ```bash + docker secret ls + ``` + +- 检查 Secrets + + ```bash + docker secret inspect + ``` + +- 删除 Secrets + + ```bash + docker secret rm + ``` + +## Network 基础操作 + +- 创建 Network + + ``` + docker network create -d overlay <网络名称> + ``` + +- 查看 Network + + ```bash + docker network ls + ``` + +- 检查 Network + + ```bash + docker network inspect <网络名称> + ``` + +- 删除 Network + + ```bash + docker network rm <网络名称> + ``` + +## Volume 基础操作 + +- 创建 Volume + + ``` + docker volume create -d overlay <存储名称> + ``` + +- 查看 Volume + + ```bash + docker volume ls + ``` + +- 检查 Volume + + ```bash + docker volume inspect <存储名称> + ``` + +- 删除 Volume + + ```bash + docker volume rm <存储名称> + ``` + +## 启动容器测试 + +```bash +docker service create \ + --name mysql \ + --replicas 1 \ + --mount type=bind,source=/data/mysqld,destination=/var/lib/mysql \ + -e MYSQL_ROOT_PASSWORD="root" \ + mysql +``` + +**其他参数** + +- 指定 Docker 节点 + + ```bash + --constraint 'node.hostname==节点名称' + ``` + +- 指定对外端口 + + ```bash + --publish published=<容器对外端口>,target=<容器内部端口> + ``` + +- 挂载 volume 存储 + + ```bash + --mount type=volume,source=<指定存储名称>,destination=<容器内部路径> + ``` + +- 指定网络 + + ```bash + --network <网络名称> + ``` + +- 挂载 secret + + ```bash + --secret source=,target=<容器内路径> + ``` + + +**常见参数说明** + +| 参数 | 说明 | +| :--------------------------: | :-----------------------------------: | +| `--name` | 指定服务的名称 | +| `--replicas` | 指定服务的副本数 | +| `--constraint` | 指定服务运行的节点约束条件 | +| `--publish` | 将容器的端口映射到主机的端口 | +| `--mount` | 将主机上的目录或文件挂载到容器内 | +| `--network` | 将服务连接到指定的Docker网络 | +| `--secret` | 将指定的Docker secret文件挂载到容器内 | +| `-e` | 指定容器内的环境变量 | +| `--env-file` | 指定容器内的环境变量文件 | +| `--restart-condition` | 指定容器的重启策略 | +| `--update-delay` | 指定服务更新之间的延迟时间 | +| `--update-parallelism` | 指定服务更新时的并行数量 | +| `--update-failure-action` | 指定服务更新失败后的操作 | +| `--update-max-failure-ratio` | 指定服务更新失败的最大比率 | +| `--endpoint-mode` | 指定服务的网络端点模式 | + + + diff --git a/Docker/Docs/Docker使用文档/Mysql容器纳入System管理.md b/Docker/Docs/Docker使用文档/Mysql容器纳入System管理.md new file mode 100644 index 0000000..1c4d9b5 --- /dev/null +++ b/Docker/Docs/Docker使用文档/Mysql容器纳入System管理.md @@ -0,0 +1,41 @@ +> 本文作者:丁辉 + +# Mysql容器纳入System管理 + +1. 创建 Systemd Service 文件 + + ```bash + vi /usr/lib/systemd/system/mysql.service + ``` + + 内容如下 + + ```bash + [Unit] + Description=Mysql container + Requires=docker.service + After=docker.service + [Service] + RemainAfterExit=yes + ExecStop=/usr/bin/docker stop mysql # 容器名 + ExecStart=/usr/bin/docker start mysql + ExecReload=/usr/bin/docker restart mysql + Restart=on-abnormal + [Install] + WantedBy=multi-user.target + ``` + +2. 重载配置文件 + + ```bash + systemctl daemon-reload + ``` + +3. 启动 Mysql + + ```bash + systemctl start mysql + ``` + + + diff --git a/Docker/Docs/Docker部署软件/Docker部署Bitnami-Mysql主从.md b/Docker/Docs/Docker部署软件/Docker部署Bitnami-Mysql主从.md new file mode 100644 index 0000000..d62ecb7 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Bitnami-Mysql主从.md @@ -0,0 +1,56 @@ +> 本文作者:丁辉 + +# Docker部署Bitnami-Mysql主从 + +1. 创建持久化目录 + + ```bash + mkdir -p /opt/mysql/data + chmod 777 /opt/mysql/data + ``` + +2. 部署 Master 容器 + + ```bash + docker run --name mysql-master --restart=always \ + -p 3306:3306 \ + -v /opt/mysql/data:/bitnami/mysql/data \ + -e MYSQL_ROOT_PASSWORD=root \ + -e MYSQL_REPLICATION_MODE=master \ + -e MYSQL_REPLICATION_USER=slave \ + -e MYSQL_REPLICATION_PASSWORD=slave_password \ + -e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \ + -d bitnami/mysql:latest + ``` + +3. 部署 Slave 容器 + + ```bash + docker run --name mysql-slave --restart=always \ + -p 3306:3306 \ + -v /opt/mysql/data:/bitnami/mysql/data \ + -e MYSQL_MASTER_HOST= \ + -e MYSQL_MASTER_ROOT_PASSWORD=root \ + -e MYSQL_MASTER_PORT_NUMBER=3306 \ + -e MYSQL_REPLICATION_MODE=slave \ + -e MYSQL_REPLICATION_USER=slave \ + -e MYSQL_REPLICATION_PASSWORD=slave_password \ + -e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \ + -d bitnami/mysql:latest + ``` + +4. 进入 Slave 容器 + + ```bash + docker exec -it mysql-slave bash + mysql -u root -proot + ``` + +5. 查看同步状态 + + ```bash + show slave status\G; + ``` + +> 切记请勿在主使用清空 GTID 信息命令,会使主从状态失效 + diff --git a/Docker/Docs/Docker部署软件/Docker部署Caddy.md b/Docker/Docs/Docker部署软件/Docker部署Caddy.md new file mode 100644 index 0000000..3fd1031 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Caddy.md @@ -0,0 +1,39 @@ +> 本文作者:丁辉 + +# Docker部署Caddy + +[官网](https://caddyserver.com/) + +1. 启动 Caddy 容器 + + ```bash + docker run -itd \ + --restart always \ + -p 80:80 \ + -v /data/caddy:/etc/caddy/ \ + --name=caddy \ + caddy:latest + ``` + +2. 进入容器修改配置文件 + + ```bash + vi /data/caddy/Caddyfile + ``` + + 内容如下 + + ```bash + :80 { + root * /etc/caddy/www + file_server + } + ``` + +3. 重启容器 + + ```bash + docker restart caddy + ``` + +4. 访问 IP:80 \ No newline at end of file diff --git a/Docker/Docs/Docker部署软件/Docker部署Fio磁盘读写测试.md b/Docker/Docs/Docker部署软件/Docker部署Fio磁盘读写测试.md new file mode 100644 index 0000000..d117b81 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Fio磁盘读写测试.md @@ -0,0 +1,82 @@ +> 本文作者:丁辉 + +# Docker部署Fio磁盘读写测试 + +[官方文档](https://fio.readthedocs.io/en/latest/fio_doc.html) + +1. 拉取测试工具镜像 + + ```bash + docker pull registry.cn-hangzhou.aliyuncs.com/offends/fio:latest + ``` + +2. 启动并进入容器 + + > 为了更好的测试磁盘读写速率我们挂载 /data 目录进行测试 + + ```bash + docker run --name disktest \ + -it --rm -v /data/disk_test:/data/disk_test \ + registry.cn-hangzhou.aliyuncs.com/offends/fio:latest \ + sh + ``` + +3. 开始测试 + + - 随机写 + + ```bash + fio --ioengine=libaio --runtime=300 --numjobs=2 --iodepth=64 --bs=4k --size=2G --rw=randwrite --filename=/data/disk_test --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=3 --cpus_allowed_policy=split + ``` + + - 顺序写 + + ```bash + fio --ioengine=libaio -runtime=300 --numjobs=2 --iodepth=64 --bs=1024k --size=10G --rw=write --filename=/data/disk_test --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=3 --cpus_allowed_policy=split + ``` + +4. 查看结果 + + > 随机写看(IOPS) + > + > 顺序写看(吞吐量BW) + +# 命令参数 + +| 参数 | 描述 | +| -------------------- | ------------------------------------------------------------ | +| --debug=options | 启用调试日志记录,可以选择启用不同类型的调试信息,比如进程、文件、IO等等。 | +| --parse-only | 仅解析选项,不执行任何IO操作。 | +| --output | 将输出写入文件。 | +| --bandwidth-log | 生成带宽日志。 | +| --minimal | 生成最小化(简洁)的输出。 | +| --output-format=type | 指定输出格式,可以是简洁、JSON等。 | +| --terse-version=type | 设置简洁版本输出格式。 | +| --version | 打印版本信息并退出。 | +| --help | 打印帮助信息。 | +| --cpuclock-test | 执行CPU时钟的测试/验证。 | +| --crctest=[type] | 测试校验和功能的速度。 | +| --cmdhelp=cmd | 打印命令帮助,使用"all"可以查看所有命令。 | +| --enghelp=engine | 打印IO引擎的帮助信息,或者列出可用的IO引擎。 | +| --enghelp=engine,cmd | 打印特定IO引擎命令的帮助信息。 | +| --showcmd | 将作业文件转换为命令行选项。 | +| --eta=when | 指定何时打印ETA(预计完成时间)估计值。 | +| --eta-newline=time | 每个 'time' 时间段强制换行显示ETA。 | +| --status-interval=t | 每个 't' 时间段强制完整状态转储。 | +| --readonly | 打开安全只读检查,防止写入。 | +| --section=name | 只运行作业文件中指定的部分,可以指定多个部分。 | +| --alloc-size=kb | 将smalloc池的大小设置为指定的kb数(默认为16384)。 | +| --warnings-fatal | Fio解析器警告变为致命错误。 | +| --max-jobs=nr | 支持的最大线程/进程数。 | +| --server=args | 启动后端fio服务器。 | +| --daemonize=pidfile | 后台运行fio服务器,将PID写入文件。 | +| --client=hostname | 与远程后端fio服务器通信。 | +| --remote-config=file | 告诉fio服务器加载本地作业文件。 | +| --idle-prof=option | 报告系统或每CPU基础的CPU空闲情况或运行单位工作校准。 | +| --inflate-log=log | 解压缩并输出压缩日志。 | +| --trigger-file=file | 当文件存在时执行触发命令。 | +| --trigger-timeout=t | 在指定的时间执行触发器。 | +| --trigger=cmd | 将此命令设置为本地触发器。 | +| --trigger-remote=cmd | 将此命令设置为远程触发器。 | +| --aux-path=path | 使用此路径作为fio生成文件的路径。 | + diff --git a/Docker/Docs/Docker部署软件/Docker部署Gitlab.md b/Docker/Docs/Docker部署软件/Docker部署Gitlab.md new file mode 100644 index 0000000..21a833c --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Gitlab.md @@ -0,0 +1,169 @@ +> 本文作者:丁辉 + +# Docker部署Gitlab + +[企业版官网网址](https://docs.gitlab.com/ee/install/docker.html) + +> 部署开源版 +> +> 例:本地 IP 为 192.168.1.10 + +## 部署Gitlab + +1. 启动容器 + + > 这里也可以通过 `--hostname 192.168.1.10` 指定 Clone 地址,Gitlab会通过读取本地主机名作为默认的 Clone 地址 + + ```bash + docker run -itd \ + --restart always \ + -p 80:80 \ + -p 222:22 \ + -u root \ + -v $PWD/data/log:/var/log/gitlab \ + -v $PWD/data/opt:/var/opt/gitlab \ + -v $PWD/data/etc:/etc/gitlab \ + --privileged=true \ + --name=gitlab \ + gitlab/gitlab-ce:latest + ``` + +2. 进入容器查看 root 初始密码 + + ```bash + docker exec -it gitlab bash + ``` + + ```bash + cat /etc/gitlab/initial_root_password + ``` + + > 访问 192.168.1.10:80 + +3. 修改 SSH Clone 地址(进入容器内执行) + + ```bash + cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak + vi /etc/gitlab/gitlab.rb + ``` + + 写入如下内容 + + ```bash + external_url "http://192.168.1.10:80" #http对外clone地址 + gitlab_rails["gitlab_ssh_host"] = "192.168.1.10" #ssh对外clone地址 + gitlab_rails["gitlab_shell_ssh_port"] = 222 #ssh对外clone端口 + ``` + +4. 重启服务 + + ```bash + gitlab-ctl reconfigure + ``` + +## 安装Gitlab-runner + +1. 启动容器 + + ```bash + docker run -itd --name gitlab-runner \ + --restart always \ + --privileged=true \ + -v $PWD/data/gitlab-runner-config:/etc/gitlab-runner \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /usr/local/bin/docker:/usr/bin/docker \ + gitlab/gitlab-runner:latest + ``` + +2. 创建 Runner 实例获取 Token + + 点击Admin Area(管理员设置) > 点击CI/CD > 点击Runners > 点击New project runner > 选择Linux > 填写一个Tags > 点击Create runner + +3. 进入容器 + + ```bash + docker exec -it gitlab-runner bash + ``` + +4. 开始注册 Runner + + ```bash + gitlab-ci-multi-runner register + ``` + + 过程如下 + + ```bash + Runtime platform arch=amd64 os=linux pid=106 revision=6e766faf version=16.4.0 + Running in system-mode. + + Enter the GitLab instance URL (for example, https://gitlab.com/): + http://192.168.1.10 #Gitlab地址 + Enter the registration token: + ******** #刚刚获取到的Token + Verifying runner... is valid runner=Te1gEas2d + Enter a name for the runner. This is stored only in the local config.toml file: + [f94c7a9b1272]: test #名称 + Enter an executor: docker+machine, instance, kubernetes, docker-windows, shell, virtualbox, docker-autoscaler, custom, docker, parallels, ssh: + shell #输入一个执行器 + Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! + + Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" + ``` + +5. 开始测试 + + 在测试仓库内创建 `.gitlab-ci.yml` 文件编写内容 + + ```yml + stages: + - test + build-test: + stage: test + tags: + - test + script: + - echo "Hello world" + ``` + +6. 查看结果 + + 进入测试仓库 > 点击Build > 点击Pipelines > 查看到 `passed` 即为成功可点击进去查看 + +## 忘记密码 + +1. 进入容器 + + ```bash + docker exec -it gitlab /bin/bash + ``` + +2. 进⼊控制台(需要等待一段时间) + + ```bash + gitlab-rails console -e production + ``` + +3. 查询root⽤户 + + ```bash + user=User.where(id:1).first + ``` + +4. 设置密码 + + ```bash + user.password='password' + ``` + +5. 保存退出 + + ```bash + user.save! + exit + ``` + + + + + diff --git a/Docker/Docs/Docker部署软件/Docker部署JumpServer.md b/Docker/Docs/Docker部署软件/Docker部署JumpServer.md new file mode 100644 index 0000000..462c5f9 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署JumpServer.md @@ -0,0 +1,31 @@ +> 本文作者:丁辉 + +# Docker部署JumpServer + +[官网](https://docs.jumpserver.org/zh/master/install/setup_by_fast/) [JumpServer安装包](https://github.com/jumpserver/installer/releases) + +1. 部署 Mysql 数据库 + + ```bash + docker run -itd --name jump-mysql \ + --restart=always -p 3306:3306 \ + -v /usr/local/jumpserver/data:/var/lib/mysql \ + -v /usr/local/jumpserver/logs:/var/log/mysql \ + -v /usr/local/jumpserver/conf:/etc/mysql/conf.d \ + -e MYSQL_ROOT_PASSWORD=jumpserver \ + -e MYSQL_DATABASE=jumpserver \ + mysql:5.7 + ``` + +2. 解压 JumpServer 安装包 + + ```bash + tar -xf jumpserver-installer-v*.tar.gz + cd jumpserver-installer-v* + ``` + +3. 修改 `config-example.txt` 文件配置参数, 并启动 + + ```bash + ./jmsctl.sh install + ``` diff --git a/Docker/Docs/Docker部署软件/Docker部署LobeChat.md b/Docker/Docs/Docker部署软件/Docker部署LobeChat.md new file mode 100644 index 0000000..f470265 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署LobeChat.md @@ -0,0 +1,23 @@ +> 本文作者:丁辉 + +# Docker部署LobeChat + +[Github](https://github.com/lobehub/lobe-chat) [官方文档](https://lobehub.com/zh/features) [官方部署文档](https://lobehub.com/zh/docs/self-hosting/platform/docker) + +[OpenAi-Api-keys页面](https://platform.openai.com/api-keys) + +``` +docker run -d -p 3210:3210 \ + -e OPENAI_API_KEY=sk-xxxx \ + -e ACCESS_CODE=lobe66 \ + --name lobe-chat \ + lobehub/lobe-chat +``` + +**参数解释** + +- `OPENAI_API_KEY`:这是用于访问 OpenAI 服务的 API 密钥。这个密钥用于验证请求的身份,并确保请求是由授权用户发起的。 + +- `OPENAI_PROXY_URL`:这是一个代理服务器的 URL,用于将请求重定向到指定的地址。这可以用于在请求 OpenAI API 时绕过直接访问限制,或者用于增加安全性。 + +- `ACCESS_CODE`:这是一个访问代码,可能用于程序内部的身份验证或控制访问某些功能。 diff --git a/Docker/Docs/Docker部署软件/Docker部署Nacos.md b/Docker/Docs/Docker部署软件/Docker部署Nacos.md new file mode 100644 index 0000000..1c94198 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Nacos.md @@ -0,0 +1,58 @@ +> 本文作者:丁辉 + +# Docker部署Nacos + +[官网文档](https://nacos.io/zh-cn/docs/v2/guide/user/auth.html) + +1. 启动 MYSQL + + ```bash + docker run --name nacos-mysql --restart=always \ + -p 3306:3306 \ + -v /data/mysql:/var/lib/mysql \ + -e MYSQL_USER=nacos \ + -e MYSQL_PASSWORD=nacos \ + -e MYSQL_DATABASE=nacos \ + -e MYSQL_ROOT_PASSWORD=root \ + -d mysql:latest + ``` + +2. 启动 NACOS + + ```bash + docker run --name nacos --restart=always \ + -p 8848:8848 \ + -e MYSQL_SERVICE_HOST=${MYSQL_HOST} \ + -e MYSQL_SERVICE_PORT=3306 \ + -e MYSQL_SERVICE_USER=nacos \ + -e MYSQL_SERVICE_PASSWORD=nacos \ + -e MYSQL_SERVICE_DB_NAME=nacos \ + -e MODE=standalone \ + -e PREFER_HOST_MODE=hostname \ + -d mysql:latest + ``` + +3. 开启登录 + + ```bash + vi /data/nacos/application.properties + ``` + + 内容如下 + + ```bash + # vi /data/nacos/application.properties + nacos.core.auth.enabled=true + nacos.core.auth.server.identity.key=nacos + nacos.core.auth.server.identity.value=nacos + + nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789 + ``` + +4. 访问:http://localhost:8848/nacos/#/login + +> 启动挂载配置文件 +> +> ```bash +> -e /data/nacos/application.properties:/home/nacos/conf/application.properties +> ``` \ No newline at end of file diff --git a/Docker/Docs/Docker部署软件/Docker部署Nginx使用配置文件读取变量.md b/Docker/Docs/Docker部署软件/Docker部署Nginx使用配置文件读取变量.md new file mode 100644 index 0000000..1688b28 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Nginx使用配置文件读取变量.md @@ -0,0 +1,57 @@ +> 本文作者:丁辉 +> + +# Docker部署Nginx使用配置文件读取变量 + +## 方法一使用 Envsubst 渲染替换环境变量 + +1. 编辑 Dockerfile + + ```dockerfile + FROM nginx:alpine-slim + + COPY ./nginx.conf.template /etc/nginx/conf.d/nginx.conf.template + + ENV PROXY_SERVER=default + + CMD /bin/sh -c "envsubst '\$PROXY_SERVER \$SERVER_NAME' < /etc/nginx/conf.d/nginx.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" + ``` + +2. 编辑 nginx.conf.template 文件 + + ```bash + vi nginx.conf.template + ``` + + 内容如下 + + ```nginx + server { + listen 80; + server_name ${SERVER_NAME}; + + location / { + proxy_pass http://${PROXY_SERVER}:3080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + } + ``` + +3. 构建镜像 + + ```bash + docker build -t . + ``` + +4. 启动容器(指定变量) + + ```bash + docker run -itd -e PROXY_SERVER=127.0.0.1 -e SERVER_NAME=localhost + ``` + +## 方法二 + +**查看此文档** + +[Nginx镜像构建](https://gitee.com/offends/Kubernetes/tree/main/Docker/Dockerfile/Nginx) diff --git a/Docker/Docs/Docker部署软件/Docker部署Node-exporter.md b/Docker/Docs/Docker部署软件/Docker部署Node-exporter.md new file mode 100644 index 0000000..f91967e --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Node-exporter.md @@ -0,0 +1,16 @@ +> 本文作者:丁辉 + +# Docker部署Node-exporter + +```bash +docker run -d --restart=always \ + -p 9100:9100 \ + -v "/proc:/host/proc:ro" \ + -v "/sys:/host/sys:ro" \ + -v "/:/rootfs:ro" \ + --net="host" \ + --restart=always \ + --name node-exporter \ + prom/node-exporter +``` + diff --git a/Docker/Docs/Docker部署软件/Docker部署Portainer.md b/Docker/Docs/Docker部署软件/Docker部署Portainer.md new file mode 100644 index 0000000..d572a66 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Portainer.md @@ -0,0 +1,45 @@ +> 本文作者:丁辉 +> + +# Docker部署Portainer + +[官方文档](https://docs.portainer.io/) + +> 通过Portainer管理docker + +## Docker部署 + +```bash +docker run -d -p 9000:9000 \ +--name portainer --restart=always \ +-v /var/run/docker.sock:/var/run/docker.sock \ +-v /data/portainer:/data \ +portainer/portainer-ce:latest +``` + +## 远程连接Docker + +远程连接默认端口是2375 [Docker配置2375端口文档](https://gitee.com/offends/Kubernetes/blob/main/Docker/Docs/Docker%E9%85%8D%E7%BD%AE2375%E7%AB%AF%E5%8F%A3.md) + +## 忘记密码 + +1. 下载新镜像 + + ```bash + docker pull portainer/helper-reset-password + ``` + +2. 关闭容器 + + ```bash + docker stop portainer + ``` + +3. 启动观看密码 + + ```bash + docker run --rm -v portainer_data:/data portainer/helper-reset-password + ``` + + + diff --git a/Docker/Docs/Docker部署软件/Docker部署Tor实现匿名通信.md b/Docker/Docs/Docker部署软件/Docker部署Tor实现匿名通信.md new file mode 100644 index 0000000..e24eeef --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Tor实现匿名通信.md @@ -0,0 +1,68 @@ +> 本文作者:丁辉 + +# Docker部署Tor实现匿名通信 + +## 介绍 + +Tor(The Onion Router)是一种免费的开源软件,用于实现匿名通信。它通过全球范围内的一系列自愿维护的节点或“路由器”来转发和加密用户的互联网流量,从而隐藏用户的身份和位置。 + +[官方文档](https://community.torproject.org/onion-services/setup/install/) + +## 开始部署 + +> 准备一个 Nginx 服务,部署 Tor 实现匿名通信 Nginx +> +> Nginx访问地址:192.168.1.10:80 + +1. 创建持久化目录 + + ```bash + mkdir -p $HOME/tor-data + ``` + +2. 目录授权 + + ```bash + chmod 700 $HOME/tor-data + chown 100:65533 $HOME/tor-data + ``` + +3. 编写配置文件 + + ```bash + vi $HOME/tor-data/torrc + ``` + + 内容如下 + + ```bash + Log notice file /var/log/tor/notices.log + SOCKSPort 0 + HiddenServiceNonAnonymousMode 1 + HiddenServiceSingleHopMode 1 + # 配置代理 + #Socks5Proxy sslocal-rust:1080 + HiddenServiceDir /var/lib/tor/nginx + HiddenServicePort 80 192.168.1.10:80 + ``` + +4. 启动容器 + + ```bash + docker run -itd \ + --restart always \ + -v $HOME/tor-data:/var/lib/tor \ + -v $HOME/tor-data:/etc/tor \ + --name=tor \ + osminogin/tor-simple:latest + ``` + +5. 查看 hostname + + ```bash + cat $HOME/tor-data/nginx/hostname + ``` + +6. 通过匿名浏览器访问 + + > xxx.onion diff --git a/Docker/Docs/Docker部署软件/Docker部署Watchtower管理容器更新.md b/Docker/Docs/Docker部署软件/Docker部署Watchtower管理容器更新.md new file mode 100644 index 0000000..b73f729 --- /dev/null +++ b/Docker/Docs/Docker部署软件/Docker部署Watchtower管理容器更新.md @@ -0,0 +1,158 @@ +> 本文作者:丁辉 + +# Docker部署Watchtower管理容器更新 + +[Github仓库](https://github.com/containrrr/watchtower) + +## 介绍 + +Watchtower 是一个开源的容器监控和自动更新工具,设计用于Docker容器环境。它可以监控正在运行的容器及其使用的镜像,当发现镜像有更新时,自动拉取新镜像并重新启动容器。这种自动化管理方式有助于确保部署的应用保持最新状态,从而减少安全风险和改进功能。 + +## 快速开始 + +```bash +docker run -d \ + --name watchtower \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower +``` + +所有容器都会自动更新,也包括 Watch­tower 本身。 + +## 其他启动参数 + +- 自动清除旧镜像 + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower \ + --cleanup + ``` + + > `--cleanup` 选项可以简写为 `-c` + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c + ``` + +- 选择性自动更新 + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c \ + nginx redis + ``` + +- 配置容器更新列表 + + ```bash + vi ~/.watchtower.list + ``` + + 内容如下 + + ```bash + nginx + reidis + ``` + + 启动 Watchtower 容器 + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c \ + $(cat ~/.watchtower.list) + ``` + +- 设置单个容器自动更新标签 + + ```bash + docker run -d \ + --name nginx \ + --restart always \ + --label com.centurylinklabs.watchtower.enable=true \ + nginx:latest + ``` + + 启动 Watchtower 容器 + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c \ + --label-enable + ``` + + > `--label-enable` 可以简写为 `-e` + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -ce + ``` + +- 设置自动更新检查频率 + + - `--interval` 设置更新检测时间间隔单位为秒。 + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c \ + --interval 3600 + ``` + + - `--schedule` 设置定时检测更新时间。格式为 6 字段 Cron 表达式,而非传统的 5 字段,第一位是秒。 + + > 比如每天凌晨 2 点检查一次更新 + + ```bash + docker run -d \ + --name watchtower \ + --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c \ + --schedule "0 0 2 * * *" + ``` + +- 手动更新 + + > 检查 nginx 是否需要更新 + + ```bash + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -c \ + --run-once \ + nginx + ``` + + > `--run-once` 可以简写为 `-R` + + ```bash + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + containrrr/watchtower -cR \ + nginx + ``` + + > 当容器设置过 `com.centurylinklabs.watchtower.enable=false` 参数则不会更新 \ No newline at end of file diff --git a/Docker/Docs/安装文档/Centos安装Docker.md b/Docker/Docs/安装文档/Centos安装Docker.md new file mode 100644 index 0000000..0f832c4 --- /dev/null +++ b/Docker/Docs/安装文档/Centos安装Docker.md @@ -0,0 +1,126 @@ +> 本文作者:丁辉 + +# Centos安装Docker + +> 整体来说各系统安装方式都相差不大,那么咱们这里只举例 Centos 安装 Docker 形式 +> +> [官网安装文档](https://docs.docker.com/engine/install/) + +## 开始部署 + +1. 卸载旧版 Docker + + ```bash + sudo yum remove docker \ + docker-client \ + docker-client-latest \ + docker-common \ + docker-latest \ + docker-latest-logrotate \ + docker-logrotate \ + docker-engine + ``` + +2. 安装必要依赖 + + ```bash + yum install -y yum-utils device-mapper-persistent-data lvm2 + ``` + + **参数解释** + + | 依赖包 | 作用 | 为什么需要 | + | :-------------------------------: | :-----------------------: | :-----------------------------------: | + | **yum-utils** | 添加和管理 yum 仓库 | 用于添加 Docker 官方仓库 | + | **device-mapper-persistent-data** | devicemapper 存储驱动依赖 | 保证 Docker 底层存储驱动正常运行 | + | **lvm2** | 提供逻辑卷管理工具 | devicemapper 依赖,提供底层块存储支持 | + +3. 设置存储库 + + - 官方源 + + ```bash + yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + ``` + + - 国内源 + + ```bash + yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + ``` + + - 清华 TUNA Docker 源 + + ```bash + cat > /etc/yum.repos.d/docker-ce.repo << 'EOF' + [docker-ce-stable] + name=Docker CE Stable - $basearch + baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/$releasever/$basearch/stable + enabled=1 + gpgcheck=1 + gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg + + [docker-ce-stable-debuginfo] + name=Docker CE Stable - Debuginfo $basearch + baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/$releasever/debug-$basearch/stable + enabled=0 + gpgcheck=1 + gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg + + [docker-ce-stable-source] + name=Docker CE Stable - Sources + baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/$releasever/source/stable + enabled=0 + gpgcheck=1 + gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg + EOF + ``` + +4. 刷新 YUM 缓存 + + ```bash + yum clean all + yum makecache + ``` + +5. 安装最新版 + + ```bash + yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + ``` + + > 安装特定版本 + > + > - 查看版本库 + > + > ```bash + > yum list docker-ce --showduplicates | sort -r + > ``` + > + > - 安装 + > + > ```bash + > sudo yum install docker-ce- docker-ce-cli- containerd.io docker-buildx-plugin docker-compose-plugin + > ``` + +6. 启动 + + ```bash + systemctl enable docker + systemctl start docker + ``` + +## 卸载 Docker + +1. 卸载软件包 + + ```bash + yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras + ``` + +2. 清理文件 + + ```bash + rm -rf /var/lib/docker + rm -rf /var/lib/containerd + ``` diff --git a/Docker/Docs/安装文档/Docker配置Docker用户组非Root启动.md b/Docker/Docs/安装文档/Docker配置Docker用户组非Root启动.md new file mode 100644 index 0000000..d82a0d0 --- /dev/null +++ b/Docker/Docs/安装文档/Docker配置Docker用户组非Root启动.md @@ -0,0 +1,33 @@ +> 本文作者:丁辉 + +# Docker配置Docker用户组非Root启动 + +1. 创建 Docker 用户组 + + ```bash + groupadd docker + ``` + +2. Docker 添加用户组 + + ```bash + usermod -aG docker docker + ``` + +3. 更新激活 + + ```bash + newgrp docker + ``` + +4. 检查 + + ```bash + getent group docker + ``` + +6. 重启 Docker + + ```bash + systemctl restart docker + ``` \ No newline at end of file diff --git a/Docker/Docs/安装文档/Docker配置GPU环境.md b/Docker/Docs/安装文档/Docker配置GPU环境.md new file mode 100644 index 0000000..f4b8c55 --- /dev/null +++ b/Docker/Docs/安装文档/Docker配置GPU环境.md @@ -0,0 +1,90 @@ +> 本文作者丁辉 + +# Docker配置GPU环境 + +## Linux下载并安装GPU驱动(根据自身环境情况而定) + +[请查看此文档](https://gitee.com/offends/Kubernetes/blob/main/GPU/Linux%E4%B8%8B%E8%BD%BD%E5%B9%B6%E5%AE%89%E8%A3%85GPU%E9%A9%B1%E5%8A%A8.md) + +## 安装 NVIDIA 驱动程序 nvidia-container-toolkit + +[官方文档](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) + +- **Centos** + + 配置生产存储库 + + ```bash + curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \ + tee /etc/yum.repos.d/nvidia-container-toolkit.repo + ``` + + 配置存储库以使用实验包(可选) + + ```bash + yum-config-manager --enable nvidia-container-toolkit-experimental + ``` + + 安装 NVIDIA Container Toolkit 软件包 + + ```bash + yum install -y nvidia-container-toolkit + ``` + +- **Ubuntu** + + 配置生产存储库 + + ```bash + curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ + && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ + sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ + sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list + ``` + + 配置存储库以使用实验包(可选) + + ```bash + sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list + ``` + + 安装 NVIDIA Container Toolkit 软件包 + + ```bash + apt-get update && apt-get install -y nvidia-container-toolkit + ``` + +## 容器对接GPU + +> 以 Docker 运行时举例 + +1. 使用 `nvidia-ctk` 修改配置文件 + + ```bash + nvidia-ctk runtime configure --nvidia-set-as-default + ``` + + > 无需担心此命令会覆盖源有的配置文件内容, 它只会通过修改来改变你当前的配置文件内容 + + **参数解释** + + | 参数 | 描述 | 使用 | + | :-----------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: | + | `--runtime=` | 指定当前容器运行时: docker,containerd,crio 等(默认会自动选择当前容器运行时) | `nvidia-ctk runtime configure --runtime=docker` | + | `--config=` | 指定容器运行时的配置文件的位置 | `nvidia-ctk runtime configure --config=/etc/docker/daemon.json` | + | `--nvidia-set-as-default` | 指定 NVIDIA 容器运行时作为默认运行时 | `nvidia-ctk runtime configure --nvidia-set-as-default` | + +2. 重启服务 + + ```bash + systemctl restart docker + ``` + +3. 测试 + + ```bash + docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi + ``` + + > 查看是否成功打印 GPU 信息 + diff --git a/Docker/Docs/安装文档/OpeneUleros安装Docker.md b/Docker/Docs/安装文档/OpeneUleros安装Docker.md new file mode 100644 index 0000000..64ce495 --- /dev/null +++ b/Docker/Docs/安装文档/OpeneUleros安装Docker.md @@ -0,0 +1,43 @@ +> 本文作者:丁辉 + +# OpeneUleros安装Docker + +> OpeneUleros 为 dnf 包管理工具, 所以特意记录本次安装 + +## 基础配置 + +1. 修改chrony时间同步配置 + + ```bash + sed -i 's/pool pool.ntp.org iburst/pool ntp.aliyun.com/g' /etc/chrony.conf + ``` + +2. 重启chrony服务, 并检查 + + ```bash + systemctl restart chronyd && chronyc sources + ``` + +## 安装 Docker + +1. 更新镜像源缓存 + + ```bash + dnf makecache + ``` + +2. 安装 + + ```bash + dnf install docker + ``` + +3. 启动 + + ```bash + systemctl start docker + systemctl enable docker + ``` + + + diff --git a/Docker/Docs/安装文档/二进制安装Docker.md b/Docker/Docs/安装文档/二进制安装Docker.md new file mode 100644 index 0000000..55f141c --- /dev/null +++ b/Docker/Docs/安装文档/二进制安装Docker.md @@ -0,0 +1,48 @@ +> 本文作者:丁辉 + +# 二进制安装Docker + +[官方文档](https://docs.docker.com/engine/install/binaries/#install-daemon-and-client-binaries-on-linux) + +## 准备工作 + +- [二进制文件包下载](https://download.docker.com/linux/static/stable/) +- [docker.service下载](https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service)(此文件只做示例,因为二进制安装还是有些不同的) + +## 开始部署 + +1. 下载二进制文件(地址如上所示) + +2. 解压文件 + + ```bash + tar -zxvf docker-*.tgz + ``` + +3. 配置 Docker 环境 + + ```bash + cp ./docker/* /usr/bin/ + ``` + +4. 下载 docker.service 文件 + + ```bash + wget https://gitea.offends.cn/Offends/Kubernetes/raw/branch/main/Docker/Files/docker.service.old + ``` + + 将文件移动到指定位置 + + ```bash + cp ./docker.service.old /usr/lib/systemd/system/docker.service + ``` + +5. 启动程序 + + ```bash + systemctl daemon-reload + systemctl start docker + systemctl enable docker + ``` + + \ No newline at end of file diff --git a/Docker/Docs/安装文档/通过脚本安装Docker.md b/Docker/Docs/安装文档/通过脚本安装Docker.md new file mode 100644 index 0000000..c537ce1 --- /dev/null +++ b/Docker/Docs/安装文档/通过脚本安装Docker.md @@ -0,0 +1,45 @@ +> 本文作者:丁辉 + +# 通过脚本安装Docker + +## 官方脚本 + +- 官方源 + + ```bash + curl -fsSL https://get.docker.com | bash + ``` + +- 阿里源 + + ```bash + curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun + ``` + + +> 脚本下载: +> +> ```bash +> curl -fsSL https://get.docker.com -o get-docker.sh +> ``` + +## 第三方脚本(Rancher) + +- 官方源 + + ```bash + curl https://releases.rancher.com/install-docker/20.10.sh | sh + ``` + +- 阿里源 + + ```bash + curl -fsSL https://releases.rancher.com/install-docker/20.10.sh | sh -s -- --mirror Aliyun + ``` + + +> 脚本下载: +> +> ```bash +> curl -fsSL https://releases.rancher.com/install-docker/20.10.sh -o rancher-20.10.sh.sh +> ``` \ No newline at end of file diff --git a/Docker/Files/cri-docker.service b/Docker/Files/cri-docker.service new file mode 100644 index 0000000..41e5cd6 --- /dev/null +++ b/Docker/Files/cri-docker.service @@ -0,0 +1,39 @@ +[Unit] +Description=CRI Interface for Docker Application Container Engine +Documentation=https://docs.mirantis.com +After=network-online.target firewalld.service docker.service +Wants=network-online.target +Requires=cri-docker.socket + +[Service] +Type=notify +ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// +ExecReload=/bin/kill -s HUP $MAINPID +TimeoutSec=0 +RestartSec=2 +Restart=always + +# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229. +# Both the old, and new location are accepted by systemd 229 and up, so using the old location +# to make them work for either version of systemd. +StartLimitBurst=3 + +# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230. +# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make +# this option work for either version of systemd. +StartLimitInterval=60s + +# Having non-zero Limit*s causes performance problems due to accounting overhead +# in the kernel. We recommend using cgroups to do container-local accounting. +LimitNOFILE=infinity +LimitNPROC=infinity +LimitCORE=infinity + +# Comment TasksMax if your systemd version does not support it. +# Only systemd 226 and above support this option. +TasksMax=infinity +Delegate=yes +KillMode=process + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/Docker/Files/cri-docker.socket b/Docker/Files/cri-docker.socket new file mode 100644 index 0000000..cda71aa --- /dev/null +++ b/Docker/Files/cri-docker.socket @@ -0,0 +1,12 @@ +[Unit] +Description=CRI Docker Socket for the API +PartOf=cri-docker.service + +[Socket] +ListenStream=%t/cri-dockerd.sock +SocketMode=0660 +SocketUser=root +SocketGroup=docker + +[Install] +WantedBy=sockets.target \ No newline at end of file diff --git a/Docker/Files/daemon-original.json b/Docker/Files/daemon-original.json new file mode 100644 index 0000000..959ee7f --- /dev/null +++ b/Docker/Files/daemon-original.json @@ -0,0 +1,114 @@ +{ + "allow-nondistributable-artifacts": [], + "api-cors-header": "", + "authorization-plugins": [], + "bip": "", + "bridge": "", + "cgroup-parent": "", + "containerd": "/run/containerd/containerd.sock", + "containerd-namespace": "docker", + "containerd-plugin-namespace": "docker-plugins", + "data-root": "", + "debug": true, + "default-address-pools": [ + { + "base": "172.30.0.0/16", + "size": 24 + }, + { + "base": "172.31.0.0/16", + "size": 24 + } + ], + "default-cgroupns-mode": "private", + "default-gateway": "", + "default-gateway-v6": "", + "default-network-opts": {}, + "default-runtime": "runc", + "default-shm-size": "64M", + "default-ulimits": { + "nofile": { + "Hard": 64000, + "Name": "nofile", + "Soft": 64000 + } + }, + "dns": [], + "dns-opts": [], + "dns-search": [], + "exec-opts": [], + "exec-root": "", + "experimental": false, + "features": {}, + "fixed-cidr": "", + "fixed-cidr-v6": "", + "group": "", + "hosts": [], + "proxies": { + "http-proxy": "http://proxy.example.com:80", + "https-proxy": "https://proxy.example.com:443", + "no-proxy": "*.test.example.com,.example.org", + }, + "icc": false, + "init": false, + "init-path": "/usr/libexec/docker-init", + "insecure-registries": [], + "ip": "0.0.0.0", + "ip-forward": false, + "ip-masq": false, + "iptables": false, + "ip6tables": false, + "ipv6": false, + "labels": [], + "live-restore": true, + "log-driver": "json-file", + "log-level": "", + "log-opts": { + "cache-disabled": "false", + "cache-max-file": "5", + "cache-max-size": "20m", + "cache-compress": "true", + "env": "os,customer", + "labels": "somelabel", + "max-file": "5", + "max-size": "10m" + }, + "max-concurrent-downloads": 3, + "max-concurrent-uploads": 5, + "max-download-attempts": 5, + "mtu": 0, + "no-new-privileges": false, + "node-generic-resources": [ + "NVIDIA-GPU=UUID1", + "NVIDIA-GPU=UUID2" + ], + "oom-score-adjust": 0, + "pidfile": "", + "raw-logs": false, + "registry-mirrors": [], + "runtimes": { + "cc-runtime": { + "path": "/usr/bin/cc-runtime" + }, + "custom": { + "path": "/usr/local/bin/my-runc-replacement", + "runtimeArgs": [ + "--debug" + ] + } + }, + "seccomp-profile": "", + "selinux-enabled": false, + "shutdown-timeout": 15, + "storage-driver": "", + "storage-opts": [], + "swarm-default-advertise-addr": "", + "tls": true, + "tlscacert": "", + "tlscert": "", + "tlskey": "", + "tlsverify": true, + "userland-proxy": false, + "userland-proxy-path": "/usr/libexec/docker-proxy", + "userns-remap": "" +} \ No newline at end of file diff --git a/Docker/Files/daemon.json b/Docker/Files/daemon.json new file mode 100644 index 0000000..e72b623 --- /dev/null +++ b/Docker/Files/daemon.json @@ -0,0 +1,52 @@ +{ + "registry-mirrors": [ + "https://mirror.ccs.tencentyun.com", + "https://docker.mirrors.ustc.edu.cn", + "http://hub-mirror.c.163.com" + ], + "insecure-registries": [], + "experimental": true, + "debug": false, + "selinux-enabled": false, + "default-runtime": "runc", + "default-shm-size": "64M", + "max-concurrent-downloads": 10, + "max-concurrent-uploads": 10, + "max-download-attempts": 3, + "default-ulimits": { + "nofile": { + "Hard": 64000, + "Name": "nofile", + "Soft": 64000 + } + }, + "default-address-pools": [ + { + "base": "172.17.0.0/16", + "size": 24 + } + ], + "ip": "0.0.0.0", + "data-root": "/var/lib/docker", + "live-restore": true, + "shutdown-timeout": 15, + "log-driver": "json-file", + "log-level": "warn", + "log-opts": { + "cache-disabled": "false", + "cache-max-file": "3", + "cache-max-size": "10m", + "cache-compress": "true", + "env": "os,customer", + "labels": "somelabel", + "max-file": "3", + "max-size": "10m" + }, + "raw-logs": false, + "builder": { + "gc": { + "enabled": true, + "defaultKeepStorage": "20GB" + } + } +} diff --git a/Docker/Files/docker-original.service b/Docker/Files/docker-original.service new file mode 100644 index 0000000..9789e63 --- /dev/null +++ b/Docker/Files/docker-original.service @@ -0,0 +1,46 @@ +[Unit] +Description=Docker Application Container Engine +Documentation=https://docs.docker.com +After=network-online.target docker.socket firewalld.service containerd.service time-set.target +Wants=network-online.target containerd.service +Requires=docker.socket + +[Service] +Type=notify +# the default is not to use systemd for cgroups because the delegate issues still +# exists and systemd currently does not support the cgroup feature set required +# for containers run by docker +ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock +ExecReload=/bin/kill -s HUP $MAINPID +TimeoutStartSec=0 +RestartSec=2 +Restart=always + +# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229. +# Both the old, and new location are accepted by systemd 229 and up, so using the old location +# to make them work for either version of systemd. +StartLimitBurst=3 + +# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230. +# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make +# this option work for either version of systemd. +StartLimitInterval=60s + +# Having non-zero Limit*s causes performance problems due to accounting overhead +# in the kernel. We recommend using cgroups to do container-local accounting. +LimitNPROC=infinity +LimitCORE=infinity + +# Comment TasksMax if your systemd version does not support it. +# Only systemd 226 and above support this option. +TasksMax=infinity + +# set delegate yes so that systemd does not reset the cgroups of docker containers +Delegate=yes + +# kill only the docker process, not all processes in the cgroup +KillMode=process +OOMScoreAdjust=-500 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/Docker/Files/docker-original.socket b/Docker/Files/docker-original.socket new file mode 100644 index 0000000..85f9a1f --- /dev/null +++ b/Docker/Files/docker-original.socket @@ -0,0 +1,13 @@ +[Unit] +Description=Docker Socket for the API + +[Socket] +# If /var/run is not implemented as a symlink to /run, you may need to +# specify ListenStream=/var/run/docker.sock instead. +ListenStream=/run/docker.sock +SocketMode=0660 +SocketUser=root +SocketGroup=docker + +[Install] +WantedBy=sockets.target \ No newline at end of file diff --git a/Docker/Files/docker.service b/Docker/Files/docker.service new file mode 100644 index 0000000..4ac5e93 --- /dev/null +++ b/Docker/Files/docker.service @@ -0,0 +1,48 @@ +# Github仓库示例地址: https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service +# 文件位置: /usr/lib/systemd/system/docker.service + +[Unit] +# 服务的描述信息 +Description=Docker Application Container Engine +# 指向 Docker 官方文档,便于 systemd 工具读取帮助信息 +Documentation=https://docs.docker.com +# 在网络完全上线、DNS 可用、docker.socket、firewalld、containerd 等服务就绪后再启动 +After=network-online.target nss-lookup.target docker.socket firewalld.service containerd.service time-set.target +# 希望这些服务也在启动时被激活,但不是强制依赖 +Wants=network-online.target containerd.service +# Docker 服务依赖 docker.socket,否则无法启动 +Requires=docker.socket +# 在设定时间窗口内允许最多 3 次启动失败 +StartLimitBurst=3 +# 启动失败计数的时间窗口为 60 秒 +StartLimitIntervalSec=60 + + +[Service] +# Docker 使用 systemd 的通知机制汇报启动是否完成 +Type=notify +# Docker 守护进程的启动命令,fd:// 表示让 systemd 管理 socket;指定 containerd 套接字路径 +ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock +# 重载配置时给主进程发送 HUP 信号 +ExecReload=/bin/kill -s HUP $MAINPID +# 不限制启动超时时间,避免因系统繁忙造成 dockerd 启动失败 +TimeoutStartSec=0 +# 发生失败重启前等待 2 秒 +RestartSec=2 +# 无论因何原因退出都自动重启 +dRestart=always +# 设为无限以避免内核资源统计带来的性能开销 +LimitNPROC=infinity +LimitCORE=infinity +# 允许 Docker 创建任意数量的任务(需 systemd 226+) +TasksMax=infinity +# 允许 docker 自己管理其 cgroups,不受 systemd 重置影响 +Delegate=yes +# 杀进程时只杀主进程,不影响容器子进程 +KillMode=process +# 降低 Docker 在内存不足(OOM)时被内核优先杀掉的概率 +OOMScoreAdjust=-500 + +[Install] +# 让服务在多用户运行级别自动启动 +WantedBy=multi-user.target \ No newline at end of file diff --git a/Docker/Files/docker.service.old b/Docker/Files/docker.service.old new file mode 100644 index 0000000..d495a47 --- /dev/null +++ b/Docker/Files/docker.service.old @@ -0,0 +1,48 @@ +# Github仓库示例地址: https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service +# 文件位置: /usr/lib/systemd/system/docker.service + +[Unit] +# 描述这个单元的作用是管理 Docker 应用容器引擎 +Description=Docker Application Container Engine +# 提供文档链接,指向 Docker 的官方文档 +Documentation=https://docs.docker.com +# 指定单元的启动顺序和依赖关系[网卡,防火墙,时间同步] +After=network-online.target firewalld.service time-set.target +# 在启动时需要网络已启动 +Wants=network-online.target + +[Service] +# 指定服务的类型为通知类型 +Type=notify +# 指定 Docker 守护进程的启动命令和参数 +ExecStart=/usr/bin/dockerd +# 指定在执行重载时的命令 +ExecReload=/bin/kill -s HUP $MAINPID +# 设置启动超时时间为 0,重启时间为 2 秒 +TimeoutStartSec=0 +# 用于指定服务重新启动之间的延迟时间 +RestartSec=100ms +# 当服务以非零(非成功)的退出状态结束时,Systemd 将自动尝试重新启动该服务 +Restart=on-failure +# 用于设置在 Systemd 尝试启动服务时允许的最大连续启动次数 +StartLimitBurst=3 +# 指定了在 StartLimitBurst 尝试次数内重新启动服务的时间间隔限制 +StartLimitInterval=60s +# 限制一个服务进程可以打开的文件描述符(File Descriptor)的数量 +LimitNOFILE=infinity +# 限制一个服务进程可以创建的子进程数量 +LimitNPROC=infinity +# 限制一个服务进程可以使用的核心转储(core dump)文件的大小 +LimitCORE=infinity +# 限制一个单元内的任务数量(即线程和进程总数) +TasksMax=infinity +# 指定使用委托,让 systemd 不重置 docker 容器的 cgroups +Delegate=yes +# 设置 KillMode 为 process,只杀死 Docker 进程,不影响 cgroup 中的其他进程 +KillMode=process +# 设置 OOMScoreAdjust 为 -500,降低容器进程被 OOM 杀死的概率 +# OOMScoreAdjust=-500 + +# 安装目标为多用户模式 +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/Docker/Files/docker.socket b/Docker/Files/docker.socket new file mode 100644 index 0000000..ae3dad6 --- /dev/null +++ b/Docker/Files/docker.socket @@ -0,0 +1,20 @@ +# Github仓库示例地址: https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.socket +# 文件位置: /usr/lib/systemd/system/docker.socket + +[Unit] +Description=Docker Socket for the API + +[Socket] +# If /var/run is not implemented as a symlink to /run, you may need to +# specify ListenStream=/var/run/docker.sock instead. +ListenStream=/run/docker.sock +SocketMode=0660 +SocketUser=root +SocketGroup=docker + +[Install] +WantedBy=sockets.target + +[Install] +# 这表示你希望你的单元(unit)随着 socket 相关的单元一起启动 +WantedBy=sockets.target diff --git a/Docker/Files/get-docker.sh b/Docker/Files/get-docker.sh new file mode 100644 index 0000000..424c976 --- /dev/null +++ b/Docker/Files/get-docker.sh @@ -0,0 +1,720 @@ +#!/bin/sh +set -e +# Docker Engine for Linux installation script. +# +# This script is intended as a convenient way to configure docker's package +# repositories and to install Docker Engine, This script is not recommended +# for production environments. Before running this script, make yourself familiar +# with potential risks and limitations, and refer to the installation manual +# at https://docs.docker.com/engine/install/ for alternative installation methods. +# +# The script: +# +# - Requires `root` or `sudo` privileges to run. +# - Attempts to detect your Linux distribution and version and configure your +# package management system for you. +# - Doesn't allow you to customize most installation parameters. +# - Installs dependencies and recommendations without asking for confirmation. +# - Installs the latest stable release (by default) of Docker CLI, Docker Engine, +# Docker Buildx, Docker Compose, containerd, and runc. When using this script +# to provision a machine, this may result in unexpected major version upgrades +# of these packages. Always test upgrades in a test environment before +# deploying to your production systems. +# - Isn't designed to upgrade an existing Docker installation. When using the +# script to update an existing installation, dependencies may not be updated +# to the expected version, resulting in outdated versions. +# +# Source code is available at https://github.com/docker/docker-install/ +# +# Usage +# ============================================================================== +# +# To install the latest stable versions of Docker CLI, Docker Engine, and their +# dependencies: +# +# 1. download the script +# +# $ curl -fsSL https://get.docker.com -o install-docker.sh +# +# 2. verify the script's content +# +# $ cat install-docker.sh +# +# 3. run the script with --dry-run to verify the steps it executes +# +# $ sh install-docker.sh --dry-run +# +# 4. run the script either as root, or using sudo to perform the installation. +# +# $ sudo sh install-docker.sh +# +# Command-line options +# ============================================================================== +# +# --version +# Use the --version option to install a specific version, for example: +# +# $ sudo sh install-docker.sh --version 23.0 +# +# --channel +# +# Use the --channel option to install from an alternative installation channel. +# The following example installs the latest versions from the "test" channel, +# which includes pre-releases (alpha, beta, rc): +# +# $ sudo sh install-docker.sh --channel test +# +# Alternatively, use the script at https://test.docker.com, which uses the test +# channel as default. +# +# --mirror +# +# Use the --mirror option to install from a mirror supported by this script. +# Available mirrors are "Aliyun" (https://mirrors.aliyun.com/docker-ce), and +# "AzureChinaCloud" (https://mirror.azure.cn/docker-ce), for example: +# +# $ sudo sh install-docker.sh --mirror AzureChinaCloud +# +# --setup-repo +# +# Use the --setup-repo option to configure Docker's package repositories without +# installing Docker packages. This is useful when you want to add the repository +# but install packages separately: +# +# $ sudo sh install-docker.sh --setup-repo +# +# ============================================================================== + + +# Git commit from https://github.com/docker/docker-install when +# the script was uploaded (Should only be modified by upload job): +SCRIPT_COMMIT_SHA="${LOAD_SCRIPT_COMMIT_SHA}" + +# strip "v" prefix if present +VERSION="${VERSION#v}" + +# The channel to install from: +# * stable +# * test +DEFAULT_CHANNEL_VALUE="stable" +if [ -z "$CHANNEL" ]; then + CHANNEL=$DEFAULT_CHANNEL_VALUE +fi + +DEFAULT_DOWNLOAD_URL="https://download.docker.com" +if [ -z "$DOWNLOAD_URL" ]; then + DOWNLOAD_URL=$DEFAULT_DOWNLOAD_URL +fi + +DEFAULT_REPO_FILE="docker-ce.repo" +if [ -z "$REPO_FILE" ]; then + REPO_FILE="$DEFAULT_REPO_FILE" + # Automatically default to a staging repo fora + # a staging download url (download-stage.docker.com) + case "$DOWNLOAD_URL" in + *-stage*) REPO_FILE="docker-ce-staging.repo";; + esac +fi + +mirror='' +DRY_RUN=${DRY_RUN:-} +REPO_ONLY=${REPO_ONLY:-0} +while [ $# -gt 0 ]; do + case "$1" in + --channel) + CHANNEL="$2" + shift + ;; + --dry-run) + DRY_RUN=1 + ;; + --mirror) + mirror="$2" + shift + ;; + --version) + VERSION="${2#v}" + shift + ;; + --setup-repo) + REPO_ONLY=1 + shift + ;; + --*) + echo "Illegal option $1" + ;; + esac + shift $(( $# > 0 ? 1 : 0 )) +done + +case "$mirror" in + Aliyun) + DOWNLOAD_URL="https://mirrors.aliyun.com/docker-ce" + ;; + AzureChinaCloud) + DOWNLOAD_URL="https://mirror.azure.cn/docker-ce" + ;; + "") + ;; + *) + >&2 echo "unknown mirror '$mirror': use either 'Aliyun', or 'AzureChinaCloud'." + exit 1 + ;; +esac + +case "$CHANNEL" in + stable|test) + ;; + *) + >&2 echo "unknown CHANNEL '$CHANNEL': use either stable or test." + exit 1 + ;; +esac + +command_exists() { + command -v "$@" > /dev/null 2>&1 +} + +# version_gte checks if the version specified in $VERSION is at least the given +# SemVer (Maj.Minor[.Patch]), or CalVer (YY.MM) version.It returns 0 (success) +# if $VERSION is either unset (=latest) or newer or equal than the specified +# version, or returns 1 (fail) otherwise. +# +# examples: +# +# VERSION=23.0 +# version_gte 23.0 // 0 (success) +# version_gte 20.10 // 0 (success) +# version_gte 19.03 // 0 (success) +# version_gte 26.1 // 1 (fail) +version_gte() { + if [ -z "$VERSION" ]; then + return 0 + fi + version_compare "$VERSION" "$1" +} + +# version_compare compares two version strings (either SemVer (Major.Minor.Path), +# or CalVer (YY.MM) version strings. It returns 0 (success) if version A is newer +# or equal than version B, or 1 (fail) otherwise. Patch releases and pre-release +# (-alpha/-beta) are not taken into account +# +# examples: +# +# version_compare 23.0.0 20.10 // 0 (success) +# version_compare 23.0 20.10 // 0 (success) +# version_compare 20.10 19.03 // 0 (success) +# version_compare 20.10 20.10 // 0 (success) +# version_compare 19.03 20.10 // 1 (fail) +version_compare() ( + set +x + + yy_a="$(echo "$1" | cut -d'.' -f1)" + yy_b="$(echo "$2" | cut -d'.' -f1)" + if [ "$yy_a" -lt "$yy_b" ]; then + return 1 + fi + if [ "$yy_a" -gt "$yy_b" ]; then + return 0 + fi + mm_a="$(echo "$1" | cut -d'.' -f2)" + mm_b="$(echo "$2" | cut -d'.' -f2)" + + # trim leading zeros to accommodate CalVer + mm_a="${mm_a#0}" + mm_b="${mm_b#0}" + + if [ "${mm_a:-0}" -lt "${mm_b:-0}" ]; then + return 1 + fi + + return 0 +) + +is_dry_run() { + if [ -z "$DRY_RUN" ]; then + return 1 + else + return 0 + fi +} + +is_wsl() { + case "$(uname -r)" in + *microsoft* ) true ;; # WSL 2 + *Microsoft* ) true ;; # WSL 1 + * ) false;; + esac +} + +is_darwin() { + case "$(uname -s)" in + *darwin* ) true ;; + *Darwin* ) true ;; + * ) false;; + esac +} + +deprecation_notice() { + distro=$1 + distro_version=$2 + echo + printf "\033[91;1mDEPRECATION WARNING\033[0m\n" + printf " This Linux distribution (\033[1m%s %s\033[0m) reached end-of-life and is no longer supported by this script.\n" "$distro" "$distro_version" + echo " No updates or security fixes will be released for this distribution, and users are recommended" + echo " to upgrade to a currently maintained version of $distro." + echo + printf "Press \033[1mCtrl+C\033[0m now to abort this script, or wait for the installation to continue." + echo + sleep 10 +} + +get_distribution() { + lsb_dist="" + # Every system that we officially support has /etc/os-release + if [ -r /etc/os-release ]; then + lsb_dist="$(. /etc/os-release && echo "$ID")" + fi + # Returning an empty string here should be alright since the + # case statements don't act unless you provide an actual value + echo "$lsb_dist" +} + +echo_docker_as_nonroot() { + if is_dry_run; then + return + fi + if command_exists docker && [ -e /var/run/docker.sock ]; then + ( + set -x + $sh_c 'docker version' + ) || true + fi + + # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-EOF", spaces are kept in the output + echo + echo "================================================================================" + echo + if version_gte "20.10"; then + echo "To run Docker as a non-privileged user, consider setting up the" + echo "Docker daemon in rootless mode for your user:" + echo + echo " dockerd-rootless-setuptool.sh install" + echo + echo "Visit https://docs.docker.com/go/rootless/ to learn about rootless mode." + echo + fi + echo + echo "To run the Docker daemon as a fully privileged service, but granting non-root" + echo "users access, refer to https://docs.docker.com/go/daemon-access/" + echo + echo "WARNING: Access to the remote API on a privileged Docker daemon is equivalent" + echo " to root access on the host. Refer to the 'Docker daemon attack surface'" + echo " documentation for details: https://docs.docker.com/go/attack-surface/" + echo + echo "================================================================================" + echo +} + +# Check if this is a forked Linux distro +check_forked() { + + # Check for lsb_release command existence, it usually exists in forked distros + if command_exists lsb_release; then + # Check if the `-u` option is supported + set +e + lsb_release -a -u > /dev/null 2>&1 + lsb_release_exit_code=$? + set -e + + # Check if the command has exited successfully, it means we're in a forked distro + if [ "$lsb_release_exit_code" = "0" ]; then + # Print info about current distro + cat <<-EOF + You're using '$lsb_dist' version '$dist_version'. + EOF + + # Get the upstream release info + lsb_dist=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'id' | cut -d ':' -f 2 | tr -d '[:space:]') + dist_version=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'codename' | cut -d ':' -f 2 | tr -d '[:space:]') + + # Print info about upstream distro + cat <<-EOF + Upstream release is '$lsb_dist' version '$dist_version'. + EOF + else + if [ -r /etc/debian_version ] && [ "$lsb_dist" != "ubuntu" ] && [ "$lsb_dist" != "raspbian" ]; then + if [ "$lsb_dist" = "osmc" ]; then + # OSMC runs Raspbian + lsb_dist=raspbian + else + # We're Debian and don't even know it! + lsb_dist=debian + fi + dist_version="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')" + case "$dist_version" in + 13) + dist_version="trixie" + ;; + 12) + dist_version="bookworm" + ;; + 11) + dist_version="bullseye" + ;; + 10) + dist_version="buster" + ;; + 9) + dist_version="stretch" + ;; + 8) + dist_version="jessie" + ;; + esac + fi + fi + fi +} + +do_install() { + echo "# Executing docker install script, commit: $SCRIPT_COMMIT_SHA" + + if command_exists docker; then + cat >&2 <<-'EOF' + Warning: the "docker" command appears to already exist on this system. + + If you already have Docker installed, this script can cause trouble, which is + why we're displaying this warning and provide the opportunity to cancel the + installation. + + If you installed the current Docker package using this script and are using it + again to update Docker, you can ignore this message, but be aware that the + script resets any custom changes in the deb and rpm repo configuration + files to match the parameters passed to the script. + + You may press Ctrl+C now to abort this script. + EOF + ( set -x; sleep 20 ) + fi + + user="$(id -un 2>/dev/null || true)" + + sh_c='sh -c' + if [ "$user" != 'root' ]; then + if command_exists sudo; then + sh_c='sudo -E sh -c' + elif command_exists su; then + sh_c='su -c' + else + cat >&2 <<-'EOF' + Error: this installer needs the ability to run commands as root. + We are unable to find either "sudo" or "su" available to make this happen. + EOF + exit 1 + fi + fi + + if is_dry_run; then + sh_c="echo" + fi + + # perform some very rudimentary platform detection + lsb_dist=$( get_distribution ) + lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" + + if is_wsl; then + echo + echo "WSL DETECTED: We recommend using Docker Desktop for Windows." + echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop/" + echo + cat >&2 <<-'EOF' + + You may press Ctrl+C now to abort this script. + EOF + ( set -x; sleep 20 ) + fi + + case "$lsb_dist" in + + ubuntu) + if command_exists lsb_release; then + dist_version="$(lsb_release --codename | cut -f2)" + fi + if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then + dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")" + fi + ;; + + debian|raspbian) + dist_version="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')" + case "$dist_version" in + 13) + dist_version="trixie" + ;; + 12) + dist_version="bookworm" + ;; + 11) + dist_version="bullseye" + ;; + 10) + dist_version="buster" + ;; + 9) + dist_version="stretch" + ;; + 8) + dist_version="jessie" + ;; + esac + ;; + + centos|rhel) + if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then + dist_version="$(. /etc/os-release && echo "$VERSION_ID")" + fi + ;; + + *) + if command_exists lsb_release; then + dist_version="$(lsb_release --release | cut -f2)" + fi + if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then + dist_version="$(. /etc/os-release && echo "$VERSION_ID")" + fi + ;; + + esac + + # Check if this is a forked Linux distro + check_forked + + # Print deprecation warnings for distro versions that recently reached EOL, + # but may still be commonly used (especially LTS versions). + case "$lsb_dist.$dist_version" in + centos.8|centos.7|rhel.7) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + debian.buster|debian.stretch|debian.jessie) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + raspbian.buster|raspbian.stretch|raspbian.jessie) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + ubuntu.focal|ubuntu.bionic|ubuntu.xenial|ubuntu.trusty) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + ubuntu.oracular|ubuntu.mantic|ubuntu.lunar|ubuntu.kinetic|ubuntu.impish|ubuntu.hirsute|ubuntu.groovy|ubuntu.eoan|ubuntu.disco|ubuntu.cosmic) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + fedora.*) + if [ "$dist_version" -lt 41 ]; then + deprecation_notice "$lsb_dist" "$dist_version" + fi + ;; + esac + + # Run setup for each distro accordingly + case "$lsb_dist" in + ubuntu|debian|raspbian) + pre_reqs="ca-certificates curl" + apt_repo="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] $DOWNLOAD_URL/linux/$lsb_dist $dist_version $CHANNEL" + ( + if ! is_dry_run; then + set -x + fi + $sh_c 'apt-get -qq update >/dev/null' + $sh_c "DEBIAN_FRONTEND=noninteractive apt-get -y -qq install $pre_reqs >/dev/null" + $sh_c 'install -m 0755 -d /etc/apt/keyrings' + $sh_c "curl -fsSL \"$DOWNLOAD_URL/linux/$lsb_dist/gpg\" -o /etc/apt/keyrings/docker.asc" + $sh_c "chmod a+r /etc/apt/keyrings/docker.asc" + $sh_c "echo \"$apt_repo\" > /etc/apt/sources.list.d/docker.list" + $sh_c 'apt-get -qq update >/dev/null' + ) + + if [ "$REPO_ONLY" = "1" ]; then + exit 0 + fi + + pkg_version="" + if [ -n "$VERSION" ]; then + if is_dry_run; then + echo "# WARNING: VERSION pinning is not supported in DRY_RUN" + else + # Will work for incomplete versions IE (17.12), but may not actually grab the "latest" if in the test channel + pkg_pattern="$(echo "$VERSION" | sed 's/-ce-/~ce~.*/g' | sed 's/-/.*/g')" + search_command="apt-cache madison docker-ce | grep '$pkg_pattern' | head -1 | awk '{\$1=\$1};1' | cut -d' ' -f 3" + pkg_version="$($sh_c "$search_command")" + echo "INFO: Searching repository for VERSION '$VERSION'" + echo "INFO: $search_command" + if [ -z "$pkg_version" ]; then + echo + echo "ERROR: '$VERSION' not found amongst apt-cache madison results" + echo + exit 1 + fi + if version_gte "18.09"; then + search_command="apt-cache madison docker-ce-cli | grep '$pkg_pattern' | head -1 | awk '{\$1=\$1};1' | cut -d' ' -f 3" + echo "INFO: $search_command" + cli_pkg_version="=$($sh_c "$search_command")" + fi + pkg_version="=$pkg_version" + fi + fi + ( + pkgs="docker-ce${pkg_version%=}" + if version_gte "18.09"; then + # older versions didn't ship the cli and containerd as separate packages + pkgs="$pkgs docker-ce-cli${cli_pkg_version%=} containerd.io" + fi + if version_gte "20.10"; then + pkgs="$pkgs docker-compose-plugin docker-ce-rootless-extras$pkg_version" + fi + if version_gte "23.0"; then + pkgs="$pkgs docker-buildx-plugin" + fi + if version_gte "28.2"; then + pkgs="$pkgs docker-model-plugin" + fi + if ! is_dry_run; then + set -x + fi + $sh_c "DEBIAN_FRONTEND=noninteractive apt-get -y -qq install $pkgs >/dev/null" + ) + echo_docker_as_nonroot + exit 0 + ;; + centos|fedora|rhel) + if [ "$(uname -m)" = "s390x" ]; then + echo "Effective v27.5, please consult RHEL distro statement for s390x support." + exit 1 + fi + repo_file_url="$DOWNLOAD_URL/linux/$lsb_dist/$REPO_FILE" + ( + if ! is_dry_run; then + set -x + fi + if command_exists dnf5; then + $sh_c "dnf -y -q --setopt=install_weak_deps=False install dnf-plugins-core" + $sh_c "dnf5 config-manager addrepo --overwrite --save-filename=docker-ce.repo --from-repofile='$repo_file_url'" + + if [ "$CHANNEL" != "stable" ]; then + $sh_c "dnf5 config-manager setopt \"docker-ce-*.enabled=0\"" + $sh_c "dnf5 config-manager setopt \"docker-ce-$CHANNEL.enabled=1\"" + fi + $sh_c "dnf makecache" + elif command_exists dnf; then + $sh_c "dnf -y -q --setopt=install_weak_deps=False install dnf-plugins-core" + $sh_c "rm -f /etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/docker-ce-staging.repo" + $sh_c "dnf config-manager --add-repo $repo_file_url" + + if [ "$CHANNEL" != "stable" ]; then + $sh_c "dnf config-manager --set-disabled \"docker-ce-*\"" + $sh_c "dnf config-manager --set-enabled \"docker-ce-$CHANNEL\"" + fi + $sh_c "dnf makecache" + else + $sh_c "yum -y -q install yum-utils" + $sh_c "rm -f /etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/docker-ce-staging.repo" + $sh_c "yum-config-manager --add-repo $repo_file_url" + + if [ "$CHANNEL" != "stable" ]; then + $sh_c "yum-config-manager --disable \"docker-ce-*\"" + $sh_c "yum-config-manager --enable \"docker-ce-$CHANNEL\"" + fi + $sh_c "yum makecache" + fi + ) + + if [ "$REPO_ONLY" = "1" ]; then + exit 0 + fi + + pkg_version="" + if command_exists dnf; then + pkg_manager="dnf" + pkg_manager_flags="-y -q --best" + else + pkg_manager="yum" + pkg_manager_flags="-y -q" + fi + if [ -n "$VERSION" ]; then + if is_dry_run; then + echo "# WARNING: VERSION pinning is not supported in DRY_RUN" + else + if [ "$lsb_dist" = "fedora" ]; then + pkg_suffix="fc$dist_version" + else + pkg_suffix="el" + fi + pkg_pattern="$(echo "$VERSION" | sed 's/-ce-/\\\\.ce.*/g' | sed 's/-/.*/g').*$pkg_suffix" + search_command="$pkg_manager list --showduplicates docker-ce | grep '$pkg_pattern' | tail -1 | awk '{print \$2}'" + pkg_version="$($sh_c "$search_command")" + echo "INFO: Searching repository for VERSION '$VERSION'" + echo "INFO: $search_command" + if [ -z "$pkg_version" ]; then + echo + echo "ERROR: '$VERSION' not found amongst $pkg_manager list results" + echo + exit 1 + fi + if version_gte "18.09"; then + # older versions don't support a cli package + search_command="$pkg_manager list --showduplicates docker-ce-cli | grep '$pkg_pattern' | tail -1 | awk '{print \$2}'" + cli_pkg_version="$($sh_c "$search_command" | cut -d':' -f 2)" + fi + # Cut out the epoch and prefix with a '-' + pkg_version="-$(echo "$pkg_version" | cut -d':' -f 2)" + fi + fi + ( + pkgs="docker-ce$pkg_version" + if version_gte "18.09"; then + # older versions didn't ship the cli and containerd as separate packages + if [ -n "$cli_pkg_version" ]; then + pkgs="$pkgs docker-ce-cli-$cli_pkg_version containerd.io" + else + pkgs="$pkgs docker-ce-cli containerd.io" + fi + fi + if version_gte "20.10"; then + pkgs="$pkgs docker-compose-plugin docker-ce-rootless-extras$pkg_version" + fi + if version_gte "23.0"; then + pkgs="$pkgs docker-buildx-plugin docker-model-plugin" + fi + if ! is_dry_run; then + set -x + fi + $sh_c "$pkg_manager $pkg_manager_flags install $pkgs" + ) + echo_docker_as_nonroot + exit 0 + ;; + sles) + echo "Effective v27.5, please consult SLES distro statement for s390x support." + exit 1 + ;; + *) + if [ -z "$lsb_dist" ]; then + if is_darwin; then + echo + echo "ERROR: Unsupported operating system 'macOS'" + echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop" + echo + exit 1 + fi + fi + echo + echo "ERROR: Unsupported distribution '$lsb_dist'" + echo + exit 1 + ;; + esac + exit 1 +} + +# wrapped up in a function so that we have some protection against only getting +# half the file during "curl | sh" +do_install diff --git a/Docker/Files/offends.conf b/Docker/Files/offends.conf new file mode 100644 index 0000000..23082ab --- /dev/null +++ b/Docker/Files/offends.conf @@ -0,0 +1,2 @@ +net.ipv4.ip_forward = 1 +vm.swappiness = 0 \ No newline at end of file diff --git a/Docker/Files/rancher-20.10.sh b/Docker/Files/rancher-20.10.sh new file mode 100644 index 0000000..1215e4f --- /dev/null +++ b/Docker/Files/rancher-20.10.sh @@ -0,0 +1,708 @@ +#!/bin/sh +set -e +# Docker CE for Linux installation script +# +# See https://docs.docker.com/engine/install/ for the installation steps. +# +# This script is meant for quick & easy install via: +# $ curl -fsSL https://get.docker.com -o get-docker.sh +# $ sh get-docker.sh +# +# For test builds (ie. release candidates): +# $ curl -fsSL https://test.docker.com -o test-docker.sh +# $ sh test-docker.sh +# +# NOTE: Make sure to verify the contents of the script +# you downloaded matches the contents of install.sh +# located at https://github.com/docker/docker-install +# before executing. +# +# Git commit from https://github.com/docker/docker-install when +# the script was uploaded (Should only be modified by upload job): +SCRIPT_COMMIT_SHA="a8a6b338bdfedd7ddefb96fe3e7fe7d4036d945a" + +CHANNEL="stable" +DOWNLOAD_URL="https://download.docker.com" +REPO_FILE="docker-ce.repo" +VERSION="20.10.24" +DIND_TEST_WAIT=${DIND_TEST_WAIT:-3s} # Wait time until docker start at dind test env + +# Issue https://github.com/rancher/rancher/issues/29246 +adjust_repo_releasever() { + DOWNLOAD_URL="https://download.docker.com" + case $1 in + 7*) + releasever=7 + ;; + 8*) + releasever=8 + ;; + *) + # fedora, or unsupported + return + ;; + esac + + for channel in "stable" "test" "nightly"; do + $sh_c "$config_manager --setopt=docker-ce-${channel}.baseurl=${DOWNLOAD_URL}/linux/centos/${releasever}/\\\$basearch/${channel} --save"; + $sh_c "$config_manager --setopt=docker-ce-${channel}-debuginfo.baseurl=${DOWNLOAD_URL}/linux/centos/${releasever}/debug-\\\$basearch/${channel} --save"; + $sh_c "$config_manager --setopt=docker-ce-${channel}-source.baseurl=${DOWNLOAD_URL}/linux/centos/${releasever}/source/${channel} --save"; + done +} + +mirror='' +DRY_RUN=${DRY_RUN:-} +while [ $# -gt 0 ]; do + case "$1" in + --mirror) + mirror="$2" + shift + ;; + --dry-run) + DRY_RUN=1 + ;; + --*) + echo "Illegal option $1" + ;; + esac + shift $(( $# > 0 ? 1 : 0 )) +done + +case "$mirror" in + Aliyun) + DOWNLOAD_URL="https://mirrors.aliyun.com/docker-ce" + ;; + AzureChinaCloud) + DOWNLOAD_URL="https://mirror.azure.cn/docker-ce" + ;; +esac + +start_docker() { + if [ ! -z $DIND_TEST ]; then + # Starting dockerd manually due to dind env is not using systemd + dockerd & + sleep $DIND_TEST_WAIT + elif [ -d '/run/systemd/system' ] ; then + $sh_c 'systemctl start docker' + else + $sh_c 'service docker start' + fi +} + +command_exists() { + command -v "$@" > /dev/null 2>&1 +} + +# version_gte checks if the version specified in $VERSION is at least +# the given CalVer (YY.MM) version. returns 0 (success) if $VERSION is either +# unset (=latest) or newer or equal than the specified version. Returns 1 (fail) +# otherwise. +# +# examples: +# +# VERSION=20.10 +# version_gte 20.10 // 0 (success) +# version_gte 19.03 // 0 (success) +# version_gte 21.10 // 1 (fail) +version_gte() { + if [ -z "$VERSION" ]; then + return 0 + fi + eval calver_compare "$VERSION" "$1" +} + +# calver_compare compares two CalVer (YY.MM) version strings. returns 0 (success) +# if version A is newer or equal than version B, or 1 (fail) otherwise. Patch +# releases and pre-release (-alpha/-beta) are not taken into account +# +# examples: +# +# calver_compare 20.10 19.03 // 0 (success) +# calver_compare 20.10 20.10 // 0 (success) +# calver_compare 19.03 20.10 // 1 (fail) +calver_compare() ( + set +x + + yy_a="$(echo "$1" | cut -d'.' -f1)" + yy_b="$(echo "$2" | cut -d'.' -f1)" + if [ "$yy_a" -lt "$yy_b" ]; then + return 1 + fi + if [ "$yy_a" -gt "$yy_b" ]; then + return 0 + fi + mm_a="$(echo "$1" | cut -d'.' -f2)" + mm_b="$(echo "$2" | cut -d'.' -f2)" + if [ "${mm_a#0}" -lt "${mm_b#0}" ]; then + return 1 + fi + + return 0 +) + +is_dry_run() { + if [ -z "$DRY_RUN" ]; then + return 1 + else + return 0 + fi +} + +is_wsl() { + case "$(uname -r)" in + *microsoft* ) true ;; # WSL 2 + *Microsoft* ) true ;; # WSL 1 + * ) false;; + esac +} + +is_darwin() { + case "$(uname -s)" in + *darwin* ) true ;; + *Darwin* ) true ;; + * ) false;; + esac +} + +deprecation_notice() { + distro=$1 + distro_version=$2 + echo + printf "\033[91;1mDEPRECATION WARNING\033[0m\n" + printf " This Linux distribution (\033[1m%s %s\033[0m) reached end-of-life and is no longer supported by this script.\n" "$distro" "$distro_version" + echo " No updates or security fixes will be released for this distribution, and users are recommended" + echo " to upgrade to a currently maintained version of $distro." + echo + printf "Press \033[1mCtrl+C\033[0m now to abort this script, or wait for the installation to continue." + echo + sleep 10 +} + +get_distribution() { + lsb_dist="" + # Every system that we officially support has /etc/os-release + if [ -r /etc/os-release ]; then + lsb_dist="$(. /etc/os-release && echo "$ID")" + fi + # Returning an empty string here should be alright since the + # case statements don't act unless you provide an actual value + echo "$lsb_dist" +} + +echo_docker_as_nonroot() { + if is_dry_run; then + return + fi + if command_exists docker && [ -e /var/run/docker.sock ]; then + ( + set -x + $sh_c 'docker version' + ) || true + fi + + # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-EOF", spaces are kept in the output + echo + echo "================================================================================" + echo + if version_gte "20.10"; then + echo "To run Docker as a non-privileged user, consider setting up the" + echo "Docker daemon in rootless mode for your user:" + echo + echo " dockerd-rootless-setuptool.sh install" + echo + echo "Visit https://docs.docker.com/go/rootless/ to learn about rootless mode." + echo + fi + echo + echo "To run the Docker daemon as a fully privileged service, but granting non-root" + echo "users access, refer to https://docs.docker.com/go/daemon-access/" + echo + echo "WARNING: Access to the remote API on a privileged Docker daemon is equivalent" + echo " to root access on the host. Refer to the 'Docker daemon attack surface'" + echo " documentation for details: https://docs.docker.com/go/attack-surface/" + echo + echo "================================================================================" + echo +} + +# Check if this is a forked Linux distro +check_forked() { + + # Check for lsb_release command existence, it usually exists in forked distros + if command_exists lsb_release; then + # Check if the `-u` option is supported + set +e + lsb_release -a -u > /dev/null 2>&1 + lsb_release_exit_code=$? + set -e + + # Check if the command has exited successfully, it means we're in a forked distro + if [ "$lsb_release_exit_code" = "0" ]; then + # Print info about current distro + cat <<-EOF + You're using '$lsb_dist' version '$dist_version'. + EOF + + # Get the upstream release info + lsb_dist=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'id' | cut -d ':' -f 2 | tr -d '[:space:]') + dist_version=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'codename' | cut -d ':' -f 2 | tr -d '[:space:]') + + # Print info about upstream distro + cat <<-EOF + Upstream release is '$lsb_dist' version '$dist_version'. + EOF + else + if [ -r /etc/debian_version ] && [ "$lsb_dist" != "ubuntu" ] && [ "$lsb_dist" != "raspbian" ]; then + if [ "$lsb_dist" = "osmc" ]; then + # OSMC runs Raspbian + lsb_dist=raspbian + else + # We're Debian and don't even know it! + lsb_dist=debian + fi + dist_version="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')" + case "$dist_version" in + 12) + dist_version="bookworm" + ;; + 11) + dist_version="bullseye" + ;; + 10) + dist_version="buster" + ;; + 9) + dist_version="stretch" + ;; + 8) + dist_version="jessie" + ;; + esac + fi + fi + fi +} + +do_install() { + echo "# Executing docker install script, commit: $SCRIPT_COMMIT_SHA" + + if command_exists docker; then + cat >&2 <<-'EOF' + Warning: the "docker" command appears to already exist on this system. + + If you already have Docker installed, this script can cause trouble, which is + why we're displaying this warning and provide the opportunity to cancel the + installation. + + If you installed the current Docker package using this script and are using it + again to update Docker, you can safely ignore this message. + + You may press Ctrl+C now to abort this script. + EOF + ( set -x; sleep 20 ) + fi + + user="$(id -un 2>/dev/null || true)" + + sh_c='sh -c' + if [ "$user" != 'root' ]; then + if command_exists sudo; then + sh_c='sudo -E sh -c' + elif command_exists su; then + sh_c='su -c' + else + cat >&2 <<-'EOF' + Error: this installer needs the ability to run commands as root. + We are unable to find either "sudo" or "su" available to make this happen. + EOF + exit 1 + fi + fi + + if is_dry_run; then + sh_c="echo" + fi + + # perform some very rudimentary platform detection + lsb_dist=$( get_distribution ) + lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" + + if is_wsl; then + echo + echo "WSL DETECTED: We recommend using Docker Desktop for Windows." + echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop" + echo + cat >&2 <<-'EOF' + + You may press Ctrl+C now to abort this script. + EOF + ( set -x; sleep 20 ) + fi + + case "$lsb_dist" in + + ubuntu) + if command_exists lsb_release; then + dist_version="$(lsb_release --codename | cut -f2)" + fi + if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then + dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")" + fi + ;; + + debian|raspbian) + dist_version="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')" + case "$dist_version" in + 12) + dist_version="bookworm" + ;; + 11) + dist_version="bullseye" + ;; + 10) + dist_version="buster" + ;; + 9) + dist_version="stretch" + ;; + 8) + dist_version="jessie" + ;; + esac + ;; + + centos|rhel|sles|rocky) + if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then + dist_version="$(. /etc/os-release && echo "$VERSION_ID")" + fi + + ;; + + oracleserver|ol) + lsb_dist="ol" + # need to switch lsb_dist to match yum repo URL + dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')" + ;; + + *) + if command_exists lsb_release; then + dist_version="$(lsb_release --release | cut -f2)" + fi + if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then + dist_version="$(. /etc/os-release && echo "$VERSION_ID")" + fi + ;; + + esac + + # Check if this is a forked Linux distro + check_forked + + # Print deprecation warnings for distro versions that recently reached EOL, + # but may still be commonly used (especially LTS versions). + case "$lsb_dist.$dist_version" in + debian.stretch|debian.jessie) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + raspbian.stretch|raspbian.jessie) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + ubuntu.xenial|ubuntu.trusty) + deprecation_notice "$lsb_dist" "$dist_version" + ;; + fedora.*) + if [ "$dist_version" -lt 36 ]; then + deprecation_notice "$lsb_dist" "$dist_version" + fi + ;; + esac + + # Run setup for each distro accordingly + case "$lsb_dist" in + ubuntu|debian|raspbian) + pre_reqs="apt-transport-https ca-certificates curl" + if ! command -v gpg > /dev/null; then + pre_reqs="$pre_reqs gnupg" + fi + apt_repo="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] $DOWNLOAD_URL/linux/$lsb_dist $dist_version $CHANNEL" + ( + if ! is_dry_run; then + set -x + fi + $sh_c 'apt-get update -qq >/dev/null' + $sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $pre_reqs >/dev/null" + $sh_c 'mkdir -p /etc/apt/keyrings && chmod -R 0755 /etc/apt/keyrings' + $sh_c "curl -fsSL \"$DOWNLOAD_URL/linux/$lsb_dist/gpg\" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg" + $sh_c "chmod a+r /etc/apt/keyrings/docker.gpg" + $sh_c "echo \"$apt_repo\" > /etc/apt/sources.list.d/docker.list" + $sh_c 'apt-get update -qq >/dev/null' + ) + pkg_version="" + if [ -n "$VERSION" ]; then + if is_dry_run; then + echo "# WARNING: VERSION pinning is not supported in DRY_RUN" + else + # Will work for incomplete versions IE (17.12), but may not actually grab the "latest" if in the test channel + pkg_pattern="$(echo "$VERSION" | sed "s/-ce-/~ce~.*/g" | sed "s/-/.*/g")" + search_command="apt-cache madison 'docker-ce' | grep '$pkg_pattern' | head -1 | awk '{\$1=\$1};1' | cut -d' ' -f 3" + pkg_version="$($sh_c "$search_command")" + echo "INFO: Searching repository for VERSION '$VERSION'" + echo "INFO: $search_command" + if [ -z "$pkg_version" ]; then + echo + echo "ERROR: '$VERSION' not found amongst apt-cache madison results" + echo + exit 1 + fi + if version_gte "18.09"; then + search_command="apt-cache madison 'docker-ce-cli' | grep '$pkg_pattern' | head -1 | awk '{\$1=\$1};1' | cut -d' ' -f 3" + echo "INFO: $search_command" + cli_pkg_version="=$($sh_c "$search_command")" + fi + pkg_version="=$pkg_version" + fi + fi + ( + pkgs="docker-ce${pkg_version%=}" + if version_gte "18.09"; then + # older versions didn't ship the cli and containerd as separate packages + pkgs="$pkgs docker-ce-cli${cli_pkg_version%=} containerd.io" + fi + if version_gte "20.10"; then + pkgs="$pkgs docker-compose-plugin docker-ce-rootless-extras$pkg_version" + fi + if version_gte "23.0"; then + pkgs="$pkgs docker-buildx-plugin" + fi + if ! is_dry_run; then + set -x + fi + $sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $pkgs >/dev/null" + start_docker + + ) + echo_docker_as_nonroot + exit 0 + ;; + centos|fedora|rhel|ol|rocky) + # set vault.centos.or repo as CentOS8 is now EOL + if [ "$lsb_dist" = "centos" ] && [ "$dist_version" -ge "8" ]; then + $sh_c "find /etc/yum.repos.d -type f -exec sed -i 's/mirrorlist=http:\/\/mirrorlist.centos.org/\#mirrorlist=http:\/\/mirrorlist.centos.org/g' {} \;" + $sh_c "find /etc/yum.repos.d -type f -exec sed -i 's/\#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g' {} \;" + $sh_c "dnf swap centos-linux-repos centos-stream-repos -y" + fi + if [ "$lsb_dist" = "fedora" ]; then + pkg_manager="dnf" + config_manager="dnf config-manager" + enable_channel_flag="--set-enabled" + disable_channel_flag="--set-disabled" + pre_reqs="dnf-plugins-core" + pkg_suffix="fc$dist_version" + else + pkg_manager="yum" + config_manager="yum-config-manager" + enable_channel_flag="--enable" + disable_channel_flag="--disable" + pre_reqs="yum-utils" + pkg_suffix="el" + fi + repo_file_url="$DOWNLOAD_URL/linux/$lsb_dist/$REPO_FILE" + if [ "$lsb_dist" = "ol" ] || [ "$lsb_dist" = "rocky" ] || [ "$lsb_dist" = "rhel" ]; then + repo_file_url="$DOWNLOAD_URL/linux/centos/$REPO_FILE" + fi + ( + if ! is_dry_run; then + set -x + fi + $sh_c "$pkg_manager install -y -q $pre_reqs" + $sh_c "$config_manager --add-repo $repo_file_url" + + if [ "$CHANNEL" != "stable" ]; then + $sh_c "$config_manager $disable_channel_flag docker-ce-*" + $sh_c "$config_manager $enable_channel_flag docker-ce-$CHANNEL" + fi + if [ "$lsb_dist" = "rhel" ] || [ "$lsb_dist" = "ol" ]; then + adjust_repo_releasever "$dist_version" + # Add extra repo for version 7.x + if [[ "$dist_version" =~ "7." ]] || [ "$dist_version" == "7" ] ; then + if [ "$lsb_dist" = "rhel" ]; then + $sh_c "$config_manager $enable_channel_flag rhui-REGION-rhel-server-extras" + $sh_c "$config_manager $enable_channel_flag rhui-rhel-7-server-rhui-extras-rpms" + $sh_c "$config_manager $enable_channel_flag rhui-rhel-7-for-arm-64-extras-rhui-rpms" + $sh_c "$config_manager $enable_channel_flag rhel-7-server-rhui-extras-rpms" + $sh_c "$config_manager $enable_channel_flag rhel-7-server-extras-rpms" + else + $sh_c "$config_manager $enable_channel_flag ol7_addons" + # Adding OL7 developer repo if doesn't exist + if [ "$(yum repolist | grep yum.oracle.com_repo_OracleLinux_OL7_developer > /dev/null || echo add)" == "add" ]; then + $sh_c "$config_manager --add-repo https://yum.oracle.com/repo/OracleLinux/OL7/developer/x86_64" + fi + fi + fi + fi + $sh_c "$pkg_manager makecache" + ) + pkg_version="" + if [ -n "$VERSION" ]; then + if is_dry_run; then + echo "# WARNING: VERSION pinning is not supported in DRY_RUN" + else + pkg_pattern="$(echo "$VERSION" | sed "s/-ce-/\\\\.ce.*/g" | sed "s/-/.*/g").*$pkg_suffix" + search_command="$pkg_manager list --showduplicates 'docker-ce' | grep '$pkg_pattern' | tail -1 | awk '{print \$2}'" + pkg_version="$($sh_c "$search_command")" + echo "INFO: Searching repository for VERSION '$VERSION'" + echo "INFO: $search_command" + if [ -z "$pkg_version" ]; then + echo + echo "ERROR: '$VERSION' not found amongst $pkg_manager list results" + echo + exit 1 + fi + if version_gte "18.09"; then + # older versions don't support a cli package + search_command="$pkg_manager list --showduplicates 'docker-ce-cli' | grep '$pkg_pattern' | tail -1 | awk '{print \$2}'" + cli_pkg_version="$($sh_c "$search_command" | cut -d':' -f 2)" + fi + # Cut out the epoch and prefix with a '-' + pkg_version="-$(echo "$pkg_version" | cut -d':' -f 2)" + fi + fi + ( + pkgs="docker-ce$pkg_version" + if version_gte "18.09"; then + # older versions didn't ship the cli and containerd as separate packages + if [ -n "$cli_pkg_version" ]; then + pkgs="$pkgs docker-ce-cli-$cli_pkg_version containerd.io" + else + pkgs="$pkgs docker-ce-cli containerd.io" + fi + fi + if version_gte "20.10"; then + pkgs="$pkgs docker-compose-plugin docker-ce-rootless-extras$pkg_version" + fi + if version_gte "23.0"; then + pkgs="$pkgs docker-buildx-plugin" + fi + if ! is_dry_run; then + set -x + fi + $sh_c "$pkg_manager install -y -q $pkgs" + ) + echo_docker_as_nonroot + exit 0 + ;; + sles) + if [ "$(uname -m)" != "s390x" ]; then + echo "Packages for SLES are currently only available for s390x" + exit 1 + fi + if [ "$dist_version" = "15.3" ]; then + sles_version="SLE_15_SP3" + else + sles_version="SLE_15_SP2" + fi + opensuse_repo="https://download.opensuse.org/repositories/security:SELinux/$sles_version/security:SELinux.repo" + repo_file_url="$DOWNLOAD_URL/linux/$lsb_dist/$REPO_FILE" + pre_reqs="ca-certificates curl libseccomp2 awk" + ( + if ! is_dry_run; then + set -x + fi + $sh_c "zypper install -y $pre_reqs" + $sh_c "zypper addrepo $repo_file_url" + if ! is_dry_run; then + cat >&2 <<-'EOF' + WARNING!! + openSUSE repository (https://download.opensuse.org/repositories/security:SELinux) will be enabled now. + Do you wish to continue? + You may press Ctrl+C now to abort this script. + EOF + ( set -x; sleep 30 ) + fi + $sh_c "zypper addrepo $opensuse_repo" + $sh_c "zypper --gpg-auto-import-keys refresh" + $sh_c "zypper lr -d" + ) + pkg_version="" + if [ -n "$VERSION" ]; then + if is_dry_run; then + echo "# WARNING: VERSION pinning is not supported in DRY_RUN" + else + pkg_pattern="$(echo "$VERSION" | sed "s/-ce-/\\\\.ce.*/g" | sed "s/-/.*/g")" + search_command="zypper search -s --match-exact 'docker-ce' | grep '$pkg_pattern' | tail -1 | awk '{print \$6}'" + pkg_version="$($sh_c "$search_command")" + echo "INFO: Searching repository for VERSION '$VERSION'" + echo "INFO: $search_command" + if [ -z "$pkg_version" ]; then + echo + echo "ERROR: '$VERSION' not found amongst zypper list results" + echo + exit 1 + fi + search_command="zypper search -s --match-exact 'docker-ce-cli' | grep '$pkg_pattern' | tail -1 | awk '{print \$6}'" + # It's okay for cli_pkg_version to be blank, since older versions don't support a cli package + cli_pkg_version="$($sh_c "$search_command")" + pkg_version="-$pkg_version" + fi + fi + ( + pkgs="docker-ce$pkg_version" + if version_gte "18.09"; then + if [ -n "$cli_pkg_version" ]; then + # older versions didn't ship the cli and containerd as separate packages + pkgs="$pkgs docker-ce-cli-$cli_pkg_version containerd.io" + else + pkgs="$pkgs docker-ce-cli containerd.io" + fi + fi + if version_gte "20.10"; then + pkgs="$pkgs docker-compose-plugin docker-ce-rootless-extras$pkg_version" + fi + if version_gte "23.0"; then + pkgs="$pkgs docker-buildx-plugin" + fi + if ! is_dry_run; then + set -x + fi + $sh_c "zypper -q install -y $pkgs" + if ! command_exists iptables; then + $sh_c "$pkg_manager install -y -q iptables" + fi + start_docker + ) + echo_docker_as_nonroot + exit 0 + ;; + rancheros) + ( + set -x + $sh_c "sleep 3;ros engine list --update" + engine_version="$(sudo ros engine list | awk '{print $2}' | grep ${docker_version} | tail -n 1)" + if [ "$engine_version" != "" ]; then + $sh_c "ros engine switch -f $engine_version" + fi + ) + exit 0 + ;; + *) + if [ -z "$lsb_dist" ]; then + if is_darwin; then + echo + echo "ERROR: Unsupported operating system 'macOS'" + echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop" + echo + exit 1 + fi + fi + echo + echo "ERROR: Unsupported distribution '$lsb_dist'" + echo + exit 1 + ;; + esac + exit 1 +} + +# wrapped up in a function so that we have some protection against only getting +# half the file during "curl | sh" +do_install diff --git a/Docker/README.md b/Docker/README.md new file mode 100644 index 0000000..e798408 --- /dev/null +++ b/Docker/README.md @@ -0,0 +1,117 @@ +> 本文作者:丁辉 + +# Docker安装 + +## 目录详情 + +| 文件夹名 | 内容 | +| :--------: | :------------------------------------: | +| Docs | Docker文档目录 | +| Dockerfile | Dockerfile示例、文档目录 | +| Builder | 构建镜像示例、文档目录 | +| Compose | Docker-Compose文档目录 | +| Files | 存放各文档内部需要使用的脚本或配置文件 | +| 问题记录 | Docker学习过程中遇到的疑难杂症 | + +## 安装脚本使用 + +> | 支持系统 | 支持架构 | +> | :-------: | :--------: | +> | Centos7,8 | x86、arm64 | +> | Ubuntu* | x86、arm64 | + +### 在线安装 + +**极简模式** + +> 直接二进制安装最新版 Docker + +```bash +curl -sfL https://gitee.com/offends/Kubernetes/raw/main/Docker/install.sh | bash -s all_curl +``` + +**多功能模式** + +> 通过 clone 仓库文件进行安装 + +```bash +git clone https://gitee.com/offends/Kubernetes.git && cd Kubernetes/Docker +``` + +- 控制安装方式 + + - 切换二进制安装[默认模式] + + ```bash + export INSTALL_TYPE=binary + ``` + + | 脚本参数 | 作用 | 用法 | + | :------: | :--------------------------------------: | :-----------------: | + | rke | 二进制安装 Rke1 官方支持 Docker 最新版本 | ./install.sh rke | + | latest | 二进制安装 Docker 官方最新版本 | ./install.sh latest | + + - 切换官方脚本安装 + + ```bash + export INSTALL_TYPE=official + ``` + + | 脚本参数 | 作用 | 用法 | + | :------: | :---------------------: | :------------------: | + | default | 官方默认安装脚本 | ./install.sh default | + | aliyun | 官方默认安装脚本-阿里源 | ./install.sh aliyun | + + - 调试模式 + + > 本状态使用于对 Docker 做特殊更改或卸载情谨慎使用 + + ```bash + export INSTALL_TYPE=privilege + ``` + + | 脚本参数 | 作用 | 用法 | + | :-------: | :----------------------------------------: | :--------------------: | + | stop | 强制停止 Docker,并清理残留进程 | ./install.sh stop | + | uninstall | 强制卸载 Docker[正常情况下会保留存储文件] | ./install.sh uninstall | + | clean | 清理 Docker 持久化残留文件,请谨慎使用 | ./install.sh clean | + | update | 更新 Docker 版本[只支持二进制部署环境更新] | ./install.sh update | + + +### 离线安装 + +> 通过 offline_packager.sh 脚本打包离线文件 +> +> 可以通过传入 DOCKER_VERSION 变量指定 Docker 版本(默认版本为: 24.0.7) + +- 指定版本 + + ```bash + export DOCKER_VERSION="24.0.7" + ``` + + > 清除变量 + > + > ```bash + > unset DOCKER_VERSION + > ``` + +- 开始打包 + + ```bash + ./offline_packager.sh amd64 + ``` + +- 使用 + + ```bash + tar -zxvf docker-offline.tar.gz && ./install.sh + ``` + +**参数** + +| 参数 | 使用方法 | +| :---: | :-------------------------: | +| amd64 | ./offline_packager.sh amd64 | +| arm64 | ./offline_packager.sh arm64 | + diff --git a/Docker/install.sh b/Docker/install.sh new file mode 100644 index 0000000..170a1aa --- /dev/null +++ b/Docker/install.sh @@ -0,0 +1,520 @@ +#!/bin/bash + +############################################################################################# +# 用途: 多功能部署 Docker 脚本 +# 作者: 丁辉 +# 编写时间: 2023-12-07 +# 更新时间: 2024-06-06 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +# 开启检测 +# set -e -o pipefail +set -e + +# 变量定义 +# 脚本版本 +SCRIPT_VERSION="1.0.7" +# Docker 二进制部署使用官方下载地址 +INSTALL_DOCKER_PACKAGE="https://download.docker.com/linux/static/stable" +# Rke支持Docker大版本 +RKE_SUPPORT_VERSION="20.10.24" +# 控制在线或离线安装变量(默认为在线安装)[使用offline_packager.sh打包离线包后会自动变为离线安装] +NETWORK_STATE="online" +# 控制二进制安装还是网络源安装(默认为二进制安装) +INSTALL_TYPE=${INSTALL_TYPE:-binary} +# 官方脚本安装 +# INSTALL_TYPE=${INSTALL_TYPE:-official} +# 调试模式为: privilege,请谨慎使用 +# INSTALL_TYPE=${INSTALL_TYPE:-privilege} + +# --help 帮助信息 +function HELP_BINARY(){ + echo "Usage: script_name [OPTIONS] [ARGUMENTS]" + echo "" + echo "Description:" + echo " Offends" + echo "" + echo "Options:" + echo " -h, --help 显示此帮助信息" + echo " -v, --version 显示当前脚本版本号" + echo " rke 二进制安装 Rke1 官方支持 Docker 最新版本" + echo " latest 二进制安装 Docker 官方最新版本" + echo " all_curl 二进制安装 Docker 官方最新版本,省心网络安装,所有文件都会从网络 curl 下载" + echo "" + echo " export INSTALL_TYPE=official 切换使用官方脚本安装 Docker" + echo " export INSTALL_TYPE=privilege 切换使用特权模式,详细功能请查看: https://gitee.com/offends/Kubernetes/blob/main/Docker/README.md" + echo "" + echo "Examples:" + echo " 示例 1: ./install.sh rke" + echo " 示例 2: ./install.sh latest" + exit 0 +} + +function HELP_OFFICIAL(){ + echo "Usage: script_name [OPTIONS] [ARGUMENTS]" + echo "" + echo "Description:" + echo " Offends" + echo "" + echo "Options:" + echo " -h, --help 显示此帮助信息" + echo " -v, --version 显示当前脚本版本号" + echo " default 官方默认安装脚本" + echo " aliyun 官方默认安装脚本-阿里源" + echo "" + echo " export INSTALL_TYPE=binary 切换使用二进制脚本安装 Docker" + echo " export INSTALL_TYPE=privilege 切换使用特权模式,详细功能请查看: https://gitee.com/offends/Kubernetes/blob/main/Docker/README.md" + echo "" + echo "Examples:" + echo " 示例 1: ./install.sh default" + echo " 示例 2: ./install.sh aliyun" + exit 0 +} + +function HELP_PRIVILEGE(){ + echo "Usage: script_name [OPTIONS] [ARGUMENTS]" + echo "" + echo "Description:" + echo " Offends" + echo "" + echo "Options:" + echo " -h, --help 显示此帮助信息" + echo " -v, --version 显示当前脚本版本号" + echo " stop 强制停止 Docker,并清理残留进程" + echo " uninstall 强制卸载 Docker [正常情况下会保留存储文件]" + echo " clean 清理 Docker 持久化残留文件,请谨慎使用" + echo " update 更新 Docker 版本 [只支持二进制部署环境更新]" + echo "" + echo " export INSTALL_TYPE=binary 切换使用二进制脚本安装 Docker" + echo " export INSTALL_TYPE=official 切换使用官方脚本安装 Docker" + echo "" + echo "Examples:" + echo " 示例 1: ./install.sh stop" + echo " 示例 2: ./install.sh uninstall" + echo " 示例 3: ./install.sh clean" + echo " 示例 4: ./install.sh update" + exit 0 +} + +# 判断在线安装还是离线安装 +function CHECK_NETWORK_STATE() { + if [ ${NETWORK_STATE} = "online" ]; then + INSTALL_ONLINE $@ + elif [ ${NETWORK_STATE} = "offline" ]; then + INSTALL_OFFLINE + fi +} + +# 在线安装 +function INSTALL_ONLINE(){ + if [ ${INSTALL_TYPE} = "binary" ]; then + if [ $# -eq 1 ]; then + while true; do + case $1 in + rke) + SEND_INFO "您选择的安装方式为: RKE最高支持版本安装" + INSTALL_BINARY_RKE + break + ;; + latest) + SEND_INFO "您选择的安装方式为: Docker最新版本安装" + INSTALL_BINARY_LATEST + break + ;; + all_curl) + SEND_INFO "您选择的安装方式为: 省心网络安装" + INSTALL_BINARY_ALL_CURL + break + ;; + --help|-h) + HELP_BINARY + ;; + --version|-v) + SEND_INFO "当前脚本版本号为: $SCRIPT_VERSION" + break + ;; + *) + SEND_ERROR "参数错误" + HELP_BINARY + ;; + esac + done + else + SEND_ERROR "参数错误" + HELP_BINARY + fi + + elif [ ${INSTALL_TYPE} = "official" ]; then + if [ $# -eq 1 ]; then + while true; do + case $1 in + default) + SEND_INFO "您选择的安装方式为: 官方默认安装脚本" + INSTALL_OFFICIAL_DEFAULT + break + ;; + aliyun) + SEND_INFO "您选择的安装方式为: 官方默认安装脚本-阿里源" + INSTALL_OFFICIAL_ALIYUN + break + ;; + --help|-h) + HELP_OFFICIAL + ;; + --version|-v) + SEND_INFO "当前脚本版本号为: $SCRIPT_VERSION" + break + ;; + *) + SEND_ERROR "参数错误" + HELP_OFFICIAL + ;; + esac + done + else + SEND_ERROR "参数错误" + HELP_OFFICIAL + fi + fi +} + +# 特权模式 +function PRIVILEGE(){ + if [ $# -eq 1 ]; then + while true; do + case $1 in + stop) + SEND_INFO "您选择的模式为: 强制停止 Docker,并清理残留进程" + STOP_DOCKER + break + ;; + uninstall) + SEND_INFO "您选择的模式为: 强制卸载 Docker" + UNINSTALL_DOCKER + break + ;; + clean) + SEND_INFO "您选择的模式为: 清理 Docker 持久化残留文件,请谨慎使用" + CLEAN_DOCKER + break + ;; + update) + SEND_INFO "您选择的模式为: 更新 Docker 版本" + UPDATE_DOCKER + break + ;; + --help|-h) + HELP_PRIVILEGE + ;; + --version|-v) + SEND_INFO "当前脚本版本号为: $SCRIPT_VERSION" + break + ;; + *) + SEND_ERROR "参数错误" + HELP_PRIVILEGE + ;; + esac + done + else + SEND_ERROR "参数错误" + HELP_PRIVILEGE + fi +} + +# 停止 Docker,并清理残留进程 +function STOP_DOCKER(){ + # 停止 docker + SEND_WARN "正在停止 Docker 服务..." + NULL_TRUE systemctl stop docker + NULL_TRUE systemctl stop docker.socket + # 判断是否存在 docker 进程,存在则清理 + if ps -ef | grep docker | grep -v grep >/dev/null 2>&1; then + SEND_INFO "正在清理 Docker 进程..." + ps -ef | grep docker | grep -v grep | grep -v Install-docker.sh | awk '{print $2}' | xargs kill -9 > /dev/null 2>&1 || true + fi + SEND_INFO "Docker 服务已停止,进程已清理完毕" +} + +# 更新 Docker 版本 +function UPDATE_DOCKER(){ + if ! command -v docker >/dev/null 2>&1; then + SEND_ERROR "Docker 服务未安装,请先安装 Docker 服务" + exit 1 + fi + while true; do + read -p "在线更新[1默认]/本地文件更新[2](仅支持二进制环境): " userInput + case $userInput in + "1"|"") + SEND_INFO "您选择的更新方式为: 在线更新" + STOP_DOCKER + CHECK_CPU + read -p "输入所需更新的版本[示例: 24.0.7]: " version + SEND_INFO "正在获取 Docker 版本: $version" + URL="$INSTALL_DOCKER_PACKAGE/$ARCH_TYPE_1/docker-$version.tgz" + if ! wget $URL > /dev/null 2>&1; then + SEND_ERROR "获取版本失败,请检查 Docker 版本: $version 是否真实存在或检查本地网络情况" + exit 1 + fi + UPDATE_DOCKER_FILE + break + ;; + "2") + SEND_INFO "您选择的更新方式为: 本地文件更新" + STOP_DOCKER + read -p "输入 Docker 本地安装文件绝对路径[示例: /root/docker-24.0.7.tgz]: " pwd + CHECK_FILE $pwd + NULL_TRUE cp $pwd . + SEND_INFO "更新完成" + UPDATE_DOCKER_FILE + break + ;; + *) + SEND_ERROR "输入错误,请重新输入" + ;; + esac + done +} + +# 更新替换 Docker 二进制文件 +function UPDATE_DOCKER_FILE(){ + CHECK_COMMAND_NULL tar -zxvf docker-*.tgz + CHECK_COMMAND_NULL \\cp ./docker/* /usr/local/bin/ + NULL_TRUE rm -rf docker docker-*.tgz + NULL_TRUE systemctl start docker + DOCKER_VERSION_ENV +} + +# 强制卸载 Docker +function UNINSTALL_DOCKER(){ + STOP_DOCKER + SEND_INFO "正在清理 Docker 用户,请稍等" + NULL_TRUE userdel -r docker + NULL_TRUE groupdel docker + SEND_INFO "正在清理 Docker 环境,请稍等" + # 清理网络源安装文件 + if command -v yum >/dev/null 2>&1; then + # yum 卸载方法 + yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y > /dev/null 2>&1 || true + elif command -v apt >/dev/null 2>&1; then + # apt 卸载方法 + apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y > /dev/null 2>&1 || true + else + SEND_ERROR "无法识别的系统软件包管理工具" + exit 1 + fi + + # 清理二进制安装文件 + dfile=( + containerd + containerd-shim + containerd-shim-runc-v2 + ctr + docker + dockerd + docker-init + docker-proxy + runc + ) + # 指定文件列表,使用 command -v 查找并删除 + for i in "${dfile[@]}"; do + rm -rf $(command -v $i) > /dev/null 2>&1 || true + done + SEND_INFO "Docker 环境清理完毕" +} + +# 清理 Docker 持久化残留文件,请谨慎使用 +function CLEAN_DOCKER(){ + # 给用户一个输入框,判断用户输入的是否为大写 YES 或 NO + validInput=false + read -p "这是一个危险操作,你真的需要这么做吗? YES/NO: " userInput + while [ "$validInput" = false ]; do + case $userInput in + YES) + if ! command -v docker >/dev/null 2>&1; then + SEND_INFO "正在彻底清理环境..." + + NULL_TRUE rm -rf /var/lib/docker + NULL_TRUE rm -rf /var/lib/containerd + NULL_TRUE rm -rf /etc/docker + # 查找 docker.service 文件位置并删除 + # find / -name "docker.service" | xargs rm -rf > /dev/null 2>&1 || true + rm -rf $(systemctl cat docker | head -n 1 | sed 's/^#//') || true + NULL_TRUE rm -rf /etc/sysctl.d/offends.conf + + SEND_INFO "环境清理完毕" + else + SEND_INFO "请先卸载 Docker 服务,再执行此操作" + fi + validInput=true + ;; + NO) + SEND_WARN "退出脚本。" + validInput=true + ;; + *) + read -p "输入不是大写的 YES 或 NO,请重新输入: " userInput + ;; + esac + done +} + +# 官方默认安装脚本 +function INSTALL_OFFICIAL_DEFAULT(){ + FUNC_PRINT_SYSTEM_INFO + SEND_INFO "开始安装 Docker 服务" + curl -fsSL https://get.docker.com | bash + INIT_DOCKER_FILE_ME +} + +# 官方默认安装脚本-阿里源 +function INSTALL_OFFICIAL_ALIYUN(){ + FUNC_PRINT_SYSTEM_INFO + SEND_INFO "开始安装 Docker 服务" + curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun + INIT_DOCKER_FILE_ME +} + +# 二进制安装 Rke1 官方支持 Docker 最新版本 +function INSTALL_BINARY_RKE(){ + CHECK_CPU + FUNC_PRINT_SYSTEM_INFO + + #下载rke支持范围内的版本包 + SEND_INFO "正在获取当前Rke支持最新Docker版本文件" + URL="$INSTALL_DOCKER_PACKAGE/$ARCH_TYPE_1/docker-$RKE_SUPPORT_VERSION.tgz" + INSTALL_BINARY_ALL +} + +function INSTALL_BINARY_ALL_CURL(){ + CHECK_CPU + FUNC_PRINT_SYSTEM_INFO + + #下载最新版本包 + DOCKER_URL="$INSTALL_DOCKER_PACKAGE/$ARCH_TYPE_1/" + SEND_INFO "正在获取最新Docker版本文件" + version=$(curl -fsS $DOCKER_URL | awk -F 'href="' '{print $2}' | awk -F '"' '{print $1}' \ + | grep -v rootless-extras | grep -oP 'docker-\K[0-9]+\.[0-9]+\.[0-9]+' \ + | sort -t. -k1,1n -k2,2n -k3,3n | tail -n 1) + + URL="$INSTALL_DOCKER_PACKAGE/$ARCH_TYPE_1/docker-${version}.tgz" + + curl -O $URL + #解压问价并安装后清理文件残余 + CHECK_COMMAND_NULL tar -zxvf docker-*.tgz + SEND_INFO "正在配置 Docker 环境[获取网络资源中,请稍等...]" + CHECK_COMMAND_NULL \\cp ./docker/* /usr/local/bin/ + curl -so /usr/lib/systemd/system/docker.service https://gitee.com/offends/Kubernetes/raw/main/Docker/Files/docker.service + NULL_TRUE rm -rf docker docker-*.tgz + CHECK_DIR /etc/docker/ + curl -so /etc/docker/daemon.json https://gitee.com/offends/Kubernetes/raw/main/Docker/Files/daemon.json + curl -so /etc/sysctl.d/offends.conf https://gitee.com/offends/Kubernetes/raw/main/Docker/Files/offends.conf + NULL_TRUE_ECHO sysctl -p /etc/sysctl.d/offends.conf + SEND_INFO "正在安装 Docker" + INIT_DOCKER +} + +# 二进制安装 Docker 官方最新版本 +function INSTALL_BINARY_LATEST(){ + CHECK_CPU + FUNC_PRINT_SYSTEM_INFO + + #下载最新版本包 + DOCKER_URL="$INSTALL_DOCKER_PACKAGE/$ARCH_TYPE_1/" + SEND_INFO "正在获取最新Docker版本文件" + version=$(curl -fsS $DOCKER_URL | awk -F 'href="' '{print $2}' | awk -F '"' '{print $1}' \ + | grep -v rootless-extras | grep -oP 'docker-\K[0-9]+\.[0-9]+\.[0-9]+' \ + | sort -t. -k1,1n -k2,2n -k3,3n | tail -n 1) + + URL="$INSTALL_DOCKER_PACKAGE/$ARCH_TYPE_1/docker-${version}.tgz" + INSTALL_BINARY_ALL +} +# 开始安装安装 +function INSTALL_BINARY_ALL(){ + curl -O $URL + #解压问价并安装后清理文件残余 + INIT_DOCKER_FILE +} + +# 离线安装 +function INSTALL_OFFLINE() { + FUNC_PRINT_SYSTEM_INFO + SEND_INFO "离线安装" + CHECK_FILE docker-*.tgz + SEND_INFO "正在解压离线包" + INIT_DOCKER_FILE +} + +# 初始化 Docker 文件 +function INIT_DOCKER_FILE() { + CHECK_COMMAND_NULL tar -zxvf docker-*.tgz + SEND_INFO "正在配置 Docker 环境" + CHECK_COMMAND_NULL \\cp ./docker/* /usr/local/bin/ + CHECK_COMMAND_NULL \\cp ./Files/docker.service /usr/lib/systemd/system/docker.service + NULL_TRUE rm -rf docker docker-*.tgz + INIT_DOCKER_FILE_ME +} + +function INIT_DOCKER_FILE_ME(){ + CHECK_DIR /etc/docker/ + CHECK_COMMAND_NULL \\cp ./Files/daemon.json /etc/docker/daemon.json + CHECK_COMMAND_NULL \\cp ./Files/offends.conf /etc/sysctl.d/offends.conf + NULL_TRUE_ECHO sysctl -p /etc/sysctl.d/offends.conf + SEND_INFO "正在安装 Docker" + INIT_DOCKER +} + +function DOCKER_VERSION_ENV(){ + #启动 docker + DOCKER_VERSION=$(docker --version | grep -oP 'Docker version \K[0-9.]+') + SEND_INFO "正在启动,当前 Docker 版本为: $DOCKER_VERSION" +} + +# 初始化 Docker 环境 +function INIT_DOCKER() { + #永久关闭防火墙 + SEND_INFO "正在检查防火墙配置" + NULL_TRUE systemctl stop firewalld + NULL_TRUE systemctl disable firewalld + NULL_TRUE iptables -F + + #创建 Dokcer 用户,加入Docker组 + SEND_INFO "正在检测 Docker 用户" + ADD_USER_GROUP docker docker + + DOCKER_VERSION_ENV + NULL_TRUE systemctl daemon-reload + NULL_TRUE systemctl enable --now docker +} + +# 检测某个systemd服务是否存在 +function CHECK_SYSTEMD(){ + if ! command -v docker >/dev/null 2>&1; then + CHECK_NETWORK_STATE $@ + else + SEND_INFO "Docker 服务已安装,版本为: $(docker --version | grep -oP 'Docker version \K[0-9.]+')" + if ! systemctl status docker >/dev/null 2>&1; then + SEND_WARN "Docker 服务未启动,正在启动 Docker 服务" + if ! systemctl start docker >/dev/null 2>&1; then + SEND_ERROR "Docker 服务启动失败,请检查日志排查错误" + exit 1 + else + SEND_INFO "Docker 服务启动成功" + fi + fi + fi +} + +# 执行全部函数 +function EXECUTE_ALL_FUNCTION() { + if [ ${INSTALL_TYPE} = "privilege" ]; then + PRIVILEGE $@ + else + CHECK_SYSTEMD $@ + fi +} + +EXECUTE_ALL_FUNCTION $@ \ No newline at end of file diff --git a/Docker/offline_packager.sh b/Docker/offline_packager.sh new file mode 100644 index 0000000..a1e4c93 --- /dev/null +++ b/Docker/offline_packager.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +############################################################################################# +# 用途: 打包离线 Docker 安装包 +# 作者: 丁辉 +# 编写时间: 2023-12-08 +############################################################################################# + +# 加载检测脚本 +source <(curl -sS https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh) + +# 二进制文件下载地址: https://download.docker.com/linux/static/stable/ +DOCKER_VERSION=${DOCKER_VERSION:-"24.0.7"} + +# 根据脚本传进来的参数,执行脚本 +function INTRODUCTION_ARGUMENT() { + case $1 in + arm64) + ARCH_TYPE="aarch64" + ;; + amd64) + ARCH_TYPE="x86_64" + ;; + -v | --version) + echo "v1.0.0" + ;; + --help | -h) + echo "Usage: script_name [OPTIONS] [ARGUMENTS]" + echo "" + echo "Description:" + echo " Offends" + echo "" + echo "Options:" + echo " -h, --help 显示此帮助信息" + echo " -v, --version 显示当前脚本版本号" + echo " amd64 打包 amd64 离线二进制文件" + echo " arm64 打包 arm64 离线二进制文件" + echo "Examples:" + echo " 示例 1: ./offline_packager.sh amd64" + echo " 示例 2: ./offline_packager.sh arm64" + exit 0 + ;; + *) + SEND_WARN "无效参数, 请使用 --help,-h 查看" + exit 0 + ;; + esac + URL="https://download.docker.com/linux/static/stable/$ARCH_TYPE/docker-$DOCKER_VERSION.tgz" + DOWNLOAD_BINARY_FILE +} + +# 下载二进制文件 +function DOWNLOAD_BINARY_FILE() { + SEND_INFO "正在下载二进制文件" + CHECK_INSTALL wget + CHECK_COMMAN""D_NULL wget $URL + DIR="./Files" + FILES_NAME=( + "$DIR/daemon.json" + "$DIR/docker.service" + "$DIR/offends.conf" + ) + FILES=${FILES_NAME[*]} + sed -i.bak 's/source <(curl -sS https:\/\/gitee.com\/offends\/Linux\/raw\/main\/File\/Shell\/Check_command.sh)/source .\/Check_command.sh/g' install.sh + sed -i 's/NETWORK_STATE="online"/NETWORK_STATE="offline"/' install.sh + CHECK_COMMAND_NULL curl -sO https://gitee.com/offends/Linux/raw/main/File/Shell/Check_command.sh + CHECK_COMMAND_NULL chmod +777 Check_command.sh + CHECK_COMMAND_NULL tar -zcvf docker-offline.tar.gz docker-$DOCKER_VERSION.tgz $FILES install.sh Check_command.sh + CHECK_COMMAND_NULL rm -rf docker-$DOCKER_VERSION.tgz rm -rf install.sh + CHECK_COMMAND_NULL mv install.sh.bak install.sh + SEND_INFO "打包完成" + +} +# 执行全部函数 +function ALL() { + INTRODUCTION_ARGUMENT $@ +} + +ALL $@ \ No newline at end of file diff --git a/Docker/问题记录/Docker问题汇总.md b/Docker/问题记录/Docker问题汇总.md new file mode 100644 index 0000000..7100f27 --- /dev/null +++ b/Docker/问题记录/Docker问题汇总.md @@ -0,0 +1,47 @@ +> 本文作者:丁辉 + +# Docker启动Cgroup报错 + +> 报错:dockerd: failed to start daemon: Devices cgroup isn‘t mounted +> +> 问题分析:此问题很可能是 Cgroup 没有挂载导致的,因为 Cgroup 没有挂载,所以无法工作 + +- 我们使用脚本进行处理 + + 执行 + + ```bash + curl -sfL https://gitee.com/offends/Kubernetes/raw/main/File/Shell/cgroup.sh | bash + ``` + + +# Docker重启卡死 + +> Docker重启时会出现卡死的现象,导致虽 systemd 重启执行成功但 docker 未运行 +> +> 问题分析:根据资料显示,在 docker 19版本重启或关闭 docker 时常出现 `containerd-shim` 残留导致此问题 +> +> 解决方法:可临时清理 `containerd-shim` 进程。这种解决方法并不完美,最好的方式是升级 Docker 版本从根源解决问提。 + +- 停止 Docker + + ```bash + systemctl stop docker + ``` + +- 杀掉docker进程 + + ```bash + ps -ef | grep containerd-shim | awk '{print $2}' | xargs kill -9 + ``` + +# 无法删除 Docker 存储目录 + +> 删除失败原因是因为 Docker 存储目录正在被挂载使用 + +卸载全部挂载 + +```bash +mount | grep nfs | awk '{print $1}' | xargs umount -l +``` + diff --git a/GPU/Kubernetes-NVIDIA之阿里云插件Gpushare-Device-Plugin.md b/GPU/Kubernetes-NVIDIA之阿里云插件Gpushare-Device-Plugin.md new file mode 100644 index 0000000..21ae276 --- /dev/null +++ b/GPU/Kubernetes-NVIDIA之阿里云插件Gpushare-Device-Plugin.md @@ -0,0 +1,122 @@ +> 本文作者:丁辉 + +# Kubernetes-NVIDIA之阿里云插件Gpushare-Device-Plugin + +[Github-gpushare-scheduler-extender](https://github.com/AliyunContainerService/gpushare-scheduler-extender/tree/master) + +[Github-gpushare-device-plugin](https://github.com/AliyunContainerService/gpushare-device-plugin) + +## 部署 + +1. 拉取 Gpushare-Scheduler-Extender 代码文件 + + ```bash + git clone https://github.com/AliyunContainerService/gpushare-scheduler-extender.git + cd gpushare-scheduler-extender/config/ && vi gpushare-schd-extender.yaml + ``` + + > 因为源文件的调度规则是指运行在 master 节点上,如果像我一样集群内并没有这个标签的话则需要修改 `gpushare-schd-extender.yaml` YAML文件将下面这段 nodeSelector 删除掉或注释。 + > + > ```bash + > #nodeSelector: + > #node-role.kubernetes.io/master: "" + > ``` + +2. 部署扩展器 + + ```bash + kubectl apply -f gpushare-schd-extender.yaml + ``` + +3. 编写调度器配置文件 + + ```bash + mv scheduler-policy-config.yaml /etc/kubernetes/scheduler-policy-config.yaml + vi /etc/kubernetes/scheduler-policy-config.yaml + ``` + + > 根据自己 Scheduler 配置文件位置修改 `kubeconfig` 字段参数 + > + +4. 添加 Scheduler 启动参数 + + - 新版 + + ```bash + - --config=/etc/kubernetes/scheduler-policy-config.yaml + ``` + + - 老版本集群 + + ```bash + - --policy-config-file: /etc/kubernetes/scheduler-policy-config.json + ``` + +5. 给 GPU 节点打上标签 + + ```bash + kubectl label node ${node} gpushare=true + ``` + +6. 拉取 Gpushare-Device-Plugin 代码文件 + + ```bash + git clone https://github.com/AliyunContainerService/gpushare-device-plugin.git + cd gpushare-device-plugin + ``` + +7. 部署 + + ```bash + kubectl apply -f device-plugin-rbac.yaml + kubectl apply -f device-plugin-ds.yaml + ``` + + > 根据自己需求判断是否修改 `device-plugin-ds.yaml` 文件内默认 GPU 资源申请单位, `MiB` 还是 `GiB` + > + > ```bash + > command: + > - gpushare-device-plugin-v2 + > - -logtostderr + > - --v=5 + > - --memory-unit=MiB + > ``` + +8. 安装 kubectl GPU 插件 + + [插件下载](https://github.com/AliyunContainerService/gpushare-device-plugin/releases/) + + ```bash + wget https://github.com/AliyunContainerService/gpushare-device-plugin/releases/download/v0.3.0/kubectl-inspect-gpushare + ``` + + ```bash + mkdir ~/.kube/plugins -p + mv kubectl-inspect-gpushare ~/.kube/plugins/ && chmod 777 ~/.kube/plugins/kubectl-inspect-gpushare + ``` + +9. 查看 GPU 使用情况 + + ```bash + kubectl inspect gpushare + ``` + +## 测试 + +1. 部署容器测试 + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/aliyun-gpu-pod.yaml + ``` + +2. 测试 + + ```bash + kubectl exec nginx-pod nvidia-smi + ``` + +3. 删除测试容器 + + ```bash + kubectl delete pod gpu-pod + ``` diff --git a/GPU/README.md b/GPU/README.md new file mode 100644 index 0000000..4095a61 --- /dev/null +++ b/GPU/README.md @@ -0,0 +1,10 @@ +> 本文作者:丁辉 + +# GPU的使用 + +> 相关文档地址 + +- [Linux下载并安装GPU驱动](https://gitee.com/offends/Linux/blob/main/Docs/Linux%E4%B8%8B%E8%BD%BD%E5%B9%B6%E5%AE%89%E8%A3%85GPU%E9%A9%B1%E5%8A%A8.md) +- [GPU容器化基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/Docker/Docs/Docker%E4%BD%BF%E7%94%A8GPU.md) +- [Helm部署NVIDIA-K8s-Device-Plugin插件](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2NVIDIA-K8s-Device-Plugin.md) +- [Kubernetes-NVIDIA之阿里云插件Gpushare-Device-Plugin](https://gitee.com/offends/Kubernetes/blob/main/GPU/Kubernetes-NVIDIA%E4%B9%8B%E9%98%BF%E9%87%8C%E4%BA%91%E6%8F%92%E4%BB%B6Gpushare-Device-Plugin.md) diff --git a/Helm/Helm安装.md b/Helm/Helm安装.md new file mode 100644 index 0000000..6425da4 --- /dev/null +++ b/Helm/Helm安装.md @@ -0,0 +1,26 @@ +> 本文作者:丁辉 + +# Helm部署 + +[官方文档](https://helm.sh/docs/intro/install/) + +## 官方脚本 + +```bash +curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash +``` + +## 国内源获取 + +> 考虑到文件在外网可能会拉取非常慢,所以选择国内源获取 + +```bash +curl https://gitee.com/offends/Kubernetes/raw/main/File/Shell/helm-install.sh | bash +``` + +## 卸载 Helm + +```bash +rm -rf $(which helm) +``` + diff --git a/Helm/Helm对接外部Ceph.md b/Helm/Helm对接外部Ceph.md new file mode 100644 index 0000000..3da1dd9 --- /dev/null +++ b/Helm/Helm对接外部Ceph.md @@ -0,0 +1,382 @@ +> 本文作者:丁辉 + +# Helm对接外部Ceph + +[Github仓库](https://github.com/ceph/ceph-csi) + +| 节点名称 | IP | +| :---------: | :----------: | +| ceph-node-1 | 192.168.1.10 | +| ceph-node-2 | 192.168.1.20 | +| ceph-node-3 | 192.168.1.30 | + +**添加仓库** + +```bash +helm repo add ceph-csi https://ceph.github.io/csi-charts +helm repo update +``` + +## 对接 CephFS 共享文件系统 + +### CephFS基础环境准备 + +请查看此篇文章 [Ceph创建文件系统](https://gitee.com/offends/Kubernetes/blob/main/%E5%AD%98%E5%82%A8/Ceph/Ceph%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.md) + +### 开始部署 + +[官方文档](https://docs.ceph.com/en/latest/rbd/rbd-kubernetes/#configure-ceph-csi-plugins) [官方参数解释](https://github.com/ceph/ceph-csi/tree/devel/charts/ceph-csi-cephfs) + +1. 配置 values.yaml 文件 + + ```bash + vi ceph-csi-cephfs-values.yaml + ``` + + 内容如下 + + ```yaml + csiConfig: + # 使用 ceph mon dump 命令查看clusterID + - clusterID: "619ac911-7e23-4e7e-9e15-7329291de385" + monitors: + - "192.168.1.10:6789" + - "192.168.1.20:6789" + - "192.168.1.30:6789" + + secret: + create: true + name: csi-cephfs-secret + adminID: admin + # 使用 ceph auth get client.admin 命令查看用户密钥 + adminKey: AQByaidmineVLRAATw9GO+iukAb6leMiJflm9A== + + storageClass: + create: true + name: csi-cephfs-sc + # 使用 ceph mon dump 命令查看clusterID + clusterID: 619ac911-7e23-4e7e-9e15-7329291de385 + fsName: cephfs + pool: "cephfs_data" + provisionerSecret: csi-cephfs-secret + provisionerSecretNamespace: "ceph-csi-cephfs" + controllerExpandSecret: csi-cephfs-secret + controllerExpandSecretNamespace: "ceph-csi-cephfs" + nodeStageSecret: csi-cephfs-secret + nodeStageSecretNamespace: "ceph-csi-cephfs" + reclaimPolicy: Delete + allowVolumeExpansion: true + mountOptions: + - discard + + cephconf: | + [global] + auth_cluster_required = cephx + auth_service_required = cephx + auth_client_required = cephx + fuse_set_user_groups = false + fuse_big_writes = true + + provisioner: + # 配置 ceph-csi-cephfs-provisioner 副本数 + replicaCount: 3 + + # 配置镜像加速 + provisioner: + image: + repository: registry.aliyuncs.com/google_containers/csi-provisioner + + # 当 extra-create-metadata 设置为 false 时,它指示存储插件在创建持久卷(PV)或持久卷声明(PVC)时不生成额外的元数据。这可以减少存储操作的复杂性和提升性能,特别是在不需要额外元数据的情况下。 + #extraArgs: + #- extra-create-metadata=false + + resizer: + image: + repository: registry.aliyuncs.com/google_containers/csi-resizer + + snapshotter: + image: + repository: registry.aliyuncs.com/google_containers/csi-snapshotter + + nodeplugin: + registrar: + image: + repository: registry.aliyuncs.com/google_containers/csi-node-driver-registrar + plugin: + image: + repository: quay.dockerproxy.com/cephcsi/cephcsi + ``` + +2. 安装 + + ```bash + helm install ceph-csi-cephfs ceph-csi/ceph-csi-cephfs \ + --namespace ceph-csi-cephfs --create-namespace \ + -f ceph-csi-cephfs-values.yaml + ``` + +3. 在 `cephfs` 文件系统中创建一个子卷组名为 `csi` + + ```bash + ceph fs subvolumegroup create cephfs csi + ``` + + 检查 + + ```bash + ceph fs subvolumegroup ls cephfs + ``` + +### 卸载 + +```bash +helm uninstall ceph-csi-cephfs -n ceph-csi-cephfs +``` + +### Cephfs 挂载测试 + +#### 部署测试容器 + +1. 创建 Pvc + + ```yaml + cat < 使用最新版 `ceph-csi-cephfs` 对接外部 CEPH 集群后无法使用报错 + +**环境信息** + +| Ceph部模式 | Ceph版本 | Kubernetes版本 | +| :--------: | :----------------------------------: | :------------: | +| Docker | ceph version 16.2.5 pacific (stable) | v1.23 | + +**报错如下** + +```bash +Warning FailedMount 3s kubelet MountVolume.MountDevice failed for volume "pvc-342d9156-70f0-42f8-b288-8521035f8fd4" : rpc error: code = Internal desc = an error (exit status 32) occurred while running mount args: [-t ceph 192.168.1.10:6789,192.168.1.20:6789,192.168.1.30:6789:/volumes/csi/csi-vol-d850ba82-4198-4862-b26a-52570bcb1320/1a202392-a8cc-4386-8fc7-a340d9389e66 /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-342d9156-70f0-42f8-b288-8521035f8fd4/globalmount -o name=admin,secretfile=/tmp/csi/keys/keyfile-99277731,mds_namespace=cephfs,discard,ms_mode=secure,_netdev] stderr: unable to get monitor info from DNS SRV with service name: ceph-mon +2024-05-02T08:12:18.622+0000 7f62cd3e3140 -1 failed for service _ceph-mon._tcp +mount error 22 = Invalid argument +``` + +**解决方案** + +> 降低 `ceph-csi-cephfs` Helm 版本到 3.8.1(经过多次测试得出来的结论) + +``` +helm install ceph-csi-cephfs ceph-csi/ceph-csi-cephfs \ + --namespace ceph-csi-cephfs --create-namespace \ + -f ceph-csi-cephfs-values.yaml \ + --version 3.8.1 +``` + +## 对接 RBD 块存储 + +### RBD基础环境准备 + +请查看此篇文章 [Ceph创建RBD块存储](https://gitee.com/offends/Kubernetes/blob/main/%E5%AD%98%E5%82%A8/Ceph/Ceph%E5%88%9B%E5%BB%BARBD%E5%9D%97%E5%AD%98%E5%82%A8.md) + +### 开始部署 + +1. 配置 values.yaml 文件 + + ```bash + vi ceph-csi-rbd-values.yaml + ``` + + 内容如下 + + ```yaml + csiConfig: + # 使用 ceph mon dump 命令查看clusterID + - clusterID: "619ac911-7e23-4e7e-9e15-7329291de385" + monitors: + - "192.168.1.10:6789" + - "192.168.1.20:6789" + - "192.168.1.30:6789" + + secret: + create: true + name: csi-rbd-secret + userID: kubernetes + # 使用 ceph auth get client.kubernetes 命令查看用户密钥 + userKey: AQByaidmineVLRAATw9GO+iukAb6leMiJflm9A== + encryptionPassphrase: kubernetes_pass + + storageClass: + create: true + name: csi-rbd-sc + # 使用 ceph mon dump 命令查看clusterID + clusterID: 619ac911-7e23-4e7e-9e15-7329291de385 + pool: "kubernetes" + imageFeatures: "layering" + provisionerSecret: csi-rbd-secret + provisionerSecretNamespace: "ceph-csi-rbd" + controllerExpandSecret: csi-rbd-secret + controllerExpandSecretNamespace: "ceph-csi-rbd" + nodeStageSecret: csi-rbd-secret + nodeStageSecretNamespace: "ceph-csi-rbd" + fstype: xfs + reclaimPolicy: Delete + allowVolumeExpansion: true + mountOptions: + - discard + + cephconf: | + [global] + auth_cluster_required = cephx + auth_service_required = cephx + auth_client_required = cephx + + provisioner: + # 配置 ceph-csi-cephfs-provisioner 副本数 + replicaCount: 3 + + # 配置镜像加速 + provisioner: + image: + repository: registry.aliyuncs.com/google_containers/csi-provisioner + attacher: + image: + repository: registry.aliyuncs.com/google_containers/csi-attacher + resizer: + image: + repository: registry.aliyuncs.com/google_containers/csi-resizer + snapshotter: + image: + repository: registry.aliyuncs.com/google_containers/csi-snapshotter + + nodeplugin: + registrar: + image: + repository: registry.aliyuncs.com/google_containers/csi-node-driver-registrar + plugin: + image: + repository: quay.dockerproxy.com/cephcsi/cephcsi + ``` + +2. 安装 + + ```bash + helm install ceph-csi-rbd ceph-csi/ceph-csi-rbd \ + --namespace ceph-csi-rbd --create-namespace \ + -f ceph-csi-rbd-values.yaml + ``` + +### 卸载 + +```bash +helm uninstall ceph-csi-rbd -n ceph-csi-rbd +``` + +### RBD 测试挂载 + +#### 部署测试容器 + +1. 创建 Pvc + + ```yaml + cat < 本文作者:丁辉 +> + +# Helm对接外部NFS存储 + +> **NFS subdir 外部配置程序**是一个自动配置程序,它使用现有且已配置的NFS 服务器来支持通过持久卷声明动态配置 Kubernetes 持久卷。 + +## 部署 + +[Github仓库](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/tree/master) + +[官网介绍](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/blob/master/charts/nfs-subdir-external-provisioner/README.md) + +1. 添加仓库 + + ```bash + helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ + helm repo update + ``` + +2. 安装 + + ```bash + helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ + --set nfs.server=127.0.0.1 \ + --set nfs.path=/data + ``` + + > 国内无法拉取到此镜像 x86 架构的我已经同步到国内了,使用此命令安装 + > + > ```bash + > helm install nfs-subdir-external-provisioner \ + > nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ + > --set image.repository=registry.cn-hangzhou.aliyuncs.com/offends/nfs-subdir-external-provisioner \ + > --set image.tag=v4.0.2 \ + > --set nfs.server=127.0.0.1 \ + > --set nfs.path=/data + > ``` + +3. 查看 + + ```bash + kubectl get pod -l app=nfs-subdir-external-provisioner + ``` + +4. 检查 storageclass + + ```bash + kubectl get sc + ``` + + > 存在 nfs-client 则👌 + +## 配置 nfs-client 为默认存储类 + +```bash +kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' +``` + +> 取消 nfs-client 为默认存储类 +> +> ```bash +> kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}' +> ``` + +## 指定 NFS vers 版本 + +> 遇到一个非常难解的问题,在 centos7.9 系统版本中容器挂载使用 NFS 存储当作持久化卷,数据库这一种类型的容器无法启动,修改 vers 版本为3.0解决问题 + +**解决方案** + +- 第一种修改 values.yaml 配置文件 + + ```bash + vi nfs-subdir-external-provisioner/values.yaml + ``` + + 内容如下 + + ```bash + nfs: + server: + path: /data + mountOptions: + - nfsvers=3.0 + ``` + +- 第二种添加 install 参数 + +```bash +--set nfs.mountOptions[0]=nfsvers=3.0 +``` + +## 老版本部署(已废弃) + +[Github仓库](https://github.com/kubernetes-retired/external-storage/tree/master/nfs-client) + +1. 拉取代码 + + ```bash + helm repo add stable https://charts.helm.sh/stable + helm repo update + ``` + +2. 部署 + + ```bash + helm install nfs-storageclass stable/nfs-client-provisioner --set nfs.server=127.0.0.1 --set nfs.path=/data + ``` + +3. 修改 apiserver 参数 + + ```bash + vi /etc/kubernetes/manifests/kube-apiserver.yaml + ``` + + 添加如下参数 + + ```bash + - --feature-gates=RemoveSelfLink=false + ``` + + +## 卸载 + +```bash +helm uninstall nfs-subdir-external-provisioner +``` + diff --git a/Helm/Helm常用命令及参数.md b/Helm/Helm常用命令及参数.md new file mode 100644 index 0000000..c633791 --- /dev/null +++ b/Helm/Helm常用命令及参数.md @@ -0,0 +1,75 @@ +> 本文作者:丁辉 + +# Helm常用命令及参数 + +- **添加仓库**: + + ```bash + repo add ${repo_name} ${repository_url} + ``` + +- **更新仓库**: + + ```bash + repo update + ``` + +- **在 Helm 仓库中搜索 chart (Helm 软件包)** + + ```bash + helm search repo ${repo_name} + ``` + + 搜索包括开发版本(development versions) + + ```bash + helm search repo ${repo_name} --devel + ``` + +- **拉取仓库文件(默认为压缩包)**: + + ```bash + helm pull ${repo_name}/${chart_name} + ``` + + 拉取仓库文件(源文件) + + ```bash + helm pull ${repo_name}/${chart_name} --untar + ``` + +- **安装(本地目录)**: + + ```bash + helm install ${release_name} ./${local_chart_dir} + ``` + +- **安装(指定网络源)**: + + ```bash + helm install ${release_name} ${repo_name}/${chart_name} + ``` + +- **更新**: + + ```bash + helm upgrade ${release_name} ${repo_name}/${chart_name} + ``` + +- **卸载**: + + ```bash + helm uninstall ${release_name} + ``` + +# 其他参数 + +- `--create-namespace` **用于在安装时创建指定的命名空间(如果尚不存在)** + + ```bash + helm install ${release_name} ${repo_name}/${chart_name} \ + --namespace ${namespace_name} \ + --create-namespace + ``` + + \ No newline at end of file diff --git a/Helm/Helm部署Cert-Manager.md b/Helm/Helm部署Cert-Manager.md new file mode 100644 index 0000000..8c4aeb6 --- /dev/null +++ b/Helm/Helm部署Cert-Manager.md @@ -0,0 +1,224 @@ +> 本文作者:丁辉 + +# Helm部署Cert-Manager + +[Github仓库](https://github.com/cert-manager/cert-manager/tree/master) [Helm仓库](https://artifacthub.io/packages/helm/cert-manager/cert-manager) [官网文档](https://cert-manager.io/docs/installation/helm/) + +## 介绍 + +**cert-manager是一个在Kubernetes环境中用于管理SSL证书的开源工具**。随着互联网安全意识的提升,HTTPS协议的使用变得越来越广泛,这就需要为网站配置安全的SSL证书。传统的证书管理方式需要人工参与,且当证书数量众多时,管理工作将变得异常繁琐。cert-manager的出现极大地简化了这一过程,尤其是在自动化和简化证书获取、续期方面表现出色。 + +## 开始部署 + +1. 添加 Helm 仓库 + + ```bash + helm repo add jetstack https://charts.jetstack.io + helm repo update + ``` + +2. 编辑 values.yaml + + ```bash + vi cert-manager-values.yaml + ``` + + 内容如下 + + ```yaml + crds: + enabled: true + + # 开启监控 + prometheus: + enabled: true + servicemonitor: + enabled: true + ``` + +3. 部署 + + ```bash + helm install \ + cert-manager jetstack/cert-manager \ + --namespace cert-manager \ + --create-namespace \ + -f cert-manager-values.yaml + ``` + +4. 验证 + + **安装 GO 工具** + + - Centos + + ```bash + yum -y install go + ``` + + - Ubuntu + + ```bash + apt -y install golang + ``` + + **安装 Cmctl** + + ```bash + OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o cmctl https://github.com/cert-manager/cmctl/releases/latest/download/cmctl_${OS}_${ARCH} + chmod +x cmctl + sudo mv cmctl /usr/local/bin + ``` + + **执行命令验证安装** + + ```bash + cmctl check api + ``` + + > 正常返回为:`The cert-manager API is ready` + +## 卸载 + +1. 卸载 cert-manager + + ```bash + helm uninstall cert-manager -n cert-manager + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns cert-manager + ``` + +3. 删除资源 + + ```bash + kubectl delete apiservice v1beta1.webhook.cert-manager.io + ``` + +# 使用方法(HTTP01) + +> Cert-Manager 搭配 Let's Encrypt 实现证书自动签发 + +[官方文档](https://cert-manager.io/docs/tutorials/acme/nginx-ingress/#step-6---configure-a-lets-encrypt-issuer) + +[Let's Encrypt](https://letsencrypt.org/zh-cn/getting-started/) + +## 介绍 + +在 `cert-manager` 中,`Issuer` 和 `ClusterIssuer` 是用来配置和管理证书颁发的 Kubernetes 资源。这两种资源类型都用于定义如何颁发证书,但它们的作用域和使用场景有所不同: + +**Issuer** + +- **作用域**:`Issuer` 的作用域限定在单个 Kubernetes 命名空间内。这意味着 `Issuer` 只能为在同一命名空间内的证书资源管理和颁发证书。 +- **用途**:当你需要在特定命名空间内独立管理证书颁发策略时使用。例如,不同的团队或项目可能在各自的命名空间内使用不同的 `Issuer` 来满足特定的安全或配置需求。 +- **配置**:`Issuer` 可以配置多种类型的证书颁发者,包括 ACME (如 Let's Encrypt),CA (自签名或内部 CA),或 Vault 等。 + +**ClusterIssuer** + +- **作用域**:`ClusterIssuer` 的作用域是整个 Kubernetes 集群。它可以在任何命名空间中为证书资源颁发证书。 +- **用途**:当你想要一个统一的证书颁发策略,适用于整个 Kubernetes 集群时使用。这对于维护一致的证书管理策略非常有用,尤其是在需要跨多个命名空间统一管理 SSL/TLS 证书时。 +- **配置**:与 `Issuer` 类似,`ClusterIssuer` 也可以配置为使用 ACME、CA、Vault 等多种类型的证书颁发者。 + +**Let's Encrypt Server 参数区分** + +- `https://acme-staging-v02.api.letsencrypt.org/directory` (用于测试环境) +- `https://acme-v02.api.letsencrypt.org/directory` (用于生产环境) + +## 配置 Issuer 方法 + +- 测试 + + 1. ingress 资源配置 annotations + + ```bash + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-staging" + ``` + + 2. 部署 Yaml + + ```bash + kubectl create --edit -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/staging-issuer.yaml + ``` + +- 生产 + + 1. ingress 资源配置 annotations + + ``` + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-prod" + ``` + + 2. 部署 Yaml + + ```bash + kubectl create --edit -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/production-issuer.yaml + ``` + +## 配置 ClusterIssuer 方法 + +1. ingress 资源配置 annotations + + ```yaml + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-prod" + ``` + +2. 部署 Yaml + + ```bash + kubectl create --edit -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/cluster-issuer.yaml + ``` + +3. 检查 Certificate 资源是否创建 + + ```bash + kubectl get Certificate -A + ``` + +# 使用方法(NDS01) + +[外部DNS 提供商列表](https://cert-manager.io/docs/configuration/acme/dns01/#webhook) + +# 问题记录 + +> 2025-08-24日重新安装 Nginx-Ingress 和 Cert-Manager 时发现无法正常签发证书 + +## 根本原因 + +- `cert-manager` 在使用 HTTP-01 验证时,会临时创建一个 `/.well-known/acme-challenge/` 的 Ingress。 +- 集群中启用了 `ingress-nginx-admission`(ValidatingWebhookConfiguration),它默认拦截所有命名空间的 Ingress 创建。 +- `ingress-nginx-admission` 误判或不允许 `cert-manager` 创建的临时 Ingress(其验证逻辑认为路径不合法)。 +- 导致 `cert-manager` 的临时 Ingress 在创建阶段就被 Admission Webhook 拒绝,证书申请失败。 + +------ + +### 解决思路 + +1. **根本问题是 Admission Webhook 拦截了 cert-manager**,而不是 cert-manager 本身配置错误。 +2. 有两种主要解决方式: + - **临时删除 Admission Webhook**(快速见效,但失去 Ingress 配置校验功能)。 + - **修改 Admission Webhook 的 `namespaceSelector`,跳过 `cert-manager` 命名空间**(推荐,安全且长期可用)。 + +------ + +### 最终解决方案 + +- 确认 Admission Webhook 名称是 `ingress-nginx-admission`。 + +- 使用 `kubectl patch` 修改其 `namespaceSelector`,忽略 `cert-manager`: + + ```bash + kubectl patch validatingwebhookconfiguration ingress-nginx-admission \ + --type='json' \ + -p='[{"op": "replace", "path": "/webhooks/0/namespaceSelector", "value": {"matchExpressions":[{"key":"kubernetes.io/metadata.name","operator":"NotIn","values":["cert-manager","kube-system"]}]}}]' + ``` + +- 删除旧的 Challenge/Order,让 `cert-manager` 重新申请证书。 + +- 问题解决后,`cert-manager` 可以正常申请并自动续签证书,同时其他命名空间的 Ingress 仍然有 Admission 验证保护。 + diff --git a/Helm/Helm部署Coder.md b/Helm/Helm部署Coder.md new file mode 100644 index 0000000..61a996e --- /dev/null +++ b/Helm/Helm部署Coder.md @@ -0,0 +1,90 @@ +> 本文作者:丁辉 + +# Helm部署Coder + +[Github仓库](https://github.com/coder/code-server) + +## 介绍 + +**code-server是一个将Visual Studio Code(VS Code)部署到服务器上,使用户能够通过浏览器进行远程代码编辑和开发的项目**。它不是官方微软的产品,但提供了类似于官方vscode.dev的网页版体验。 + +## 开始部署 + +1. 拉取仓库文件到本地 + + ```bash + git clone https://github.com/coder/code-server && cd code-server/ci + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace code-server + ``` + +3. 编辑模版文件 + + ```bash + vi code-server-values.yaml + ``` + + 内容如下 + + ```yaml + persistence: + enabled: true + storageClass: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + accessMode: ReadWriteOnce + + ingress: + enabled: true + hosts: + - host: # 域名 + paths: + - / + ingressClassName: "" # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + tls: + - secretName: code-server-tls + hosts: + - # 域名 + ``` + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls code-server-tls --key nginx.key --cert nginx.pem -n code-server + ``` + +5. 安装 + + ```bash + helm install code-server ./helm-chart --namespace code-server -f code-server-values.yaml + ``` + +6. 查看密码登录 + + ```bash + echo $(kubectl get secret --namespace code-server code-server -o jsonpath="{.data.password}" | base64 --decode) + ``` + +## 卸载 + +1. 卸载 code-server + + ```bash + helm uninstall code-server -n code-server + ``` + +2. 删除 secret + + ```bash + kubectl delete secret code-server-tls -n code-server + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace code-server + ``` diff --git a/Helm/Helm部署Config-Syncer.md b/Helm/Helm部署Config-Syncer.md new file mode 100644 index 0000000..6148ea9 --- /dev/null +++ b/Helm/Helm部署Config-Syncer.md @@ -0,0 +1,102 @@ +> 本文作者:丁辉 + +# Helm部署Config-Syncer + +## 介绍 + +Config-Syncer 是一个用于同步配置文件的工具。它通常用于在分布式系统中保持各个节点的配置文件一致。通过使用 Config-Syncer,您可以确保当一个节点上的配置文件发生更改时,其他节点上的相应文件也会被更新,从而保持整个系统的一致性和稳定性。Config Syncer 可以 保持 ConfigMaps 和 Secrets 在命名空间和集群之间同步。 + +## 开始部署 + +[Github仓库](https://github.com/config-syncer/config-syncer) [Github-Chart仓库](https://github.com/appscode/charts) + +1. 添加 Helm 仓库 + + ```bash + helm repo add appscode https://charts.appscode.com/stable/ + helm repo update + ``` + +2. 编辑 values.yaml + + ```bash + vi config-syncer-values.yaml + ``` + + 内容如下 + + ```yaml + config: + # 通过: kubectl config current-context 可获取当前上下文的集群名 + clusterName: local + # 如果设置,只有来自这个命名空间的 configmaps 和 secrets 会被同步 + configSourceNamespace: "" + # kubeconfig 文件内容,用于 configmap 和 secret 同步器 + kubeconfigContent: "" + ``` + +3. 部署 + + ```bash + helm install config-syncer appscode/kubed \ + -n kubed --create-namespace \ + -f config-syncer-values.yaml + ``` + +## 卸载 + +1. 卸载 config-syncer + + ```bash + helm uninstall config-syncer -n kubed + ``` + +2. 删除命名空间 + + ```bash + kubectl delete namespace kubed + ``` + +# 使用 + +## ConfigMap/Secret + +[官方文档](https://config-syncer.com/docs/v0.15.1/guides/config-syncer/intra-cluster/) + +> 以 ConfigMap 示例, Secret 同理。 +> +> 同步 `default` 命名空间下名为 `demo` 的ConfigMap。 + +1. 开始同步 + + - 同步到所有命名空间 + + ```bash + kubectl annotate configmap demo kubed.appscode.com/sync="" -n default + ``` + + - 同步到指定命名空间 + + 1. 给命名空间添加标签 + + ```bash + kubectl label namespace kubed app=kubed + ``` + + 2. 添加注解 + + ```bash + kubectl annotate configmap demo kubed.appscode.com/sync="app=kubed" -n default --overwrite + ``` + +2. 检查同步状况 + + ```bash + kubectl get configmaps --all-namespaces | grep demo + ``` + +3. 移除注解 + + ```bash + kubectl annotate configmap demo kubed.appscode.com/sync- -n default + ``` \ No newline at end of file diff --git a/Helm/Helm部署Docker-Registry-UI.md b/Helm/Helm部署Docker-Registry-UI.md new file mode 100644 index 0000000..dc9f37c --- /dev/null +++ b/Helm/Helm部署Docker-Registry-UI.md @@ -0,0 +1,99 @@ +> 本文作者:丁辉 + +# Helm部署Docker-Registry-UI + +[Github仓库](https://github.com/Joxit/helm-charts/tree/main) + +[Helm-Chart仓库](https://github.com/Joxit/helm-charts/tree/main/charts/docker-registry-ui) + +## 介绍 + +**Docker-Registry-UI 是一个基于Web的可视化管理工具,用于简化Docker Registry的使用和管理**。 + +## 开始部署 + +1. 添加仓库 + + ```bash + helm repo add joxit https://helm.joxit.dev + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace hub + ``` + +3. 编写 values.yaml 文件 + + ```bash + vi docker-registry-ui-values.yaml + ``` + + 内容如下 + + ```yaml + ui: + image: joxit/docker-registry-ui:latest + # 如下配置对应官方部署文档: https://github.com/Joxit/docker-registry-ui#recommended-docker-registry-usage + singleRegistry: true + title: "Docker registry UI" + deleteImages: true + showContentDigest: true + # 开启 proxy 填写 Docker Registry 的访问地址 + proxy: true + dockerRegistryUrl: http://docker-registry.hub.svc.cluster.local:5000 + showCatalogNbTags: true + catalogMinBranches: 1 + catalogMaxBranches: 1 + taglistPageSize: 100 + registrySecured: false + catalogElementsLimit: 1000 + + # UI对外访问 + ingress: + enabled: true + host: #域名 + ingressClassName: nginx + tls: + - hosts: + - #域名 + secretName: docker-registry-ui-tls + ``` + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls docker-registry-ui-tls --key nginx.key --cert nginx.pem -n hub + ``` + +5. 安装 + + ```bash + helm install docker-registry-ui joxit/docker-registry-ui \ + -f docker-registry-ui-values.yaml \ + --namespace hub + ``` + +## 卸载 + +1. 卸载 gitea + + ```bash + helm uninstall docker-registry-ui -n hub + ``` + +2. 删除 secret + + ```bash + kubectl delete secret docker-registry-ui-tls -n hub + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace hub + ``` \ No newline at end of file diff --git a/Helm/Helm部署Docker-Registry.md b/Helm/Helm部署Docker-Registry.md new file mode 100644 index 0000000..c29b932 --- /dev/null +++ b/Helm/Helm部署Docker-Registry.md @@ -0,0 +1,182 @@ +> 本文作者:丁辉 + +# Helm部署Docker-Registry + +[官方文档](https://distribution.github.io/distribution/) + +[Github-Docker-Registry](https://github.com/distribution/distribution) + +[Helm-Chart仓库](https://github.com/helm/charts/tree/master/stable/docker-registry) + +## 介绍 + +**Docker Registry 是一个用于存储、管理和分发 Docker 镜像的服务器应用程序**。 + +## 开始部署 + +1. 添加仓库 + + ```bash + helm repo add stable https://charts.helm.sh/stable + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace hub + ``` + +3. 使用 Htpasswd 生成镜像仓库账户密码 + + 1. 安装 + + - Centos安装 + + ```bash + yum -y install httpd-tools + ``` + + - Ubuntu安装 + + ```bash + apt-get -y install apache2-utils + ``` + + 2. 生成密码 + + ```bash + htpasswd -Bbn admin 123456 + ``` + + **参数解释** + + - `-B`: 使用 bcrypt 算法进行密码加密。这是推荐使用的安全加密方式。 + - `-b`: 表示将用户名和密码作为命令行参数提供,而不是通过交互式输入。 + - `-n`: 表示不更新文件,而是将加密后的用户名和密码输出到标准输出(通常是终端或屏幕)。 + - `admin`: 是要创建或更新的用户名。 + - `123456`: 是该用户名的密码。 + +4. 编写 values.yaml 文件 + + ```bash + vi docker-registry-values.yaml + ``` + + 内容如下 + + [Docker-Registry配置文件解释](https://gitee.com/offends/Kubernetes/blob/main/%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93/Registry/Docker-Registry%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%A7%A3%E9%87%8A.md) + + ```yaml + image: + repository: registry + tag: latest + + # 填入 htpasswd 生成的密码 + secrets: + htpasswd: "admin:$2y$05$Fx9LJWaWzrgvHRm9wwrBl.V254BIoqnH/KA6wWnOMxMtmRqVbWq4O" + + # Docker-Registry配置文件 + configData: + version: 0.1 + log: + fields: + service: registry + storage: + delete: + enabled: true + cache: + blobdescriptor: inmemory + filesystem: + rootdirectory: /var/lib/registry + http: + addr: :5000 + headers: + X-Content-Type-Options: [nosniff] + Access-Control-Allow-Origin: ['*'] + health: + storagedriver: + enabled: true + interval: 10s + threshold: 3 + + # 设置存储类型: filesystem 或 s3 + storage: filesystem + persistence: + enabled: true + size: 50Gi + storageClass: # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + ``` + +5. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls registry-tls --key nginx.key --cert nginx.pem -n hub + ``` + +6. 部署 + + ```bash + helm install docker-registry stable/docker-registry \ + -f docker-registry-values.yaml \ + --namespace hub + ``` + +7. 部署 Ingress 对外访问 + + > 因 Helm 官方 stable 仓库在 2022 年就停止维护了, Chart 有些参数版本较老, 索性自己创建 Ingress + + ```bash + cat < 本文作者:丁辉 + +# Helm部署Drone-Kubernetes-Secrets + +[使用文档](https://docs.drone.io/secret/external/kubernetes/) + +## 介绍 + +**Drone-Kubernetes-Secrets 是一个用于管理 Drone 与 Kubernetes 之间 Secrets 交互的组件**。它允许用户在 Drone CI/CD 流程中使用 Kubernetes 集群中的 Secrets,以便更安全地访问敏感数据,例如密码、令牌或 SSH 密钥。 + +## 开始部署 + +1. 添加 Drone Helm Chart 存储库 + + ```bash + helm repo add drone https://charts.drone.io + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace drone + ``` + +3. 生成密钥 + + ```bash + openssl rand -hex 16 + ``` + +4. 编写模版文件 + + ```bash + vi drone-kubernetes-secrets-values.yaml + ``` + + 内容如下 + + ```yaml + rbac: + secretNamespace: drone + env: + SECRET_KEY: 填入密钥 + KUBERNETES_NAMESPACE: drone + ``` + +5. 启动 + + ```bash + helm install drone-kubernetes-secrets drone/drone-kubernetes-secrets -f drone-kubernetes-secrets-values.yaml -n drone + ``` + +## 修改Runner-Kube配置 + +1. 编辑 `drone-runner-kube-values.yaml` 文件 + + ```bash + vi drone-runner-kube-values.yaml + ``` + + env 下添加 + + ```yaml + env: + DRONE_SECRET_PLUGIN_ENDPOINT: http://drone-kubernetes-secrets:3000 + DRONE_SECRET_PLUGIN_TOKEN: 此处跟SECRET_KEY一致 + # 如有需要开启 DEBUG 调试 + # DRONE_DEBUG: true + ``` + +2. 更新 drone-runner-kube + + ```bash + helm upgrade drone-runner-kube drone/drone-runner-kube -f drone-runner-kube-values.yaml -n drone + ``` + +## 卸载 + +1. 卸载 drone-kubernetes-secrets + + ```bash + helm uninstall drone-kubernetes-secrets -n drone + ``` + +2. 删除命名空间 + + ```bash + kubectl delete namespace drone + ``` + +# 使用方法 + +1. 创建 Secret + + ```bash + vi drone-secret.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: v1 + kind: Secret + type: Opaque + data: + username: YWRtaW4K + password: YWRtaW4K + metadata: + name: build-secret + namespace: drone + ``` + + 部署 + + ```bash + kubectl apply -f drone-secret.yaml + ``` + +2. 编写 `.drone.yml` + + ```yaml + kind: pipeline + type: kubernetes + name: secret-demo + + steps: + - name: hello + image: busybox + # 环境变量 + environment: + USERNAME: + from_secret: USERNAME + PASSWORD: + from_secret: PASSWORD + # 执行命令 + commands: + # 判断是否存在环境变量,存在则输出成功,不存在则输出失败 + - if [ -n "$USERNAME" ]; then echo "USERNAME exists"; else echo "USERNAME does not exist"; fi + - if [ -n "$PASSWORD" ]; then echo "PASSWORD exists"; else echo "PASSWORD does not exist"; fi + --- + kind: secret + name: USERNAME + get: + path: build-secret + name: username + --- + kind: secret + name: PASSWORD + get: + path: build-secret + name: password + ``` + +3. 构建后查看结果 diff --git a/Helm/Helm部署Drone-Runner-Docker.md b/Helm/Helm部署Drone-Runner-Docker.md new file mode 100644 index 0000000..2c6bcee --- /dev/null +++ b/Helm/Helm部署Drone-Runner-Docker.md @@ -0,0 +1,115 @@ +> 本文作者:丁辉 + +# Helm部署Drone-Runner-Docker + +## 介绍 + +**Drone-Runner-Docker 是一个用于在 Docker 容器中运行 Drone 构建步骤的插件**。它允许用户在隔离的容器环境中执行构建任务,以确保构建过程的一致性和可重现性。 + +## 开始部署 + +[官方部署文档](https://github.com/drone/charts/blob/master/charts/drone-runner-docker/docs/install.md) + +> Docker 需要开启 2375 端口 + +1. 添加 Drone Helm Chart 存储库 + + ```bash + helm repo add drone https://charts.drone.io + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace drone + ``` + +3. 创建 secret 文件 + + ```bash + kubectl create secret generic runner-drone-secret \ + --from-literal=DRONE_RUNNER_CAPACITY=2 \ + --from-literal=DRONE_RUNNER_NAME=runner \ + --from-literal=DRONE_RPC_SECRET=填入密钥 \ + --from-literal=DRONE_RPC_HOST=填入drone域名 \ + --from-literal=DRONE_RPC_PROTO=https \ + -n drone + ``` + + > Runner 添加标签 + > + > ```bash + > --from-literal=DRONE_RUNNER_LABELS=标签:值 + > ``` + +4. 编写模版文件 + + ```bash + vi drone-runner-docker-values.yaml + ``` + + 内容如下 + + ```yaml + extraSecretNamesForEnvFrom: + - runner-drone-secret + + # 本地 Docker 开启 2375 后配置(后续构建将使用宿主机本地 Docker 服务) + env: + DOCKER_HOST: "tcp://<节点IP>:2375" + ``` + + > 查看 MTU 值, 如果 mtu 小于 1500 则需要传递额外参数 + > + > ```bash + > ip link show + > ``` + > + > 添加额外参数 + > + > ```yaml + > dind: + > commandArgs: + > - "--host" + > - "tcp://localhost:2375" + > - "--mtu=12345" + > ``` + +5. 启动 + + ```bash + helm install drone-runner-docker drone/drone-runner-docker \ + -n drone \ + -f drone-runner-docker-values.yaml + ``` + +## 卸载 + +1. 卸载 drone-runner-docker + + ```bash + helm uninstall drone-runner-docker -n drone + ``` + +2. 删除 secret + + ```bash + kubectl delete secret runner-drone-secret -n drone + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace drone + ``` + +# 问题记录 + +> 2025-8-25 构建运行时显示 +> +> ```bash +> Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network +> ``` + +本报错不属于IP地址池耗尽,属于IP地址冲突报错。 diff --git a/Helm/Helm部署Drone-Runner-Kube.md b/Helm/Helm部署Drone-Runner-Kube.md new file mode 100644 index 0000000..61babcc --- /dev/null +++ b/Helm/Helm部署Drone-Runner-Kube.md @@ -0,0 +1,84 @@ +> 本文作者:丁辉 + +# Helm部署Drone-Runner-Kube + +## 介绍 + +**Drone-Runner-Kube 是一个插件,它允许 Drone 在 Kubernetes 集群中运行构建步骤**。这个插件利用 Kubernetes 的资源管理能力,为 Drone 提供了在容器化环境中执行构建、测试和部署的能力。 + +## 开始部署 + +1. 添加 Drone Helm Chart 存储库 + + ```bash + helm repo add drone https://charts.drone.io + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace drone + ``` + +3. 创建 secret 文件 + + ```bash + kubectl create secret generic runner-drone-secret \ + --from-literal=DRONE_RUNNER_CAPACITY=2 \ + --from-literal=DRONE_RUNNER_NAME=runner \ + --from-literal=DRONE_RPC_SECRET=填入密钥 \ + --from-literal=DRONE_RPC_HOST=填入drone域名 \ + --from-literal=DRONE_RPC_PROTO=https \ + -n drone + ``` + + > Runner 添加标签 + > + > ```bash + > --from-literal=DRONE_RUNNER_LABELS=标签:值 + > ``` + +4. 编写模版文件 + + ```bash + vi drone-runner-kube-values.yaml + ``` + + 内容如下 + + ```yaml + extraSecretNamesForEnvFrom: + - runner-drone-secret + rbac: + buildNamespaces: + - drone + env: + DRONE_NAMESPACE_DEFAULT: drone + ``` + +5. 启动 + + ```bash + helm install drone-runner-kube drone/drone-runner-kube -f drone-runner-kube-values.yaml -n drone + ``` + +## 卸载 + +1. 卸载 drone-runner-kube + + ```bash + helm uninstall drone-runner-kube -n drone + ``` + +2. 删除 secret + + ```bash + kubectl delete secret runner-drone-secret -n drone + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace drone + ``` diff --git a/Helm/Helm部署Drone.md b/Helm/Helm部署Drone.md new file mode 100644 index 0000000..717a888 --- /dev/null +++ b/Helm/Helm部署Drone.md @@ -0,0 +1,178 @@ +> 本文作者:丁辉 + +# Helm部署Drone + +[官方文档](https://docs.drone.io/) + +[官方中文文档](https://drone.cool/) + +## 介绍 + +**Drone 是一个开源的持续集成和持续部署(CI/CD)平台,广泛用于自动化代码构建、测试和发布流程**。 + +## 开始部署 + +1. 添加 Drone Helm Chart 存储库 + + ```bash + helm repo add drone https://charts.drone.io + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace drone + ``` + +3. 部署 Postgres + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/drone-postgres.yaml + ``` + +4. 生成密钥 + + ```bash + openssl rand -hex 16 + ``` + +5. 进入 Github 创建 OAuth2 应用获取 `DRONE_GITHUB_CLIENT_ID` 和 `DRONE_GITHUB_CLIENT_SECRET` + +6. 生成 Secret + + > 对接 Gitea 参数替换如下: + > + > DRONE_GITEA_CLIENT_ID + > + > DRONE_GITEA_CLIENT_SECRET + + ```bash + kubectl create secret generic drone-secret \ + --from-literal=DRONE_RPC_SECRET=填入密钥 \ + --from-literal=DRONE_GITHUB_CLIENT_ID=填入Github-ID \ + --from-literal=DRONE_GITHUB_CLIENT_SECRET=填入Github-SECRET \ + --from-literal=DRONE_GIT_USERNAME=配置Github用户名 \ + --from-literal=DRONE_GIT_PASSWORD=配置Github密码 \ + --from-literal=DRONE_USER_CREATE=username:填入管理员用户名,admin:true \ + -n drone + ``` + + **参数解释** + + | 参数 | 描述 | + | ----------------------------- | ------------------------------------------------------------ | + | `DRONE_RPC_SECRET=` | 将名为`DRONE_RPC_SECRET`的密钥添加到Secret中,用于Drone CI/CD工具的RPC通信和验证。 | + | `DRONE_GITHUB_CLIENT_ID=` | 将GitHub OAuth应用程序的客户端ID添加到Secret中。 | + | `DRONE_GITHUB_CLIENT_SECRET=` | 将GitHub OAuth应用程序的客户端密钥添加到Secret中。 | + | `DRONE_GIT_USERNAME=` | 将GitHub用户名添加到Secret中,用于访问GitHub仓库。 | + | `DRONE_GIT_PASSWORD=` | 将GitHub密码添加到Secret中,用于访问GitHub仓库。 | + | `DRONE_USER_CREATE=username:` | 指定在Drone启动时创建的用户信息,包括用户名和角色(管理员)。 | + +7. 编写模版文件 + + > 对接 Gitea 参数替换如下: + > + > DRONE_GITEA_SERVER + + ```bash + vi drone-values.yaml + ``` + + 内容如下 + + ```yaml + # 开启 ingress 对外访问 + ingress: + enabled: true + className: "" # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + hosts: + - host: # 域名 + paths: + - path: / + pathType: Prefix + tls: + - secretName: drone-tls + hosts: + - # 域名 + + env: + DRONE_GITHUB_SERVER: https://github.com #仓库地址 + DRONE_SERVER_HOST: #域名 + DRONE_SERVER_PROTO: https + DRONE_DATABASE_DRIVER: postgres + DRONE_DATABASE_DATASOURCE: postgres://postgres:postgres@drone-db:5432/drone?sslmode=disable + extraSecretNamesForEnvFrom: + - drone-secret + persistentVolume: + enabled: false + ``` + + > 其他参数 + > + > ```bash + > # oauth会验证gitlab证书,如果验证不过,需要打开 + > DRONE_GITLAB_SKIP_VERIFY: true + > ``` + +8. 安装 + + ```bash + helm install drone drone/drone -f drone-values.yaml -n drone + ``` + +## 卸载 + +1. 卸载 drone + + ```bash + helm uninstall drone -n drone + ``` + +2. 删除 secret + + ```bash + kubectl delete secret drone-secret -n drone + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace drone + ``` + +# 问题记录 + +> 2025-8-25遇到 Drone 对接 Gitea 时报错 +> +> ```bash +> You will be redirected to your source control management system to authenticate +> ``` + +## 根本原因 + +- Gitea 将 Drone 的 OAuth2 应用识别为 **Public Client(公开客户端)**,默认要求 **PKCE(Proof Key for Code Exchange)**。 +- Drone 作为传统 CI/CD 工具不支持 PKCE,因此在交换授权码时,Gitea拒绝了请求,返回 `invalid_request` 和 `PKCE is required for public clients`。 + +------ + +## 解决思路 + +1. 确认 Gitea 日志中报错 `PKCE is required for public clients`,确定是 Gitea OAuth2 客户端类型问题。 +2. 将 Drone 在 Gitea 中注册的 OAuth2 应用改为 **Confidential Client(机密客户端)**,避免 PKCE 校验。 +3. 更新 Drone 使用新的 Client ID / Secret,确保 OAuth2 授权流程可用。 + +------ + +## 最终解决方案 + +1. **在 Gitea 中重新创建 OAuth2 应用**: + - 登录 Gitea → `Settings` → `Applications` → `Manage OAuth2 Applications` → `New OAuth2 Application` + - **Redirect URI**:`https://域名/login` + - **勾选 Confidential Client(机密客户端)** + - 保存并获取新的 **Client ID** 和 **Client Secret**。 +2. **更新 Drone 配置**: + - 在 Kubernetes Secret 中更新 + - 重启 Drone 服务。 +3. **重新访问 Drone**: + - 打开 `https://域名/login` ,用 Gitea 登录授权,验证 OAuth2 流程正常完成。 diff --git a/Helm/Helm部署Gitea.md b/Helm/Helm部署Gitea.md new file mode 100644 index 0000000..515788d --- /dev/null +++ b/Helm/Helm部署Gitea.md @@ -0,0 +1,170 @@ +> 本文作者:丁辉 +> + +# Helm部署Gitea + +## 介绍 + +**Gitea是一个轻量级的DevOps平台软件,支持Git托管、代码审查、团队协作、软件包注册和CI/CD等功能**。 + +## 开始部署 + +[Chart文件下载](https://dl.gitea.com/charts/) [官方仓库](https://gitea.com/gitea/helm-gitea/src/branch/main/values.yaml) + +1. 添加 Helm 仓库 + + ```bash + helm repo add gitea https://dl.gitea.io/charts + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace gitea + ``` + +3. 生成secret + + ```bash + kubectl create secret generic gitea-secret \ + --from-literal=username=设定仓库账号 \ + --from-literal=password=设定仓库密码 \ + -n gitea + ``` + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls gitea-tls --key nginx.key --cert nginx.pem -n gitea + ``` + +5. 编写模版文件 + + ```bash + vi gitea-values.yaml + ``` + + 内容如下 + + ```yaml + # 开启 ingress 对外访问 + ingress: + enabled: true + className: # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + hosts: + - host: # 域名 + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - # 域名 + secretName: gitea-tls + + # 配置持久化存储 + global: + storageClass: # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + + # 配置 ssh 模式下对外访问端口 + service: + ssh: + type: NodePort + port: 22 + nodePort: 30000 + + # 配置管理员账号和密码 + gitea: + admin: + existingSecret: gitea-secret + email: "gitea@gitea.com" # 配置仓库默认用户邮箱 + + config: + APP_NAME: "Gitea" # 配置 Gitea 默认主页面展示名称 + + server: + SSH_DOMAIN: "gitea.com" + DOMAIN: "gitea.com" + SSH_LISTEN_PORT: "22" + SSH_PORT: "30000" + # https://docs.gitea.com/zh-cn/administration/config-cheat-sheet#service-service + service: # 别问我为什么要加上这些 + # 禁用注册,启用后只能用管理员添加用户 + DISABLE_REGISTRATION: false + # 启用此项以对注册使用验证码验证 + ENABLE_CAPTCHA: true + # 启用此项以要求登录使用验证码验证,您还必须启用 ENABLE_CAPTCHA + REQUIRE_CAPTCHA_FOR_LOGIN: true + + # 关闭 redis 集群 + redis-cluster: + enabled: false + + # 关闭 postgresql 集群 + postgresql-ha: + enabled: false + + # 启用 postgresql + postgresql: + enabled: true + ``` + +6. 部署 + + ```bash + helm install gitea --namespace gitea -f gitea-values.yaml gitea/gitea + ``` + +## 卸载 + +1. 卸载 gitea + + ```bash + helm uninstall gitea -n gitea + ``` + +2. 删除 secret + + ```bash + kubectl delete secret gitea-tls gitea-secret -n gitea + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace gitea + ``` + + +## 批量清理用户和仓库 + +1. 下载脚本 + + - 普通删除 + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Python/clean-gitea-user.py + ``` + + - 并发删除(具有速度优势但需要根据自己服务器资源调整 `max_workers` 参数) + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Python/clean-gitea-user-concurrency.py + ``` + +2. 指定参数并运行 + + ```bash + python clean-gitea-user.py --keep-users user1 user2 --gitea-url http://gitea.example.com --api-token your_token + ``` + + **参数解释** + + `--gitea-url`:指定 Gitea 访问地址 + + `--api-token`:指定应用 Access Token + + `--keep-users`:指定不想删除仓库的用户 + diff --git a/Helm/Helm部署Haproxy.md b/Helm/Helm部署Haproxy.md new file mode 100644 index 0000000..db4d491 --- /dev/null +++ b/Helm/Helm部署Haproxy.md @@ -0,0 +1,121 @@ +> 本文作者:丁辉 + +# Helm部署Haproxy + +## 介绍 + +**HAProxy是一个功能强大的开源软件,专门用于提供高可用性、负载均衡以及基于TCP和HTTP应用的代理服务**。 + +## 开始部署 + +| 节点名称 | IP | +| :------: | :----------: | +| web1 | 192.168.1.10 | +| web2 | 192.168.1.20 | + +[Github仓库](https://github.com/haproxytech/helm-charts) + +1. 添加 Helm 仓库 + + ```bash + helm repo add haproxytech https://haproxytech.github.io/helm-charts + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace haproxy + ``` + +3. 编写 values.yaml + + ```bash + vi haproxy-values.yaml + ``` + + 内容如下 + + ```yaml + config: | + global + log stdout format raw local0 + maxconn 1024 + + defaults + log global + timeout client 60s + timeout connect 60s + timeout server 60s + + frontend fe_main + bind :80 + default_backend be_main + + backend be_main + server web1 192.168.1.10:80 check + server web2 192.168.1.20:80 check + + ingress: + enabled: true + servicePort: 80 + className: "" # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + hosts: + - host: # 域名 + paths: + - path: / + pathType: Prefix + tls: + - secretName: haproxy-tls + hosts: + - # 域名 + ``` + + **参数解释** + + | 配置部分 | 参数 | 解释 | + | :------: | :-------------: | :----------------------------------------------------------: | + | global | log | 应用全局日志配置,将日志输出到标准输出,并使用原始格式进行日志记录,日志级别为 local0。 | + | | maxconn | 设置最大连接数为 1024。 | + | defaults | log | 应用全局日志配置,将日志输出到标准输出,并使用原始格式进行日志记录,日志级别为 local0。 | + | | timeout client | 设置客户端超时时间为 60 秒,即客户端连接到 HAProxy 但没有发送请求的最大时间。 | + | | timeout connect | 设置连接超时时间为 60 秒,即连接到后端服务器的最大时间。 | + | | timeout server | 设置服务器超时时间为 60 秒,即后端服务器响应客户端请求的最大时间。 | + | frontend | bind | 在端口 80 上绑定,监听所有 IP 地址的流量。 | + | | default_backend | 将所有来自前端的请求转发到名为 be_main 的后端。 | + | backend | server | 定义两个后端服务器,分别为 web1 和 web2,它们的 IP 地址分别为 192.168.1.10 和 192.168.1.20,监听端口为 80,并且 HAProxy 会定期检查它们的健康状态。 | + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls haproxy-tls --key nginx.key --cert nginx.pem -n haproxy + ``` + +5. 部署 + + ```bash + helm install haproxy haproxytech/haproxy -f haproxy-values.yaml -n haproxy + ``` + + +6. 查看访问地址 + + ```bash + kubectl get svc -n haproxy + ``` + +## 卸载 + +1. 卸载 haproxy + + ```bash + helm uninstall haproxy -n haproxy + ``` + +2. 删除命名空间 + + ```bash + kubectl delete namespace haproxy + ``` diff --git a/Helm/Helm部署Harbor.md b/Helm/Helm部署Harbor.md new file mode 100644 index 0000000..7809bfc --- /dev/null +++ b/Helm/Helm部署Harbor.md @@ -0,0 +1,76 @@ +> 本文作者:丁辉 + +# Helm部署Harbor + +[官网地址](https://goharbor.io/docs/2.6.0/install-config/harbor-ha-helm/) [Github下载地址](https://github.com/goharbor/harbor/releases) + +## 开始部署 + +1. 添加 Helm 仓库 + + ```bash + helm repo add harbor https://helm.goharbor.io + helm repo update + ``` + +2. 编辑 values.yaml + + ```bash + vi harbor-values.yaml + ``` + + 内容如下 + + ```yaml + expose: + type: ingress + tls: + enabled: true + certSource: secret + secret: + secretName: "harbor-tls" + ingress: + hosts: + core: # 域名 + + # 对外访问地址 + externalURL: http://域名 + + # 配置 Harbor密码 + harborAdminPassword: "Harbor12345" + + # 持久化存储配置部分 + persistence: + enabled: true + + # 是否启用监控组件 + metrics: + enabled: true + ``` + +3. 安装 + + ```bash + helm install harbor \ + --namespace harbor \ + --create-namespace \ + harbor/harbor \ + -f harbor-values.yaml + ``` + +## 卸载 + +1. 卸载 Harbor + + ```bash + helm uninstall harbor -n harbor + ``` + +2. 删除 Harbor 命名空间 + + ```bash + kubectl delete ns harbor + ``` + + + diff --git a/Helm/Helm部署HertzBeat.md b/Helm/Helm部署HertzBeat.md new file mode 100644 index 0000000..497e067 --- /dev/null +++ b/Helm/Helm部署HertzBeat.md @@ -0,0 +1,82 @@ +> 本文作者:丁辉 + +# Helm部署HertzBeat + +## 介绍 + +**HertzBeat是一个开源实时监控系统,具有无需Agent、性能集群、兼容Prometheus等特点**。 + +## 开始部署 + +[Github仓库](https://github.com/apache/hertzbeat/tree/master) + +[中文官方文档](https://hertzbeat.apache.org/zh-cn/docs/) + +1. 添加仓库 + + ```bash + helm repo add hertzbeat https://charts.hertzbeat.com/ + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace hertzbeat + ``` + +3. 编写 values.yaml 文件 + + ```bash + vi hertzbeat-values.yaml + ``` + + 内容如下 + + ```yaml + expose: + type: ingress + ingress: + enabled: true + host: "" # 域名 + tls: + enabled: true + tls: + - secretName: hertzbeat-tls + ``` + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls hertzbeat-tls --key nginx.key --cert nginx.pem -n hertzbeat + ``` + +5. 安装 + + ```bash + helm install hertzbeat hertzbeat/hertzbeat \ + --namespace hertzbeat --create-namespace \ + -f hertzbeat-values.yaml + ``` + +## 卸载 + +1. 卸载 hertzbeat + + ```bash + helm uninstall hertzbeat -n hertzbeat + ``` + +2. 删除 secret + + ```bash + kubectl delete secret hertzbeat-tls -n hertzbeat + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace hertzbeat + ``` diff --git a/Helm/Helm部署JuiceFS-CSI对接对象存储.md b/Helm/Helm部署JuiceFS-CSI对接对象存储.md new file mode 100644 index 0000000..609c637 --- /dev/null +++ b/Helm/Helm部署JuiceFS-CSI对接对象存储.md @@ -0,0 +1,105 @@ +> 本文作者:丁辉 + +# Helm部署JuiceFS-CSI对接对象存储 + +## 介绍 + +**JuiceFS CSI是一个遵循CSI规范的驱动程序,它实现了容器编排系统与JuiceFS文件系统之间的接口,使得Kubernetes集群能够以持久卷的形式提供给Pod使用**。 + +## 开始部署 + +> 提前准备 Minio 和 Mysql 数据库 + +| 服务名 | 服务器地址:端口 | 存储库名 | 账户/密码 | +| :----: | :---------------: | :------: | :-----------------------: | +| Mysql | 192.168.1.10:3306 | juicefs | root:root | +| Minio | 192.168.1.20:9000 | juicefs | ${accessKey}/${secretKey} | + +[官方Chart仓库](https://github.com/juicedata/charts/tree/main) [官方文档](https://juicefs.com/docs/zh/csi/introduction) + +1. 添加仓库 + + ```bash + helm repo add juicefs https://juicedata.github.io/charts/ + helm repo update + ``` + +2. 编辑 values.yaml 文件 + + ```bash + vi juicefs-values.yaml + ``` + + 内容如下 + + ```yaml + # 检查 kubelet 根目录 ps -ef | grep kubelet | grep root-dir + kubeletDir: /var/lib/kubelet + + # 配置存储 + storageClasses: + - name: juicefs-sc + enabled: true + reclaimPolicy: Delete + allowVolumeExpansion: true + backend: + name: "rainbond" + metaurl: "mysql://root:root@(192.168.1.10:3306)/juicefs" + storage: "s3" + # 创建 Access Keys 填写 + accessKey: "${accessKey}" + secretKey: "${secretKey}" + bucket: "http://192.168.1.20:9000/juicefs?tls-insecure-skip-verify=true" + envs: "{TZ: Asia/Shanghai}" + + # 关闭面板 + dashboard: + enabled: false + + # 配置镜像加速 + sidecars: + livenessProbeImage: + repository: registry.aliyuncs.com/google_containers/livenessprobe + nodeDriverRegistrarImage: + repository: registry.aliyuncs.com/google_containers/csi-node-driver-registrar + csiProvisionerImage: + repository: registry.aliyuncs.com/google_containers/csi-provisioner + csiResizerImage: + repository: registry.aliyuncs.com/google_containers/csi-resizer + ``` + +3. 部署 + + ```bash + helm install juicefs juicefs/juicefs-csi-driver \ + --namespace juicefs --create-namespace \ + -f juicefs-values.yaml + ``` + +## 卸载 + +```bash +helm uninstall juicefs -n juicefs +``` + +## 动态配置 + +> 如果想加入动态配置可在安装之前编辑此文件添加 + +```bash +vi juicefs-csi-driver/templates/storageclass.yaml +``` + +> 此处添加:juicefs/clean-cache: "true" +> + +```yaml +apiVersion: storage.k8s.io/v1 +... +parameters: + juicefs/clean-cache: "true" +``` + +## 问题记录 + +> /var/lib/juicefs 是 juicefs 的缓存目录,请单独挂载磁盘(在本盘写满后才会清理,所以会导致 / 写满) diff --git a/Helm/Helm部署KongGateway.md b/Helm/Helm部署KongGateway.md new file mode 100644 index 0000000..5a2b632 --- /dev/null +++ b/Helm/Helm部署KongGateway.md @@ -0,0 +1,141 @@ +> 本文作者:丁辉 + +# Helm部署KongGateway + +[官方安装文档](https://docs.konghq.com/gateway/latest/install/kubernetes/proxy/) [Github仓库](https://github.com/pantsel/konga) + +## 介绍 + +Kong Gateway是一个**基于Nginx和OpenResty实现的云原生分布式API网关,具有高性能、高可用特点**。 + +## 开始部署 + +1. 添加 Helm 仓库 + + ```bash + helm repo add kong https://charts.konghq.com + helm repo update + ``` + +2. 编辑 values.yaml + + ```bash + vi kong-gateway-values.yaml + ``` + + 内容如下 + + ```yaml + ingressController: + enabled: true + + # 安装模式配置为 daemonset + deployment: + daemonset: true + hostNetwork: false + + # 更改 service type + proxy: + enabled: true + type: ClusterIP + http: + hostPort: 80 + tls: + hostPort: 443 + manager: + enabled: true + type: ClusterIP + admin: + enabled: true + type: ClusterIP + # 启用管理员API + http: + enabled: true + tls: + enabled: false + + # 配置标签 + nodeSelector: + kong: "true" + + # 开启监控 + serviceMonitor: + enabled: true + ``` + +3. 配置节点标签 + + ```bash + kubectl label node ${node} kong="true" + ``` + +4. 安装 + + ```bash + helm install kong kong/kong \ + --namespace kong \ + --create-namespace \ + -f kong-gateway-values.yaml + ``` + + +## 启用 Postgres 数据库 + +要启用 Postgres 数据库的话需要在 values.yaml 内添加如下内容: + +```yaml +# 对接外部数据库默认为不对接 postgres +# 官方 postgres 参数文档: https://docs.konghq.com/gateway/3.7.x/reference/configuration/#datastore-section +# 提示 pg_host 参数使用 svc 配置后组件启动可能会报错解析错误, 切换为 svc IP即可解决。 +env: + database: "postgres" + pg_host: "kong-postgresql.kong.svc.cluster.local" + pg_port: "5432" + pg_user: kong + pg_password: kong + pg_database: kong + pg_ssl: false + pg_ssl_verify: false + + router_flavor: "traditional" + nginx_worker_processes: "2" + proxy_access_log: /dev/stdout + admin_access_log: /dev/stdout + admin_gui_access_log: /dev/stdout + portal_api_access_log: /dev/stdout + proxy_error_log: /dev/stderr + admin_error_log: /dev/stderr + admin_gui_error_log: /dev/stderr + portal_api_error_log: /dev/stderr + prefix: /kong_prefix/ + +# 开启 postgresql +postgresql: + enabled: true + auth: + username: "kong" + password: "kong" + database: "kong" +``` + +## 卸载 + +1. 卸载 + + ```bash + helm uninstall kong -n kong + ``` + +2. 删除 PVC + + ```bash + kubectl delete pvc data-kong-postgresql-0 -n kong + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace kong + ``` + + diff --git a/Helm/Helm部署Kube-Prometheus-Stack.md b/Helm/Helm部署Kube-Prometheus-Stack.md new file mode 100644 index 0000000..4158eab --- /dev/null +++ b/Helm/Helm部署Kube-Prometheus-Stack.md @@ -0,0 +1,212 @@ +> 本文作者:丁辉 + +# Helm部署Kube-Prometheus-Stack + +## 介绍 + +**Kube-Prometheus-Stack 是一个全面的监控解决方案,专为 Kubernetes 集群设计,集成了 Prometheus、Grafana、Alertmanager 等组件**。它通过提供预配置的部署,简化了在 Kubernetes 环境中设置监控系统的过程。 + +## 开始部署 + +[官方仓库](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) + +1. 添加仓库 + + ```bash + helm repo add prometheus-community https://prometheus-community.github.io/helm-charts + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace monitor + ``` + +3. 编写 values.yaml 文件 + + ```bash + vi kube-prometheus-stack-values.yaml + ``` + + 内容如下 + + ```yaml + prometheusOperator: + admissionWebhooks: + patch: + image: + registry: registry.aliyuncs.com # 配置镜像加速 + repository: google_containers/kube-webhook-certgen + + # 关闭默认报警策略(建议关闭后自定义报警策略) + defaultRules: + create: false + + # 配置 alertmanager 飞书报警通知 + # Helm部署PrometheusAlert + # 文档: https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2PrometheusAlert.md + alertmanager: + tplConfig: true + stringConfig: | + global: + # 在警报被标记为已解决后,Alertmanager 等待 5 分钟以更新警报状态。如果在此时间内警报消失,Alertmanager 将其标记为已解决。 + resolve_timeout: 5m + route: + # 将具有相同警报名称(alertname)的警报分组在一起。 + group_by: ['alertname'] + # 首次接收到警报后,Alertmanager 将等待 30 秒再发送,以便将可能相关的警报合并。 + group_wait: 30s + # 在同一个组的警报被发送后,Alertmanager 等待 5 分钟后才会发送下一个组的警报。 + group_interval: 5m + # 重复发送同一组警报的时间间隔为 30 分钟,以提醒长时间存在的问题。 + repeat_interval: 30m + receiver: 'web.hook.prometheusalert' + receivers: + - name: 'web.hook.prometheusalert' + webhook_configs: + - url: 'http://prometheusalert.monitor.svc.cluster.local:8080/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/****' + send_resolved: true #通知已经恢复的告警 + inhibit_rules: + # 用于设置警报抑制规则。 + - source_match: + severity: 'critical' + target_match: + severity: 'warning' + equal: ['alertname', 'dev', 'instance'] + alertmanagerSpec: + # 强制启用集群模式,即使只有一个副本也可以启用集群模式。 + forceEnableClusterMode: false + storage: + volumeClaimTemplate: + spec: + storageClassName: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 50Gi + + grafana: + # 开启默认仪表片 + defaultDashboardsEnabled: false + # 配置 grafana 时区 + defaultDashboardsTimezone: cst + # 配置 grafana 密码 + adminPassword: admin + # grafana 挂载持久化存储 + persistence: + enabled: true + storageClassName: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + # 开启 ingress 对外访问 + ingress: + enabled: true + ingressClassName: # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + hosts: + - # 域名 + path: / + tls: + - secretName: grafana-general-tls + hosts: + - # 域名 + + prometheus: + prometheusSpec: + # 指定外部 alertmanager + #additionalAlertManagerConfigs: + #- static_configs: + #- targets: + #- "192.168.1.10:9093" + # 是否启用 --web.enable-remote-write-receiver 特性 + enableRemoteWriteReceiver: false + # 评估频率 + evaluationInterval: "30s" + # 抓去数据间隔 + scrapeInterval: "5s" + # 这些设置表明所提及的选择器(规则、服务监视器、Pod 监视器和抓取配置)将具有独立的配置,而不会基于 Helm 图形值。(否则你的 ServiceMonitor 可能不会被自动发现) + ruleSelectorNilUsesHelmValues: false + serviceMonitorSelectorNilUsesHelmValues: false + podMonitorSelectorNilUsesHelmValues: false + probeSelectorNilUsesHelmValues: false + scrapeConfigSelectorNilUsesHelmValues: false + # prometheus 挂载持久化存储 + storageSpec: + volumeClaimTemplate: + spec: + storageClassName: # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 10Gi + + # 子 chart 镜像加速 + kube-state-metrics: + image: + registry: k8s.mirror.nju.edu.cn + ``` + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls grafana-general-tls --key nginx.key --cert nginx.pem -n monitor + ``` + +5. 安装 + + ```bash + helm install kube-prometheus-stack -f kube-prometheus-stack-values.yaml \ + prometheus-community/kube-prometheus-stack -n monitor + ``` + + > 访问 Grafana 面板,初始账号 `admin` 密码是 `prom-operator` + +## 卸载 + +1. 卸载 kube-prometheus-stack + + ```bash + helm uninstall kube-prometheus-stack -n monitor + ``` + +2. 删除 secret + + ```bash + kubectl delete secret grafana-general-tls -n monitor + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace monitor + ``` + +## 问题记录 + +- 当我使用 Nginx 代理 Grafana 访问地址为 `https://localhost/monitor` 时, Grafana 无法被正常代理 + + **解决方法:** + + 1. 编辑 configmap + + ```bash + kubectl edit configmap kube-prometheus-stack-grafana -n monitor + ``` + + 2. 在 `[server]` 下方添加或更改 + + ```bash + domain = 'localhost' + root_url=%(protocol)s://%(domain)s:%(http_port)s/monitor + ``` + + +- RKE1 部署的 Kubernetes 集群无法监控到 Kubernetes 组件部分组件, 需要添加额外 yaml 参数, 内容如下 + + [RKE1-Kubernetes-values参数](https://gitee.com/offends/Kubernetes/blob/main/File/Yaml/rke-kube-prometheus-stack-values.yaml) + + 配置完成后发现无法连接, 原因是组件监控未对外开放访问, 按照文档操作开放后解决 + + [Rancher组件公开Metrics访问](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/Rancher/Rancher%E7%BB%84%E4%BB%B6%E5%85%AC%E5%BC%80Metrics%E8%AE%BF%E9%97%AE.md) + + diff --git a/Helm/Helm部署Locust.md b/Helm/Helm部署Locust.md new file mode 100644 index 0000000..21b7dd1 --- /dev/null +++ b/Helm/Helm部署Locust.md @@ -0,0 +1,74 @@ +> 本文作者:丁辉 + +# Helm部署Locust + +[官方文档](https://locust.io/) + +[Github仓库](https://github.com/locustio/locust) + +[官方推荐的HelmChart仓库](https://github.com/deliveryhero/helm-charts/tree/master/stable/locust) + +## 介绍 + +Locust 是一个开源的性能测试工具,它主要用于测试网站或网络应用程序的负载能力和性能。与其他性能测试工具不同,Locust 使用 Python 语言进行测试脚本的编写,这使得它更灵活和易于使用。 + +## 开始部署 + +1. 添加 Helm 仓库 + + ```bash + helm repo add deliveryhero https://charts.deliveryhero.io/ + helm repo update + ``` + +2. 编写 values.yaml 文件 + + ```bash + vi locust-values.yaml + ``` + + 内容如下 + + ```yaml + ingress: + enabled: true + className: "" + hosts: + - host: # 域名 + pathType: ImplementationSpecific + path: / + tls: + - secretName: locust-tls + hosts: + - # 域名 + + image: + repository: locustio/locust + tag: latest + ``` + +3. 安装 + + ```bash + helm install locust \ + --namespace locust \ + --create-namespace \ + deliveryhero/locust \ + -f locust-values.yaml + ``` + +## 卸载 + +1. 卸载 Locust + + ```bash + helm uninstall locust -n locust + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns locust + ``` + + \ No newline at end of file diff --git a/Helm/Helm部署Loki-Stack.md b/Helm/Helm部署Loki-Stack.md new file mode 100644 index 0000000..3b75a99 --- /dev/null +++ b/Helm/Helm部署Loki-Stack.md @@ -0,0 +1,59 @@ +> 本文作者:丁辉 + +# Helm部署Loki-Stack + +## 介绍 + +**Loki-Stack 是一个日志聚合和分析平台,它包括了 Loki、Promtail、Grafana 等组件**。Loki-Stack 旨在为 Kubernetes 环境提供一套完整的日志管理系统,通过这些组件的协同工作,可以实现对容器日志的收集、存储、查询和可视化。 + +## 开始部署 + +[Github仓库](https://github.com/grafana/helm-charts/tree/main/charts/loki-stack) + +1. 添加仓库 + + ```bash + helm repo add grafana https://grafana.github.io/helm-charts + helm repo update + ``` + +2. 编辑 values.yaml + + ```bash + vi loki-values.yaml + ``` + + 内容如下 + + ```yaml + test_pod: + enabled: false + + # 开启监控 + loki: + serviceMonitor: + enabled: true + ``` + +3. 部署 + + ```bash + helm install loki-stack grafana/loki-stack \ + -n monitor --create-namespace \ + -f loki-values.yaml + ``` + + +## 卸载 + +1. 卸载 loki-stack + + ```bash + helm uninstall loki-stack -n monitor + ``` + +2. 删除命名空间 + + ```bash + kubectl delete namespace monitor + ``` diff --git a/Helm/Helm部署Memos.md b/Helm/Helm部署Memos.md new file mode 100644 index 0000000..55d66d7 --- /dev/null +++ b/Helm/Helm部署Memos.md @@ -0,0 +1,93 @@ +> 本文作者:丁辉 + +# Helm部署Memos + +## 介绍 + +**Memos是一个开源且免费的自托管知识库,它允许用户自由写作并使用SQLite数据库文件进行数据存储**。 + +## 开始部署 + +[Github仓库](https://github.com/usememos/memos) [Github-Helm仓库](https://github.com/usememos/helm) + +1. 拉取 Helm chart + + ```bash + git clone https://github.com/usememos/helm.git + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace memos + ``` + +3. 编辑 values.yaml + + ```bash + vi memos-values.yaml + ``` + + 内容如下 + + ```yaml + # 配置镜像加速 + image: + repo: ghcr.nju.edu.cn + + # 开启持久化存储 + persistence: + enabled: true + storageClass: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + + # 开启 ingress 对外访问 + ingress: + enabled: true + className: "" # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + hosts: + - host: # 域名 + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - # 域名 + secretName: memos-tls + ``` + +4. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls memos-tls --key nginx.key --cert nginx.pem -n memos + ``` + +5. 部署 + + ```bash + helm install memos ./helm -f memos-values.yaml -n memos + ``` + +## 卸载 + +1. 卸载 memos + + ```bash + helm uninstall memos -n memos + ``` + +2. 删除 secret + + ```bash + kubectl delete secret memos-tls -n memos + ``` + +3. 删除命名空间 + + ```bash + kubectl delete namespace memos + ``` + + + diff --git a/Helm/Helm部署Metrics-Server.md b/Helm/Helm部署Metrics-Server.md new file mode 100644 index 0000000..d4511c9 --- /dev/null +++ b/Helm/Helm部署Metrics-Server.md @@ -0,0 +1,65 @@ +> 本文作者:丁辉 + +# Helm部署Metrics-Server + +## 介绍 + +**Metrics-Server 是一个 Kubernetes 插件,用于聚合和收集集群中与资源使用情况相关的指标数据**。它通过 Kubelet 的 API 获取各节点和容器的资源使用情况,为 Kubernetes 的自动资源管理和水平 Pod 自动扩展提供数据支持。 + +## 开始部署 + +[官方文档](https://kubernetes-sigs.github.io/metrics-server/) + +1. 添加 Metrics-Server Helm 仓库 + + ```bash + helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/ + helm repo update + ``` + +2. 编辑模版文件 + + ```bash + vi metrics-server-values.yaml + ``` + + 内容如下 + + ```yaml + # 配置镜像加速 + image: + repository: registry.aliyuncs.com/google_containers/metrics-server + args: + - --kubelet-insecure-tls + + # 开启 ServiceMonitor + metrics: + enabled: true + serviceMonitor: + enabled: true + ``` + + **参数解释** + + | 参数 | 描述 | + | :----------------------------------------------------------: | :--------------------------------------------------------: | + | `--cert-dir=/tmp` | Metrics Server 使用的证书目录。 | + | `--secure-port=4443` | Metrics Server 监听的安全端口号。 | + | `--kubelet-insecure-tls` | 是否跳过与 kubelet 通信时的 TLS 证书验证。 | + | `--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname` | Metrics Server 与 kubelet 通信时首选的节点地址类型。 | + | `--metric-resolution=15s` | 生成度量数据的分辨率(间隔),这里设置为每 15 秒生成一次。 | + +3. 部署 + + ```bash + helm install metrics-server metrics-server/metrics-server \ + --namespace monitor -f metrics-server-values.yaml + ``` + + +## 卸载 + +```bash +helm uninstall metrics-server -n monitor +``` + diff --git a/Helm/Helm部署Minio-Operator.md b/Helm/Helm部署Minio-Operator.md new file mode 100644 index 0000000..952a560 --- /dev/null +++ b/Helm/Helm部署Minio-Operator.md @@ -0,0 +1,165 @@ +> 本文作者:丁辉 + +# Helm部署Minio-Operator + +> 文档写于 2024年08月02日 ,因为 Minio-Operator 官方近期在改动 Helm 部署的内容,可能未来就无法使用此文档来部署了,特此记录提示。 + +## 介绍 + +MinIO 是一种高性能的分布式对象存储服务,可以在多种环境中部署,包括私有云、公有云以及混合云。MinIO 提供了与 Amazon S3 兼容的 API,这使其成为在各种云原生应用中处理大规模数据的理想选择。在 Kubernetes 上部署 MinIO 时,通常会使用 MinIO Operator 和 MinIO Tenant 来简化和自动化管理过程。 + + + +**MinIO Operator** 是一个 Kubernetes 自定义控制器,用于自动化 MinIO 实例的部署和管理。它使用 Kubernetes 自定义资源定义(CRD)来管理 MinIO 集群的生命周期。Operator 模式允许开发者将运维逻辑封装成代码,这样就可以自动处理例如部署、扩展、升级、备份等任务。 + +**主要特性包括:** + +- **自动化部署**:自动化部署 MinIO 集群,包括设置网络、存储、节点分配等。 +- **高可用性**:确保部署的 MinIO 集群具有高可用性配置,包括跨区域或跨数据中心的数据复制。 +- **缩放和升级**:支持无缝的缩放和升级操作,不中断服务地增加存储容量或更新 MinIO 版本。 +- **监控和日志**:与 Kubernetes 监控系统(如 Prometheus)和日志系统(如 Fluentd)集成,提供实时监控和日志收集。 + + + +**MinIO Tenant ** 是MinIO 在 Kubernetes 中的部署实例,代表一个逻辑上隔离的 MinIO 存储集群。在 MinIO Operator 的管理下,每个 Tenant 作为一个独立的 MinIO 集群运行,拥有自己的存储、用户和策略管理。 + +**主要特性包括:** + +- **资源隔离**:每个 Tenant 可以配置独立的资源(CPU、内存、存储),保证不同 Tenant 之间的操作不会相互影响。 +- **独立管理**:每个 Tenant 都可以独立管理,包括用户权限、存储桶和数据访问策略。 +- **安全性**:支持与 Kubernetes 的安全特性集成,如 RBAC、TLS 加密通信和秘密管理。 +- **灵活配置**:可以根据需要配置数据的复制和冗余策略,优化性能和成本。 + + + +**结合使用 MinIO Operator 和 MinIO Tenant** + +将 MinIO Operator 和 MinIO Tenant 结合使用,可以在 Kubernetes 上有效地部署、管理和扩展企业级的对象存储解决方案。Operator 负责管理和维护 MinIO 集群的基础设施,而 Tenant 提供了操作的逻辑隔离和资源封装。这种模式特别适合那些需要在 Kubernetes 环境中部署大规模、高可用性和高安全性对象存储服务的企业和应用。通过自动化的管理和监控,企业可以确保其数据存储服务既高效又稳定,同时减少人工干预和操作错误的风险。 + +[Github仓库](https://github.com/minio/operator/tree/master) + +[官方Minio-Operator部署文档](https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-operator-helm.html#overview) [官方Minio-Tenant部署文档](https://min.io/docs/minio/kubernetes/upstream/operations/install-deploy-manage/deploy-minio-tenant-helm.html#overview) + +## 开始部署 + +| 主机 | 访问地址(示例) | 对应内部Service地址 | +| :----------: | :---------------: | :-----------------: | +| Minio-Tenant | minio-hl.com | minio-hl:9000 | +| Minio-Tenant | minio-console.com | minio-console:9090 | + +1. 添加 Helm 仓库 + + ```bash + helm repo add minio-operator https://operator.min.io/ + helm repo update + ``` + +2. 安装 Operator + + ```bash + helm install minio-operator \ + --namespace minio-operator \ + --create-namespace \ + --set operator.replicaCount=2 \ + minio-operator/operator + ``` + +3. 编辑 Tenant values.yaml + + ```bash + vi minio-tenant-values.yaml + ``` + + 内容如下 + + ```yaml + ingress: + api: + enabled: true + tls: + - hosts: + - minio-hl.com + secretName: minio-hl-tls + host: minio-hl.com + console: + enabled: true + tls: + - hosts: + - minio-console.com + secretName: minio-console-tls + host: minio-console.com + + secrets: + name: minio-env-configuration + accessKey: minio + secretKey: minio123 + existingSecret: + name: enabled + + tenant: + name: minio + storageClassName: + configuration: + name: minio-env-configuration + certificate: + requestAutoCert: false + env: + - name: MINIO_SERVER_URL + value: "http://minio-hl.com" + - name: MINIO_STORAGE_CLASS_STANDARD + value: "EC:4" + pools: + - servers: 4 + name: pool-0 + volumesPerServer: 4 + size: 10Gi + ``` + + **变量解释** + + - `MINIO_SERVER_URL`:用于指定MinIO Share功能反馈的URL中的地址。可以通过此地址下载MinIO中的文件。 + - `MINIO_STORAGE_CLASS_STANDARD`:默认值EC:4,此参数可不修改。如果为了提高数据可用性,可以提高EC的值。但是同样会减少实际可用空间。简单来说这就是设置数据冗余的比例。如果需要配置 Pools-Servers为1,则不配置次变量。[官方文档-纠删码基础知识](https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html) + +4. 安装 Tenant + + ```bash + helm install minio-tenant \ + --namespace minio-tenant \ + --create-namespace \ + minio-operator/tenant \ + -f minio-tenant-values.yaml + ``` + +5. 访问 + + > 地址:minio-console.com + > + > 账户密码:minio/minio123 + +## 卸载 + +1. 卸载 Minio-Tenant + + ```bash + helm uninstall minio-tenant -n minio-tenant + ``` + +2. 卸载 Minio-Operator + + ```bash + helm uninstall minio-operator -n minio-operator + ``` + +3. 删除 Minio-Tenant 命名空间 + + ```bash + kubectl delete ns minio-tenant + ``` + +4. 删除 Minio-Operator 命名空间 + + ```bash + kubectl delete ns minio-operator + ``` + + diff --git a/Helm/Helm部署Minio.md b/Helm/Helm部署Minio.md new file mode 100644 index 0000000..92296cf --- /dev/null +++ b/Helm/Helm部署Minio.md @@ -0,0 +1,164 @@ +> 本文作者:丁辉 + +# Helm 部署 Minio + +## 介绍 + +**Minio 是一个高性能、开源的云存储和对象存储服务器,适用于任何规模的应用**。 + +## 开始部署 + +[官方仓库](https://github.com/minio/minio/tree/master/helm/minio) + +1. 添加仓库 + + ```bash + helm repo add minio https://charts.min.io/ + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace minio + ``` + +3. 编写 Yaml 文件 + + ```bash + vi minio-values.yaml + ``` + + 内容如下 + + ```yaml + # 开启 ingress 对外访问 + consoleIngress: + enabled: true + ingressClassName: # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "1024m" # 调整文件上传允许传输大小 + path: / + hosts: + - # 域名 + tls: + - secretName: minio-tls + hosts: + - # 域名 + + # 配置镜像加速 + image: + repository: quay.io/minio/minio + tag: latest + pullPolicy: IfNotPresent + + # 配置 Minio 用户密码 + rootUser: "填写账户" + rootPassword: "填写密码" + replicas: 1 + + # 开启持久化存储 + persistence: + enabled: true + storageClass: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + + # 独立部署模式 + mode: standalone + resources: + requests: + memory: 512Mi + + # 指定分享访问地址 + environment: + MINIO_SERVER_URL: "https://域名:9000" + ``` + +4. 创建 Nginx 证书 secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls minio-tls --key nginx.key --cert nginx.pem -n minio + ``` + +5. 安装 + + ```bash + helm install --namespace minio minio minio/minio -f minio-values.yaml + ``` + +6. 下载 Nginx 配置文件 + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Conf/minio-nginx-default.conf + ``` + +7. 编辑 Dockerfile + + ```dockerfile + cat > Dockerfile < 2025-08-25 在新版 Minio 当中软件页面异常干净,特此记录常用命令 + +[请参考](https://gitee.com/offends/Linux/blob/main/Docs/Minio-Mc%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8.md) diff --git a/Helm/Helm部署Minio替代品RustFS.md b/Helm/Helm部署Minio替代品RustFS.md new file mode 100644 index 0000000..8d0ffc2 --- /dev/null +++ b/Helm/Helm部署Minio替代品RustFS.md @@ -0,0 +1,106 @@ +> 本文作者:丁辉 + +# Helm部署Minio替代品RustFS + +[官方仓库](https://github.com/rustfs/rustfs/tree/main/helm) + +## 安装 RustFS 集群 + +1. 添加 Helm 仓库 + + ```bash + helm repo add rustfs https://charts.rustfs.com + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create ns rustfs + ``` + +3. 配置 Ingress 证书(这一步需要在安装前执行,否则 Helm 无法正确配置 Tls 参数) + + ```bash + kubectl create secret tls rustfs-tls --key nginx.key --cert nginx.pem -n rustfs + ``` + +4. 下载 rustfs-values.yaml 文件 + + - 单节点部署 + + [查看文件内容](https://gitee.com/offends/Kubernetes/blob/main/File/Yaml/rustfs-values-standalone.yaml) (根据自己情况修改) + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/rustfs-values-standalone.yaml + ``` + + - 集群部署 + + [查看文件内容](https://gitee.com/offends/Kubernetes/blob/main/File/Yaml/rustfs-values-distributed.yaml) (根据自己情况修改) + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/rustfs-values-distributed.yaml + ``` + + 配置节点标签 + + ```bash + kubectl label node ${node} rustfs="true" + ``` + +5. 安装 RustFS 集群 + + - 单节点部署 + + ```bash + helm install \ + rustfs-cluster rustfs/rustfs \ + --namespace rustfs \ + --create-namespace \ + -f rustfs-values-standalone.yaml + ``` + + - 集群部署 + + ```bash + helm install \ + rustfs-cluster rustfs/rustfs \ + --namespace rustfs \ + --create-namespace \ + -f rustfs-values-distributed.yaml + ``` + +6. 访问页面 + + 访问地址:rustfs.example.com + + 账号密码:rustfsadmin/rustfsadmin + +## 卸载 + +1. 卸载 RustFS 集群 + + ```bash + helm uninstall rustfs-cluster -n rustfs + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns rustfs + ``` + +3. 清理 Pvc 资源(生产环境慎重考虑) + + ```bash + kubectl delete pvc -n rustfs --all + ``` + + +## 数据迁移工具 + +数据迁移实现 Minio > RustFS + +- [Rclone官网](https://rclone.org/) +- [Mc官网](https://github.com/minio/mc) \ No newline at end of file diff --git a/Helm/Helm部署Mysql.md b/Helm/Helm部署Mysql.md new file mode 100644 index 0000000..ca5a780 --- /dev/null +++ b/Helm/Helm部署Mysql.md @@ -0,0 +1,52 @@ +> 本文作者:丁辉 + +# Helm部署Mysql + +## 介绍 + +**MySQL是一个流行的开源关系型数据库管理系统(RDBMS),由瑞典公司MySQL AB开发,现属于Oracle公司的一款产品**。它以高性能、易用性和对多种语言的支持而闻名,是构建Web应用和服务的首选数据库之一。 + +## 开始部署 + +1. 添加仓库 + + ```bash + helm repo add bitnami https://charts.bitnami.com/bitnami + helm repo update + ``` + +2. 编写 values.yaml 文件 + + ```bash + vi mysql-values.yaml + ``` + + 内容如下 + + ```yaml + global: + storageClass: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + auth: + rootPassword: "Root123456" + defaultAuthenticationPlugin: "mysql_native_password" + # 开启监控 + metrics: + enabled: true + serviceMonitor: + enabled: true + ``` + +3. 开始部署 + + ```bash + helm install mysql bitnami/mysql \ + --namespace mysql --create-namespace \ + -f mysql-values.yaml + ``` + +## 卸载 + +```bash +helm uninstall mysql -n mysql +``` + diff --git a/Helm/Helm部署NVIDIA-K8s-Device-Plugin.md b/Helm/Helm部署NVIDIA-K8s-Device-Plugin.md new file mode 100644 index 0000000..d0457d6 --- /dev/null +++ b/Helm/Helm部署NVIDIA-K8s-Device-Plugin.md @@ -0,0 +1,175 @@ +> 本文作者:丁辉 + +# Helm部署NVIDIA-K8s-Device-Plugin插件 + +## 介绍 + +**NVIDIA-K8s-Device-Plugin 是一个用于在 Kubernetes 环境中管理和配置 NVIDIA GPU 设备的插件**。这个插件允许集群中的容器应用与 GPU 进行通信和交互,从而能够利用 GPU 的强大计算能力来执行高性能计算任务。 + +## GPU容器化基础环境准备(必做) + +[请查看此文档](https://gitee.com/offends/Kubernetes/blob/main/GPU/%E5%AE%B9%E5%99%A8%E4%BD%BF%E7%94%A8GPU.md) + +## 开始部署 + +[Github仓库](https://github.com/NVIDIA/k8s-device-plugin) + +1. 添加仓库 + + ```bash + helm repo add nvdp https://nvidia.github.io/k8s-device-plugin + helm repo update + ``` + +2. GPU 节点添加标签 + + ```bash + kubectl label nodes ${node} nvidia.com/gpu.present=true + ``` + +3. 部署插件 + + ```bash + helm install nvidia-device-plugin nvdp/nvidia-device-plugin \ + --namespace nvidia-device-plugin \ + --create-namespace + ``` + +4. 检查 Node 是否已经识别到 NVIDIA + + ```bash + kubectl describe node ${node} | grep nvidia + ``` + + +## 卸载 + +卸载 nvidia-device-plugin + +```bash +helm uninstall nvidia-device-plugin -n nvidia-device-plugin +``` + +## 结果测试 + +1. 部署测试容器 + + ```bash + cat < 日志如下即代表 Pod 已可以使用 GPU 资源 + > + > ```bash + > [Vector addition of 50000 elements] + > Copy input data from the host memory to the CUDA device + > CUDA kernel launch with 196 blocks of 256 threads + > Copy output data from the CUDA device to the host memory + > Test PASSED + > Done + > ``` + +3. 清理测试 Pod + + ```bash + kubectl delete pod gpu-pod + ``` + +# GPU 共享访问 + +[官方文档](https://github.com/NVIDIA/k8s-device-plugin?tab=readme-ov-file#shared-access-to-gpus) + +NVIDIA 设备插件通过其配置文件中一组扩展选项允许 GPU 的超额分配。有两种可用的共享方式:时间切片和 MPS。 + +注意:时间切片和 MPS 的使用是互斥的。 + +- 在时间切片的情况下,CUDA 时间切片用于允许共享 GPU 的工作负载相互交错。然而,并未采取特殊措施来隔离从同一底层 GPU 获得副本的工作负载,每个工作负载都可以访问 GPU 内存,并在与其他所有工作负载相同的故障域中运行(这意味着如果一个工作负载崩溃,它们全部都会崩溃)。 + +- 在 MPS 的情况下,使用控制守护程序来管理对共享 GPU 的访问。与时间切片相反,MPS 进行空间分区,并允许内存和计算资源被显式地分区,并对每个工作负载强制执行这些限制。 + +## 使用 CUDA 时间切片 + +1. 创建配置文件 + + ```yaml + cat << EOF > /tmp/dp-config.yaml + version: v1 + sharing: + timeSlicing: + resources: + - name: nvidia.com/gpu + replicas: 10 + EOF + ``` + + > 如果将此配置应用于具有 8 个 GPU 的节点,则该插件现在将向`nvidia.com/gpu`Kubernetes 通告 80 个资源,而不是 8 个。 + +2. 更新 NVIDIA-K8s-Device-Plugin插件 + + ```bash + helm install nvidia-device-plugin nvdp/nvidia-device-plugin \ + --namespace nvidia-device-plugin \ + --create-namespace \ + --set-file config.map.config=/tmp/dp-config.yaml + ``` + + +## 使用 CUDA MPS + +> 目前在启用了 MIG 的设备上不支持使用 MPS 进行共享 +> + +1. 创建配置文件 + + ```yaml + cat << EOF > /tmp/dp-config.yaml + version: v1 + sharing: + mps: + resources: + - name: nvidia.com/gpu + replicas: 10 + EOF + ``` + + > 如果将此配置应用于具有 8 个 GPU 的节点,则该插件现在将向`nvidia.com/gpu`Kubernetes 通告 80 个资源,而不是 8 个。每块卡会按照 10 分之一的资源来作为 `nvidia.com/gpu: 1` 受用。 + +2. 添加节点标签 + + ```bash + kubectl label nodes ${node} nvidia.com/mps.capable=true + ``` + +3. 更新 NVIDIA-K8s-Device-Plugin插件 + + ```bash + helm upgrade nvidia-device-plugin nvdp/nvidia-device-plugin \ + --namespace nvidia-device-plugin \ + --create-namespace \ + --set-file config.map.config=/tmp/dp-config.yaml + ``` + + diff --git a/Helm/Helm部署Nexus.md b/Helm/Helm部署Nexus.md new file mode 100644 index 0000000..75b2047 --- /dev/null +++ b/Helm/Helm部署Nexus.md @@ -0,0 +1,153 @@ +> 本文作者:丁辉 + +# Helm部署Nexus + +[官网](https://www.sonatype.com/products/sonatype-nexus-repository) + +[Helm-Chart](https://github.com/sonatype/helm3-charts) + +[GitHub文档](https://github.com/sonatype/nxrm3-ha-repository/blob/main/nxrm-ha/README.md) + +## 介绍 + +**Nexus 是一个强大的仓库管理器,主要用于代理远程仓库及部署第三方构件**。它极大地简化了本地内部仓库的维护和外部仓库的访问。 + +> 目前推荐使用的是 **sonatype/nxrm-ha**, 用于部署高可用性的 Nexus Repository Manager。其最新版本确保了高可靠性和高可用性, 是企业级生产环境的理想选择。 + +## 开始部署(旧版) + +1. 添加仓库 + + ```bash + helm repo add sonatype https://sonatype.github.io/helm3-charts/ + helm repo update + ``` + +2. 编写 values.yaml + + ```bash + vi nexus-values.yaml + ``` + + 内容如下 + + ```yaml + # 对外访问地址 + ingress: + enabled: true + ingressClassName: # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "0" + hostPath: / + hostRepo: # 域名 + tls: + - secretName: nexus-tls + hosts: + - # 域名 + + # 修改镜像 TAG + image: + repository: sonatype/nexus3 + tag: latest + + # 配置存储 + persistence: + enabled: true + accessMode: ReadWriteOnce + storageClass: "" + storageSize: 20Gi + ``` + +3. 安装 + + ```bash + helm install \ + nexus sonatype/nexus-repository-manager \ + --namespace nexus \ + --create-namespace \ + -f nexus-values.yaml + ``` + +4. 查看密码 + + ```bash + kubectl exec `kubectl get pod -nnexus|grep nexus-nexus-repository-manager|grep Running|awk '{print $1}'` -nnexus cat /nexus-data/admin.password + ``` + +5. 登录 + + > admin/密码 + + 登录后修改密码 + +## 卸载 + +1. 卸载 Nexus + + ```bash + helm uninstall nexus -n nexus + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns nexus + ``` + + +## 开始部署(新版) + +> 新版应该是:`sonatype/nxrm-ha` 仓库,但是我验证时提示需要企业授权🤷所以先放一放吧。 + +**临时测试 values.yaml** + +```yaml +# 配置默认安装命名空间 +namespaces: + nexusNs: + enabled: true + name: "nexusrepo" + +# 调整资源限额 +statefulset: + replicaCount: 3 + container: + resources: + requests: + cpu: 8 + memory: "8Gi" + limits: + cpu: 16 + memory: "16Gi" + +secret: + # 存储数据库机密 + dbSecret: + enabled: true + db: + user: # 填写外部 Postgres 用户 + password: # 填写外部 Postgres 密码 + host: # 填写外部 Postgres 连接地址 + + # 存储初始 Nexus Repository 管理员密码机密 + nexusAdminSecret: + enabled: true + adminPassword: "" # 填写管理员密码 + + # 存储您的 Nexus Repository Pro 许可证 + license: + licenseSecret: + enabled: false + file: ./nx-license-file.lic + +# 配置存储 +storageClass: + enabled: false + name: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 +pvc: + accessModes: ReadWriteOnce + storage: 20Gi + volumeClaimTemplate: + enabled: true +``` + diff --git a/Helm/Helm部署Nginx-Ingress.md b/Helm/Helm部署Nginx-Ingress.md new file mode 100644 index 0000000..866b18b --- /dev/null +++ b/Helm/Helm部署Nginx-Ingress.md @@ -0,0 +1,50 @@ +> 本文作者:丁辉 +> + +# Helm 部署 Nginx-Ingress + +## 介绍 + +**Nginx-Ingress 是一个基于 Nginx 的 Ingress 控制器,用于管理外部访问 Kubernetes 集群内部服务的路由规则**。它实现了一个配置有规则的反向代理负载均衡器,能够将入站 HTTP 和 HTTPS 请求路由到集群内的相应服务上。 + +## 开始部署 + +[官方文档](https://kubernetes.github.io/ingress-nginx/deploy/) + +1. 添加仓库 + + ```bash + helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx + helm repo update + ``` + +2. 下载模版文件 + + [查看文件内容](https://gitee.com/offends/Kubernetes/blob/main/File/Yaml/ingress-values-hostnetwork.yaml) (根据自己情况修改) + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/ingress-values-hostnetwork.yaml + ``` + + **修改参数并保存** + +3. 配置节点标签 + + ```bash + kubectl label node ${node} ingress="true" + ``` + +4. 部署 + + ```bash + helm install ingress-nginx \ + ingress-nginx/ingress-nginx \ + -f ingress-values-hostnetwork.yaml + ``` + +## 卸载 + +```bash +helm uninstall ingress-nginx +``` + diff --git a/Helm/Helm部署Nightingale.md b/Helm/Helm部署Nightingale.md new file mode 100644 index 0000000..583b51a --- /dev/null +++ b/Helm/Helm部署Nightingale.md @@ -0,0 +1,222 @@ +> 本文作者:丁辉 + +# Helm部署Nightingale + +## 介绍 + +**Nightingale 是一个开源的监控工具,主要用于监控和分析电子病历系统(EMR)中的数据**。 + +## 开始部署 + +[官方文档](https://flashcat.cloud/docs/) + +[项目仓库](https://github.com/ccfos/nightingale) + +[Helm仓库地址](https://github.com/flashcatcloud/n9e-helm/tree/master) + +1. 克隆 Helm 仓库 + + ```bash + git clone https://github.com/flashcatcloud/n9e-helm.git + ``` + +2. 编写 values.yaml + + ```bash + vi n9e-values.yaml + ``` + + 内容如下 + + ```yaml + expose: + type: clusterIP # 使用 clusterIP + + externalURL: https://填写域名 # 改为自己的外部服务访问地址 + + # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + persistence: + enabled: true + persistentVolumeClaim: + database: + storageClass: "" + redis: + storageClass: "" + prometheus: + storageClass: "" + + categraf: + internal: + docker_socket: unix:///var/run/docker.sock # 如果您的kubernetes运行时是容器或其他,则清空此变量。 + + n9e: + internal: + image: + repository: flashcatcloud/nightingale + tag: latest # 使用最新版镜像 + ``` + +3. 部署 + + ```bash + helm install nightingale ./n9e-helm -n monitor -f n9e-values.yaml --create-namespace + ``` + +4. 创建 Nginx 证书 secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls n9e-tls --key nginx.key --cert nginx.pem -n monitor + ``` + +5. 编写 ingress 文件 + + ```bash + vi n9e-ingress.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: networking.k8s.io/v1 + kind: Ingress + metadata: + name: n9e-ingress + namespace: monitor + spec: + ingressClassName: nginx + rules: + - host: # 域名 + http: + paths: + - pathType: Prefix + backend: + service: + name: nightingale-center + port: + number: 80 + path: / + tls: + - hosts: + - # 域名 + secretName: n9e-tls + ``` + +6. 部署 ingress + + ```bash + kubectl apply -f n9e-ingress.yaml + ``` + +7. 访问验证 + + - 访问地址:https://hello.n9e.info + - 账户密码:root/root.2020 + +## 卸载 + +1. 删除 ingress + + ```bash + kubectl delete -f n9e-ingress.yaml + ``` + +2. 卸载 nightingale + + ```bash + helm uninstall nightingale -n monitor + ``` + +3. 删除 secret + + ```bash + kubectl delete secret n9e-tls -n monitor + ``` + +4. 删除命名空间 + + ```bash + kubectl delete namespace monitor + ``` + +# 开始使用 + +添加自带的 prometheus 数据源 + +登录系统后点击 > 系统配置 > 数据源 > 添加 + +- 数据源名称 + + ```bash + nightingale-prometheus + ``` + +- URL + + ```bash + http://nightingale-prometheus:9090 + ``` + +# 如何配置外部数据库 + +## 使用外部数据库 + +> 仅为示例 + +更改 values.yaml 内 database 配置 + +```bash +vi n9e-values.yaml +``` + +内容如下 + +```yml +database: + type: external # 改为 external + external: + host: "192.168.1.10" + port: "3306" + name: "n9e_v6" + username: "root" + password: "root" + sslmode: "disable" +``` + +## 配置外部 Reids 启动 + +> 指定 Reids 运行模式为独立模式或哨兵模式 +> +> 仅为示例 + +更改 values.yaml 内 redis 配置 + +```bash +vi n9e-values.yaml +``` + +内容如下 + +```yml +redis: + type: external + external: + addr: "192.168.1.10:6379" + sentinelMasterSet: "" + password: "" + mode: "standalone" # standalone/sentinel +``` + +# 问题记录 + +- 部署后 prometheus 无法抓取 n9e 监控目标 + + 原因是因为: + + 1. prometheus 配置 svc 地址错误 + 2. helm 模版格式错误 + + 解决方法: + + [本人提交记录](https://github.com/flashcatcloud/n9e-helm/pull/109) diff --git a/Helm/Helm部署OpenEBS存储.md b/Helm/Helm部署OpenEBS存储.md new file mode 100644 index 0000000..cd20969 --- /dev/null +++ b/Helm/Helm部署OpenEBS存储.md @@ -0,0 +1,109 @@ +> 本文作者:丁辉 + +# Helm部署OpenEBS存储 + +## 介绍 + +**OpenEBS是一种开源云原生存储解决方案,托管于CNCF基金会**。OpenEBS 管理每个 Kubernetes 节点上可用的存储,并使用该存储为有状态工作负载提供[本地](https://openebs.io/docs#local-volumes)或[分布式(也称为复制)](https://openebs.io/docs#replicated-volumes)持久卷。 + +## 安装 OpenEBS + +[官方主页](https://openebs.io/) + +[Github仓库](https://github.com/openebs/charts) + +[Helm安装文档](https://openebs.github.io/charts/) + +1. 添加仓库 + + ```bash + helm repo add openebs https://openebs.github.io/charts + helm repo update + ``` + +2. 编辑 values.yaml 文件 + + ```bash + vi openebs-values.yaml + ``` + + 内容如下 + + ```yaml + localprovisioner: + enableDeviceClass: false + ``` + +3. 安装 + + [Github-Charts参数文档](https://github.com/openebs/charts/tree/d-master/charts/openebs) + + ```bash + helm install openebs --namespace openebs openebs/openebs --create-namespace -f openebs-values.yaml + ``` + +4. 检查 storageclass + + ```bash + kubectl get sc + ``` + + > 存在 openebs-hostpath 则👌 + +5. 运行容器使用 openebs-hostpath 测试 + + [openebs-hostpath官方文档](https://openebs.io/docs/user-guides/localpv-hostpath) + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/openebs-pod.yaml + ``` + + > 容器启动后查看结果 + > + > ```bash + > kubectl exec hello-local-hostpath-pod -- cat /mnt/store/greet.txt + > ``` + > + > 卸载测试容器 + > + > ```bash + > kubectl delete -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/openebs-pod.yaml + > ``` + +## 设置 openebs-hostpath 为默认存储类 + +```bash +kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' +``` + +> 取消 openebs-hostpath 为默认存储类 +> +> ```bash +> kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}' +> ``` + +## 卸载 OpenEBS + +```bash +helm uninstall openebs -n openebs +``` + +# 问题记录 + +MountVolume.NewMounter initialization failed for volume "pvc-某某" : path "/var/openebs/local/pvc-某某" does not exist + +> 在将创建本地 PV 主机路径的节点上设置目录, 该目录将被称为 `BasePath` 默认位置是 `/var/openebs/local` + +- Rke1 集群配置 + + 修改 `cluster.yml` 文件, 后更新 rke 集群 + + ```yml + services: + kubelet: + extra_binds: + - /var/openebs/local:/var/openebs/local + ``` + + + diff --git a/Helm/Helm部署PrometheusAlert.md b/Helm/Helm部署PrometheusAlert.md new file mode 100644 index 0000000..cd79984 --- /dev/null +++ b/Helm/Helm部署PrometheusAlert.md @@ -0,0 +1,193 @@ +> 本文作者:丁辉 + +# Helm部署PrometheusAlert + +## 介绍 + +**PrometheusAlert 是一个开源的运维告警中心消息转发系统,它能够支持多种主流的监控系统、日志系统以及数据可视化系统**。PrometheusAlert 的设计宗旨是为了解决不同系统之间预警消息的有效传递问题,确保关键信息能够及时通知到相关人员。 + +## 开始部署 + +[官方文档](https://github.com/feiyu563/PrometheusAlert/blob/master/doc/readme/base-install.md) + +> 准备好 Mysql 数据库 +> +> 安装可查看如下文档 +> +> [Helm部署Mysql](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Mysql.md) + +| 服务名 | IP地址:端口 | 账户密码 | +| :-------------: | :--------------------------------------------: | :-----------------------------: | +| Mysql | 192.168.1.10:3306 | root/Root123456 | +| PrometheusAlert | prometheusalert.monitor.svc.cluster.local:8080 | prometheusalert/prometheusalert | + +1. 拉取代码 + + > v4.9 版本往上 Helm 部署 Bug 异常多,暂时还是推荐使用 v4.9 + + ```bash + git clone --branch v4.9 https://github.com/feiyu563/PrometheusAlert.git + cd PrometheusAlert/example/helm + ``` + +2. Mysql创建数据库 + + ```bash + CREATE DATABASE prometheusalert CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; + ``` + +3. 修改 app.conf 文件 + + ```bash + vi prometheusalert/config/app.conf + ``` + + 修改内容如下 + + ```bash + db_driver=mysql + db_host=mysql.mysql.svc.cluster.local + db_port=3306 + db_user=root + db_password=Root123456 + db_name=prometheusalert + # 开启飞书告警通道 + open-feishu=1 + ``` + + > 参考 [app.conf文件配置](https://gitee.com/offends/Kubernetes/blob/main/File/Conf/PrometheusAlert-App.conf) + +4. 编写 values.yaml 文件 + + ```bash + vi prometheusalert-values.yaml + ``` + + 内容如下 + + ```yaml + ingress: + enabled: true + hosts: + - host: # 域名 + paths: ["/"] + + tls: + - secretName: drone-tls + hosts: + - # 域名 + ``` + +5. 安装 + + ```bash + helm install prometheusalert ./prometheusalert \ + --namespace monitor --create-namespace \ + -f prometheusalert-values.yaml + ``` + +6. 通过 NodePort 或 Ingress 对外开放访问后登录密码为 + + 账号:prometheusalert + + 密码:prometheusalert + +## 卸载 + +```bash +helm uninstall prometheusalert -n monitor +``` + +# 配置飞书告警模版测试 + +打开PrometheusAlert web页面,进入菜单模版管理-->自定义模板-->添加模版 + +- **模版名称**:prometheus-fs + +- **模版类型**:飞书 + +- **模版用途**:Prometheus + +- **模版内容:** + + ```bash + {{- range $k, $v := .alerts -}} + {{- if eq $v.status "resolved" -}} + **告警恢复信息** + 事件名称: **{{ if $v.annotations.summary }}{{ $v.annotations.summary }}{{ else }}{{ $v.labels.alertname }}{{ end }}** + {{ if $v.status }}告警类型: {{$v.status}}{{ end }} + {{ if $v.labels.level }}告警级别: {{$v.labels.level}}{{ end }} + 开始时间: {{GetCSTtime $v.startsAt}} + 恢复时间: {{GetCSTtime $v.endsAt}} + {{ if $v.labels.instance }}主机地址: {{$v.labels.instance}}{{ end }} + {{ if $v.annotations.value }}当前值: {{$v.annotations.value}}{{ end }} + **事件回顾: {{$v.annotations.description}}** + {{- else -}} + **告警信息** + 事件名称: **{{ if $v.annotations.summary }}{{ $v.annotations.summary }}{{ else }}{{ $v.labels.alertname }}{{ end }}** + {{ if $v.status }}告警类型: {{$v.status}}{{- end }} + {{ if $v.labels.level }}告警级别: {{$v.labels.level}}{{ end }} + 开始时间: {{GetCSTtime $v.startsAt}} + {{ if $v.labels.instance }}主机地址: {{$v.labels.instance}}{{ end }} + {{ if $v.annotations.value }}触发值: {{$v.annotations.value}}{{ end }} + **事件详情: {{$v.annotations.description}}** + {{- end -}} + {{- end -}} + ``` + +- **消息协议JSON内容** + + ```json + { + "receiver": "webhook", + "status": "firing", + "alerts": [ + { + "status": "resolved", + "labels": { + "alertname": "HighCPUUsage", + "level": "warning", + "instance": "192.168.1.10:9100" + }, + "annotations": { + "summary": "CPU使用率过高", + "value": "95%", + "description": "CPU使用率持续超过阈值90%达5分钟" + }, + "startsAt": "2023-08-25T10:00:00Z", + "endsAt": "2023-08-25T10:05:00Z", + "generatorURL": "http://prometheus:9090/graph" + }, + { + "status": "firing", + "labels": { + "alertname": "DiskFull", + "level": "critical", + "instance": "192.168.1.11:9100" + }, + "annotations": { + "summary": "磁盘空间不足", + "value": "98%", + "description": "/data分区使用率超过95%" + }, + "startsAt": "2023-08-25T10:03:00Z", + "endsAt": "0001-01-01T00:00:00Z", + "generatorURL": "http://prometheus:9090/graph" + } + ], + "groupLabels": { + "alertname": "instance" + }, + "commonLabels": { + "job": "node_exporter" + }, + "commonAnnotations": {}, + "externalURL": "http://alertmanager:9093", + "version": "4", + "groupKey": "{}:{alertname=\"instance\"}" + } + ``` + +- 模板测试 + +- 模板保存 diff --git a/Helm/Helm部署Rook-Ceph.md b/Helm/Helm部署Rook-Ceph.md new file mode 100644 index 0000000..14979ae --- /dev/null +++ b/Helm/Helm部署Rook-Ceph.md @@ -0,0 +1,207 @@ +> 本文作者:丁辉 + +# Helm部署Rook-Ceph + +## 介绍 + +**Rook-Ceph 是一个开源的云原生存储编排器,旨在简化 Ceph 存储集群在 Kubernetes 环境中的部署和管理**。Rook-Ceph 将复杂的 Ceph 部署流程简化为易于在 Kubernetes 上实施的操作,使得 Ceph 集群能够无缝地与云原生环境集成。它利用 Kubernetes 的资源管理和调度能力,提供了一种高效且可扩展的方式来部署和管理存储解决方案。 + +## 基础准备 + +[Rook官方主页](https://rook.io/) + +| 节点名称 | IP | 存储盘 | +| :---------: | :----------: | :------: | +| ceph-node-1 | 192.168.1.10 | /dev/sdb | +| ceph-node-2 | 192.168.1.20 | /dev/sdb | +| ceph-node-3 | 192.168.1.30 | /dev/sdb | + +> 添加仓库 + +```bash +helm repo add rook-release https://charts.rook.io/release +helm repo update +``` + +## 部署Rook-Ceph-Operator + +1. 配置 values.yaml 文件 + + ```bash + vi rook-ceph-operator-values.yaml + ``` + + 内容如下 + + ```yaml + # 配置镜像加速 + csi: + cephcsi: + repository: quay.dockerproxy.com/cephcsi/cephcsi + + registrar: + repository: registry.aliyuncs.com/google_containers/csi-node-driver-registrar + + provisioner: + repository: registry.aliyuncs.com/google_containers/csi-provisioner + + snapshotter: + repository: registry.aliyuncs.com/google_containers/csi-snapshotter + + attacher: + repository: registry.aliyuncs.com/google_containers/csi-attacher + + resizer: + repository: registry.aliyuncs.com/google_containers/csi-resizer + ``` + +2. 部署 + + ```bash + helm install rook-ceph rook-release/rook-ceph \ + --namespace rook-ceph --create-namespace \ + -f rook-ceph-operator-values.yaml + ``` + +## 部署 Rook-Ceph-Cluster + +1. 配置 values.yaml 文件 + + ```bash + vi rook-ceph-cluster-values.yaml + ``` + + 内容如下 + + ```yaml + operatorNamespace: rook-ceph + + toolbox: + enabled: true + + cephClusterSpec: + storage: + useAllNodes: false # 关闭使用所有Node + useAllDevices: false # 关闭使用所有设备 + # 指定存储节点和磁盘 + nodes: + - name: "192.168.1.10" + devices: + - name: "sdb" + - name: "192.168.1.20" + devices: + - name: "sdb" + - name: "192.168.1.20" + devices: + - name: "sdb" + #- name: "192.168.1.100" + #deviceFilter: "^sd." # 过滤以 "sd." 开头的设备 + #- name: "nvme0" + #config: + #osdsPerDevice: "5" # 创建多个 OSD + #- name: "/dev/disk/XXXX-XXXX" # 指定实际设备文件的路径 + + # 开启监控面板 + dashboard: + enabled: true + ssl: false + + # 配置调度策略 + placement: + all: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: role + operator: In + values: + - storage-node + podAffinity: + podAntiAffinity: + topologySpreadConstraints: + tolerations: + - key: storage-node + operator: Exists + ``` + +2. Ceph节点添加标签 + + ```bash + kubectl label nodes {ceph-node-1,ceph-node-2,ceph-node-3} role=storage-node + ``` + +3. 部署 + + ```bash + helm install rook-ceph-cluster rook-release/rook-ceph-cluster \ + --namespace rook-ceph --create-namespace \ + -f rook-ceph-cluster-values.yaml + ``` + +4. 查看状态 + + ```bash + kubectl -n rook-ceph exec -it $(kubectl get pod -l app=rook-ceph-tools -n rook-ceph | awk '{print $1}' | grep -v NAME) bash + ``` + + 进入容器后查看 ceph 状态 + + ```bash + ceph -s + ``` + + > health: HEALTH_OK + +5. 查看密码登录 Dashboard + + ```bash + kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo + ``` + + > 账户:admin + +## 卸载 + +[集群清理文档](https://rook.io/docs/rook/latest-release/Storage-Configuration/ceph-teardown/#removing-the-cluster-crd-finalizer) + +1. 卸载 Rook-Ceph-Cluster + + ```bash + helm uninstall rook-ceph-cluster -n rook-ceph + ``` + +2. 卸载 Rook-Ceph-Operator + + ```bash + helm uninstall rook-ceph -n rook-ceph + ``` + +3. 删除 CRD 资源 + + ```bash + for CRD in $(kubectl get crd -n rook-ceph | awk '/ceph.rook.io/ {print $1}'); do + kubectl get -n rook-ceph "$CRD" -o name | \ + xargs -I {} kubectl patch -n rook-ceph {} --type merge -p '{"metadata":{"finalizers": []}}' + done + ``` + +4. 删除配置资源 + + ```bash + kubectl -n rook-ceph patch configmap rook-ceph-mon-endpoints --type merge -p '{"metadata":{"finalizers": []}}' + kubectl -n rook-ceph patch secrets rook-ceph-mon --type merge -p '{"metadata":{"finalizers": []}}' + ``` + +5. 删除命名空间 + + ```bash + kubectl delete ns rook-ceph + ``` + +6. 删除持久化目录 + + ```bash + rm -rf /var/lib/rook + ``` + diff --git a/Helm/Helm部署Shadowsocks-Rust.md b/Helm/Helm部署Shadowsocks-Rust.md new file mode 100644 index 0000000..8d1d459 --- /dev/null +++ b/Helm/Helm部署Shadowsocks-Rust.md @@ -0,0 +1,302 @@ +> 本文作者:丁辉 + +# Helm部署Shadowsocks-Rust + +[Github仓库](https://github.com/shadowsocks/shadowsocks-rust) [官网](https://shadowsocks.org/) + +## 介绍 + +`shadowsocks-rust` 是一个使用 Rust 编程语言实现的 Shadowsocks 协议,它提供了网络代理服务。与原始的 Shadowsocks 或基于 C 语言的 shadowsocks-libev 相比,shadowsocks-rust 的目标是提供更好的性能和更高的安全性。 + +- **使用 Rust 语言**:Rust 提供了内存安全性保证,这意味着使用 Rust 编写的程序在编译时就能排除很多可能的安全隐患,如缓冲区溢出等问题。 + +- **兼容性**:shadowsocks-rust 完全兼容原始 Shadowsocks 协议,这意味着它可以与其他使用 Shadowsocks 协议的客户端和服务器互操作。 + +- **支持多种加密算法**:它支持多种加密方式,包括但不限于 AES-256-GCM、ChaCha20-Poly1305 等,这些加密算法旨在确保传输的安全性。 + +- **跨平台支持**:shadowsocks-rust 可以运行在多种平台上,包括 Linux、macOS 和 Windows,这使得它在不同环境中都可以部署和使用。 + +- **性能**:由于 Rust 语言的高效性,shadowsocks-rust 在运行时通常表现出更低的延迟和更高的吞吐量。 + +- **开源项目**:作为一个开源项目,shadowsocks-rust 在 GitHub 上维护,允许社区贡献代码,同时用户可以自由地下载、修改和分发。 + +## 对外端口详解 + +- TCP端口 + + **TCP(Transmission Control Protocol)**:这是最常见的协议类型,用于大多数网络通信。Shadowsocks 默认使用 TCP 进行数据传输。大部分网络请求,如网页浏览、文件下载、邮件传输等,都使用 TCP 协议。 + +- UDP端口 + + **UDP(User Datagram Protocol)**:这是另一种协议,通常用于需要低延迟的应用,如视频流、实时游戏、语音通话等。UDP 不像 TCP 那样进行严格的数据校验和排序,因此在某些场景下可以提供更快的数据传输速率。 + +# 服务端开始安装 + +1. 克隆代码 + + ```bash + git clone https://github.com/shadowsocks/shadowsocks-rust.git + cd shadowsocks-rust + ``` + +2. 编写 values.yaml 文件 + + ```bash + vi shadowsocks-rust-values.yaml + ``` + + 内容如下 + + ```yaml + servers: + - server: "0.0.0.0" # 对外允许访问地址 + server_port: 8388 + service_port: 80 + password: "" # 填写你的密码 + method: "aes-256-gcm" # 加密方法 + timeout: 60 + fast_open: true # 允许数据在 TCP 三次握手的过程中开始传输 + mode: "tcp_and_udp" # 同时支持 TCP 和 UDP + + # 使用本地网络 + hostPort: true + ``` + +3. 安装 + + ```bash + helm install \ + shadowsocks-rust ./k8s/chart \ + --namespace shadowsocks \ + --create-namespace \ + -f shadowsocks-rust-values.yaml + ``` + +## 卸载 + +1. 卸载 shadowsocks-rust + + ```bash + helm uninstall shadowsocks-rust -n shadowsocks + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns shadowsocks + ``` + +# Kubernetes客户端安装 + +| 需要连接的服务端IP(假设) | 连接密码(假设) | +| :----------------------: | :------------: | +| 192.168.1.10 | 123456 | + +1. 创建命名空间 + + ```bash + kubectl create namespace shadowsocks + ``` + +2. 下载 Yaml 文件 + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/shadowsocks-rust-client.yaml + ``` + +3. 修改 Yaml 文件 + + ```bash + vi shadowsocks-rust-client.yaml + ``` + + 修改如下内容 + + ```yaml + apiVersion: v1 + kind: ConfigMap + metadata: + name: shadowsocks-rust-client + namespace: shadowsocks + data: + config.json: | + { + "server": "192.168.1.10", + "server_port": 8388, + "password": "123456", + "local_address": "0.0.0.0", + "local_port": 1080, + "timeout": 300, + "method": "aes-256-gcm" + } + ``` + +4. 安装 + + ```bash + kubectl apply -f shadowsocks-rust-client.yaml + ``` + +5. 访问地址 + + - 容器内代理访问地址为 + + ```bash + shadowsocks-rust-client.shadowsocks.svc.cluster.local:1080 + ``` + + - 本地访问代理为 + + ```bash + $(kubectl get svc -n shadowsocks | grep shadowsocks-rust-client | awk '{print $3}'):1080 + ``` + +## 卸载 + +1. 卸载 shadowsocks-rust + + ```bash + kubectl delete -f shadowsocks-rust-client.yaml + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns shadowsocks + ``` + +# Windows或Mac客户端安装 + +客户端安装 + +[Github](https://github.com/shadowsocks/ShadowsocksX-NG) + +打开软件 > 点击服务器 > 服务器设置 > 点击左下角 + 号 > 添加服务器信息并确定 + +# Kubernetes客户端开启对外访问,供其他终端使用 + +1. 部署 Nginx 代理 + + ```bash + vi nginx.conf + ``` + + 内容如下 + + ```nginx + user nginx; + worker_processes auto; + error_log /var/log/nginx/error.log warn; + pid /var/run/nginx.pid; + + events { + worker_connections 1024; + use epoll; + multi_accept on; + } + + stream { + server { + listen 1080 reuseport; + proxy_pass shadowsocks:1080; + proxy_connect_timeout 10s; + proxy_timeout 1h; + proxy_buffer_size 16k; + tcp_nodelay on; + } + } + ``` + +2. 编辑 Dockerfile + + ```bash + vi Dockerfile + ``` + + 内容如下 + + ```dockerfile + FROM nginx:alpine-slim + + RUN rm /etc/nginx/conf.d/default.conf + + COPY nginx.conf /etc/nginx/nginx.conf + + EXPOSE 1080 + ``` + +3. 构建镜像 + + ```bash + docker build -t shadowsocks-gateway:v1.0 . + ``` + +4. 查看 Minio SVC IP + + ```bash + kubectl get svc -n shadowsocks | grep shadowsocks-rust-client | awk '{print $3}' + ``` + +5. 编辑 Yaml + + ```bash + vi shadowsocks-gateway.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: apps/v1 + kind: Deployment + metadata: + namespace: shadowsocks + name: shadowsocks-gateway + labels: + app: shadowsocks-gateway + spec: + selector: + matchLabels: + app: shadowsocks-gateway + template: + metadata: + labels: + app: shadowsocks-gateway + spec: + hostNetwork: true + hostAliases: + - ip: "" #填入 Shadowsocks SVC IP + hostnames: + - "shadowsocks" + containers: + - name: shadowsocks-gateway + image: shadowsocks-gateway:v1.0 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 1080 + protocol: TCP + readinessProbe: + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 3 + successThreshold: 1 + tcpSocket: + port: 1080 + timeoutSeconds: 10 + resources: + limits: + memory: 512Mi + ``` + +6. 部署 + + ```bash + kubectl apply -f shadowsocks-gateway.yaml + ``` + +7. 代理地址为 Nginx服务器地址:1080 + +8. 测试 + + ```bash + curl --socks5-hostname 服务器地址:1080 https://www.google.com + ``` diff --git a/Helm/Helm部署Traffic-Manager.md b/Helm/Helm部署Traffic-Manager.md new file mode 100644 index 0000000..e96c494 --- /dev/null +++ b/Helm/Helm部署Traffic-Manager.md @@ -0,0 +1,60 @@ +> 本文作者:丁辉 + +# Helm部署Traffic-Manager + +## 介绍 + +**Traffic Manager是一种流量分配系统,用于在网络中管理和控制数据流**。Traffic Manager常被用于监控网络状态、优化数据流向以及确保高效可靠的数据传输。在多种应用场景中,例如内容分发网络(CDN)、云服务负载均衡、企业网络管理等,Traffic Manager扮演着至关重要的角色。 + +## 开始部署 + +[官方主页](https://www.getambassador.io/docs) [官方文档](https://www.getambassador.io/docs/telepresence/latest/install/manager#install-the-traffic-manager-with-helm) + +1. 添加仓库 + + ```bash + helm repo add datawire https://app.getambassador.io + helm repo update + ``` + +2. 创建命名空间 + + ```bash + kubectl create namespace ambassador + ``` + +3. 安装 + + ```bash + helm install traffic-manager --namespace ambassador datawire/telepresence + ``` + +4. 本地开启链接验证 + + ```bash + telepresence connect + ``` + + > **测试 Ping 通任何一个容器 Service 代表成功** + > + > 取消链接 + > + > ```bash + > telepresence quit + > ``` + +## 卸载 + +1. 卸载 traffic-manager + + ```bash + helm uninstall traffic-manager -n ambassador + ``` + +2. 删除命名空间 + + ```bash + kubectl delete namespace ambassador + ``` + + \ No newline at end of file diff --git a/Helm/Helm部署Trivy.md b/Helm/Helm部署Trivy.md new file mode 100644 index 0000000..e1ae9cb --- /dev/null +++ b/Helm/Helm部署Trivy.md @@ -0,0 +1,117 @@ +> 本文作者:丁辉 + +# Helm部署Trivy + +## 介绍 + +**Trivy 是一个简单而全面的容器漏洞扫描程序,适用于持续集成(CI)环境**。它能够检测操作系统包和应用程序依赖的漏洞,帮助开发人员确保镜像的安全性。 + +## 开始部署 + +[官网](https://trivy.dev/) [Github仓库](https://github.com/aquasecurity/trivy-operator) + +[Github-trivy-java-db](https://github.com/aquasecurity/trivy-java-db) [Github-trivy-db](https://github.com/aquasecurity/trivy-db) [数据同步ORAS软件](https://oras.land/docs/quickstart/) + +[Trivy-db离线数据下载地址](https://github.com/aquasecurity/trivy/releases) [Trivy-db使用介绍](https://github.com/aquasecurity/trivy-db/pkgs/container/trivy-db) + +1. 添加仓库 + + ```bash + helm repo add aqua https://aquasecurity.github.io/helm-charts/ + helm repo update + ``` + +2. 配置 values.yaml 文件 + + ```bash + vi trivy-operator-values.yaml + ``` + + 内容如下 + + ```yaml + # 配置代理 + global: + image: + registry: "ghcr.dockerproxy.com" + + # 开启监控自动发现 + serviceMonitor: + enabled: true + + # 配置不需要扫描的命令空间 + excludeNamespaces: "kube-system,trivy-system" + + operator: + # 指定访问私有容器镜像仓库所需的认证信息 + privateRegistryScanSecretsNames: + trivy-system: docker-registry-secret + # 是否使用内置的 Trivy 服务器(要使用外部 Trivy 服务器则配置为"false") + builtInTrivyServer: true + + trivy: + # 配置镜像仓库检测 + insecureRegistries: + rbdRegistry: index.docker.io # 填写镜像仓库地址,替换为自己的仓库地址 + storageClassName: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + mode: ClientServer # 指定了 Trivy 的运行模式为客户端模式 + serverURL: "https://trivy.trivy:4975" # 指定了 Trivy 服务器的访问 URL + # 配置国内 Trivy 数据库 + dbRegistry: "ccr.ccs.tencentyun.com" + dbRepository: "inative/trivy-db" + javaDbRegistry: "ccr.ccs.tencentyun.com" + javaDbRepository: "inative/trivy-java-db" + ``` + +3. 创建镜像仓库 Secret + + ```bash + kubectl create secret docker-registry docker-registry-secret \ + --docker-server=index.docker.io \ + --docker-username=YOUR_USERNAME \ + --docker-password=YOUR_PASSWORD \ + --namespace=trivy-system + ``` + +4. 部署 + + ```bash + helm install trivy-operator aqua/trivy-operator \ + --namespace trivy-system \ + --create-namespace \ + -f trivy-operator-values.yaml + ``` + +5. 验证查看报告 + + - 查询漏洞报告 + + > 报告主要关注的是集群中的容器镜像或其他资源是否包含已知的安全漏洞。 + + ```bash + kubectl get vulnerabilityreports -o wide + ``` + + - 查询配置审计报告 + + > 报告专注于集群资源的配置安全,检查 Kubernetes 资源的配置设置是否遵守安全最佳实践。 + + ```bash + kubectl get configauditreports -o wide + ``` + +## 卸载 + +1. 卸载 trivy-operator + + ```bash + helm uninstall trivy-operator -n trivy-system + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns trivy-system + ``` + + diff --git a/Helm/Helm部署UptimeKuma.md b/Helm/Helm部署UptimeKuma.md new file mode 100644 index 0000000..8d5407d --- /dev/null +++ b/Helm/Helm部署UptimeKuma.md @@ -0,0 +1,72 @@ +> 本文作者:丁辉 + +# Helm部署UptimeKuma + +## 介绍 + +UptimeKuma是一个开源的、自托管的监控工具,专为追踪网站、应用程序和网络服务的可用性而设计。它提供了一个简洁的用户界面,使用户能够轻松地监控他们的在线服务的状态,并接收关于其状态变化的实时更新。 + +## 开始部署 + +[Github仓库](https://github.com/louislam/uptime-kuma) + +官方推荐(非官方):[Helm仓库](https://github.com/k3rnelpan1c-dev/uptime-kuma-helm) + +1. 添加 Helm 仓库 + + ```bash + helm repo add k3 https://k3rnelpan1c-dev.github.io/uptime-kuma-helm/ + helm repo update + ``` + +2. 编写 values.yaml 文件 + + ```bash + vi uptime-kuma-values.yaml + ``` + + 内容如下 + + ```yaml + ingress: + enabled: true + className: "" # 指定 ingress 控制器, 不指定则需要集群内存在默认的 ingress 控制器 + hosts: + - host: # 域名 + paths: + - path: / + pathType: ImplementationSpecific + tls: + - secretName: uptime-kuma-tls + hosts: + - # 域名 + + # 配置持久化存储 + persistence: + enabled: true + sizeLimit: 4Gi + storageClass: "" # 指定存储卷, 不指定则需要集群内存在默认的存储卷 + ``` + +3. 创建Nginx证书secret + + > cert为.pem和.crt文件都可以 + + ```bash + kubectl create secret tls uptime-kuma-tls --key nginx.key --cert nginx.pem -n monitor + ``` + +4. 安装 + + ```bash + helm install uptime-kuma k3/uptime-kuma \ + -n monitor \ + -f uptime-kuma-values.yaml + ``` + +## 卸载 + +```bash +helm uninstall uptime-kuma -n monitor +``` + diff --git a/Helm/Helm部署Velero.md b/Helm/Helm部署Velero.md new file mode 100644 index 0000000..64cdbd5 --- /dev/null +++ b/Helm/Helm部署Velero.md @@ -0,0 +1,201 @@ +> 本文作者:丁辉 + +# Helm部署Velero + +[官方文档](https://velero.io/docs/) [Velero客户端下载](https://github.com/vmware-tanzu/velero/releases) [Helm仓库介绍页](https://vmware-tanzu.github.io/helm-charts/) [Helm-Github仓库](https://github.com/vmware-tanzu/helm-charts/blob/main/charts/velero/README.md) + +## 开始部署 + +> 准备 Minio 存储 +> +> 示例: +> +> - 存储地址为:192.168.1.10 +> - 账户/密码:minioadmin/minioadmin +> - 存储桶:backup + +1. 添加 Helm 仓库 + + ```bash + helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts + helm repo update + ``` + +2. 编辑 values.yaml + + ```bash + vi velero-values.yaml + ``` + + 内容如下 + + ```yaml + cleanUpCRDs: true + + snapshotsEnabled: false + + initContainers: + - name: velero-plugin-for-aws + image: velero/velero-plugin-for-aws:latest + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /target + name: plugins + + configuration: + backupStorageLocation: + - name: default + provider: aws + bucket: backup + accessMode: ReadWrite + config: + region: minio-region + s3ForcePathStyle: true + s3Url: http://192.168.1.10:9000 + publicUrl: http://192.168.1.10:9000 + + credentials: + useSecret: true + secretContents: + cloud: | + [default] + aws_access_key_id=minioadmin + aws_secret_access_key=minioadmin + + # 配置定时备份任务 disabled 改为 false 即可启动定时任务(默认关闭) + # 特别参数解释: + # useOwnerReferencesInBackup: 设置为 false,表示在备份时不使用资源的 owner references 来确定哪些关联资源应该包括在备份中。如果设置为 true,Velero 会根据 Kubernetes 的 owner references 备份会自动包括关联资源。 + # ttl: 设置备份的生存时间(Time To Live)。 + # storageLocation: 指定备份数据存储的位置。 + # includedNamespaces: 列出要包括在备份中的命名空间。 + # includedResources: 指定备份中要包括的资源类型。 + # excludedResources: 指定不包括在备份中的资源类型。 + schedules: + backup: + disabled: true + schedule: "*/1 * * * *" + useOwnerReferencesInBackup: false + template: + ttl: "240h" + storageLocation: default + includedNamespaces: + - default + includedResources: + - pv,pvc + excludedResources: + - pod + ``` + +3. 安装 + + ```bash + helm install velero vmware-tanzu/velero \ + --namespace velero --create-namespace \ + -f velero-values.yaml + ``` + +4. 下载客户端 + + ```bash + wget https://github.com/vmware-tanzu/velero/releases/download/v1.14.0/velero-v1.14.0-linux-amd64.tar.gz + ``` + +5. 解压文件 + + ```bash + tar -zxvf velero-v*-linux-amd64.tar.gz + ``` + +6. 移动客户端二进制文件到可执行目录 + + ```bash + mv velero-v*-linux-amd64/velero /usr/local/bin/ + ``` + +## 卸载 + +1. 卸载 velero + + ```bash + helm uninstall velero -n velero + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns velero + ``` + +# 基础命令 + +- 查看所有备份 + + ```bash + velero get backups + ``` + +- 备份整个集群 + + ```bash + velero backup create + ``` + + **基础参数** + + - 备份特定的命名空间 `--include-namespaces ` + - 备份特定的资源 `--include-resources ` + - 备份多个特定的资源 `--include-resources pv,pvc` + - 排除特定资源 `--exclude-resources ` + +- 恢复整个备份 + + ``` + velero restore create --from-backup + ``` + + - 恢复特定资源 `--include-resources ` + + - 恢复到特定命名空间 `--namespace-mappings old-namespace:` + + - 恢复时指定名称 + + > 这个名称有助于你后续追踪和管理这次特定的恢复操作 + + ```bash + velero restore create --from-backup + ``` + +- 删除备份 + + ```bash + velero backup delete + ``` + + > 删除操作时不想被提示确认,可以添加 `--confirm` 参数来直接删除 + +- 创建定时备份 + + > 使用 Cron 表达式(可用参数和 backup 一致) + + ```bash + velero schedule create --schedule="* * * * *" + ``` + + - 每 24 小时备份一次 `--schedule="@every 24h"` + - 每一分钟执行一次 `--schedule="1 * * * *"` + +- 查看全部定时备份 + + ```bash + velero get schedule + ``` + +- 删除定时备份 + + ```bash + velero schedule delete + ``` + + > 删除操作时不想被提示确认,可以添加 `--confirm` 参数来直接删除 + + diff --git a/Helm/N9e对接Kube-Prometheus-Stack.md b/Helm/N9e对接Kube-Prometheus-Stack.md new file mode 100644 index 0000000..8e73e15 --- /dev/null +++ b/Helm/N9e对接Kube-Prometheus-Stack.md @@ -0,0 +1,166 @@ +> 本文作者:丁辉 + +# N9e对接Kube-Prometheus-Stack + +## 更新Kube-Prometheus-Stack + +1. 编写 values.yaml + + ```bash + vi kube-prometheus-stack-values.yaml + ``` + +2. 内容如下 + + ```yaml + prometheusOperator: + admissionWebhooks: + patch: + enabled: true + image: + registry: registry.aliyuncs.com # 配置国内镜像加速 + repository: google_containers/kube-webhook-certgen + grafana: + enabled: false + alertmanager: + enabled: false + defaultRules: + create: false + # 这些设置表明所提及的选择器(规则、服务监视器、Pod 监视器和抓取配置)将具有独立的配置,而不会基于 Helm 图形值。(否则你的 ServiceMonitor 可能不会被自动发现) + prometheus: + prometheusSpec: + ruleSelectorNilUsesHelmValues: false + serviceMonitorSelectorNilUsesHelmValues: false + podMonitorSelectorNilUsesHelmValues: false + probeSelectorNilUsesHelmValues: false + scrapeConfigSelectorNilUsesHelmValues: false + # 服务器上启用 --web.enable-remote-write-receiver 标志 + enableRemoteWriteReceiver: true + # 启用 Prometheus 中被禁用的特性 + enableFeatures: + - remote-write-receiver + # 挂载持久化存储 + storageSpec: + volumeClaimTemplate: + spec: + # 选择默认的 sc 创建存储(我已在集群内准备 nfs-client) + storageClassName: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 10Gi # 根据自己的需求申请 pvc 大小 + # 挂载本地时区 + volumes: + - name: timezone + hostPath: + path: /usr/share/zoneinfo/Asia/Shanghai + volumeMounts: + - name: timezone + mountPath: /etc/localtime + readOnly: true + ``` + +3. 更新 + + ```bash + helm upgrade kube-prometheus-stack -f kube-prometheus-stack-values.yaml --set "kube-state-metrics.image.registry=k8s.dockerproxy.com" prometheus-community/kube-prometheus-stack -n monitor + ``` + +## 更新N9e + +1. 获取 nightingale-center svc + + ```bash + kubectl get svc nightingale-center -n monitor | grep -v NAME | awk '{print $3}' + ``` + +2. 编写 values.yaml + + ```bash + vi n9e-values.yaml + ``` + + 内容如下 + + ```yaml + expose: + type: clusterIP # 使用 clusterIP + + externalURL: https://hello.n9e.info # 改为自己的外部服务访问地址 + + persistence: + enabled: true + + categraf: + internal: + docker_socket: unix:///var/run/docker.sock # 如果您的kubernetes运行时是容器或其他,则清空此变量。 + + n9e: + internal: + image: + repository: flashcatcloud/nightingale + tag: latest # 使用最新版镜像 + + prometheus: + type: external + external: + host: "10.43.119.105" # 这里添加 nightingale-center svc + port: "9090" + username: "" + password: "" + podAnnotations: {} + ``` + +3. 更新 + + ```bash + helm upgrade nightingale ./n9e-helm -n monitor -f n9e-values.yaml + ``` + +4. 编写 ServiceMonitor + + ```bash + vi n9e-servicemonitor.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: monitoring.coreos.com/v1 + kind: ServiceMonitor + metadata: + name: n9e-center-monitor + namespace: monitor + spec: + endpoints: + - path: /metrics + port: port + namespaceSelector: + matchNames: + - monitor + selector: + matchLabels: + app: n9e + ``` + +5. 部署 + + ```bash + kubectl apply -f n9e-servicemonitor.yaml + ``` + +6. N9e 添加数据源 + + ```bash + http://kube-prometheus-stack-prometheus:9090/ + ``` + + +## 问题记录 + +> ``` +> WARNING writer/writer.go:129 push data with remote write:http://10.43.119.105:9090/api/v1/write request got status code: 400, response body: out of order sample +> WARNING writer/writer.go:79 post to http://10.43.119.105:9090/api/v1/write got error: push data with remote write:http://10.43.119.105:9090/api/v1/write request got status code: 400, response body: out of order sample +> ``` +> +> 上报数据 400, 暂时没有思路咋解决 \ No newline at end of file diff --git a/README.md b/README.md index e69de29..8e91b50 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,317 @@ +# Kubernetes 知识库 + +欢迎来到 Kubernetes 知识库!本仓库专注于 DevOps、云原生、AI Infra、GitOps 和自动化运维相关知识的整理与分享。 + +## 📚 目录 + +- [项目简介](#项目简介) +- [知识体系](#知识体系) +- [快速开始](#快速开始) +- [贡献指南](#贡献指南) +- [资源链接](#资源链接) + +## 🎯 项目简介 + +本仓库旨在构建一个系统化的 Kubernetes 和云原生技术知识库,涵盖从基础概念到高级实践的完整知识体系。我们相信知识的积累和分享是推动技术进步的重要力量。 + +### 核心价值 + +- **系统性**:知识结构清晰,从基础到进阶循序渐进 +- **实用性**:提供可直接使用的配置和脚本 +- **前瞻性**:涵盖最新的云原生和 AI Infra 技术趋势 +- **开放性**:欢迎社区贡献和反馈 + +## 🧠 知识体系 + +### 1. DevOps + +DevOps 是一种重视"软件开发人员(Dev)"和"IT运维技术人员(Ops)"之间沟通合作的文化、运动或惯例。 + +#### 核心概念 + +- **CI/CD**:持续集成与持续部署 +- **自动化**:基础设施即代码、自动化测试 +- **监控与日志**:全链路可观测性 +- **协作文化**:开发与运维的协同工作 + +#### 实践工具 + +- **Jenkins**:经典的 CI/CD 工具 + - [Jenkins Kubernetes 部署文档](./CICD/Jenkins/README.md) +- **GitLab CI**:集成化的 DevOps 平台 + - [GitLab Kubernetes 部署文档](./CICD/Gitlab/README.md) +- **Drone**:轻量级 CI/CD 平台 + - [Drone 配置与使用](./CICD/Drone/README.md) + +### 2. 云原生 + +云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。 + +#### 核心技术 + +- **容器化**:Docker、containerd +- **编排**:Kubernetes、Docker Swarm +- **服务网格**:Istio、Linkerd +- **声明式 API**:CRD、Operator 模式 + +#### 最佳实践 + +- **微服务架构**:服务拆分与通信 +- **不可变基础设施**:镜像构建与部署 +- **自愈能力**:健康检查、自动重启 +- **弹性伸缩**:HPA、VPA + +### 3. AI Infra + +AI 基础设施是为人工智能和机器学习工作负载提供支持的技术栈和架构。 + +#### 核心组件 + +- **计算资源**:GPU 集群、TPU、异构计算 +- **存储系统**:分布式存储、对象存储 +- **网络架构**:RDMA、高速互联 +- **调度平台**:Kubeflow、Ray、Volcano + +#### 应用场景 + +- **模型训练**:分布式训练、超参数调优 +- **模型服务**:模型推理、在线预测 +- **数据处理**:数据预处理、特征工程 +- **实验管理**:MLflow、实验追踪 + +### 4. GitOps + +GitOps 是一种用于云原生应用程序和基础设施的操作模型。 + +#### 核心原则 + +- **声明式**:整个系统都是声明式定义的 +- **版本化**:所有配置都存储在 Git 中 +- **自动化**:自动应用 Git 中的配置变更 +- **持续协调**:系统持续监控和同步状态 + +#### 实现工具 + +- **ArgoCD**:Kubernetes 原生的持续交付工具 +- **Flux**:GitOps 工具包的先行者 +- **Rancher Fleet**:企业级 GitOps 解决方案 +- **Jenkins X**:基于 Jenkins 的云原生 CI/CD + +#### 最佳实践 + +- **单一事实来源**:Git 作为配置的唯一来源 +- **分支策略**:Git Flow、GitHub Flow +- **审批流程**:Pull Request、代码审查 +- **回滚机制**:快速恢复到之前的状态 + +### 5. 自动化运维 + +自动化运维通过脚本和工具实现系统运维的自动化,提高效率和可靠性。 + +#### 核心领域 + +- **配置管理**:Ansible、Puppet、Chef + - [Ansible 配置管理文档](./CICD/Ansible/README.md) +- **容器编排**:Kubernetes、Docker Swarm +- **监控告警**:Prometheus、Grafana、AlertManager +- **日志分析**:ELK Stack、Loki +- **自动扩缩容**:HPA、Cluster Autoscaler + +#### 实践方法 + +- **基础设施即代码 (IaC)**:Terraform、Pulumi +- **混沌工程**:故障注入、韧性测试 +- **安全合规**:自动化扫描、合规检查 +- **成本优化**:资源利用率分析、自动调优 + +## 🚀 快速开始 + +### 环境准备 + +```bash +# 克隆仓库 +git clone https://gitea.offends.cn/Offends/Kubernetes.git +cd Kubernetes +``` + +### CI/CD 工具部署 + +#### Jenkins 部署 + +参考 [Jenkins Kubernetes 部署文档](./CICD/Jenkins/README.md) + +```bash +# 创建数据目录 +mkdir -p /data/jenkins + +# 应用部署配置 +kubectl apply -f jenkins-deployment.yaml + +# 获取初始密码 +kubectl exec -it $(kubectl get pod -l app=jenkins -o jsonpath='{.items[0].metadata.name}') -- cat /var/jenkins_home/secrets/initialAdminPassword +``` + +#### GitLab 部署 + +参考 [GitLab Kubernetes 部署文档](./CICD/Gitlab/README.md) + +```bash +# 创建数据目录 +mkdir -p /data/gitlab + +# 修改配置文件中的 IP 地址 +# 应用部署配置 +kubectl apply -f gitlab-deployment.yaml + +# 获取初始密码 +kubectl exec -it $(kubectl get pod -l app=gitlab -o jsonpath='{.items[0].metadata.name}') -- grep 'Password:' /etc/gitlab/initial_root_password +``` + +### GitHub Actions 配置 + +参考 [GitHub Actions 工作流](./CICD/Github/README.md) + +## 📖 学习路径 + +### 初级阶段 + +1. **基础概念** + - 理解 DevOps 核心理念 + - 学习容器化技术 (Docker) + - 掌握 Kubernetes 基础操作 + +2. **实践工具** + - 部署 Jenkins 或 GitLab + - 实现基本的 CI/CD 流程 + - 编写简单的自动化脚本 + +### 中级阶段 + +1. **进阶技术** + - 深入 Kubernetes 架构 + - 学习服务网格 + - 掌握监控和日志系统 + +2. **最佳实践** + - 实施基础设施即代码 + - 建立 GitOps 工作流 + - 优化系统性能和成本 + +### 高级阶段 + +1. **专业领域** + - AI Infra 架构设计 + - 大规模集群管理 + - 多云和混合云部署 + +2. **创新实践** + - 混沌工程实施 + - FinOps 成本优化 + - 可观测性体系建设 + +## 🤝 贡献指南 + +我们欢迎所有形式的贡献! + +### 如何贡献 + +1. **提交 Issue**:报告问题或提出建议 +2. **提交 PR**:改进文档或添加新内容 +3. **分享经验**:撰写技术文章或案例研究 +4. **代码贡献**:修复 bug 或添加新功能 + +### 贡献流程 + +```bash +# 1. Fork 本仓库 +# 2. 创建特性分支 +git checkout -b feature/your-feature + +# 3. 提交更改 +git commit -m 'Add some feature' + +# 4. 推送到分支 +git push origin feature/your-feature + +# 5. 提交 Pull Request +``` + +### 代码规范 + +- 遵循现有代码风格 +- 添加必要的文档和注释 +- 确保所有测试通过 +- 更新相关文档 + +## 📚 资源链接 + +### 官方文档 + +- [Kubernetes 官方文档](https://kubernetes.io/docs/) +- [Docker 官方文档](https://docs.docker.com/) +- [Jenkins 官方文档](https://www.jenkins.io/doc/) +- [GitLab 官方文档](https://docs.gitlab.com/) + +### 社区资源 + +- [CNCF 云原生全景图](https://landscape.cncf.io/) +- [Kubernetes 博客](https://kubernetes.io/blog/) +- [DevOps 路线图](https://roadmap.sh/devops) + +### 推荐书籍 + +- 《Kubernetes 权威指南》 +- 《云原生应用架构实践》 +- 《DevOps 实践指南》 +- 《GitOps 实战》 + +### 在线课程 + +- Kubernetes 官方认证培训 +- Cloud Native Computing Foundation (CNCF) 培训 +- 云原生实践工作坊 + +## 📊 项目统计 + +![Stars](https://img.shields.io/github/stars/Offends/Kubernetes?style=social) +![Forks](https://img.shields.io/github/forks/Offends/Kubernetes?style=social) +![Issues](https://img.shields.io/github/issues/Offends/Kubernetes) +![License](https://img.shields.io/github/license/Offends/Kubernetes) + +## 📝 更新日志 + +### v1.0.0 (2026-01-09) + +- ✨ 添加 Jenkins Kubernetes 部署文档 +- ✨ 添加 GitLab Kubernetes 部署文档 +- ✨ 初始化知识库结构 +- ✨ 添加 CI/CD 工具配置 +- 📝 编写项目 README 文档 + +## 📄 许可证 + +本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 + +## 💬 联系方式 + +- 📧 Email: [your-email@example.com](mailto:your-email@example.com) +- 🐙 GitHub: [@Offends](https://github.com/Offends) +- 💬 微信群: [加入讨论群](#) + +## 🙏 致谢 + +感谢所有为本项目做出贡献的开发者和使用者! + +特别感谢以下开源项目: + +- Kubernetes 社区 +- Docker 社区 +- Jenkins 社区 +- GitLab 社区 +- 所有云原生技术的贡献者 + +--- + +**⭐ 如果这个项目对你有帮助,请给一个 Star!** + +让我们一起构建更好的云原生技术生态! 🚀