[{"content":"万能安装 本文整理中。目标是梳理出一套覆盖 任意操作系统 / 任意架构 / 任意 K8s 版本 / 任意网络插件 的一键集群安装脚本。\n已沉淀的部分 kubeadm 部署 Kubernetes v1.14.9:镜像加速、yum 源、内核参数与集群初始化 → kubeadm 部署 Kubernetes v1.14.9 待补充的部分 发行版适配矩阵(CentOS / Ubuntu / Debian / openEuler) 容器运行时自动识别与安装(Containerd / Docker) 网络插件自动选择(Calico / Flannel / Cilium) 高可用架构(多 master、etcd 集群)与节点扩容 安装后的集群自检与常见问题排查 ","permalink":"https://qikang451.cn/kubernetes-install/","summary":"k8s万能安装","title":"kubernetes 万能安装"},{"content":"关闭 selinux # setenforce 0 # sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux # cat /etc/sysconfig/selinux 解压二进制文件 tar -xf docker-28.5.2.tgz cp docker/* /usr/bin/ 安装buildx [root@ip-172-20-60-110 docker-binary-install]# ll ~/.docker/cli-plugins/docker-buildx -rwxr-xr-x. 1 root root 68251832 May 27 11:28 /root/.docker/cli-plugins/docker-buildx [root@ip-172-20-60-110 docker-binary-install]# ll total 163280 -rwxr-xr-x. 1 root root 68251832 May 27 11:27 buildx-v0.29.1.linux-amd64 -rw-r--r--. 1 root root 253 May 27 11:17 containerd.service -rw-r--r--. 1 root root 434 May 27 11:06 daemon.json -rw-r--r--. 1 root root 81477327 May 27 10:52 docker-28.5.2.tgz -rw-r--r--. 1 root root 17450125 May 27 10:52 docker-rootless-extras-28.5.2.tgz -rw-r--r--. 1 root root 597 May 27 11:05 docker.service [root@ip-172-20-60-110 docker-binary-install]# [root@ip-172-20-60-110 docker-binary-install]# mv ~/.docker/cli-plugins/buildx ~/.docker/cli-plugins/docker-buildx [root@ip-172-20-60-110 docker-binary-install]# docker buildx version github.com/docker/buildx v0.29.1 a32761aeb3debd39be1eca514af3693af0db334b [root@ip-172-20-60-110 docker-binary-install]# 启用docker.service [root@ip-172-20-72-64 ~]# cat /etc/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service containerd.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd \\ --default-ulimit nofile=65536:65536 \\ --host=unix:///var/run/docker.sock \\ --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutStartSec=0 Restart=always RestartSec=2 LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target [root@ip-172-20-72-64 ~]# 设置/etc/docker/daemon.json [root@ip-172-20-72-64 ~]# cat /etc/docker/daemon.json { \u0026quot;insecure-registries\u0026quot;: [ \u0026quot;cloud.test.com\u0026quot;, \u0026quot;registry.local:5000\u0026quot; ], \u0026quot;log-driver\u0026quot;: \u0026quot;json-file\u0026quot;, \u0026quot;log-opts\u0026quot;: { \u0026quot;max-size\u0026quot;: \u0026quot;50m\u0026quot;, \u0026quot;max-file\u0026quot;: \u0026quot;3\u0026quot; }, \u0026quot;bip\u0026quot;: \u0026quot;172.150.0.1/16\u0026quot;, \u0026quot;default-address-pools\u0026quot;: [ { \u0026quot;base\u0026quot;: \u0026quot;172.100.0.0/16\u0026quot;, \u0026quot;size\u0026quot;: 24 }, { \u0026quot;base\u0026quot;: \u0026quot;172.120.0.0/16\u0026quot;, \u0026quot;size\u0026quot;: 24 } ], \u0026quot;experimental\u0026quot;: true, \u0026quot;exec-opts\u0026quot;: [\u0026quot;native.cgroupdriver=systemd\u0026quot;] } [root@ip-172-20-72-64 ~]# ","permalink":"https://qikang451.cn/openeuler-24.03-install-docker/","summary":"openEuler 24.03 LTS-SP2 上二进制安装 Docker 28.5.2、buildx 插件与 systemd 配置。","title":"openEuler 24.03 (LTS-SP2) 二进制安装docker"},{"content":"containerd 使用自建registry 信任自签名的https服务 直接修改 /etc/containerd/config.toml\n[root@master2 ~]# grep -C 10 registry.configs /etc/containerd/config.toml [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.cni] bin_dir = \u0026quot;/opt/cni/bin\u0026quot; conf_dir = \u0026quot;/etc/cni/net.d\u0026quot; max_conf_num = 1 conf_template = \u0026quot;\u0026quot; [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.mirrors] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.mirrors.\u0026quot;docker.io\u0026quot;] endpoint = [\u0026quot;https://registry-1.docker.io\u0026quot;] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.configs] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.mirrors.\u0026quot;cloud.internal.com\u0026quot;] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.configs.\u0026quot;cloud.internal.com\u0026quot;.tls] insecure_skip_verify = true [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.x509_key_pair_streaming] tls_cert_file = \u0026quot;\u0026quot; tls_key_file = \u0026quot;\u0026quot; [plugins.\u0026quot;io.containerd.internal.v1.opt\u0026quot;] path = \u0026quot;/opt/containerd\u0026quot; [plugins.\u0026quot;io.containerd.internal.v1.restart\u0026quot;] interval = \u0026quot;10s\u0026quot; [plugins.\u0026quot;io.containerd.metadata.v1.bolt\u0026quot;] content_sharing_policy = \u0026quot;shared\u0026quot; [root@master2 ~]# 1.6 以上的版本使用新方法 [root@master2 ~]# grep -C 10 '\\/etc\\/containerd\\/certs.d' /etc/containerd/config.toml runtime_type = \u0026quot;\u0026quot; sandbox_mode = \u0026quot;\u0026quot; snapshotter = \u0026quot;\u0026quot; [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.containerd.untrusted_workload_runtime.options] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.image_decryption] key_model = \u0026quot;node\u0026quot; [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry] config_path = \u0026quot;/etc/containerd/certs.d\u0026quot; [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.auths] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.configs] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.headers] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.registry.mirrors] [plugins.\u0026quot;io.containerd.grpc.v1.cri\u0026quot;.x509_key_pair_streaming] [root@master2 ~]# [root@master2 ~]# cd /etc/containerd/certs.d [root@master2 certs.d]# ls -al total 0 drwxr-xr-x 4 root root 57 Feb 11 10:09 . drwxr-xr-x 3 root root 40 Feb 11 10:20 .. drwxr-xr-x 2 root root 24 Feb 8 10:46 registry.local:5000 drwxr-xr-x 2 root root 24 Feb 11 10:36 cloud.internal.com [root@master2 certs.d]# tree . . ├── registry.local:5000 │ └── hosts.toml └── cloud.internal.com └── hosts.toml 2 directories, 2 files [root@master2 ~]# cat /etc/containerd/certs.d/registry.local\\:5000/hosts.toml server = \u0026quot;http://registry.local:5000\u0026quot; [host.\u0026quot;http://registry.local:5000\u0026quot;] capabilities = [\u0026quot;pull\u0026quot;, \u0026quot;resolve\u0026quot;, \u0026quot;push\u0026quot;] skip_verify = true [root@master2 ~]# cat /etc/containerd/certs.d/cloud.internal.com/hosts.toml server = \u0026quot;http://cloud.internal.com\u0026quot; [host.\u0026quot;http://cloud.internal.com\u0026quot;] capabilities = [\u0026quot;pull\u0026quot;, \u0026quot;resolve\u0026quot;, \u0026quot;push\u0026quot;] skip_verify = true [root@master2 ~]# ","permalink":"https://qikang451.cn/containerd-registry/","summary":"containerd 接入自建 Registry:配置自签 CA 信任、hosts 解析与镜像拉取认证。","title":"containerd - registry"},{"content":"一、官网参考地址 https://docs.docker.com/build/buildkit/configure/\nhttps://docs.docker.com/reference/cli/docker/buildx/\n二、buildx 交叉编译 Buildx 是基于 BuildKit 的 Docker 扩展插件项目。Buildx 默认使用 BuildKit 引擎进行构建，本质上调用了 Buildkit 的 API，镜像构建过程是在 Buildkit 的环境中进行的。\nBuildx 限制和应对：\nDocker 版本限制，使用 buildx 作为 docker CLI 插件需要使用 Docker 19.03 或更高的版本才能支持。旧版本的 Docker 也可以单独安装调用二进制文件作为插件，可以支持部分功能。对于 Docker 版本大于 19.03 的版本，可以直接调用 buildx 二进制来访问 docker buildx 子命令。\nLinux 内核版本限制，要求 Linux kernel \u003e= 4.8，因为自该 Linux 内核版本 binfmt_misc 才支持 fix-binary (F) flag。fix_binary 标志允许内核在容器或 chroot 内使用 binfmt_misc 注册的二进制格式处理程序，即使该处理程序二进制文件不是该容器或 chroot 内可见的文件系统的一部分。即可以支持编译打包不同架构平台的镜像。\n三、启用docker buildx 添加配置\nvim /etc/docker/daemon.json { \u0026quot;experimental\u0026quot;: true } 自签名的证书加载，两种方案。 本地有证书文件，buildkit 容器启动以后自动加载。 把自签名证书文件打到镜像里面，然后通过 buildkitd.toml 指定证书文件位置。 root@ip-172-20-60-86:~# ls -l /etc/docker/certs.d/cloud.test.com/ca.crt /usr/local/share/ca-certificates/cloud.test.com.crt /etc/buildkit/certs.d/cloud.test.com/ca.crt -rw------- 1 root root 2045 Sep 2 15:18 /etc/buildkit/certs.d/cloud.test.com/ca.crt # buildkit 官方要求的路径 -rw------- 1 root root 2045 Apr 16 13:49 /etc/docker/certs.d/cloud.test.com/ca.crt # docker 使用的，需要重启docker加载证书 -rw------- 1 root root 2045 Sep 2 15:16 /usr/local/share/ca-certificates/cloud.test.com.crt # OS系统使用的证书路径 root@ip-172-20-60-86:~# 对应的证书文件，要在指定的位置。\n# docker buildx create \\ --name builder \\ --buildkitd-config=/etc/buildkitd.toml \\ --driver docker-container \\ --use \\ --bootstrap \\ --driver-opt image=cloud.test.com/moby/buildkit:buildx-stable-1 \\ --platform linux/amd64,linux/arm64 # docker buildx create \\ --name=builder \\ --driver=docker-container \\ --use \\ --bootstrap \\ --driver-opt \u0026quot;env.BUILDKIT_STEP_LOG_MAX_SIZE=10485760\u0026quot; \\ --driver-opt image=cloud.test.com/moby/buildkit:buildx-stable-1 \\ --platform linux/amd64,linux/arm64 四、参考命令 开启内核支持特性，(可选)\ndocker run --privileged --rm tonistiigi/binfmt --install all 列出所有可用的构建器\ndocker buildx ls 查看构建器详情\ndocker buildx inspect builder-20250211 启动 builder-20250211 构建器\ndocker buildx inspect --bootstrap --builder builder-20250211 设置默认构建器\ndocker buildx use --default builder-20250211 构建 debug-tools 镜像\ndocker buildx build \\ --builder builder-20250211 \\ --platform linux/amd64,linux/arm64 \\ -t harbor.ctfo.com/znlk-edge/debug-network-tools:2024-03-19 \\ --push \\ -f tools/debug-tools/debug-ecu-tools/Dockerfile . 查看镜像 inspect\ndocker manifest inspect -v harbor.ctfo.com/znlk-edge/debug-network-tools:2024-03-19 创建 builder 实例\ndocker buildx create \\ --name=jenkins \\ --driver docker-container \\ --platform linux/amd64,linux/386,linux/riscv64,linux/arm/v7,linux/arm/v6,linux/s390x,linux/ppc64le,linux/arm64 docker buildx create \\ --name=jenkins \\ --driver=docker-container \\ --use \\ --bootstrap \\ --driver-opt \\ image=cloud.test.com/moby/buildkit:buildx-stable-1 \\ --platform linux/amd64,linux/arm64 查看构建器详情\ndocker buildx inspect jenkins 启动 mybuilder 构建器\ndocker buildx inspect --bootstrap --builder jenkins 设置默认构建器\ndocker buildx use --default jenkins ","permalink":"https://qikang451.cn/docker-buildx-multiarch/","summary":"使用 buildx 交叉编译构建多架构镜像,并推送到私有镜像仓库。","title":"docker buildx 多架构镜像"},{"content":"skopeo 下载镜像工具 skopeo version 1.20\n同步互联网镜像到znlkhub skopeo copy -a --insecure-policy --dest-tls-verify=false --src-tls-verify=false \\ docker://hub.zentao.net/app/zentao:21.7.5 \\ docker://harbor.internal.com/zentao/zentao:21.7.5 下载镜像,并打tag skopeo copy --override-arch arm64 --src-tls-verify=false \\ docker://harbor.internal.com/devops-public/tdengine:3.2.2.0 \\ docker-archive:harbor.internal.com_devops-public_tdengine_3.2.2.0.tar:harbor.internal.com/devops-public/tdengine:3.2.2.0 查看远程镜像 skopeo inspect --tls-verify=false docker://127.0.0.1:5000/devops-public/busybox:1.32 skopeo inspect --tls-verify=false docker://172.19.63.45:5000/devops-public/busybox:1.32 查看远程镜像支持的架构 skopeo inspect --raw docker://harbor.internal.com/devops-public/busybox:1.32 skopeo inspect --tls-verify=false --raw docker://172.19.63.45:5000/devops-public/busybox:1.32 | jq skopeo inspect --tls-verify=false --raw docker://127.0.0.1:5000/znlk-edge/app-manage:v1.3.0.0 | jq 下载远程镜像到本地镜像仓库 skopeo copy \\ docker://harbor.internal.com/devops-public/busybox:1.32 \\ docker://127.0.0.1:5000/devops-public/busybox:1.32 \\ --dest-tls-verify=false skopeo copy --insecure-policy --dest-tls-verify=false --src-tls-verify=false 下载离线镜像 HTTP_PROXY=http://192.168.56.1:7897/ \\ HTTPS_PROXY=http://192.168.56.1:7897/ \\ NO_PROXY=localhost,127.0.0.0/8,::1,172.20.0.0/16,harbor.internal.com \\ skopeo copy --override-arch arm64 --insecure-policy \\ docker://docker.io/library/nginx:1.25.3 \\ oci-archive:arm64.tar 下载离线镜像 HTTP_PROXY=http://192.168.56.1:7897/ \\ HTTPS_PROXY=http://192.168.56.1:7897/ \\ NO_PROXY=localhost,127.0.0.0/8,::1,172.20.0.0/16,harbor.internal.com \\ skopeo copy --override-arch amd64 --insecure-policy \\ docker://docker.io/library/nginx:1.25.3 \\ oci-archive:amd64.tar 上传 amd64 离线镜像 skopeo copy --insecure-policy \\ oci-archive:amd64.tar \\ docker://myregistry.local:5000/nginx:1.25.3-amd64 上传 arm64 离线镜像 skopeo copy --insecure-policy \\ oci-archive:arm64.tar \\ docker://myregistry.local:5000/nginx:1.25.3-arm64 创建一个空的 oci layout mkdir nginx-oci skopeo copy oci-archive:nginx-amd64.tar oci:nginx-oci:amd64 skopeo copy oci-archive:nginx-arm64.tar oci:nginx-oci:arm64 合并 skopeo copy --all oci:nginx-oci:latest docker://myregistry.local:5000/nginx:1.25.3 ","permalink":"https://qikang451.cn/skopeo-tools/","summary":"skopeo 镜像同步工具:跨仓库复制镜像、查看远程 manifest、多架构与离线镜像下载。","title":"skopeo 下载镜像工具"},{"content":"技术栈 专研 Kubernetes 与 DevOps 方向, 围绕容器编排、CI/CD 与可观测性排障。 容器与编排 Kubernetes 日常运维,Helm Chart 编写与版本化交付;Docker 作为镜像构建基线,Proxmox 提供底层虚拟化。 CI/CD 与制品 Jenkins 编排流水线,Harbor 托管镜像,Nexus 统一管理二进制制品,构建产物归档至 MinIO。 中间件与存储 MySQL / MariaDB / PostgreSQL 关系型存储;Redis 缓存层;Kafka 消息队列;NATS 轻量级消息系统;TDengine 应对时序场景。 可观测性与网关 Prometheus 指标 + ELK 日志双轨;Nginx 承担反向代理与流量入口;OnlyOffice 提供在线协作。 脚本与自动化 Python 封装 API、批处理与日常巡检,降低重复劳动。 云平台 熟悉 AWS、阿里云和华为云的资源编排与运维。\n","permalink":"https://qikang451.cn/about-me/","summary":"关于作者西康:Kubernetes / DevOps 方向的技术栈与关注领域。","title":"西康"},{"content":"https://dev.mysql.com/doc/refman/5.7/en/upgrade-binary-package.html\nMySQL root密码\n8点开始准备远程\n上传新版mysql文件\n热备份数据 [root@RJYF-U-314 local]# /usr/local/mysql/bin/mysqldump -hlocalhost -uroot -p123456 --all-databases \u0026gt; all-db.sql 把mysql innodb 的缓存数据写到磁盘，并停止服务。 [root@RJYF-U-314 local]# /usr/local/mysql/bin/mysql -u root -p --execute=\u0026quot;SET GLOBAL innodb_fast_shutdown=0\u0026quot; 停mysql服务 [root@RJYF-U-314 ~]# /usr/local/mysql/bin/mysqladmin -S /var/lib/mysql/mysql.sock -u root -p shutdown 备份mysql数据 [root@RJYF-U-314 ~]# cd /usr/local/ [root@RJYF-U-314 local]# mv mysql{,_upgrade_to_5.7.35_bak} [root@RJYF-U-314 local]# tar -xf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz [root@RJYF-U-314 local]# ln -sv mysql-5.7.35-linux-glibc2.12-x86_64 mysql [root@RJYF-U-314 local]# ll /etc/my.cnf* 迁移数据至新版本mysql [root@RJYF-U-314 local]# cp -r mysql_upgrade_to_5.7.35_bak/mysql-files/ mysql/ [root@RJYF-U-314 local]# chown -R mysql.mysql mysql/mysql-files 归档老数据 [root@RJYF-U-314 local]# tar -zcf mysql_upgrade_to_5.7.35_bak_2022-01-20.tar.gz mysql_upgrade_to_5.7.35_bak/ [root@RJYF-U-314 local]# rm -rf mysql_upgrade_to_5.7.35_bak/ 启动服务 [root@RJYF-U-314 local]# /etc/init.d/mysql.server start 升级表文件 [root@RJYF-U-314 local]# /usr/local/mysql/bin/mysql_upgrade -S /var/lib/mysql/mysql.sock -u root -p 重启MySQL服务 [root@RJYF-U-314 local]# /usr/local/mysql/bin/mysqladmin -S /var/lib/mysql/mysql.sock -u root -p shutdown [root@RJYF-U-314 local]# /etc/init.d/mysql.server start ","permalink":"https://qikang451.cn/mysql-upgrade/","summary":"MySQL 5.7.30 二进制升级到 5.7.35:热备、停服、数据迁移与表文件升级。","title":"MySQL 二进制 5.7.30 升级到 5.7.35"},{"content":"crictl 命令 清理无用的镜像 # crictl images | grep none | awk '{print $3} '| xargs crictl rmi 获取 pod的IP地址 crictl ps --name $p_name -o yaml | grep \u0026quot; podSandboxId: \u0026quot; | awk '{print $2}' crictl inspect $pod_id crictl 不支持导入和导出镜像 https://kubernetes.io/docs/tasks/debug/debug-cluster/crictl/\ncrictl 默认连接到 unix:///var/run/dockershim.sock # 通过设置参数 --runtime-endpoint 和 --image-endpoint # 通过设置环境变量 CONTAINER_RUNTIME_ENDPOINT 和 IMAGE_SERVICE_ENDPOINT # 通过在配置文件中设置端点 --config=/etc/crictl.yaml 你还可以在连接到服务器并启用或禁用调试时指定超时值,方法是在配置文件中指定 timeout 或 debug 值,或者使用 --timeout 和 --debug 命令行参数。\n要查看或编辑当前配置,请查看或编辑 /etc/crictl.yaml 的内容。\n# cat /etc/crictl.yaml runtime-endpoint: unix:///var/run/dockershim.sock image-endpoint: unix:///var/run/dockershim.sock timeout: 10 打印所有 Pod 的清单 # crictl pods 根据名称打印 Pod 清单 # crictl pods --name nginx-65899c769f-wv2gp 根据标签打印 Pod 清单 # crictl pods --label run=nginx 打印所有镜像清单 # crictl images 根据仓库打印镜像清单 # crictl images nginx 只打印镜像 ID # crictl images -q 打印所有容器清单 # crictl ps -a 打印正在运行的容器清单 # crictl ps 在正在运行的容器上执行命令 # crictl exec -i -t 1f73f2d81bf98 ls # crictl exec -i -t 1f73f2d81bf98 bash 获取容器的所有日志 # crictl logs 87d3992f84f74 获取最近的 N 行日志 # crictl logs --tail=10 87d3992f84f74 ","permalink":"https://qikang451.cn/containerd-crictl/","summary":"containerd 配套工具 crictl 使用笔记:镜像管理、Pod 与容器调试、日志与统计查询。","title":"containerd - crictl"},{"content":"ctr 命令 常用脚本 #!/bin/bash set -x images=\u0026quot; openyurt/yurthub:v0.6.1 \u0026quot; r_host=\u0026quot;docker.io\u0026quot; l_host=\u0026quot;[harbor.internal.com]\u0026quot; ctr=\u0026quot;ctr -n k8s.io\u0026quot; tags=\u0026quot; \u0026quot; for image in $images;do # download $ctr i rm $r_host/$image #$ctr i pull --all-platforms -u user:password $r_host/$image $ctr i pull --all-platforms -u user:password $r_host/$image # $ctr i rm $l_host/$image $ctr i tag $r_host/$image $l_host/devops-public/$image $ctr i push -u 'user:password' $l_host/devops-public/$image # tags=\u0026quot;$l_host/$image $tags\u0026quot; done # $ctr i export ctr-image.HuanBaoYuan.tar $tags #!/bin/bash # docker save nginx:1 \u0026gt; nginx.tar 必须是tar文件 images=\u0026quot; platform-test/platform-system:2.1.2.10 platform-test/platform-auth:2.1.2.2 platform-test/cloud-gateway:1.1.4 platform/system-front:1.1.5-sass \u0026quot; r_host=\u0026quot;[harbor.internal.com]\u0026quot; l_host=\u0026quot;10.229.94.176:5000\u0026quot; ctr=\u0026quot;ctr -n k8s.io\u0026quot; for image in $images;do $ctr i pull -u user:password $r_host/$image $ctr i tag $r_host/$image $l_host/$image $ctr i push $l_host/$image $ctr rmi $r_host/$image done 使用用户名和密码下载镜像 [root@RJYF-T-042 ~]# ctr -n k8s.io i pull -u user:password harbor.internal.com/platform-test/platform-system:2.1.2.10 创建并运行容器 [root@RJYF-T-042 ~]# ctr run --rm -t harbor.internal.com/busybox/busybox:latest test-name sh [root@RJYF-T-042 ~]# ctr run --rm -t harbor.internal.com/ubuntu/ubuntu:16.04 test-ubuntu bash 查看本地镜像 [root@RJYF-T-042 ~]# ctr i ls [root@RJYF-T-042 ~]# ctr i ls -q 拉取远程镜像到本地 [root@RJYF-T-042 ~]# ctr i pull docker.io/library/nginx:alpine [root@RJYF-T-042 ~]# ctr i pull --all-platforms docker.io/library/nginx:alpine [root@RJYF-T-042 ~]# ctr i pull --platform=arm64 docker.io/library/nginx:alpine [root@RJYF-T-042 ~]# ctr i pull --platform=linux/amd64 docker.io/library/nginx:alpine 检查镜像 [root@RJYF-T-042 ~]# ctr i check [root@RJYF-T-042 ~]# ctr i check -q 重新标记镜像tag [root@RJYF-T-042 ~]# ctr i tag docker.io/library/nginx:1.18 harbor.internal.com/nginx/nginx:1.18 删除镜像 [root@RJYF-T-042 ~]# ctr i rm docker.io/library/nginx:1.18 导出镜像。导出的是arm的镜像，那么只能在arm的机器上导入。 [root@RJYF-T-042 ~]# ctr i export --platform=linux/arm64 nginx_arm64_images.tar.gz docker.io/library/nginx:alpine # ARM [root@RJYF-T-042 ~]# ctr i export --platform=linux/amd64 nginx_amd64_images.tar.gz docker.io/library/nginx:alpine # AMD [root@RJYF-T-042 ~]# ctr i export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine # 当出现错误时，使用全平台下载 导入镜像 [root@RJYF-T-042 ~]# ctr i import nginx.tar.gz [root@RJYF-T-042 ~]# ctr i ls -q push 也要加 \u0026ndash;platform=linux/amd64\n清理无用镜像 crictl rmi \u0026ndash;prune [root@RJYF-T-042 ~]# ctr -n k8s.io i push --hosts-dir /etc/containerd/certs.d/ registry.local:5000/kubernetesui/dashboard:v2.7.0 查看名称空间 # ctr ns ls 在指定名称空间拉取镜像 # ctr -n k8s.io images pull docker.io/library/redis:latest 列举镜像 # ctr -n k8s.io i ls -q ","permalink":"https://qikang451.cn/containerd-ctr/","summary":"containerd 配套工具 ctr 使用笔记:命名空间管理、镜像导入导出、容器与任务操作。","title":"containerd - ctr"},{"content":"Docker CLI 和 crictl 的映射 通用命令映射 docker cli crictl 描述 不支持的功能 attach attach 连接到一个运行中的容器 \u0026ndash;detach-keys, \u0026ndash;sig-proxy exec exec 在运行中的容器里运行一个命令 \u0026ndash;privileged, \u0026ndash;user, \u0026ndash;detach-keys images images 列举镜像 info info 显示系统级的信息 inspect inspect, inspecti 返回容器、镜像或者任务的详细信息 logs logs 获取容器的日志 \u0026ndash;details ps ps 列举容器 stats stats 实时显示容器的资源使用统计信息 列:NET/BLOCK/ I/O, PIDs version version 显示运行时(Docker, ContainerD, 或者其他)的版本信息 容器生命周期映射 docker cli crictl 描述 不支持的功能 create create 创建一个新的容器 kill stop(timeout=0) 杀死一个或者多个正在运行的容器 \u0026ndash;signal pull pull 从镜像仓库拉取镜像或者代码仓库 \u0026ndash;all-tags, \u0026ndash;disable-content-trust rm rm 移除一个或者多个容器 rmi rmi 移除一个或者多个镜像 run run 在新的容器里运行一个命令 start start 启动一个或多个停止的容器 \u0026ndash;detach-keys stop stop 停止一个或多个正在运行的容器 update update 更新一个或者多个容器的配置 CRI 不支持 \u0026ndash;restart、\u0026ndash;blkio-weight 以及一些其他的资源限制选项 crictl 独有命令 crictl 描述 imagefsinfo 返回镜像的文件系统信息 inspectp 显示一个或多个Pod的状态 port-forward 转发本地端口到 Pod pods 列举pod runp 运行一个新的pod rmp 移除一个或者多个pod stopp 停止一个或者多个正在运行的pod docker cli / ctr / crictl 三方对照 功能 Docker CLI Containerd CLI Crictl CLI 镜像列举 docker images [ls] ctr image [ls/list] crictl images [ls] 导出镜像 docker save -o app.tar app:1.2.0 ctr image export app.tar weiyigeek.top/app:1.2.0 导入镜像 docker load -i app.tar ctr image import app.tar 拉取镜像 docker pull redis:latest ctr -n k8s.io images pull docker.io/library/redis:latest crictl pull redis:latest 上传镜像 docker push ctr -n k8s.io images push docker.io/library/redis:latest crictl push 更改标记 docker tag redis:latest weiyigeek.top/redis:latest ctr -n k8s.io images tag docker.io/library/redis:latest weiyigeek.top/redis:latest 删除镜像 docker rmi ctr -n k8s.io images rm docker.io/library/redis:latest crictl rmi 创建容器 docker create ctr -n k8s.io container create docker.io/library/redis:latest redis crictl create 创建并运行容器 docker run ctr run -d \u0026ndash;env name=WeiyiGeek application weiyigeek.top/app:1.2.0 查看容器 docker ps ctr -n k8s.io container list crictl ps 启动容器 docker start ctr -n k8s.io task start crictl start 停止容器 docker stop ctr -n k8s.io task pause crictl stop 删除容器 docker rm ctr -n k8s.io container rm crictl rm 容器详情 docker inspect 39d36ef08456 ctr -n k8s.io c info 39d36ef08456 crictl inspect 39d36ef08456 容器连接 docker attach ctr -n k8s.io task attach crictl attach 进入容器 docker exec ctr -n k8s.io task exec crictl exec stats(状态) docker top ctr -n k8s.io task metric 39d36ef08456 crictl stats 日志查看 docker logs \u0026ndash;tail 50 8db74c2bf7595 ctr -n k8s.io event crictl logs \u0026ndash;tail 50 8db74c2bf7595 ","permalink":"https://qikang451.cn/docker-cli-crictl/","summary":"docker CLI、ctr、crictl 三方命令映射对照,含各自不支持的功能说明。","title":"docker cli vs crictl"},{"content":"containerd - install 安装 containerd # wget https://github.com/containerd/containerd/releases/download/v1.5.2/cri-containerd-cni-1.5.2-linux-amd64.tar.gz 直接解压到系统的各个子目录 # tar -C / -xf cri-containerd-cni-1.5.2-linux-amd64.tar.gz 生成默认配置文件 # mkdir -pv /etc/containerd # containerd config default \u0026gt; /etc/containerd/config.toml 启动服务 # systemctl daemon-reload # systemctl status containerd # systemctl start containerd 设置环境变量 # echo \u0026quot;export PATH=$PATH:/usr/local/bin:/usr/local/sbin\u0026quot; | tee -a ~/.bashrc # source ~/.bashrc 测试ctr命令 # ctr version ","permalink":"https://qikang451.cn/containerd-install/","summary":"containerd 二进制安装部署:解压到系统目录、生成默认配置、systemd 服务管理与开机自启。","title":"containerd - install"},{"content":"下载软件包 wget https://github.com/goharbor/harbor/releases/download/v2.0.2/harbor-offline-installer-v2.0.2.tgz 生成自签名证书 自建CA\n生成CA私钥\n# openssl genrsa -out ca.key 4096 生成CA证书\n# openssl req -x509 -new -nodes -sha512 -days 3650 -subj \u0026quot;/C=CN/ST=Beijing/L=Beijing/O=cloud/OU=cloud/CN=test.com/CN=harbor.test.com/CN=*.test.com\u0026quot; -key ca.key -out ca.crt 创建 Server 证书 生成私钥\n# openssl genrsa -out harbor.test.com.key 4096 创建自签名文件\n# openssl req -sha512 -new \\ -subj \u0026quot;/C=CN/ST=Beijing/L=Beijing/O=cloud/OU=cloud/CN=harbor.test.com/CN=test.com/CN=*.test.com\u0026quot; \\ -key harbor.test.com.key \\ -out harbor.test.com.csr 创建 x509 v3延伸文件\n# cat \u0026gt; v3.ext \u0026lt;\u0026lt;-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names DNS.1=harbor.test.com DNS.2=test.com DNS.3=*.test.com EOF 使用 v3.ext 文件创建证书\n# openssl x509 -req -sha512 -days 3650 \\ -extfile v3.ext \\ -CA ca.crt -CAkey ca.key -CAcreateserial \\ -in harbor.test.com.csr \\ -out harbor.test.com.crt 安装docker 安装依赖软件\n# yum install -y yum-utils device-mapper-persistent-data lvm2 创建yum 源\n# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker-ce\n# yum -y install docker-ce 安装harbor - 解压文件 ```bash # tar -xf harbor-offline-installer-v2.0.2.tgz # mv harbor /usr/local/ ``` - 复制ssl证书 ```bash # cp ~/install_harbor/ssl/* /usr/local/harbor/ssl/ # cd /usr/local/harbor/ssl # chmod 600 harbor.test.com.crt harbor.test.com.key # chmod 600 ca.crt ca.key ``` 执行安装脚本\n# cd /usr/local/harbor/ # sudo ./install.sh --with-notary --with-clair --with-chartmuseum 创建开机启动脚本\n# vim /usr/lib/systemd/system/harbor.service [Unit] Description=Harbor Service After=network.target After=network-online.target After=docker.service Requires=network.target Requires=network-online.target Requires=docker.service [Service] Type=simple ExecStart=/usr/local/harbor/harbor_startup.sh start ExecStop=/usr/local/harbor/harbor_startup.sh stop RemainAfterExit=yes [Install] WantedBy=multi-user.target # systemctl daemon-loread # systemctl enable harbor 创建执⾏脚本\n# cat /usr/local/harbor/harbor_startup.sh #!/bin/sh cd /usr/local/harbor action=$1 if [[ $action = \u0026quot;start\u0026quot; ]];then docker-compose down -v docker-compose up -d elif [[ $action = \u0026quot;stop\u0026quot; ]];then docker-compose down -v fi # systemctl start harbor 更换 SSL 合法证书\n把证书⽂件拷贝到 /usr/local/harbor/ssl ls -l /usr/local/harbor/ssl/cloud.com.crt ls -l /usr/local/harbor/ssl/cloud.com.key ls -l /usr/local/harbor/ssl/gsrsaovsslca2018.crt # CA 根证书 修改配置⽂件\n设置证书文件 # vim /usr/local/harbor/harbor.yml # https related config https: # https port for harbor, default is 443 port: 443 # The path of cert and key files for nginx certificate: /usr/local/harbor/ssl/cloud.com.crt private_key: /usr/local/harbor/ssl/cloud.com.key 重新安装harbor\n# cd /usr/loca/harbor/ # sudo ./install.sh --with-notary --with-clair --with-chartmuseum # systemctl restart harbor ","permalink":"https://qikang451.cn/harbor-install/","summary":"Harbor 私有镜像仓库离线安装:证书生成、Docker 部署与 Harbor 初始化。","title":"harbor 安装"},{"content":"官方api文档 https://docs.docker.com/reference/api/registry/latest/\nDownload OpenAPI specification\nDocker - Registry 获取所有镜像列表，找到镜像的 name curl -s http://127.0.0.1:5000/v2/_catalog 获取镜像tag GET /v2//tags/list\ncurl -s http://127.0.0.1:5000/v2/\u0026lt;name\u0026gt;/tags/list | jq 获取manifest信息 GET /v2//manifests/\ncurl -s http://registry.local:5000/v2/flannel/flannel/manifests/v0.25.3 | jq 安装部署\n# docker run \\ -d \\ -p 5000:5000 \\ --restart always \\ --name registry \\ -v /data/registry-data:/var/lib/registry \\ registry:2 部署带SSL证书的registry\n创建目录 mkdir /data/docker.registry mkdir -p /data/docker.registry/etc/cert.d mkdir -p /data/docker.registry/var/lib/registry install crt 复制registry.crt文件和registry.key文件到/data/docker.registry/etc/cert.d下面 # cp registry.crt /data/docker.registry/etc/cert.d/registry.crt # cp registry.key /data/docker.registry/etc/cert.d/registry.key 创建服务 docker run -d \\ --name registry \\ -h registry \\ -p 5000:5000 \\ --memory 512m \\ --memory-swap -1 \\ --restart always \\ -v /data/docker.registry/etc/cert.d:/etc/cert.d \\ -v /data/docker.registry/var/lib/registry:/var/lib/registry \\ -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/cert.d/registry.crt \\ -e REGISTRY_HTTP_TLS_KEY=/etc/cert.d/registry.key \\ docker.io/registry systemd 部署 registry 服务 下载二进制 registry 二进制下载地址\nhttps://github.com/distribution/distribution/releases\n# chmod +x /usr/local/bin/registry 设置 registry.service /etc/systemd/system/registry.service\n[Unit] Description=registry - docker registry After=network-online.target Wants=network-online.target [Service] Type=simple Restart=always RestartSec=5 PIDFile=/var/run/registry.pid ExecStart=/usr/local/bin/registry serve /etc/docker/registry/config.yaml ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target 设置 config.yaml 文件 /etc/docker/registry/config.yaml\nversion: 0.1 loglevel: info http: addr: :5000 headers: Access-Control-Allow-Origin: ['*'] storage: delete: enabled: true filesystem: rootdirectory: /data/image_registry maxthreads: 500 ","permalink":"https://qikang451.cn/docker-registry/","summary":"Docker Registry 私有仓库:API 调用、镜像与 tag 管理、systemd 方式部署。","title":"Docker - Registry"},{"content":"gitlab高可用部署方案 两台 Gitlab Rails Server 作为 Praefect nodes 同时在线 NFS 共享储存 Redis 共享 PortgreSQL 共享DB OpenLDAP 提供统一认证 官方推荐多节点部署参考地址 https://docs.gitlab.com/omnibus/update/#multi-node--ha-deployment 多节点部署 https://docs.gitlab.com/ee/administration/high_availability/gitlab.html 高可用架构推荐 https://docs.gitlab.com/ee/administration/reference_architectures/ PG Server、Redis、NFS部署参考 推荐配置 预计支持 2000 左右用户 centos 7.8.2003 gitlab 13.1.4 postgresql 11 nfs v4 redis 5.0.9 ldap 2.4.44 Server Name CPU核心 内存 SSD 磁盘大小 节点数 Gitlab Rails Server 16 vCPU 32G \u0026gt;= 200G 2 NFS Server 4 vCPU 8G \u0026gt;= 1T 1 PostGreSQL Server 4 vCPU 8G \u0026gt;= 300G 1 Redis Server 2 vCPU 4G \u0026gt;= 200G 1 OpenLDAP Server 2 vCPU 4G \u0026gt;= 100G 1 Gitlab服务构成 |\u0026mdash;|\u0026mdash;| |gitlab-shell|用于处理Git命令和修改authorized keys列表| |gitlab-workhorse|轻量级的反向代理服务器| |logrotate|日志文件管理工具| |sidekiq|用于在后台执行队列任务（异步执行）| |postgresql|数据库| |redis|缓存数据库| |Nginx|前端web服务器| |NFS|文件共享存储|\n初始化服务器 IP地址规划 172.16.11.30 gitlab-1 172.16.11.31 gitlab-2 172.16.11.32 gitlab-db (nfs, postgresql, redis) 172.16.11.33 gitlab-nginx (OpenLDAP) disable firewalld selinux 配置yum源，安装初始软件 /etc/yum.repos.d/gitlab-ce.repo /etc/yum.repos.d/epel.repo /etc/yum.repos.d/CentOS-Base.repo 配置ldap的yum源 # yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm 部署 Rails Server 1 安装初始化软件 # yum install curl policycoreutils-python openssh-server openssh-clients postfix # sudo systemctl enable sshd # sudo systemctl start sshd # sudo systemctl enable postfix # sudo systemctl start postfix 安装gitlab-ce 下载软件包 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ # yum localinstall -y gitlab-ce-13.1.4-ce.0.el7.x86_64.rpm 添加 /etc/gitlab/gitlab.rb 配置文件 cp /etc/gitlab/gitlab.rb{,.bak} reset gitlab.rb 文件内容如下 [root@RJYF-GRS-01 ~]# egrep -v ^\u0026quot;$|#\u0026quot; /etc/gitlab/gitlab.rb external_url 'https://git.cloud.com' roles ['application_role'] gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['gitlab_default_can_create_group'] = false gitlab_rails['gitlab_username_changing_enabled'] = false gitlab_rails['ldap_enabled'] = true gitlab_rails['prevent_ldap_sign_in'] = false gitlab_rails['ldap_servers'] = YAML.load \u0026lt;\u0026lt;-'EOS' main: label: 'CLOUD-AD' host: 'CLOUD-AD01.CLOUD.local' port: 389 uid: 'sAMAccountName' bind_dn: 'CN=rjyf_svc,ou=CLOUD-User,OU=VMware-pool,DC=cloud,DC=local' password: 'CoDev$!2020' encryption: 'plain' verify_certificates: true smartcard_auth: false active_directory: true allow_username_or_email_login: true lowercase_usernames: false block_auto_created_users: false base: 'OU=集团,DC=cloud,DC=local' user_filter: '' attributes: username: ['cn'] email: ['mail'] name: 'displayName' first_name: 'name' last_name: 'sn' EOS gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = \u0026quot;/var/opt/gitlab/gitlab_backup_data/backups\u0026quot; gitlab_rails['backup_archive_permissions'] = 0644 gitlab_rails['backup_keep_time'] = 172800 gitlab_rails['shared_path'] = '/var/opt/gitlab/gitlab-rails/shared' high_availability['mountpoint'] = [\u0026quot;/var/opt/gitlab/git-data\u0026quot;, \u0026quot;/var/opt/gitlab/gitlab-rails/shared\u0026quot;] gitlab_rails['uploads_directory'] = \u0026quot;/var/opt/gitlab/gitlab-rails/uploads\u0026quot; gitlab_rails['db_adapter'] = \u0026quot;postgresql\u0026quot; gitlab_rails['db_encoding'] = \u0026quot;unicode\u0026quot; gitlab_rails['db_database'] = \u0026quot;gitlabhq_production\u0026quot; gitlab_rails['db_username'] = \u0026quot;gitlab\u0026quot; gitlab_rails['db_password'] = \u0026quot;git_lab_p2d\u0026quot; gitlab_rails['db_host'] = \u0026quot;172.20.60.10\u0026quot; gitlab_rails['db_port'] = 5432 gitlab_rails['redis_host'] = \u0026quot;172.20.60.11\u0026quot; gitlab_rails['redis_port'] = 6379 puma['enable'] = true puma['worker_timeout'] = 600 puma['worker_processes'] = 4 puma['min_threads'] = 8 puma['max_threads'] = 8 puma['per_worker_max_memory_mb'] = 850 gitlab_rails['env'] = { 'GITLAB_RAILS_RACK_TIMEOUT' =\u0026gt; 1200 } gitlab_shell['auth_file'] = \u0026quot;/var/opt/gitlab/.ssh/authorized_keys\u0026quot; postgresql['enable'] = false redis['enable'] = false nginx['enable'] = true nginx['redirect_http_to_https'] = true nginx['ssl_certificate'] = \u0026quot;/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com_integrated.crt\u0026quot; nginx['ssl_certificate_key'] = \u0026quot;/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com.key\u0026quot; nginx['listen_addresses'] = ['*', '[::]'] gitlab_ci['builds_directory'] = '/var/opt/gitlab/gitlab-ci/builds' [root@RJYF-GRS-01 ~]# 微软 AD 认证。不能首次登陆，需要修改密码。\n前期测试使用OpenLDAP，等微软AD部署好了，切换到AD。\n部署 OpenLDAP Server 参考地址：https://www.openldap.org/doc/\n证书的⽂件的位置 /etc/gitlab/ssl/server.crt /etc/gitlab/ssl/server-key.key\n启动gitlab服务 注意： 在启动gitlab服务之前，需要完成NFS、PostgresqlDB、Redis的服务器部署。 # touch/etc/gitlab/skip-auto-reconfigure # SKIP_POST_DEPLOYMENT_MIGRATIONS=truegitlab-ctlreconfigure # gitlab-rakegitlab:env:info # gitlab-rakegitlab:env:check # gitlab-rakegitlab:ldap:check # gitlab-ctlstart 部署 PostgreSQL Server 添加 pgsql yum 源 /etc/yum.repos.d/pgdg-redhat-all.repo\n# wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdgredhat-repo-latest.noarch.rpm # yum install -y pgdg-redhat-repo-latest.noarch.rpm # ls -l /etc/yum.repos.d/pgdg-redhat-all.repo 安装PostgreSQL 11 # yum install -y postgresql11-contrib postgresql11-server # systemctl enable postgresql-11 # systemctl start postgresql-11 初始化数据库 /usr/pgsql-11/bin/postgresql-11-setup initdb 创建用户 # sudo -u postgres createuser -P -s -e gitlab 连续两次输入 nil 作为密码 配置文件目录 # ls -l /var/lib/pgsql/11/data 添加授权 # vim /var/lib/pgsql/11/data/pg_hba.conf 在最后一行添加授权策略 host all all 0.0.0.0/0 md5 修改监听地址 # vim /var/lib/pgsql/11/data/postgresql.conf listen_addresses = '*' 重启pgsql 服务 # systemctl restart postgresql-11 部署 NFS Server 安装软件 # yum install -y nfs-utils 创建目录 # mkdir -pv /data/nfs; chmod 777 /data/nfs 添加配置文件 # vim /etc/exports /data/nfs 172.16.11.0/24(rw,sync,no_root_squash) 生效配置文件 # exportfs -arv # showmount -e # systemctl restart nfs # systemctl enable nfs 在nfs上创建目录 # mkdir -pv /data/nfs/gitlab/.ssh # mkdir -pv /data/nfs/gitlab/gitlab-rails/uploads # mkdir -pv /data/nfs/gitlab/gitlab-rails/shared # mkdir -pv /data/nfs/gitlab/gitlab-ci/builds # mkdir -pv /data/nfs/gitlab/git-data 在 gitlab-1 和 gitlab-2 上创建挂载目录 # mkdir -pv /var/opt/gitlab/.ssh # mkdir -pv /var/opt/gitlab/gitlab-rails/uploads # mkdir -pv /var/opt/gitlab/gitlab-rails/shared # mkdir -pv /var/opt/gitlab/gitlab-ci/builds # mkdir -pv /var/opt/gitlab/git-data nfs 挂载 在 gitlab-1 和 gitlab-2 上的 /etc/fstab 中添加 nfs 配置如下行\n10.1.0.1:/var/opt/gitlab/.ssh /var/opt/gitlab/.ssh nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2 10.1.0.1:/var/opt/gitlab/gitlab-rails/uploads /var/opt/gitlab/gitlab-rails/uploads nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2 10.1.0.1:/var/opt/gitlab/gitlab-rails/shared /var/opt/gitlab/gitlab-rails/shared nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2 10.1.0.1:/var/opt/gitlab/gitlab-ci/builds /var/opt/gitlab/gitlab-ci/builds nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2 10.1.0.1:/var/opt/gitlab/git-data /var/opt/gitlab/git-data nfs4 defaults,vers=4.1,hard,rsize=1048576,wsize=1048576,noatime,nofail,lookupcache=positive 0 2 mount -a 部署 Redis Server 下载 redis 源码包 wget http://download.redis.io/releases/redis-6.0.6.tar.gz 安装redis 解决环境依赖 # yum -y install gcc gcc-c++ kernel-devel 升级gcc # yum -y install centos-release-scl # yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils 永久⽣效 # echo \u0026quot;source /opt/rh/devtoolset-9/enable\u0026quot; \u0026gt;\u0026gt; /etc/profile 临时⽣效 # scl enable devtoolset-9 bash 验证版本 # gcc --version 解压源码⽂件 # tar -xf redis-6.0.6.tar.gz -C /usr/local 制作软连并部署⼆进制⽂件 # ln -sv redis-6.0.6/ redis # cp /usr/local/redis/src/redis-server /usr/local/bin/ # cp /usr/local/redis/src/redis-cli /usr/local/bin/ 创建 /etc/redis/redis.conf 配置⽂件 # mkdir /etc/redis # cp /usr/local/redis/redis.conf /etc/redis/ 创建 rdb ⽂件夹 # mkdir /var/lib/redis/ 设置 /etc/redis/redis.conf ⽂件 bind 0.0.0.0 daemonize yes dbfilename gitlab-dump.rdb dir /var/lib/redis/ 创建开机启动脚本 # vim /usr/lib/systemd/system/redis.service [Unit] Description=Redis Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=forking ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown [Install] WantedBy=multi-user.target 设置开机启动 # systemctl enable redis # systemc start redis 测试redis [root@RJYF-RS-01 ~]# redis-cli 127.0.0.1:6379\u0026gt; info ... 查看redis info信息 部署 Rails server 2 安装软件 # yum install gitlab-ce-13.1.4-ce.0.el7.x86_64.rpm 从gitlab-1 server上copy配置文件 # scp /etc/gitlab/gitlab.rb gitlab-2:/etc/gitlab/ # scp /etc/gitlab/gitlab-secrets.json gitlab-2:/etc/gitlab/ 第二台文件示例\n[root@RJYF-GRS-02 ~]# egrep -v ^\u0026quot;$|#\u0026quot; /etc/gitlab/gitlab.rb external_url 'https://git.cloud.com' roles ['application_role'] gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['gitlab_default_can_create_group'] = false gitlab_rails['gitlab_username_changing_enabled'] = false gitlab_rails['ldap_enabled'] = true gitlab_rails['prevent_ldap_sign_in'] = false gitlab_rails['ldap_servers'] = YAML.load \u0026lt;\u0026lt;-'EOS' main: label: 'CLOUD-AD' host: 'CLOUD-AD01.CLOUD.local' port: 389 uid: 'sAMAccountName' bind_dn: 'CN=rjyf_svc,ou=CLOUD-User,OU=VMware-pool,DC=cloud,DC=local' password: 'CoDev$!2020' encryption: 'plain' verify_certificates: true smartcard_auth: false active_directory: true allow_username_or_email_login: true lowercase_usernames: false block_auto_created_users: false base: 'OU=集团,DC=cloud,DC=local' user_filter: '' attributes: username: ['cn'] email: ['mail'] name: 'displayName' first_name: 'name' last_name: 'sn' EOS gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = \u0026quot;/var/opt/gitlab/gitlab_backup_data/backups\u0026quot; gitlab_rails['backup_archive_permissions'] = 0644 gitlab_rails['backup_keep_time'] = 172800 gitlab_rails['shared_path'] = '/var/opt/gitlab/gitlab-rails/shared' high_availability['mountpoint'] = [\u0026quot;/var/opt/gitlab/git-data\u0026quot;, \u0026quot;/var/opt/gitlab/gitlab-rails/shared\u0026quot;] gitlab_rails['uploads_directory'] = \u0026quot;/var/opt/gitlab/gitlab-rails/uploads\u0026quot; gitlab_rails['db_adapter'] = \u0026quot;postgresql\u0026quot; gitlab_rails['db_encoding'] = \u0026quot;unicode\u0026quot; gitlab_rails['db_database'] = \u0026quot;gitlabhq_production\u0026quot; gitlab_rails['db_username'] = \u0026quot;gitlab\u0026quot; gitlab_rails['db_password'] = \u0026quot;git_lab_p2d\u0026quot; gitlab_rails['db_host'] = \u0026quot;172.20.60.10\u0026quot; gitlab_rails['db_port'] = 5432 gitlab_rails['redis_host'] = \u0026quot;172.20.60.11\u0026quot; gitlab_rails['redis_port'] = 6379 puma['enable'] = true puma['worker_timeout'] = 600 puma['worker_processes'] = 4 puma['min_threads'] = 8 puma['max_threads'] = 8 puma['per_worker_max_memory_mb'] = 850 gitlab_rails['env'] = { 'GITLAB_RAILS_RACK_TIMEOUT' =\u0026gt; 1200 } gitlab_shell['auth_file'] = \u0026quot;/var/opt/gitlab/.ssh/authorized_keys\u0026quot; postgresql['enable'] = false redis['enable'] = false nginx['enable'] = true nginx['redirect_http_to_https'] = true nginx['ssl_certificate'] = \u0026quot;/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com_integrated.crt\u0026quot; nginx['ssl_certificate_key'] = \u0026quot;/etc/gitlab/ssl/_.cloud.com.ssl/STAR_cloud_com.key\u0026quot; nginx['listen_addresses'] = ['*', '[::]'] gitlab_ci['builds_directory'] = '/var/opt/gitlab/gitlab-ci/builds' [root@RJYF-GRS-02 ~]# 启动 gitlab 服务 # touch /etc/gitlab/skip-auto-reconfigure # SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-ctl reconfigure # gitlab-ctl start 至此两台master、redis、nfs、postgresql已经部署完成。\n配置前端代理使用haproxy https://docs.gitlab.com/ee/administration/high_availability/load_balancer.html # yum install haproxy 配置相同的sshd 秘钥 # scp /etc/ssh/ssh_host_* gitlab-2:/etc/ssh/ haproxy 配置文件 [root@RJYF-HP-01 ~]# cat /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode tcp log global option httplog option dontlognull option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 4000 # enable gitlab 80 frontend gitlab_http *:80 option tcplog default_backend backend_gitlab_http backend backend_gitlab_http balance source option tcp-check option httpchk GET /-/readiness?all=1 http-check expect status 200 default-server inter 5s fall 3 rise 2 server backend_gitlab_http_server1 172.20.60.7:80 check port 80 server backend_gitlab_http_server2 172.20.60.8:80 check port 80 # enable gitlab 443 frontend gitlab_https *:443 option tcplog default_backend backend_gitlab_https backend backend_gitlab_https balance source option httpchk GET /-/readiness?all=1 http-check expect status 200 default-server inter 5s fall 3 rise 2 server backend_gitlab_https_server1 172.20.60.7:443 check port 80 server backend_gitlab_https_server2 172.20.60.8:443 check port 80 # enable gitlab 22 frontend gitlab_ssh *:22 option tcplog default_backend backend_gitlab_ssh backend backend_gitlab_ssh balance source option tcp-check option httpchk GET /-/readiness?all=1 http-check expect status 200 default-server inter 5s fall 3 rise 2 server backend_gitlab_ssh_server1 172.20.60.7:22 check port 80 server backend_gitlab_ssh_server2 172.20.60.8:22 check port 80 [root@RJYF-HP-01 ~]# 信任自签名证书 # git config --global http.sslVerify false ","permalink":"https://qikang451.cn/gitlab-install/","summary":"GitLab 双主高可用部署方案:Praefect + NFS 共享存储 + Redis + PostgreSQL 集群。","title":"gitlab 双主模式高可用部署方案"},{"content":"官方文档 https://docs.docker.com/engine/reference/commandline/run/\n最佳实践 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/\n指令速查 FROM RUN CMD LABEL MAINTAINER ENV ADD COPY ENTRPOINT VOLUME USE WORKDIR 指令详解 FROM\nFROM ubuntu:14.04\nFROM指定构建镜像的基础源镜像，如果本地没有指定就会尝试下载。\nRUN\nRUN set -eux; echo '\u0026lt;h1\u0026gt;Hello, Docker!\u0026lt;/h1\u0026gt;' \u0026gt; /usr/share/nginx/html/index.html\n具体执行的命令/bin/sh -c echo '\u0026lt;h1\u0026gt;Hello, Docker!\u0026lt;/h1\u0026gt;' \u0026gt; /usr/share/nginx/html/index.html\nCMD\nCMD [\u0026quot;可执行文件\u0026quot;,\u0026quot;参数1\u0026quot;,\u0026quot;参数2\u0026quot;] (exec 格式, 推荐的格式)\nCMD command param1 param2 (shell 格式)\nCMD指令在Dockerfile中只能使用一次，如果有多个，则只有最后一个会生效。\nCMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令，则会覆盖掉CMD指定的命令。\nshell 格式 会始终调用一个 shell 进程， 成为 /bin/sh -c 的子命令， 可执行程序不能响应 Unix 信号。 exec 格式，推荐这种格式。使用这种模式时， 可以不需要 shell 进程。 让 Docker 应用的可执行程序成为容器的 PID 1 进程，可以接收 Unix 信号。比如执行 docker stop 时能够接收到 SIGTERM。 LABEL\nLABEL \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; \u0026lt;key\u0026gt;=\u0026lt;value\u0026gt; ...\n用于为镜像添加元数据，元数以键值对的形式指定\nMAINTAINER\nMAINTAINER Leslie Qi \u0026quot;qikang451@qq.com\u0026quot;\n指定创建镜像的用户\nEXPOSE\nEXPOSE 80\nEXPOSE 8080\n告诉 Docker 服务端容器对外映射的本地端口，需要在 docker run 的时候使用-p或者-P选项生效。\nENV\n只能设置一个变量: ENV \u0026lt;key\u0026gt; \u0026lt;value\u0026gt;\n允许一次设置多个变量: ENV \u0026lt;key1\u0026gt;=\u0026lt;value2\u0026gt; \u0026lt;key2\u0026gt;=\u0026lt;value2\u0026gt; ...\ndocker run -e \u0026ldquo;WEB_RORT=8080\u0026rdquo; 运行时设置环境变量。\nADD\nadds \u0026ldquo;test\u0026rdquo; to WORKDIR/: DD test relativeDir/\nadds \u0026ldquo;test\u0026rdquo; to /absoluteDir/: ADD test /absoluteDir/\nADD在复制源是压缩文件的时，可把解压后的文件复制至目标路径。\ndest路径是绝对路径，如果不存在，会自动创建对应目录 src的相对路径必须是 Dockerfile 所在路径的相对路径 src如果是一个目录，只会复制目录下的内容，而目录本身则不会被复制 COPY\nCOPY \u0026lt;src\u0026gt;... \u0026lt;dest\u0026gt;\n复制源可以文件或通配符，目标路径可以是容器的绝对路径，也可以是相对工作目录的相对路径。 使用copy指令，源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。ADD和COPY类似，但COPY不能使用远程文件 URLS ，复制文件推荐使用COPY。\ndest路径是绝对路径，如果不存在，会自动创建对应目录\nsrc的相对路径必须是 Dockerfile 所在路径的相对路径\nsrc如果是一个目录，只会复制目录下的内容，而目录本身则不会被复制\nENTRYPOINT\nENTRYPOINT [\u0026quot;executable\u0026quot;, \u0026quot;param1\u0026quot;, \u0026quot;param2\u0026quot;] (exec 格式, 推荐的格式)\nENTRYPOINT command param1 param2 (shell 格式)\nCMD 和 ENTRYPOINT 的区别：\n在 Dockerfile 中， 应该至少指定一个 CMD 或 ENTRYPOINT； shell 格式 会始终调用一个 shell 进程， 成为 /bin/sh -c 的子命令， 可执行程序不能响应 Unix 信号。 exec 格式，推荐这种格式。使用这种模式时， 可以不需要 shell 进程。 让 Docker 应用的可执行程序成为容器的 PID 1 进程，可以接收 Unix 信号。比如执行 docker stop 时能够接收到 SIGTERM。 将 Docker 当作可执行程序时， 应该使用 ENTRYPOINT 进行配置； CMD 可以用作 ENTRYPOINT 默认参数， 或者用作 Docker 的默认命令； CMD 可以被 docker run 传入的参数覆盖； docker run 传入的参数会附加到 ENTRYPOINT 之后， 前提是使用了 exec 格式 。 VOLUME\nVOLUME [\u0026quot;\u0026lt;路径1\u0026gt;\u0026quot;,\u0026quot;\u0026lt;路径2\u0026gt;\u0026quot;...]\n挂载宿主机目录到容器内\n在 docker run 时可以用 -v /mydata:/data 覆盖 Dockerfile 中的设置。\nUSER\nUSER \u0026lt;用户名：组名\u0026gt;\nUSER nginx:nginx\n指定运行容器时的用户名或 UID\nWORKDIR\nWORKDIR \u0026lt;工作目录路径\u0026gt;\nWORKDIR /path/to/workdir\nWORKDIR指令用来指定在docker run 时运行的目录，ENTRYPOINT 和 / 或 CMD指定的程序会在这个目录下执行。\ndocker run -w 可以覆盖WORKDIR。\n","permalink":"https://qikang451.cn/dockerfile/","summary":"Dockerfile 指令详解与镜像构建最佳实践。","title":"Docker - Dockerfile"},{"content":"官方文档： https://docs.docker.com/reference/cli/docker/container/run\n覆盖entrypoint $ docker run -d \\ --name python3 \\ --entrypoint tail /dev/null \\ python3 启动一个容器： $ docker run \\ -d \\ --name leslie \\ -h leslie \\ -p 9002:80 \\ --restart always \\ -v /var/www/html/leslie/:/var/www/html/ \\ --add-host 'chopedb test.abc.com':172.17.0.1 \\ nginx:latest 进入容器内： 运行一个临时容器，然后运行 /bin/bash $ docker run -it --rm redis /bin/sh 在一个已经存在的容器上运行/bin/bash $ docker exec -it leslie /bin/bash 常用选项 绑定容器的端口到宿主机 -P（大写），把Dockerfile中EXPOSE设置的暴露端口都映射到宿主机。 -P 8080:80，宿主机8080和容器80映射 设置容器的主机名 --hostname 或 -h 设置容器的主机名 设置运行的容器名字 --name leslie 获取一个终端tty -t tty Keep STDIN open even if not attached -i Keep STDIN open even if not attached 在后台运行容器 -d Run container in background and print container ID 退出时删除容器 --rm 在退出时删除容器，不能与-d同时使用。 修改容器内/etc/hosts --add-host chopedb:172.17.0.1 --add-host \u0026lsquo;api.leslie.chope.net.cn api.leslie.chope.cc\u0026rsquo;:127.0.0.1 设置环境变量 $ docker run --env VAR1=value1 --env VAR2=value2 ubuntu $ docker run -e \u0026quot;VAR1=value1\u0026quot; -e \u0026quot;VAR2=value2\u0026quot; ubuntu env | grep VAR $ VAR1=value1 $ VAR2=value2 ","permalink":"https://qikang451.cn/docker-run/","summary":"docker run 命令详解:entrypoint/cmd 覆盖、常用选项与容器生命周期操作。","title":"Docker - run"},{"content":"Clair - https://github.com/quay/clair\nAnchore - https://github.com/anchore/anchore-engine\nDagda - https://github.com/eliasgranderubio/dagda\n推荐使用 CoreOS Clair\nAWS ECR 使用这种开源的Scan Tools。\n不推荐 Anchore 安装 anchore engine https://docs.anchore.com/current/docs/engine/engine_installation/docker_compose/\n安装 anchore-cli https://docs.anchore.com/current/docs/installation/anchore_cli/\npython3 -m pip install --user --upgrade anchorecli 配置 anchore-cli 在家目录中设置此文件内容 $HOME/.anchore/credentials.yaml\ndefault: ANCHORE_CLI_USER: 'admin' ANCHORE_CLI_PASS: 'foobar' ANCHORE_CLI_URL: 'http://localhost:8228/v1' 测试 anchore-cli # anchore-cli system status # anchore-cli system feeds list https://docs.anchore.com/current/docs/using/cli_usage/images/\n删除 image 之前需要取消订阅 # anchore-cli subscription deactivate --help # anchore-cli subscription list # anchore-cli subscription deactivate vuln_update docker.io/qikang451/test_image_scan:php_7.2-fpm-buster_20200323.1 # anchore-cli subscription deactivate policy_eval docker.io/qikang451/test_image_scan:php_7.2-fpm-buster_20200323.1 # anchore-cli subscription deactivate tag_update docker.io/qikang451/test_image_scan:php_7.2-fpm-buster_20200323.1 # anchore-cli subscription deactivate analysis_update docker.io/qikang451/test_image_scan:php_7.2-fpm-buster_20200323.1 删除 image # anchore-cli image list # anchore-cli image del sha256:1282f6f53877c769a5deac2ae1bc24f4d1ecfb4155053ce1e869223a0660fe53 ","permalink":"https://qikang451.cn/docker-security/","summary":"Docker 镜像安全:Clair、Anchore、Dagda 漏洞扫描工具对比与 anchore-engine 实战。","title":"Docker - 安全漏洞"},{"content":"安装docker # yum remove -y docker docker-common docker-selinux docker-engine # yum install -y yum-utils device-mapper-persistent-data lvm2 # wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo # sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo # yum makecache fast # yum install docker-ce -y Install Docker Engine on Ubuntu\nDocker - 原理 docker 三大要素 cgroup namespace unionFS CGroup 全称是control group，用来限定一个进程的资源使用。由Linux 内核支持，可以限制和隔离Linux进程组所使用的物理资源。比如cpu、内存、磁盘、网络IO，是Linux container技术的物理基础。 NameSpace 是一个资源隔离技术，主要是用来隔离进程ID，IPC，Network等系统资源 linux 共有6种 namespace 类型： IPC: IPC(信号量、消息队列、共享内存等)隔离 Network: 网络设备、网络栈、端口等隔离 Mount: 文件系统挂载点隔离 PID: 进程编号隔离 User: 用户和用户组隔离 UTS: 主机和域名隔离 从linux内核4.6开始提供了第7种namespace: CGroup namespace主要用于cgroup根目录隔离 unionFS unionFS 可以把文件系统上多个目录内容联合挂载到同一个目录下，而目录的物理位置是分开的。解决了docker运行后的container挂载宿主机目录问题。 docker的网络模式 Driver Description bridge The default network driver. host Remove network isolation between the container and the Docker host. none Completely isolate a container from the host and other containers. overlay Swarm Overlay networks connect multiple Docker daemons together. ipvlan Connect containers to external VLANs. macvlan Containers appear as devices on the host\u0026rsquo;s network. https://docs.docker.com/engine/network/\ndocker 存储 docker system df root@ip-172-20-60-86:~# docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 17 10 3.648GB 507.3MB (13%) Containers 11 11 80.18MB 0B (0%) Local Volumes 2 1 18.88GB 263.9kB (0%) Build Cache 22 0 109.9MB 109.9MB root@ip-172-20-60-86:~# 安全清理无用的没有再用的 docker images docker system prune --all --force --volumes \u0026gt; /dev/null docker 启动参数 --storage-opt dm.basesize=20G # 表示限制单个容器最多占用 20G 空间，将应用于任何新建容器。 sudo dockerd --storage-opt dm.basesize=50G ubuntu 修改OS源 sed -i 's!archive.ubuntu.com!mirrors.tuna.tsinghua.edu.cn!g' /etc/apt/sources.list sed -i 's!security.ubuntu.com!mirrors.tuna.tsinghua.edu.cn!g' /etc/apt/sources.list root@ip-172-20-60-86:~# docker stats --no-stream image-tools-web CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 5fd1fc573072 image-tools-web 0.00% 7.598MiB / 31.34GiB 0.02% 64.8GB / 44.1GB 4.58GB / 120GB 11 root@ip-172-20-60-86:~# Docker event state docker - cp # docker create --name ae docker.io/anchore/enterprise:latest # docker cp ae:/docker-compose.yaml ~/aevolume/docker-compose.yaml docker - history docker history nginxphp:20191205.3 --no-trunc=true /etc/sysctl.conf 设置网络转发 # cat \u0026gt; /etc/sysctl.d/k8s.conf \u0026lt;\u0026lt; EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 fs.file-max= 65535 EOF # 生效 # sysctl --system 查看本地镜像inspect docker inspect registry.local:5000/k8s/etcd:3.5.12-0 crictl inspecti registry.local:5000/k8s/etcd:3.5.12-0 /etc/docker/daemon.json { \u0026quot;registry-mirrors\u0026quot;: [ \u0026quot;https://registry.docker-cn.com\u0026quot;, \u0026quot;https://mirror.ccs.tencentyun.com\u0026quot;, \u0026quot;http://hub-mirror.c.163.com\u0026quot;, \u0026quot;http://f1361db2.m.daocloud.io\u0026quot; ], \u0026quot;bip\u0026quot;: \u0026quot;172.150.0.1/16\u0026quot;, \u0026quot;default-address-pools\u0026quot;: [ { \u0026quot;base\u0026quot;: \u0026quot;172.100.0.0/16\u0026quot;, \u0026quot;size\u0026quot;: 24 }, { \u0026quot;base\u0026quot;: \u0026quot;172.120.0.0/16\u0026quot;, \u0026quot;size\u0026quot;: 24 } ], \u0026quot;experimental\u0026quot;: true, \u0026quot;log-driver\u0026quot;:\u0026quot;json-file\u0026quot;, \u0026quot;log-opts\u0026quot;: { \u0026quot;max-size\u0026quot;:\u0026quot;500m\u0026quot;, \u0026quot;max-file\u0026quot;:\u0026quot;3\u0026quot; }, \u0026quot;data-root\u0026quot;: \u0026quot;/data/docker_lib/data\u0026quot;, \u0026quot;insecure-registries\u0026quot;: [ \u0026quot;10.0.0.10:5000\u0026quot;, \u0026quot;registry.local:5000\u0026quot; ] } 根据磁盘映射id，找到容器id 通过 d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383，找到容器。也可能是镜像层\n[root@RJYF-Harbor-NZM-01 overlay2]# du -sh ./* | grep G 1.8G ./c6f249a33479f265cb56d2140e18765a8901cb2f1a8bc8b682510f472a960769 41G ./d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383 [root@RJYF-Harbor-NZM-01 overlay2]# pwd /var/lib/docker/overlay2 [root@RJYF-Harbor-NZM-01 overlay2]# docker ps -aq | xargs docker inspect --format '{{.Name}},{{.State.Pid}},{{.Id}},{{.GraphDriver.Data.WorkDir}}' | grep d3fcecf897724506067136a236f99f4f2626a271738fbc8289438e30634c3383 download-docker-images.sh #!/bin/bash set -x date=`date +%H_%M_%S` images=\u0026quot; platform-test/device-maintenance:dev-f5ced396 iot-device-maintenance/device-maintenance-front:v180-release \u0026quot; harbor=\u0026quot;harbor.test.com\u0026quot; tags=\u0026quot; \u0026quot; for image in $images;do docker rmi $harbor/$image docker pull --platform=arm64 $harbor/$image tags=\u0026quot;$harbor/$image $tags\u0026quot; done docker save $tags \u0026gt; tags_${date}.tar Run Postgres #!/bin/bash docker stop sonar-db docker rm sonar-db docker run -d \\ --name sonar-db \\ -e POSTGRES_USER=sonar-dbuser \\ -e POSTGRES_DB=sonar \\ -e POSTGRES_PASSWORD=password \\ -e PGDATA=/var/lib/postgresql/data/pgdata \\ -v /data/pgsql:/var/lib/postgresql/data \\ -p 5432:5432 \\ --restart always \\ registry.local:5000/postgres/postgres:10 Run MySQL #!/bin/bash docker stop con-db docker rm con-db docker run -d \\ --name con-db \\ -v /data/mysql:/var/lib/mysql \\ -p 3306:3306 \\ --restart always \\ -e MYSQL_ROOT_PASSWORD=my-secret-pw \\ -e MYSQL_USER=root \\ -e MYSQL_PASSWORD=root \\ -e MYSQL_DATABASE=con \\ registry.local:5000/mysql/mysql:5.7.30 dnsmasq 创建自定义dns server https://hub.docker.com/r/dockurr/dnsmasq\n常用命令 强制删除容器 # docker rm -f leslie # 查看镜像ID和镜像地址 docker images --format \u0026quot;table {{.ID}}\\t{{.Repository}}:{{.Tag}}\u0026quot; # 查看镜像地址 docker images --format \u0026quot;table {{.Repository}}:{{.Tag}}\u0026quot; # 查看容器的name和镜像地址 docker ps -a --format=\u0026quot;{{.Names}}\\t{{.Image}}\u0026quot; # 查看exited状态容器 docker ps -a -f \u0026quot;status=exited\u0026quot; --format={{.Names}} # 查看running状态容器 docker ps -a -f \u0026quot;status=running\u0026quot; --format={{.Names}} # 给用户添加docker权限 usermod -a -G docker ec2-user ubuntu：/etc/default/docker centos： /etc/sysconfig/docker # 查看正在运行容器 docker ps # 查看所有的容器，包括正在运行和停止的。 docker ps -a # 查看最后两个进程 docker ps -n 2 # 获取所有容器ID docker ps -a -q # 查看端口映射 docker ps -l # 只查看所有docker的name docker ps -a --format={{.Names}} # docker inspect # 获取容器的运行状态 docker inspect -f='{{.State.Running}}' deamon_dave # 获取运行中容器的PID docker inspect -f='{{.State.Pid}}' daemon_dave # ubuntu 后面可以加多个容器标识符 docker inspect -f='{{.State.Running}}' daemon_dave # redis 查看redis容器的IP地址 docker inspect -f='{{.NetworkSettings.IPAddress}}' redis # docker rm # 删除webserver这个容器。前提是这个容器处于停止状态。 docker rm webserver # 启动 docker start webserver # 停止 # stop 是向容器发送SIGKILL信号 docker stop webserver # docker attach # 只有在容器运行，并且有可用shell的时候。才可以再次附着到已经运行的容器。 docker attach ubuntu docker attach f1694d43a1b6 # docker logs # 查看容器运行日志 docker logs deamon_dave # 类似于tail -f实时监控deamon_dave的日志。-t为每条日志加上时间戳。 docker logs -ft deamon_dave # 获取最后10行日志 docker logs --tail 10 deamon_dave # 从最后一行日志开始监控 docker logs --tail 0 -f deamon_dave # docker top # 查看容器资源占用。 docker top deamon_dave # docker exec # 在容器内部运行进程 docker exec -d ubuntu touch /etc/new_file docker exec -t -i ubuntu /bin/bash # docker rm # 删除不在运行的容器 docker port # 查看容器的端口映射 # 容器内部的80/tcp端口映射到宿主机的32768随机端口上了。 docker port static_web 80/tcp -\u0026gt; 0.0.0.0:32768 # 获取docker的pid qikang@LeslieTest:~$ docker inspect --format \u0026quot;{{ .State.Pid }}\u0026quot; NginxWebServer 30300 qikang@LeslieTest:~$ sudo nsenter --target 30717 --mount --uts --ipc --net --pid root@e064c3b163c5:/# # 查看所有容器的CONTAINER ID qikang@LeslieTest:~$ docker ps -a -q # 查看所有容器的名字 docker ps -a --format={{.Names}} # 删除exited状态的容器 docker rm $(docker ps -f \u0026quot;status=exited\u0026quot; --format={{.Names}}) # docker images 加速 # vim /etc/docker/daemon.json {\u0026quot;registry-mirrors\u0026quot;: [\u0026quot;https://registry.docker-cn.com\u0026quot;]} # 镜像的导入导出 # 导出镜像 docker save php:5.6.25-apache | gzip \u0026gt; docker_php5.6.25_apache.tar.gz # 导入镜像 docker load -i docker_php5.6.25_apache.tar.gz ","permalink":"https://qikang451.cn/docker/","summary":"Docker 核心原理与实践:安装卸载、镜像容器管理、CGroup/NameSpace 隔离与网络存储。","title":"Docker - 原理"},{"content":" 获取谷歌镜像 # kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.3 # dockers aliyun images url： https://k851mren.mirror.aliyuncs.com/ # cat \u0026gt; /etc/docker/daemon.json \u0026lt;\u0026lt;EOF { \u0026quot;registry-mirrors\u0026quot;: [ \u0026quot;https://k851mren.mirror.aliyuncs.com/\u0026quot; ] } EOF https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 关闭防火墙\niptables -F \u0026amp;\u0026amp; iptables -t nat -F \u0026amp;\u0026amp; iptables -t mangle -F \u0026amp;\u0026amp; iptables -X\n准备阶段 节点间时间同步 关闭selinux 关闭防火墙 设置/etc/hosts手动解析 设置yum源 从阿里云安装 base、epel、docker、kubernetes https://opsx.alibaba.com/mirror # yum install -y kubelet kubeadm kubectl docker # yum install -y kubelet-1.14.8 kubeadm-1.14.8 kubectl-1.14.8 # yum install -y kubelet-1.16.9 kubeadm-1.16.9 kubectl-1.16.9 # systemctl enable kubelet \u0026amp;\u0026amp; systemctl start kubelet 确保以下参数值为1 # rm -rf /etc/sysctl.d/k8s.conf # cat \u0026gt; /etc/sysctl.d/k8s.conf \u0026lt;\u0026lt;EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness=0 EOF # sysctl --system 4. 在kernel中需要打开ipvs模块 /etc/sysconfig/kubelet KUBE_PROXY_MODE=ipvs - 加载 ip_vs 模块 - ip_vs - ip_vs_rr - ip_vs_wrr - ip_vs_rrip_vs_wrr \\ - ip_vs_lblc \\ - ip_vs_lblcr \\ - ip_vs_dh \\ - ip_vs_sh \\ - ip_vs_fo \\ - ip_vs_nq \\ - ip_vs_sedip_vs_ftp \\ - nf_conntrack \\ - nf_conntrack_ipv4 \\ 5. 在kublet中禁用swap 1. /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=\u0026quot;--fail-swap-on=false\u0026quot; 2. swapoff -a 3. 在 /etc/fstab 中关闭swap 4. Enable cgroup driver /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf Environment=\u0026ldquo;KUBELET_CGROUP_ARGS=\u0026ndash;cgroup-driver=systemd\u0026rdquo; cat \u0026gt; /etc/docker/daemon.json \u0026laquo;EOF { \u0026ldquo;registry-mirrors\u0026rdquo;: [ \u0026ldquo;https://hub-mirror.c.163.com\u0026rdquo;, \u0026ldquo;http://hub-mirror.c.163.com\u0026rdquo;, \u0026ldquo;http://docker.mirrors.ustc.edu.cn\u0026rdquo;, \u0026ldquo;https://dockerhub.azk8s.cn\u0026rdquo; ], \u0026ldquo;insecure-registries\u0026rdquo;: [\u0026ldquo;harbor.ctfo.com:80\u0026rdquo;], \u0026ldquo;exec-opts\u0026rdquo;: [\u0026ldquo;native.cgroupdriver=systemd\u0026rdquo;], \u0026ldquo;log-driver\u0026rdquo;: \u0026ldquo;json-file\u0026rdquo;, \u0026ldquo;log-opts\u0026rdquo;: { \u0026ldquo;max-size\u0026rdquo;: \u0026ldquo;100m\u0026rdquo; }, \u0026ldquo;storage-driver\u0026rdquo;: \u0026ldquo;overlay2\u0026rdquo;, \u0026ldquo;storage-opts\u0026rdquo;: [ \u0026ldquo;overlay2.override_kernel_check=true\u0026rdquo; ] } EOF\n一颗CPU \u0026ndash;ignore-preflight-errors=NumCPU\n初始化kubeadm\nkubeadm init \u0026ndash;pod-network-cidr=10.244.0.0/16 \u0026ndash;service-cidr=10.96.0.0/12 \u0026ndash;ignore-preflight-errors=all kubeadm init \u0026ndash;pod-network-cidr=10.244.0.0/16 \u0026ndash;service-cidr=10.96.0.0/12 \u0026ndash;ignore-preflight-errors=Swap \u0026ndash;ignore-preflight-errors=NumCPU pod网络是 10.244.0.0/16 service网络是 10.96.0.0/12 node 网络是 192.168.1.0/24，其实就是虚机自身的网络。 下图是网络模型，与当前部署的网络不同。 提前下载镜像 kubeadm config images list\nYour Kubernetes control-plane has initialized successfully! 在master上执行，创建root初始化目录 [root@master ~]# mkdir -p $HOME/.kube [root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config\n在master节点上安装flannel https://github.com/coreos/flannel kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml\nwget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml\ninstall calico 网络插件 kubectl apply -f https://raw.githubusercontent.com/luckylucky421/kubernetes1.17.3/master/calico.yaml\ninstall node1 software\nyum install -y docker-ce kubelet kubeadm 把所有docker images也下载上 关闭swap 相关命令 kubectl describe pod kube-flannel-ds-amd64-47jl8 \u0026ndash;namespace=kube-system kubectl get all \u0026ndash;all-namespaces kubectl get nodes kubectl get ns kubectl get cs kubectl get componentstatus\nkubeadm 在master、nodes节点上安装：kubelet、kubeadm、docker master：初始化集群 kubeadm init nodes：加入master集群 kubeadm join 备注： docker加速\nhttps://www.daocloud.io/mirror curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1461db2.m.daocloud.io https://dashboard.daocloud.io/orgs/qikang/packages/explore qikang qk3322451 systemctl daemon-reload https://blog.51cto.com/ghbsunny/2162205 设置docker的代理网址 [root@master ~]# vim /usr/lib/systemd/system/docker.service [root@master ~]# grep -i env /usr/lib/systemd/system/docker.service Environment=\u0026ldquo;HTTPS_PROXY=http://www.ik8s.io:10080\u0026rdquo; Environment=\u0026ldquo;HTTP_PROXY=http://www.ik8s.io:10080\u0026rdquo; Environment=\u0026ldquo;NO_PROXY=127.0.0.0/8,172.20.0.0/16\u0026rdquo;\nkube-apiserver:v1.14.1 kube-controller-manager:v1.14.1 kube-scheduler:v1.14.1 kube-proxy:v1.14.1 pause:3.1 etcd:3.3.10 coredns:1.3.1\n设置docker [root@node1 ~]# cat /etc/docker/daemon.json {\u0026ldquo;registry-mirrors\u0026rdquo;: [\u0026ldquo;http://f1361db2.m.daocloud.io\u0026rdquo;]} [root@node1 ~]# grep -i env /usr/lib/systemd/system/docker.service Environment=\u0026ldquo;NO_PROXY=127.0.0.0/8,172.20.0.0/16\u0026rdquo; systemctl enable docker systemctl enable kubelet\n下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.14.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.14.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.2\ndocker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.14.2 k8s.gcr.io/kube-controller-manager:v1.14.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.14.2 k8s.gcr.io/kube-scheduler:v1.14.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.2 k8s.gcr.io/kube-apiserver:v1.14.2 下载镜像脚本 for i in kubeadm config images list; do imageName=${i#k8s.gcr.io/} echo $imageName docker pull registry.aliyuncs.com/google_containers/$imageName docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.aliyuncs.com/google_containers/$imageName done;\n","permalink":"https://qikang451.cn/kubernetes-install-1.14.9/","summary":"kubeadm 部署 Kubernetes v1.14.9:镜像加速、yum 源、内核参数与集群初始化。","title":"kubernetes kubeadm 安装 1.14.9"},{"content":"Ansible - Modules 目录 Ansible - Modules 目录 常用模块总览 command copy debug file 创建权限和设置软连接 使用变量 创建文件和文件夹 service shell template user yum async 常用模块总览 调试和测试类的模块 ping 测试远程主机连通性 debug 调试模块,打印一些简单的消息 文件类的模块 copy 从本地复制文件到远程节点 template 从本地复制文件到远程节点,并进行变量的替换。 file 设置文件属性 Linux 上的常用操作 user: 管理用户账户 yum: 安装软件包 service: 管理服务 firewalld 管理防火墙 执行 shell 命令 shell: 在节点上执行 shell 命令,支持 $HOME、\u0026quot;\u0026lt;\u0026quot;、\u0026quot;\u0026gt;\u0026quot;、\u0026quot;|\u0026quot;、\u0026quot;;\u0026quot; 和 \u0026quot;\u0026amp;\u0026quot; command: 在远程节点上面执行命令,不支持 $HOME、\u0026quot;\u0026lt;\u0026quot;、\u0026quot;\u0026gt;\u0026quot;、\u0026quot;|\u0026quot;、\u0026quot;;\u0026quot; 和 \u0026quot;\u0026amp;\u0026quot; command --- - hosts: bj-web tasks: - name: return motd to registered var command: '/bin/date' register: test_var - name: print test_var debug: var: test_var copy --- - hosts: bj-web tasks: - name: test copy file copy: src: /tmp/leslie dest: /home/leslie/qikang owner: leslie group: leslie mode: 0700 如果只是复制文件 copy 就可以了,如果需要修改需要文件的内容,需要使用 template 模块。\ndebug debug 模块。\n打印动态注入的环境变量。\n- name: Print debug infomation eg hosts: bj-db tasks: - name: Command run line shell: uptime register: result - name: Show debug info debug: var=result.stdout verbosity=0 file 参考文档: https://docs.ansible.com/ansible/2.5/modules/file_module.html#file-module\n设置远程主机上的文件、软连接和文件夹权限,也可以创建和删除它们。\n创建权限和设置软连接 --- - hosts: bj-web tasks: - name: test file module file: src: /home/leslie/qikang dest: /home/leslie/qikang-link owner: leslie group: leslie mode: 0607 state: link 使用变量 --- - hosts: bj-web vars: test_var: \u0026quot;__leslie__\u0026quot; tasks: - name: test file module file: src: /home/leslie/qikang dest: /home/leslie/qika{{ test_var }}nk owner: leslie group: leslie mode: 0607 state: link 创建文件和文件夹 --- - hosts: bj-web vars: test_var: \u0026quot;__leslie__\u0026quot; tasks: - name: test file module file: src: /home/leslie/qikang dest: /home/leslie/qika{{ test_var }}nk owner: leslie group: leslie mode: 0607 state: link - name: create new file file: path: /tmp/foo.conf state: touch mode: 'u=rwx,g=r,o=r' - name: create new directory file: path: /tmp/foo_dir state: directory mode: 0755 service --- - hosts: sg-entry vars: http_port: 8000 max_clients: 3 remote_user: leslie tasks: - name: ensure httpd is started. service: httpd state: restarted shell --- - hosts: sg-entry remote_user: leslie tasks: - name: test shell command. shell: pwd \u0026gt; /tmp/leslie \u0026amp;\u0026amp; id \u0026gt;\u0026gt; /tmp/leslie template --- - hosts: bj-web vars: http_name: 'test_name' tasks: - name: test template module template: src: /tmp/leslie dest: /home/leslie/qikang owner: leslie group: leslie mode: 0700 backup: yes validate: 'cat %s' 在 /tmp/leslie 文件中直接使用 {{ ansible_default_ipv4.address }} {{ http_name }} {{ ansible_hostname }} 变量。\nuser --- - hosts: bj-web tasks: - name: test user modules user: name: johnd comment: 'John Doe' append: yes groups: johnd,ec2-user uid: 10400 - user: name: jsmith generate_ssh_key: yes ssh_key_bits: 2048 ssh_key_file: .ssh/jsmith_key yum --- - hosts: sg-entry vars: http_port: 8000 max_clients: 3 remote_user: leslie tasks: - name: 'install @Development tools' yum: name: \u0026quot;@Development tools\u0026quot; state: persent async ","permalink":"https://qikang451.cn/ansible-modules/","summary":"Ansible 常用模块实战:command、copy、debug、file、service、shell 等模块的用法与典型场景。","title":"ansible - modules"},{"content":" 目录 目录 base ansible.cfg inventory清单文件 常用模块 ansible-playbook role role各目录作用 base playbook 逻辑控制语句\nwhen:条件判断句,类似于编程语言中的 if loop: 循环语句,类似于编程语言中的 while block: 把几个任务一个代码块,以便于针对一组操作的异常进行处理等操作。 获取 ansible 远程主机系统信息\n# ansible bj-db -m setup ping 测试远程主机连通性\n# ansible bj-db -m ping 在远程主机上执行命令\n# ansible bj-db -a '/bin/echo leslie_test' 从本地复制文件到远程\n# ansible bj-db -m copy -a 'src=/home/leslie/binlog-parser dest=/tmp/binlog_parser_leslie_test' 安装软件包\n# ansible bj-db -m yum -s -a 'name=httpd24 state=latest' 添加用户\n# ansible bj-db -m user -s -a 'name=foo password=\u0026lt;123@123\u0026gt;' 下载 git 仓库\n# ansible bj-db -m git -a 'repo=\u0026lt;ssh://git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/git_test\u0026gt; dest=/tmp/leslie_test_git version=HEAD' 启动服务\n# ansible bj-db -m service -s -a 'name=httpd state=started' 并行执行\n# ansible bj-db -a '/sbin/reboot' -f 10 指定使用主机清单文件\n# ansible -i ansible-test/test.ini all -m setup ansible.cfg # sudo apt-get install ansible # ansible bj-db -m ping 在 ansible.cfg 中设置成 host_key_checking= False,可以默认接受位置的主机\nansible.cfg 配置文件的读取顺序\n默认配置文件路径 /etc/ansible/ansible.cfg\nANSIBLE_CONFIG (an environment variable) ansible.cfg (in the current directory) .ansible.cfg (in the home directory) /etc/ansible/ansible.cfg 1.5 版本以前的顺序\nansible.cfg (in the current directory) ANSIBLE_CONFIG (an environment variable) .ansible.cfg (in the home directory) /etc/ansible/ansible.cfg inventory清单文件 配置文件中的常用参数配置:\n参数 说明 ansible_ssh_host 目标主机地址 ansible_ssh_port 目标主机端口,默认 22 ansible_ssh_user 目标主机用户 ansible_ssh_pass 目标主机 ssh 密码 ansible_sudo_pass sudo 密码 ansible_sudo_exe sudo 命令路径 ansible_connection 与主机的连接类型,比如:local、ssh 或者 paramiko ansible_ssh_private_key_file 私钥地址 ansible_shell_type 目标系统的 shell 类型 ansible_python_interpreter python 版本 在 ansible.cfg 文件中定义\ninventory = /etc/ansible/hosts 定义主机、主机组\nmail.example.com [webservers] foo.example.com bar.example.com [dbservers] one.example.com two.example.com three.example.com [webservers] www[01:50].example.com [databases] db-[a:f].example.com 组中包含子组\n[atlanta] host1 host2 [raleigh] host2 host3 [southeast:children] atlanta raleigh [usa:children] southeast northeast southwest northwest 参考链接:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#list-of-behavioral-inventory-parameters\n免密示例:\nlocalhost ansible_ssh_user=leslie ansible_ssh_private_key_file=/home/leslie/.ssh/servers/leslie_qi_BeijingTest.pem [www.chope.info](http://www.chope.info/) ansible_ssh_user=leslie ansible_ssh_private_key_file=/home/leslie/.ssh/servers/Leslie_Qi.pem 172.31.8.5 ansible_ssh_user=leslie ansible_ssh_private_key_file=/home/leslie/.ssh/servers/leslie_qi_BeijingTest.pem [bj-web] localhost ansible_ssh_user=leslie ansible_ssh_private_key_file=/home/leslie/.ssh/servers/leslie_qi_BeijingTest.pem [bj-db] 172.31.8.5 ansible_ssh_user=leslie ansible_ssh_private_key_file=/home/leslie/.ssh/servers/leslie_qi_BeijingTest.pem [bj-server:children] bj-web bj-db Inventory 参数的说明\nansible_ssh_host 将要连接的远程主机名。与你想要设定的主机的别名不同的话,可通过此变量设置。 ansible_ssh_port ssh 端口号。如果不是默认的端口号,通过此变量设置。 ansible_ssh_user 默认的 ssh 用户名。 ansible_ssh_pass ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)。 ansible_sudo_pass sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)。 ansible_sudo_exe (new in version 1.8) sudo 命令路径(适用于 1.8 及以上版本)。 ansible_connection 与主机的连接类型。比如:local、ssh 或者 paramiko。Ansible 1.2 以前默认使用 paramiko,1.2 以后默认使用 smart,smart 方式会根据是否支持 ControlPersist 来判断 ssh 方式是否可行。 ansible_ssh_private_key_file ssh 使用的私钥文件。适用于有多个密钥,而你不想使用 SSH 代理的情况。 ansible_shell_type 目标系统的 shell 类型。默认情况下,命令的执行使用 sh 语法,可设置为 csh 或 fish。 ansible_python_interpreter 目标主机的 python 路径。适用于的情况:系统中有多个 Python,或者命令路径不是 /usr/bin/python,比如 *BSD,或者 /usr/bin/python 不是 2.X 版本的 Python。我们不使用 /usr/bin/env 机制,因为这要求远程用户的路径设置正确,且要求 python 可执行程序名不可为 python 以外的名字(实际有可能名为 python26)。 与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径。 常用模块 调试和测试类的模块 ping:测试远程主机连通性 debug:调试模块,打印一些简单的消息 文件类的模块 copy:从本地复制文件到远程节点 template:从本地复制文件到远程节点,并进行变量的替换。 file:设置文件属性 Linux 上的常用操作 user:管理用户账户 yum:安装软件包 service:管理服务 firewalld:管理防火墙 执行 shell 命令 shell:在节点上执行 shell 命令,支持 $HOME、\u0026gt;、\u0026lt;、|、; 和 \u0026amp; command:在远程节点上面执行命令,不支持 $HOME、\u0026gt;、\u0026lt;、|、; 和 \u0026amp; ansible-playbook 查看影响了哪些主机\n# ansible-playbook -i xxxx.ini --list-hosts 并行执行脚本\n# ansible-playbook -i play-book.yml -f 10 role 初始化 roles\n# ansible-galaxy init 定义 role 完整的目录结构\n下面的目录结构定义了一个 role:名字为 myrole。Playbook 文件中 site.yml 调用了这个 role。\n每个目录和文件的功能:\n如果 roles 文件 roles/myrole/tasks/main.yml 存在,则文件中列出的任务都会被添加到 Play 中。 如果文件 roles/myrole/handlers/main.yml 存在,则文件中列出 handler 都将被添加到 Play 中。 如果文件 roles/myrole/vars/main.yml 存在,则文件中列出的变量都将被添加到 Play 中。 如果文件 roles/myrole/defaults/main.yml 存在,则文件中列出的变量都会被添加到 Play 中。 如果文件 roles/myrole/meta/main.yml 存在,则文件中列出所有依赖的 role 都被添加到 Play 中。 此外,下面的文件不需要绝对或者是相对路径,和放在同一个目录下的文件一样,直接使用即可: copy 或者 script 使用 roles/myrole/files 下的文件 template 使用 roles/myrole/templates 下的文件 include 使用 roles/myrole/tasks 下的文件 而在写 role 的时候,一般都要包含 role 入口文件 roles/myrole/tasks/main.yml,其他的文件和目录,可以根据需求选择是否加入。\nansible-galaxy 命令行工具可用于管理 Ansible 角色。\n查看当前存在的 role\n# ansible-galaxy role list 初始化一个 role\n# ansible-galaxy role init os-init 默认情况下,Ansible 在 Ansible Playbook 所在目录的 roles 子目录中查找角色。\n如果 Ansible 无法在 roles 找到角色,它会按照顺序在 Ansible 配置设置 roles_path 所指定的目录中查找。\nroles_path 配置\n此变量包含要搜索的目录的冒号分隔列表。此变量的默认值为:\n# grep roles_path /etc/ansible/ansible.cfg # roles_path = ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles 在使用 ansible-galaxy role init os-init 初始化后,得到以下目录:\n[qikang@gateway install-k8s-1.29.10-ansible.tools]$ tree os-init/ os-init/ ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 8 directories, 8 files role各目录作用 defaults 目录: 必须存在,目录中至少应该有 main.yml 文件,用于设定默认变量。变量优先级最低。 files 目录: 存储由 copy 或 script 等模块调用的文件;src 直接指定文件名称,不需要写绝对路径。 handlers 目录: 目录中至少应该有 main.yml 文件,用于定义各 handler。其它的文件需要由 main.yml 进行\u0026quot;包含\u0026quot;调用。 meta 目录: 目录中至少应该有一个 main.yml 文件,定义当前角色的元数据。 tasks 目录: 目录必须存在,且包含一个 main.yml。main.yml 是 playbook 任务的入口文件。 目录下也可以存放其他任务的 yaml 文件。 templates 目录: 模板文件。template 模块会将模板文件中的变量替换为实际值,然后覆盖到客户机指定路径上。 tests 目录: 存放测试相关的文件。 vars 目录: 角色其他的变量定义文件。 ","permalink":"https://qikang451.cn/ansible-base/","summary":"Ansible 基础:安装配置、ansible.cfg 加载顺序、inventory 清单文件、ad-hoc 命令、playbook 与 role 目录结构。","title":"ansible 基础汇总"},{"content":"常用命令 查看binlog文件名 # mysql -e 'show binary logs;' --stop-never 以文件流的方式，下载binlog文件至本地。同时持续下载最新的binlog文件流。 # mysqlbinlog -H -R --stop-never server-bin-log 下载服务器端某一个binlog文件 # mysqlbinlog --read-from-remote-server --raw --host=localhost_test_env --result-file='/home/leslie/test/' server-bin-log.000025 # mysqlbinlog --start-datetime='2018-04-16 20:00:00' --stop-datetime='2018-04-16 20:01:00' --set-charset=utf8 --base64-output=DECODE-ROWS -v -v -v ./* # mysqlbinlog --read-from-remote-server --raw --host=\u0026quot;beijingdb.cdxrstfqn6c5.rds.cn-north-1.amazonaws.com.cn\u0026quot; --port=3306 --user=BinLogReader —password=‘VxYJukMopr’--stop-never mysql-bin-changelog.235388 ","permalink":"https://qikang451.cn/mysqlbinlog/","summary":"MySQL binlog 查看与导出:show binary logs、mysqlbinlog 流式下载与按时间点解析。","title":"MySQL mysqlbinlog"},{"content":"https://github.com/docker/compose\n停止所有容器 docker-compose -p test_project_name stop 强制删除所有容器 docker-compose -p test_project_name rm -f 启动容器 docker-compose -p test_project_name up -d 停止并删除容器 docker-compose down [container-name] 删除容器 docker-compose rm -f [container-name] 环境变量注入 在 Docker Compose 中，docker-compose.yml 可以直接读取 .env 文件里的环境变量，用于服务配置、端口、镜像标签等。\n使用默认的.env # cat .env REDIS_IMAGE=\u0026quot;cloud.test.com/devops-public/redis:6.0.9\u0026quot; TOOLS_IMAGE=\u0026quot;cloud.test.com/edge/debug-network-tools:v0.0.1\u0026quot; 使用指定的env文件 docker compose --env-file ./config/test.env up -d compose.yml 示例 networks: ecu: services: # middlewares-redis middlewares-redis: container_name: middlewares-redis hostname: middlewares-redis image: ${REDIS_IMAGE} restart: always ports: - \u0026quot;6379:6379\u0026quot; command: - redis-server - /etc/redis/redis.conf volumes: - /etc/localtime:/etc/localtime - ./middlewares/redis/data:/data - ./middlewares/redis/redis.conf:/etc/redis/redis.conf - ./middlewares/redis/acl.conf:/etc/redis/acl.conf networks: - ecu # middlewares-tools middlewares-tools: container_name: middlewares-tools hostname: middlewares-tools image: ${TOOLS_IMAGE} restart: always # ports: # - 7000 # deploy: # resources: # limits: # cpus: '1' # memory: 512M # reservations: # cpus: '0.1' # memory: 128M # command: # - \u0026quot;/bin/sh\u0026quot; # - \u0026quot;-c\u0026quot; # - \u0026quot;while true; do sleep 1d;done\u0026quot; volumes: - /etc/localtime:/etc/localtime - /data:/data networks: - ecu depends_on: - middlewares-redis ","permalink":"https://qikang451.cn/docker-compose/","summary":"docker compose 常用命令汇总:启动、停止、查看日志与批量清理容器。","title":"docker - compose"},{"content":"备份所有数据库 [root@RJYF-U-314 ~]# /usr/local/mysql/bin/mysqldump -S /var/lib/mysql/mysql.sock -hlocalhost -uroot -p123456 --all-databases \u0026gt; all-db.sql 还原所有数据库 前提是备份时必须是 \u0026ndash;all-databases .\n[root@RJYF-U-314 ~]# /usr/local/mysql/bin/mysql -uroot -p123456 \u0026lt; all-db.sql 备份单个库 [root@RJYF-U-314 ~]# mysqldump -uroot -h172.20.60.18 -P 32000 -ptest --databases devops \u0026gt; devops.sql 还原单个库 [root@RJYF-U-314 ~]# mysql -uroot -h172.20.60.18 -P 32000 -ptest devops \u0026lt; devops.sql [root@RJYF-U-314 ~]# mysqldump -uroot -p123456 backup \u0026amp;\u0026amp; restore 备份单个testdb库,恢复库需要事先存在还原库 # mysqldump -u root -p qikang -h localhost testdb \u0026gt; /tmp/testdb.sql 还原 # mysql testdb \u0026lt; /tmp/testdb.sql 备份所有数据库 # mysqldump -u root -p qiknag -h localhost --all-databases \u0026gt; /tmp/all.sql 导出整个数据库结构和数据 # mysqldump -h localhost -uroot -p123456 database \u0026gt; dump.sql 导出单个数据表结构和数据 # mysqldump -h localhost -uroot -p123456 database table \u0026gt; dump.sql 导出整个数据库结构（不包含数据） # mysqldump -h localhost -uroot -p123456 -d database \u0026gt; dump.sql 导出单个数据表结构（不包含数据） # mysqldump -h localhost -uroot -p123456 -d database table \u0026gt; dump.sql 备份脚本 crontab中使用绝对路径\n# mysqldump cReserveDB | gzip \u0026gt; cReserveDB.tar.gz # gunzip \u0026lt; cReserveDB.tar.gz | mysql cReserveDB mysqldump是逻辑备份工具\nmysqldumper是多线程的备份工具\n备份前加锁\n可以给单个库加锁\n可以给单个表加锁\n或全局锁\n\u0026ndash;all-databases 备份所有数据库\n\u0026ndash;database 指定数据库\n\u0026ndash;database testdb mysql #指定备份testdb,mysql两个库。使用这个选项还原库的时候，不用事先创建库\n\u0026ndash;lock-all-tables #备份时锁定所有表，建议使用。可读不可写。对MyISAM、Innodb、Aria做温备\n\u0026ndash;lock-tables #锁定单个表\n\u0026ndash;single-transaction 对Innodb存储引擎实现热备\n\u0026ndash;events 同时备份事件调度器代码\n\u0026ndash;routines 备份存储过程和存储函数\n\u0026ndash;triggers 备份触发器\n\u0026ndash;flush-logs 备份时滚动日志。方便二进制日志记录位置，实现即时点还原。\n\u0026ndash;master-data-n 主从时备份主，记录二进制日志的文件和事件\n0不记录\n1记录成CHANGE MASTER语句\n2记录成注释的CHANGE MASTER语句\n\u0026ndash;opt 包含(\u0026ndash;add-drop-table,\u0026ndash;add-locks,\u0026ndash;create-options,\u0026ndash;disable-keys,\u0026ndash;extended-insert,\u0026ndash;lock-tables,\u0026ndash;disables-keys,,,,)\n启用二进制日志，上线服务 mysql\u0026gt; set session sql_log_bin=1; 关闭二进制日志，下线服务 mysql\u0026gt; set session sql_log_bin=0; mysqldump一般备份步骤： 1、先刷新表：mysql -uroot -pqikang -d \u0026ldquo;FLUSH TABLES WITH READ LOCK;\u0026rdquo; #把所有表缓冲区的数据写到磁盘并请求施加全局的读锁。如果MySQL量很大的时候会在此处阻塞。锁操作的shell不能断开否则锁失效。 2、请求锁：\u0026ndash;lock-all-tables或使用\u0026ndash;singe-transaction进行innodb热备 3、滚动日志： \u0026ndash;flush-logs 4、记录日志文件位置： SHOW MASTER STATUS; 5、选定要备份的库： \u0026ndash;databases 6、指定二进制日志文件及位置：\u0026ndash;master-data=2 恢复 刷新日志和锁库 FLUSH TABLES WITH READ LOCK; 查看储存引擎 SHOW TABLE STATUS FROM testdb\\G; 使用mysqldump+binlog做即时点备份和还原 备份\nmysqldump --databases testdb --lock-all-tables --flush-logs --master-data=2 \u0026gt; /tmp/testdb4.sql 完全备份,并记录了日志文件位置和日志节点 mysql -uroot -pqikang -D testdb -e \u0026quot;create table newtb(Name CHAR(30));\u0026quot; 生成新数据 mysql -uroot -pqikang -D testdb -e \u0026quot;insert into newtb values ('Tom'),('Jerry');\u0026quot; 生成新数据 删除testdb库，数据库故障\n导出bin log日志的备份 在备份的sql文件找到二进制文件开始位置，在已经存在的二进制文件中找到stop-position节点 mysqlbinlog后跟空格加多个文件\n此处为了做实验不导出删除testdb库的sql语句 # mysqlbinlog --start-position=367 --stop-position=669 /data/mysql/bin-log/master-bin.000005 \u0026gt; /tmp/testdb5.inc.sql 实际生产应该使用的语句 # mysqlbinlog --start-position=367 /data/mysql/bin-log/master-bin.000005 \u0026gt; /tmp/testdbdb5.inc.sql 还原\n让程序不能访问数据库 关闭二进制日志，服务下线，不能写和读 \u0026gt; set session sql_log_bin=0; 还原前先滚动日志 \u0026gt; flush logs; 先导入完全备份 # mysql \u0026lt; /tmp/testdb4.sql 还原了库，但此时没有新数据 导入用mysqlbinlog导出的新数据 # mysql \u0026lt; /tmp/testdb5.inc.sql 开启二进制日志，服务上线 \u0026gt; set session sql_log_bin=0; ","permalink":"https://qikang451.cn/mysqldump/","summary":"mysqldump 逻辑备份与恢复:全库/单库/单表备份、压缩与还原命令。","title":"MySQL mysqldump"},{"content":"my.cnf 配置文件 mysql my.cnf加载顺序 /etc/my.cnf /etc/mysql/my.cnf /path/to/file --defaults-extra-file=/path/to/file ~/.my.cnf 设置家目录下的my.cnf vim ~/.my.cnf [client] socket=/var/lib/mysql/mysql.sock host=localhost password=qikang mysql cli -D 连接那个数据库 -H 以html格式输出 -X 以xml格式输出 -e 执行的MySQL语句 # mysql -uroot -p -D mysql -H -e \u0026quot;select user,host,password from user;\u0026quot; \u0026gt; a.html --compress #以压缩的格式连接mysql # mysql -uroot -p --compress # 测试连通性 [root@rsync1 ~]# mysqladmin -uroot -p ping # 创建xikang库 [root@rsync1 ~]# mysqladmin -uroot -p create xikang # 查看创建的qikang库 [root@rsync1 ~]# mysql -uroot -p -e 'show databases;' # 查看状态 [root@rsync1 ~]# mysqladmin -uroot -p status Uptime: 2982 Threads: 2 Questions: 126 Slow queries: 0 Opens: 87 Flush tables: 1 Open tables: 80 Queries per second avg: 0.042 # 1秒刷新一次，显示5次 [root@rsync1 ~]# mysqladmin -uroot -p status --sleep 1 --count 5 # 查看MySQL状态的扩展信息，相当于mysql\u0026gt; SHOW GLOBAL STATUS; [root@rsync1 ~]# mysqladmin -uroot -p extended-status # 清除dns缓存和主机缓存表记录 [root@rsync1 ~]# mysqladmin -uroot -p flush-hosts # 刷新权限 [root@rsync1 ~]# mysqladmin -uroot -p flush-privileges # 刷新日志，做日志回滚 [root@rsync1 ~]# mysqladmin -uroot -p flush-logs # 刷新状态，重置状态变量 [root@rsync1 ~]# mysqladmin -uroot -p flush-status # 清空线程缓存池 [root@rsync1 ~]# mysqladmin -uroot -p flush-threads # 查看mysql线程 [root@rsync1 ~]# mysqladmin -uroot -p processlist refresh 相当与flush-privileges和flush-logs start-slave 启动从服务器进程 stop-slave 挂壁从服务器进程 variables 输出mysqld个 服务器变量 [root@rsync1 ~]# mysqladmin version mysqladmin Ver 8.42 Distrib 5.6.28, for linux-glibc2.5 on x86_64 Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Server version 5.6.28 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 1 hour 14 min 47 sec Threads: 2 Questions: 154 Slow queries: 0 Opens: 87 Flush tables: 1 Open tables: 80 Queries per second avg: 0.034 [root@rsync1 ~]# # 重置root密码 \u0026gt; update mysql.user set authentication_string=password('ThZa99rhF') where user='root'; FLUSH PRIVILEGES; # 查看log相关变量 \u0026gt; show variables like '%log%'; # 创建用户 \u0026gt; CREATE USER 'znlk'@'%' IDENTIFIED BY 'G_K6armms_@#fX6q'; \u0026gt; GRANT ALL PRIVILEGES ON znlk_cloud.* TO 'znlk'@'%' WITH GRANT OPTION; \u0026gt; CREATE USER 'prod'@'%' IDENTIFIED BY 'zbA#S!l89sScsGq~'; \u0026gt; GRANT ALL PRIVILEGES ON *.* TO 'prod'@'%' WITH GRANT OPTION; \u0026gt; FLUSH PRIVILEGES; \u0026gt; CREATE USER 'root'@'%' IDENTIFIED BY 'ThZa99rhF'; \u0026gt; FLUSH PRIVILEGES; # 清空表 \u0026gt; truncate table tablename; # 创建数据库 字符编码: utf8mb4 排序规则: utf8mb4_general_ci \u0026gt; create database iot default character set utf8mb4 collate utf8mb4_general_ci; \u0026gt; CREATE DATABASE IF NOT EXISTS iot default character set utf8mb4 collate utf8mb4_general_ci; \u0026gt; CREATE DATABASE IF NOT EXISTS nacos_3_1_0 default character set utf8mb4 collate utf8mb4_general_ci; # 修改时区 \u0026gt; SELECT @@session.time_zone; \u0026gt; SET GLOBAL time_zone = '+8:00'; \u0026gt; SELECT @@global.time_zone; \u0026gt; SET time_zone = \u0026quot;+08:00\u0026quot;; # 查看某一张表最后10条数据 \u0026gt; select * from mr2_reservations order by id desc limit 10\\G # 查询某一条精确匹配 \u0026gt; select * from mr2_reservations where rid = \u0026quot;99000001\u0026quot;\\G # 插入一条数据 \u0026gt; INSERT INTO mr2_reservations (`rid`, `chope_user_id`, `acl_user_id`, `rez_id`, `diner_id`, `title`, `surname`, `forename`, `email`, `phone_ccode`, `phone`, `rez_time`, `adults`, `children`, `seat_id`, `note_by_din`, `note_by_res`, `rez_status`, `ip`, `client_type`, `source`, `version_id`, `c_time`, `u_time`, `opt_in`, `country_code`, `language`, `generate_feed`) VALUES (99000001, 23615, 0, 'UAQ', 13325, 'Mr.', 'The', 'Wan', '100@qq.com', 65, '13366465960', 1506592800, 2, 0, 1, '', NULL, 1, 0, '4.0.1', 'app', 0, 1506506407, 1506506407, 1, 'SG', 'en_US', 1); # 修改表中的某一字段 \u0026gt; alter table mr2_reservations phone varchar(25); # 查看id在1到10之间的数据 \u0026gt; select * from mr2_reservations_leslie_test where id between 1 and 10\\G # 查看数据库编码 \u0026gt; SHOW VARIABLES LIKE '%character%'; # 更新某一条数据 \u0026gt; update mr2_reservations set email = 'qikang@qq.com' where id = 1; # 查看某一个环境变量 \u0026gt; SHOW VARIABLES LIKE '%binlog%'; # 查看一张表有多少条数据 \u0026gt; select count(1) from test1; # 查找id最大一条记录 \u0026gt; SELECT id from mr2_reservations ORDER BY id DESC LIMIT 1\\G; # 增加一个字段，默认为空 \u0026gt; alter table table_name add COLUMN new1 VARCHAR(20) DEFAULT NULL; # 增加一个字段，默认不能为空 \u0026gt; alter table table_name add COLUMN new2 VARCHAR(20) NOT NULL; # 删除一个字段 \u0026gt; alter table table_name DROP COLUMN new2; # 修改一个字段的类型 \u0026gt; alter table table_name MODIFY new1 VARCHAR(10); # 修改一个字段的名称，此时一定要重新指定该字段的类型 \u0026gt; alter table table_name CHANGE new1 new4 int; # 获取表结构字段的名字 \u0026gt; select column_name from information_schema.columns where table_schema ='chopeReserveDB' and table_name = 'user_info'; # 查看所有mysql进程 \u0026gt; show full processlist\\G; # 分页取数据,从2开始偏移7。也就是 2 - 9 行的数据 \u0026gt; select * from table_name limit 2, 7; \u0026gt; select now(); ","permalink":"https://qikang451.cn/mysql/","summary":"MySQL 常用命令与 my.cnf 加载顺序、客户端连接与状态观测。","title":"MySQL 常用命令"},{"content":"创建用户和修改已存在用户的密码 \u0026gt; CREATE USER 'netdata'@'10.0.0.31'; \u0026gt; SET PASSWORD FOR 'netdata'@'10.0.0.31' = PASSWORD('R3GrLknS245v'); \u0026gt; FLUSH PRIVILEGES; 创建数据库 mysql\u0026gt; CREATE DATABASE `iot` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'; 创建用户，并设置密码 mysql\u0026gt; create user 'test-user1'@'%' identified by '123456'; 给已存在用户授所有权限 mysql\u0026gt; grant all on *.* to 'test-user1'@'%'; 给已存在用户授某一个库的所有权限 mysql\u0026gt; GRANT ALL PRIVILEGES ON `helmchart`.* TO 'devops-helmchart'@'%'; 查看授权 mysql\u0026gt; show grants for 'test-user1'@'%; 给已存在用户授mydb库中update权限 mysql\u0026gt; GRANT UPDATE ON mydb.* TO user2@'%'; mysql\u0026gt; FLUSH PRIVILEGES; 给表添加字段 # 添加字段 mysql\u0026gt; ALTER TABLE tb_1 ADD test_4 TINYINT UNSIGNED; # 给表添加字段 mysql\u0026gt; ALTER TABLE tb_1 ADD test_3 varchar(30); # 授权用户对某个字段（test_3)的更新权限 mysql\u0026gt; GRANT UPDATE(test_3) ON user1.tb_1 TO 'user1'@'%'; # 查看用户权限 mysql\u0026gt; SHOW GRANTS FOR 'user1'@'%'; # 更新表中的某个字段 mysql\u0026gt; UPDATE tb_1 SET test_3=1 WHERE test_1=2; # 重名用户名称 mysql\u0026gt; RENAME USER user1 to xikang; 删除用户权限\nmysql\u0026gt; show GRANTS FOR xikang@'%'; # 删除SELECT权限 mysql\u0026gt; REVOKE SELECT ON user1.* FROM 'xikang'@'%'; mysql\u0026gt; show GRANTS FOR xikang@'%'; mysql 删除匿名用户\nmysql\u0026gt; use mysql mysql\u0026gt; select host,user,password from user; mysql\u0026gt; DROP USER ''@localhost; 更改root密码\n1、mysql\u0026gt; UPDATE user SET Password=PASSWORD('redhat') WHERE user='root'; 2、mysql\u0026gt; SET PASSWORD FOR root@127.0.0.1 = PASSWORD('redhat'); 3、[root@rsync1 ~]# mysqladmin -uroot password xikang -p -p 输入老的密码 password xikang 设置新密码为xikang # mysqladmin -uroot -p flush-privileges 4、mysql\u0026gt; alter user 'root'@'localhost' identified by '123456'; # 修改现有用户密码 5、执行修改密码报错 “ ERROR 1054(42S22) Unknown column 'password' in 'field list'” update mysql.user set authentication_string=password('123456') where user='root'; 6、刷新权限 mysql\u0026gt; FLUSH PRIVILEGES; --- # 通配符：%\n172.24.%.%\n%.center.test\n# 跳过主机名解析，以提高用户连接速度\n--skip-name-resolve\n","permalink":"https://qikang451.cn/mysql-user/","summary":"MySQL 用户与权限管理:创建用户、修改密码、授权查看与表结构变更。","title":"MySQL 用户管理"}]