commit 7a2f41e7d6c58b5f0037fb32f4342fb95fac4f40 Author: offends Date: Wed Aug 7 18:54:39 2024 +0800 synchronization diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..c79d05a --- /dev/null +++ b/.drone.yml @@ -0,0 +1,83 @@ +# kubectl create secret generic build-node-secret \ +# --from-literal=HOST="" \ +# --from-file=KEY=./*.pem \ +# --from-literal=PORT="22" \ +# --from-literal=PATH="" \ +# --namespace=drone + +kind: pipeline +type: kubernetes +name: MD BUILD + +trigger: + event: + include: + - custom + +workspace: + base: /drone/ + path: /drone/Kubernetes + +steps: +- name: 编译文档正文 + image: registry.cn-hangzhou.aliyuncs.com/offends/drone:ubuntu-22.04 + pull: if-not-exists + commands: + - ./builder.sh + - rm -rf ./builder.sh +- name: 生产环境部署 + image: appleboy/drone-scp + pull: if-not-exists + settings: + host: + from_secret: HOST + key: + from_secret: KEY + port: + from_secret: PORT + target: + from_secret: PATH + user: root + source: ../Kubernetes + overwrite: true +- name: 重启生产博客组件 + image: registry.cn-hangzhou.aliyuncs.com/offends/drone:ubuntu-22.04 + volumes: + - name: kubectl + path: /usr/local/bin + - name: config + path: /root/.kube + commands: + - /usr/local/bin/kubectl -n blog rollout restart deployment blog +volumes: +- name: kubectl + host: + path: /usr/local/bin + type: File +- name: config + host: + path: /root/.kube +--- +kind: secret +name: HOST +get: + path: build-node-secret + name: HOST +--- +kind: secret +name: KEY +get: + path: build-node-secret + name: KEY +--- +kind: secret +name: PORT +get: + path: build-node-secret + name: PORT +--- +kind: secret +name: PATH +get: + path: build-node-secret + name: PATH \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d4777d2 --- /dev/null +++ b/.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/.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 100755 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/Jenkins/README.md b/CICD/Jenkins/README.md new file mode 100644 index 0000000..658cadb --- /dev/null +++ b/CICD/Jenkins/README.md @@ -0,0 +1,6 @@ +* + +> 本文作者:丁辉 + +# Jenkins + diff --git a/Containerd/Docs/Ctr基础命令.md b/Containerd/Docs/Ctr基础命令.md new file mode 100644 index 0000000..870d0aa --- /dev/null +++ b/Containerd/Docs/Ctr基础命令.md @@ -0,0 +1,38 @@ +> 本文作者:丁辉 + +# 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 + ``` + + **更多参数** + + - `--hosts-dir "/etc/containerd/certs.d"`:指定了包含镜像仓库证书的目录的路径。 + + - `-k`:忽略 TLS 验证过程中的证书错误。 + - `--plain-http=true`:此选项指明在拉取镜像时使用未加密的 HTTP 协议,而不是加密的 HTTPS。 + +- 推送镜像 + + ```bash + ctr -n k8s.io image push -u <账户>:<密码> docker.io/library/nginx:latest + ``` + + **更多参数** + + - `--plain-http=true`:此选项指明在拉取镜像时使用未加密的 HTTP 协议,而不是加密的 HTTPS。 \ No newline at end of file diff --git a/Containerd/Docs/Nerdctl工具.md b/Containerd/Docs/Nerdctl工具.md new file mode 100644 index 0000000..327d5be --- /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/v1.7.6/nerdctl-1.7.6-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配置Apt源.md b/Containerd/Docs/Ubuntu部署Containerd配置Apt源.md new file mode 100644 index 0000000..7a4ac2f --- /dev/null +++ b/Containerd/Docs/Ubuntu部署Containerd配置Apt源.md @@ -0,0 +1,94 @@ +> 本文作者:丁辉 + +## Ubuntu部署Containerd配置Apt源 + +> 我部署 containerd 的时候遇到了各个版本 apt 源无法下载的问题,所以本次记录 Ubuntu 源配置步骤 + +### Ubuntu 22.04 + +```bash +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 jammy stable" +``` + +### Ubuntu 21.10 + +```bash +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt install apt-transport-https ca-certificates curl software-properties-common +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 +sudo apt-get install apt-transport-https ca-certificates curl software-properties-common +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" +``` + 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..54d698c --- /dev/null +++ b/Containerd/Docs/网络源安装Containerd.md @@ -0,0 +1,69 @@ +> 本文作者:丁辉 + +[Github安装文档](https://github.com/containerd/containerd/blob/main/docs/getting-started.md) + +[Containerd软件包](https://github.com/containerd/containerd/releases) [Runc软件包](https://github.com/opencontainers/runc/releases) [Cni插件包](https://github.com/containernetworking/plugins/releases) + +## 网络源安装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."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" + ``` + +5. 配置 crictl 配置文件 + + ```bash + curl -so /etc/crictl.yaml https://gitee.com/offends/Kubernetes/raw/main/Containerd/Files/crictl.yaml + ``` + +6. 启动 + + ```bash + systemctl enable containerd + systemctl start containerd + systemctl status containerd + ``` + diff --git a/Containerd/Files/crictl.yaml b/Containerd/Files/crictl.yaml new file mode 100644 index 0000000..7785eb7 --- /dev/null +++ b/Containerd/Files/crictl.yaml @@ -0,0 +1,4 @@ +runtime-endpoint: unix:///run/containerd/containerd.sock +image-endpoint: unix:///run/containerd/containerd.sock +timeout: 10 +debug: false \ No newline at end of file diff --git a/Containerd/README.md b/Containerd/README.md new file mode 100644 index 0000000..67a772c --- /dev/null +++ b/Containerd/README.md @@ -0,0 +1,66 @@ +> 本文作者:丁辉 + +# 安装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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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..e1f4ed3 --- /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..3b4f25a --- /dev/null +++ b/Docker/Dockerfile/Cache-Registry/README.md @@ -0,0 +1,51 @@ +> 本文作者:丁辉 + +# 镜像仓库代理服务 + +## 镜像仓库地址 + +| 站点名 | 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 5000:5000 \ + -v "/etc/localtime:/etc/localtime" \ + -v "/var/lib/registryproxy:/var/lib/registry" \ + -e PROXY_REMOTE_URL="" \ + --name=registryproxy \ + 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 100755 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/README.md b/Docker/Dockerfile/Centos/README.md new file mode 100644 index 0000000..892c8f8 --- /dev/null +++ b/Docker/Dockerfile/Centos/README.md @@ -0,0 +1,10 @@ +* + +> 本文作者:丁辉 + +# Centos 镜像构建 + +```bash +./build.sh +``` + diff --git a/Docker/Dockerfile/Centos/build.sh b/Docker/Dockerfile/Centos/build.sh new file mode 100755 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 100755 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-minio b/Docker/Dockerfile/Drone-Images/Dockerfile-minio new file mode 100644 index 0000000..20c8961 --- /dev/null +++ b/Docker/Dockerfile/Drone-Images/Dockerfile-minio @@ -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..52831b3 --- /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-minio | 容器内自带 Minio 客户端命令 | docker build -t 镜像名:标签 -f Dockerfile-minio . | +| 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 100755 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/Bitnami部署Mysql主从.md b/Docker/Docs/Bitnami部署Mysql主从.md new file mode 100644 index 0000000..94a7e58 --- /dev/null +++ b/Docker/Docs/Bitnami部署Mysql主从.md @@ -0,0 +1,56 @@ +> 本文作者:丁辉 + +# 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/Centos安装Docker.md b/Docker/Docs/Centos安装Docker.md new file mode 100644 index 0000000..f3fc262 --- /dev/null +++ b/Docker/Docs/Centos安装Docker.md @@ -0,0 +1,80 @@ +> 本文作者:丁辉 + +# 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 + ``` + + ```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 + > ``` + +3. 安装最新版 + + ```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 + > ``` + +4. 启动 + + ```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-fio磁盘读写测试.md b/Docker/Docs/Docker-fio磁盘读写测试.md new file mode 100644 index 0000000..1ff3a6b --- /dev/null +++ b/Docker/Docs/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/DockerHub上传双架构镜像.md b/Docker/Docs/DockerHub上传双架构镜像.md new file mode 100644 index 0000000..a58eaf7 --- /dev/null +++ b/Docker/Docs/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上下文配置.md b/Docker/Docs/Docker上下文配置.md new file mode 100644 index 0000000..ea4a137 --- /dev/null +++ b/Docker/Docs/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使用Caddy.md b/Docker/Docs/Docker使用Caddy.md new file mode 100644 index 0000000..b580ce8 --- /dev/null +++ b/Docker/Docs/Docker使用Caddy.md @@ -0,0 +1,39 @@ +> 本文作者:丁辉 + +# Docker使用Caddy + +[官网](https://caddyserver.com/) + +1. 启动 Caddy 容器 + + ```bash + docker run -itd \ + --restart always \ + -p 80:80 \ + -v $PWD/data/caddy:/etc/caddy/ \ + --name=caddy \ + caddy:latest + ``` + +2. 进入容器修改配置文件 + + ```bash + vi /etc/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使用GPU.md b/Docker/Docs/Docker使用GPU.md new file mode 100644 index 0000000..104523d --- /dev/null +++ b/Docker/Docs/Docker使用GPU.md @@ -0,0 +1,90 @@ +> 本文作者丁辉 + +# 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/Docker使用Tor实现匿名通信.md b/Docker/Docs/Docker使用Tor实现匿名通信.md new file mode 100644 index 0000000..04e7851 --- /dev/null +++ b/Docker/Docs/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常用命令及参数.md b/Docker/Docs/Docker常用命令及参数.md new file mode 100644 index 0000000..e8fba3d --- /dev/null +++ b/Docker/Docs/Docker常用命令及参数.md @@ -0,0 +1,117 @@ +> 本文作者:丁辉 + +# Docker基础命令 + +> 当然太简单的咱们就不记了,闭眼都会 + +## 基础命令 + +- 查看指定 Docker 镜像的历史记录,这个命令可以帮助你了解镜像是如何构建的 + + ```bash + docker image history app:v1 + ``` + +## Docker镜像批量打包 + +第一种 + +```bash +docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o images.tar +``` + +第二种 + +> 将需要统一打包的镜像写在文件内 + +```bash +cat > images.txt < 跳过警告提示:`--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常用配置文件配置.md b/Docker/Docs/Docker常用配置文件配置.md new file mode 100644 index 0000000..1cf3d58 --- /dev/null +++ b/Docker/Docs/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快速部署LobeChat.md b/Docker/Docs/Docker快速部署LobeChat.md new file mode 100644 index 0000000..6a132b4 --- /dev/null +++ b/Docker/Docs/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更改IP池.md b/Docker/Docs/Docker更改IP池.md new file mode 100644 index 0000000..68e316c --- /dev/null +++ b/Docker/Docs/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构建镜像.md b/Docker/Docs/Docker构建镜像.md new file mode 100644 index 0000000..b177f43 --- /dev/null +++ b/Docker/Docs/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部署Gitlab.md b/Docker/Docs/Docker部署Gitlab.md new file mode 100644 index 0000000..21a833c --- /dev/null +++ b/Docker/Docs/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部署JumpServer.md b/Docker/Docs/Docker部署JumpServer.md new file mode 100644 index 0000000..462c5f9 --- /dev/null +++ b/Docker/Docs/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部署Nacos.md b/Docker/Docs/Docker部署Nacos.md new file mode 100644 index 0000000..1c94198 --- /dev/null +++ b/Docker/Docs/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部署Node-exporter.md b/Docker/Docs/Docker部署Node-exporter.md new file mode 100644 index 0000000..f91967e --- /dev/null +++ b/Docker/Docs/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部署Portainer.md b/Docker/Docs/Docker部署Portainer.md new file mode 100644 index 0000000..d572a66 --- /dev/null +++ b/Docker/Docs/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部署Watchtower管理容器更新.md b/Docker/Docs/Docker部署Watchtower管理容器更新.md new file mode 100644 index 0000000..b73f729 --- /dev/null +++ b/Docker/Docs/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/Docker配合Mysql-Secrets使用.md b/Docker/Docs/Docker配合Mysql-Secrets使用.md new file mode 100644 index 0000000..ea18fe9 --- /dev/null +++ b/Docker/Docs/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配置2375端口.md b/Docker/Docs/Docker配置2375端口.md new file mode 100644 index 0000000..41dff3c --- /dev/null +++ b/Docker/Docs/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配置代理.md b/Docker/Docs/Docker配置代理.md new file mode 100644 index 0000000..5e02108 --- /dev/null +++ b/Docker/Docs/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配置守护进程.md b/Docker/Docs/Docker配置守护进程.md new file mode 100644 index 0000000..f78198b --- /dev/null +++ b/Docker/Docs/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镜像批量打包.md b/Docker/Docs/Docker镜像批量打包.md new file mode 100644 index 0000000..bcf93d3 --- /dev/null +++ b/Docker/Docs/Docker镜像批量打包.md @@ -0,0 +1,27 @@ +> 本文作者:丁辉 + +# Docker镜像批量打包 + +- 第一种 + + ```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/Mysql容器纳入System管理.md b/Docker/Docs/Mysql容器纳入System管理.md new file mode 100644 index 0000000..1c4d9b5 --- /dev/null +++ b/Docker/Docs/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/Nginx配置文件读取变量.md b/Docker/Docs/Nginx配置文件读取变量.md new file mode 100644 index 0000000..8ed9900 --- /dev/null +++ b/Docker/Docs/Nginx配置文件读取变量.md @@ -0,0 +1,57 @@ +> 本文作者:丁辉 +> + +# 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/OpeneUleros部署Docker.md b/Docker/Docs/OpeneUleros部署Docker.md new file mode 100644 index 0000000..1a1c2a1 --- /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..bb4d04b --- /dev/null +++ b/Docker/Docs/脚本安装Docker.md @@ -0,0 +1,17 @@ +> 本文作者:丁辉 + +# 脚本安装Docker + +- 官方源 + + ```bash + curl -fsSL https://get.docker.com | bash + ``` + +- 阿里源 + + ```bash + curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun + ``` + + \ 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..0ca2830 --- /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] +# 描述这个单元的作用是管理 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/local/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/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/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 100755 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 100755 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/File/Conf/PrometheusAlert-App.conf b/File/Conf/PrometheusAlert-App.conf new file mode 100644 index 0000000..b57eb9a --- /dev/null +++ b/File/Conf/PrometheusAlert-App.conf @@ -0,0 +1,268 @@ +#---------------------↓全局配置----------------------- +appname = PrometheusAlert +#登录用户名 +login_user=prometheusalert +#登录密码 +login_password=prometheusalert +#监听地址 +httpaddr = "0.0.0.0" +#监听端口 +httpport = 8080 +runmode = dev +#设置代理 proxy = http://123.123.123.123:8080 +proxy = +#开启JSON请求 +copyrequestbody = true +#告警消息标题 +title=PrometheusAlert +#链接到告警平台地址 +GraylogAlerturl=http://graylog.org +#钉钉告警 告警logo图标地址 +logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png +#钉钉告警 恢复logo图标地址 +rlogourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png +#短信告警级别(等于3就进行短信告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难 +messagelevel=3 +#电话告警级别(等于4就进行语音告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难 +phonecalllevel=4 +#默认拨打号码(页面测试短信和电话功能需要配置此项) +defaultphone=xxxxxxxx +#故障恢复是否启用电话通知0为关闭,1为开启 +phonecallresolved=0 +#是否前台输出file or console +logtype=file +#日志文件路径 +logpath=logs/prometheusalertcenter.log +#转换Prometheus,graylog告警消息的时区为CST时区(如默认已经是CST时区,请勿开启) +prometheus_cst_time=0 +#数据库驱动,支持sqlite3,mysql,postgres如使用mysql或postgres,请开启db_host,db_port,db_user,db_password,db_name的注释 +db_driver=mysql +db_host=mysql.mysql.svc.cluster.local +db_port=3306 +db_user=root +db_password=Root123456 +db_name=prometheusalert +#是否开启告警记录 0为关闭,1为开启 +AlertRecord=0 +#是否开启告警记录定时删除 0为关闭,1为开启 +RecordLive=0 +#告警记录定时删除周期,单位天 +RecordLiveDay=7 +# 是否将告警记录写入es7,0为关闭,1为开启 +alert_to_es=0 +# es地址,是[]string +# beego.Appconfig.Strings读取配置为[]string,使用";"而不是"," +to_es_url=http://localhost:9200 +# to_es_url=http://es1:9200;http://es2:9200;http://es3:9200 +# es用户和密码 +# to_es_user=username +# to_es_pwd=password + +#---------------------↓webhook----------------------- +#是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启 +open-dingding=0 +#默认钉钉机器人地址 +ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx +#是否开启 @所有人(0为关闭,1为开启) +dd_isatall=0 + +#是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启 +open-weixin=0 +#默认企业微信机器人地址 +wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx + +#是否开启飞书告警通道,可同时开始多个通道0为关闭,1为开启 +open-feishu=1 +#默认飞书机器人地址 +fsurl=https://open.feishu.cn/open-apis/bot/hook/xxxxxxxxx + +#---------------------↓腾讯云接口----------------------- +#是否开启腾讯云短信告警通道,可同时开始多个通道0为关闭,1为开启 +open-txdx=0 +#腾讯云短信接口key +TXY_DX_appkey=xxxxx +#腾讯云短信模版ID 腾讯云短信模版配置可参考 prometheus告警:{1} +TXY_DX_tpl_id=xxxxx +#腾讯云短信sdk app id +TXY_DX_sdkappid=xxxxx +#腾讯云短信签名 根据自己审核通过的签名来填写 +TXY_DX_sign=腾讯云 + +#是否开启腾讯云电话告警通道,可同时开始多个通道0为关闭,1为开启 +open-txdh=0 +#腾讯云电话接口key +TXY_DH_phonecallappkey=xxxxx +#腾讯云电话模版ID +TXY_DH_phonecalltpl_id=xxxxx +#腾讯云电话sdk app id +TXY_DH_phonecallsdkappid=xxxxx + +#---------------------↓华为云接口----------------------- +#是否开启华为云短信告警通道,可同时开始多个通道0为关闭,1为开启 +open-hwdx=0 +#华为云短信接口key +HWY_DX_APP_Key=xxxxxxxxxxxxxxxxxxxxxx +#华为云短信接口Secret +HWY_DX_APP_Secret=xxxxxxxxxxxxxxxxxxxxxx +#华为云APP接入地址(端口接口地址) +HWY_DX_APP_Url=https://rtcsms.cn-north-1.myhuaweicloud.com:10743 +#华为云短信模板ID +HWY_DX_Templateid=xxxxxxxxxxxxxxxxxxxxxx +#华为云签名名称,必须是已审核通过的,与模板类型一致的签名名称,按照自己的实际签名填写 +HWY_DX_Signature=华为云 +#华为云签名通道号 +HWY_DX_Sender=xxxxxxxxxx + +#---------------------↓阿里云接口----------------------- +#是否开启阿里云短信告警通道,可同时开始多个通道0为关闭,1为开启 +open-alydx=0 +#阿里云短信主账号AccessKey的ID +ALY_DX_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx +#阿里云短信接口密钥 +ALY_DX_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx +#阿里云短信签名名称 +ALY_DX_SignName=阿里云 +#阿里云短信模板ID +ALY_DX_Template=xxxxxxxxxxxxxxxxxxxxxx + +#是否开启阿里云电话告警通道,可同时开始多个通道0为关闭,1为开启 +open-alydh=0 +#阿里云电话主账号AccessKey的ID +ALY_DH_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx +#阿里云电话接口密钥 +ALY_DH_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx +#阿里云电话被叫显号,必须是已购买的号码 +ALY_DX_CalledShowNumber=xxxxxxxxx +#阿里云电话文本转语音(TTS)模板ID +ALY_DH_TtsCode=xxxxxxxx + +#---------------------↓容联云接口----------------------- +#是否开启容联云电话告警通道,可同时开始多个通道0为关闭,1为开启 +open-rlydh=0 +#容联云基础接口地址 +RLY_URL=https://app.cloopen.com:8883/2013-12-26/Accounts/ +#容联云后台SID +RLY_ACCOUNT_SID=xxxxxxxxxxx +#容联云api-token +RLY_ACCOUNT_TOKEN=xxxxxxxxxx +#容联云app_id +RLY_APP_ID=xxxxxxxxxxxxx + +#---------------------↓邮件配置----------------------- +#是否开启邮件 +open-email=0 +#邮件发件服务器地址 +Email_host=smtp.qq.com +#邮件发件服务器端口 +Email_port=465 +#邮件帐号 +Email_user=xxxxxxx@qq.com +#邮件密码 +Email_password=xxxxxx +#邮件标题 +Email_title=运维告警 +#默认发送邮箱 +Default_emails=xxxxx@qq.com,xxxxx@qq.com + +#---------------------↓七陌云接口----------------------- +#是否开启七陌短信告警通道,可同时开始多个通道0为关闭,1为开启 +open-7moordx=0 +#七陌账户ID +7MOOR_ACCOUNT_ID=Nxxx +#七陌账户APISecret +7MOOR_ACCOUNT_APISECRET=xxx +#七陌账户短信模板编号 +7MOOR_DX_TEMPLATENUM=n +#注意:七陌短信变量这里只用一个var1,在代码里写死了。 +#----------- +#是否开启七陌webcall语音通知告警通道,可同时开始多个通道0为关闭,1为开启 +open-7moordh=0 +#请在七陌平台添加虚拟服务号、文本节点 +#七陌账户webcall的虚拟服务号 +7MOOR_WEBCALL_SERVICENO=xxx +# 文本节点里被替换的变量,我配置的是text。如果被替换的变量不是text,请修改此配置 +7MOOR_WEBCALL_VOICE_VAR=text + +#---------------------↓telegram接口----------------------- +#是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启 +open-tg=0 +#tg机器人token +TG_TOKEN=xxxxx +#tg消息模式 个人消息或者频道消息 0为关闭(推送给个人),1为开启(推送给频道) +TG_MODE_CHAN=0 +#tg用户ID +TG_USERID=xxxxx +#tg频道name或者id, 频道name需要以@开始 +TG_CHANNAME=xxxxx +#tg api地址, 可以配置为代理地址 +#TG_API_PROXY="https://api.telegram.org/bot%s/%s" + +#---------------------↓workwechat接口----------------------- +#是否开启workwechat告警通道,可同时开始多个通道0为关闭,1为开启 +open-workwechat=0 +# 企业ID +WorkWechat_CropID=xxxxx +# 应用ID +WorkWechat_AgentID=xxxx +# 应用secret +WorkWechat_AgentSecret=xxxx +# 接受用户 +WorkWechat_ToUser="zhangsan|lisi" +# 接受部门 +WorkWechat_ToParty="ops|dev" +# 接受标签 +WorkWechat_ToTag="" +# 消息类型, 暂时只支持markdown +# WorkWechat_Msgtype = "markdown" + +#---------------------↓百度云接口----------------------- +#是否开启百度云短信告警通道,可同时开始多个通道0为关闭,1为开启 +open-baidudx=0 +#百度云短信接口AK(ACCESS_KEY_ID) +BDY_DX_AK=xxxxx +#百度云短信接口SK(SECRET_ACCESS_KEY) +BDY_DX_SK=xxxxx +#百度云短信ENDPOINT(ENDPOINT参数需要用指定区域的域名来进行定义,如服务所在区域为北京,则为) +BDY_DX_ENDPOINT=http://smsv3.bj.baidubce.com +#百度云短信模版ID,根据自己审核通过的模版来填写(模版支持一个参数code:如prometheus告警:{code}) +BDY_DX_TEMPLATE_ID=xxxxx +#百度云短信签名ID,根据自己审核通过的签名来填写 +TXY_DX_SIGNATURE_ID=xxxxx + +#---------------------↓百度Hi(如流)----------------------- +#是否开启百度Hi(如流)告警通道,可同时开始多个通道0为关闭,1为开启 +open-ruliu=0 +#默认百度Hi(如流)机器人地址 +BDRL_URL=https://api.im.baidu.com/api/msg/groupmsgsend?access_token=xxxxxxxxxxxxxx +#百度Hi(如流)群ID +BDRL_ID=123456 +#---------------------↓bark接口----------------------- +#是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启 +open-bark=0 +#bark默认地址, 建议自行部署bark-server +BARK_URL=https://api.day.app +#bark key, 多个key使用分割 +BARK_KEYS=xxxxx +# 复制, 推荐开启 +BARK_COPY=0 +# 历史记录保存,推荐开启 +BARK_ARCHIVE=0 +# 消息分组 +BARK_GROUP=PrometheusAlert + +#---------------------↓语音播报----------------------- +#语音播报需要配合语音播报插件才能使用 +#是否开启语音播报通道,0为关闭,1为开启 +open-voice=0 +VOICE_IP=127.0.0.1 +VOICE_PORT=9999 + +#---------------------↓飞书机器人应用----------------------- +#是否开启feishuapp告警通道,可同时开始多个通道0为关闭,1为开启 +open-feishuapp=0 +# APPID +FEISHU_APPID=cli_xxxxxxxxxxxxx +# APPSECRET +FEISHU_APPSECRET=xxxxxxxxxxxxxxxxxxxxxx +# 可填飞书 用户open_id、user_id、union_ids、部门open_department_id +AT_USER_ID="xxxxxxxx" \ No newline at end of file diff --git a/File/Conf/k8s.conf b/File/Conf/k8s.conf new file mode 100644 index 0000000..958b175 --- /dev/null +++ b/File/Conf/k8s.conf @@ -0,0 +1,4 @@ +net.bridge.bridge-nf-call-ip6tables = 1 +net.bridge.bridge-nf-call-iptables = 1 +net.ipv4.ip_forward = 1 +vm.swappiness = 0 \ No newline at end of file diff --git a/File/Json/Docker-Gpu-daemon.json b/File/Json/Docker-Gpu-daemon.json new file mode 100644 index 0000000..1042998 --- /dev/null +++ b/File/Json/Docker-Gpu-daemon.json @@ -0,0 +1,9 @@ +{ + "default-runtime": "nvidia", + "runtimes": { + "nvidia": { + "args": [], + "path": "nvidia-container-runtime" + } + } +} \ No newline at end of file diff --git a/File/Shell/cgroup.sh b/File/Shell/cgroup.sh new file mode 100755 index 0000000..769281e --- /dev/null +++ b/File/Shell/cgroup.sh @@ -0,0 +1,37 @@ +set -e +# 这句是告诉bash如何有任何语句执行结果不为ture,就应该退出。 + +if grep -v '^#' /etc/fstab | grep -q cgroup; then + echo 'cgroups mounted from fstab, not mounting /sys/fs/cgroup' + exit 0 +fi + +# kernel provides cgroups? +if [ ! -e /proc/cgroups ]; then + exit 0 +fi + +# 确保目录存在 +if [ ! -d /sys/fs/cgroup ]; then + exit 0 +fi + +# mount /sys/fs/cgroup if not already done +if ! mountpoint -q /sys/fs/cgroup; then + mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup +fi + +cd /sys/fs/cgroup + +# get/mount list of enabled cgroup controllers +for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do + mkdir -p $sys + if ! mountpoint -q $sys; then + if ! mount -n -t cgroup -o $sys cgroup $sys; then + rmdir $sys || true + fi + fi +done + + +exit 0 \ No newline at end of file diff --git a/File/Shell/clean-disk-ceph.sh b/File/Shell/clean-disk-ceph.sh new file mode 100755 index 0000000..81d029d --- /dev/null +++ b/File/Shell/clean-disk-ceph.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +DISK="/dev/vdc" #按需修改自己的盘符信息 + +# Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean) + +# You will have to run this step for all disks. +sgdisk --zap-all $DISK + +# Clean hdds with dd +dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync + +# Clean disks such as ssd with blkdiscard instead of dd +blkdiscard $DISK + +# These steps only have to be run once on each node +# If rook sets up osds using ceph-volume, teardown leaves some devices mapped that lock the disks. +ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove % + +# ceph-volume setup can leave ceph- directories in /dev and /dev/mapper (unnecessary clutter) +rm -rf /dev/ceph-* +rm -rf /dev/mapper/ceph--* + +# Inform the OS of partition table changes +partprobe $DISK \ No newline at end of file diff --git a/File/Shell/helm-install.sh b/File/Shell/helm-install.sh new file mode 100755 index 0000000..c7f3f95 --- /dev/null +++ b/File/Shell/helm-install.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +############################################################################################# +# 用途: 部署 Helm 工具脚本 +# 作者: 丁辉 +# 更新时间: 2024-03-26 +############################################################################################# + +function Init_env() { + # 定义颜色 + RED='\033[0;31m' + NC='\033[0m' + GREEN='\033[32m' + YELLOW='\033[33m' + + # 定义时间格式 + TIME="+%Y-%m-%d %H:%M:%S" + + # 定义函数 send_info + function SEND_INFO() { + info=$1 + echo -e "${GREEN}$(date "$TIME") INFO: $info${NC}" + } + + # 定义函数 send_warn + function SEND_WARN() { + warn=$1 + echo -e "${YELLOW}$(date "$TIME") WARN: $warn${NC}" + } + + # 定义函数 send_error + function SEND_ERROR() { + error=$1 + echo -e "${RED}$(date "$TIME") ERROR: $error${NC}" + } + + if [ $(arch) = "x86_64" ] || [ $(arch) = "amd64" ]; then + ARCH_TYPE=amd64 + elif [ $(arch) = "aarch64" ] || [ $(arch) = "arm64" ]; then + ARCH_TYPE=arm64 + elif [ $(arch) = "i386" ]; then + ARCH_TYPE=amd64 + fi +} + +function Install_helm() { + SEND_INFO "正在检查环境" + if ! which helm > /dev/null 2>&1; then + SEND_INFO "Helm 开始安装" + # 获取版本 + HELM_VERSION=`(curl https://mirrors.huaweicloud.com/helm/ | awk -F '"' '{print $2}' | grep -E '[0-9]+' | sort -rV | awk 'NR==1 {print}' | awk -F '/' '{print $1}')` + HELM_PACKAGE_VERSION=`(curl https://mirrors.huaweicloud.com/helm/$HELM_VERSION/ | awk -F '"' '{print $2}' | grep -E '[0-9]+' | grep $ARCH_TYPE | grep linux | awk 'NR==1 {print}')` + # 下载 Helm 安装包 + curl -O https://mirrors.huaweicloud.com/helm/$HELM_VERSION/$HELM_PACKAGE_VERSION + # 开始安装 + tar -zxvf helm-$HELM_VERSION-linux-$ARCH_TYPE.tar.gz > /dev/null 2>&1 + install -o root -g root -m 0755 linux-$ARCH_TYPE/helm /usr/local/bin/ + # 清理安装包 + rm -rf helm-$HELM_VERSION-linux-$ARCH_TYPE.tar.gz linux-$ARCH_TYPE + if ! which helm > /dev/null 2>&1; then + SEND_ERROR "Helm 安装失败" + exit 1 + else + VERSION=$(helm version | awk -F '"' '{print $2}') + SEND_INFO "Helm 安装成功, 版本: $VERSION" + fi + else + VERSION=$(helm version | awk -F '"' '{print $2}') + SEND_INFO "Helm 已存在, 版本: $VERSION" + fi +} + +function All() { + Init_env + Install_helm +} + +All \ No newline at end of file diff --git a/File/Shell/push-registry-images.sh b/File/Shell/push-registry-images.sh new file mode 100755 index 0000000..a7d4724 --- /dev/null +++ b/File/Shell/push-registry-images.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +############################################################################################# +# 用途: 上传 Registry 镜像脚本 +# 作者: 丁辉 +# 更新时间: 2024-06-29 +############################################################################################# + +# 镜像仓库基础信息配置 +REGISTRY_URL=registry.cn-hangzhou.aliyuncs.com +REGISTRY_USER=admin +REGISTRY_PASSWD=password +PULL_IMAGE=true # 是否开启拉取最新镜像 + +# 定义函数信息 +RED='\033[0;31m' +NC='\033[0m' +GREEN='\033[32m' +YELLOW='\033[33m' +TIME="+%Y-%m-%d %H:%M:%S" + +function SEND_INFO() { + info=$1 + echo -e "${GREEN}$(date "$TIME") INFO: $info${NC}" +} +function SEND_WARN() { + warn=$1 + echo -e "${YELLOW}$(date "$TIME") WARN: $warn${NC}" +} +function SEND_ERROR() { + error=$1 + echo -e "${RED}$(date "$TIME") ERROR: $error${NC}" +} +if [ -z "$1" ]; then + echo "请输入要上传的镜像名称,格式为: push-registry-images.sh NAME:TAG NAME:TAG" + exit 1 +fi + +SEND_INFO "正在登录镜像仓库 $REGISTRY_URL" +docker login $REGISTRY_URL -u $REGISTRY_USER -p $REGISTRY_PASSWD > /dev/null 2>&1 +if [ $? -eq 0 ]; then + SEND_INFO "登录镜像仓库成功" +else + SEND_ERROR "登录镜像仓库失败" + exit 1 +fi + +IMAGES_NAME=$@ + +for IMAGE_NAME in ${IMAGES_NAME[@]}; do + if [[ $PULL_IMAGE == "true" ]]; then + SEND_INFO "正在拉取镜像: $IMAGE_NAME" + docker pull $IMAGE_NAME + if [ $? -ne 0 ]; then + SEND_ERROR "拉取镜像 $IMAGE_NAME 失败" + exit 1 + fi + fi + docker tag $IMAGE_NAME $REGISTRY_URL/$IMAGE_NAME + docker push $REGISTRY_URL/$IMAGE_NAME + if [ $? -eq 0 ]; then + SEND_INFO "上传镜像 $IMAGE_NAME 成功" + else + SEND_ERROR "上传镜像 $IMAGE_NAME 失败" + fi +done \ No newline at end of file diff --git a/File/Shell/restore-rkestate-config.sh b/File/Shell/restore-rkestate-config.sh new file mode 100755 index 0000000..c58b9d6 --- /dev/null +++ b/File/Shell/restore-rkestate-config.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +############################################################################################# +# 用途: 恢复 rkestate 状态文件脚本 +# 作者: 丁辉 +# 更新时间: 2024-03-27 +############################################################################################# + +# 检测当前是否为 Master 节点 +if [ ! -f /etc/kubernetes/ssl/kubecfg-kube-node.yaml ]; then + echo "未检测到 /etc/kubernetes/ssl/kubecfg-kube-node.yaml 文件, 请登录 Master 节点执行脚本" + exit 1 +fi + +# 找回文件 +docker run --rm --net=host \ +-v $(docker inspect kubelet --format '{{ range .Mounts }}{{ if eq .Destination "/etc/kubernetes" }}{{ .Source }}{{ end }}{{ end }}')/ssl:/etc/kubernetes/ssl:ro \ +--entrypoint bash \ +rancher/rancher-agent:v2.2.2 \ +-c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml get configmap \ +-n kube-system full-cluster-state -o json | jq -r .data.\"full-cluster-state\" | jq -r .' > cluster.rkestate \ No newline at end of file diff --git a/File/Shell/restore-rkestate-kubeconfig.sh b/File/Shell/restore-rkestate-kubeconfig.sh new file mode 100755 index 0000000..efc7fac --- /dev/null +++ b/File/Shell/restore-rkestate-kubeconfig.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +help () +{ + echo ' ================================================================ ' + echo ' --master-ip: 指定Master节点IP,任意一个K8S Master节点IP即可。' + echo ' 使用示例:bash restore-kube-config.sh --master-ip=1.1.1.1 ' + echo ' ================================================================' +} + +case "$1" in + -h|--help) help; exit;; +esac + +if [[ $1 == '' ]];then + help; + exit; +fi + +CMDOPTS="$*" +for OPTS in $CMDOPTS; +do + key=$(echo ${OPTS} | awk -F"=" '{print $1}' ) + value=$(echo ${OPTS} | awk -F"=" '{print $2}' ) + case "$key" in + --master-ip) K8S_MASTER_NODE_IP=$value ;; + esac +done + +# 获取Rancher Agent镜像 +RANCHER_IMAGE=$( docker images --filter=label=io.cattle.agent=true |grep 'v2.' | \ +grep -v -E 'rc|alpha|' | head -n 1 | awk '{print $3}' ) + +if [ -d /opt/rke/etc/kubernetes/ssl ]; then + K8S_SSLDIR=/opt/rke/etc/kubernetes/ssl +else + K8S_SSLDIR=/etc/kubernetes/ssl +fi + +CHECK_CLUSTER_STATE_CONFIGMAP=$( docker run --rm --entrypoint bash --net=host \ +-v $K8S_SSLDIR:/etc/kubernetes/ssl:ro $RANCHER_IMAGE -c '\ +if kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \ +-n kube-system get configmap full-cluster-state | grep full-cluster-state > /dev/null; then \ +echo 'yes'; else echo 'no'; fi' ) + +if [ $CHECK_CLUSTER_STATE_CONFIGMAP != 'yes' ]; then + + docker run --rm --net=host \ + --entrypoint bash \ + -e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \ + -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \ + $RANCHER_IMAGE \ + -c '\ + kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \ + -n kube-system \ + get secret kube-admin -o jsonpath={.data.Config} | base64 --decode | \ + sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml + + if [ -s kubeconfig_admin.yaml ]; then + echo '恢复成功,执行以下命令测试:' + echo '' + echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes" + else + echo "kubeconfig恢复失败。" + fi + +else + + docker run --rm --entrypoint bash --net=host \ + -e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \ + -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \ + $RANCHER_IMAGE \ + -c '\ + kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \ + -n kube-system \ + get configmap full-cluster-state -o json | \ + jq -r .data.\"full-cluster-state\" | \ + jq -r .currentState.certificatesBundle.\"kube-admin\".config | \ + sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml + + if [ -s kubeconfig_admin.yaml ]; then + echo '恢复成功,执行以下命令测试:' + echo '' + echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes" + else + echo "kubeconfig恢复失败。" + fi +fi \ No newline at end of file diff --git a/File/Templates-Yaml/daemonset.yaml b/File/Templates-Yaml/daemonset.yaml new file mode 100644 index 0000000..6e30aa6 --- /dev/null +++ b/File/Templates-Yaml/daemonset.yaml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: daemonset-pods + namespace: default + labels: + name: daemonset-pods +spec: + selector: + matchLabels: + name: daemonset-pods + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + name: daemonset-pods + spec: + containers: + - name: nginx + image: nginx:latest + imagePullPolicy: IfNotPresent + ports: + - name: nginx-port + containerPort: 80 + protocol: TCP \ No newline at end of file diff --git a/File/Templates-Yaml/pv-hostpath.yaml b/File/Templates-Yaml/pv-hostpath.yaml new file mode 100644 index 0000000..695df52 --- /dev/null +++ b/File/Templates-Yaml/pv-hostpath.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: pv-hostpath +spec: + storageClassName: manual + capacity: + storage: 10Gi + accessModes: + - ReadWriteOnce + hostPath: + path: "/data" \ No newline at end of file diff --git a/File/Templates-Yaml/pvc-hostpath.yaml b/File/Templates-Yaml/pvc-hostpath.yaml new file mode 100644 index 0000000..0b9b3f3 --- /dev/null +++ b/File/Templates-Yaml/pvc-hostpath.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pvc-hostpath +spec: + storageClassName: manual + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + volumeName: pv-hostpath \ No newline at end of file diff --git a/File/Templates-Yaml/pvc-storageclass.yaml b/File/Templates-Yaml/pvc-storageclass.yaml new file mode 100644 index 0000000..ebfcf3b --- /dev/null +++ b/File/Templates-Yaml/pvc-storageclass.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi \ No newline at end of file diff --git a/File/Templates-Yaml/secret-env.yaml b/File/Templates-Yaml/secret-env.yaml new file mode 100644 index 0000000..d3e35aa --- /dev/null +++ b/File/Templates-Yaml/secret-env.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-env +stringData: + USER: root + PASSWORD: root \ No newline at end of file diff --git a/File/Templates-Yaml/service.yaml b/File/Templates-Yaml/service.yaml new file mode 100644 index 0000000..206ebe9 --- /dev/null +++ b/File/Templates-Yaml/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: service +spec: + selector: + name: service + ports: + - protocol: TCP + port: 80 + targetPort: 80 + type: ClusterIP \ No newline at end of file diff --git a/File/Templates-Yaml/statefulset.yaml b/File/Templates-Yaml/statefulset.yaml new file mode 100644 index 0000000..1ccf0d3 --- /dev/null +++ b/File/Templates-Yaml/statefulset.yaml @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: statefulset-pods + namespace: default +spec: + selector: + matchLabels: + app: statefulset-pods + serviceName: nginx-prot + replicas: 1 + template: + metadata: + labels: + app: statefulset-pods + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 + protocol: TCP \ No newline at end of file diff --git a/File/Yaml/aliyun-gpu-pod.yaml b/File/Yaml/aliyun-gpu-pod.yaml new file mode 100644 index 0000000..2938d92 --- /dev/null +++ b/File/Yaml/aliyun-gpu-pod.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Pod +metadata: + name: gpu-pod + labels: + app: nginx +spec: + containers: + - name: nginx + image: nginx:latest + env: + - name: NVIDIA_VISIBLE_DEVICES + value: "all" + ports: + - containerPort: 80 + # resources: + # limits: + # aliyun.com/gpu-count: 1 + # aliyun.com/gpu-mem: 512 diff --git a/File/Yaml/aliyun-sync.yaml b/File/Yaml/aliyun-sync.yaml new file mode 100644 index 0000000..9fbdb2b --- /dev/null +++ b/File/Yaml/aliyun-sync.yaml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + namespace: aliyunpan + name: aliyunpan-sync +spec: + podManagementPolicy: OrderedReady + replicas: 1 + revisionHistoryLimit: 5 + selector: + matchLabels: + app: aliyunpan-sync + serviceName: aliyunpan-sync + minReadySeconds: 5 + template: + metadata: + labels: + app: aliyunpan-sync + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: aliyunpan-sync + image: tickstep/aliyunpan-sync:v0.2.9 + env: + - name: TZ + value: "Asia/Shanghai" + - name: ALIYUNPAN_PAN_DIR + value: "" + - name: ALIYUNPAN_SYNC_MODE + value: "sync" + - name: ALIYUNPAN_REFRESH_TOKEN + valueFrom: + secretKeyRef: + name: aliyunpan-token + key: ALIYUNPAN_REFRESH_TOKEN + volumeMounts: + - name: host-path-volume + mountPath: /home/app/data + volumes: + - name: host-path-volume + hostPath: + path: /data/aliyunpan/ + - name: secret-volume + secret: + secretName: aliyunpan-token \ No newline at end of file diff --git a/File/Yaml/chartmuseum.yaml b/File/Yaml/chartmuseum.yaml new file mode 100644 index 0000000..dfeac9a --- /dev/null +++ b/File/Yaml/chartmuseum.yaml @@ -0,0 +1,59 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: chartmuseum-pvc + namespace: chartmuseum +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + namespace: helm + name: chartmuseum +spec: + replicas: 1 + serviceName: chartmuseum + selector: + matchLabels: + app: chartmuseum + template: + metadata: + labels: + app: chartmuseum + spec: + containers: + - name: chartmuseum + image: chartmuseum/chartmuseum:latest + env: + - name: DEBUG + value: "1" + - name: STORAGE + value: local + - name: STORAGE_LOCAL_ROOTDIR + value: /charts + volumeMounts: + - mountPath: /charts + name: data + volumes: + - name: data + persistentVolumeClaim: + claimName: chartmuseum-pvc +--- +apiVersion: v1 +kind: Service +metadata: + namespace: helm + name: chartmuseum +spec: + selector: + app: chartmuseum + ports: + - port: 8080 + targetPort: 8080 + protocol: TCP + type: ClusterIP \ No newline at end of file diff --git a/File/Yaml/chatgpt-pandora.yaml b/File/Yaml/chatgpt-pandora.yaml new file mode 100644 index 0000000..cf7abbc --- /dev/null +++ b/File/Yaml/chatgpt-pandora.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: chatgpt + labels: + name: chatgpt +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: chatgpt-pandora + namespace: chatgpt + labels: + app: chatgpt-pandora +spec: + selector: + matchLabels: + app: chatgpt-web + replicas: 1 + strategy: + type: RollingUpdate + template: + metadata: + labels: + app: chatgpt-web + spec: + containers: + - name: chatgpt-pandora + image: 'pengzhile/pandora:latest' + ports: + - name: chatgpt-80 + containerPort: 80 + protocol: TCP + env: + - name: PANDORA_SERVER + value: '0.0.0.0:80' + - name: PANDORA_CLOUD + value: cloud +--- +apiVersion: v1 +kind: Service +metadata: + name: chatgpt-web + namespace: chatgpt +spec: + selector: + app: chatgpt-web + ports: + - protocol: TCP + port: 80 + targetPort: 80 \ No newline at end of file diff --git a/File/Yaml/cluster-issuer.yaml b/File/Yaml/cluster-issuer.yaml new file mode 100644 index 0000000..8472ec3 --- /dev/null +++ b/File/Yaml/cluster-issuer.yaml @@ -0,0 +1,18 @@ +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-prod +spec: + acme: + # 使用 Let's Encrypt 的生产环境服务器 + server: https://acme-v02.api.letsencrypt.org/directory + # 邮件地址用于重要的通讯,例如安全通知和证书到期通知 + email: user@example.com + # 用于存储ACME账户的私钥 + privateKeySecretRef: + name: letsencrypt-prod + # ACME协议中用于验证域名所有权的挑战机制 + solvers: + - http01: + ingress: + class: nginx \ No newline at end of file diff --git a/File/Yaml/docker-compose-frpc.yaml b/File/Yaml/docker-compose-frpc.yaml new file mode 100644 index 0000000..cc1dfc9 --- /dev/null +++ b/File/Yaml/docker-compose-frpc.yaml @@ -0,0 +1,25 @@ +version: '3' + +services: + ipsec-vpn-server: + image: hwdsl2/ipsec-vpn-server + container_name: ipsec-vpn-server + restart: always + privileged: true + networks: + - vpn + volumes: + - /opt/vpn/vpn.env:/opt/src/env/vpn.env:ro + - /lib/modules:/lib/modules:ro + + frpc: + image: registry.cn-hangzhou.aliyuncs.com/offends/frp:frpc + container_name: frpc + restart: always + networks: + - vpn + volumes: + - /opt/vpn/frpc.ini:/frp/frpc.ini:ro + +networks: + vpn: \ No newline at end of file diff --git a/File/Yaml/docker-compose-frps.yaml b/File/Yaml/docker-compose-frps.yaml new file mode 100644 index 0000000..ca9c9c6 --- /dev/null +++ b/File/Yaml/docker-compose-frps.yaml @@ -0,0 +1,13 @@ +version: '3' + +services: + frps: + image: registry.cn-hangzhou.aliyuncs.com/offends/frp:frps + container_name: frps + restart: always + ports: + - "7000:7000" + - "500:500/udp" + - "4500:4500/udp" + volumes: + - /opt/vpn/frps.ini:/frp/frps.ini:ro \ No newline at end of file diff --git a/File/Yaml/drone-postgres.yaml b/File/Yaml/drone-postgres.yaml new file mode 100644 index 0000000..9b43c38 --- /dev/null +++ b/File/Yaml/drone-postgres.yaml @@ -0,0 +1,79 @@ +apiVersion: v1 +kind: Secret +metadata: + name: drone-db-secret + namespace: drone +stringData: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: drone +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: drone-db-pvc + namespace: drone +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + namespace: drone + name: drone-db +spec: + selector: + matchLabels: + app: drone-db + serviceName: drone-db + replicas: 1 + template: + metadata: + labels: + app: drone-db + spec: + containers: + - name: drone-db + image: postgres:latest + envFrom: + - secretRef: + name: drone-db-secret + ports: + - containerPort: 5432 + protocol: TCP + livenessProbe: + exec: + command: + - psql + - -h + - localhost + - -U + - postgres + - -c + - "SELECT 1;" + initialDelaySeconds: 10 #启动后等待10秒开始检测 + periodSeconds: 10 #每隔10秒检测一次 + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: data + volumes: + - name: data + persistentVolumeClaim: + claimName: drone-db-pvc +--- +apiVersion: v1 +kind: Service +metadata: + namespace: drone + name: drone-db +spec: + selector: + app: drone-db + ports: + - protocol: TCP + port: 5432 + targetPort: 5432 \ No newline at end of file diff --git a/File/Yaml/frpc.yaml b/File/Yaml/frpc.yaml new file mode 100644 index 0000000..102a5ad --- /dev/null +++ b/File/Yaml/frpc.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frpc + namespace: vpn + labels: + app: frpc +spec: + replicas: 1 + selector: + matchLabels: + app: frpc + template: + metadata: + labels: + app: frpc + spec: + hostNetwork: true + containers: + - name: ipsec + securityContext: + privileged: true + image: hwdsl2/ipsec-vpn-server:latest + imagePullPolicy: Always + volumeMounts: + - mountPath: /opt/src/env/vpn.env + name: ipsec-config + readOnly: true + - mountPath: /lib/modules + name: ipsec-data + readOnly: true + - name: frpc + image: registry.cn-hangzhou.aliyuncs.com/offends/frp:frpc + imagePullPolicy: Always + volumeMounts: + - name: frpc-config + mountPath: /frp/frpc.ini + volumes: + - name: ipsec-config + hostPath: + path: /opt/vpn/vpn.env + - name: frpc-config + hostPath: + path: /opt/vpn/frpc.ini + - name: ipsec-data + hostPath: + path: /lib/modules \ No newline at end of file diff --git a/File/Yaml/frps.yaml b/File/Yaml/frps.yaml new file mode 100644 index 0000000..9ff76b6 --- /dev/null +++ b/File/Yaml/frps.yaml @@ -0,0 +1,29 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frps + namespace: vpn + labels: + app: frps +spec: + replicas: 1 + selector: + matchLabels: + app: frps + template: + metadata: + labels: + app: frps + spec: + hostNetwork: true + containers: + - name: frpc + image: registry.cn-hangzhou.aliyuncs.com/offends/frp:frps + imagePullPolicy: Always + volumeMounts: + - name: frps-config + mountPath: /frp/frps.ini + volumes: + - name: frps-config + hostPath: + path: /opt/vpn/frps.ini \ No newline at end of file diff --git a/File/Yaml/ingress-nginx-tcp.yaml b/File/Yaml/ingress-nginx-tcp.yaml new file mode 100644 index 0000000..07183a1 --- /dev/null +++ b/File/Yaml/ingress-nginx-tcp.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: ingress-nginx-tcp + namespace: default \ No newline at end of file diff --git a/File/Yaml/ingress-udp-services.yaml b/File/Yaml/ingress-udp-services.yaml new file mode 100644 index 0000000..0d3fcbb --- /dev/null +++ b/File/Yaml/ingress-udp-services.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: ingress-nginx-udp + namespace: default \ No newline at end of file diff --git a/File/Yaml/openebs-pod.yaml b/File/Yaml/openebs-pod.yaml new file mode 100644 index 0000000..cd69754 --- /dev/null +++ b/File/Yaml/openebs-pod.yaml @@ -0,0 +1,31 @@ +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: local-hostpath-pvc +spec: + storageClassName: openebs-hostpath + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5G +--- +apiVersion: v1 +kind: Pod +metadata: + name: hello-local-hostpath-pod +spec: + volumes: + - name: local-storage + persistentVolumeClaim: + claimName: local-hostpath-pvc + containers: + - name: hello-container + image: busybox + command: + - sh + - -c + - 'while true; do echo "`date` [`hostname`] Hello from OpenEBS Local PV." >> /mnt/store/greet.txt; sleep $(($RANDOM % 5 + 300)); done' + volumeMounts: + - mountPath: /mnt/store + name: local-storage \ No newline at end of file diff --git a/File/Yaml/production-issuer.yaml b/File/Yaml/production-issuer.yaml new file mode 100644 index 0000000..27fe65d --- /dev/null +++ b/File/Yaml/production-issuer.yaml @@ -0,0 +1,18 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: letsencrypt-prod +spec: + acme: + # The ACME server URL + server: https://acme-v02.api.letsencrypt.org/directory + # Email address used for ACME registration + email: user@example.com + # Name of a secret used to store the ACME account private key + privateKeySecretRef: + name: letsencrypt-prod + # Enable the HTTP-01 challenge provider + solvers: + - http01: + ingress: + ingressClassName: nginx \ No newline at end of file diff --git a/File/Yaml/registry-proxy-ds.yaml b/File/Yaml/registry-proxy-ds.yaml new file mode 100644 index 0000000..4159aab --- /dev/null +++ b/File/Yaml/registry-proxy-ds.yaml @@ -0,0 +1,66 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: registry-proxy-pvc + namespace: hub +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: registry-proxy + namespace: hub + labels: + name: registry-proxy +spec: + selector: + matchLabels: + name: registry-proxy + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + name: registry-proxy + spec: + volumes: + # - name: data + # hostPath: + # path: /var/lib/registryproxy + # type: Directory + - name: data + persistentVolumeClaim: + claimName: registry-proxy-pvc + containers: + - name: registry-proxy + image: hub.offends.cn/registry-proxy:latest + imagePullPolicy: IfNotPresent + ports: + - name: registry-port + containerPort: 5000 + protocol: TCP + env: + - name: PROXY_REMOTE_URL + value: 'http://registry:5000' + volumeMounts: + - name: data + mountPath: /var/lib/registry +--- +apiVersion: v1 +kind: Service +metadata: + name: registry-proxy-service + namespace: hub +spec: + selector: + name: registry-proxy + ports: + - protocol: TCP + port: 5000 + targetPort: 5000 + type: ClusterIP \ No newline at end of file diff --git a/File/Yaml/registry-proxy-ingress.yaml b/File/Yaml/registry-proxy-ingress.yaml new file mode 100644 index 0000000..b42499c --- /dev/null +++ b/File/Yaml/registry-proxy-ingress.yaml @@ -0,0 +1,25 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: registry-proxy-ingress + namespace: hub + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "0" + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + ingressClassName: "" # 指定 ingressClass + rules: + - host: #域名 + http: + paths: + - pathType: Prefix + backend: + service: + name: registry-proxy-service + port: + number: 5000 + path: / + tls: + - hosts: + - #域名 + secretName: registry-proxy-tls diff --git a/File/Yaml/rke-kube-prometheus-stack-values.yaml b/File/Yaml/rke-kube-prometheus-stack-values.yaml new file mode 100644 index 0000000..138b2a9 --- /dev/null +++ b/File/Yaml/rke-kube-prometheus-stack-values.yaml @@ -0,0 +1,33 @@ +# 配置 RKE1 Kubernetes 组件监控 +kubeControllerManager: + endpoints: + - 192.168.1.10 + - 192.168.1.20 + - 192.168.1.30 + service: + port: 10257 + targetPort: 10257 + +kubeScheduler: + endpoints: + - 192.168.1.10 + - 192.168.1.20 + - 192.168.1.30 + service: + port: 10257 + targetPort: 10257 + +kubeProxy: + endpoints: + - 192.168.1.10 + - 192.168.1.20 + - 192.168.1.30 + service: + port: 10249 + targetPort: 10249 + +kubeEtcd: + endpoints: + - 192.168.1.10 + - 192.168.1.20 + - 192.168.1.30 \ No newline at end of file diff --git a/File/Yaml/shadowsocks-rust-client.yaml b/File/Yaml/shadowsocks-rust-client.yaml new file mode 100644 index 0000000..a93f914 --- /dev/null +++ b/File/Yaml/shadowsocks-rust-client.yaml @@ -0,0 +1,66 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: shadowsocks-rust-client + namespace: shadowsocks +data: + config.json: | + { + "server": "", + "server_port": 8388, + "password": "", + "local_address": "0.0.0.0", + "local_port": 1080, + "timeout": 300, + "method": "aes-256-gcm" + } +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + name: shadowsocks-rust-client + name: shadowsocks-rust-client + namespace: shadowsocks +spec: + replicas: 1 + selector: + matchLabels: + name: shadowsocks-rust-client + template: + metadata: + labels: + name: shadowsocks-rust-client + spec: + containers: + - image: ghcr.io/shadowsocks/sslocal-rust:latest + imagePullPolicy: IfNotPresent + name: shadowsocks-rust-client + ports: + - containerPort: 1080 + name: ss-1080 + protocol: TCP + volumeMounts: + - mountPath: /etc/shadowsocks-rust + name: config + readOnly: true + volumes: + - configMap: + defaultMode: 420 + name: shadowsocks-rust-client + name: config +--- +apiVersion: v1 +kind: Service +metadata: + name: shadowsocks-rust-client + namespace: shadowsocks +spec: + ports: + - name: ss-1080 + port: 1080 + protocol: TCP + targetPort: 1080 + selector: + name: shadowsocks-rust-client + type: ClusterIP \ No newline at end of file diff --git a/File/Yaml/simplex-smp.yaml b/File/Yaml/simplex-smp.yaml new file mode 100644 index 0000000..c3c7208 --- /dev/null +++ b/File/Yaml/simplex-smp.yaml @@ -0,0 +1,88 @@ +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: simplex-smp-config + namespace: simplex + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: simplex-smp-log + namespace: simplex + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: simplex-smp-server + namespace: simplex + labels: + name: simplex-smp +spec: + selector: + matchLabels: + name: simplex-smp + template: + metadata: + labels: + name: simplex-smp + spec: + volumes: + - name: config + persistentVolumeClaim: + claimName: simplex-smp-config + - name: log + persistentVolumeClaim: + claimName: simplex-smp-log + containers: + - name: simplex-smp + image: simplexchat/smp-server:latest + imagePullPolicy: IfNotPresent + ports: + - name: smp-port + containerPort: 5223 + protocol: TCP + hostPort: 5223 + env: + - name: ADDR + valueFrom: + secretKeyRef: + name: simplex-secret + key: ADDR + - name: PASS + valueFrom: + secretKeyRef: + name: simplex-secret + key: PASS + volumeMounts: + - name: config + mountPath: /etc/opt/simplex + - name: log + mountPath: /var/opt/simplex +--- +apiVersion: v1 +kind: Service +metadata: + name: simplex-smp + namespace: simplex +spec: + selector: + name: simplex-smp + ports: + - protocol: TCP + port: 5223 + targetPort: 5223 + type: ClusterIP \ No newline at end of file diff --git a/File/Yaml/simplex-xftp.yaml b/File/Yaml/simplex-xftp.yaml new file mode 100644 index 0000000..d86f211 --- /dev/null +++ b/File/Yaml/simplex-xftp.yaml @@ -0,0 +1,101 @@ +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: simplex-xftp-config + namespace: simplex + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: simplex-xftp-log + namespace: simplex + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: simplex-xftp-files + namespace: simplex + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: simplex-xftp-server + namespace: simplex + labels: + name: simplex-xftp +spec: + selector: + matchLabels: + name: simplex-xftp + template: + metadata: + labels: + name: simplex-xftp + spec: + volumes: + - name: config + persistentVolumeClaim: + claimName: simplex-xftp-config + - name: log + persistentVolumeClaim: + claimName: simplex-xftp-log + - name: files + persistentVolumeClaim: + claimName: simplex-xftp-files + containers: + - name: simplex-xftp + image: simplexchat/xftp-server:latest + imagePullPolicy: IfNotPresent + ports: + - name: xftp-port + containerPort: 443 + protocol: TCP + hostPort: 5233 + env: + - name: ADDR + valueFrom: + secretKeyRef: + name: simplex-secret + key: ADDR + - name: QUOTA + value: 50gb + volumeMounts: + - name: config + mountPath: /etc/opt/simplex-xftp + - name: log + mountPath: /var/opt/simplex-xftp + - name: files + mountPath: /srv/xftp +--- +apiVersion: v1 +kind: Service +metadata: + name: simplex-xftp + namespace: simplex +spec: + selector: + name: simplex-xftp + ports: + - protocol: TCP + port: 443 + targetPort: 443 + type: ClusterIP \ No newline at end of file diff --git a/File/Yaml/staging-issuer.yaml b/File/Yaml/staging-issuer.yaml new file mode 100644 index 0000000..eb3703d --- /dev/null +++ b/File/Yaml/staging-issuer.yaml @@ -0,0 +1,18 @@ +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: letsencrypt-staging +spec: + acme: + # The ACME server URL + server: https://acme-staging-v02.api.letsencrypt.org/directory + # Email address used for ACME registration + email: user@example.com + # Name of a secret used to store the ACME account private key + privateKeySecretRef: + name: letsencrypt-staging + # Enable the HTTP-01 challenge provider + solvers: + - http01: + ingress: + ingressClassName: nginx \ No newline at end of file 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..f993cf3 --- /dev/null +++ b/Helm/Helm部署Cert-Manager.md @@ -0,0 +1,185 @@ +> 本文作者:丁辉 + +# 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) 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..bf9baf2 --- /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 + BASHyum -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-runner-kube-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 -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..c27e172 --- /dev/null +++ b/Helm/Helm部署Drone-Runner-Docker.md @@ -0,0 +1,108 @@ +> 本文作者:丁辉 + +# 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 + ``` + + + 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..3bb306f --- /dev/null +++ b/Helm/Helm部署Drone.md @@ -0,0 +1,141 @@ +> 本文作者:丁辉 + +# 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. 生成 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启动时创建的用户信息,包括用户名和角色(管理员)。 | + +6. 编写模版文件 + + > 对接 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 + > ``` + +7. 安装 + + ```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 + ``` + diff --git a/Helm/Helm部署Gitea.md b/Helm/Helm部署Gitea.md new file mode 100644 index 0000000..d1dab6d --- /dev/null +++ b/Helm/Helm部署Gitea.md @@ -0,0 +1,132 @@ +> 本文作者:丁辉 +> + +# Helm部署Gitea + +## 介绍 + +**Gitea是一个轻量级的DevOps平台软件,支持Git托管、代码审查、团队协作、软件包注册和CI/CD等功能**。 + +## 开始部署 + +[Chart仓库](https://dl.gitea.com/charts/) + +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" + + # 关闭 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 + ``` + + 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..6ef6a67 --- /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.dockerproxy.com + ``` + +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..2503d3d --- /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.dockerproxy.com + + # 开启持久化存储 + 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..7867143 --- /dev/null +++ b/Helm/Helm部署Minio.md @@ -0,0 +1,233 @@ +> 本文作者:丁辉 + +# 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 + vi default.conf + ``` + + 内容如下 + + ```nginx + server { + listen 9000 ssl; + server_name localhost; # 这里替换自己的域名 + + client_max_body_size 1024m; # 限制上传文件大小 + + ssl_certificate /etc/nginx/conf.d/cert/tls.crt; + ssl_certificate_key /etc/nginx/conf.d/cert/tls.key; + + location / { + proxy_set_header X-FORWARDED-FOR $remote_addr; + proxy_set_header X-FORWARDED-PROTO $scheme; + proxy_set_header Host $http_host; + proxy_pass http://minio:9000; + } + } + ``` + +7. 编辑 Dockerfile + + ```bash + vi Dockerfile + ``` + + 内容如下 + + ```dockerfile + FROM nginx:alpine-slim + + COPY ./default.conf /etc/nginx/conf.d/default.conf + + EXPOSE 9000 + ``` + +8. 构建镜像 + + ```bash + docker build -t minio-gateway:v1.0 . + ``` + +9. 查看 Minio SVC IP + + ```bash + kubectl get svc -n minio | grep 9000 | awk '{print $3}' + ``` + +10. 编辑 Yaml + + ```bash + vi minio-gateway.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: apps/v1 + kind: Deployment + metadata: + namespace: minio + name: minio-gateway + labels: + app: minio-gateway + spec: + selector: + matchLabels: + app: minio-gateway + template: + metadata: + labels: + app: minio-gateway + spec: + hostNetwork: true + hostAliases: + - ip: "" #填入 Minio SVC IP + hostnames: + - "minio" + containers: + - name: minio-gateway + image: minio-gateway:v1.0 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 9000 + protocol: TCP + readinessProbe: + failureThreshold: 3 + initialDelaySeconds: 5 + periodSeconds: 3 + successThreshold: 1 + tcpSocket: + port: 9000 + timeoutSeconds: 10 + resources: + limits: + memory: 128Mi + volumeMounts: + - name: ssl + mountPath: "/etc/nginx/conf.d/cert/" + volumes: + - name: ssl + secret: + secretName: minio-ssl + ``` + +11. 部署 + + ```bash + kubectl apply -f minio-gateway.yaml + ``` + +## 卸载 + +1. 卸载网关 + + ```bash + kubectl delete -f minio-gateway.yaml + ``` + +2. 卸载 minio + + ```bash + helm uninstall minio -n minio + ``` + +3. 删除 secret + + ```bash + kubectl delete secret minio-tls -n minio + ``` + +4. 删除命名空间 + + ```bash + kubectl delete namespace minio + ``` + 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..f6e3871 --- /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 install 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..022c1af --- /dev/null +++ b/Helm/Helm部署Nginx-Ingress.md @@ -0,0 +1,93 @@ +> 本文作者:丁辉 +> + +# 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. 编写模版文件 + + ```bash + vi ingress-values.yaml + ``` + + 内容如下 + + ```yaml + controller: + # 开启监控 + metrics: + enabled: true + serviceMonitor: + enabled: true + + # 配置镜像加速 + image: + registry: k8s.dockerproxy.com + + # 使用主机网络时,利用 Kubernetes 集群内的 DNS 解析服务 + dnsPolicy: ClusterFirstWithHostNet + + # 使用本地网络 + hostNetwork: true + + # Pod 使用 DaemonSet 方式运行 + kind: DaemonSet + + # 只允许调度到具有 ingress="true" 的节点上,[ kubectl label node xxx ingress="true" ] + nodeSelector: + kubernetes.io/os: linux + ingress: "true" + + # 禁用后状态字段会报告 Ingress 控制器 Pod 所在节点的 IP 地址或节点列表的 IP 地址 + publishService: + enabled: false + + # 启用 Kubernetes Service + service: + enabled: false + + # 配置镜像加速 + admissionWebhooks: + patch: + image: + registry: k8s.dockerproxy.com + + # 设置为集群默认 ingress 控制器 + ingressClassResource: + default: true + ``` + +3. 配置节点标签 + + ```bash + kubectl label node ${node} ingress="true" + ``` + +4. 部署 + + ```bash + helm install ingress-nginx \ + ingress-nginx/ingress-nginx \ + -f ingress-values.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..2d04b30 --- /dev/null +++ b/Helm/Helm部署PrometheusAlert.md @@ -0,0 +1,122 @@ +> 本文作者:丁辉 + +# 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. 拉取代码 + + ```bash + git clone 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: false + ``` + +5. 安装 + + ```bash + helm install prometheusalert ./prometheusalert \ + --namespace monitor --create-namespace \ + -f prometheusalert-values.yaml + ``` + +## 卸载 + +```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 -}} + ``` + +- 保存模版 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..8a85e9d --- /dev/null +++ b/Helm/Helm部署Shadowsocks-Rust.md @@ -0,0 +1,166 @@ +> 本文作者:丁辉 + +# 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 + ``` + +4. 客户端安装 + + [Github](https://github.com/shadowsocks/ShadowsocksX-NG) + + 打开软件 > 点击服务器 > 服务器设置 > 点击左下角 + 号 > 添加服务器信息并确定 + +## 卸载 + +1. 卸载 shadowsocks-rust + + ```bash + helm uninstall shadowsocks-rust -n shadowsocks + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns shadowsocks + ``` + +# Linux客户端安装 + +> Linux客户端安装可以利用 shadowsocks-rust chart 稍微修改一些参数即可 + +| 需要连接的服务端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 + ``` + +## 卸载 + +1. 卸载 shadowsocks-rust + + ```bash + kubectl delete -f shadowsocks-rust-client.yaml + ``` + +2. 删除命名空间 + + ```bash + kubectl delete ns shadowsocks + ``` \ No newline at end of file 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 new file mode 100644 index 0000000..1a92643 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +* + +> 本文作者:丁辉 + +# Kubernetes + +> 目录详情 + +| 文件夹名 | 内容 | +| :--------: | :------------------------------------: | +| CICD | CICD学习文档 | +| Containerd | Containerd学习文档 | +| Docker | Docker学习文档 | +| File | 存放各文档内部需要使用的脚本或配置文件 | +| GPU | GPU的使用文档 | +| Helm | Helm安装、学习使用文档 | +| 使用文档 | Kubernetes使用、学习文档 | +| 存储 | Kubernetes存储文档 | +| 监控 | Kubernetes监控组件学习部署文档 | +| 网关 | Kubernetes对外网关学习文档 | +| 网络 | Kubernetes网络学习文档 | +| 资源部署 | Kubernetes上安装各种软件文档 | +| 部署文档 | Kubernetes各类型部署工具使用文档 | +| 镜像仓库 | Kubernetes镜像仓库工具使用文档 | +| 问题记录 | Kubernetes学习过程中遇到的疑难杂症 | + diff --git a/builder.sh b/builder.sh new file mode 100755 index 0000000..2cb6f58 --- /dev/null +++ b/builder.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +############################################################################################# +# 用途: 初始化文档脚本 +# 作者: 丁辉 +# 编写时间: 2024-07-11 +############################################################################################# + +# 定义函数信息 +RED='\033[0;31m' +NC='\033[0m' +GREEN='\033[32m' +YELLOW='\033[33m' +TIME="+%Y-%m-%d %H:%M:%S" + +function SEND_INFO() { + info=$1 + echo -e "${GREEN}$(date "$TIME") INFO: $info${NC}" +} +function SEND_WARN() { + warn=$1 + echo -e "${YELLOW}$(date "$TIME") WARN: $warn${NC}" +} +function SEND_ERROR() { + error=$1 + echo -e "${RED}$(date "$TIME") ERROR: $error${NC}" +} + +# 整理文档 +function Clean_File() { + SEND_INFO "------------ 开始清理仓库内无关文件 ------------" + SEND_INFO "------------ Git 文件清理 ------------" + rm -rf .git + rm -rf .gitignore + rm -rf .drone.yml + rm -rf ./README.md + SEND_INFO "------------ 特殊文件/目录清理 ------------" + find . -type f ! \( -name "*.md" -o -name "builder.sh" \) -exec rm {} + + SEND_INFO "------------ 开始初始化文档 ------------" + SEND_INFO "------------ README.md 文件初始化 ------------" + # 清理第一行带有 * 号文件 + for i in $(find ./ -type f -name "*.md"); do + if head -n 1 ${i} | grep -q '^*'; then + rm ${i} + fi + done + # 更改剩下的文件名称 + for i in $(find ./ -type f -name "README.md"); do + path=$(echo $i | awk -F'/README.md' '{print $1}') + name=$(sed -n '3p' $i | awk '{print $2}') + mv $i ${path}/${name}.md + done +} + +# 初始化 MD 文件 +function Init_Docs() { + SEND_INFO "------------ 初始化文档正文 ------------" + for i in $(find ./ -type f -name "*.md" | sed 's|^./||'); do + DNAME=$(echo $i | awk -F '/' '{print "Kubernetes-"$1}') + MDNAME=$(echo $i | awk -F '/' '{print $(NF)}' | awk -F '.' '{print $1}') + sed -i "1i---\n\ +title:\n\ +keywords: admin-template,vue,element,后台模板\n\ +cover: /img/block.png\n\ +sticky:\n\ +banner:\n\ + type: img\n\ + bgurl: /img/demo.png\n\ + bannerText: \n\ +author: Offends\n\ +categories:\n\ +toc: true\n\ +single_column: true\n\ +---\n" $i + sed -i "s#title:#title: $MDNAME#g" $i + sed -i "s#categories:#categories: $DNAME#g" $i + done +} + +function Replace_Url() { + SEND_INFO "------------ 开始替换 Gitee 链接为 Blog 链接 ------------" + for i in $(grep -r 'https://gitee.com/offends/' . | awk -F ':' '{print $1}'); do + sed -i 's|https://gitee.com/offends/\(.*\)blob/main/\(.*\.md\)|https://blog.offends.cn/\1\2|g' $i || true + sed -i 's|\.md$|.html|g' $i || true + sed -i 's|\.md)$|.html)|g' $i || true + done +} + +function All() { + SEND_INFO "开始构建......" + Clean_File + Init_Docs + Replace_Url + SEND_INFO "构建完成" +} + +All \ No newline at end of file diff --git a/使用文档/K8s-Svc代理外部服务.md b/使用文档/K8s-Svc代理外部服务.md new file mode 100644 index 0000000..1b43a49 --- /dev/null +++ b/使用文档/K8s-Svc代理外部服务.md @@ -0,0 +1,46 @@ +> 本文作者:丁辉 +> + +# K8s-Svc代理外部服务 + +> 本文以 Mysql 为例 + +1. 编辑文件 + + ```bash + vi mysql-svc.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: v1 + kind: Endpoints + metadata: + name: mysql-proxy + namespace: default + subsets: + - addresses: + - ip: 192.168.1.1 + - ip: 192.168.1.2 + ports: + - port: 3306 + protocol: TCP + --- + apiVersion: v1 + kind: Service + metadata: + name: mysql-proxy + namespace: default + spec: + ports: + - port: 3306 + targetPort: 3306 + type: ClusterIP + ``` + +2. 部署 svc + + ```bash + kubectl apply -f mysql-svc.yaml + ``` \ No newline at end of file diff --git a/使用文档/Kubectl配置多集群.md b/使用文档/Kubectl配置多集群.md new file mode 100644 index 0000000..56eefea --- /dev/null +++ b/使用文档/Kubectl配置多集群.md @@ -0,0 +1,64 @@ +> 本文作者:丁辉 + +# Kubectl配置多集群 + +## 基础命令 + +- 查看和显示当前配置的Kubernetes集群、用户和上下文等信息 + + ```bash + kubectl config view + ``` + +- 查看当前上下文(context)的名称 + + ```bash + kubectl config current-context + ``` + +- 切换当前 `kubectl` 上下文(context) + + ```bash + kubectl config use-context $cluster-name + ``` + +## 配置Kubectl多集群 + +> 前提条件: +> +> 使用 `kubectl config view` 命令查看 +> +> 1. 集群 `cluster-name` 不同(现有:cluster1 和 cluster2) +> 2. 集群 `cluster-user` 不同(现有:kube-admin-cluster1 和 kube-admin-cluster2)s备份config文件 + +1. cluster1 和 cluster2 备份config文件 + + ```bash + cp ~/.kube/config ~/.kube/config.bak + ``` + +2. 拷贝 cluster2 config 文件到 cluster1 节点上 + + ```bash + scp ~/.kube/config root@cluster1:/root + ``` + +3. 合并配置文件 + + ```bash + KUBECONFIG=~/.kube/config:/root/config kubectl config view --flatten > /tmp/config + ``` + +4. 替换 cluster1 config 文件 + + ```bash + \mv /tmp/config ~/.kube/config + ``` + +5. 测试,在 cluster1 上切换到 cluster2 + + ```bash + kubectl config use-context cluster2 + ``` + + diff --git a/使用文档/Kubernetes内配置域名解析.md b/使用文档/Kubernetes内配置域名解析.md new file mode 100644 index 0000000..b64b1b3 --- /dev/null +++ b/使用文档/Kubernetes内配置域名解析.md @@ -0,0 +1,73 @@ +>本文作者:丁辉 + +# Kubernetes内配置域名解析 + +## 更改 Coredns 配置 + +> 不同部署方式的集群可能 Coredns 配置文件的名称也不同, 需要按照自身集群情况修改 +> +> ```bash +> kubectl get cm -n kube-system | grep coredns +> ``` + +1. 备份原配置 + + ```bash + kubectl get cm coredns -n kube-system -o yaml > /root/coredns.yaml + ``` + +2. 编辑 Yaml 文件 + + ```bash + kubectl edit cm -n kube-system coredns + ``` + + 添加如下内容 + + ```yaml + apiVersion: v1 + data: + Corefile: | + .:53 { + errors + health { + lameduck 5s + } + ready + kubernetes cluster.local in-addr.arpa ip6.arpa { + pods insecure + fallthrough in-addr.arpa ip6.arpa + } + + #加这一段 + #--------------------------- + hosts { + 192.168.1.10 www.demo.com + fallthrough + } + #--------------------------- + + prometheus :9153 + #forward . 192.168.1.10 #或者在这里添加DNS + forward . "/etc/resolv.conf" + cache 30 + loop + reload + loadbalance + } # STUBDOMAINS - Rancher specific change + kind: ConfigMap + ··· + ``` + +3. 重启集群内所有 Coredns 立即生效 + + > 当然这在生产并不可取, 尽量让他自行生效, 但过程较慢 + + - Rke集群 + + ```bash + kubectl delete pod -l k8s-app=kube-dns -n kube-system + ``` + + - 其他集群待写 + diff --git a/使用文档/Kubernetes常用命令.md b/使用文档/Kubernetes常用命令.md new file mode 100644 index 0000000..e0be3cc --- /dev/null +++ b/使用文档/Kubernetes常用命令.md @@ -0,0 +1,80 @@ +> 本文作者:丁辉 + +# Kubernetes常用命令 + +- 查看资源定义都有哪些字段 + + ```bash + kubectl explain deployments.spec + ``` + +- 查看最近的事件 + + ```bash + kubectl get events --sort-by='.lastTimestamp' + ``` + +- 列出 Kubernetes 集群中可用的 API 资源 + + ```bash + kubectl api-resources + ``` + +- 设置 Kubernetes 默认命名空间 + + > 这样在执行命令的时候就可以不用指定命名空间啦 + + ```bash + kubectl config set-context --current --namespace=命名空间名称 + ``` + +- 将 Kubernetes 集群的配置信息(包括集群、用户、凭据等)导出到 `~/.kube/config` 文件中 + + ```bash + kubectl config view --raw > ~/.kube/config + ``` + +- 获取 svc 的 clusterIP + + ```bash + kubectl get svc kubernetes -o jsonpath='{.spec.clusterIP}' + ``` + +- 获取 Kubernetes 集群内部域名后缀 + + ```bash + kubectl -n kube-system get configmap/coredns -o jsonpath='{.data.Corefile}' | grep 'kubernetes' | sed 's/{//' + ``` + +- 显示有关 Kubernetes 集群的基本信息,包括控制平面组件的地址、服务的端点等 + + ```bash + kubectl cluster-info + ``` + +- 用于生成有关 Kubernetes 集群的详尽信息的完整转储 + + ```bash + kubectl cluster-info dump + ``` + +- 获取集群 Name + + ```bash + kubectl config view --minify -o "jsonpath={.clusters[0].name}" + ``` + +- 获取集群用户 + + ```bash + kubectl config view --minify -o "jsonpath={.users[*].name}" + ``` + +- 获取集群组 + + ```bash + kubectl config view --minify -o "jsonpath={.contexts[*].context.user}" + ``` + + + diff --git a/使用文档/Kubernetes强制删除资源.md b/使用文档/Kubernetes强制删除资源.md new file mode 100644 index 0000000..e169361 --- /dev/null +++ b/使用文档/Kubernetes强制删除资源.md @@ -0,0 +1,116 @@ +> 本文作者:丁辉 + +# Kubernetes强制删除资源 + +## 卸载 Mount 挂载 + +```bash +umount $(mount | grep /var/lib/kubelet/pods | awk '{print $3}') +``` + +## 强制删除 Pod + +**指定你的 Pod 名称** + +```bash +POD_NAME= +``` + +- 强制删除 Terminating Pod + + ```bash + kubectl delete pod ${POD_NAME} --force + ``` + +- 立刻终止并强制删除 Terminating Pod + + ```bash + kubectl delete pod ${POD_NAME} --grace-period=0 --force + ``` + +- 通过修改系统参数删除 Terminating Pod(仅Centos) + + > 通过设置 `fs.may_detach_mounts=1` , Linux内核可以允许卸载这些挂载点,即使它们仍然被一些进程占用。 + + ```bash + sysctl -w fs.may_detach_mounts=1 + ``` + +- 通过修改 finalizers 删除 Terminating Pod + + > 当你删除一个资源(比如 Pod)时,Kubernetes 会将该资源的 finalizers 字段设置为一个非空的数组,这些 finalizers 是用来执行删除操作的一系列步骤。一旦这些步骤全部完成,Kubernetes 就会将资源完全删除。但是,有时候 Pod 可能会被卡在 Terminating 状态,无法正常删除,这可能是因为某些 finalizers 的执行未能成功完成,从而导致 Pod 无法被删除。 + + ```bash + kubectl patch pod ${POD_NAME} -p '{"metadata":{"finalizers":null}}' + ``` + +## 强制删除当前 Namespace 下所有 Pvc Pv + +- 设置变量 + + ```bash + export YOURNAMESPACE=你的名称空间 + ``` + +- 删除 Pvc + + ```bash + for line in $(kubectl get pvc -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl delete pvc $line -n $YOURNAMESPACE ; echo $line; done + ``` + +- 删除 Pv + + ```bash + for line in $(kubectl get pv -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl delete pv $line -n $YOURNAMESPACE ; echo $line; done + ``` + +- 若发现 Pv 还是删除不了 + + ```bash + for line in $(kubectl get pv -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl patch pv $line -p '{"metadata":{"finalizers":null}}' -n $YOURNAMESPACE ; kubectl delete pv $line -n $YOURNAMESPACE ;echo $line; done + ``` + +## 强制删除 Namespace + +**方法一** + +- 先手动强制删除试试 + + ```bash + kubectl delete ns $YOURNAMESPACE --force --grace-period=0 + ``` + +**方法二** + +- 导出 JSON 文件 + + ```bash + kubectl get namespace $YOURNAMESPACE -o json > ns.json + ``` + +- 编辑 ns.josn 删除 finalizers 字段的值 + + ```yaml + "spec": { + "finalizers": [] + }, + ``` + +- 开启proxy + + ```bash + kubectl proxy --port=8081 + ``` + +- 删除 + + ```bash + curl -k -H "Content-Type:application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8081/api/v1/namespaces/$YOURNAMESPACE/finalize + ``` + +## 删除Evicted pod + +```bash +kubectl get pod -A | grep Evicted | awk '{print $2" -n "$1}' | xargs kubectl delete pod +``` + diff --git a/使用文档/Kubernetes拷贝文件.md b/使用文档/Kubernetes拷贝文件.md new file mode 100644 index 0000000..805fc1c --- /dev/null +++ b/使用文档/Kubernetes拷贝文件.md @@ -0,0 +1,94 @@ +> 本文作者:丁辉 + +# Kubernetes 拷贝文件 + +## 拷贝容器内文件到本地 + +### 方法一 + +**使用 kubectl cp 拷贝** + +```bash +kubectl -n 命名空间 cp 容器名:/容器内文件路径 ./拷贝到本地文件名 +``` + +> 示例: +> +> ```bash +> kubectl -n test cp nginx-6db97db958-zrb7r:etc/nginx/nginx.conf ./nginx.conf +> ``` +> +> **执行命令提示** +> +> ```bash +> tar: Removing leading `/' from member names +> ``` +> +> 这是在提示你在 `kubectl -n 命名空间 cp 容器名:<这里开头不用加 "/" >` + +### 方法二 + +**寻找到本地 Docker 持久化存储 拷贝文件到本地** + +- 获取容器 ID + + ```bash + CONTAINER_ID=$(kubectl -n 命名空间 describe pod 容器名 | grep "Container ID:" | awk -F '/' '{print $3}') + ``` + + > 示例: + > + > ```bash + > CONTAINER_ID=$(kubectl -n test describe pod nginx-6db97db958-zrb7r | grep "Container ID:" | awk -F '/' '{print $3}') + > ``` + +- 获取存储路径 + + ```bash + docker inspect -f '{{.GraphDriver.Data.UpperDir}}' $CONTAINER_ID + ``` + + +### 方法三 + +- 获取容器名称 + + ```bash + kubectl -n 命名空间 describe pod 容器名 | grep "Containers:" -A 1 + ``` + + > 示例: + > + > ``` + > kubectl -n test describe pod nginx-6db97db958-zrb7r | grep "Containers:" -A 1 + > ``` + +- 寻找 Docker 容器 + + ```bash + docker ps | grep 容器名称 + ``` + +- 拷贝容器内文件 + + ```bash + docker cp 容器名称:/容器内路径 ./本地路径 + ``` + + +## 拷贝本地文件到容器内 + +**使用 kubectl cp 拷贝** + +```bash +kubectl -n 命名空间 cp ./本地文件名 容器名:/容器内路径 +``` + +> 示例: +> +> ```bash +> kubectl -n test cp ./default.conf nginx-6db97db958-zrb7r:/etc/nginx/conf.d/ +> ``` + + + diff --git a/使用文档/Kubernetes无状态容器副本管理.md b/使用文档/Kubernetes无状态容器副本管理.md new file mode 100644 index 0000000..b872343 --- /dev/null +++ b/使用文档/Kubernetes无状态容器副本管理.md @@ -0,0 +1,34 @@ +> 本文作者:丁辉 + +# Kubernetes无状态容器副本管理 + +- 更新版本 + + ```bash + kubectl rollout restart deployment $deployment + ``` + +- 查看更新状态 + + ```bash + kubectl rollout status deployment/$deployment + ``` + +- 查看版本信息 + + ```bash + kubectl rollout history deployment/$deployment + ``` + +- 撤消当前上线并回滚到以前的修订版本 + + ```bash + kubectl rollout undo deployment/$deployment + ``` + +- 回滚到指定版本 + + ```bash + kubectl rollout undo deployment/$deployment --to-revision=2 + ``` + diff --git a/使用文档/Kubernetes节点常用操作.md b/使用文档/Kubernetes节点常用操作.md new file mode 100644 index 0000000..e167529 --- /dev/null +++ b/使用文档/Kubernetes节点常用操作.md @@ -0,0 +1,61 @@ +> 本文作者:丁辉 + +# Kubernetes节点常用操作 + +## 允许节点加入集群 + +1. 查看待加入节点 + + ```bash + kubectl get csr + ``` + +2. 查看节点信息 + + ```bash + kubectl describe csr $name + ``` + +3. 批准加入 + + ```bash + kubectl certificate approve $name + ``` + +4. 查看结果 + + ```bash + kubectl get csr + #CONDITION=Approved,Issued + ``` + +## 删除节点 + +> 在删除节点前,要先排空节点上POD + +1. 排空POD + + ```bash + kubectl drain --delete-local-data --force --ignore-daemonsets + ``` + +2. 删除节点 + + ```bash + kubectl delete node + ``` + +## 给节点打标签 + +- `Master` 打标签 + + ```bash + kubectl label node 192.168.1.10 node-role.kubernetes.io/master='k8s-master1' + ``` + +- `Node` 打标签 + + ```bash + kubectl label node ${node} node-role.kubernetes.io/worker=true + ``` + diff --git a/使用文档/Kubernetes跨命名空间访问Service.md b/使用文档/Kubernetes跨命名空间访问Service.md new file mode 100644 index 0000000..4c2f8d7 --- /dev/null +++ b/使用文档/Kubernetes跨命名空间访问Service.md @@ -0,0 +1,62 @@ +> 本文作者:丁辉 + +# Kubernetes跨命名空间访问Service + +## 使用完全限定域名 (FQDN) + +> 在 Kubernetes 中,跨命名空间访问服务可以通过使用服务的完全限定域名 (FQDN) 或者创建服务的别名(Service Alias)来实现。下面是一些具体的方法和步骤。 + +**格式** + +```bash +..svc.cluster.local +``` + +**示例** + +```bash +kubernetes.default.svc.cluster.local:443 +``` + +**解释** + +- **kubernetes**:这是服务 Service 的名称。 +- **default**:这指的是服务所在的命名空间。 +- **svc**:这表示这是一个服务(Service)。在 Kubernetes 中,服务是定义一组逻辑上相关的 Pod 访问规则的抽象,它允许外部访问或集群内部的负载均衡和服务发现。 +- **cluster.local**:这是集群的默认域名。在 Kubernetes 集群中,所有的内部服务都默认位于这个域。 +- **443**:这是端口号。 + +## 创建服务别名(Service Alias) + +1. **创建一个 `Service` 对象**:在目标命名空间中创建一个新的服务对象,该对象会将流量转发到原始服务。 + + ```bash + vi service-alias.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: v1 + kind: Service + metadata: + name: kubernetes-service-alias + namespace: default + spec: + type: ExternalName + externalName: kubernetes.default.svc.cluster.local + ``` + +2. 部署 Yaml + + ```bash + kubectl apply -f service-alias.yaml + ``` + +3. **使用别名访问服务** + + 现在,`default` 命名空间中的 Pod 可以通过 `kubernetes-service-alias` 这个服务名来访问 `kubernetes` 服务。 + +# 总结 + +通过以上方法,你可以在 Kubernetes 集群中实现跨命名空间访问服务。使用 FQDN 是最直接的方法,而使用服务别名则提供了更大的灵活性。如果需要更严格的网络控制,可以结合 NetworkPolicy 来管理跨命名空间的访问。根据你的具体需求选择合适的方法。 \ No newline at end of file diff --git a/使用文档/挂载Configmap配置文件.md b/使用文档/挂载Configmap配置文件.md new file mode 100644 index 0000000..66906b4 --- /dev/null +++ b/使用文档/挂载Configmap配置文件.md @@ -0,0 +1,26 @@ +> 本文作者:丁辉 +> + +# 挂载Configmap配置文件 + +> 解决Kubernetes ConfigMap挂载导致容器目录覆盖的问题 + +- 创建 Configmap + + ```bash + kubectl create configmap demo-config --from-file=./config.js + ``` + +- 编辑 POD 容器 + + ```yaml + volumeMounts: + - name: file + mountPath: /opt/config.js #挂载到容器内的路径 + subPath: config.js #目录内其他内容不会被清理掉 + volumes: + - name: file + configMap: + name: demo-config + ``` + diff --git a/使用文档/查看Kubernetes内所有特权容器.md b/使用文档/查看Kubernetes内所有特权容器.md new file mode 100644 index 0000000..e8d93a4 --- /dev/null +++ b/使用文档/查看Kubernetes内所有特权容器.md @@ -0,0 +1,34 @@ +> 本文作者:丁辉 + +# 查看Kubernetes内所有特权容器 + +1. 安装 JQ + + - Centos + + ```bash + yum -y install jq + ``` + + - Ubuntu + + ```bash + apt -y install jq + ``` + +2. 查找特权容器 + + - 查找特权容器并输出命名空间、容器名 + + ```bash + kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].securityContext.privileged==true) | {namespace: .metadata.namespace, pod: .metadata.name}' + ``` + + - 查找特权容器并输出命名空间、容器名、容器端口 + + ```bash + kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].securityContext.privileged==true) | {namespace: .metadata.namespace, pod: .metadata.name, ports: .spec.containers[].ports}' + ``` + + + diff --git a/使用文档/跨Namespace同步Secret和ConfigMap.md b/使用文档/跨Namespace同步Secret和ConfigMap.md new file mode 100644 index 0000000..0fcb288 --- /dev/null +++ b/使用文档/跨Namespace同步Secret和ConfigMap.md @@ -0,0 +1,42 @@ +> 本文作者:丁辉 + +# 跨Namespace同步Secret和ConfigMap + +> 示例:同步 `test` 命名空间下的 `demo-secret` 到 `default` 命名空间下 + +## JQ实现 + +1. 准备依赖 `jq` + + - Centos + + ```bash + yum install jq -y + ``` + + - Ubuntu + + ```bash + apt install jq -y + ``` + +2. 执行命令 + + ```bash + kubectl get secret demo-secret -n test -o json \ + | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \ + | kubectl apply -n default -f - + ``` + +## SED实现 + +```bash +kubectl get secret demo-secret -n test -o json \ + | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \ + | kubectl apply -n default -f - +``` + +## Helm部署Config-Syncer实现自动同步 + +请查看此文档:[Helm部署Config-Syncer](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Config-Syncer.md) + diff --git a/存储/Ceph/Ceph创建RBD块存储.md b/存储/Ceph/Ceph创建RBD块存储.md new file mode 100644 index 0000000..350dbcb --- /dev/null +++ b/存储/Ceph/Ceph创建RBD块存储.md @@ -0,0 +1,52 @@ +> 本文作者:丁辉 + +# Ceph创建RBD块存储 + +## 开始创建 + +1. 创建 Pool + + ```bash + ceph osd pool create kubernetes + ``` + +2. 初始化 RBD + + ```bash + rbd pool init kubernetes + ``` + +3. 创建访问块设备的认证用户 + + ```bash + ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' + ``` + + +## 清理删除 + +1. 查找池中所有 RBD 镜像 + + ```bash + rbd ls -l kubernetes + ``` + +2. 删除 RBD 镜像 + + ```bash + rbd rm kubernetes/csi-vol-5a69b8e4-e8b5-4e74-8a41-1c7725f4c5f0 + ``` + +3. 删除 Pool + + ```bash + ceph osd pool rm kubernetes kubernetes --yes-i-really-really-mean-it + ``` + +4. 删除认证用户 + + ```bash + ceph auth del client.kubernetes + ``` + + \ No newline at end of file diff --git a/存储/Ceph/Ceph创建文件系统.md b/存储/Ceph/Ceph创建文件系统.md new file mode 100644 index 0000000..4a595ea --- /dev/null +++ b/存储/Ceph/Ceph创建文件系统.md @@ -0,0 +1,66 @@ +> 本文作者:丁辉 + +# Ceph创建文件系统 + +## 开始创建 + +[官方文档](https://docs.ceph.com/en/reef/cephfs/createfs/) + +1. 创建存储池 + + > 一个 ceph 文件系统需要至少两个 RADOS 存储池,一个用于存储数据,一个用于存储元数据 + + ```bash + ceph osd pool create cephfs_data + ceph osd pool create cephfs_metadata + ``` + + 检查 + + ```bash + ceph osd pool ls + ``` + +2. 创建 cephfs + + ```bash + ceph fs new cephfs cephfs_metadata cephfs_data + ``` + + 检查 + + ```bash + ceph fs ls + ``` + +3. 设置可用的元数据服务器 MDS 数量 + + 查看 MDS 状态 + + ```bash + ceph mds stat + ``` + + > 结果为 `cephfs-1/1/1 up {0=rainbond=up:active}` + + 设置 MDS 数量 + + ```bash + ceph fs set cephfs max_mds 1 + ``` + +4. 配置认证用户 cephfs + + ```bash + ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata' + ``` + +5. 查看 cephfs 用户密钥 + + ```bash + ceph auth get client.cephfs + ``` + +6. 本地挂载测试 + + 请查看此篇文章 [Ceph挂载文件系统](https://gitee.com/offends/Kubernetes/blob/main/%E5%AD%98%E5%82%A8/Ceph/Ceph%E6%8C%82%E8%BD%BD%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.md) 尝试挂载 diff --git a/存储/Ceph/Ceph基础环境准备.md b/存储/Ceph/Ceph基础环境准备.md new file mode 100644 index 0000000..45db51d --- /dev/null +++ b/存储/Ceph/Ceph基础环境准备.md @@ -0,0 +1,95 @@ +> 本文作者:丁辉 + +# Ceph基础环境准备 + +| 节点名称 | IP | +| :---------: | :----------: | +| ceph-node-1 | 192.168.1.10 | +| ceph-node-2 | 192.168.1.20 | +| ceph-node-3 | 192.168.1.30 | + +1. 所有节点时间同步(必做) + + [请查看此文章](https://gitee.com/offends/Linux/blob/main/Docs/NTP%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5.md) + +2. 更改主机名 + + - ceph-node-1 + + ```bash + hostnamectl set-hostname ceph-node-1 && bash + ``` + + - ceph-node-2 + + ```bash + hostnamectl set-hostname ceph-node-2 && bash + ``` + + - ceph-node-3 + + ```bash + hostnamectl set-hostname ceph-node-3 && bash + ``` + +3. 配置 Hosts 文件 + + ```bash + cat >> /etc/hosts < 如果遇到设备资源繁忙可查看此文档 [设备或资源繁忙问题解决](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95/%E8%AE%BE%E5%A4%87%E6%88%96%E8%B5%84%E6%BA%90%E7%B9%81%E5%BF%99.md) + + - 官方清理方法 + + ```bash + docker run --rm --privileged=true \ + -v /dev/:/dev/ \ + -e OSD_DEVICE=/dev/sdb \ + quay.io/ceph/daemon:latest zap_device + ``` + + - [磁盘清理](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/%E7%A3%81%E7%9B%98%E6%B8%85%E7%90%86.md) + + - 下载脚本清理 + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Shell/clean-disk-ceph.sh + ``` + + > 通过修改 `DISK=""` 字段实现选择磁盘 + +7. 配置快捷命令 + + ```bash + echo 'alias ceph="docker exec ceph-mon ceph"' >> /etc/profile + source /etc/profile + ``` diff --git a/存储/Ceph/Ceph常用配置文件参数解释.md b/存储/Ceph/Ceph常用配置文件参数解释.md new file mode 100644 index 0000000..f6e6dfd --- /dev/null +++ b/存储/Ceph/Ceph常用配置文件参数解释.md @@ -0,0 +1,9 @@ +> 本文作者:丁辉 + +# Ceph常用配置文件参数解释 + +| 参数名称 | 作用描述 | +| ------------------------------ | ------------------------------------------------------------ | +| `osd_pool_default_size` | 设置对象存储池(Object Storage Pool)的默认副本数量。该值定义了在Ceph集群中存储对象的默认副本数,即数据在集群中的冗余程度。增加副本数量可以提高数据的可靠性和容错性,但也会占用更多的存储空间。 | +| `osd max object name len` | 设置对象名称的最大长度。Ceph中的对象(Object)可以通过名称进行标识,该参数指定了对象名称的最大长度限制。对象名称的长度不能超过该值,否则可能会导致错误或无法创建对象。 | +| `osd max object namespace len` | 设置对象命名空间的最大长度。Ceph中的对象存储在命名空间(Namespace)下,该参数指定了对象命名空间的最大长度限制。对象命名空间的长度不能超过该值,否则可能会导致错误或无法创建对象。 | \ No newline at end of file diff --git a/存储/Ceph/Ceph挂载文件系统.md b/存储/Ceph/Ceph挂载文件系统.md new file mode 100644 index 0000000..8f6c2ca --- /dev/null +++ b/存储/Ceph/Ceph挂载文件系统.md @@ -0,0 +1,32 @@ +> 本文作者:丁辉 + +# Ceph挂载文件系统 + +> 本文拿默认 cephfs 举例 + +1. 本地安装 ceph 客户端 + + - Centos + + ```bash + yum install -y ceph-common + ``` + + - Ubuntu + + ```bash + apt install -y ceph-common + ``` + + +2. 查看 cephfs 用户密钥 + + ```bash + ceph auth get client.cephfs + ``` + +3. 挂载文件系统到本地 /mnt/ 下测试 + + ```bash + mount -t ceph ceph-node-1:6789:/ /mnt/ -o name=cephfs,secret=AQAHjRdmdrPAAxAAuCtGNkM/W5XAVU2rWkUz+w== + ``` \ No newline at end of file diff --git a/存储/Ceph/Docker单机部署Ceph集群(无裸盘).md b/存储/Ceph/Docker单机部署Ceph集群(无裸盘).md new file mode 100644 index 0000000..066bc4f --- /dev/null +++ b/存储/Ceph/Docker单机部署Ceph集群(无裸盘).md @@ -0,0 +1,180 @@ +> 本文作者:丁辉 + +# Docker单机部署Ceph集群(无裸盘) + +> 无压力 C+V 即可部署成功 + +1. 创建Ceph专用网络 + + ```bash + docker network create --driver bridge --subnet 172.20.0.0/16 ceph-network + ``` + +2. 拉取搭建用镜像 + + ```bash + docker pull ceph/daemon:latest + ``` + +3. 搭建mon节点 + + ```bash + docker run -d --name ceph-mon \ + --restart=always \ + --network ceph-network --ip 172.20.0.10 \ + -e MON_NAME=ceph-mon \ + -e MON_IP=172.20.0.10 \ + -e CEPH_PUBLIC_NETWORK=172.20.0.0/16 \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest mon + ``` + +4. 禁用不安全认证 + + > 这个参数控制是否允许在集群中通过全局 ID 回收机制(global ID reclaim)来认证用户身份 + + ```bash + docker exec ceph-mon ceph config set mon auth_allow_insecure_global_id_reclaim false + ``` + +5. 创建 osd 秘钥 + + ```bash + docker exec ceph-mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring + ``` + +6. 搭建 osd 节点 + + ```bash + docker run -d --name ceph-osd-1 \ + --privileged=true \ + --restart=always \ + --network ceph-network --ip 172.20.0.11 \ + -e OSD_TYPE=directory \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /var/lib/ceph/osd/osd-1:/var/lib/ceph/osd \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest osd + + docker run -d --name ceph-osd-2 \ + --privileged=true \ + --restart=always \ + --network ceph-network --ip 172.20.0.12 \ + -e OSD_TYPE=directory \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /var/lib/ceph/osd/osd-2:/var/lib/ceph/osd \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest osd + + docker run -d --name ceph-osd-3 \ + --privileged=true \ + --restart=always \ + --network ceph-network --ip 172.20.0.13 \ + -e OSD_TYPE=directory \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /var/lib/ceph/osd/osd-3:/var/lib/ceph/osd \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest osd + ``` + +7. 搭建 mgr 节点 + + ```bash + docker run -d --name ceph-mgr \ + --restart=always \ + --network ceph-network --ip 172.20.0.14 \ + -p 7000:7000 \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest mgr + ``` + +8. 开启管理界面(查看此文档) + + [MGR开启监控管理界面](https://gitee.com/offends/Kubernetes/blob/main/%E5%AD%98%E5%82%A8/Ceph/MGR%E5%BC%80%E5%90%AF%E7%9B%91%E6%8E%A7%E7%AE%A1%E7%90%86%E7%95%8C%E9%9D%A2.md) + +9. 创建 rgw 秘钥 + + ```bash + docker exec ceph-mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring + ``` + +10. 搭建 rgw 节点 + + ```bash + docker run -d --name ceph-rgw \ + --restart=always \ + --network ceph-network --ip 172.20.0.15 \ + -p 7480:7480 \ + -e RGW_NAME=ceph-rgw \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest rgw + ``` + +11. 搭建 mds 节点 + + ```bash + docker run -d --name ceph-mds \ + --restart=always \ + --network ceph-network --ip 172.20.0.16 \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + -e MDS_NAME=ceph-mds \ + -e CEPHFS_CREATE=1 \ + -e CEPHFS_NAME=cephfs \ + -e CEPHFS_DATA_POOL=cephfs_data \ + -e CEPHFS_DATA_POOL_PG=128 \ + -e CEPHFS_METADATA_POOL=cephfs_metadata \ + -e CEPHFS_METADATA_POOL_PG=64 \ + ceph/daemon:latest mds + ``` + +12. 检查Ceph状态 + + ```bash + docker exec ceph-mon ceph -s + ``` + + 挂载地址为:172.20.0.10:6789 + +# 卸载清理 + +1. 清理容器 + + ```bash + docker rm -f ceph-mon + docker rm -f ceph-osd-1 + docker rm -f ceph-osd-2 + docker rm -f ceph-osd-3 + docker rm -f ceph-mgr + docker rm -f ceph-rgw + docker rm -f ceph-mds + ``` + +2. 清理持久化目录 + + ```bash + rm -rf {/etc/ceph,/var/lib/ceph,/var/log/ceph} + ``` + +3. 清理 Docker 网络 + + ```bash + docker network rm ceph-network + ``` diff --git a/存储/Ceph/Docker部署高可用Ceph集群.md b/存储/Ceph/Docker部署高可用Ceph集群.md new file mode 100644 index 0000000..1e0323a --- /dev/null +++ b/存储/Ceph/Docker部署高可用Ceph集群.md @@ -0,0 +1,210 @@ +> 本文作者:丁辉 + +# Docker部署高可用Ceph集群 + +[CEPH版本](https://docs.ceph.com/en/latest/releases/) [CEPH下载](http://download.ceph.com/) + +[DockerHub仓库(已废弃)](https://hub.docker.com/r/ceph/daemon) [Quay仓库](https://quay.io/repository/ceph/daemon) + +| 节点名称 | IP | 存储盘 | 角色 | +| :---------: | :----------: | :------: | :-----------------: | +| ceph-node-1 | 192.168.1.10 | /dev/sdb | mon,mgr,osd,mds,rgw | +| ceph-node-2 | 192.168.1.20 | /dev/sdb | mon,mgr,osd,mds,rgw | +| ceph-node-3 | 192.168.1.30 | /dev/sdb | mon,mgr,osd,mds,rgw | + +**组件介绍** + +- OSD(Object Storage Daemon):负责管理磁盘上的数据块,执行数据的读写操作,并确保集群的高可用性。通常至少需要部署三个节点以保证系统的稳定运行。 +- MON(Monitor):负责维护 Ceph 集群的状态、配置和映射信息,保障集群元数据的一致性,协调节点间数据的分布和恢复。为确保集群的高可用性,一般需要至少部署三个节点。 +- MDS(Metadata Server):负责管理文件系统的目录结构和文件/目录的元数据信息,为 CephFS(Ceph 的分布式文件系统)提供元数据服务。需要注意的是,块存储和对象存储不需要部署 MDS。 +- MGR(Manager):负责收集 Ceph 集群的状态信息,包括 OSD、MON、MDS 的性能指标和健康状况,并提供可视化的仪表板(Ceph Dashboard)供用户查看。为确保集群的高可用性,通常至少需要部署两个节点。 +- RGW(Rados Gateway):提供了 RESTful API,允许用户通过 HTTP/HTTPS 请求访问和管理存储在 Ceph 集群中的数据。支持 Amazon S3 API 和 OpenStack Swift API。 + +**使用镜像介绍** + +- `ceph/daemon` 是一个 Docker 镜像,它用于运行 Ceph 集群中的各种守护进程,如监控节点(MON)、管理节点(MGR)、元数据服务器(MDS)、对象存储守护进程(OSD)以及 RADOS 网关(RGW)。这个镜像包含了运行一个完整 Ceph 存储集群所需的所有组件,使得部署和管理变得更加容易和灵活,特别是在容器化环境中。 + +- `ceph/daemon` 镜像的优点是可以简化 Ceph 的部署和运维过程,因为它预配置了 Ceph 的各种服务和依赖,用户只需通过设置适当的环境变量和参数即可快速启动各种 Ceph 组件。这使得它在动态的云环境中特别有用,可以轻松地扩展或更新集群。 + +- 此外,使用 Docker 运行 Ceph 服务还有助于隔离不同服务的运行环境,提高系统的安全性和稳定性。 + +## 基础环境准备 + +[请查看此文章](https://gitee.com/offends/Kubernetes/blob/main/存储/Ceph/Ceph基础环境准备.md) + +## 开始部署 + +### 部署监视器 MON + +1. 节点一启动 mon + + ```bash + docker run -d --net=host \ + --name ceph-mon \ + --restart=always \ + --privileged=true \ + -v /dev:/dev \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + -e MON_IP=192.168.1.10 \ + -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ + ceph/daemon:latest mon + ``` + +2. 禁用不安全认证 + + > 这个参数控制是否允许在集群中通过全局 ID 回收机制(global ID reclaim)来认证用户身份 + + ```bash + ceph config set mon auth_allow_insecure_global_id_reclaim false + ``` + +3. 创建 OSD 秘钥 + + ```bash + ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring + ``` + +5. 拷贝节点一 ceph 目录, 传输至节点二和节点三, 传输完后按照第一步启动容器 + + > 注意修改 MON_IP + + ```bash + # 节点二 + scp -r /etc/ceph/ root@ceph-node-2:/etc/ + scp -r /var/lib/ceph root@ceph-node-2:/var/lib/ceph + # 节点三 + scp -r /etc/ceph root@ceph-node-3:/etc/ceph + scp -r /var/lib/ceph root@ceph-node-3:/var/lib/ceph + ``` + +### 部署监控 MGR + +> 为了确保集群的高可用性, 通常至少要部署两个节点 + +```bash +docker run -d --net=host \ + --name ceph-mgr \ + --restart=always \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest mgr +``` + +### 部署存储 OSD + +1. 初始化块存储 + + ```bash + docker exec ceph-mon ceph-volume lvm prepare --data /dev/sdb + ``` + + ceph-volume **参数解释** + + | 参数 | 解释 | + | ---------------------- | ------------------------------------------------------------ | + | `--bluestore` | 指定使用 Bluestore 存储引擎。Bluestore 是 Ceph 的一种存储格式,不依赖于文件系统,直接在裸设备上操作数据。 | + | `--filestore` | 指定使用 Filestore 存储引擎。Filestore 是较旧的存储格式,它在底层文件系统(如 XFS)之上操作数据。 | + | `--no-systemd` | 在创建时禁止生成 systemd 单元文件。通常用于不使用 systemd 的系统或者在特定的管理脚本中需要手动管理服务启动。 | + | `--data` | 指定用于数据存储的设备或分区。 | + | `--db` | 仅用于 Bluestore。指定用于存放数据库的设备或分区,可以提升性能。 | + | `--wal` | 仅用于 Bluestore。指定用于写入前日志(Write-Ahead Log)的设备或分区,用于提升写入性能。 | + | `--journal` | 仅用于 Filestore。指定日志存放的设备或分区,用于提升日志处理性能。 | + | `--prepare` | 准备磁盘用于 Ceph 使用,但不启动 OSD。 | + | `--activate` | 激活之前已准备好的 OSD。 | + | `--crush-device-class` | 指定设备的 CRUSH 类别,用于 Ceph 集群的数据分布和复制策略中。 | + +2. 部署 OSD + + > 注意:根据自己情况修改 OSD_ID + + ```bash + docker run -d --net=host --name=ceph-osd \ + --privileged=true \ + -e OSD_ID=0 \ + -v /dev/:/dev/ \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon:latest osd_ceph_volume_activate + ``` + + >使用本地目录启动 OSD + > + >```bash + >docker run -d --net=host --name=ceph-osd \ + > --privileged=true \ + > -v /etc/ceph:/etc/ceph \ + > -v /var/lib/ceph/:/var/lib/ceph/ \ + > -v /var/log/ceph/:/var/log/ceph/ \ + > -v /var/lib/ceph/osd/osd-0:/var/lib/ceph/osd \ + > -v /etc/localtime:/etc/localtime:ro \ + > ceph/daemon:latest osd_directory + >``` + +### 部署文件系统 MDS + +```bash +docker run -d --net=host \ + --name ceph-mds \ + --restart=always \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + -e CEPHFS_CREATE=1 \ + -e CEPHFS_NAME=cephfs \ + -e CEPHFS_DATA_POOL=cephfs_data \ + -e CEPHFS_DATA_POOL_PG=128 \ + -e CEPHFS_METADATA_POOL=cephfs_metadata \ + -e CEPHFS_METADATA_POOL_PG=64 \ + ceph/daemon:latest mds +``` + +### 部署对象存储接 RGW + +1. 创建 Rgw 密钥 + + ```bash + docker exec ceph-mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring + ``` + +2. 启动 + + ```bash + docker run -d --net=host \ + --name=ceph-rgw \ + --restart=always \ + -v /etc/ceph:/etc/ceph \ + -v /var/lib/ceph/:/var/lib/ceph/ \ + -v /var/log/ceph/:/var/log/ceph/ \ + -v /etc/localtime:/etc/localtime:ro \ + ceph/daemon rgw + ``` + +### 开启管理界面 + +查看此文档 [MGR开启监控管理界面](https://gitee.com/offends/Kubernetes/blob/main/存储/Ceph/MGR开启监控管理界面.md) + +## 卸载 + +1. 删除容器 + + ```bash + docker rm -f ceph-mon + docker rm -f ceph-mgr + docker rm -f ceph-osd + docker rm -f ceph-mds + docker rm -f ceph-rgw + ``` + +2. 删除持久化目录 + + ```bash + rm -rf {/etc/ceph,/var/lib/ceph,/var/log/ceph} + ``` diff --git a/存储/Ceph/MGR开启监控管理界面.md b/存储/Ceph/MGR开启监控管理界面.md new file mode 100644 index 0000000..2b3b74e --- /dev/null +++ b/存储/Ceph/MGR开启监控管理界面.md @@ -0,0 +1,51 @@ +> 本文作者:丁辉 + +# MGR开启监控管理界面 + +1. 开启 dashboard + + ```bash + docker exec ceph-mgr ceph mgr module enable dashboard + ``` + +2. 创建证书 + + ```bash + docker exec ceph-mgr ceph dashboard create-self-signed-cert + ``` + +3. 创建登陆用户名和密码 + + ```bash + docker exec ceph-mgr sh -c 'echo "admin" > /password.txt' + docker exec ceph-mgr ceph dashboard set-login-credentials admin -i /password.txt + ``` + +4. 配置外部访问端口 + + ```bash + docker exec ceph-mgr ceph config set mgr mgr/dashboard/server_port 7000 + ``` + +5. 配置外部访问 + + ```bash + docker exec ceph-mgr ceph config set mgr mgr/dashboard/server_addr 192.168.1.10 + ``` + +6. 关闭 HTTPS + + ```bash + docker exec ceph-mgr ceph config set mgr mgr/dashboard/ssl false + ``` + +7. 重启 Mgr + + ```bash + docker exec ceph-mgr ceph mgr module disable dashboard + docker exec ceph-mgr ceph mgr module enable dashboard + ``` + +访问地址: `http://127.0.0.1:7000/` + +账户密码: `admin/admin` \ No newline at end of file diff --git a/存储/Ceph/README.md b/存储/Ceph/README.md new file mode 100644 index 0000000..7bb6819 --- /dev/null +++ b/存储/Ceph/README.md @@ -0,0 +1,8 @@ +> 本文作者:丁辉 + +# CEPH对接Kubernetes-StorageClass + +> 相关文档地址 + +- [Helm对接外部Ceph](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E5%AF%B9%E6%8E%A5%E5%A4%96%E9%83%A8Ceph.md) +- [Helm部署Rook-Ceph](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Rook-Ceph.md) diff --git a/存储/JuiceFS/README.md b/存储/JuiceFS/README.md new file mode 100644 index 0000000..9f81a7e --- /dev/null +++ b/存储/JuiceFS/README.md @@ -0,0 +1,9 @@ +> 本文作者:丁辉 + +# JuiceFS对接Kubernetes-StorageClass + +> 相关文档地址 + +**查看此篇文章** + +[Helm部署JuiceFS-CSI对接对象存储](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2JuiceFS-CSI%E5%AF%B9%E6%8E%A5%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8.md) diff --git a/存储/NFS/README.md b/存储/NFS/README.md new file mode 100644 index 0000000..e72fb65 --- /dev/null +++ b/存储/NFS/README.md @@ -0,0 +1,13 @@ +> 本文作者:丁辉 + +# 对接NFS相关文档 + +> 相关文档地址 + +- [Linux部署NFS存储](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/NFS/Linux%E9%83%A8%E7%BD%B2NFS%E5%AD%98%E5%82%A8.md) +- [Rsync常用参数解释](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/NFS/Rsync%E5%B8%B8%E7%94%A8%E5%8F%82%E6%95%B0%E8%A7%A3%E9%87%8A.md) +- [NFS服务优化](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/NFS/NFS%E6%9C%8D%E5%8A%A1%E4%BC%98%E5%8C%96.md) +- [Nfs高可用实现Rsync+Inotify](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/NFS/Nfs%E9%AB%98%E5%8F%AF%E7%94%A8%E5%AE%9E%E7%8E%B0Rsync+Inotify.md) +- [Nfs高可用实现Rsync+Sersync2](https://gitee.com/offends/Linux/blob/main/%E5%AD%98%E5%82%A8/NFS/Nfs%E9%AB%98%E5%8F%AF%E7%94%A8%E5%AE%9E%E7%8E%B0Rsync+Sersync2.md) +- [Helm对接外部NFS存储](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E5%AF%B9%E6%8E%A5%E5%A4%96%E9%83%A8NFS%E5%AD%98%E5%82%A8.md) + diff --git a/存储/OpenEBS/README.md b/存储/OpenEBS/README.md new file mode 100644 index 0000000..781ce3f --- /dev/null +++ b/存储/OpenEBS/README.md @@ -0,0 +1,9 @@ +> 本文作者:丁辉 + +# OpenEBS对接Kubernetes-StorageClass + +> 相关文档地址 + +**查看此篇文章** + +[Helm部署OpenEBS储库](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2OpenEBS%E5%AD%98%E5%82%A8.md) diff --git a/存储/README.md b/存储/README.md new file mode 100644 index 0000000..ea1e2a6 --- /dev/null +++ b/存储/README.md @@ -0,0 +1,9 @@ +> 本文作者:丁辉 + +# 磁盘读写性能测试 + +> 相关文档地址 + +**查看如下文档** + +[磁盘读写性能测试](https://gitee.com/offends/Kubernetes/tree/main/Docker/Dockerfile/Fio/README.md) diff --git a/存储/问题记录/Ceph问题记录.md b/存储/问题记录/Ceph问题记录.md new file mode 100644 index 0000000..464c570 --- /dev/null +++ b/存储/问题记录/Ceph问题记录.md @@ -0,0 +1,40 @@ +> 本文作者:丁辉 + +# Ceph问题记录 + +> 重启 Mon 后 `/opt/ceph-container/bin/entrypoint.sh: Existing mon, trying to rejoin cluster...` + +- 该问题通过以下方式"解决": 在 Mon 持久化目录中 `rm -rf /var/lib/ceph/mon/` , 其他 mon 将需要重复同样的修复方式。 + + 或 + +- 修改启动文件修复 + + 1. 将 mon 容器内的启动脚本复制到宿主机中。 + + ```bash + docker cp ceph-mon:/opt/ceph-container/bin/start_mon.sh . + ``` + + 2. 修改启动脚本 + + ```bash + # 找到如下代码,注释掉 + v2v1=$(ceph-conf -c /etc/ceph/"${CLUSTER}".conf 'mon host' | tr ',' '\n' | grep -c "${MON_IP_NO_BRACKETS}") + # 替换为如下代码 + v2v1=2 + ``` + + 3. 将修改后的启动脚本再复制到容器中 + + ```bash + docker cp start_mon.sh ceph-mon:/opt/ceph-container/bin/start_mon.sh + ``` + + 4. 重新启动 mon 容器 + + ```bash + docker restart ceph-mon + ``` + + 5. 再重启其他两个 mon 节点即可恢复 \ No newline at end of file diff --git a/监控/Grafana/Grafana可视化面板下载.md b/监控/Grafana/Grafana可视化面板下载.md new file mode 100644 index 0000000..52f06be --- /dev/null +++ b/监控/Grafana/Grafana可视化面板下载.md @@ -0,0 +1,10 @@ +> 本文作者:丁辉 + +# Grafana可视化面板下载 + +[Dashboards仪表盘下载](https://grafana.com/grafana/dashboards/) + +[Dashboards仪表盘官方演示环境](https://play.grafana.org/) + +[Grafana插件下载](https://grafana.com/grafana/plugins/) + diff --git a/监控/Prometheus/Prometheus监控自动发现服务.md b/监控/Prometheus/Prometheus监控自动发现服务.md new file mode 100644 index 0000000..278a7d1 --- /dev/null +++ b/监控/Prometheus/Prometheus监控自动发现服务.md @@ -0,0 +1,26 @@ +> 本文作者:丁辉 + +# Prometheus监控自动发现服务 + +> 还在学习中记录一下一些常用参数 + +```yaml +global: + scrape_interval: 15s # 全局的抓取间隔时间 + +scrape_configs: + - job_name: 'rbd-chaos' # 作业名称,可自定义 + kubernetes_sd_configs: + - role: endpoints # 使用Kubernetes服务发现 + relabel_configs: + - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] + regex: rbd-system;rbd-chaos # 匹配命名空间和服务名 + action: keep # 仅保留匹配的端点 + - source_labels: [__address__] + target_label: component + replacement: builder # 添加component标签为"builder" + - source_labels: [__address__] + target_label: service_name + replacement: builder # 添加service_name标签为"builder" +``` + diff --git a/监控/README.md b/监控/README.md new file mode 100644 index 0000000..0c04d41 --- /dev/null +++ b/监控/README.md @@ -0,0 +1,13 @@ +> 本文作者:丁辉 + +# 监控部署 + +> 相关文档地址 + +- [Helm部署Kube-Prometheus-Stack](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Kube-Prometheus-Stack.md) +- [Helm部署Loki-Stack](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Loki-Stack.md) +- [Helm部署Metrics-Server](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Metrics-Server.md) +- [Helm部署Nightingale](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Nightingale.md) +- [Helm部署PrometheusAlert](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2PrometheusAlert.md) +- [N9e对接Kube-Prometheus-Stack](https://gitee.com/offends/Kubernetes/blob/main/Helm/N9e%E5%AF%B9%E6%8E%A5Kube-Prometheus-Stack.md) +- [Helm部署HertzBeat](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2HertzBeat.md) diff --git a/网关/GatewayAPI/README.md b/网关/GatewayAPI/README.md new file mode 100644 index 0000000..9405e8d --- /dev/null +++ b/网关/GatewayAPI/README.md @@ -0,0 +1,5 @@ +> 本文作者:丁辉 + +# 部署GatewayAPI + +[网关控制器列表](https://gateway-api.sigs.k8s.io/implementations/) diff --git a/网关/Ingress/Ingress公开TCP和UDP服务.md b/网关/Ingress/Ingress公开TCP和UDP服务.md new file mode 100644 index 0000000..300a62a --- /dev/null +++ b/网关/Ingress/Ingress公开TCP和UDP服务.md @@ -0,0 +1,46 @@ +> 本文作者:丁辉 + +# Ingress公开TCP和UDP服务 + +[官方文档](https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/) + +1. 添加 Ingress 启动参数 + + ```yaml + - --tcp-services-configmap=$(POD_NAMESPACE)/ingress-nginx-tcp + - --udp-services-configmap=$(POD_NAMESPACE)/ingress-nginx-udp + ``` + +2. 创建 Configmap + + > 格式为:::[PROXY]:[PROXY] + + - TCP + + ```yaml + cat < 本文作者:丁辉 + +# Ingress问题记录 + +> 重启 ingress 控制器后报错 + +```bash +------------------------------------------------------------------------------- +NGINX Ingress controller + Release: v1.10.1 + Build: 4fb5aac1dd3669daa3a14d9de3e3cdb371b4c518 + Repository: https://github.com/kubernetes/ingress-nginx + nginx version: nginx/1.25.3 + +------------------------------------------------------------------------------- + +F0504 11:14:47.852320 7 main.go:64] port 80 is already in use. Please check the flag --http-port +``` + +**解决方法** + +> 允许从端口 1 开始的所有端口都可以被非特权用户使用 + +- 临时解决 + + ```bash + sysctl -w net.ipv4.ip_unprivileged_port_start=1 + ``` + +- 永久 + + ```bash + echo 'net.ipv4.ip_unprivileged_port_start = 1' > /etc/sysctl.d/ip_unprivileged_port_start.conf + ``` + +**总结** + +这根本就是权限问题, 而官方的报错存在误导性。很让人生气啊, 硬生生看了一下午。 \ No newline at end of file diff --git a/网关/Ingress/README.md b/网关/Ingress/README.md new file mode 100644 index 0000000..aacc0cb --- /dev/null +++ b/网关/Ingress/README.md @@ -0,0 +1,9 @@ +> 本文作者:丁辉 + +# Helm部署Nginx-Ingress + +> 相关文档地址 + +**查看此篇文章** + +[Helm部署Nginx-Ingress](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Nginx-Ingress.md) diff --git a/网关/README.md b/网关/README.md new file mode 100644 index 0000000..35354f6 --- /dev/null +++ b/网关/README.md @@ -0,0 +1,53 @@ +> 本文作者:丁辉 + +# 网关介绍 + +> Ingress和Gateway API都是Kubernetes集群中用于处理外部流量进入集群的资源类型,但它们有不同的设计目标和功能特点。 + +## Ingress + +**Ingress** 是Kubernetes中用来管理进入集群的HTTP和HTTPS流量的资源。它通过定义一些规则来控制服务如何对外暴露,并且通常与Ingress控制器一起使用,后者负责实际处理和路由流量。 + +### 主要特点: + +1. **规则定义**:通过定义主机名、路径等规则来路由流量到不同的服务。 +2. **TLS支持**:可以配置TLS证书以支持HTTPS。 +3. **负载均衡**:提供基础的负载均衡功能。 +4. **扩展性**:通过注解支持一些扩展功能,但这些功能通常是特定于某个Ingress控制器的。 + +### 常见Ingress控制器: + +- NGINX Ingress Controller +- Traefik +- HAProxy +- Kong + +## Gateway API + +**Gateway API** 是Kubernetes社区中一个相对较新的项目,它提供了一组面向现代服务的标准化API,旨在替代和扩展现有的Ingress API。Gateway API更加灵活和强大,能够支持更复杂的路由和流量管理需求。 + +### 主要特点: + +1. **分离角色**:将Gateway(流量入口)与Route(路由规则)分开,允许不同团队分别管理。 +2. **增强的路由能力**:支持HTTP、TCP、TLS等多种协议,并且能够定义更复杂的路由规则。 +3. **统一的配置模型**:提供了一致的配置模型,便于扩展和定制。 +4. **多租户支持**:通过支持Namespace和GatewayClass,方便在多租户环境中使用。 + +### 主要资源: + +- **Gateway**:定义网关的配置,如监听端口、协议等。 +- **GatewayClass**:定义网关的实现类型。 +- **HTTPRoute**、**TCPRoute**、**TLSRoute**等:定义具体的路由规则。 + +## Kubernetes官方对Ingress和Gateway API的态度 + +### **Ingress API** + +- **稳定性**:Ingress API已经在Kubernetes中稳定运行多年,是许多集群中用于管理外部流量的关键组件。 +- **维护**:虽然Ingress API依然会继续维护,但其功能和扩展性已经接近饱和,未来的开发重点将更多地转向Gateway API。 + +### **Gateway API** + +- **现代化设计**:Gateway API是一个更现代化的流量管理解决方案,设计上更加模块化、灵活,并且具备更强的可扩展性。 +- **功能丰富**:相比Ingress API,Gateway API支持更多的协议(如TCP、UDP、TLS等),并且可以定义更复杂的路由和流量管理规则。 +- **未来发展方向**:Kubernetes社区将把主要的开发和改进精力投入到Gateway API上,以满足未来更加复杂和多样化的流量管理需求。 diff --git a/网络/README.md b/网络/README.md new file mode 100644 index 0000000..7b97811 --- /dev/null +++ b/网络/README.md @@ -0,0 +1,13 @@ +* + +> 本文作者:丁辉 + +# 网络 + +> 目录详情 + +| 文件夹名 | 内容 | +| :----------: | :----------------------------------------: | +| 内网穿透 | 使用Docker、Kubernetes实现内网穿透文档目录 | +| 网络插件安装 | Kubernetes网络插件安装文档 | + diff --git a/网络/Tor/README.md b/网络/Tor/README.md new file mode 100644 index 0000000..cf6854f --- /dev/null +++ b/网络/Tor/README.md @@ -0,0 +1,16 @@ +* + +> 本文作者:丁辉 + +# Tor + +## 官方网站引导 + +- [官方文档](https://community.torproject.org/onion-services/setup/install/) + +- [常见问题](https://support.torproject.org/) +- [获取桥梁](https://bridges.torproject.org/bridges/) + +## 其他使用文档 + +- [Docker使用Tor实现匿名通信](https://gitee.com/offends/Kubernetes/blob/main/Docker/Docs/Docker%E4%BD%BF%E7%94%A8Tor%E5%AE%9E%E7%8E%B0%E5%8C%BF%E5%90%8D%E9%80%9A%E4%BF%A1.md) diff --git a/网络/Tor/Tor配置文件文档.md b/网络/Tor/Tor配置文件文档.md new file mode 100644 index 0000000..03632a0 --- /dev/null +++ b/网络/Tor/Tor配置文件文档.md @@ -0,0 +1,21 @@ +> 本文作者:丁辉 + +# Tor配置文件文档 + +- Tor连接VPN使用 + + **代理工具**:[Helm部署Shadowsocks-Rust](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Shadowsocks-Rust.md) + + ```bash + # vi /etc/tor/torrc + 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 + ``` + +- \ No newline at end of file diff --git a/网络/内网穿透/Docker+IPSEC+FRP实现内网穿透.md b/网络/内网穿透/Docker+IPSEC+FRP实现内网穿透.md new file mode 100644 index 0000000..0bed960 --- /dev/null +++ b/网络/内网穿透/Docker+IPSEC+FRP实现内网穿透.md @@ -0,0 +1,153 @@ +> 本文作者:丁辉 + +# Docker+IPSEC+FRP实现内网穿透 + +| 服务器名称 | IP | +| :--------: | :----------: | +| 公网服务器 | 192.168.1.10 | +| 内网服务器 | 192.168.1.20 | + +## 部署IPSEC + +[IPSEC官方文档](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/README-zh.md) + +[高级参数配置](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/docs/advanced-usage-zh.md) + +1. 配置用户密码以及密钥 + + ```bash + mkdir -p /opt/vpn + ``` + + ```bash + cat > /opt/vpn/vpn.env << EOF + VPN_IPSEC_PSK=demo + VPN_USER=demo + VPN_PASSWORD=demo + EOF + ``` + + > 将 demo 替换成自己的 KEY、USER、PSSWORD + +2. 创建网络 + + ```bash + docker network create vpn + ``` + +3. 启动容器 + + ```bash + docker run \ + --network=vpn \ + --name ipsec-vpn-server \ + --restart=always \ + -v "/opt/vpn/vpn.env:/opt/src/env/vpn.env:ro" \ + -v /lib/modules:/lib/modules:ro \ + -d --privileged \ + hwdsl2/ipsec-vpn-server + ``` + + > 国内镜像地址 + > + > ```bash + > registry.cn-hangzhou.aliyuncs.com/offends/frp:ipsec-vpn-server + > ``` + +## 部署FRP + +### 本地客户端配置 Frpc + +1. 编写配置文件 + + ```bash + cat > /opt/vpn/frpc.ini << EOF + [common] + server_addr = 192.168.1.10 #填写frps的IP + server_port = 7000 #填写frps的port + + [ipsec-500] + type = udp + local_ip = ipsec-vpn-server + local_port = 500 + remote_port = 500 + + [ipsec-4500] + type = udp + local_ip = ipsec-vpn-server + local_port = 4500 + remote_port = 4500 + EOF + ``` + +2. 启动容器 + + ```bash + docker run --name frpc --restart=always \ + --net=vpn \ + -v "/opt/vpn/frpc.ini:/frp/frpc.ini:ro" \ + -d registry.cn-hangzhou.aliyuncs.com/offends/frp:frpc + ``` + +### 公网服务端配置 Frps Server + +1. 编辑配置文件 + + ```bash + mkdir /opt/vpn + ``` + + ```bash + cat > /opt/vpn/frps.ini << EOF + [common] + bind_port = 7000 + EOF + ``` + +2. 启动容器 + + ```bash + docker run --name frps --restart=always \ + -p 7000:7000 \ + -p 500:500/udp \ + -p 4500:4500/udp \ + -v "/opt/vpn/frps.ini:/frp/frps.ini:ro" \ + -d registry.cn-hangzhou.aliyuncs.com/offends/frp:frps + ``` + +## 卸载清理 + +1. 本地客户端清理 + + ```bash + docker rm -f frpc + docker rm -f ipsec-vpn-server + docker network rm vpn + rm -rf /opt/vpn + ``` + +2. 公网服务端清理 + + ```bash + docker rm -f frps + rm -rf /opt/vpn + ``` + +## 电脑连接 + +- MAC电脑配 + + - 置打开 VPN 配置,添加使用 L2TP/IPSec 协议 + + + + - 要记得勾选通过VPN连接发送所有流量 + + + +- Windows电脑配置 + + - 打开设置,添加 VPN 连接,使用 L2TP/IPSec 协议 + + + diff --git a/网络/内网穿透/Docker-Compose+IPSEC+FRP实现内网穿透.md b/网络/内网穿透/Docker-Compose+IPSEC+FRP实现内网穿透.md new file mode 100644 index 0000000..b8c27a6 --- /dev/null +++ b/网络/内网穿透/Docker-Compose+IPSEC+FRP实现内网穿透.md @@ -0,0 +1,131 @@ +> 本文作者:丁辉 + +# Docker-Compose+IPSEC+FRP实现内网穿透 + +| 服务器名称 | IP | +| :--------: | :----------: | +| 公网服务器 | 192.168.1.10 | +| 内网服务器 | 192.168.1.20 | + +> 准备: +> +> 1. 克隆文件到本地 +> +> ```bash +> git clone https://gitea.offends.cn/offends/Kubernetes.git +> cd Kubernetes/File/Yaml +> ``` +> +> 2. 准备 Docker-Compose 环境 + +## 部署IPSEC + +[IPSEC官方文档](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/README-zh.md) + +[高级参数配置](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/docs/advanced-usage-zh.md) + +1. 配置用户密码以及密钥 + + ```bash + mkdir -p /opt/vpn + ``` + + ```bash + cat > /opt/vpn/vpn.env << EOF + VPN_IPSEC_PSK=demo + VPN_USER=demo + VPN_PASSWORD=demo + EOF + ``` + + > 将 demo 替换成自己的 KEY、USER、PSSWORD + +## 部署FRP + +### 本地客户端配置 Frpc + +1. 编写配置文件 + + ```bash + cat > /opt/vpn/frpc.ini << EOF + [common] + server_addr = 192.168.1.10 #填写frps的IP + server_port = 7000 #填写frps的port + + [ipsec-500] + type = udp + local_ip = ipsec-vpn-server + local_port = 500 + remote_port = 500 + + [ipsec-4500] + type = udp + local_ip = ipsec-vpn-server + local_port = 4500 + remote_port = 4500 + EOF + ``` + +2. 启动容器 + + ```bash + docker-compose -f docker-compose-frpc.yaml up -d + ``` + + + +### 公网服务端配置 Frps Server + +1. 编辑配置文件 + + ```bash + mkdir /opt/vpn + ``` + + ```bash + cat > /opt/vpn/frps.ini << EOF + [common] + bind_port = 7000 + EOF + ``` + +2. 启动容器 + + ```bash + docker-compose -f docker-compose-frps.yaml up -d + ``` + +## 卸载清理 + +1. 本地客户端清理 + + ```bash + docker-compose -f docker-compose-frpc.yaml down + rm -rf /opt/vpn + ``` + +2. 公网服务端清理 + + ```bash + docker-compose -f docker-compose-frps.yaml down + rm -rf /opt/vpn + ``` + +## 电脑连接 + +- MAC电脑配 + + - 置打开 VPN 配置,添加使用 L2TP/IPSec 协议 + + + + - 要记得勾选通过VPN连接发送所有流量 + + + +- Windows电脑配置 + + - 打开设置,添加 VPN 连接,使用 L2TP/IPSec 协议 + + + diff --git a/网络/内网穿透/Kubernetes+IPSEC+FRP实现内网穿透.md b/网络/内网穿透/Kubernetes+IPSEC+FRP实现内网穿透.md new file mode 100644 index 0000000..aefc9b2 --- /dev/null +++ b/网络/内网穿透/Kubernetes+IPSEC+FRP实现内网穿透.md @@ -0,0 +1,129 @@ +> 本文作者:丁辉 + +# Kubernetes+IPSEC+FRP实现内网穿透 + +| 服务器名称 | IP | +| :--------: | :----------: | +| 公网服务器 | 192.168.1.10 | +| 内网服务器 | 192.168.1.20 | + +> 准备: +> +> 1. 克隆文件到本地 +> +> ```bash +> git clone https://gitea.offends.cn/offends/Kubernetes.git +> cd Kubernetes/File/Yaml +> ``` +> +> 2. 准备 Kubernetes 环境 + +## 部署IPSEC + +[IPSEC官方文档](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/README-zh.md) + +[高级参数配置](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/docs/advanced-usage-zh.md) + +1. 配置用户密码以及密钥 + + ```bash + mkdir -p /opt/vpn + ``` + + ```bash + cat > /opt/vpn/vpn.env << EOF + VPN_IPSEC_PSK=demo + VPN_USER=demo + VPN_PASSWORD=demo + EOF + ``` + + > 将 demo 替换成自己的 KEY、USER、PSSWORD + +## 部署FRP + +### 本地客户端配置 Frpc + +1. 编写配置文件 + + ```bash + cat > /opt/vpn/frpc.ini << EOF + [common] + server_addr = 192.168.1.10 #填写frps的IP + server_port = 7000 #填写frps的port + + [ipsec-500] + type = udp + local_ip = ipsec-vpn-server + local_port = 500 + remote_port = 500 + + [ipsec-4500] + type = udp + local_ip = ipsec-vpn-server + local_port = 4500 + remote_port = 4500 + EOF + ``` + +2. 启动容器 + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/frpc.yaml + ``` + +### 公网服务端配置 Frps Server + +1. 编辑配置文件 + + ```bash + mkdir /opt/vpn + ``` + + ```bash + cat > /opt/vpn/frps.ini << EOF + [common] + bind_port = 7000 + EOF + ``` + +2. 启动容器 + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/frps.yaml + ``` + +## 卸载清理 + +1. 本地客户端清理 + + ```bash + kubectl delete -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/frpc.yaml + rm -rf /opt/vpn + ``` + +2. 公网服务端清理 + + ```bash + kubectl delete -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/frpc.yaml + rm -rf /opt/vpn + ``` + +## 电脑连接 + +- MAC电脑配 + + - 置打开 VPN 配置,添加使用 L2TP/IPSec 协议 + + + + - 要记得勾选通过VPN连接发送所有流量 + + + +- Windows电脑配置 + + - 打开设置,添加 VPN 连接,使用 L2TP/IPSec 协议 + + + diff --git a/网络/网络插件安装/README.md b/网络/网络插件安装/README.md new file mode 100644 index 0000000..91b0964 --- /dev/null +++ b/网络/网络插件安装/README.md @@ -0,0 +1,9 @@ +> 本文作者:丁辉 + +# 网络插件安装 + +> 相关文档地址 + +- [Calico网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/%E7%BD%91%E7%BB%9C%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85/Calico%E7%BD%91%E7%BB%9C%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85.md) +- [Flannel网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/%E7%BD%91%E7%BB%9C%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85/Flannel%E7%BD%91%E7%BB%9C%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85.md) + diff --git a/资源部署/Chatgpt-Pandora.md b/资源部署/Chatgpt-Pandora.md new file mode 100644 index 0000000..2e39cda --- /dev/null +++ b/资源部署/Chatgpt-Pandora.md @@ -0,0 +1,66 @@ +> 本文作者:丁辉 + +# Chatgpt-Pandora + +> 丝滑访问 Chatgpt 方法如下 + +1. 部署 + + ```bash + kubectl create -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/chatgpt-pandora.yaml + ``` + +2. 创建 Secret + + ```bash + kubectl create secret tls chat-tls --key nginx.key --cert nginx.pem -n tools + ``` + +3. 创建 Ingress + + ```bash + vi chatgpt-pandora-ingress.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: networking.k8s.io/v1 + kind: Ingress + metadata: + name: chatgpt-ingress + namespace: chatgpt + spec: + ingressClassName: nginx + rules: + - host: #域名 + http: + paths: + - pathType: Prefix + backend: + service: + name: chatgpt-web + port: + number: 80 + path: / + tls: + - hosts: + - #域名 + secretName: chat-ssl + ``` + +4. 部署 + + ```bash + kubectl apply -f chatgpt-pandora-ingress.yaml + ``` + +5. 获取 + + > 在官方获取 accessToken、或登录账号访问 ChatGpt + + ```bash + https://chat.openai.com/api/auth/session + ``` + + diff --git a/资源部署/Helm私有仓库部署.md b/资源部署/Helm私有仓库部署.md new file mode 100644 index 0000000..690ce95 --- /dev/null +++ b/资源部署/Helm私有仓库部署.md @@ -0,0 +1,240 @@ +> 本文作者:丁辉 + +# Helm私有仓库部署 + +## 开始部署 + +1. 部署 + + ```bash + kubectl create -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/chartmuseum.yaml + ``` + +2. 配置内部域名 + + ```bash + echo $(kubectl get svc -n helm | grep chartmuseum | awk '{print $3}') chartmuseum.local.com >> /etc/hosts + ``` + +3. 检查 + + ```bash + curl http://chartmuseum.local.com:8080/api/charts + ``` + +## 使用 + +1. 添加仓库 + + ```bash + helm repo add localrepo http://chartmuseum.local.com:8080 + ``` + +2. 创建 Helm 文件 + + ```bash + helm create demo + ``` + +3. 打包 + + - 打包:不指定版本 , 默认生成 0.1.0 版本 + + ```bash + helm package demo/ + ``` + + - 打包: 指定版本 0.1.1 + + ```bash + helm package demo/ --version 0.1.1 + ``` + +4. 查看详情 + + ```bash + helm show chart demo + ``` + +## Helm push 插件操作命令 + +1. 添加公共仓库 + + ```bash + helm repo add stable http://mirror.azure.cn/kubernetes/charts + ``` + + > 也可以换成微软的源,速度快,内容和官方同步的 + > + > ```bash + > helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts + > ``` + +2. Helm安装 push 插件 + + ```bash + helm plugin install https://github.com/chartmuseum/helm-push + ``` + +3. Cm-push chats包到Chartmuseum + + - 添加 cm-push 插件 + + ```bash + helm plugin install https://github.com/chartmuseum/helm-push + ``` + + - 使用 cm-push 上传 chat 包 + + ```bash + helm cm-push demo-0.1.0.tgz localrepo + ``` + + - 使用 cm-push 上传 chat 目录 + + ```bash + helm cm-push ./demo localrepo + ``` + +4. 查看结果 + + ```bash + curl http://chartmuseum.local.com:8080/api/charts |jq + ``` + +5. 更新 + + ```bash + helm repo update + ``` + +6. 检查 + + ```bash + helm search repo demo + ``` + +## 复用harbor仓库 + +> harbor 自带 helm 私有仓库的功能,不需要再部署一个helm 私有仓库,在这里给大家介绍一下 helm 如何上传chart包到 harbor + +1. 添加私有仓库harbor + + 添加 repo + + ```bash + helm repo add harbor https://harbor.com/chartrepo/library --username xxx --password xxx + ``` + +2. 使用 cm-push 命令 上传 chat 包 + + ```bash + helm cm-push demo-0.1.0.tgz harbor + ``` + +3. 上传 cm-push chat 目录 + + ```bash + helm cm-push ./demo harbor + ``` + +4. push chats 包到 harbor 使用 oci 协议 + + 登录到注册中心 + + ```bash + helm registry login -u helmchart harbor.com -p xxxxxx + ``` + +5. 使用 push 命令上传 chat 包 + + ```bash + helm push demo-0.1.0.tgz oci://harbor.com/helmchart + ``` + +6. 使用 pull 下载包 + + ```bash + helm pull oci://harbor.com/helmchart/mychart --version 0.1.0 + ``` + +7. 查看 chat 信息 + + ```bash + helm show all oci://harbor.com/helmchart/mychart --version 0.1.0 + ``` + +## Chartmuseum和curl的使用 + +### 添加Chartmuseum到Helm repo + +- 登录 + + ```bash + helm repo add chartmuseum http://chartmuseum.local.com:8080 --username admin --password admin + ``` + +- 上传 + + ```bash + curl -u admin:admin --data-binary "@demo-0.1.0.tgz" http://chartmuseum.local.com:8080/api/charts + ``` + +- 下载 + + ```bash + curl -O -u admin:admin http://chartmuseum.local.com:8080/charts/demo-0.1.0.tgz + ``` + +### chartmuseum其他API + +- `GET /index.yaml` 得到 chartmuseum 的全部 charts + + ```bash + curl http://chartmuseum.local.com:8080/index.yaml -u admin:admin + ``` + +- `GET /charts/demo-0.1.0.tgz` 下载 charts 中的 demo + + ```bash + curl -O http://chartmuseum.local.com:8080/charts/demo-0.1.0.tgz -u admin:admin + ``` + +- `POST /api/charts` 上传一个新的chart版本 + + ```bash + curl -X POST --data-binary '@demo-0.2.0.tgz' http://chartmuseum.local.com:8080/api/charts -u admin:admin + ``` + +- `DELETE /api/charts//` 删除一个 chart 版本 + + ```bash + curl -s -X DELETE http://chartmuseum.local.com:8080/api/charts/demo/0.2.0 -u admin:admin | jq + ``` + +- `GET /api/charts` 列出所有的charts + + ```bash + curl -s http://chartmuseum.local.com:8080/api/charts -u admin:admin | jq + ``` + +- `GET /api/chatts/` 列出chart的所有版本 + + ```bash + curl -s http://chartmuseum.local.com:8080/api/charts/demo -u admin:admin | jq + ``` + +- `GET /api/charts//` 对一个chart版本的描述 + + ```bash + curl -s http://chartmuseum.local.com:8080/api/charts/demo/0.2.0 -u admin:admin | jq + ``` + +- `GET /health` return 200 OK + + ```bash + curl http://chartmuseum.local.com:8080/health + ``` + + + diff --git a/资源部署/Kubernetes部署Registry镜像仓库缓存服务.md b/资源部署/Kubernetes部署Registry镜像仓库缓存服务.md new file mode 100644 index 0000000..3579272 --- /dev/null +++ b/资源部署/Kubernetes部署Registry镜像仓库缓存服务.md @@ -0,0 +1,35 @@ +> 本文作者:丁辉 + +# Kubernetes部署Registry镜像仓库缓存服务 + +1. 下载 YAMl 文件 + + ```bash + wget https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/registry-proxy-ds.yaml + wget https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/registry-proxy-ingress.yaml + ``` + +2. 修改 registry-proxy.yaml 文件 + + - 修改 PersistentVolumeClaim storageClassName 字段 + - 修改 DaemonSet env 字段 + +3. 修改 ingress.yaml 文件 + + - 修改 ingressClassName 字段 + +4. 部署服务 + + ```bash + kubectl apply -f registry-proxy-ds.yaml + ``` + +5. 部署对外访问 Ingress + + > 请根据自己环境情况修改 `registry-proxy-ingress.yaml` + + ```bash + kubectl apply -f registry-proxy-ingress.yaml + ``` + + \ No newline at end of file diff --git a/资源部署/Kubernetes部署Simplex.md b/资源部署/Kubernetes部署Simplex.md new file mode 100644 index 0000000..6991081 --- /dev/null +++ b/资源部署/Kubernetes部署Simplex.md @@ -0,0 +1,60 @@ +> 本文作者:丁辉 + +# Kubernetes部署Simplex服务器SMP/XFTP服务 + +## 开始部署 + +1. 创建命名空间 + + ```bash + kubectl create namespace simplex + ``` + +2. 创建 Secret + + ```bash + kubectl create secret generic simplex-secret --from-literal=ADDR=${值} --from-literal=PASS=${值} -n simplex + ``` + + **`ADDR`**: 用于指定服务绑定的 IP 地址或域名。这通常是服务对外公开访问的地址。 + + **`PASS`**: 这是用于设置某种形式的密码或访问密钥的变量。它通常用于身份验证或授权,以保护服务不被未经授权的访问。 + +3. 部署 SMP 服务 + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/simplex-smp.yaml + ``` + +4. 部署 XFTP 服务 + + ```bash + kubectl apply -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/simplex-xftp.yaml + ``` + +5. 部署对外访问端口 + + - SMP:5223 + - XFTP:5233 + +## 卸载 + +1. 卸载 + + ```bash + kubectl delete -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/simplex-xftp.yaml + ``` + +2. 卸载 + + ```bash + kubectl delete -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/simplex-smp.yaml + ``` + +3. 删除 Secret + + ```bash + kubectl delete secret simplex-secret -n simplex + ``` + + \ No newline at end of file diff --git a/资源部署/部署Kubernetes仪表板.md b/资源部署/部署Kubernetes仪表板.md new file mode 100644 index 0000000..b4363f8 --- /dev/null +++ b/资源部署/部署Kubernetes仪表板.md @@ -0,0 +1,105 @@ +> 本文作者:丁辉 + +# 部署Kubernetes仪表板 + +[官方文档](https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/) + +[Github文档](https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md) + +1. 部署 Dashboard UI + + ```bash + kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml + ``` + +2. 编辑对外 svc 文件 + + ```bash + vi kubernetes-dashboard-svc.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: v1 + kind: Service + metadata: + name: kubernetes-dashboard-40000 + labels: + k8s-app: kubernetes-dashboard + namespace: kubernetes-dashboard + spec: + ports: + - name: kubernetes-dashboard + nodePort: 40000 + port: 443 + protocol: TCP + targetPort: 8443 + selector: + k8s-app: kubernetes-dashboard + type: NodePort + ``` + +3. 部署 + + ```bash + kubectl apply -f kubernetes-dashboard-svc.yaml + ``` + +4. 查看状态 + + ```bash + kubectl get all -n kubernetes-dashboard + ``` + +5. 获取长期令牌 + + ```bash + vi kubernetes-dashboard-token.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: v1 + kind: ServiceAccount + metadata: + name: admin-user + namespace: kubernetes-dashboard + --- + 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: kubernetes-dashboard + --- + apiVersion: v1 + kind: Secret + metadata: + name: admin-user + namespace: kubernetes-dashboard + annotations: + kubernetes.io/service-account.name: "admin-user" + type: kubernetes.io/service-account-token + ``` + +6. 创建 + + ```bash + kubectl apply -f kubernetes-dashboard-token.yaml + ``` + +7. 查看 token + + ```bash + kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d + ``` + + \ No newline at end of file diff --git a/资源部署/部署Mysql主从.md b/资源部署/部署Mysql主从.md new file mode 100644 index 0000000..866764e --- /dev/null +++ b/资源部署/部署Mysql主从.md @@ -0,0 +1,354 @@ +> 本文作者:丁辉 + +# 部署Mysql主从 + +## 基础准备 + +创建命名空间 + +```bash +kubectl create ns mysql +``` + +## 开始部署 + +### 主节点配置 + +1. 编辑 mysql 配置文件 + + ```bash + vi my.cnf + ``` + + 内容如下 + + ```bash + [mysqld] + pid-file = /var/run/mysqld/mysqld.pid + socket = /var/run/mysqld/mysqld.sock + datadir = /var/lib/mysql + secure-file-priv= NULL + # Disabling symbolic-links is recommended to prevent assorted security risks + symbolic-links=0 + # 服务端默认utf8编码 + character-set-server=utf8mb4 + # 默认存储引擎 + default-storage-engine=INNODB + + # 主从配置 + log-bin=binlog + server-id=121 + gtid-mode=on + enforce-gtid-consistency=on + log-slave-updates=on + expire_logs_days=14 + + # Compatible with versions before 8.0 + default_authentication_plugin=mysql_native_password + skip-host-cache + skip-name-resolve + + [client] + #设置客户端编码 + default-character-set=utf8mb4 + [mysql] + # 设置mysql客户端默认编码 + default-character-set=utf8mb4 + + # Custom config should go here + !includedir /etc/mysql/conf.d/ + # Custom config should go here + !includedir /etc/mysql/conf.d/ + ``` + +2. 创建 configmap + + ```bash + kubectl create configmap mysql-master-conf --from-file=./my.cnf -n mysql + ``` + +3. 编辑 Yaml + + ```bash + vi mysql-master.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: apps/v1 + kind: StatefulSet + metadata: + namespace: mysql + name: mysql-master + spec: + replicas: 1 + serviceName: mysql-master-service + selector: + matchLabels: + app: mysql-master + template: + metadata: + labels: + app: mysql-master + spec: + containers: + - name: mysql-master + image: mysql:8.0 + env: + - name: MYSQL_ROOT_PASSWORD + value: password + volumeMounts: + - mountPath: /var/lib/mysql + name: data + - name: file + mountPath: /etc/mysql/my.cnf + subPath: my.cnf + ports: + - containerPort: 3306 + protocol: TCP + livenessProbe: + exec: + command: + - mysql + - --user=root + - --password=password + - --execute=SELECT 1 + initialDelaySeconds: 10 #启动后等待10秒开始检测 + periodSeconds: 10 #每隔10秒检测一次 + nodeName: #node1 + volumes: + - name: data + hostPath: + path: /opt/mysql/data + - name: file + configMap: + name: mysql-master-conf + --- + apiVersion: v1 + kind: Service + metadata: + namespace: mysql + name: mysql-master-service + spec: + selector: + app: mysql-master + ports: + - port: 3306 + targetPort: 3306 + protocol: TCP + type: ClusterIP + ``` + +4. 部署数据库主 + + ```bash + kubectl apply -f mysql-master.yaml + ``` + +### 从节点配置 + +1. 编辑 mysql 配置文件 + + ```bash + vi my.cnf + ``` + + 内容如下 + + ```bash + [mysqld] + pid-file = /var/run/mysqld/mysqld.pid + socket = /var/run/mysqld/mysqld.sock + datadir = /var/lib/mysql + secure-file-priv= NULL + # Disabling symbolic-links is recommended to prevent assorted security risks + symbolic-links=0 + # 服务端默认utf8编码 + character-set-server=utf8mb4 + # 默认存储引擎 + default-storage-engine=INNODB + + # 主从配置 + server-id=122 + gtid-mode=on + enforce-gtid-consistency=on + log-slave-updates=on + expire_logs_days=14 + + # Compatible with versions before 8.0 + default_authentication_plugin=mysql_native_password + skip-host-cache + skip-name-resolve + + [client] + #设置客户端编码 + default-character-set=utf8mb4 + [mysql] + # 设置mysql客户端默认编码 + default-character-set=utf8mb4 + + # Custom config should go here + !includedir /etc/mysql/conf.d/ + # Custom config should go here + !includedir /etc/mysql/conf.d/ + ``` + +2. 创建 configmap + + ```bash + kubectl create configmap mysql-slave-conf --from-file=./my.cnf -n mysql + ``` + +3. 编辑 Yaml + + ```bash + vi mysql-slave.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: apps/v1 + kind: StatefulSet + metadata: + namespace: mysql + name: mysql-slave + spec: + replicas: 1 + serviceName: mysql-slave-service + selector: + matchLabels: + app: mysql-slave + template: + metadata: + labels: + app: mysql-slave + spec: + containers: + - name: mysql-slave + image: mysql:8.0 + env: + - name: MYSQL_ROOT_PASSWORD + value: password + volumeMounts: + - mountPath: /var/lib/mysql + name: data + - name: file + mountPath: /etc/mysql/my.cnf + subPath: my.cnf + ports: + - containerPort: 3306 + protocol: TCP + livenessProbe: + exec: + command: + - mysql + - --user=root + - --password=password + - --execute=SELECT 1 + initialDelaySeconds: 10 #启动后等待10秒开始检测 + periodSeconds: 10 #每隔10秒检测一次 + nodeName: #node2 + volumes: + - name: data + hostPath: + path: /opt/mysql/data + - name: file + configMap: + name: mysql-slave-conf + --- + apiVersion: v1 + kind: Service + metadata: + namespace: mysql + name: mysql-slave-service + spec: + selector: + app: mysql-slave + ports: + - port: 3306 + targetPort: 3306 + protocol: TCP + type: ClusterIP + ``` + +4. 部署数据库从 + + ```bash + kubectl apply -f mysql-slave.yaml + ``` + +### 配置主从同步 + +1. 登录主节点 + + ```bash + kubectl exec -it mysql-master-0 -n mysql bash + ``` + +2. 登录数据库 + + ```bash + mysql -u root -ppassword + ``` + +3. 配置 + + ```bash + CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave'; + GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; + flush privileges; + SHOW MASTER STATUS; + ``` + +4. 登录从节点 + + ```bash + kubectl exec -it mysql-slave-0 -n mysql bash + ``` + +5. 登录数据库 + + ```bash + mysql -u root -ppassword + ``` + +6. 配置 + + ```bash + CHANGE MASTER TO + MASTER_HOST='IP', + MASTER_USER='slave', + MASTER_PASSWORD='slave', + MASTER_PORT=3306, + MASTER_LOG_FILE='binlog.00000*', #列:binlog.000001 + MASTER_LOG_POS=***; #列:868 + ``` + +7. 开启主从同步 + + ```bash + start slave; + ``` + +8. 查看同步状态 + + ```bash + show slave status\G; + ``` + + > 查看到这两个参数为 Yes 则代表配置成功 + + - Slave_IO_Running: Yes + - Slave_SQL_Running: Yes + +9. 登录主节点,创建数据库 + + ```bash + create database console; + create database region; + ``` + + > 从节点查看仓库是否已同步 + diff --git a/资源部署/阿里云盘配合容器化客户端使用.md b/资源部署/阿里云盘配合容器化客户端使用.md new file mode 100644 index 0000000..629d6d0 --- /dev/null +++ b/资源部署/阿里云盘配合容器化客户端使用.md @@ -0,0 +1,47 @@ +> 本文作者:丁辉 + +# 阿里云盘配合容器化客户端使用 + +[官方仓库](https://github.com/tickstep/aliyunpan) + +阿里云盘同步备份功能,支持备份本地文件到云盘,备份云盘文件到本地,双向同步备份三种模式。支持JavaScript插件对备份文件进行过滤。 + +备份功能支持以下三种模式: + +1. 备份本地文件,即上传本地文件到网盘,始终保持本地文件有一个完整的备份在网盘 +2. 备份云盘文件,即下载网盘文件到本地,始终保持网盘的文件有一个完整的备份在本地 +3. 双向备份,保持网盘文件和本地文件严格一致 + +备份功能一般用于NAS等系统,进行文件备份。比如备份照片,就可以使用这个功能定期备份照片到云盘,十分好用。 + +1. 创建命名空间 + + ```bash + kubectl create ns aliyunpan + ``` + +2. 打开 [阿里云盘网页](https://www.aliyundrive.com/drive/file/backup) 右键打开检查,点击 Console, 输入此命令获取值 + + ```bash + JSON.parse(localStorage.getItem("token")).refresh_token + ``` + +3. 创建 Secret + + ```bash + kubectl create secret generic aliyunpan-token --from-literal=ALIYUNPAN_REFRESH_TOKEN=${值} -n aliyunpan + ``` + +4. 部署 + + ```bash + kubectl create --edit -f https://gitee.com/offends/Kubernetes/raw/main/File/Yaml/aliyun-sync.yaml + ``` + + > 注意修改变量 `ALIYUNPAN_PAN_DIR` + +**参数解释** + +- ALIYUNPAN_PAN_DIR:云盘目录 +- ALIYUNPAN_REFRESH_TOKEN:RefreshToken +- ALIYUNPAN_SYNC_MODE:备份模式,支持三种: upload(备份本地文件到云盘),download(备份云盘文件到本地),sync(双向同步备份) diff --git a/部署文档/KubeSphere/基于KubeKey快速部署单机Kubernetes.md b/部署文档/KubeSphere/基于KubeKey快速部署单机Kubernetes.md new file mode 100644 index 0000000..058173c --- /dev/null +++ b/部署文档/KubeSphere/基于KubeKey快速部署单机Kubernetes.md @@ -0,0 +1,128 @@ +> 本文作者:丁辉 + +# 基于KubeKey快速部署单机Kubernetes + +| 节点名称 | IP | Kubernetes角色 | +| :----------------------: | :----------: | :-----------------------: | +| k8s-master-0,KubeKey管理 | 192.168.1.10 | control-plane,etcd,worker | + +## 基础准备 + +[官方主页](https://kubesphere.io/zh/) + +1. 更改主机名 + + ```bash + hostnamectl set-hostname k8s-master-0 && bash + ``` + +2. 编辑 /etc/hosts 文件 + + ```bash + echo "192.168.1.10 k8s-master-0" >> /etc/hosts + ``` + +3. 安装依赖 + + - Centos + + ```bash + yum install conntrack-tools socat -y + ``` + + - Ubuntu + + ```bash + apt install conntrack socat -y + ``` + +## 开始安装 KubeKey + +[KubeKey-Github-Releases](https://github.com/kubesphere/kubekey/releases) + +1. 下载最新版 KubeKey + + > 配置国内加速 + > + > ```bash + > export KKZONE=cn + > ``` + + ```bash + curl -sfL https://get-kk.kubesphere.io | sh - + ``` + + > 指定版本 + > + > ```bash + > curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh - + > ``` + +2. 为 `kk` 添加可执行权限 + + ```bash + chmod +x kk && mv kk /usr/local/bin/ + ``` + + +## 开始安装 Kubernetes + +**执行命令** + +```bash +kk create cluster -y +``` + +> 默认 Kubernetes 版本为 v1.23.10 +> +> 容器运行时为 Docker + +### 指定版本 + +- 安装 Kubernetes + + ```bash + --with-kubernetes v1.22.12 + ``` + + > 查看 KubeKey 支持的 Kubernetes 版本列表 + > + > ```bash + > kk version --show-supported-k8s + > ``` + +- 安装 Kubesphere + + [Kubesphere-Github-Releases](https://github.com/kubesphere/kubesphere/releases) + + ```bash + --with-kubesphere v3.4.1 + ``` + +### 命令参数 + + +| 标志 | 说明 | +| :-------------------------: | :----------------------------------------------------------: | +| -a, --artifact | 指定 KubeKey artifact(工件)的路径。artifact 是一个包含了所需二进制文件和其他资源的 tarball 文件,用于在离线环境中部署 Kubernetes。 | +| --container-manager | 指定容器运行时:docker、crio、containerd 或 isula。默认为 "docker"。 | +| --debug | 打印详细信息。 | +| --download-cmd string | 用户定义的下载所需二进制文件的命令。第一个参数 '%s' 是输出路径,第二个参数 '%s' 是 URL。默认为 "curl -L -o %s %s"。 | +| -f, --filename | 指定配置文件的路径。 | +| --ignore-err | 忽略错误信息,删除报告错误的主机,并强制继续执行。 | +| --namespace | 指定 KubeKey 使用的命名空间。默认为 "kubekey-system"。 | +| --skip-pull-images | 跳过预拉取镜像。 | +| --skip-push-images | 跳过预推送镜像。 | +| --with-kubernetes | 指定支持的 Kubernetes 版本。 | +| --with-kubesphere | 部署指定版本的 KubeSphere。默认为 v3.4.1。 | +| --with-local-storage | 部署本地 PV provisioner(本地存储)。 | +| --with-packages | 通过 artifact 安装操作系统软件包。 | +| --with-security-enhancement | 安全增强。 | +| -y, --yes | 跳过确认检查。 | + +## 卸载集群 + +```bash +kk delete cluster +``` + diff --git a/部署文档/KubeSphere/基于KubeKey部署高可用Kubernetes集群.md b/部署文档/KubeSphere/基于KubeKey部署高可用Kubernetes集群.md new file mode 100644 index 0000000..1714f65 --- /dev/null +++ b/部署文档/KubeSphere/基于KubeKey部署高可用Kubernetes集群.md @@ -0,0 +1,225 @@ +> 本文作者:丁辉 + +# 基于KubeKey部署Kubernetes + +| 节点名称 | IP | Kubernetes角色 | +| :----------------------: | :----------: | :-----------------------: | +| k8s-master-1,KubeKey管理 | 192.168.1.10 | control-plane,etcd,worker | +| k8s-master-2 | 192.168.1.20 | control-plane,etcd,worker | +| k8s-master-3 | 192.168.1.30 | control-plane,etcd,worker | + +## 基础准备 + +[官方主页](https://kubesphere.io/zh/) + +### 所有节点执行 + +1. 创建用户 + + ```bash + useradd -m -s /bin/bash kubekey + ``` + +2. 配置用户密码 + + > 根据自己的密码修改 "123456" + + ```bash + echo "kubekey:123456" | chpasswd + ``` + +3. 配置 kubekey 免密使用 sudo 权限 + + ```bash + cat < 配置国内加速 + > + > ```bash + > export KKZONE=cn + > ``` + + ```bash + curl -sfL https://get-kk.kubesphere.io | sh - + ``` + + > 指定版本 + > + > ```bash + > curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh - + > ``` + +2. 为 `kk` 添加可执行权限 + + ```bash + sudo chmod +x kk + sudo mv kk /usr/local/bin/ + ``` + +3. 生成配置文件 + + ```bash + kk create config -f kubesphere.yaml + ``` + + > 安装 Kubesphere 指定参数 + > + > [Kubesphere-Github-Releases](https://github.com/kubesphere/kubesphere/releases) + > + > ```bash + > --with-kubesphere v3.4.1 + > ``` + + 修改如下内容 + + ```yaml + apiVersion: kubekey.kubesphere.io/v1alpha2 + kind: Cluster + metadata: + name: sample + spec: + hosts: + - {name: k8s-master-1, address: 192.168.100.10, internalAddress: 192.168.100.10, user: kubekey, password: "123456"} + - {name: k8s-master-2, address: 192.168.100.20, internalAddress: 192.168.100.20, user: kubekey, password: "123456"} + - {name: k8s-master-3, address: 192.168.100.30, internalAddress: 192.168.100.30, user: kubekey, password: "123456"} + roleGroups: + etcd: + - k8s-master-1 + - k8s-master-2 + - k8s-master-3 + control-plane: + - k8s-master-1 + - k8s-master-2 + - k8s-master-3 + worker: + - k8s-master-1 + - k8s-master-2 + - k8s-master-3 + controlPlaneEndpoint: + # 启用内置的 HAProxy 负载均衡器 + internalLoadbalancer: haproxy + domain: lb.kubesphere.local + address: "" + port: 6443 + kubernetes: + # 指定 Kubernetes 版本, 可使用 kk version --show-supported-k8s 命令查询当前 KubeKey 支持的版本 + version: v1.23.10 + clusterName: cluster.local + autoRenewCerts: true + # 指定容器运行时 + containerManager: docker + etcd: + type: kubekey + network: + plugin: calico + kubePodsCIDR: 10.233.64.0/18 + kubeServiceCIDR: 10.233.0.0/18 + multusCNI: + enabled: false + registry: + privateRegistry: "" + namespaceOverride: "" + registryMirrors: [] + insecureRegistries: [] + addons: [] + ``` + +## 开始安装 Kubernetes + +```bash +kk create cluster -f kubesphere.yaml -y +``` + +扩容节点 + +```bash +kk add nodes -f kubesphere.yaml -y +``` + +## 卸载集群 + +```bash +kk delete cluster -f kubesphere.yaml +``` diff --git a/部署文档/KubeSphere/基于KubeSphereLuban快速部署单机Kubernetes.md b/部署文档/KubeSphere/基于KubeSphereLuban快速部署单机Kubernetes.md new file mode 100644 index 0000000..d536ec0 --- /dev/null +++ b/部署文档/KubeSphere/基于KubeSphereLuban快速部署单机Kubernetes.md @@ -0,0 +1,26 @@ +> 本文作者:丁辉 + +# 基于KubeSphereLuban搭建开发环境 + +[官方文档](https://dev-guide.kubesphere.io/extension-dev-guide/zh/quickstart/prepare-development-environment/) + +1. 准备 Kubernetes 集群 + + ```bash + curl -sfL https://get-kk.kubesphere.io | sh - + ./kk create cluster --with-local-storage --with-kubernetes v1.25.4 --container-manager containerd -y + ``` + +2. 准备 Helm 工具 + + ```bash + curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash + ``` + +3. 安装 KubeSphere Luban Helm Chart + + ```bash + helm upgrade --install -n kubesphere-system --create-namespace ks-core https://charts.kubesphere.io/main/ks-core-0.4.0.tgz --set apiserver.nodePort=30881 --debug --wait + ``` + + > 更多配置参数,请参考[KubeSphere Helm Chart 配置](https://docs.kubesphere.com.cn/v4.0/03-install-and-uninstall/01-install-ks-core/#_高级配置) \ No newline at end of file diff --git a/部署文档/Kubeadm/Kubeadm初始化安装Kubernetes节点.md b/部署文档/Kubeadm/Kubeadm初始化安装Kubernetes节点.md new file mode 100644 index 0000000..f55cdf9 --- /dev/null +++ b/部署文档/Kubeadm/Kubeadm初始化安装Kubernetes节点.md @@ -0,0 +1,36 @@ +> 本文作者:丁辉 + +## Kubeadm初始化安装Kubernetes节点 + +1. Kubernetes安装 + + ```bash + kubeadm init \ + --image-repository=registry.aliyuncs.com/google_containers \ + --apiserver-advertise-address=192.168.1.10 \ + --pod-network-cidr=10.244.0.0/16 \ + --service-cidr=10.96.0.0/12 + ``` + +2. 根据提示配置文件 + + ```bash + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + export KUBECONFIG=/etc/kubernetes/admin.conf + ``` + + > 永久生效 + > + > ```bash + > echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile + > source ~/.bash_profile + > ``` + +3. 安装网络插件 + + 请跳转此文档 + + - [Flannel网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/部署文档/网络插件安装/Flannel网络插件安装.md) + - [Calico网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/部署文档/网络插件安装/Calico网络插件安装.md) \ No newline at end of file diff --git a/部署文档/Kubeadm/Kubeadm基础常用命令.md b/部署文档/Kubeadm/Kubeadm基础常用命令.md new file mode 100644 index 0000000..812310d --- /dev/null +++ b/部署文档/Kubeadm/Kubeadm基础常用命令.md @@ -0,0 +1,15 @@ +> 本文作者:丁辉 + +# Kubeadm基础常用命令 + +- 打印出 `kubeadm` 工具初始化 Kubernetes 集群时的默认配置 + + ```bash + kubeadm config print init-defaults > kubeadm.yaml + ``` + +- 列出所有容器镜像 + + ```bash + kubeadm config images list --config kubeadm.yaml + ``` \ No newline at end of file diff --git a/部署文档/Kubeadm/Kubeadm部署单机Kubernetes(Containerd).md b/部署文档/Kubeadm/Kubeadm部署单机Kubernetes(Containerd).md new file mode 100644 index 0000000..5a9f875 --- /dev/null +++ b/部署文档/Kubeadm/Kubeadm部署单机Kubernetes(Containerd).md @@ -0,0 +1,41 @@ +> 本文作者:丁辉 + +# Kubeadm部署单机Kubernetes(Containerd) + +| 节点名 | IP | +| :----: | :----------: | +| master | 192.168.1.10 | + +## 环境准备 + +> !!!每次部署都写挺麻烦的索性都放在一个文件内了请查看 [Kubernetes基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/部署文档/Kubernetes基础环境准备.md) ,请按照此文档初始化环境 + +1. 配置主机名 + + ```bash + hostnamectl set-hostname master && bash + ``` + +2. 配置主机 hosts + + ```bash + vi /etc/hosts + ``` + + 添加如下内容 + + ```bash + 192.168.1.10 master + ``` + +## 安装Containerd + +请跳转此文档 [网络源安装Containerd](https://gitee.com/offends/Kubernetes/blob/main/Containerd/Docs/%E7%BD%91%E7%BB%9C%E6%BA%90%E5%AE%89%E8%A3%85Containerd.md) + +## 安装Kubeadm + +请跳转此文档 [安装Kubeadm](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/Kubeadm/%E5%AE%89%E8%A3%85Kubeadm.md) + +## 安装 Kubernetes + +请跳转此文档 [Kubeadm初始化安装Kubernetes节点](https://gitee.com/offends/Kubernetes/tree/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/Kubeadm/Kubeadm%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%89%E8%A3%85Kubernetes%E8%8A%82%E7%82%B9.md) diff --git a/部署文档/Kubeadm/Kubeadm部署单机Kubernetes(Docker).md b/部署文档/Kubeadm/Kubeadm部署单机Kubernetes(Docker).md new file mode 100644 index 0000000..2f22c62 --- /dev/null +++ b/部署文档/Kubeadm/Kubeadm部署单机Kubernetes(Docker).md @@ -0,0 +1,142 @@ +> 本文作者:丁辉 + +# Kubeadm部署单机Kubernetes(Docker) + +> Kubernetes v1.24 以后需要额外安装 cri-dockerd , Kubernetes 就正常识别到 Docker +> + +| 节点名 | IP | +| :----: | :----------: | +| master | 192.168.1.10 | + +## 环境准备 + +> !!!每次部署都写挺麻烦的索性都放在一个文件内了请查看 [Kubernetes基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/部署文档/Kubernetes基础环境准备.md) ,请按照此文档初始化环境 + +1. 配置主机名 + + ```bash + hostnamectl set-hostname master && bash + ``` + +2. 配置主机 hosts + + ```bash + vi /etc/hosts + ``` + + 添加如下内容 + + ```bash + 192.168.1.10 master + ``` + +## 安装Docker + +请跳转此文档 [Docker网络安装](https://gitee.com/offends/Kubernetes/blob/main/Docker/Docs/Centos%E5%AE%89%E8%A3%85Docker.md) + +## 安装Cri-dockerd + +[Github软件包下载](https://github.com/Mirantis/cri-dockerd/releases) + +1. 下载 + + ```bash + wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el7.x86_64.rpm + ``` + +2. 安装 + + ```bash + rpm -ivh *.rpm --force --nodeps + ``` + +3. 配置国内源 + + ```bash + vi /usr/lib/systemd/system/cri-docker.service + ``` + + 修改 + + ```bash + ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 + ``` + +4. 启动 + + ```bash + systemctl daemon-reload + systemctl enable cri-docker.socket cri-docker + systemctl start cri-docker.socket cri-docker + systemctl status cri-docker.socket + systemctl status cri-docker + ``` + +## 安装Runc + +[Github软件包下载](https://github.com/opencontainers/runc/releases) + +1. 下载 + + ```bash + wget https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 + ``` + +2. 安装 + + ```bash + install -m 755 runc.amd64 /usr/local/bin/runc + ``` + +## 安装Kubeadm + +请跳转此文档 [安装Kubeadm](https://gitee.com/offends/Kubernetes/blob/main/部署文档/Kubeadm/安装Kubeadm.md) + +## 安装Kubernetes + +1. Kubernetes 安装 + + ```bash + kubeadm init \ + --node-name=master \ + --image-repository=registry.aliyuncs.com/google_containers \ + --cri-socket=unix:///var/run/cri-dockerd.sock \ + --apiserver-advertise-address=192.168.1.10 \ + --pod-network-cidr=10.244.0.0/16 \ + --service-cidr=10.96.0.0/12 + ``` + + **参数解释** + + | 参数 | 说明 | + | :------------------------------: | :----------------------------------------------------------: | + | `--node-name=master` | 指定节点的名称为“master”。 | + | `--image-repository=` | 指定容器镜像仓库地址,此处指定了镜像仓库为registry.aliyuncs.com/google_containers。 | + | `--cri-socket=` | 指定容器运行时接口(CRI)的Unix套接字文件路径,用于与容器运行时通信。此处设置为`unix:///var/run/cri-dockerd.sock`,与CRI-Dockerd通信。 | + | `--apiserver-advertise-address=` | 指定API服务器公告地址,即API服务器将会公布的地址。在此设置为`192.168.1.10`。 | + | `--pod-network-cidr=` | 指定Pod网络的CIDR地址段。这个CIDR地址段用于分配给Pod。在此设置为`10.244.0.0/16`。 | + | `--service-cidr=` | 指定Service的CIDR地址段。这个CIDR地址段用于分配给Service。在此设置为`10.96.0.0/12`。 | + +2. 根据提示配置文件 + + ```bash + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + export KUBECONFIG=/etc/kubernetes/admin.conf + ``` + + > 永久生效 + > + > ```bash + > echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile + > source ~/.bash_profile + > ``` + +## 安装网络插件 + +请跳转此文档 + +- [Flannel网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/部署文档/网络插件安装/Flannel网络插件安装.md) +- [Calico网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/部署文档/网络插件安装/Calico网络插件安装.md) diff --git a/部署文档/Kubeadm/安装Kubeadm.md b/部署文档/Kubeadm/安装Kubeadm.md new file mode 100644 index 0000000..82c04a7 --- /dev/null +++ b/部署文档/Kubeadm/安装Kubeadm.md @@ -0,0 +1,188 @@ +> 本文作者:丁辉 + +# 安装Kubeadm + +[阿里源配置文件](https://developer.aliyun.com/mirror/kubernetes) + +[官方安装文档](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl) + +## YUM安装 + +1. 添加网络源 + + - 官方源 + + ```bash + cat < /etc/yum.repos.d/kubernetes.repo + [kubernetes] + name=Kubernetes + baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ + enabled=1 + gpgcheck=1 + repo_gpgcheck=1 + gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg + EOF + ``` + +2. 安装 + + - 官方源 + + ```bash + yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes + ``` + + - 阿里源 + + > 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 `yum install -y --nogpgcheck kubelet kubeadm kubectl` 安装 + + ```bash + yum install -y --nogpgcheck kubelet kubeadm kubectl + ``` + +3. 启动 + + ```bash + systemctl enable --now kubelet + ``` + + +## APT安装 + +- 官方源 + + 1. 更新`apt`软件包索引并安装使用 Kubernetes`apt`存储库所需的软件包 + + ```bash + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gpg + ``` + + 2. 下载 Kubernetes 软件包存储库的公共签名密钥。所有存储库都使用相同的签名密钥,因此您可以忽略 URL 中的版本 + + ```bash + curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + ``` + + 3. 添加适当的 Kubernetes`apt`存储库。请注意,此存储库仅包含适用于 Kubernetes 1.30 的软件包;对于其他 Kubernetes 次要版本,您需要更改 URL 中的 Kubernetes 次要版本以匹配所需的次要版本(您还应该检查您正在阅读的文档是否适用于您计划安装的 Kubernetes 版本)。 + + ```bash + echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list + ``` + + 4. 更新`apt`软件包索引,安装 kubelet、kubeadm 和 kubectl,并固定其版本 + + ```bash + sudo apt-get update + sudo apt-get install -y kubelet kubeadm kubectl + sudo apt-mark hold kubelet kubeadm kubectl + ``` + + 5. 运行 kubeadm 之前启用 kubelet 服务 + + ```bash + systemctl enable --now kubelet + ``` + +- 阿里源 + + - 新版 + + 1. 更新`apt`软件包索引并安装使用 Kubernetes`apt`存储库所需的软件包 + + ```bash + apt-get update && apt-get install -y apt-transport-https + ``` + + 2. 下载 Kubernetes 软件包存储库的公共签名密钥。 + + ```bash + curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key | + gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg + ``` + + 3. 添加适当的 Kubernetes`apt`存储库。 + + ```bash + echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" | + tee /etc/apt/sources.list.d/kubernetes.list + ``` + + 4. 更新`apt`软件包索引,安装 kubelet、kubeadm 和 kubectl,并固定其版本 + + ```bash + apt-get update + apt-get install -y kubelet kubeadm kubectl + ``` + + 5. 运行 kubeadm 之前启用 kubelet 服务 + + ```bash + systemctl enable --now kubelet + ``` + + - 旧版 + + 1. 更新`apt`软件包索引并安装使用 Kubernetes`apt`存储库所需的软件包 + + ```bash + apt-get update && apt-get install -y apt-transport-https + ``` + + 2. 下载 Kubernetes 软件包存储库的公共签名密钥。 + + ```bash + curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - + ``` + + 3. 添加适当的 Kubernetes`apt`存储库。 + + ```bash + cat </etc/apt/sources.list.d/kubernetes.list + deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main + EOF + ``` + + 4. 更新`apt`软件包索引,安装 kubelet、kubeadm 和 kubectl,并固定其版本 + + ```bash + apt-get update + apt-get install -y kubelet kubeadm kubectl + ``` + + 5. 运行 kubeadm 之前启用 kubelet 服务 + + ```bash + systemctl enable --now kubelet + ``` + + \ No newline at end of file diff --git a/部署文档/Kubeadm/旧版Kubeadm部署单机Kubernetes-v1.23(Docker).md b/部署文档/Kubeadm/旧版Kubeadm部署单机Kubernetes-v1.23(Docker).md new file mode 100644 index 0000000..1ffc8c0 --- /dev/null +++ b/部署文档/Kubeadm/旧版Kubeadm部署单机Kubernetes-v1.23(Docker).md @@ -0,0 +1,138 @@ +> 本文作者:丁辉 + +# 旧版Kubeadm部署单机Kubernetes-v1.23(Docker) + +[Github-v1.23版本情况](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md) + +> 指定 v1.23 版本安装 +> + +| 节点名 | IP | +| :----: | :----------: | +| master | 192.168.1.10 | + +## 环境准备 + +> !!!每次部署都写挺麻烦的索性都放在一个文件内了请查看 [Kubernetes基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/部署文档/Kubernetes基础环境准备.md) ,请按照此文档初始化环境 + +1. 配置主机名 + + ```bash + hostnamectl set-hostname master && bash + ``` + +2. 配置主机 hosts + + ```bash + vi /etc/hosts + ``` + + 添加如下内容 + + ```bash + 192.168.1.10 master + ``` + +## 安装 Docker + +- 设置存储库 + + [阿里源配置文件](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://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + ``` + +- 安装(特定版本) + + ```bash + yum install docker-ce-20.10.24-3.el7 docker-ce-cli-20.10.24-3.el7 -y + ``` + +- 编辑配置文件 + + ```bash + vi /etc/docker/daemon.json + ``` + + ```bash + { + "exec-opts": ["native.cgroupdriver=systemd"] + } + ``` + +- 启动 + + ```bash + systemctl start docker + systemctl enable docker + systemctl status docker + ``` + +## 安装Kubeadm + +[阿里源配置文件](https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.4eac1b11shXBpr) + +- 添加网络源 + + ```bash + cat < /etc/yum.repos.d/kubernetes.repo + [kubernetes] + name=Kubernetes + baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ + enabled=1 + gpgcheck=1 + repo_gpgcheck=1 + gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg + EOF + ``` + +- 安装(特定版本) + + ```bash + yum install kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17 -y + ``` + +- 启动 + + ```bash + systemctl enable --now kubelet + ``` + +## 安装Kubernetes + +- master 安装 + + ```bash + kubeadm init \ + --kubernetes-version=v1.23.17 \ + --pod-network-cidr=10.244.0.0/16 \ + --service-cidr=10.96.0.0/12 \ + --apiserver-advertise-address=192.168.1.10 --image-repository=registry.aliyuncs.com/google_containers + ``` + + **参数** + +- 根据提示配置文件 + + ```bash + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + export KUBECONFIG=/etc/kubernetes/admin.conf + ``` + + > 永久生效 + > + > ```bash + > echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile + > source ~/.bash_profile + > ``` + +## 安装网络插件 + +请跳转此文档 + +- [Flannel网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/部署文档/网络插件安装/Flannel网络插件安装.md) +- [Calico网络插件安装](https://gitee.com/offends/Kubernetes/blob/main/部署文档/网络插件安装/Calico网络插件安装.md) diff --git a/部署文档/Kubeasz/Kubeasz部署Kubernetes集群.md b/部署文档/Kubeasz/Kubeasz部署Kubernetes集群.md new file mode 100644 index 0000000..406d279 --- /dev/null +++ b/部署文档/Kubeasz/Kubeasz部署Kubernetes集群.md @@ -0,0 +1,268 @@ +> 本文作者:丁辉 + +# Kubeasz部署Kubernetes集群 + +[Github官方文档](https://github.com/easzlab/kubeasz) + +[Github安装文档](https://github.com/easzlab/kubeasz/blob/master/docs/setup/quickStart.md) + +| 节点名称 | IP | Kubernetes角色 | +| :----------------------: | :----------: | :--------------: | +| k8s-master-1,Kubeasz管理 | 192.168.1.10 | master,etcd,node | +| k8s-master-2 | 192.168.1.20 | master,etcd,node | +| k8s-master-3 | 192.168.1.30 | master,etcd,node | + +## 环境准备 + +1. 配置免密 + + ```bash + ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa -q + ``` + +2. 配置免密登录 + + ```bash + ssh-copy-id root@192.168.1.10 + ssh-copy-id root@192.168.1.20 + ssh-copy-id root@192.168.1.30 + ``` + +3. 更改主机名 + + - 192.168.1.10 + + ```bash + hostnamectl set-hostname k8s-master-1 && bash + ``` + + - 192.168.1.20 + + ```bash + hostnamectl set-hostname k8s-master-2 && bash + ``` + + - 192.168.1.30 + + ```bash + hostnamectl set-hostname k8s-master-3 && bash + ``` + +4. 编辑 /etc/hosts 文件 + + ```bash + vi /etc/hosts + ``` + + 添加如下内容 + + ```bash + 192.168.1.10 k8s-master-1 + 192.168.1.20 k8s-master-2 + 192.168.1.30 k8s-master-3 + ``` + +## 开始部署 Kubeasz + +[Github Releases](https://github.com/easzlab/kubeasz/releases) + +1. 下载 ezdown + + ```bash + wget https://github.com/easzlab/kubeasz/releases/download/3.6.2/ezdown && chmod 777 ezdown + ``` + + > 下载支持 Docker 的版本 + > + > ```bash + > wget https://github.com/easzlab/kubeasz/releases/download/3.2.0/ezdown && chmod 777 ezdown + > ``` + +2. 下载kubeasz代码、二进制、默认容器镜像 + + - 国内环境 + + ```bash + ./ezdown -D + ``` + + > 下载 flannel 镜像 + > + > ```bash + > ./ezdown -X flannel + > ``` + + - 海外环境 + + ```bash + ./ezdown -D -m standard + ``` + + > 下载 flannel 镜像 + > + > ```bash + > ./ezdown -D -m standard -X flannel + > ``` + +3. 运行 Kubeasz + + ```bash + ./ezdown -S + ``` + + > 配置快捷命令 + > + > ```bash + > echo "alias dk='docker exec -it kubeasz'" >> ~/.bashrc + > source ~/.bashrc + > ``` + > + > 配置后执行 `dk` 即可 + +4. 创建新集群 + + ```bash + dk ezctl new k8s-01 + ``` + +5. 编辑 hosts 文件 + + ```bash + vi /etc/kubeasz/clusters/k8s-01/hosts + ``` + + 内容如下 + + ```bash + # 'etcd' cluster should have odd member(s) (1,3,5,...) + [etcd] + 192.168.1.10 + 192.168.1.20 + 192.168.1.30 + + # master node(s) + [kube_master] + 192.168.1.10 k8s_nodename='k8s-master-1' + 192.168.1.20 k8s_nodename='k8s-master-2' + 192.168.1.30 k8s_nodename='k8s-master-3' + + # work node(s) + [kube_node] + 192.168.1.10 k8s_nodename='k8s-master-1' + 192.168.1.20 k8s_nodename='k8s-master-2' + 192.168.1.30 k8s_nodename='k8s-master-3' + + # VIP + [ex_lb] + 192.168.1.10 LB_ROLE=master EX_APISERVER_VIP=192.168.1.100 EX_APISERVER_PORT=8443 + 192.168.1.20 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.100 EX_APISERVER_PORT=8443 + 192.168.1.30 LB_ROLE=backup EX_APISERVER_VIP=192.168.1.100 EX_APISERVER_PORT=8443 + + ...#此处省略 + # Cluster container-runtime supported: docker, containerd + CONTAINER_RUNTIME="containerd" + + # Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn + CLUSTER_NETWORK="flannel" + + ...#此处省略 + ``` + +6. 修改 config.yml 文件 + + ```bash + vi /etc/kubeasz/clusters/k8s-01/config.yml + ``` + + 内容如下 + + ```yml + ############################ + # role:kube-master + ############################ + # k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)尽量预留一些IP使用 + MASTER_CERT_HOSTS: + - "192.168.1.10" + - "192.168.1.20" + - "192.168.1.30" + - "192.168.1.100" + ``` + + +## 开始安装 Kubernetes + +1. 安装 + + ```bash + dk ezctl setup k8s-01 all + ``` + + > 或一步一步安装 + > + > ```bash + > # 初始化集群配置 + > dk ezctl setup k8s-01 01 + > # 安装 etcd + > dk ezctl setup k8s-01 02 + > ...#此处省略 + > ``` + +2. 加载新配置 + + ```bash + source ~/.bashrc + ``` + +3. 查看节点状态 + + ```bash + kubectl get node + ``` + +## 添加节点 + +[官方文档](https://github.com/easzlab/kubeasz/blob/master/docs/op/op-node.md) + +- 添加 worker + + ```bash + dk ezctl add-node k8s-01 192.168.1.40 k8s_nodename='k8s-master-4' + ``` + + > SSH 非 22 端口 + > + > ```bash + > dk ezctl add-node k8s-01 192.168.1.40 k8s_nodename='k8s-master-4' ansible_ssh_port=10022 + > ``` + +- 添加 master + + ```bash + dk ezctl add-master k8s-01 192.168.1.40 k8s_nodename='k8s-master-4' + ``` + +- 添加 etcd + + ```bash + dk ezctl add-etcd k8s-01 192.168.1.40 + ``` + +### 删除节点 + +- 删除 worker + + ```bash + dk ezctl del-node k8s-01 192.168.1.40 + ``` + +- 删除 master + + ```bash + dk ezctl del-master k8s-01 192.168.1.40 + ``` + +- 删除 etcd + + ```bash + dk ezctl del-etcd k8s-01 192.168.1.40 + ``` diff --git a/部署文档/Kubectl工具安装/Kubectl安装Convert插件.md b/部署文档/Kubectl工具安装/Kubectl安装Convert插件.md new file mode 100644 index 0000000..e3ef231 --- /dev/null +++ b/部署文档/Kubectl工具安装/Kubectl安装Convert插件.md @@ -0,0 +1,55 @@ +> 本文作者:丁辉 + +# Kubectl安装Convert插件 + +> 一个 Kubernetes 命令行工具 `kubectl` 的插件,允许你将清单在不同 API 版本间转换。 这对于将清单迁移到新的 Kubernetes 发行版上未被废弃的 API 版本时尤其有帮助。 + +[官方文档](https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/#install-kubectl-convert-plugin) + +## 安装Convert + +- X86-64 + + ```bash + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl-convert" + ``` + +- ARM64 + + ```bash + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl-convert" + ``` + +## 验证该可执行文件(可选步骤) + +- X86-64 + + ```bash + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl-convert.sha256" + ``` + +- ARM64 + + ```bash + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl-convert.sha256" + ``` + +**基于校验和文件,验证 kubectl 的可执行文件** + +```bash +echo "$(cat kubectl-convert.sha256) kubectl-convert" | sha256sum --check +``` + +> 验证通过时,输出为 `kubectl: OK` + +## 安装 + +```bash +install -o root -g root -m 0755 kubectl-convert /usr/local/bin/kubectl-convert +``` + +## 验证 + +```bash +kubectl convert --help +``` \ No newline at end of file diff --git a/部署文档/Kubectl工具安装/Kubectl安装命令自动补全工具.md b/部署文档/Kubectl工具安装/Kubectl安装命令自动补全工具.md new file mode 100644 index 0000000..229ed9f --- /dev/null +++ b/部署文档/Kubectl工具安装/Kubectl安装命令自动补全工具.md @@ -0,0 +1,26 @@ +> 本文作者:丁辉 + +# Kubectl安装命令自动补全工具 + +[官方文档](https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/#optional-kubectl-configurations) + +## 安装 bash-completion + +- Ubuntu + + ```bash + apt-get install bash-completion + ``` + +- Centos + + ```bash + yum install bash-completion + ``` + +## 启动 kubectl 自动补全功能 + +```bash +echo 'source <(kubectl completion bash)' >>~/.bashrc +source ~/.bashrc +``` \ No newline at end of file diff --git a/部署文档/Kubectl工具安装/二进制文件安装Kubectl.md b/部署文档/Kubectl工具安装/二进制文件安装Kubectl.md new file mode 100644 index 0000000..f480288 --- /dev/null +++ b/部署文档/Kubectl工具安装/二进制文件安装Kubectl.md @@ -0,0 +1,74 @@ +> 本文作者:丁辉 + +# 二进制文件安装Kubectl(推荐) + +[官方文档](https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/#install-kubectl-binary-with-curl-on-linux) + +## 下载最新版Kubectl + +- X86-64 + + ```bash + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + ``` + + > 下载指定版本 + > + > ```bash + > curl -LO https://dl.k8s.io/release/v1.29.2/bin/linux/amd64/kubectl + > ``` + +- ARM64 + + ```bash + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl" + ``` + + > 下载指定版本 + > + > ```bash + > curl -LO https://dl.k8s.io/release/v1.29.2/bin/linux/arm64/kubectl + > ``` + +## 验证该可执行文件(可选步骤) + +- X86-64 + + ```bash + curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256" + ``` + +- ARM64 + + ```bash + curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl.sha256" + ``` + +**基于校验和文件,验证 kubectl 的可执行文件** + +```bash +echo "$(cat kubectl.sha256) kubectl" | sha256sum --check +``` + +> 验证通过时,输出为 `kubectl: OK` + +## 安装 + +```bash +install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl +``` + +## 验证 + +- 查看版本 + + ```bash + kubectl version --client + ``` + +- 查看版本详细信息 + + ```bash + kubectl version --client --output=yaml + ``` + diff --git a/部署文档/Kubectl工具安装/包管理工具安装Kubectl.md b/部署文档/Kubectl工具安装/包管理工具安装Kubectl.md new file mode 100644 index 0000000..4f545f0 --- /dev/null +++ b/部署文档/Kubectl工具安装/包管理工具安装Kubectl.md @@ -0,0 +1,82 @@ +> 本文作者:丁辉 + +# 包管理工具安装Kubectl + +[官方文档](https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/#install-using-native-package-management) + +## Centos安装 + +1. 添加 Kubernetes 的 `yum` 仓库 + + > 如果你想使用 v1.29 之外的 Kubernetes 版本, 将下面命令中的 v1.29 替换为所需的次要版本。 + + ```bash + cat < 如果你想用 v1.29 之外的 Kubernetes 版本, 请将下面命令中的 v1.29 替换为所需的次要版本。 + + ```bash + echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list + ``` + +4. 更新 `apt` 包索引 + + ```bash + apt-get update + ``` + +5. 安装 kubectl + + ```bash + apt-get install -y kubectl + ``` + +## 验证 + +- 查看版本 + + ```bash + kubectl version --client + ``` + +- 查看版本详细信息 + + ```bash + kubectl version --client --output=yaml + ``` diff --git a/部署文档/Kubernetes基础环境准备.md b/部署文档/Kubernetes基础环境准备.md new file mode 100644 index 0000000..2a94957 --- /dev/null +++ b/部署文档/Kubernetes基础环境准备.md @@ -0,0 +1,199 @@ +> 本文作者:丁辉 + +# Kubernetes基础环境准备 + +## 时间同步 + +1. 安装 ntpdate + + ```bash + yum -y install ntpdate + ``` + +2. 配置时区并同步 + + ```bash + ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + ntpdate -u ntp.aliyun.com && date + ``` + +> 离线环境使用此篇文档同步 +> +> [NTP时间同步](https://gitee.com/offends/Linux/blob/main/Docs/NTP%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5.md) + +## Linux环境配置 + +1. 关闭防火墙 + + ```bash + systemctl stop firewalld && systemctl disable firewalld + ``` + +2. 禁用 selinux + + ```bash + sudo setenforce 0 + sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config + ``` + +3. 禁用 swap + + ```bash + swapoff -a + sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab + ``` + +**解释** + +在 Kubernetes 集群部署过程中,禁用 Swap 和 SELinux 是出于一些安全和性能方面的考虑。 + +- 禁用 Swap:Swap(交换空间)是一种可以将内存中的数据暂时存储到硬盘上的机制。在 Kubernetes 中,默认情况下是禁用 Swap 的。禁用 Swap 可以避免因为将数据交换到磁盘导致的性能下降,同时也避免了节点上的内存使用不一致性问题。 +- 禁用 SELinux:SELinux(Security-Enhanced Linux)是为了增强 Linux 系统的安全性而提供的一种安全子系统。尽管 SELinux 提供了强大的安全功能,但它更适合于传统的单机环境,而不是容器化环境。在 Kubernetes 中,禁用 SELinux 可以简化集群的配置和管理,并且减少可能由于权限配置不正确而导致的问题。 + +当然,禁用 Swap 和 SELinux 并不是绝对必需的,这取决于你的具体场景和需求。如果你有特定的安全需求或者对性能有较高的要求,禁用 Swap 和 SELinux 可能是一个好的选择。但在某些情况下,可能需要根据实际情况来进行配置和调整。 + +## 主机配置 + +| 主机名 | IP | +| :----: | :----------: | +| k8s-1 | 192.168.1.10 | +| k8s-2 | 192.168.1.20 | +| k8s-3 | 192.168.1.30 | + +1. 配置主机名 + + - k8s-1 + + ```bash + hostnamectl set-hostname k8s-1 + ``` + + - k8s-2 + + ```bash + hostnamectl set-hostname k8s-2 + ``` + + - k8s-3 + + ```bash + hostnamectl set-hostname k8s-3 + ``` + +2. 添加 hosts + + ```bash + vi /etc/hosts + ``` + + 添加内容如下 + + ```bash + 192.168.1.10 k8s-1 + 192.168.1.20 k8s-2 + 192.168.1.30 k8s-3 + ``` + +## 修改内核参数 + +1. 加载 br_netfilter 网络过滤器模块 + + ```bash + cat < 更多完整参数配置请查看 [参数配置](https://gitee.com/offends/Kubernetes/blob/main/File/Conf/k8s.conf) + + ```bash + cat < /etc/NetworkManager/conf.d/99-unmanaged-devices.conf + [keyfile] + unmanaged-devices=interface-name:eth*,except:interface-name:eth0;interface-name:docker0;interface-name:flannel*;interface-name:cali*;interface-name:cni0;mac:66:77:88:99:00:aa + EOF + ``` + + **参数解释** + + - `interface-name:eth*`:表示匹配以"eth"开头的接口名称。 + - `except:interface-name:eth0`:表示排除名为"eth0"的接口。 + - `interface-name:docker0`:表示匹配名为"docker0"的接口。 + - `interface-name:flannel*`:表示匹配以"flannel"开头的接口名称。 + - `interface-name:cali*`:表示匹配以"flannel"开头的接口名称。 + - `interface-name:cni0`:表示匹配名为"cni0"的接口。 + - `mac:66:77:88:99:00:aa`:表示匹配MAC地址为"66:77:88:99:00:aa"的接口。 + + 总结起来,这段代码的作用是配置网络接口的命名规则,包括匹配以"eth"开头的接口名称(除了"eth0"),匹配名为"docker0"、"flannel"开头的接口名称以及名为"cni0"的接口,并且排除MAC地址为"66:77:88:99:00:aa"的接口。 + + 3. 重新加载配置 + + ```bash + systemctl reload NetworkManager + ``` + +### 问题记录 + +在 centos 8.x 环境中,默认没有安装 `network-scripts`,禁止 Network Manager 服务后则无法重启网络,可以通过手动安装。 + +```bash +yum -y install network-scripts +``` + diff --git a/部署文档/Rancher-K3s/K3s单机部署.md b/部署文档/Rancher-K3s/K3s单机部署.md new file mode 100644 index 0000000..4323c84 --- /dev/null +++ b/部署文档/Rancher-K3s/K3s单机部署.md @@ -0,0 +1,63 @@ +> 本文作者:丁辉 + +# K3s单机部署 + +[Github仓库](https://github.com/k3s-io/k3s/) + +[中文官方文档](https://docs.k3s.io/zh/) + +## 开始部署 + +[K3s基础环境准备官方文档](https://docs.k3s.io/zh/installation/requirements) + +| 节点名称 | IP | 角色 | +| :--------: | :----------: | :------------------: | +| k3s-master | 192.168.1.10 | control-plane,master | + +[所有变量参数解释](https://docs.k3s.io/zh/cli/server) + +- 国外源 + + ```bash + curl -sfL https://get.k3s.io | \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_NODE_NAME=k3s-master \ + sh - + ``` + +- 国内源 + + ```bash + curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ + K3S_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_NODE_NAME=k3s-master \ + sh - + ``` + +**参数解释** + +| 参数 | 解释 | +| :-------------------------: | :----------------------------------------------------------: | +| INSTALL_K3S_MIRROR | 该参数用于指定 k3s 安装过程中下载软件包和镜像的镜像站点。 | +| K3S_SYSTEM_DEFAULT_REGISTRY | 该参数用于指定 k3s 系统组件(如 kube-apiserver、kube-controller-manager 等)使用的默认镜像仓库地址。 | +| K3S_KUBECONFIG_OUTPUT | 指定 K3s 安装完成后生成的 kubeconfig 文件的输出路径。在这个例子中,设置为 `~/.kube/config`,表示 kubeconfig 文件将保存在当前用户的主目录下的 `.kube` 目录中,文件名为 `config`。 | +| K3S_KUBECONFIG_MODE | 指定生成的 kubeconfig 文件的权限模式。在这个例子中,设置为 `644`,表示生成的 kubeconfig 文件权限模式为 `-rw-r--r--`,即当前用户有读写权限,其他用户只有读权限。 | +| K3S_NODE_NAME | 指定 K3s 安装节点的名称。在这个例子中,设置为 `k3s-master`,表示安装的节点将被命名为 `k3s-master`。 | + +## 卸载 + +1. 停止 + + ```bash + k3s-killall.sh + ``` + +2. 卸载 + + ```bash + k3s-uninstall.sh + ``` + diff --git a/部署文档/Rancher-K3s/K3s单机部署指定容器运行时Docker.md b/部署文档/Rancher-K3s/K3s单机部署指定容器运行时Docker.md new file mode 100644 index 0000000..7f0f0b9 --- /dev/null +++ b/部署文档/Rancher-K3s/K3s单机部署指定容器运行时Docker.md @@ -0,0 +1,108 @@ +> 本文作者:丁辉 + +# K3s单机部署指定容器运行时Docker + +> K3s默认容器运行时为: Containerd, 本文教你如何使用 Docker 容器运行时 + +[官方文档](https://docs.k3s.io/zh/advanced#%E4%BD%BF%E7%94%A8-docker-%E4%BD%9C%E4%B8%BA%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6) + +## 部署Docker + +1. Docker安装 + + ```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 + > ``` + +2. 启动 Docker + + ```bash + systemctl enable docker + systemctl start docker + ``` + +## 部署K3s + +> 使用 `--docker` 参数指定 K3s 要使用的运行时 + +- 国外源 + + ```bash + curl -sfL https://get.k3s.io | \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_NODE_NAME=k3s-master \ + sh -s - --docker + ``` + +- 国内源 + + ```bash + curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ + K3S_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_NODE_NAME=k3s-master \ + sh -s - --docker + ``` + +**参数解释** + +| 参数 | 解释 | +| :-------------------------: | :----------------------------------------------------------: | +| INSTALL_K3S_MIRROR | 该参数用于指定 k3s 安装过程中下载软件包和镜像的镜像站点。 | +| K3S_SYSTEM_DEFAULT_REGISTRY | 该参数用于指定 k3s 系统组件(如 kube-apiserver、kube-controller-manager 等)使用的默认镜像仓库地址。 | +| K3S_KUBECONFIG_OUTPUT | 指定 K3s 安装完成后生成的 kubeconfig 文件的输出路径。在这个例子中,设置为 `~/.kube/config`,表示 kubeconfig 文件将保存在当前用户的主目录下的 `.kube` 目录中,文件名为 `config`。 | +| K3S_KUBECONFIG_MODE | 指定生成的 kubeconfig 文件的权限模式。在这个例子中,设置为 `644`,表示生成的 kubeconfig 文件权限模式为 `-rw-r--r--`,即当前用户有读写权限,其他用户只有读权限。 | +| K3S_NODE_NAME | 指定 K3s 安装节点的名称。在这个例子中,设置为 `k3s-master`,表示安装的节点将被命名为 `k3s-master`。 | + +## 卸载 + +1. 停止 K3s + + ```bash + k3s-killall.sh + ``` + +2. 卸载 K3s + + ```bash + k3s-uninstall.sh + ``` + +3. 停止 Docker + + ```bash + systemctl stop docker + ``` + +4. 卸载 Docker + + - Centos + + ```bash + yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y + ``` + + - Ubuntu + + ```bash + sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras + ``` + +5. 删除 Docker 数据残留 + + ```bash + rm -rf /var/lib/docker + rm -rf /var/lib/containerd + ``` + + + + diff --git a/部署文档/Rancher-K3s/K3s自动部署清单.md b/部署文档/Rancher-K3s/K3s自动部署清单.md new file mode 100644 index 0000000..20259e4 --- /dev/null +++ b/部署文档/Rancher-K3s/K3s自动部署清单.md @@ -0,0 +1,8 @@ +> 本文作者:丁辉 + +# K3s自动部署清单 + +> 在 `/var/lib/rancher/k3s/server/manifests` 中找到的任何文件都会以类似 `kubectl apply` 的方式自动部署到 Kubernetes,在启动和在磁盘上更改文件时都是如此。从该目录中删除文件不会从集群中删除相应的资源。 + +[官方文档](https://docs.k3s.io/zh/installation/packaged-components) + diff --git a/部署文档/Rancher-K3s/K3s部署禁用自带附加组件.md b/部署文档/Rancher-K3s/K3s部署禁用自带附加组件.md new file mode 100644 index 0000000..c2fca34 --- /dev/null +++ b/部署文档/Rancher-K3s/K3s部署禁用自带附加组件.md @@ -0,0 +1,64 @@ +> 本文作者:丁辉 + +# K3s部署禁用自带附加组件 + +[官方文档](https://docs.k3s.io/zh/installation/packaged-components) + +**附加组件介绍** + +| 可选项 | 描述 | +| :------------: | :----------------------------------------------------------: | +| coredns | 用于 Kubernetes 集群中 DNS 服务的核心组件。 | +| servicelb | 提供了服务负载均衡的组件,用于在集群中分发流量。 | +| traefik | 一个流行的反向代理和负载均衡工具,用于管理应用程序的入口流量。 | +| local-storage | 本地存储提供了将本地磁盘挂载到 Kubernetes Pod 中的功能。 | +| metrics-server | 用于收集和暴露 Kubernetes 集群中各种对象的度量数据的组件。 | + +## 部署K3s + +> 使用 `--disable` 禁用自带附加组件安装 + +- 国外源 + + ```bash + curl -sfL https://get.k3s.io | \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_NODE_NAME=k3s-master \ + sh -s - --disable traefik,metrics-server,local-storage,servicelb + ``` + +- 国内源 + + ```bash + curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ + K3S_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_NODE_NAME=k3s-master \ + sh -s - --disable traefik,metrics-server,local-storage,servicelb + ``` + +**参数解释** + +| 参数 | 解释 | +| --------------------------- | ------------------------------------------------------------ | +| INSTALL_K3S_MIRROR | 该参数用于指定 k3s 安装过程中下载软件包和镜像的镜像站点。 | +| K3S_SYSTEM_DEFAULT_REGISTRY | 该参数用于指定 k3s 系统组件(如 kube-apiserver、kube-controller-manager 等)使用的默认镜像仓库地址。 | +| K3S_KUBECONFIG_OUTPUT | 指定 K3s 安装完成后生成的 kubeconfig 文件的输出路径。在这个例子中,设置为 `~/.kube/config`,表示 kubeconfig 文件将保存在当前用户的主目录下的 `.kube` 目录中,文件名为 `config`。 | +| K3S_KUBECONFIG_MODE | 指定生成的 kubeconfig 文件的权限模式。在这个例子中,设置为 `644`,表示生成的 kubeconfig 文件权限模式为 `-rw-r--r--`,即当前用户有读写权限,其他用户只有读权限。 | +| K3S_NODE_NAME | 指定 K3s 安装节点的名称。在这个例子中,设置为 `k3s-master`,表示安装的节点将被命名为 `k3s-master`。 | + +## 卸载 + +1. 停止 + + ```bash + k3s-killall.sh + ``` + +2. 卸载 + + ```bash + k3s-uninstall.sh + ``` diff --git a/部署文档/Rancher-K3s/K3s部署高可用集群.md b/部署文档/Rancher-K3s/K3s部署高可用集群.md new file mode 100644 index 0000000..044ae94 --- /dev/null +++ b/部署文档/Rancher-K3s/K3s部署高可用集群.md @@ -0,0 +1,184 @@ +> 本文作者:丁辉 + +# K3s部署高可用集群 + +[Github仓库](https://github.com/k3s-io/k3s/) + +[中文官方文档](https://docs.k3s.io/zh/) + +[K3s基础环境准备官方文档](https://docs.k3s.io/zh/installation/requirements) + +| 节点名称 | IP | 角色 | +| :----------: | :----------: | :-----------------------: | +| k3s-master-1 | 192.168.1.10 | control-plane,etcd,master | +| k3s-master-2 | 192.168.1.20 | control-plane,etcd,master | +| k3s-master-3 | 192.168.1.30 | control-plane,etcd,master | +| k3s-worker-1 | 192.168.1.40 | worker | + +> Master节点VIP: 192.168.1.100 + +[集群数据存储配置](https://docs.k3s.io/zh/datastore) + +[高可用嵌入式 etcd](https://docs.k3s.io/zh/datastore/ha-embedded) + +## 开始部署管理节点 + +[所有变量参数解释](https://docs.k3s.io/zh/cli/server) + +[集群负载均衡器](https://docs.k3s.io/zh/datastore/cluster-loadbalancer) + +- 国外源 + + ```bash + curl -sfL https://get.k3s.io | \ + K3S_NODE_NAME=k3s-master-1 \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_TOKEN=SECRET \ + INSTALL_K3S_EXEC="--node-taint k3s-controlplane=true:NoExecute" \ + sh -s - server \ + --cluster-init \ + --tls-san 192.168.1.100 + ``` + +- 国内源 + + ```bash + curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ + K3S_NODE_NAME=k3s-master-1 \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_TOKEN=SECRET \ + INSTALL_K3S_EXEC="--node-taint k3s-controlplane=true:NoExecute" \ + sh -s - server \ + --cluster-init \ + --tls-san 192.168.1.100 + ``` + + >该参数用于指定 k3s 系统组件(如 kube-apiserver、kube-controller-manager 等)使用的默认镜像仓库地址。(阿里同步较慢有时会获取不到最新镜像) + > + >```bash + >K3S_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com + >``` + +**参数解释** + +| 参数 | 解释 | +| :----------------------------------------------------------: | :----------------------------------------------------------: | +| K3S_NODE_NAME | 指定 K3s 安装节点的名称。在这个例子中,设置为 `k3s-master-1`,表示安装的节点将被命名为 `k3s-master-1`。 | +| K3S_KUBECONFIG_OUTPUT | 指定 K3s 安装完成后生成的 kubeconfig 文件的输出路径。在这个例子中,设置为 `~/.kube/config`,表示 kubeconfig 文件将保存在当前用户的主目录下的 `.kube` 目录中,文件名为 `config`。 | +| K3S_KUBECONFIG_MODE | 指定生成的 kubeconfig 文件的权限模式。在这个例子中,设置为 `644`,表示生成的 kubeconfig 文件权限模式为 `-rw-r--r--`,即当前用户有读写权限,其他用户只有读权限。 | +| K3S_TOKEN | 配置共享 secret | +| INSTALL_K3S_EXEC="--node-taint k3s-controlplane=true:NoExecute" | controlplane节点禁止调度 | +| --cluster-init | 使用嵌入式 Etcd 初始化新集群 | +| --tls-san | 在 TLS 证书上添加其他主机名或 IPv4/IPv6 地址作为 Subject Alternative Name | +| INSTALL_K3S_MIRROR | 该参数用于指定 k3s 安装过程中下载软件包和镜像的镜像站点。 | + +## 添加管理节点[2,3节点同理] + +- 国外源 + + ```bash + curl -sfL https://get.k3s.io | \ + K3S_NODE_NAME=k3s-master-2 \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_TOKEN=SECRET \ + INSTALL_K3S_EXEC="--node-taint k3s-controlplane=true:NoExecute" \ + sh -s - server \ + --server https://192.168.1.100:6443 \ + --tls-san 192.168.1.100 + ``` + +- 国内源 + + ```bash + curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ + K3S_NODE_NAME=k3s-master-2 \ + K3S_KUBECONFIG_OUTPUT=~/.kube/config \ + K3S_KUBECONFIG_MODE=644 \ + K3S_TOKEN=SECRET \ + INSTALL_K3S_EXEC="--node-taint k3s-controlplane=true:NoExecute" \ + sh -s - server \ + --server https://192.168.1.100:6443 \ + --tls-san 192.168.1.100 + ``` + +## 添加计算节点 + +> 在管理节点获取 ${node-token} +> +> ```bash +> cat /var/lib/rancher/k3s/server/node-token +> ``` + +- 国外源 + + ```bash + curl -sfL https://get.k3s.io | \ + K3S_NODE_NAME=k3s-worker-1 \ + K3S_URL=https://192.168.1.100:6443 \ + K3S_TOKEN=${node-token} \ + sh -s - agent + ``` + +- 国内源 + + ```bash + curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \ + K3S_NODE_NAME=k3s-worker-1 \ + K3S_URL=https://192.168.1.100:6443 \ + K3S_TOKEN=${node-token} \ + sh -s - agent + ``` + +**计算节点添加角色标签** + +```bash +kubectl label node ${node} node-role.kubernetes.io/worker=true --overwrite +``` + +> `--overwrite` 强制覆盖 + +## 卸载 + +### 卸载 Server + +1. 删除 Server 节点 + + ```bash + kubectl delete node ${node} + ``` + +2. 停止 Server + + ```bash + k3s-killall.sh + ``` + +3. 卸载 Server + + ```bash + k3s-uninstall.sh + ``` + +### 卸载 Agent + +1. 删除 Agent 节点 + + ```bash + kubectl delete node ${node} + ``` + +2. 停止 K3s-Agent + + ```bash + k3s-killall.sh + ``` + +3. 卸载 K3s-Agent + + ```bash + k3s-agent-uninstall.sh + ``` + diff --git a/部署文档/Rancher/Rancher组件公开Metrics访问.md b/部署文档/Rancher/Rancher组件公开Metrics访问.md new file mode 100644 index 0000000..41ee49f --- /dev/null +++ b/部署文档/Rancher/Rancher组件公开Metrics访问.md @@ -0,0 +1,24 @@ +> 本文作者:丁辉 + +# Rancher组件公开Metrics访问 + +## RKE1添加Arg + +```bash +vi cluster.yml +``` + +修改如下内容(当前只有这俩默认不对外开放) + +```yaml +services: + etcd: + image: "" + extra_args: + listen-metrics-urls: "http://0.0.0.0:2381" +... +kubeproxy: + image: "" + extra_args: + metrics-bind-address: "0.0.0.0:10249" +``` \ No newline at end of file diff --git a/部署文档/Rancher/Rke1部署Kubernetes集群.md b/部署文档/Rancher/Rke1部署Kubernetes集群.md new file mode 100644 index 0000000..b1cae5f --- /dev/null +++ b/部署文档/Rancher/Rke1部署Kubernetes集群.md @@ -0,0 +1,386 @@ +> 本文作者:丁辉 + +# Rke1部署Kubernetes集群 + +[RKE1文档](https://rke.docs.rancher.com/) + +[Rancher中文文档](https://docs.rancher.cn/) + +| 节点名称 | IP | Kubernetes角色 | +| :------------------: | :----------: | :----------------------: | +| k8s-master-1,Rke管理 | 192.168.1.10 | controlplane,etcd,worker | +| k8s-master-2 | 192.168.1.20 | controlplane,etcd,worker | +| k8s-master-3 | 192.168.1.30 | controlplane,etcd,worker | + +## 环境准备 + +> !!!每次部署都写挺麻烦的索性都放在一个文件内了请查看 [Kubernetes基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/Kubernetes%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.md) ,请按照此文档初始化环境 + +### 所有节点执行 + +1. 配置 SSH + + ```bash + sed -i 's/#AllowTcpForwarding yes/AllowTcpForwarding yes/g' /etc/ssh/sshd_config + ``` + + 重启 SSH + + ```bash + systemctl restart sshd + ``` + +2. 将用户添加到 docker 组 + + ```bash + groupadd docker + useradd -m docker -g docker + ``` + + > 使用其他用户 + > + > ```bash + > useradd rke # 创建用户 + > usermod -aG docker rke 将rke用户加入docker组 + > ``` + +3. 配置 docker 用户免密登录 + + ```bash + mkdir -p /home/docker/.ssh/ + touch /home/docker/.ssh/authorized_keys + chmod 700 /home/docker/.ssh/ + chown -R docker.docker /home/docker/.ssh/ + chmod 600 /home/docker/.ssh/authorized_keys + ``` + +### Rke管理节点执行 + +1. 生成密钥 + + ```bash + ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa -q + ``` + +2. 查看主节点密钥 + + > 密钥需要到 RKE 初始化节点上获取,所有节点都是用此密钥 + + ```bash + cat ~/.ssh/id_rsa.pub + ``` + + +### 所有节点执行 + +1. 粘贴密钥内容到此文件内(提示:所有节点粘贴Rke管理节密钥) + + ```bash + vi /home/docker/.ssh/authorized_keys + ``` + +2. 验证是否可以免密登录 + + ```bash + ssh docker@192.168.1.10 + ``` + +## Docker安装 + +1. Docker安装 + + ```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 + > ``` + +2. 启动 Docker + + ```bash + systemctl enable docker + systemctl start docker + ``` + +## 安装并初始化Rke + +[RKE二进制文件](https://github.com/rancher/rke/releases/) + +1. 下载 RKE 二进制文件,并添加到可执行路径下 + + ```bash + wget https://github.com/rancher/rke/releases/download/v1.4.10/rke_linux-amd64 + ``` + +2. 授权 + + ```bash + chmod 777 rke_linux-amd64 && mv rke_linux-amd64 /usr/local/bin/rke + ``` + +### 方法一 (不推荐怪麻烦的请看"方法二") + +> 如果 `Number of Hosts` 填的是多节点则会提示输入多次节点信息 + +```bash +rke config --name cluster.yml +``` + +```bash +[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]: #默认回车 +[+] Number of Hosts [1]: #节点数量 +[+] SSH Address of host (1) [none]: 192.168.1.10 #节点IP地址 +[+] SSH Port of host (1) [22]: #默认回车 +[+] SSH Private Key Path of host (192.168.1.10) [none]: #默认回车 +[-] You have entered empty SSH key path, trying fetch from SSH key parameter +[+] SSH Private Key of host (192.168.1.10) [none]: #默认回车 +[-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa +[+] SSH User of host (192.168.1.10) [ubuntu]: docker #SSH用户 +[+] Is host (192.168.1.10) a Control Plane host (y/n)? [y]: y #是否为控制节点 +[+] Is host (192.168.1.10) a Worker host (y/n)? [n]: y #是否为计算节点 +[+] Is host (192.168.1.10) an etcd host (y/n)? [n]: y #是否为etcd节点 +[+] Override Hostname of host (192.168.1.10) [none]: #默认回车 +[+] Internal IP of host (192.168.1.10) [none]: 192.168.1.10 #主机内部IP +[+] Docker socket path on host (192.168.1.10) [/var/run/docker.sock]: #默认回车 +[+] Network Plugin Type (flannel, calico, weave, canal, aci) [canal]: flannel #选择网络插件类型 +[+] Authentication Strategy [x509]: #默认回车 +[+] Authorization Mode (rbac, none) [rbac]: #默认回车 +[+] Kubernetes Docker image [rancher/hyperkube:v1.26.8-rancher1]: #选择 k8s 版本 +[+] Cluster domain [cluster.local]: #集群域 +[+] Service Cluster IP Range [10.43.0.0/16]: #服务集群IP范围 +[+] Enable PodSecurityPolicy [n]: #默认回车 +[+] Cluster Network CIDR [10.42.0.0/16]: #集群网络CIDR +[+] Cluster DNS Service IP [10.43.0.10]: #集群DNS服务IP +[+] Add addon manifest URLs or YAML files [no]: #默认回车 +``` + +基础参数修改 + +```bash +sed -i '/^ingress:$/,/^ provider:/ s/provider: ""/provider: "none"/' cluster.yml +``` + +### 方法二 + +1. 生成初始文件 + + ```bash + rke config --empty --name cluster.yml + ``` + +2. 按需要修改 address 参数 + + > 多节点则写多个 `address` 并通过调整 role 指定节点属性 + + ```yml + nodes: + - address: 192.168.1.10 + port: "22" + internal_address: 192.168.1.10 + role: + - controlplane #管理 + - worker #计算 + - etcd #etcd节点 + hostname_override: "" + user: docker + docker_socket: /var/run/docker.sock + ssh_key: "" + ssh_key_path: ~/.ssh/id_rsa + ssh_cert: "" + ssh_cert_path: "" + labels: {} + taints: [] + # 格式一样此处省略 20,30 节点配置 ... + services: + ... + ``` + +3. 基础参数修改 + + ```bash + sed -i 's/service_cluster_ip_range: ""/service_cluster_ip_range: 10.43.0.0\/16/' cluster.yml + sed -i 's/cluster_cidr: ""/cluster_cidr: 10.42.0.0\/16/' cluster.yml + sed -i 's/cluster_domain: ""/cluster_domain: cluster.local/' cluster.yml + sed -i 's/cluster_dns_server: ""/cluster_dns_server: 10.43.0.10/' cluster.yml + sed -i 's/plugin: ""/plugin: flannel/' cluster.yml + sed -i 's/strategy: ""/strategy: x509/' cluster.yml + sed -i 's/^\s*mode: ""$/ mode: rbac/' cluster.yml + sed -i '/^ingress:$/,/^ provider:/ s/provider: ""/provider: "none"/' cluster.yml + sed -i '/^[^ ]/ s/ssh_key_path: ""/ssh_key_path: ~\/.ssh\/id_rsa/g' cluster.yml + sed -i '0,/^\s*ssh_key_path: ""$/{s,^\s*ssh_key_path: ""$, ssh_key_path: ~/.ssh/id_rsa,}' cluster.yml + ``` + +## 初始化 Kubernetes 集群 + +```bash +rke up +``` + +> - 禁用 metrics-server 组件 +> +> ```bash +> sed -i '/^monitoring:$/,/^ provider:/ s/provider: ""/provider: "none"/' cluster.yml +> ``` +> +> - 调整节点端口范围 +> +> > 默认端口范围:30000-32767 +> +> ```bash +> sed -i 's/service_node_port_range: ""/service_node_port_range: "10000-30000"/' cluster.yml +> ``` +> +> - 关闭 Docker 版本检测 +> +> ```bash +> sed -i 's/ignore_docker_version: null/ignore_docker_version: true/' cluster.yml +> ``` +> +> - 调整部署版本 +> +> - 查看当前 RKE 支持的Kubernetes版本 +> +> ```bash +> rke config --list-version --all +> ``` +> +> - 替换版本 +> +> ```bash +> sed -i 's/kubernetes_version: ""/kubernetes_version: "v1.24.17-rancher1-1"/' cluster.yml +> ``` +> +> - 更新集群 +> +> ```bash +> rke up --update-only +> ``` + +## 安装 kubectl + +[Kubectl二进制文件](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/) + +1. 下载 kubectl + + ```bash + curl -LO https://dl.k8s.io/release/v1.26.8/bin/linux/amd64/kubectl + ``` + +2. 授权 + + ```bash + chmod 777 kubectl && mv kubectl /usr/local/bin/ + ``` + +3. 添加 kubctl 文件 + + ```bash + mkdir ~/.kube && cp kube_config_cluster.yml ~/.kube/config && chmod 600 ~/.kube/config + ``` + +4. 验证 + + ```bash + kubectl get node + ``` + + > 本文中没有禁用 `monitoring` 所以也可以使用 `kubectl top node` 测试 + +## 卸载 + +1. 卸载 RKE 集群 + + ```bash + rke remove + ``` + +2. 清理残余容器 + + ```bash + for i in $(docker ps -a | grep rancher | awk '{print $1}');do docker rm -f $i;done + for i in $(docker ps -a | grep rke | awk '{print $1}');do docker rm -f $i;done + ``` + +3. 清除 Docker 引擎的废弃资源和缓存 + + ```bash + docker system prune --all + ``` + +4. 卸载挂载 + + ```bash + mount | grep /var/lib/kubelet/pods/ | awk '{print $1}' | xargs umount -l + ``` + +5. 删除持久化目录 + + ```bash + rm -rf /var/lib/kubelet/ + rm -rf /run/flannel/ + ``` + +## 备份和恢复 + +> 非常重要,他奶奶的吃大亏了 + +### 创建一次性快照 + +> RKE 会将节点快照保存在 `/opt/rke/etcd-snapshots` 路径下 + +```bash +rke etcd snapshot-save --config cluster.yml --name <快照名称> +``` + +### 恢复集群 + +```bash +rke etcd snapshot-restore --config cluster.yml --name <快照名称> +``` + +## 恢复 Rke配置文件 + +> 准备依赖 `jq` +> +> - Centos +> +> ``` +> yum install jq -y +> ``` +> +> - Ubuntu +> +> ```bash +> apt install jq -y +> ``` + +- 恢复 Kubectl 配置文件 + + > 修改 `--master-ip=` 为任意 K8S Master节点IP + + ```bash + curl -sfL https://gitee.com/offends/Kubernetes/raw/main/File/Shell/restore-rkestate-kubeconfig.sh | bash -s -- --master-ip= + ``` + +- 恢复 rkestate 状态文件 + + - 通过本地 kubectl 找回 + + ```bash + kubectl get configmap -n kube-system full-cluster-state -o json | jq -r .data.\"full-cluster-state\" | jq -r . > cluster.rkestate + ``` + + - 通过 master 节点找回 + + ```bash + curl -sfL https://gitee.com/offends/Kubernetes/raw/main/File/Shell/restore-rkestate-config.sh | bash -s + ``` + + + + + diff --git a/部署文档/Rancher/Rke2单机快速部署Kubernetes.md b/部署文档/Rancher/Rke2单机快速部署Kubernetes.md new file mode 100644 index 0000000..ced327c --- /dev/null +++ b/部署文档/Rancher/Rke2单机快速部署Kubernetes.md @@ -0,0 +1,126 @@ +> 本文作者:丁辉 + +[Rke2文档](https://docs.rke2.io/) + +[Rancher中文文档](https://docs.rancher.cn/) + +# Rke2单机快速部署Kubernetes + +| 节点名称 | IP | Kubernetes角色 | +| :----------: | :----------: | :----------------------------------------: | +| k8s-master-1 | 192.168.1.10 | Controlplane,etcd,worker,keepalived-master | + +## 环境准备 + +> !!!每次部署都写挺麻烦的索性都放在一个文件内了请查看 [Kubernetes基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/Kubernetes%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.md) ,请按照此文档初始化环境 + +### 所有节点执行 + +1. 更改主机名 + + ```bash + hostnamectl set-hostname k8s-master-1 && bash + ``` + +3. 在三台节点上配置 NetworkManager + + - 配置 cali 和 flannel 的网卡不被 NetworkManager 管理 + + ```bash + mkdir -p /etc/NetworkManager/conf.d + ``` + + 内容如下 + + ```bash + cat < /etc/NetworkManager/conf.d/rke2-canal.conf + [keyfile] + unmanaged-devices=interface-name:cali*;interface-name:flannel* + EOF + ``` + + - 重启 NetworkManager + + ```bash + systemctl daemon-reload + systemctl restart NetworkManager + ``` + +### 开始部署 + +[Rke2-Github-releases](https://github.com/rancher/rke2/releases) + +1. 安装 RKE2 + + ```bash + curl -sfL https://get.rke2.io | sh - + ``` + + > - 使用国内源 + > + > ```bash + > curl -sfL http://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="server" sh - + > ``` + > + > - 指定版本 + > + > ```bash + > curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="server" INSTALL_RKE2_VERSION="v1.29.3+rke2r1" sh - + > ``` + +2. 开始部署主节点 + + ```bash + systemctl enable rke2-server.service + systemctl start rke2-server.service + ``` + + > 启动失败查看日志 + > + > ```bash + > rke2 server --config /etc/rancher/rke2/config.yaml --debug + > ``` + +3. 配置 RKE2 可执行文件加入到系统的 PATH 中 + + ```bash + echo "export PATH=$PATH:/var/lib/rancher/rke2/bin" >> /etc/profile && source /etc/profile + ``` + +4. 配置 config 文件 + + ```bash + mkdir ~/.kube && cp /etc/rancher/rke2/rke2.yaml ~/.kube/config + ``` + +5. 验证 + + ```bash + kubectl get node + ``` + +6. 配置 crictl 软链接 + + ```bash + ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml + ``` + +7. 验证 + + ```bash + crictl ps + ``` + +## 卸载节点 + +1. 停止 Rke2 + + ```bash + rke2-killall.sh + ``` + +2. 卸载 Rke2 + + ```bash + rke2-uninstall.sh + ``` \ No newline at end of file diff --git a/部署文档/Rancher/Rke2部署Kubernetes集群.md b/部署文档/Rancher/Rke2部署Kubernetes集群.md new file mode 100644 index 0000000..1cb2415 --- /dev/null +++ b/部署文档/Rancher/Rke2部署Kubernetes集群.md @@ -0,0 +1,476 @@ +> 本文作者:丁辉 + +[Rke2文档](https://docs.rke2.io/) + +[Rancher中文文档](https://docs.rancher.cn/) + +# Rke2部署Kubernetes集群 + +| 节点名称 | IP | Kubernetes角色 | +| :----------: | :----------: | :----------------------------------------: | +| k8s-master-1 | 192.168.1.10 | Controlplane,etcd,worker,keepalived-master | +| k8s-master-2 | 192.168.1.20 | Controlplane,etcd,worker,keepalived-backup | +| k8s-master-3 | 192.168.1.30 | controlplane,etcd,worker,keepalived-backup | +| k8s-worker-1 | 192.168.1.40 | worker | + +> Master节点VIP: 192.168.1.100 + +## 环境准备 + +> !!!每次部署都写挺麻烦的索性都放在一个文件内了请查看 [Kubernetes基础环境准备](https://gitee.com/offends/Kubernetes/blob/main/%E9%83%A8%E7%BD%B2%E6%96%87%E6%A1%A3/Kubernetes%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.md) ,请按照此文档初始化环境 + +### 所有节点执行 + +1. 更改主机名 + + - 192.168.1.10 + + ```bash + hostnamectl set-hostname k8s-master-1 && bash + ``` + + - 192.168.1.20 + + ```bash + hostnamectl set-hostname k8s-master-2 && bash + ``` + + - 192.168.1.30 + + ```bash + hostnamectl set-hostname k8s-master-3 && bash + ``` + + - 192.168.1.40 + + ```bash + hostnamectl set-hostname k8s-node-1 && bash + ``` + +2. 编辑 /etc/hosts 文件 + + ```bash + vi /etc/hosts + ``` + + 添加如下内容 + + ```bash + 192.168.1.10 k8s-master-1 + 192.168.1.20 k8s-master-2 + 192.168.1.30 k8s-master-3 + 192.168.1.40 k8s-node-1 + ``` + +3. 在三台节点上配置 NetworkManager + + - 配置 cali 和 flannel 的网卡不被 NetworkManager 管理 + + ```bash + mkdir -p /etc/NetworkManager/conf.d + ``` + + 内容如下 + + ```bash + cat < /etc/NetworkManager/conf.d/rke2-canal.conf + [keyfile] + unmanaged-devices=interface-name:cali*;interface-name:flannel* + EOF + ``` + + - 重启 NetworkManager + + ```bash + systemctl daemon-reload + systemctl restart NetworkManager + ``` + +### 安装主节点 + +[Rke2-Github-releases](https://github.com/rancher/rke2/releases) + +1. 安装 RKE2 + + ```bash + curl -sfL https://get.rke2.io | sh - + ``` + + > - 使用国内源 + > + > ```bash + > curl -sfL http://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="server" sh - + > ``` + > + > - 指定版本 + > + > ```bash + > curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="server" INSTALL_RKE2_VERSION="v1.29.3+rke2r1" sh - + > ``` + +2. 创建 RKE2 配置文件 + + [Server 配置参考](https://docs.rke2.io/zh/reference/server_config) + + [高级选项和配置](https://docs.rke2.io/zh/advanced) + + ```bash + mkdir -p /etc/rancher/rke2/ + vi /etc/rancher/rke2/config.yaml + ``` + + 内容如下 + + ```yaml + #server: "https://192.168.1.100:9345" # 全部 Master 启动后解除注释, 重启服务" + # 创建 token + token: rke2-create-token + # 负载均衡统一入口 IP 或 域名 + tls-san: + - "192.168.1.100" + + # 阿里镜像源加速, 通常由社区志愿者维护, 镜像同步通常存在滞后性 + #system-default-registry: "registry.cn-hangzhou.aliyuncs.com" + + # 节点 NAME + node-name: k8s-master-1 # 与当前主机名保持一致 + + # 节点污点, 禁止 master 节点运行容器 + node-taint: + - "CriticalAddonsOnly=true:NoExecute" + + disable: # 取消安装 Rke2 默认安装 Charts + - "rke2-ingress-nginx" + - "rke2-metrics-server" + + #### 网络配置 + # 指定网络模式, [ ipvs , iptables ] 默认是:iptables + kube-proxy-arg: + - "proxy-mode=iptables" + # Kubernetes 集群域名 + cluster-domain: "cluster.local" + # 指定要部署的 CNI(Container Network Interface)插件[ none , calico , flannel , canal , cilium ] 默认: canal + cni: "canal" + # 指定 Pod IP 的 IPv4/IPv6 网络 CIDR + cluster-cidr: "10.42.0.0/16" + # 指定 Service IP 的 IPv4/IPv6 网络 CIDR + service-cidr: "10.43.0.0/16" + # 指定用于具有 NodePort 访问权限的 Service 的端口范围 + service-node-port-range: "30000-32767" + + #### ETCD存储配置 + # 快照备份时间 + etcd-snapshot-schedule-cron: "0 */12 * * *" + # 快照文件保留个数 + etcd-snapshot-retention: "10" + # 快照存储目录, 默认位置 /var/lib/rancher/rke2/server/db/snapshots + etcd-snapshot-dir: "${data-dir}/db/snapshots" + + #### 存储目录配置 + # kube-config 文件位置 + write-kubeconfig: "/root/.kube/config" + # kube-config 文件权限 + write-kubeconfig-mode: "0644" + # Rke2文件存储目录 + data-dir: "/var/lib/rancher/rke2" + ``` + + > 其他参数配置 + > + > ```yaml + > # 自定义垃圾回收机制 + > kubelet-arg: + > # 设置硬性回收阈值,当节点的文件系统可用空间低于 10% 或内存可用空间低于 2048Mi 时,kubelet 将触发硬性回收,即强制驱逐 Pod 以释放资源 + > - "eviction-hard=nodefs.available<10%,memory.available<2048Mi" + > # 置软性回收的宽限期,当节点的文件系统可用空间或镜像文件系统可用空间低于一定阈值时,kubelet 将在触发硬性回收之前等待 30 秒 + > - "eviction-soft-grace-period=nodefs.available=30s,imagefs.available=30s" + > # 设置软性回收的阈值,当节点的文件系统可用空间低于 10% 或镜像文件系统可用空间低于 10% 时,kubelet 将触发软性回收,尝试释放资源 + > - "eviction-soft=nodefs.available<10%,imagefs.available<10%" + > + > kube-controller-manager-extra-env: + > # 设置 Kubernetes 集群签名证书的路径 + > - "cluster-signing-cert-file=/etc/kubernetes/ssl/kube-ca.pem" + > # 设置 Kubernetes 集群签名密钥的路径 + > - "cluster-signing-key-file=/etc/kubernetes/ssl/kube-ca-key.pem" + > + > kube-apiserver-extra-env: + > # apiserver启用metadata.selfLink 字段 + > - "feature-gates='RemoveSelfLink=false'" + > ``` + +3. 开始部署主节点 + + ```bash + systemctl enable rke2-server.service + systemctl start rke2-server.service + ``` + + > 启动失败查看日志 + > + > ```bash + > rke2 server --config /etc/rancher/rke2/config.yaml --debug + > ``` + +4. 配置 RKE2 可执行文件加入到系统的 PATH 中 + + ```bash + echo "export PATH=$PATH:/var/lib/rancher/rke2/bin" >> /etc/profile && source /etc/profile + ``` + +5. 验证 + + ```bash + kubectl get node + ``` + +6. 配置 crictl 软链接 + + ```bash + ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml + ``` + +7. 验证 + + ```bash + crictl ps + ``` + +10. 查看集群 Token + + ```bash + cat /var/lib/rancher/rke2/server/node-token + ``` + +## 添加管理节点[2,3节点同理] + +1. 安装 RKE2 + + ```bash + curl -sfL https://get.rke2.io | sh - + ``` + + > - 使用国内源 + > + > ```bash + > curl -sfL http://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="server" sh - + > ``` + > + > - 指定版本 + > + > ```bash + > curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="server" INSTALL_RKE2_CHANNEL=v1.20 sh - + > ``` + +2. 创建 RKE2 配置文件 + + ```bash + mkdir -p /etc/rancher/rke2/ + vi /etc/rancher/rke2/config.yaml + ``` + + 内容如下 + + ```yaml + # 指定要连接的集群服务器地址 + server: https://192.168.1.100:9345 + # Master 节点 token + token: #主节点获取的token值 + # 负载均衡统一入口 IP 或 域名 + tls-san: + - "192.168.1.100" + + # 阿里镜像源加速, 通常由社区志愿者维护, 镜像同步通常存在滞后性 + #system-default-registry: "registry.cn-hangzhou.aliyuncs.com" + + # 节点 NAME + node-name: k8s-master-2 # 与当前主机名保持一致 + + # 节点污点, 禁止 master 节点运行容器 + node-taint: + - "CriticalAddonsOnly=true:NoExecute" + + disable: # 取消安装 Rke2 默认安装 Charts + - "rke2-ingress-nginx" + - "rke2-metrics-server" + + #### 网络配置 + # 指定网络模式, [ ipvs , iptables ] 默认是:iptables + kube-proxy-arg: + - "proxy-mode=iptables" + # Kubernetes 集群域名 + cluster-domain: "cluster.local" + # 指定要部署的 CNI(Container Network Interface)插件[ none , calico , flannel , canal , cilium ] 默认: canal + cni: "canal" + # 指定 Pod IP 的 IPv4/IPv6 网络 CIDR + cluster-cidr: "10.42.0.0/16" + # 指定 Service IP 的 IPv4/IPv6 网络 CIDR + service-cidr: "10.43.0.0/16" + # 指定用于具有 NodePort 访问权限的 Service 的端口范围 + service-node-port-range: "30000-32767" + + #### ETCD存储配置 + # 快照备份时间 + etcd-snapshot-schedule-cron: "0 */12 * * *" + # 快照文件保留个数 + etcd-snapshot-retention: "10" + # 快照存储目录, 默认位置 /var/lib/rancher/rke2/server/db/snapshots + etcd-snapshot-dir: "${data-dir}/db/snapshots" + + #### 存储目录配置 + # kube-config 文件位置 + write-kubeconfig: "/root/.kube/config" + # kube-config 文件权限 + write-kubeconfig-mode: "0644" + # Rke2文件存储目录 + data-dir: "/var/lib/rancher/rke2" + ``` + +4. 启动 + + ```bash + systemctl enable rke2-server.service + systemctl start rke2-server.service + ``` + +## 添加计算节点 + +[Agent 配置参考](https://docs.rke2.io/zh/reference/linux_agent_config) + +1. 安装 RKE2 + + ```bash + curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh - + ``` + + > - 使用国内源 + > + > ```bash + > curl -sfL http://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="agent" sh - + > ``` + > + > - 指定版本 + > + > ```bash + > curl -sfL https://rancher-mirror.rancher.cn/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_CHANNEL=v1.20 sh - + > ``` + +2. 创建 RKE2 配置文件 + + ```bash + mkdir -p /etc/rancher/rke2/ + vi /etc/rancher/rke2/config.yaml + ``` + + 内容如下 + + ```yaml + # 指定要连接的集群服务器地址 + server: https://192.168.1.100:9345 + # Master 节点 token + token: #主节点获取的token值 + + # 节点 NAME + node-name: k8s-node-1 # 与当前主机名保持一致 + + # 阿里镜像源加速, 通常由社区志愿者维护, 镜像同步通常存在滞后性 + #system-default-registry: "registry.cn-hangzhou.aliyuncs.com" + + #### 网络配置 + # 指定网络模式, [ ipvs , iptables ] 默认是:iptables + kube-proxy-arg: + - "proxy-mode=iptables" + ``` + +3. 部署计算节点 + + ```bash + systemctl enable rke2-agent.service + systemctl start rke2-agent.service + ``` + +4. 计算节点添加角色标签 + + ```bash + kubectl label node ${node} node-role.kubernetes.io/worker=true --overwrite + ``` + +## 卸载节点 + +1. 删除 node 节点 + + ```bash + kubectl delete node ${node} + ``` + +2. 停止 Rke2 + + ```bash + rke2-killall.sh + ``` + +3. 卸载 Rke2 + + ```bash + rke2-uninstall.sh + ``` + +## RKE2高可用部署Kubernetes + +1. 编辑 Nginx 配置文件 + + ```bash + vi nginx.conf + ``` + + 内容如下 + + ```nginx + events { + worker_connections 1024; + } + stream { + upstream kube-apiserver { + server host1:6443 max_fails=3 fail_timeout=30s; + server host2:6443 max_fails=3 fail_timeout=30s; + server host3:6443 max_fails=3 fail_timeout=30s; + } + upstream rke2 { + server host1:9345 max_fails=3 fail_timeout=30s; + server host2:9345 max_fails=3 fail_timeout=30s; + server host3:9345 max_fails=3 fail_timeout=30s; + } + server { + listen 6443; + proxy_connect_timeout 2s; + proxy_timeout 900s; + proxy_pass kube-apiserver; + } + server { + listen 9345; + proxy_connect_timeout 2s; + proxy_timeout 900s; + proxy_pass rke2; + } + } + ``` + +2. 启动 Nginx + + ```bash + docker run -itd -p 9345:9345 -p 6443:6443 -v ~/nginx.conf:/etc/nginx/nginx.conf nginx + ``` + +3. 更改之前的 config.yaml + + ```bash + vi /etc/rancher/rke2/config.yaml + ``` + + 内容如下 + + ```bash + tls-san: + - xxx.xxx.xxx.xxx + ``` + + \ No newline at end of file diff --git a/部署文档/二进制/Kubernetes手动证书签发.md b/部署文档/二进制/Kubernetes手动证书签发.md new file mode 100644 index 0000000..84da316 --- /dev/null +++ b/部署文档/二进制/Kubernetes手动证书签发.md @@ -0,0 +1,294 @@ +> 本文作者:丁辉 + +# Kubernetes手动证书签发 + +## 环境准备 + +> 安装 CFSSL + +1. 创建证书目录 + + ```bash + mkdir /root/k8s + cd /root/k8s + ``` + +2. 下载 CFSSL 文件 + + [Github下载地址](https://github.com/cloudflare/cfssl/releases) + + ```bash + wget https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl_1.6.4_linux_amd64 + wget https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssljson_1.6.4_linux_amd64 + wget https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl-certinfo_1.6.4_linux_amd64 + ``` + +3. 授权并移动到可执行目录下 + + ```bash + chmod +x cfssl_*_linux_amd64 cfssljson_*_linux_amd64 cfssl-certinfo_*_linux_amd64 + mv cfssl_*_linux_amd64 /usr/local/bin/cfssl + mv cfssljson_*_linux_amd64 /usr/local/bin/cfssljson + mv cfssl-certinfo_*_linux_amd64 /usr/bin/cfssl-certinfo + ``` + +## 开始签发证书 + +1. 创建 CA 证书签名请求 + + ```bash + cat > ca-csr.json < ca-config.json < kubernetes-csr.json < admin-csr.json < kube-proxy-csr.json < kube-controller-manager-csr.json < kube-scheduler-csr.json < 本文作者:丁辉 + +# Calico网络插件安装 + +[Github官网](https://github.com/projectcalico/calico) [Github-Calico-Yaml文件](https://github.com/projectcalico/calico/blob/master/manifests/calico.yaml) + +1. 最新版下载 + + ```bash + wget https://docs.projectcalico.org/manifests/calico.yaml + ``` + +2. 部署 + + ```bash + kubectl apply -f calico.yaml + ``` + + diff --git a/部署文档/网络插件安装/Flannel网络插件安装.md b/部署文档/网络插件安装/Flannel网络插件安装.md new file mode 100644 index 0000000..98664c3 --- /dev/null +++ b/部署文档/网络插件安装/Flannel网络插件安装.md @@ -0,0 +1,45 @@ +> 本文作者:丁辉 + +# Flannel网络插件安装 + +[Github软件包下载](https://github.com/flannel-io/flannel/releases) [Github-Flannel-Yaml文件](https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml) + +## 开始部署 + +1. 最新版下载 + + ```bash + wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml + ``` + +2. 部署 + + ```bash + kubectl apply -f kube-flannel.yml + ``` + +## 其他参数配置(可选步骤) + +1. 编辑 Yaml 文件 + + ```bash + vi kube-flannel.yml + ``` + +2. 添加如下内容 + + ```bash + containers: + - args: + - --ip-masq + - --kube-subnet-mgr + - --iface=eth0 #此参数指定网卡 + ``` + +**参数解释** + +| 参数 | 解释 | +| :---------------: | :----------------------------------------------------------: | +| --ip-masq | 启用 IP masquerade 功能,允许从内部网络发送的数据包经过 NAT 转换,以伪装成外部网络的数据包,确保 Kubernetes Pod 可以与集群外部通信。 | +| --kube-subnet-mgr | 启用 Kubernetes 子网管理器,负责动态分配每个节点的 Pod CIDR(Pod的IP地址范围),以确保在整个集群中不会发生 IP 地址冲突。 | +| --iface=eth0 | 指定 flannel 使用的网络接口,这里设置为 eth0。flannel 将通过指定的网络接口与其他节点通信。您可能需要根据实际情况更改此参数以匹配正确的网络接口。 | diff --git a/镜像仓库/Harbor/README.md b/镜像仓库/Harbor/README.md new file mode 100644 index 0000000..1387618 --- /dev/null +++ b/镜像仓库/Harbor/README.md @@ -0,0 +1,8 @@ +* + +> 本文作者:丁辉 + +# Harbor + + + diff --git a/镜像仓库/Registry/Docker-Registry配置文件解释.md b/镜像仓库/Registry/Docker-Registry配置文件解释.md new file mode 100644 index 0000000..9535f43 --- /dev/null +++ b/镜像仓库/Registry/Docker-Registry配置文件解释.md @@ -0,0 +1,110 @@ +> 本文作者:丁辉 + +# Docker-Registry配置文件解释 + +[官网文档](https://docs.docker.com/registry/configuration/) + +## 基础配置 + +```yaml +version: 0.1 # 配置文件的版本号 + +log: # 日志相关配置 + fields: + service: registry # 指定日志服务的名称,这里是 registry + +storage: # 存储相关的配置 + cache: + blobdescriptor: inmemory # 配置 blob 描述符的缓存方式为内存中存储 + + filesystem: + rootdirectory: /var/lib/registry # 文件系统存储的根目录 + +http: # HTTP 服务相关配置 + addr: :5000 # 服务监听的地址和端口,这里是所有 IP 的 5000 端口 + headers: + X-Content-Type-Options: [nosniff] # HTTP 响应头配置,用于防止 MIME 类型嗅探 + +health: # 健康检查相关配置 + storagedriver: + enabled: true # 是否启用存储驱动的健康检查 + interval: 10s # 健康检查的间隔时间,这里设置为每10秒执行一次 + threshold: 3 # 健康检查失败的阈值,连续失败3次将认为是不健康状态 +``` + +## 高级配置 + +### 维护模块配置 + +```yaml +maintenance: + uploadpurging: + enabled: true # 启用或禁用上传清理。如果启用,Registry 会定期清理未完成的上传。 + age: 168h # 定义上传存在的最长时间。超过这个时间的上传将被清理。默认为一周。 + interval: 24h # 清理操作的执行间隔。默认每24小时执行一次。 + dryrun: false # 如果设置为 true,则清理操作只会记录哪些文件会被删除,而不实际删除文件。 + readonly: + enabled: false # 设置为 true 以将 Registry 置于只读模式。在进行维护或升级时,这可能很有用。 +``` + +### 管理重定向模块配置 + +```yaml +redirect: + disable: false # 设置为 true 可以禁用重定向功能。默认情况下,重定向是启用的。 + maxdepth: 5 # 设置重定向链的最大深度。这个参数可以帮助防止重定向循环或是太长的重定向链。 +``` + +### 控制镜像删除模块配置 + +```bash +delete: + enabled: true # 启用或禁用删除功能。如果设置为 true,则可以从 Registry 中删除镜像或标签。 + purge: true # 如果启用,删除镜像或标签时将自动清理与之相关的所有数据,如层和清单。 + purgeinterval: 24h # 自动清理操作的执行间隔。默认每24小时执行一次清理。 + dryrun: false # 如果设置为 true,则删除操作只会记录哪些文件会被删除,而不实际删除文件。 +``` + +### 存储类型模块配置 + +- 本地存储 + + ```yaml + storage: + filesystem: + rootdirectory: /var/lib/registry + ``` + +- 配置s3类型存储 + + ```yaml + storage: + s3: + accesskey: YOUR_MINIO_ACCESS_KEY #MinIO上设置的访问密钥ID + secretkey: YOUR_MINIO_SECRET_KEY #MinIO上设置的访问密钥 + region: local #MinIO存储桶所在的地域或区域 + regionendpoint: http://x.x.x.x:9000 #MinIO地址 + bucket: YOUR_MINIO_BUCKET_NAME #MinIO存储桶的名称 + encrypt: false #可选项,是否启用加密传输 + secure: true #可选项,是否使用 HTTPS 连接到 MinIO + v4auth: true #可选项,使用 MinIO v4 版本认证 + chunksize: 5242880 #可选项,分块上传时的块大小,单位为字节 + rootdirectory: / #默认存储路径 + ``` + +- 配置Docker Registry的存储后端为阿里云对象存储服务 (OSS) + + ```yaml + storage: + oss: + # 用于访问OSS服务的Access Key ID,是进行身份验证的一部分 + accesskeyid: + # 与Access Key ID 相对应的访问密钥,是进行身份验证的另一部分 + accesskeysecret: + # OSS存储桶所在的地域 + region: + # 用于存储Docker镜像的OSS存储桶的名称 + bucket: + ``` + + \ No newline at end of file diff --git a/镜像仓库/Registry/README.md b/镜像仓库/Registry/README.md new file mode 100644 index 0000000..d62dc36 --- /dev/null +++ b/镜像仓库/Registry/README.md @@ -0,0 +1,10 @@ +> 本文作者:丁辉 + +# Docker-Registry + +[官方文档](https://distribution.github.io/distribution/) + +> 相关文档地址 + +- [Helm部署Docker-Registry](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Docker-Registry.md) +- [Helm部署Docker-Registry-UI](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Docker-Registry-UI.md) diff --git a/镜像仓库/Registry/清理镜像仓库.md b/镜像仓库/Registry/清理镜像仓库.md new file mode 100644 index 0000000..0a8426b --- /dev/null +++ b/镜像仓库/Registry/清理镜像仓库.md @@ -0,0 +1,39 @@ +> 本文作者:丁辉 + +# 清理镜像仓库 + +1. 开启镜像删除功能, 修改镜像仓库容器添加变量 + + ```bash + spec: + env: + - name: REGISTRY_STORAGE_DELETE_ENABLED + value: "true" + ``` + +2. 查看镜像 + + ```bash + curl -u <用户>:<密码> http:///v2/_catalog + ``` + +3. 查看镜像标签 + + ```bash + curl -u <用户>:<密码> -X GET http:///v2//tags/list + ``` + +4. 删除 + + ```bash + curl -I -XGET --header "Accept:application/vnd.docker.distribution.manifest.v2+json" \ + -u <用户>:<密码> http:///v2//manifests/ + ``` + + 或 + + ```bash + curl -I -XDELETE -u <用户>:<密码> http:///v2//manifests/ + ``` + + diff --git a/问题记录/Flannel网络不通容器.md b/问题记录/Flannel网络不通容器.md new file mode 100644 index 0000000..0c7c2af --- /dev/null +++ b/问题记录/Flannel网络不通容器.md @@ -0,0 +1,35 @@ +> 本文作者:丁辉 + +# Flannel网络不通容器 + +## 一:缺失路由导致无法通讯 + +1. 查看路由 + + ```bash + route -n + ``` + +2. 添加路由 + + ```bash + route add -net 10.0.0.0 netmask 255.255.0.0 dev flannel0 + ``` + + > 添加路由后,需要重启 flannal 服务 + +**其他操作** + +> 主机处于192.168.10.0/24,而想访问192.168.20.0/24网的主机,可以这样配置路由。 + +- 添加默认网关 + + ```bash + route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.10.1 + ``` + +- 删除默认网关 + + ```bash + route del -net 192.168.20.0 netmask 255.255.255.0 + ``` \ No newline at end of file diff --git a/问题记录/Jumpserver-helm部署时遇到的问题.md b/问题记录/Jumpserver-helm部署时遇到的问题.md new file mode 100644 index 0000000..8940a04 --- /dev/null +++ b/问题记录/Jumpserver-helm部署时遇到的问题.md @@ -0,0 +1,63 @@ +> 本文作者:丁辉 + +# Jumpserver-helm部署时遇到的问题 + +[jumpserver官网地址](https://docs.jumpserver.org/zh/master/install/setup_by_fast/?h=labels) + +- 组件启动一直处于准备状态未启动 (原因是因为有一个 Svc 没有生成出来导致其他 Pod 无法连接) + + (这个问题有点久远了,当时写这份文档的时候没有截图报错哈哈) + + 1. 部署 service + + ```bash + vi jump-svc.yaml + ``` + + 内容如下 + + ```yaml + apiVersion: v1 + kind: Service + metadata: + name: jump-service + spec: + selector: + app.jumpserver.org/name: jms-web + ports: + - protocol: TCP + port: 80 + targetPort: 80 + nodePort: 30000 + type: NodePort + ``` + + 2. 部署 + + ```bash + kubectl apply -f jump-svc.yaml + ``` + +- Jumpsevrer-helm部署遇到解析未自动生成问题 + + 单独给pod添加域名解析 + + - 写法1 + + ```yaml + hostAliases: + - ip: 127.0.0.1 + hostnames: + - "$yuming" + ``` + + - 写法2 + + ```yaml + hostAliases: + - hostnames: + - $yuming + ip: 127.0.0.1 + ``` + + \ No newline at end of file diff --git a/问题记录/K3s使用Helm报错.md b/问题记录/K3s使用Helm报错.md new file mode 100644 index 0000000..b11d911 --- /dev/null +++ b/问题记录/K3s使用Helm报错.md @@ -0,0 +1,18 @@ +> 本文作者:丁辉 + +# K3s-Helm部署报错 + +报错内容为 + +```bash +Error: INSTALLATION FAILED: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp [::1]:8080: connect: connection refused +``` + +> 问题原因:本地没有 kube-config 导致 K3s 无法连接到 Kubernetes 集群引起的 + +执行命令解决 + +```bash +kubectl config view --raw > ~/.kube/config +``` + diff --git a/问题记录/Kubeadm安装K8s失败记录.md b/问题记录/Kubeadm安装K8s失败记录.md new file mode 100644 index 0000000..5f838d9 --- /dev/null +++ b/问题记录/Kubeadm安装K8s失败记录.md @@ -0,0 +1,81 @@ +> 本文作者:丁辉 + +# Kubeadm安装K8s失败记录 + +- 在我部署 k8s 的时候,最近会遇到 flannel 一直重启的情况(报错 pod cidr not assigne) + + ```bash + vim /etc/kubernetes/manifests/kube-controller-manager.yaml + ``` + + ```bash + - --allocate-node-cidrs=true + - --cluster-cidr=10.244.0.0/16 + ``` + + ```bash + systemctl restart kubelet + ``` + +- k8s-kubeadm单节点搭建导致主节点污点禁止pod运行 + + ```bash + #查看污点 + kubectl describe nodes master | grep -A 3 Taints + #删除 + kubectl taint nodes - + #一次删除多个 + kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master- + ``` + +- k8s-kubeadm-containerd搭建网络通讯问题 + + ```bash + vim /etc/kubernetes/manifests/kube-controller-manager.yaml + 增加参数: + + - --allocate-node-cidrs=true + - --cluster-cidr=10.244.0.0/16 + + systemctl restart kubelet + ``` + +- K8s "tab" 报错 + + ```bash + yum install bash-completion -y + source /usr/share/bash-completion/bash_completion + source <(kubectl completion bash) + ``` + +- 安装 K8s 失败,发现缺少一下模块 + + 1. 添加模块 + + ```bash + cat > /etc/sysconfig/modules/ipvs.modules < 本文作者:丁辉 + +# Kubernetes容器启动报打开的文件数过多 + +**failed to create fsnotify watcher: too many open files** + +> 系统中打开文件数目过多,导致无法创建更多的文件监视器 + +- 临时 + + ```bash + sysctl -w fs.inotify.max_user_instances=2099999999 + ``` + +- 永久 + + ```bash + echo "fs.inotify.max_user_instances = 2099999999" >> /etc/sysctl.conf + sysctl -p + ``` + +重启容器后恢复 + +> 清理慎用 +> +> ```bash +> lsof | awk '{print $2}' | sort | uniq -c | sort -n | awk '{if ($1 > threshold) print $2}' | xargs -I{} kill {} +> ``` + diff --git a/问题记录/Rke部署K8s报错.md b/问题记录/Rke部署K8s报错.md new file mode 100644 index 0000000..201bd36 --- /dev/null +++ b/问题记录/Rke部署K8s报错.md @@ -0,0 +1,78 @@ +> 本文作者:丁辉 + +# Rke部署K8s报错 + +- Rke 部署的时候报错:Failed to set up SSH tunneling for host + + > 解决办法 + + 1. 改动一下 SSH 参数 + + ```bash + vim /etc/ssh/sshd_config + ``` + + 2. 修改此参数 + + ```bash + AllowTcpForwarding yes + ``` + +- RKE部署 K8s 其中 Nginx-proxy 容器缺失配置文件 + + > 在初始化 RKE 的时候报错可能会是说检测失败 + + 问题原因是因为 Nginx-proxy arm 版 docker 镜像有问题,导致 Nginx 配置文件内容不正确,替换一下内容即可修复 + + 1. 编辑配置文件 + + ```bash + vi nginx.conf + ``` + + 内容如下 + + ```nginx + error_log stderr notice; + + worker_processes auto; + events { + multi_accept on; + use epoll; + worker_connections 1024; + } + + stream { + upstream kube_apiserver { + + server 10.206.16.12:6443; + + } + + server { + listen 6443; + proxy_pass kube_apiserver; + proxy_timeout 10m; + proxy_connect_timeout 2s; + + } + + } + ``` + + 2. 拷贝配置文件到容器内 + + ```bash + docker cp nginx.conf nginx-proxy:/etc/nginx/nginx.conf + ``` + + 3. 重启容器 + + ```bash + docker restart nginx-proxy + ``` + + + + + diff --git a/问题记录/本地无法访问Service网络.md b/问题记录/本地无法访问Service网络.md new file mode 100644 index 0000000..f9cfa34 --- /dev/null +++ b/问题记录/本地无法访问Service网络.md @@ -0,0 +1,72 @@ +> 本文作者:丁辉 + +# 本地无法访问Service网络 + +## 添加路由 + +> 引发问题场景: +> +> - 一主机多网卡情况下 +> - 缺失路由导致无法通讯或主机默认路由网段错误 + +| 主机网关 | 是否为 Kubernetes 使用网络 | +| :-----------: | :------------------------: | +| 192.168.1.100 | 是 | +| 192.168.2.100 | 否 | + +1. 查看默认路由 + + ```bash + ip route show default + ``` + + > 查看路由基础命令 + > + > - 查看路由 + > + > ```bash + > route -n + > ``` + > + > - 查看路由 + > + > ```bash + > ip route + > ``` + +2. 添加默认路由 + + ```bash + route add default gw 192.168.1.100 dev eth0 + ``` + + > 或使用 `ip route` 命令 + > + > ``` + > ip route add default via 192.168.1.100 dev eth0 + > ``` + +3. 刷新路由缓存 + + ```bash + ip route flush cache + ``` + +4. 添加路由后,需要重启 Kubernetes 网络插件 + +## 遇到问题 + +> 如果已存在默认路由呢? + +**删除默认路由** + +```bash +route del default gw 192.168.2.100 dev eth0 +``` + +或 + +```bash +ip route del default via 192.168.2.100 dev eth0 +``` +