Posts


Aug. 5, 2026

docker挂载研究

|
|

Docker 中的三种挂载方式

bind

把宿主机的某个目录(或文件)挂载到指容器的指定目录(后文件)下,比如下面的命令就表示通过 Bind 方式将外部的 HTML 文档挂载到 Nginx 容器的模式网站根目录下:

docker run -v ~/zioyi/html:/usr/share/nginx/html -p 81:80 -d --name nginx_bind nginx:latest

这种方式的缺点就是被挂载的宿主机目录(或文件)不收保护,任何容器都可以去随意修改。

Volume 

Volume 模式下,我们需要通过docker volume命令来创建一个 Volume。实际上,是在 Docker 的/var/lib/docker/volumes/文件夹内创建一个相同名字的文件夹来保存数据。因为这个文件夹在 Docker 管控范围里,Docker 可以根据挂载的设定来控制容器对 Volume 的读写权限。

 创建 volume
$ docker volume create nginx-volume
nginx-volume
$ docker run --mount type=volume,source=nginx-volume,destination=/usr/share/nginx/html -p 82:80 -d --name nginx_volume nginx:latest

此时,nginx_volume 容器已经挂载了 nginx-volume 卷,通过 inpsect 命令可以看到:

shelll代码解读复制代码

docker inspect nginx_volume
{...
"Mounts": [
            {
                "Type": "volume",
                "Name": "nginx-volume",
                "Source": "/var/lib/docker/volumes/nginx-volume/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
...}

当我们删除容器 nginx_volum 时,volume 也不会删除

Aug. 5, 2026

centos8 安装k8s-1.23(单控制节点)

|
|

1、准备工作 1.1、三台机器并配置hosts, vim /etc/hosts 192.168.2.134 k8s-node-02 192.168.2.135 k8s-node-01 192.168.2.136 k8s-master 1.2、在所有节点增加yum源: /etc/yum.repos.d/kubernetes.repo 注意:没有找到 kubernetes-el8的 [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 粘贴上面的或者使用下面的脚本

配置源

配置源

cat «EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF

说明: enabled=1 :开启 gpgcheck=0 :是否开启gpg签名,1开启,0关闭 repo_gpgcheck=0 :是否检查元数据信息文件的签名信息与完整性,1开启,0关闭 1.3、在所有节点修改环境

关闭防火墙

systemctl disable firewalld systemctl stop firewalld

关闭selinux

临时禁用selinux

setenforce 0

永久关闭修改/etc/sysconfig/selinux文件设置

sed -i ’s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config

禁用交换分区

swapoff -a

永久禁用,打开/etc/fstab注释掉swap那一行。

sed -i ’s/.swap./#&/’ /etc/fstab

Aug. 5, 2026

k8s-1.28.2单控制节点集群安装(基于containerd)基于阿里anolis

|
|

环境说明 k8s 1.28.2 containerd 1.7.8 runc.amd64 1.1.9 anolis 8.8 环境准备 修改主机名 hostnamectl set-hostname 修改host vim /etc/hosts 192.168.2.124 master124 192.168.2.125 master125 192.168.2.126 master126 systemctl disable firewalld systemctl stop firewalld setenforce 0 sed -i ’s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config swapoff -a sed -i ’s/.swap./#&/’ /etc/fstab cat «EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl –system

chronyc -a makestep 和之前不一样的地方 modprobe br_netfilter echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p /etc/sysctl.d/k8s.conf 安装containerd tar xf containerd-1.6.6-linux-amd64.tar.gz cp -r bin/* /usr/local/bin vim /etc/systemd//system/containerd.service

Aug. 5, 2026

k8s高可用(多master)集群搭建

|
|

环境准备: 192.168.2.117 node117 192.168.2.123 node123 192.168.2.124 master124 192.168.2.125 master125 192.168.2.126 master126 keeplive vip 192.168.2.130 cluster-endpoint k8s 1.28.2 containerd 1.7.8 runc.amd64 1.1.9 anolis 8.8 ubuntu 22.04 在所有节点修改环境 修改主机名 hostnamectl set-hostname 修改host vim /etc/hosts 192.168.2.117 node117 192.168.2.123 node123 192.168.2.124 master124 192.168.2.125 master125 192.168.2.126 master126 192.168.2.130 cluster-endpoint #anolis服务器 systemctl disable firewalld systemctl stop firewalld #ubuntu服务器 sudo ufw status 启用 / 禁用 sudo ufw enable / disable

setenforce 0 sed -i ’s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config swapoff -a sed -i ’s/.swap./#&/’ /etc/fstab cat «EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl –system modprobe br_netfilter echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p /etc/sysctl.d/k8s.conf chronyc -a makestep #还要配置免密登录(暂时还不知道什么用处所以所有服务器我都配置了) ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.2.123 安装配置containerd tar xf containerd-1.6.6-linux-amd64.tar.gz cp -r bin/* /usr/local/bin vim /etc/systemd//system/containerd.service

Aug. 5, 2026

ubunt安装k8s

|
|

关闭 swap 内存 执行如下命令关闭swap内存 swapoff -a vi /etc/fstab 注释掉swap 那行 docker 的安装并修改配置 修改docker的/etc/docker/daemon.js文件进行设置 kubernetes默认设置cgroup驱动(cgroupdriver)为"systemd",而docker服务的cgroup驱动默认为"cgroupfs",建议将其修 改为"systemd",与kubernetes保持一致,可以通过修改docker的/etc/docker/daemon.js文件进行设置 { “registry-mirrors” : [ “https://mirror.ccs.tencentyun.com”, “http://registry.docker-cn.com”, “http://docker.mirrors.ustc.edu.cn”, “http://hub-mirror.c.163.com”, “http://harbor.dym.com” ], “insecure-registries”:[“harbor.dym.com”], “exec-opts”: [“native.cgroupdriver=systemd”] } 通过systemctl restart docker命令重启docker让配置生效 添加源 sudo tee /etc/apt/sources.list.d/kubernetes.list «EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF ====== 或者 apt install -y apt-transport-https gnupg gnupg2 gnupg1 curl lsb-release curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

cat «EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 6A030B21BA07F4FB 更新源列表 sudo apt-get update 安装 kubectl,kubeadm以及 kubelet sudo apt-get install -y kubelet kubeadm kubectl 指定版本安装 查找所有版本的软件包 root@k8smaster:~#sudo apt-cache madison kubeadm kubeadm | 1.7.11-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.7.10-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.7.9-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages 安装指定版本的包 sudo apt install -y kubelet=1.23.5-00 运行systemctl start命令启动kubelet服务,并设置为开机自动启动 sudo systemctl start kubelet

Aug. 5, 2026

安装cri-dockerd

|
|

前言 从 k8s 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持 kubernetes主推的CRI(容器运行时接口)标准,所以docker不能再作为k8s的容器运行时 了,即从k8s v1.24开始不再使用docker了 但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。 cri-docker是一个支持CRI标准的shim(垫片)。一头通过CRI跟kubelet交互,另一头跟 docker api交互,从而间接的实现了kubernetes以docker作为容器运行时。但是这种架构缺点 也很明显,调用链更长,效率更低。 本文采用了cri-docker的使用,但是更推荐使用containerd作为k8s的容器运行时 部署 cri-dockerd 官方信息 开源地址https://github.com/Mirantis/cri-dockerd 下载地址https://github.com/Mirantis/cri-dockerd/releases cri-dockerd部署 解压并执行以下命令 tar -xf cri-dockerd-0.2.6.amd64.tgz cp cri-dockerd/cri-dockerd /usr/bin/ chmod +x /usr/bin/cri-dockerd 配置启动⽂件,执行如下命令 cat «“EOF” > /usr/lib/systemd/system/cri-docker.service [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 –network-plugin=cni –pod-infra-container- image=registry.aliyuncs.com/google_containers/pause:3.7 ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF ⽣成 socket ⽂件,执行如下命令 cat «“EOF” > /usr/lib/systemd/system/cri-docker.socket [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 EOF 启动 cri-docker 并设置开机⾃动启动 systemctl daemon-reload systemctl enable cri-docker –now

Aug. 5, 2026

报错: [ERROR FileContent--proc-sys-net-ipv4-ip_forward] procsysnetipv4ip_forw

|
|

报错: [ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are no 报错: [ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 解决方案: 执行命令 sysctl -w net.ipv4.ip_forward=1 有的服务器执行下面的好使 proc/sys/net/ipv4/ip_forward这个文件表示是否打开IP转发。 0代表禁止 1代表转发 使用下列命令,查看文件的内容 less /proc/sys/net/ipv4/ip_forward 1 如图所示:里面是0.表示禁止转发 使用下列命令,更改文件的内容: echo “1” > /proc/sys/net/ipv4/ip_forward

使用下列命令,重启网络服务 service network restart 然后关掉虚拟机,重启,再次查看文件的内容,已经更改 或者 一、临时生效,重启失效 1、sysctl -w net.ipv4.ip_forward=1 2、echo 1 > /proc/sys/net/ipv4/ip_forward 二、永久生效 修改 /etc/sysctl.conf,增加一条:net.ipv4.ip_forward = 1 (uos有效) 要想是更改生效,你需要执行以下指令: sysctl -p /etc/sysctl.conf 在红帽系列的发行版上可以通过重启网络服务使之生效: service network restart 而在debian/ubuntu系列的发行版则用这样的命令: /etc/init.d/procps.sh restart

page1

Aug. 5, 2026

报错权限问题----Error from server (Forbidden) pods is forbidden

|
|

#Error from server (Forbidden): pods is forbidden: User “system:serviceaccount:gitlab- sjfw:default” cannot list resource “pods” in API group "" in the namespace “dataframework” kubectl create clusterrolebinding gitlab-sjfw:default–clusterrole=cluster-admin – group=system:serviceaccounts –namespace=dataframework

Aug. 5, 2026

常见概念

|
|

Master 负责管理集群负责协调集群中的所有活动,例如调度应用程序,维护应用程序的状态,扩展 和更新应用程序。 Worker节点(即图中的Node)是VM(虚拟机)或物理计算机,充当k8s集群中的工作计算机。每个 Worker节点都有一个Kubelet,它管理该Worker节点并负责与Master节点通信。该Worker节点还应具 有用于处理容器操作的工具,例如Docker。 kubectl 是 k8s 的客户端工具,可以使用命令行管理集群。负责 master 节点和 worker 节点之间通信 的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。 Deployment 译名为部署。在k8s中,通过发布 Deployment,可以创建应用程序 (docker image) 的 实例 (docker container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元。 在 k8s 集群中发布 Deployment 后,Deployment 将指示 k8s 如何创建和更新应用程序的实例, master 节点将应用程序实例调度到集群中的具体的节点上。Deployment 处于 master 节点上,通过 发布 Deployment,master 节点会选择合适的 worker 节点创建 Container(即图中的正方体), Container 会被包含在 Pod (即蓝色圆圈)里。 Pod 容器组是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容 器),以及这些 container (容器)的一些共享资源。这些资源包括: 共享存储,称为卷(Volumes) 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享 该IP地址 container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等 Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创 建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保 持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node) 上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不

Aug. 5, 2026

解决k8s集群环境 容器组 报 network open runflannelsubnet.env no such file or directory

|
|

解决k8s集群环境容器组报 network: open /run/flannel/subnet.env: no such file or directory k8s集群环境由于机器显卡故障,导致节点连接失败,出现大量1000多个 pending 容器,查看容器 容器组里报 network is not ready: [runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker:  network plugin is not ready: cni config uninitialized] network: open /run/flannel 看网上一些方法是把其他机器   /run/flannel/subnet.env 考到这台机器试过后,虽然能恢复, 但一头栽进容器内部无法连外网,一直找为啥容器无法连外网,这个坑。。。。 折腾了一大圈,最后教训是让k8s自己恢复网络 在master 节点执行 kubectl apply -f kube-flannel.yml 稍等可以看到该节点的   kube-flannel-xxxx   部署正常,其余的坐等k8s 自己恢复即可

Aug. 5, 2026

解决k8s默认端口的限制

|
|

前言 默认情况下,k8s 集群 nodePort 分配的端口范围为:30000-32767,如果 我们需要更多的端口,或者重新规划使用端口,需要进行调整 处理方法 找到kube-apiserver.yaml文件的绝对路径,其路径 为"/etc/kubernetes/manifests/kube-apiserver.yaml",并添加参数"- – service-node-port-range=1-65535",如下所示: apiVersion: v1 kind: Pod metadata: annotations: kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.2.216:6443 creationTimestamp: null labels: component: kube-apiserver tier: control-plane name: kube-apiserver namespace: kube-system spec: containers: command: kube-apiserver –service-node-port-range=1-65535# 此行为添加的内容 –advertise-address=192.168.1.233 –allow-privileged=true –audit-log-maxage=30 –audit-log-maxbackup=10 –audit-log-maxsize=100 –authorization-mode=Node,RBAC –bind-address=0.0.0.0 –client-ca-file=/etc/kubernetes/pki/ca.crt –enable-admission-plugins=NodeRestriction –enable-bootstrap-token-auth=true –etcd-cafile=/etc/ssl/etcd/ssl/ca.pem –etcd-certfile=/etc/ssl/etcd/ssl/node-k8s-test-env-master-1.pem –etcd-keyfile=/etc/ssl/etcd/ssl/node-k8s-test-env-master-1-key.pem

–etcd- servers=https://192.168.1.233:2379,https://192.168.1.234:2379,https://192.168.1.235:2379 –feature- gates=ExpandCSIVolumes=true,RotateKubeletServerCertificate=true,TTLAfterFinished=true,CSI StorageCapacity=true –insecure-port=0 –kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt –kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key –kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname –proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt –proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key –requestheader-allowed-names=front-proxy-client –requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt –requestheader-extra-headers-prefix=X-Remote-Extra- –requestheader-group-headers=X-Remote-Group –requestheader-username-headers=X-Remote-User –secure-port=6443 –service-account-issuer=https://kubernetes.default.svc.cluster.local –service-account-key-file=/etc/kubernetes/pki/sa.pub –service-account-signing-key-file=/etc/kubernetes/pki/sa.key –service-cluster-ip-range=10.233.0.0/18 –tls-cert-file=/etc/kubernetes/pki/apiserver.crt –tls-private-key-file=/etc/kubernetes/pki/apiserver.key image: registry.cn-beijing.aliyuncs.com/kubesphereio/kube-apiserver:v1.21.5 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 8 httpGet: host: 192.168.1.233 path: /livez port: 6443 scheme: HTTPS initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 15 name: kube-apiserver readinessProbe: failureThreshold: 3 httpGet: host: 192.168.1.233 path: /readyz port: 6443

Aug. 5, 2026

解决kubernetes集群中部署服务的pod ip显示docker ip 问题

|
|

解决kubernetes集群中部署服务的pod ip显示docker ip 问题 项目场景: kubernetes集群中,其中一个node节点上部署的服务无法访问,经过查看,发现创建的服务显示的pod ip 是不对的,走 的是docker ip,如下图: 原因分析: 发现其它节点部署服务都是正常的,走的都是calico的ip,只有这个节点走的是docker ip,本集群部署用的网络组件是 calico,分析可能是kubelet的配置文件中可能没有添加cni这个参数导致,calico需要cni插件的支持,如果没有配置,可 能会走默认的docker0网络 解决方案: 在kubelet的配置文件中添加如下参数,然后重启kubelet: vim /var/lib/kubelet/kubeadm-flags.env 增加: –network-plugin=cni 然后到master节点get po 发现pod的ip显示正常了:

page1

page1

Aug. 5, 2026

解决虚拟网卡与网络组件虚拟网络配置不一样问题

|
|

报错 Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container “749210afc5044fc6f5a249d2f6107d2719b46326647bd96705e6400e01afd61f” network for pod “online-web-zhili-7c646c59c7-4bzl2”: networkPlugin cni failed to set up pod “online- web-zhili-7c646c59c7-4bzl2_zg” network: failed to delegate add: failed to set bridge addr: “cni0” already has an IP address different from 10.244.2.1/24 1.首先我们重新配置k8s的flannel文件,可以参考其他环境的文件配置,也 可以重新安装插件生成,会在/run下面生成flannel文件夹,下面包含网络配 置环境变量 注明:三个节点的subnet网段不能相同 2.重配flannel之后发现,有两个节点依然不能分配网络,导致服务error 查看error的pod日志,发现报错,对应节点的cni网络冲突 3.查看出错节点cni0的网卡配置,发现cni0的这个网卡地址是10.244.2.1, 明显与报错中的10.244.1.1不一致

4.我们可以将其改为10.244.1.1,也可将这个错误的网卡删掉,它会自己重 建,这里采用删除重生的方法,首先停用网络,然后删除配置 ifconfig cni0 down ip link delete cni0 然后查看节点重建的cni0网卡,会依据flannel的网络环境配置生成 5.查看集群环境服务,系统恢复。

Aug. 5, 2026

命名空间一直在termnating,导致无法有效删除.

|
|

解决办法: 1、查看命名空间: [root@zepc-jh-nginx home]# kubectl get ns NAMESTATUSAGE default Active 7d5h gitlab-sjfw Active 4d6h kube-node-lease Active 7d5h kube-public Active 7d5h kube-system Active 7d5h kuboard Terminating 7d4h skeleton Active 32h #强制删除也无法删除 [root@zepc-jh-nginx home]# kubectl delete ns kuboard –force –grace-period=0 warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely. namespace “kuboard” force deleted 2、查看kubernetes-dashboard的命名空间描述 kubectl get ns kuboard -o json > kuboard.json 3、编辑 sudo vim kuboard.json 删除spec 删除前 删除后

Aug. 5, 2026

设置k8s能调度到master节点

|
|

K8s默认是只能部署Pod在node节点上,如果master资源足或你希望能将pod也在master上进行部署,执行以下 操作进行。 1.###设置pod能部署在k8s-master节点 kubectl taint node k8s-master node-role.kubernetes.io/master- 结果如下: [root@k8s-master ~]# kubectl taint node k8s-master node-role.kubernetes.io/master- node/k8s-master untainted 2.###假如想取消pod能部署在k8s-master节点 kubectl taint node k8s-master node-role.kubernetes.io/master=:NoSchedule 结果如下: [root@k8s-master ~]# kubectl taint node k8s-master node- role.kubernetes.io/master=:NoSchedule node/k8s-master tainted 作者:冰之杍 链接:https://juejin.cn/post/6986086590007214087 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Aug. 5, 2026

卸载k8s

|
|

kubeadm reset -f yum remove -y kubelet kubeadm kubectl rm -rf /etc/kubernetes/* rm -rf ~/.kube/* rm -rf /var/lib/etcd/* rm -rf $HOME/.kube/config

cni

ifconfig cni0 down ip link delete cni0 rm -rf /var/lib/cni/ rm -f /etc/cni/net.d/*

flannel

ifconfig flannel.1 down ip link delete flannel.1 rm -fr /var/run/flannel/ rm -fr /etc/kube-flannel rm -rf /etc/cni/net.d/* rm -rf /var/lib/cni/calico systemctl  restart kubelet yum remove -y kubelet kubeadm kubectl

删除rpm包

rpm -qa|grep kube*|xargs rpm –nodeps -e

Aug. 5, 2026

指定Kubernetes工作节点内网IP

|
|

在部署ARM架构Kubernetes实践中,我发现主机加入时使用的是无线网卡接口的IP地址( 网段): kubectl get nodes -o wide 显示: NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME jetson Ready 19h v1.19.4 192.168.0.34 Ubuntu 18.04.5 LTS 4.9.140-tegra docker://19.3.6 pi-master1 Ready master 6d17h v1.19.4 192.168.6.11 Ubuntu 20.04.1 LTS 5.4.0-1022-raspi docker://19.3.8 pi-worker1 Ready 3d5h v1.19.4 192.168.6.15 Ubuntu 20.04.1 LTS 5.4.0-1022-raspi docker://19.3.8 pi-worker2 Ready 3d5h v1.19.4 192.168.6.16 Ubuntu 20.04.1 LTS 5.4.0-1022-raspi docker://19.3.8 参考How to specify Internal-IP for kubernetes worker node,需要修订jetson的kubelet配置,明确指定,这 样kubelet公告就能够正确指定node的。原文是说修改配置,添 加这行配置。不过,现在kubelet的systemd配置目录 下明确说明了kubelet的扩展配置参数是从读取的: set_k8s_worker_internal_ip/10-kubeadm.conf 1# Note: This dropin only works with kubeadm and kubelet v1.11+ 2[Service] 3Environment=“KUBELET_KUBECONFIG_ARGS=–bootstrap-kubeconfig=/etc/kubernetes/bootstrap- kubelet.conf –kubeconfig=/etc/kubernetes/kubelet.conf” 4Environment=“KUBELET_CONFIG_ARGS=–config=/var/lib/kubelet/config.yaml” 5# This is a file that “kubeadm init” and “kubeadm join” generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically 6EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env 7# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use 8# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. 9EnvironmentFile=-/etc/default/kubelet 10ExecStart=

Aug. 5, 2026

helm安装redis 哨兵集群

|
|

redis-ha-4.4.6.tgz 现在这种模式无法外部访问,redis可以访问哨兵不能访问,但是哨兵模式可以集群内部访问,配置方式如下 spring: redis: database: 1 password: gilight123!@# timeout: 3000 sentinel: master: mymaster password: gilight123!@# #哨兵的密码 nodes:

  • redis-node-0.redis-headless.basic-components.svc.cluster.local:26379
  • redis-node-1.redis-headless.basic-components.svc.cluster.local:26379
  • redis-node-2.redis-headless.basic-components.svc.cluster.local:26379 [root@kubernetes01 home]# helm search repo redis NAME CHART VERSION APP VERSION DESCRIPTION bitnami/redis 17.8.0 7.0.8 Redis(R) is an open source, advanced key-value … bitnami/redis-cluster 8.3.7 7.0.8 Redis(R) is an open source, scalable, distribut…

stable/prometheus-redis-exporter 3.5.1 1.3.4 DEPRECATED Prometheus exporter for Redis metrics stable/redis 10.5.7 5.0.7 DEPRECATED Open source, advanced key-value stor… stable/redis-ha 4.4.6 5.0.6 DEPRECATED - Highly available Kubernetes implem… stable/sensu 0.2.5 0.28 DEPRECATED Sensu monitoring framework backed by… [root@kubernetes01 home]# helm fetch stable/redis-ha [root@kubernetes01 home]# ls redis-ha-4.4.6.tgz [root@kubernetes01 home]# tar -xvf redis-ha-4.4.6.tgz redis-ha/Chart.yaml redis-ha/values.yaml redis-ha/templates/NOTES.txt redis-ha/templates/_configs.tpl redis-ha/templates/_helpers.tpl redis-ha/templates/redis-auth-secret.yaml redis-ha/templates/redis-ha-announce-service.yaml redis-ha/templates/redis-ha-configmap.yaml redis-ha/templates/redis-ha-exporter-script-configmap.yaml redis-ha/templates/redis-ha-pdb.yaml redis-ha/templates/redis-ha-role.yaml redis-ha/templates/redis-ha-rolebinding.yaml redis-ha/templates/redis-ha-service.yaml redis-ha/templates/redis-ha-serviceaccount.yaml redis-ha/templates/redis-ha-servicemonitor.yaml redis-ha/templates/redis-ha-statefulset.yaml redis-ha/templates/redis-haproxy-deployment.yaml redis-ha/templates/redis-haproxy-service.yaml redis-ha/templates/redis-haproxy-serviceaccount.yaml redis-ha/templates/redis-haproxy-servicemonitor.yaml redis-ha/templates/tests/test-redis-ha-configmap.yaml redis-ha/templates/tests/test-redis-ha-pod.yaml redis-ha/README.md redis-ha/ci/haproxy-enabled-values.yaml [root@kubernetes01 home]# ls redis-ha redis-ha-4.4.6.tgz [root@kubernetes01 redis-ha]# ls Chart.yaml ci README.md templates values.yaml [root@kubernetes01 redis-ha]# vim values.yaml haproxy:

Aug. 5, 2026

helm安装单节点mysql

|
|

配置好的 charts mysql-9.5.0.tgz helm search repo bitnami/mysql helm pull bitnami/mysql tar -xvf mysql-9.5.0.tgz vim values.yaml helm package . helm install mysql mysql-9.5.0.tgz -n basic-components

Aug. 5, 2026

helm部署redis主从集群

|
|

helm pull bitnami/redis tar -zxvf redis-17.8.0.tgz cd redis vim values.yaml helm package . helm install redis redis-17.8.0.tgz -n basic-components 原始版本(下载下来未修改的): redis-17.8.0.tgz 修改好的: redis-17.8.0.tgz 修改后的value: values (1).yaml

Aug. 5, 2026

k8s Memory cgroup out of memory Kill process

|
|

终于在kubepod上发现了异常 dmesg | grep -i memory 内核日志:Memory cgroup out of memory kill process pid 问题已经清晰了,这是一个典型的cgroup memory导致的内存泄漏问题 cgroup memory内存泄漏 k8s集群随着pod增多,运行久了之后就会出现不能创建pod的情况。执行kubectl describe pod命令可以发现 cannot allocate memory异常。重启对应的服务器之后异常提示才会消失。但继续随着运行时间推移,该问题依然会出现,最终 内存会耗尽,系统会强杀节点释放内存。 使用cat /sys/fs/cgroup/memory/kubepods/memory.kmem.slabinfo检查问题node,如下图则说明没有存在内存泄 漏 如下图显示则说明存在内存泄漏 kmem导致的内存泄露 内核对每个cgroup 子系统的的内存地址页是有限制的,限制的大小定义在 kernel/cgroup.c #L139上。在 cgroup 创建一 个内存地址之后,当开启了 kmem 功能,虽然 cgroup 的地址页删除了,但是内存不会回收。也就是说在3.1内核版本 下,开启了 kmem 功能就会导致内存泄漏。该问题会导致可分配内存越来越少,直到无法创建新 pod 或节点宕机 注:该内存泄漏问题在3.10 的内核上存在,4.x的内核已经修复 解决方案 1:内核参数文件 /boot/grub2/grub.cfg中添加cgroup.memory=nokmem让系统禁用 cgroup的 kmem

2:内核参数文件 /boog/grub2/grub.cfg 中添加cgroup_disable=memory 关掉整个cgroup memory debian修改grub启动参数

vim /etc/default/grub

GRUB_CMDLINE_LINUX=“cgroup_enable=memory” 3:升级内核版本到4.x 5、优化结果 直接关掉了cgroup memory。重启系统之后集群运行正常,之后没有再出现内存泄漏

page1

page1

page1

Aug. 5, 2026

k8s pod redis无法正常启动

|
|

异常:Fatal error loading the DB: Invalid argument. Exiting docker启动redis:docker start redis ,查看日志:docker logs 容器ID,出现Fatal error loading the DB: Invalid argument. Exiting异常信息的解决办法: 1 进入redis的挂载目录下或者通过命令:find / -name “dump.rdb” 找到dump.rdb文件; 2 删除该文件:rm -rf dump.rdb; 3重启服务:docker restart redis; 原因分析: redis提供两种方式进行持久化,一种是RDB持久化(原理 是将Reids在内存中的数据库记录定时dump到磁盘上的RDB 持久化),另外一种是AOF(append only file)持久化(原 理是将Reids的操作日志以追加的方式写入文件)。在redis 服务重启的过程中,redis会自动加载dump.rdb文件以恢复 上一次的状态,由于rdb文件版本高于redis服务器版本,导 致rdb文件读取失败,服务无法启动,需要删除该文件。 或者直接在物理机上删除(先停掉pod)

page1

Aug. 5, 2026

k8s 出错 procsysnetbridgebridge-nf-call-iptables does not exist_wx61cd54ea3a2

|
|

k8s 出错 /proc/sys/net/bridge/bridge-nf-call-iptables does not exist_wx61cd54ea3a202 初始化过程中,可能会遇到“/proc/sys/net/bridge/bridge-nf-call-iptables does not exist”的错误,这是因为之前配置的 br_netfilter没有启动,运行一下命令即可 modprobe br_netfilter echo 1 > /proc/sys/net/ipv4/ip_forward

Aug. 5, 2026

k8s 修改参数kubeadm安装方式

|
|

apiserver /etc/kubernetes/manifests/kube-apiserver.yaml

kubeadm安装的apiserver是Static Pod,它的配置文件被修改后,立即生效。

Kubelet 会监听该文件的变化,当您修改了/etc/kubenetes/manifest/kube-apiserver.yaml 文件之

后,kubelet 将自动终止原有的 kube-apiserver-{nodename} 的 Pod,并自动创建一个使用了新配置参数 的 Pod 作为替代。

如果您有多个 Kubernetes Master 节点,您需要在每一个 Master 节点上都修改该文件,并使各节点上的

参数保持一致。 kube-controller-manager 针对k8s配置文件的修改,需要重启服务 systemctl daemon-reload && systemctl restart kubelet 注意备份文件不要更改文件名之后放到同一目录下一定要放到其他目录下 不然不生效

Aug. 5, 2026

k8s常用命令

|
|

kubectl get –help yum remove -y kubelet kubeadm kubectl kubeadm reset -f #查看K8S版本kubeadm version kubectl version –client kubelet –version kubectl get pods –all-namespaces //pod的详细信息 kubectl get pod -n kube-system -o wide kubectl get sc -n kuboard kubectl logs -n kube-system kube-proxy-77rxc openssl x509 -noout -text -in apiserver.crt kubectl -n kube-system get cm kubeadm-config -o yaml #drain 驱逐节点 首先,驱逐node上的pod,其他节点重新创建 接着,将节点调为** SchedulingDisabled** –force 当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时 候 就需要用–force来强制执行 (例如:kube-proxy) –ignore-daemonsets 无视DaemonSet管理下的Pod –delete-local-data 如果有mount local volumn的pod,会强制杀掉该pod并把料清除掉 另外如果跟本身的配置讯息有冲突时,drain就不会执行 kubectl drain k8s-node02 –delete-local-data –force –ignore-daemonsets –force kubectl delete k8s-node02 cordon 停止调度 影响最小,只会将node调为SchedulingDisabled

Aug. 5, 2026

k8s单控制节点集群扩容多控制节点

|
|

在当前唯一的master节点上运行如下命令 第一步生成新的token kubeadm token create –print-join-command kubeadm join 192.168.2.134:6443 –token h94icd.pqh5x0enly2xnp04 –discovery-token-ca- cert-hash sha256:496e2fb4712c00b4c0d8d0673a2eca01b8c4bc5968e92ada12b8a0c6e559d7b4 第二步生成新的证书 kubeadm init phase upload-certs –upload-certs I0912 14:22:43.939926 82798 version.go:255] remote version is much newer: v1.28.1; falling back to: stable-1.23 [upload-certs] Storing the certificates in Secret “kubeadm-certs” in the “kube-system” Namespace [upload-certs] Using certificate key: ea197e710ccd3515545e2d402f6257469a88481fc50f360b5362e818fae30b4b 生成新证书 1.16版本前参数为–experimental-upload-certs,1.16及1.16版本以后为–upload-certs 命令不对就会出现unknown flag –experimental-upload-certs的错误 第三步将以上得到的token和key进行拼接,添加新master节点 kubeadm join 192.168.2.134:6443 –token h94icd.pqh5x0enly2xnp04 –discovery-token-ca- cert-hash sha256:496e2fb4712c00b4c0d8d0673a2eca01b8c4bc5968e92ada12b8a0c6e559d7b4 – control-plane –certificate-key ea197e710ccd3515545e2d402f6257469a88481fc50f360b5362e818fae30b4b 同样,1.16版本前参数为

–experimental-control-plane –certificate-key , 1.16及1.16版本以后为 –control-plane –certificate-key 遇到问题: [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster… [preflight] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -oyaml’ error execution phase preflight: One or more conditions for hosting a new control plane instance is not satisfied. unable to add a new control plane instance a cluster that doesn’t have a stable controlPlaneEndpoint address Please ensure that:

Aug. 5, 2026

k8s的pod镜像的时区正确设置方法

|
|

在k8s中部署pod时,很多时候我们使用的镜像不是我们自己制作的,自己制 作的可以把时区设置好,但使用别人的镜像时,这些镜像的时区有可能是 UTC,比我们的时间少了8小时,看一些日志时很别扭,比较方便的办法是 在部署时设置env环境变量,加上 env:

  • name: TZ value: Asia/Shanghai 如果是helm的包,特别的bitnami的包,通常都env的扩展参数,但这个参数 一般在README中都是[],那想在helm install –set方式如何设置呢?在网上 搜索了几个小时,终于stackoverflow上找到一种可用的方式,这里我以安装 postgresql的设置为例: –set postgresql.extraEnvVars[0].name=TZ,postgres ql.extraEnvVars[0].value=Asia/Shanghai 如果你也遇到这种情况,不防试试,也许可以解决

page1

Aug. 5, 2026

k8s容器探针

|
|

对于Pod的健康状态检测,kubernetes提供了两类探针(Probe)来执行对Pod的健康状态检 测: liveness probe(存活探针) 用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器 不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含 LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。 readiness probe(就绪探针) 用于判断容器是否启动完成,即容器的Ready是否为True,可以接收请求,如果 ReadinessProbe探测失败,则容器的Ready将为False,控制器将此Pod的Endpoint从对 应的service的Endpoint列表中移除,从此不再将任何请求调度此Pod上,直到下次探测成 功。 StartupProbe(这个 1.16 版本增加的): StartupProbe 探针,主要解决在复杂的程序中 ReadinessProbe、LivenessProbe 探针无法更好的判断程序是否启动、是否存活。进而 引入 StartupProbe 探针为 ReadinessProbe、LivenessProbe 探针服务。 每类探针都支持三种探测方法 exec:通过执行命令来检查服务是否正常,针对复杂检测或无HTTP接口的服务,命令返 回值为0则表示容器健康。 httpGet:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康。 tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健 康。 每种方式都可以定义在readiness 或者liveness 中。比如定义readiness 中http get 就是意思 说如果我定义的这个path的http get 请求返回200-400以外的http code 就把我从所有有我的服 务里面删了吧,如果定义在liveness里面就是把我kill 了。 注意,liveness不会重启pod,pod是否会重启由你的restart policy 控制。 探针探测的结果有以下三者之一 Success:Container通过了检查。 Failure:Container未通过检查。 Unknown:未能执行检查,因此不采取任何措施。 重启策略 Always: 总是重启

OnFailure: 如果失败就重启 Never: 永远不重启 配置探针(Probe)相关属性 探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行 为(Probe): initialDelaySeconds:Pod启动后延迟多久才进行检查,单位:秒。 periodSeconds:检查的间隔时间,默认为10,单位:秒。 timeoutSeconds:探测的超时时间,默认为1,单位:秒。 successThreshold:探测失败后认为成功的最小连接成功次数,默认为1,在Liveness探 针中必须为1,最小值为1。 failureThreshold:探测失败的重试次数,重试一定次数后将认为失败,在readiness探针 中,Pod会被标记为未就绪,默认为3,最小值为1。

Aug. 5, 2026

k8s手动续签证书

|
|

背景 kubectl命令就无法访问集群了——错误大概为:“certificate has expired or is not yet valid”。 原因是k8s证书过期了 k8s版本1.23.4 以下操作均在master节点操作 查看证书过期时间 kubeadm certs check-expiration gemfield@master:~$ sudo kubeadm certs check-expiration [sudo] password for gemfield: [check-expiration] Reading configuration from the cluster… [check-expiration] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -oyaml’ CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Jun 21, 2022 03:16 UTC 364d no apiserver Jun 21, 2022 03:16 UTC 364d ca no apiserver-etcd-client Jun 21, 2022 03:16 UTC 364d etcd-ca no apiserver-kubelet-client Jun 21, 2022 03:16 UTC 364d ca no controller-manager.conf Jun 21, 2022 03:16 UTC 364d no etcd-healthcheck-client Jun 21, 2022 03:16 UTC 364d etcd-ca no etcd-peer Jun 21, 2022 03:16 UTC 364d etcd-ca no etcd-server Jun 21, 2022 03:16 UTC 364d etcd-ca no front-proxy-client Jun 21, 2022 03:16 UTC 364d front-proxy-ca no scheduler.conf Jun 21, 2022 03:16 UTC 364d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca May 04, 2030 12:14 UTC 8y no etcd-ca May 04, 2030 12:14 UTC 8y no front-proxy-ca May 04, 2030 12:14 UTC 8y no

Aug. 5, 2026

k8s中正确删除一个pod

|
|

1、先删除pod2、再删除对应的deployment否则只是删除pod是不管用的,还会看到pod,因为 deployment.yaml文件中定义了副本数量 实例如下: 删除pod [root@test2 ~]# kubectl get pod -n jenkins NAMEREADYSTATUSRESTARTSAGE jenkins2-8698b5449c-grbdm 1/1 Running 0 8s [root@test2 ~]# kubectl delete pod jenkins2-8698b5449c-grbdm -n jenkins pod “jenkins2-8698b5449c-grbdm” deleted 查看pod仍然存储 [root@test2 ~]# kubectl get pod -n jenkins NAMEREADYSTATUSRESTARTSAGE jenkins2-8698b5449c-dbqqb 1/1 Running 0 8s [root@test2 ~]# 删除deployment [root@test2 ~]# kubectl get deployment -n jenkins NAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGE jenkins2 1 1 1 1 17h [root@test2 ~]# kubectl delete deployment jenkins2 -n jenkins 再次查看pod消失 deployment.extensions “jenkins2” deleted [root@test2 ~]# kubectl get deployment -n jenkins No resources found. [root@test2 ~]# [root@test2 ~]# kubectl get pod -n jenkins No resources found.

Aug. 5, 2026

k8s主点加入集群报错 failure loading certificate for CA couldn‘t load the certificat

|
|

k8s主结点加入集群报错 failure loading certificate for CA: couldn‘t load the certificate file 当k8s做集群高可用的时候,需要将另一个master加入到当前master,此时如果报错 failure loading certificate for CA: couldn’t load the certificate file /etc/kubernetes/pki/ca.crt: open /etc/kubernetes/pki/ca.crt: no such file or directory scp -rp /etc/kubernetes/pki/ca.* master125:/etc/kubernetes/pki scp -rp /etc/kubernetes/pki/sa.* master125:/etc/kubernetes/pki scp -rp /etc/kubernetes/pki/front-proxy-ca.* master125:/etc/kubernetes/pki scp -rp /etc/kubernetes/pki/etcd/ca.* master125:/etc/kubernetes/pki/etcd scp -rp /etc/kubernetes/admin.conf master125:/etc/kubernetes

page1

Aug. 5, 2026

kube-etcd 容量 大于 2G 导致 etcd数据库 起不来

|
|

使用 swr.cn-east-2.myhuaweicloud.com/kuboard/etcd-host:3.4.16-2 版本的etcd 数据库 由于没有设置,容量参数,导致数据大于2G就无法启动。 报错截图: etcdserver/api/etcdhttp: /health error due to memberID: alarm:NOSPACE 解决参数: –quota-backend-bytes=8589934592#调大到8GB 需要官方在制作镜像进行添加参数 临时办法 1、修改 kube-etcd 监控检测,时间调大点,防止重启 kubectl edit daemonsets.apps -n kuboard kuboard-etcd 2、执行下方命令 (不建议使用 127.0.0.1 使用 master 的网卡IP地址) ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” –write-out=table endpoint status ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” compact $(ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” endpoint status –write-out=“json” | egrep -o ‘“revision”:[0-9]’ | egrep -o ‘[0-9].’)

ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” defrag ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” alarm disarm 恢复正常

page1

page1

page2

Aug. 5, 2026

kubeadm下进行etcd数据备份与还原

|
|

在kubernetes集群中,etcd存储了集群的元数据信息,为防止信息的丢失及还原数据,我们需要对etcd数据进行备份。 本文使用的kubernetes集群采用kubeadm部署的 一、单master的etcd的数据备份与还原 1.从容器中把etcdctl工具复制出来到主机中的/usr/local/bin目录下 docker cp $(docker ps | grep -v etcd-mirror | grep -w etcd | awk ‘{print $1}’):/usr/local/bin/etcdctl /usr/local/bin/ 2.备份etcd数据 etcdctl –endpoints 127.0.0.1:2379
–cert="/etc/kubernetes/pki/etcd/server.crt"
–key="/etc/kubernetes/pki/etcd/server.key"
–cacert="/etc/kubernetes/pki/etcd/ca.crt"
snapshot save etcd_snap_save.db 3.还原etcd数据 ####移除配置和删除数据 mv /etc/kubernetes/manifests/etcd.yaml /opt/ rm -rf /var/lib/etcd/ ####通过命令恢复 etcdctl snapshot restore etcd_snap_save.db
–cacert=/etc/kubernetes/pki/etcd/ca.crt
–cert=/etc/kubernetes/pki/etcd/server.crt
–key=/etc/kubernetes/pki/etcd/server.key
–data-dir=/var/lib/etcd/
–endpoints=https://127.0.0.1:2379 ####配置还原

mv /opt/etcd.yaml /etc/kubernetes/manifests/ 二、多master的etcd的数据备份与还原 1.从容器中把etcdctl工具复制出来到主机中的/usr/local/bin目录下 docker cp $(docker ps | grep -v etcd-mirror | grep -w etcd | awk ‘{print $1}’):/usr/local/bin/etcdctl /usr/local/bin/ 2.备份etcd数据 etcdctl –endpoints 127.0.0.1:2379
–cert="/etc/kubernetes/pki/etcd/server.crt"
–key="/etc/kubernetes/pki/etcd/server.key"
–cacert="/etc/kubernetes/pki/etcd/ca.crt"
snapshot save etcd_snap_save.db 3.还原etcd数据 三台master上都需要操作 k8s-master-1 ####移除配置和删除数据 mv /etc/kubernetes/manifests/etcd.yaml /opt/ rm -rf /var/lib/etcd/ ####通过命令恢复 ETCDCTL_API=3 etcdctl snapshot restore snap-save.db
–cacert=/etc/kubernetes/pki/etcd/ca.crt
–cert=/etc/kubernetes/pki/etcd/server.crt \

Aug. 5, 2026

kubernetes初始化报错Get httplocalhost10248healthz dial tcp 127.0.0.110248 connect con

|
|

kubernetes初始化报错Get “http://localhost:10248/healthz”: dial tcp 127.0.0.1: 10248: connect: connection refused.的解决办法 k8s使用kubeadm初始化报如下错误: [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed with error: Get “http://localhost:10248/healthz”: dial tcp 127.0.0.1:10248: connect: connection refused. 原因: docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd,我们需要更改Docker cgroup 驱动, 解决办法: kubeadm reset vim /etc/docker/daemon.json { “registry-mirrors”: [ “https://a8qh6yqv.mirror.aliyuncs.com”, “http://hub-mirror.c.163.com” ], “exec-opts”: [“native.cgroupdriver=systemd”], “insecure-registries”:[“218.29.223.194:31003”,“192.168.100.71:31003”] } [root@master01 ~]# cat /var/lib/kubelet/config.yaml | grep cgroup docker info | grep -i cgroup systemctl daemon-reload systemctl restart docker 重新初始化即可成功。

Aug. 5, 2026

kubernetes集群节点多网卡,calico指定网卡

|
|

对于openstack 平台, 需要修改mtu 以及指定网卡 1、calico如果有节点是多网卡,所以需要在配置文件中指定内网网卡

  • name: calico-node image: 172.16.230.97/source/node:v3.18.2 envFrom:
  • configMapRef:

Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be

overridden for eBPF mode. name: kubernetes-services-endpoint optional: true env:

Use Kubernetes API as the backing datastore.

  • name: DATASTORE_TYPE value: “kubernetes”

DaemonSet 添加环境变量

  • name: IP_AUTODETECTION_METHOD value: “interface=ens192”

Wait for the datastore.

  • name: WAIT_FOR_DATASTORE value: “true”

Set based on the k8s node name.

# 匹配 bond 网卡

  • name: IP_AUTODETECTION_METHOD value: interface=eth.|en.|em.|bo.

Aug. 5, 2026

kuboard启动失败 kuboard-v3一直无法启动

|
|

启动的 kuboard-etcd 正常 kuboard-v3一直无法启动 [root@k8s-1-31 ~]# kubectl get pod -n kuboard NAME READY STATUS RESTARTS AGE kuboard-etcd-49mjf 1/1 Running 0 25m kuboard-etcd-f7g4m 1/1 Running 0 26m kuboard-etcd-jk45w 1/1 Running 0 26m kuboard-v3-76996c957f-zd8g5 0/1 CrashLoopBackOff 9 (105s ago) 23m 查看 kuboard-v3-76996c957f-zd8g5 日志如下: time=“2022-11-02T16:05:38Z” level=info msg=“config using log level: info” time=“2022-11-02T16:05:38Z” level=info msg=“config issuer: http://192.168.1.35:30080/sso” time=“2022-11-02T16:05:38Z” level=info msg=“config storage: etcd” time=“2022-11-02T16:05:38Z” level=info msg=“config static client: KuboardApp” time=“2022-11-02T16:05:38Z” level=info msg=“config connector: default” time=“2022-11-02T16:05:38Z” level=info msg=“config skipping approval screen” time=“2022-11-02T16:05:38Z” level=info msg=“config signing keys expire after: 6h0m0s” time=“2022-11-02T16:05:38Z” level=info msg=“config id tokens valid for: 168h0m0s” time=“2022-11-02T16:05:38Z” level=info msg=“config device requests valid for: 5m0s” 设置日志级别为 info [LOG] 2022/11/03 - 00:05:41.650 | /common/etcd.client_config 24 | info | KUBOARD_ETCD_ENDPOINTS=[] [LOG] 2022/11/03 - 00:05:41.650 | /common/etcd.client_config 52 | info | {[] 0s 1s 0s 0s 0 0 false [] false} [LOG] 2022/11/03 - 00:05:41.651 | /initializekuboard.InitializeEtcd 39 | info | 初始化 ./init-etcd-scripts/audit-policy-once.yaml {“level”:“warn”,“ts”:“2022-11- 03T00:05:43.619+0800”,“caller”:“clientv3/retry_interceptor.go:61”,“msg”:“retrying of unary invoker failed”,“target”:“endpoint://client-f777d7ed-593f-4336-b868- 86a448cc4919/”,“attempt”:0,“error”:“rpc error: code = DeadlineExceeded desc = latest balancer error: all SubConns are in TransientFailure, latest connection error: connection error: desc = “transport: Error while dialing dial tcp: missing address””} failed to initialize server: server: failed to list connector objects from storage: context deadline exceeded 编辑配置文件

Aug. 5, 2026

mysql zookeeper

|
|

kubectl create secret generic mysql-root-password –from-literal=password=gilight123!@# -n dev mysql-svc.yaml zk.yaml gitlab-runner-master1.zip helm install -name gitlab-menhu gitlab-runner-0.1.37.tgz -n gitlab-menhu helm package . 带配置文件的mysql,但需要创建pv等 mysql-config.yaml

Aug. 5, 2026

mysql 无法启动

|
|

查看日志报错: cannot create directory ‘/bitnami/mysql/data’: Permission denied 解决: sudo chown -R 1001:1001 /data/nfs/mysql8

Aug. 5, 2026

postgresql容器启动失败

|
|

1、postgresql容器未启动: chmod:更改‘/bitnami/postgresql/data’的权 限:不允许操 由于Bitnami PostgreSQL容器是非根容器,因此id为1001的用户需要在您挂 载的本地文件夹中拥有写权限。 sudo chown -R1001:1001/postgresql 2、FATAL: the database system is starting up 查看文件夹权限 所在文件夹的父文件夹是777权限 数据所在的文件夹 data是700权限

page1

page1

Aug. 5, 2026

zookeeper单节点

|
|

zookeeper-11.1.3.tgz helm search bitnami/zookeeper zookeeper helm search repo zookeeper helm pull bitnami/zookeeper tar -xvf zookeeper-11.1.3.tgz cd zookeeper/ vim values.yaml helm package . helm install zookeeper zookeeper-11.1.3.tgz -n basic-components helm uninstall zookeeper -n basic-components

Aug. 5, 2026

创建自定义ingress报错:Internal error occurred failed calling webhook “validate.ngi

|
|

创建自定义ingress报错:Internal error occurred: failed calling webhook “validate.nginx.ingress.kubernetes.io 原因分析: 我刚开始使用yaml的方式创建nginx-ingress,之后删除了它创建的命名空间以及 clusterrole and clusterrolebinding ,但是没有删除ValidatingWebhookConfiguration ingress-nginx-admission, 这个ingress-nginx-admission是在yaml文件中安装的。当我再次使用helm安装nginx-ingress之后,创建 自定义的ingress就会报这个错误。 解决方案: 最后参考下面的文章解决此问题 使用下面的命令查看 webhook kubectl get validatingwebhookconfigurations ingress-nginx-admission 删除ingress-nginx-admission kubectl delete-A ValidatingWebhookConfiguration ingress-nginx-admission ———————————————— 版权声明:本文为CSDN博主「惜鸟」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本 声明。 原文链接:https://blog.csdn.net/qq_39218530/article/details/115372879

Aug. 5, 2026

helm 安装及常用命令

|
|

helm-v3.8.2-linux-amd64.tar.gz 以上是新版的helm的安装包,这个安装包只需要解压并移动到用户路径($PATH)即可,无需再做其他的操作。 安装好后可以直接添加仓库 #helm仓库地址 https://artifacthub.io/ #添加仓库 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add stable https://charts.helm.sh/stable

helm仓库列表

helm repo list

更新helm仓库

helm repo update #在仓库中查找redis helm search repo redis #在仓库中下载redis helm fetch stable/redis-ha #查看已经安装的chart helm ls –all-namespaces #删除指定命名空间的chart helm uninstall redis-ha –namespace=basic-components helm uninstall redis -n basic-components #将本地的chart打包 helm package . #将打包好的chart安装到k8s helm install redis redis-17.8.0.tgz -n basic-components #这个也是安装只是不需要打包但是需要下载 helm install redis-ha -f my_values.yaml –namespace=basic-components stable/redis-ha //查看 helm repo list // 设置新的镜像地址 helm repo add stable https://charts.helm.sh/stable helm repo add aliyuncs    https://apphub.aliyuncs.com helm repo add aliyun https://apphub.aliyuncs.com/ helm repo add bitnami https://charts.bitnami.com/bitnami

Aug. 5, 2026

helm 搭建harbor

|
|

一、helm语法 helm repo add harbor https://helm.goharbor.io #添加源 helm search hub #查看可用源 helm show chart stable/redis #打印出指定的Charts的详细信息 helm fetch <>下载 helm search repo harbor -l 查看可下载的harbor版本 二、添加helm源,拉取harbor #helm repo add harbor https://helm.goharbor.io #helm fetch harbor/harbor –untar #拉取 https://artifacthub.io/ #helm chart展示页面 三、创建持久化存储storageclass harbor.sto.yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: harbor-data namespace: cicd provisioner: kubernetes.io/aws-ebs parameters: fsType: ext4 type: gp2 encrypted: “true” reclaimPolicy: Retain allowVolumeExpansion: true

volumeBindingMode: WaitForFirstConsumer 修改values.yaml [root@das1harbor001-new harbor]# cat harbor.yaml expose: type: nodePort tls: enabled: flase

Aug. 5, 2026

使用GitLab CI运行GitLab Runner并执行Pipeline

|
|

https://www.alibabacloud.com/help/zh/container-service-for-kubernetes/latest/use-gitlab-ci-t o-run-a-gitlab-runner-and-run-a-pipeline-on-kubernetes 使用GitLab CI运行GitLab Runner并执行Pipeline 本文主要演示如何在Kubernetes集群中安装、注册GitLab Runner,添加Kubernetes类型的 Executor来执行构建,并以此为基础完成一个Java源码示例项目从编译构建、镜像打包到应 用部署的CICD过程。 背景信息 本文以构建一个Java软件项目并将其部署到阿里云容器服务Kubernetes集群中为例,说明如 何使用GitLab CI在阿里云Kubernetes服务上运行GitLab Runner、配置Kubernetes类型的 Executor,并执行Pipeline。 创建GitLab源码项目并上传示例代码 1.创建GitLab源码项目。 2.本示例中创建的GitLab源码项目地址为:http://xx.xx.xx.xx/demo/gitlab- java-demo.git 3.执行以下命令获取示例代码并上传至GitLab。 4.git clone https://github.com/haoshuwei/gitlab-ci-k8s-demo.git git remote add gitlab http://xx.xx.xx.xx/demo/gitlab-java- demo.git git push gitlab master 在Kubernetes集群中安装GitLab Runner 1.获取GitLab Runner的注册信息。 a.获取项目专用Runner的注册信息。 ⅰ.登录gitlab  ⅲ.在Your projects页签下,选择相应的Project。 ⅳ.在左侧导航栏中,选择Settings > CI / CD ⅴ.单击Runners右侧的Expand。

ⅵ.获取URL和registration token信息。 b.获取Group Runners的注册信息。 ⅰ.在顶部导航栏中,选择Groups > Your groups ⅱ.在Your groups页签下,选择相应的group。 ⅲ.在左侧导航栏中,选择Settings > CI / CD ⅳ.单击Runners右侧的Expand ⅴ.获取URL和registration token信息。

c.获取Shared Runners的注册信息。 说明只有管理员有权限执行此步操作。 ⅰ.在顶部导航栏中,单击设置进入Admin Area页面。 ⅱ.在左侧导航栏中,选择Overview > Runners ⅲ.获取URL和registration token信息。 2.执行以下命令获取并修改GitLab Runner的Helm Chart。 git clone https://github.com/haoshuwei/gitlab-runner.git 替换gitlabUrl和runnerRegistrationToken字段,示例如下:

Aug. 5, 2026

deployment.yaml概念

|
|

下面的配置文件定义了一个 name 为 nginx-demo 的 Pod,该 Pod 包含一个 name 为 nginx 的容器: apiVersion: v1 kind: Pod # 类型为pod metadata: name: nginx-demo #pod名称为nginx-demo labels: #标签,例子中的Pod包含两个标签 environment: production 和 app:nginx environment: production app: nginx spec: containers:

  • name: nginx #pod内部容器的名称nginx image: nginx:1.14.2 #容器的镜像 ports:
  • containerPort: 80 #容器的端口 resources: limits: cpu: 200m memory: 128Mi requests: cpu: 0.1 memory: 1M nodeSelector: #Pod 的节点选择器为例,下面的 Pod 可以被调度到包含标签 accelerator=nvidia- tesla-p100 的节点上 accelerator: nvidia-tesla-p100 kind:常用的有Namespace、Pod、Service、Deployment、Config

Aug. 5, 2026

helm部署gitlab-runner

|
|

查看注册token: 在查看注册runner的和,注册完成后就是全局的runner,也可以创建项目后单独注册 runner。 配置: helm repo add gitlab https://charts.gitlab.io/ helm repo update helm pull gitlab/gitlab-runner tar xf gitlab-runner-0.21.1.tgz vim gitlab-runner/values.yaml #更改 values.yanl gitlabUrl: http://gitlab.lzxlinux.com/ #url runnerRegistrationToken: “KQj8zJc3RCI0K8wKF3ObroOPMFQT281CkKeHUUV77fro8auh7ZzQBL4PVVVne2EU” #token concurrent: 10 #最大并发 rbac: create: true resources: [“pods”, “pods/exec”, “secrets”] verbs: [“get”, “list”, “watch”, “create”, “patch”, “delete”] metrics: enabled: false runners: image: ubuntu:16.04 imagePullPolicy: “if-not-present” locked: false tags: “k8s-runner” #runner的标签 runUntagged: false

protected: false privileged: false #特权模式 namespace: public-service builds: cpuLimit: 200m cpuLimitOverwriteMaxAllowed: 400m memoryLimit: 256Mi memoryLimitOverwriteMaxAllowed: 512Mi cpuRequests: 100m cpuRequestsOverwriteMaxAllowed: 200m memoryRequests: 128Mi memoryRequestsOverwriteMaxAllowed: 256Mi services: cpuLimit: 200m memoryLimit: 256Mi cpuRequests: 100m memoryRequests: 128Mi helpers: cpuLimit: 200m memoryLimit: 256Mi cpuRequests: 100m memoryRequests: 128Mi securityContext: fsGroup: 0 runAsUser: 0 resources: limits: memory: 256Mi cpu: 200m requests: memory: 128Mi cpu: 100m hostAliases:

Aug. 5, 2026

helm部署gitlab-runner并集成maven、gradle以及harbor全自动部署服务

|
|

获取gitlab的·地址及注册token runner类型: 共享Runner(Shared Runner),所有项目可以使用 群组Runner(Group Runner),特定群组里的所有项目和子群组可以使用 特定Runner(Specific Runner),用于独立的项目。 在全局配置中获取的token就是全局runner 在群组中获取的toke就是群组runner 项目中的token就是特定runner helm安装gitlab-runner 配置helm并下载chart #添加仓库 helm repo add gitlab https://charts.gitlab.io/ #更新仓库 helm repo update #下载chart helm pull gitlab/gitlab-runner 根据环境修改配置 编辑values.yaml,已修改好的配置文件

values.yaml 相关参数如下: #gitlab地址 gitlabUrl: http://218.29.223.194:43223/gitlab/ #gitlab的token runnerRegistrationToken: “H8u_rwN5NkRmxkt9Gv7S” #用于向GitLab服务器添加新Runner的注册令牌 unregisterRunners: true #最大并发 concurrent: 10 #rabc权限部分配置 rbac: create: true rules:

  • resources: [“configmaps”, “pods”, “pods/attach”, “secrets”, “services”] verbs: [“get”, “list”, “watch”, “create”, “patch”, “update”, “delete”]
  • apiGroups: [""] resources: [“pods/exec”] verbs: [“create”, “patch”, “delete”] runners: #配置文件 config: | [[runners]] [runners.kubernetes] namespace = “{{.Release.Namespace}}” image = “ubuntu:16.04” #挂在外部的nfs作为缓存,挂载到 /opt/cache 结合volumeMounts 使用可以写多个 maven缓存使 用 [[runners.kubernetes.volumes.pvc]] name = “gitlab-runner-cache-pvc” mount_path = “/opt/cache” #挂在外部的nfs作为缓存,挂载到 /opt/cache 结合volumeMounts 使用 gradle缓存使用 [[runners.kubernetes.volumes.pvc]] name = “gitlab-runner-cache” mount_path = “/home/gradle” #关于内部调用docker的配置 [[runners.kubernetes.volumes.host_path]] name = “docker”

mount_path = “/var/run/docker.sock” read_only = true host_path = “/var/run/docker.sock” #runner的tag tags: “k8s-runner-sy” #runner的name name: “k8s-runner-sy” #runner的namespace namespace: basic-components #gitlab的仓库clone的地址,gitlab内外网地址不一样的时候使用 cloneUrl: http://218.29.223.194:43223/gitlab/ #runner内部域名映射,修改内部的hosts hostAliases:

Aug. 5, 2026

Ingress注解Annotations

|
|

Nginx Ingress 注解使用在 Ingress 资源实例中,用以设置当前 Ingress 资源实例中 Nginx 虚拟主机的相关 配置,对应配置的是 Nginx 当前虚拟主机的 server 指令域内容。在与 Nginx Ingress 配置映射具有相同功能配 置时,将按照所在指令域层级遵循 Nginx 配置规则覆盖。 Nginx Ingress注解按照配置功能有如下分类。 1、Nginx原生配置指令 支持在注解中添加 Nginx 原生配置指令。配置说明如下表所示。 注解类型功能描述 nginx.ingress.kubernetes.io/serv在 server 指令域添加 Nginx 配置 string er-snippet nginx.ingress.kubernetes.io/conf在 location 指令域添加 Nginx 配 string iguration-snippet 配置样例如下: apiVersion: extensions/v1beta1 kind: Ingress metadata: name: web-nginxbar-org annotations: nginx.ingress.kubernetes.io/server-snippet: | location / { return 302 /coffee; } spec: rules:

  • host: web.nginxbar.org http: paths:
  • path: /tea backend: serviceName: tea-svc servicePort: 80
  • path: /coffee backend: serviceName: coffee-svc servicePort: 80 2、通用配置 Nginx 虚拟主机中的通用配置。通用配置说明如下表所示。

注解类型功能描述 nginx.ingress.kubernetes.io/ena对当前虚拟主机设置是否启用访 true 或 false ble-access-log nginx.ingress.kubernetes.io/serv为 Nginx 添加更多的主机名,同 string Nginx 配置指令 server name nginx.ingress.kubernetes.io/app-将当前虚拟主机根目录的访问 string 302 跳转到当前指定的路径 nginx.ingress.kubernetes.io/clie string client_body_buffer_size 是否对当前虚拟主机的 Nginx 指 nginx.ingress.kubernetes.io/use- true 或 false令 location 使用正则方式进行路 regex 径匹配,默认值为 false nginx.ingress.kubernetes.io/cust根据响应码状态定义为错误状态 []int om-http-errors 自定义默认后端的资源对象 nginx.ingress.kubernetes.io/defaService 名称,当客户端的请求 string 没有匹配的 Nginx 规则或响应错 误时,将被转发到默认后端 nginx.ingress.kubernetes.io/whit CIDR whitelist-source-range nginx.ingress.kubernetes.io/per 设置永久重定向的目标地址 manent-redirect nginx.ingress.kubernetes.io/per自定义永久重定向的响应码,默 number manent-redirect-code nginx.ingress.kubernetes.io/tem 设置临时重定向的目标地址 poral-redirect 设置是否将当前虚拟主机子域名 nginx.ingress.kubernetes.io/from true 或 false为 www 的请求跳转到当前主机 -to-www-redirect 域名 nginx.ingress.kubernetes.io/rewr 同 Nginx 配置指令 rewrite ite-target nginx.ingress.kubernetes.io/ena同 Nginx 配置指令 rewrite log, true 或 false ble-rewrite-log nginx.ingress.kubernetes.io/mirr 同 Nginx 配置指令 mirro or-uri 同 Nginx 配置指令 nginx.ingress.kubernetes.io/mirr mirror_request_body,默认为 or-request-body true 配置样例如下:

Aug. 5, 2026

k8s集成gitlab-runner、maven、docker、kubelet等全自动发布全流程实践

|
|

基于gitlab runner 的did(docker in docker ) ci/cd k8s方案 首先,jenkins很强大,尤其是各种插件的支持,但实际个人工作中,用到的并不多,早期大型项目布署负载各种脚本和 远程调用,目前所有项目和k8s深耦合,已经拆解为各种云服务,jenkins的大部分功能用不到 其次,这只是一种可行的方案,并不是最优的方案,不同阶段也都有再调整和优化的空间 最后,对个人的需求,jenkins过于复杂,gitlab-runner足可胜任,对研发人员更透明友好,学习应用成本更低。 CI/CD集成k8s服务,对各种文件抽像的只有三步(部分语言生态只需要一步) 1 编译环境加载依赖编译可执行文件 2 执行环境+可执行文件打包为docker image并上传至docker hub 3 执行k8s布署,启动服务 k8s布署k8s gitlab-runner 服务 apiVersion: apps/v1 kind: StatefulSet metadata: name: gitlab-runner-java namespace: common spec: replicas:1 revisionHistoryLimit:10 selector: matchLabels: app: gitlab-runner-java serviceName: gitlab-runner-java template: metadata: creationTimestamp:null labels: app: gitlab-runner-java name: gitlab-runner-java spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms:

  • matchExpressions:

  • key: kubernetes.io/hostname operator: In values:

  • server-svc-2 containers:

  • image: gitlab/gitlab-runner:v12.4.1 imagePullPolicy: IfNotPresent name: gitlab-runner-java resources: limits: cpu:“4” memory: 4Gi requests: cpu:“2” memory: 1Gi securityContext: runAsUser:0 volumeMounts:

Aug. 5, 2026

K8S集群 NOT READY的解决办法 1.20 错误信息cni config uninitialized

|
|

关联(K8S集群节点(node)NotReady问题处理) K8S集群 NOT READY的解决办法 1.20 错误信息:cni config uninitialized 错误现象: untime not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized 解决方法一: vim /var/lib/kubelet/kubeadm-flags.env 删除其中的 –network-plugin=cni 重启kubelet 注意:这种方式可能导致节点使用docker的网络 解决方法二: 将master上/etc/cni/net.d 目录下的文件拷贝到有问题的节点上: scp server4:/etc/cni/net.d/* /etc/cni/net.d/

Aug. 5, 2026

K8S集群节点(node)NotReady问题处理

|
|

K8S集群 NOT READY的解决办法 1.20 错误信息cni conf ig uninitialized 问题场景: K8S master节点安装完kube-flannel之后(加粗是重点) 执行kubectl get nodes命令看到master 状态依旧是NotReady K8S node节点kubeadm join命令后,已成功添加到集群,但是执行kubectl get nodes命令看 到node状态依旧是NotReady 图片展示的是node节点的NotReady状态,master节点最开始也是这个状态,我已经解决过 了,无论master节点还是node节点,都可以试下这个方法 核对问题症状: 执行journalctl -f -u kubelet命令 报错:NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized 或者报错:Unable to update cni config: no valid networks found in /etc/cni/net.d 执行ls /opt/cni/bin/命令,看是否有flannel这个文件,如果没有,就是有问题的 解决办法: 手工复制flannel到/opt/cni/bin/文件夹,并添加执行权限 下载文件cni-plugins-linux-amd64-v0.8.6.tgz,并提取flannel文件

把提取到的flannel复制或上传到/opt/cni/bin/ 执行chmod +x /opt/cni/bin/flannel 命令添加权限 返回master节点,执行kubectl get nodes命令查看状态,问题解决 当然出现问题的原因可能有很多种,这个方案不能百分百解决

page1

page1

page1

page2

page2

page2

Aug. 5, 2026

k8s上运行gitlabrunner失败

|
|

一、无权限 ERROR: Job failed (system failure): prepare environment: setting up credentials: secrets is forbidden: User “system:serviceaccount:default:default” cannot create resource “secrets” in API group "" in the namespace “default”. Check https://docs.gitlab.com/runner/shells/index.html#shell- profile-loading for more information 原因是这个pod没有create等权限,需要添加权限 kubectl create clusterrolebinding default:default–clusterrole=cluster-admin – group=system:serviceaccounts –namespace=default 二、无法访问 fatal: unable to access ‘http://gitlab.dym.com/douxiaoliang/netty-study.git/' : Failed to connect to gitlab.dym.com port 80 after 130543 ms: Operation timed out 28ERROR: Job failed: command terminated with exit code 1 runner的pod里面通过hostAliases也配置了 hosts域名映射,但是依然报错,没有找到原因,直接将gitlab的地址改为ip 访问

Aug. 5, 2026

Kubernetes 以root用户运行pod

|
|

首先找到你需要进入对应namespace的pod名 kubectl get pod 找到pod所在的节点以及容器id kubectl describe pod “pod名” 在所给信息中找到以下字段: Node:所查pod所在的节点 Container ID:所查pod的容器id,形如docker://…,注意Container ID不包括docker:// ssh到pod对应节点 以root用户权限进入pod docker exec -it -u root ‘Container ID’ /bin/bash

Aug. 5, 2026

SecurityContext安全上下文

|
|
  1. 简介 安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。安全上下文 包括但不限于: ​自主访问控制(Discretionary Access Control)​:基于用户 ID(UID)和组 ID(GID).来判 定对对象(例如文件)的访问权限 ​安全性增强的 Linux(SELinux)​:为对象赋予安全性标签。 以特权模式或者非特权模式运行。 ​Linux 权能​: 为进程赋予 root 用户的部分特权而非全部特权。 ​AppArmor​:使用程序文件来限制单个程序的权限。 ​Seccomp​:限制一个进程访问文件描述符的权限。 ​AllowPrivilegeEscalation​:控制进程是否可以获得超出其父进程的特权。此布尔值直接控制 是否为容器进程设置no_new_privs 标志。当容器以特权模式运行或者具有 CAP_SYS_ADMIN权能时,AllowPrivilegeEscalation 总是为 true。 ​readOnlyRootFilesystem​:以只读方式加载容器的根文件系统。 2.1 配置pod的安全上下文 apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 volumes: - name: sec-ctx-vol emptyDir: {} containers: - name: sec-ctx-demo image: busybox command: [ “sh”, “-c”, “sleep 1h” ] volumeMounts: - name: sec-ctx-vol

mountPath: /data/demo securityContext: allowPrivilegeEscalation: false 在配置文件中,该​runAsUser​字段指定对于Pod中的任何容器,所有进程都以用户ID 1000运行。 该​runAsGroup​字段为Pod中的任何容器中的所有进程指定主组ID3000。如果省略此字段,则容器的主要组ID将为root (0)。runAsGroup指定时,用户1000和组3000也将拥有所有创建的文件。 由于​fsGroup​指定了字段,因此容器的所有进程也是补充组ID2000的一部分。卷的所有者/data/demo和在该卷中创建的 任何文件都将是组ID 2000。 说明:‘privileged’(特权模式) ‘不等于’ root–>比如:root用户无法’关闭容器网卡’

Aug. 5, 2026

配置etc下docker下daemon.json后不生效

|
|

配置/etc/docker/daemon.json后不生效 在node的/etc/docker/daemon.json中配置了私有镜像仓库地址后已经无法连接此镜像仓库。 背景:已经重启了daemon-reload、docker,但依旧不生效。 报错内容: daemon.json的配置格式: 解决方案:重启daemon-reload与docker时需要先stop再start,有的 docker版本直接restart是不会生效的。

page1

page1

Aug. 5, 2026

麒麟v10操作系统 安装docker(手动安装docker)

|
|

一、描述 天翼云上的麒麟服务器默认没有安装docker,需要手动安装。 二、安装准备 查看系统版本,确认版本

cat /etc/kylin-release

Kylin Linux Advanced Server release V10 (Tercel) 查看系统架构

uname -p

x86_64 服务器如果是鲲鹏,架构是aarch64

uname -p

aarch64 注意:该系统是aarch64架构,dockerhub上的大部分镜像都是x86_64架构下的,在使用dockerhub等平台的 镜像时,一定要注意其架构是否支持aarch64! 内核版本

uname -r

4.19.90-23.8.v2101.ky10.aarch64

iptables版本

iptables –version

iptables v1.8.1 (legacy) 三、下载安装docker-ce 删除老版本docker sudo yum remove docker docker-engine docker.io containerd runc 下载安装docker 官网下载地址:https://download.docker.com/linux/static/stable/aarch64/ wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz 解压 tar -zxvf docker-20.10.7.tgz 移动解压出来的二进制文件到 /usr/bin 目录中 mv docker/* /usr/bin/ 配置添加 systemd 编辑docker的系统服务文件 vi /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity

Aug. 5, 2026

麒麟v10操作系统 升级docker(手动升级docker)

|
|

#下载指定版本的docker wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.14.tgz #停止docker systemctl stop docker #解压软件包 tar -xvf docker-20.10.14.tgz #覆盖更新老版本文件 mv docker/* /usr/bin/ #启动docker systemctl start docker #查看docker版本 docker –version

Aug. 5, 2026

docker查看镜像的文件目录

|
|

如果容器无法启动或者启动失败 可以只创建容器(不运行) docker create –name suspect-container suspect-image:latest 导出容器的文件系统 docker export suspect-container > suspect-container.tar 如果您不需要保存或打开存档,而是更喜欢在终端中获取文件列表,请修改tar命令: docker export suspect-container | tar t > suspect-container-files.txt tar t列出输入档案的内容。您最终会得到一个包含图像中所有内容的列表 suspect-container-files.txt。

Aug. 5, 2026

docker镜像的save与load以及批量导出

|
|

docker save -o nginx.tar nginx:alpine -o docker高版本不需要,低版本需要此命令 nginx.tar 保存到本地的文件名与文件格式 nginx:alpine 需要save的镜像 docker load < taomcat.tar docker镜像的批量导出 docker save $(docker images –format ‘{{.Repository}}:{{.Tag}}’|grep -v “192.168”|grep - v none)-o all.tar docker save $(docker images |grep -v REPOSITORY|grep -v 192.168|grep -v none |awk ‘{print $1":"$2}’)-o allimages.tar 批量导入 docker load -i allinone.tar

Aug. 5, 2026

docker无法启动,报错grpc addrConn.createTransport failed to connect to {unixruncon

|
|

docker无法启动,报错grpc: addrConn.createTransport failed to connect to {unix:///run/containerd/containerd. docker无法启动,报错。k8s的pod镜像加载失败。 解法方法: 删除/var/lib/docker/和/var/lib/containerd/ 这两个文件夹,重起docker服务。 问题完美解决,结果如下:

page1

page1

Aug. 5, 2026

docker追加restart=always, docker重启后自动启动容器

|
|

有时候,我们创建容器时忘了添加参数 –restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1、Docker 命令修改 docker container update –restart=always 容器名字 docker update –restart always mysql 2、直接改配置文件 首先停止容器,不然无法修改配置文件 配置文件路径为:/var/lib/docker/containers/容器ID 在该目录下找到一个文件 hostconfig.json ,找到该文件中关键字 RestartPolicy 修改前配置:“RestartPolicy”:{“Name”:“no”,“MaximumRetryCount”:0} 修改后配置:“RestartPolicy”:{“Name”:“always”,“MaximumRetryCount”:0} 最后启动容器。

Aug. 5, 2026

failed to start daemon failed to dial runcontainerdcontainerd.sock unknown

|
|

failed to start daemon: failed to dial “/run/containerd/containerd.sock”: unknown service contain… 在搭建k8s集群时,有两台主机中途重启过,然后出现docker无法启动的问题,通过journalctl -u docker.service发报如下错 误: Nov0814:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Main process exited, code=exited, status=1/FAILURE Nov0814:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Failedwith result ’exit-code’. Nov0814:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]:Failed to start DockerApplication ContainerEngine. Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Service RestartSec=2s expired, scheduling restart. Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Scheduled restart job, restart counter is at 2. Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]:StoppedDockerApplicationContainer Engine. Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]:StartingDockerApplicationContainer Engine… Nov0814:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: time=“2021-11- 08T14:54:05.000732056+08:00” level=info msg=“Starting up” Nov0814:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: chmod /var/lib/docker: read-only file system 可以看到是出现了read-only file system错误导致的,这是由于突然断电停机,导致服务器磁盘处于了保护状态,禁止写,解决 办法为执行mount -o remount rw / 执行完成后,再运行systemctl start docker.service,此时仍然失败,再使用journalctl -u docker.service查看日志,出现如下错 误 Nov 09 09:32:45 iZm5ehqytm0v0o8vdvzuykZ dockerd[45470]: time=“2021-11- 09T09:32:45.783089413+08:00” level=info msg=“Starting up”

Aug. 5, 2026

harbor docker login 400 Bad Request错误问题

|
|

这个问题是http访问方式的问题,需要在harbor所在的服务器添加以下代码,允许http不安全的操作 编辑 /etc/docker/daemon.json,设置允许访问的 HTTP 仓库地址。 { “insecure-registries”:[“11.8.36.21:8888”] }

Aug. 5, 2026

redis启动命令

|
|

sudo docker run -d -p 6379:6379 –name redis redis:latest redis-server

Aug. 5, 2026

root帐户进入容器:

|
|

root帐户进入容器: 执行 docker exec -it –user root 5dd1c0bc2d60 /bin/bash

Aug. 5, 2026

查看 docker 容器使用的资源

|
|

在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的。幸 运的是 docker 自己就提供了这样的命令:docker stats。 默认输出 docker stats 命令用来显示容器使用的系统资源。不带任何选项执行 docker stats 命令: $ docker stats 默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c。下面是输出的主要内容: [CONTAINER]:以短格式显示容器的 ID。 [CPU %]:CPU 的使用情况。 [MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。 [MEM %]:以百分比的形式显示内存使用情况。 [NET I/O]:网络 I/O 数据。 [BLOCK I/O]:磁盘 I/O 数据。 [PIDS]:PID 号。 只返回当前的状态 如果不想持续的监控容器使用资源的情况,可以通过 –no-stream 选项只输出当前的状态: $ docker stats –no-stream 这样输出的结果就不会变化了,看起来省劲不少。 只输出指定的容器 如果我们只想查看个别容器的资源使用情况,可以为 docker stats 命令显式的指定目标容器的名称或者是 ID:

$ docker stats –no-stream registry 1493 当有很多的容器在运行时,这样的结果看起来会清爽一些。这里的 registry 和 1493 分别是容器的名称和容器的 ID。注意,多个容器的名称或者是 ID 之间需要用空格进行分割。 细心的同学可能已经发现了,第一列不再显示默认的容器 ID,而是显示了我们传入的容器名称和 ID。基于此, 我们可以通过简单的方式使用容器的名称替代默认输出中的容器 ID: $ docker stats $(docker ps –format={{.Names}}) 用容器的名称替代 ID 后输出的结果是不是友好一些? 格式化输出的结果 我们在前面搞了点小手段把输出中的容器 ID 替换成了名称。其实 docker stats 命令支持我们通过 –format 选项 自定义输出的内容和格式: $ docker stats –format “table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}” 上面的命令中我们只输出了 Name, CPUPerc 和 Memusage 三列。下面是自定义的格式中可以使用的所有占位 符: .Container    根据用户指定的名称显示容器的名称或 ID。 .Name           容器名称。 .ID                 容器 ID。 .CPUPerc       CPU 使用率。 .MemUsage  内存使用量。

Aug. 5, 2026

华为欧拉服务器docker内部无法访问外部域名

|
|

华为欧拉服务器docker内部无法访问外部域名 解决办法,停掉防火墙及iptables,因为iptables版本太老,无法解析所致,去掉之后重启docker,docker会自动重新配 置网络,然后即可访问外部网络

Aug. 5, 2026

如何从 Docker 镜像里提取 dockerfile

|
|

从镜像中提取dockerfile的两种方法。 history 我们可以直接用docker自带的参数来查看镜像的dockerfile,但有一点就是看的不完全,只能 看到前面的一小部分; 例如: #docker history 镜像名称:标签docker history nginx:latest 虽然docker history命令可以看到所有历史层级的操作,但是还是需要手动去写Dockerfile,看 的不是那么全,所以我们还有一个能看到非常详细的工具👇↓👇 dfimage 首先他不是一个命令,他是一个工具。 dfimage是一个alpine的镜像,启动的时候,通过将docker.sock映射到容器内部来运行,通常 将这个操作做成别名,让他变成一个工具(做完别名不能换新的bash,否则该别名就会消 失,如果不想消失,可以做一个永久的别名,这样不管在任何地方都可以用了)

alias dfimage=“docker run -v /var/run/docker.sock:/var/run/docker.sock –rm alpine/dfimage” dfimage -sV=1.36 nginx:latest 我们拿nginx镜像试验下: 先pull一个nginx镜像,我这里之前有,就直接用了,接着通过上面提到的命令,别名一个 dfimage命令: 做好别名之后,通过dfimage去生成nginx的Dockerfile,其实就是启动一个容器工具,执行完 之后即删除该容器,镜像保留:

如果有报错,不能执行,估计就是缺少-sV=1.36,具体这个报错呢,暂时还没有研究,但是 加上-sV=1.36就可以。 #dfimage -sV=1.36 镜像名称:标签dfimage -sV=1.36 nginx:latest

即可看到完整的dockerfile,这个工具查看的非常的详细。 实操 alias dfimage=“docker run -v /var/run/docker.sock:/var/run/docker.sock –rm alpine/dfimage” docker images docker pull alpine/dfimage:latest dfimage -sV=1.36 192.168.100.71:31003/zhongtai/gradle:6.5.1

page1

page2

page2

page3

page3

page4

Aug. 5, 2026

如何在docker和宿主机之间复制文件

|
|

从主机复制到容器 从容器复制到主机

Aug. 5, 2026

新安装的docker服务器从harbor拉去镜像报错:

|
|

新安装的docker服务器从harbor拉去镜像报错: Error response from daemon: unauthorized: unauthorized to access repository: menhu/cas, action: pull: unauthorized to access repository: menhu/cas, action: pull 原因分析: 由于新机器没有登录Harbor私库,且仓库设置成是有的了,所以提示未授权访问存储库,只需docker登录一下私库即可 解决方案: 登录Docker镜像仓库(如果未指定镜像仓库地址,默认为官方仓库 Docker Hub) docker login 私库地址

Aug. 5, 2026

修改docker默认存储路径方法总结

|
|

默认情况下,docker镜像的默认存储路径是/var/lib/docker,这相当于直接挂载根目录下,然而如果在安装系统时选择了 自动分区,根分区一般不会分太大,CentOS会默认分50G,麒麟v4大概是100G。 docker的默认路径: 修改docker的默认路径,有三种方法 先创建新的docker目录 mkdir /home/docker centos在安装时如果选择默认分区,会把最大存储空间分给home,此处也可另外挂载一块磁盘,把新的docker目录建 在新磁盘上面 如果已经有镜像已经加载,已经有容器正在运行,请先停了docker服务,并把数据迁移到新目录中 1、修改docker.service vim /usr/lib/systemd/system/docker.service #在里面的EXECStart的后面增加–graph /home/docker: ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock – graph /home/docker 保存退出后执行以下命令 systemctl enable docker systemctl daemon-reload systemctl restart docker 2、编辑配置文件/etc/docker/daemon.json添加 “data-root”: “/data/docker vim /etc/docker/daemon.json { “registry-mirrors”: [“https://registry.docker-cn.com”], “data-root”: “/data/docker” “log-driver”:“json-file”, “log-opts”: {“max-size”:“100m”} } 保存退出后 重启docker应用

systemctl restart docker 3、使用软链接 使用软链接需要先把/var/lib下的docker目录删除,删除之前记得迁移数据。然后用下面命令创建软链接 ln -s /home/docker /var/lib systemctl restart docker 重启docker 以上就是修改docker默认路径之方法,可根据实际情况选用。

Aug. 5, 2026

一键清理垃圾自动清理_Docker垃圾清理

|
|

日常在宿主机上使用Docker对象时,如拉取镜像、长期运行或启停容器,就会产生大量的无容器依赖的 镜像、停止不用的容器,以及无容器使用的数据卷、网络等(这些Docker不会主动清理),这些Docker对 象垃圾的日积月累堆积,将会影响宿主机的运行性能,造成主机卡顿或空间资源的浪费等。因此,需要 对宿主机的垃圾进行清理。 对于每种类型的对象,Docker都提供了一个prune命令。也可以使用docker system prune一次清理多种 类型的对象。本文将说明如何使用prune命令来清理这些垃圾。 镜像清理 使用docker image prune命令清理不再使用的镜像,默认情况下,docker image prune仅清除挂起的镜 像。所谓挂起的镜像是指没有被标记且没有被任何容器引用镜像。命令如下: docker image prune 要删除现有容器未使用的所有镜像,请使用以下-a 标志: docker image prune -a 默认情况下,系统会提示y/n。要绕过提示,要使用-f或 –force标记。 还可以使用带有–filter标志的过滤表达式限制清理哪些镜像。 例如,要仅清理超过24小时前创建的镜像,命令如下: docker image prune -a –filter"until=24h" 容器清理 停止容器时一般不会自动删除容器,除非启动容器时使用了–rm标志。 要查看Docker主机上的所有容器,包括已停止的容器,可以使用如下命令: docker ps -a

STATUS为UP的容器为正在运行的容器。其他停止的容器的可写层仍占用磁盘空间。要清除这些垃圾, 可以使用如下命令: docker container prune 和清理镜像一样,可以使用 f或 –force 和 –filter参数,含义同上。 数据卷清理 同一数据卷可以被一个或多个容器使用,占用Docker主机上的空间。为防止数据被删除,Docker不会自 动删除卷。详细可参见《简述Docker数据管理》、《详解Docker数据卷》。 要删除数据卷,可以执行如下命令: docker volume prune 和清理镜像一样,可以使用 f或 –force 和 –filter参数,含义同上。 网络清理 Docker网络不会占用太多磁盘空间,但是创建了iptables 规则,桥接网络设备和路由表条目。要清理这 些内容,可以使用docker network prune清理任何容器未使用的网络。 docker network prune

Aug. 5, 2026

已启动的docker镜像如何修改为自动重启

|
|

1.如果已经启动了则可以使用如下命令: 2.docker update–restart=always

Aug. 5, 2026

Centos7下安装Docker

|
|

来源:https://www.cnblogs.com/qgc1995/archive/2018/08/29/9553572.html 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以 上, RHEL/Centos 的内核修补过, centos6.5的版本就可以——这个可以试试) 1,root账户登录,查看内核版本如下 [root@localhost ~]# uname -a Linux localhost.qgc 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 2,把yum包更新到最新(很多朋友说更新yum有问题,可以不更新试试,来自笔者的备注—2019年10月30日) [root@localhost ~]# yum update 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile

  • base: centos.ustc.edu.cn
  • extras: mirrors.aliyun.com
  • updates: centos.ustc.edu.cn 正在解决依赖关系 –>正在检查事务 —>软件包 bind-libs.x86_64.32.9.9.4-61.el7 将被升级 —>软件包 bind-libs.x86_64.32.9.9.4-61.el7_5.1 将被更新 —>软件包 bind-libs-lite.x86_64.32.9.9.4-61.el7 将被升级 —>软件包 bind-libs-lite.x86_64.32.9.9.4-61.el7_5.1 将被更新 —>软件包 bind-license.noarch.32.9.9.4-61.el7 将被升级 —>软件包 bind-license.noarch.32.9.9.4-61.el7_5.1 将被更新 … … 验证中 : 32:bind-license-9.9.4-61.el7.noarch 8/8 更新完毕: bind-libs.x86_64 32:9.9.4-61.el7_5.1 bind-libs-lite.x86_64 32:9.9.4-61.el7_5.1 bind-license.noarch 32:9.9.4-61.el7_5.1 bind-utils.x86_64 32:9.9.4-61.el7_5.1 完毕! [root@localhost ~]#

3,安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile

Aug. 5, 2026

centos8安装Harbor-2.3.5(docker镜像管理系统)

|
|

依赖环境: Openssl Docker engine Version 17.06.0-ce+ or higher Docker ComposeVersion 1.18.0 or higher 第一步先安装docker 参考docker安装教程 第二部安装 Openssl yum install openssl openssl-devel 第三步安装Docker Compose 下载(注意替换版本号) curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s-uname -m` > /usr/local/docker-compose 授权: sudo chmod +x docker-compose 建立软连接: sudo ln -s /usr/local/docker-compose /usr/bin/docker-compose 查看是否安装成功: docker-compose –version 第四步安装harbor 1、下载安装包 下载地址:/github.com/goharbor/harbor/releases直接选择编译好的包 这里有两个包Harbor offline installer 和 Harbor online installer,两者的区别的是 Harbor offline installer 里就包含的 Harbor 需要使用的镜像文件 下载成功,并解压 [root@master ]# tar zxf harbor-offline-installer-v1.10.1.tgz -C /data/ 进入解压的目录,并 ls [root@master]#cd/data/harbor/ [root@masterharbor]#ls common.shharbor.v1.10.1.tar.gzharbor.ymlinstall.shLICENSEprepare 2、编辑配置文件 harbor.yml 就是harbor的配置文件 harbor的数据目录为/data 编辑harbor.yml,修改hostname、https证书 路径、admin密码

Aug. 5, 2026

containerd安装与使用

|
|

一、Containerd 安装 下载二进制安装包 github链接地址:https://github.com/containerd/containerd/releases 上传安装包到服务器并开始解压安装 tar xf containerd-1.6.6-linux-amd64.tar.gz cp -r bin/* /usr/local/bin 创建/etc/system/system/containerd.service systemd service启动管理文件: 修改ExecStart=/usr/local/bin/containerd为当前containerd文件路径

Copyright The containerd Authors.

Licensed under the Apache License, Version 2.0 (the “License”);

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an “AS IS” BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

[Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/containerd Type=notify Delegate=yes KillMode=process

Aug. 5, 2026

containerd运行报错failed to locate iptables

|
|

FATA[0000] failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: time=“2023-10-31T10:45:16Z” level=fatal msg=“failed to call cni.Setup: plugin type=“bridge” failed (add): failed to locate iptables: exec: “iptables”: executable file not found in $PATH” Failed to write to log, write /var/lib/nerdctl/1935db59/containers/default/564fab9f6e1bf0ece199473db0d4abbdbda7c44909ef 7ec08610dccb4ab0c657/oci-hook.createRuntime.log: file already closed: unknown 是因为containerd运行需要iptables插件 ubuntu新版的没有这个插件所以需要手动安装

Aug. 5, 2026

ctr crictl nerdctl配置私有仓库地址

|
|

containerd 配置私有仓库地址 老版的是修改/etc/containerd/config.toml 修改配置文件如下: [plugins.“io.containerd.grpc.v1.cri”.registry.configs] [plugin.“io.containerd.grpc.v1.cri”.registry.configs.“218.29.223.194:31003”.tls] insecure_skip_verify = true [plugin.“io.containerd.grpc.v1.cri”.registry.configs.“218.29.223.194:31003”.auth] username = “admin” password = “5201314lk.L” [plugins.“io.containerd.grpc.v1.cri”.registry.headers] [plugins.“io.containerd.grpc.v1.cri”.registry.mirrors] [plugin.“io.containerd.grpc.v1.cri”.registry.mirrors.“docker.io”] endpoint = [“https://dxc7f1d6.mirror.aliyuncs.com”] [plugin.“io.containerd.grpc.v1.cri”.registry.mirrors.“218.29.223.194:31003”] endpoint = [“https://218.29.223.194:31003”] 新版本的直接在/etc/containerd/config.toml里配置 registry.mirrors已经失效 了。 最新的配置方法是只在config.toml 中指定hosts.toml的config_path下相应域 名下 特别注意config_path不能设置为/etc/containerd/certs.d [plugins.“io.containerd.grpc.v1.cri”.registry] config_path = "" #这里不能配 /etc/containerd/certs.d 配了出错 如下配置: mkdir /etc/containerd/certs.d/218.29.223.194:31003

vim hosts.toml server = “https://218.29.223.194:31003” [host.“https://218.29.223.194:31003”] capabilities = [“pull”, “resolve”, “push”] skip_verify = true 修改完,需要daemon-reload, restart containerd ctr无法配置证书,不生效,所以需要加上–skip-verify sudo ctr -n k8s.io images pull 218.29.223.194:31003/library/test-k8s:1 –skip-verify

Aug. 5, 2026

docker 安装 bitnami mysql 卡在Installing database无法启动

|
|

如图 镜像全名 bitnami/mysql:8.0.35-debian-11-r0 启动命令 docker run -p 3306:3306 –name mysql -v /data/mysql/conf/my.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro -v /data/mysql/logs:/opt/bitnami/mysql/logs -v /data/mysql/data:/bitnami/mysql/data -e MYSQL_ROOT_PASSWORD=123456 -d bitnami/mysql:8.0.35-debian-11-r0 环境准备 root@DESKTOP-1M3C1UI:mkdir -p /data/mysql/data /data/mysql/conf /data/mysql/logs root@DESKTOP-1M3C1UI:/data/mysql# ls conf data logs root@DESKTOP-1M3C1UI:vim my.cnf [mysqladmin] user= [mysqld] skip_name_resolve explicit_defaults_for_timestamp basedir=/opt/bitnami/mysql port=3306 tmpdir=/opt/bitnami/mysql/tmp socket=/opt/bitnami/mysql/tmp/mysql.sock pid_file=/opt/bitnami/mysql/tmp/mysqld.pid max_allowed_packet=16M

bind_address=0.0.0.0 log_error=/opt/bitnami/mysql/logs/mysqld.log slow_query_log=0 long_query_time=10.0 character_set_server=utf8mb4 plugin_dir=/opt/bitnami/mysql/lib/plugin datadir=/bitnami/mysql/data [client] port=3306 socket=/opt/bitnami/mysql/tmp/mysql.sock default_character_set=utf8mb4 plugin_dir=/opt/bitnami/mysql/lib/plugin [manager] port=3306 socket=/opt/bitnami/mysql/tmp/mysql.sock pid_file=/opt/bitnami/mysql/tmp/mysqld.pid 解决问题 将以上docker启动命令加上 -e BITNAMI_DEBUG=true 可以查看启动详细日志 发现是上面创建的文件的权限问题修改文件夹权限 chown -R 1001.1001 /data/mysql/ 启动成功 最后修改可远程连接就可以正常使用了

Aug. 5, 2026

docker 启动nginx

|
|

sudo docker run –name nginx -p 89:80 -v /home/lib/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/lib/nginx/log:/var/log/nginx -v /home/lib/nginx/conf/conf.d:/etc/nginx/conf.d –restart=always -d nginx:latest 上面的命令可以启动但是无法访问,原因是conf.d文件夹下没有配置文件,只有nginx.conf,去掉conf.d之后就可以了 sudo docker run –name nginx -d -p 8700:80 -p 2600:3600 -p 2700:3700 -v /home/lib/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/lib/nginx/log:/var/log/nginx -v /home/lib/nginx/html:/usr/share/nginx/html –restart=always nginx:latest 第一个 -p 是nginx本身的端口 第二、三个 -p 是nginx代理的一个服务的端口 前面的是容器的端口后面的是容器内部nginx监听的端口 server { listen 3600; //监听的端口(既是你访问的代理端口) server_name 192.168.30.129;//你访问的地址可以是域名 charset utf-8;//字符集 location / { //前端文件放的地方,此处注意()前面是挂载的本地地址,后面是容 器内部真实路径,当你访问代理的时候容器会向()去找,经过挂载后会向宿主机 ()去找,但是配置文件里面要写容器内部的地址,配置文件时给容器内nginx使用的,所以nginx 的配置以容器内的为准,且只识别容器内的路径,若你配置()是找不到的,会报404,且日志会报 (2019/09/23 02:50:34 [error] 7#7: *1 “/home/data/dma/designer/front/index.html” is not found (2: No such file or directory), client: 192.168.30.168, server: 192.168.30.129, request: “GET / HTTP/1.1”, host: “192.168.30.129:2700”) root /usr/share/nginx/html/dma-designer; index index.html index.htm; #try_files $uri $uri/ /index.html; } location /dma/{ proxy_pass http://192.168.30.129:3600/dma/; } location /dmm_cas/ { proxy_pass http://192.168.30.72:8080/cas; } error_page 500 502 503 504 /50x.html;

Aug. 5, 2026

Docker 容器镜像删除

|
|

1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker rm $(docker ps -a -q) 2.查看当前有些什么images docker images 3.删除images,通过image的id来指定删除谁 docker rmi 想要删除untagged images,也就是那些id为的image的话可以用 docker rmi $(docker images | grep “^"| awk “{print $3}”) 要删除全部image的话 docker rmi $(docker images -q)

Aug. 5, 2026

docker安装命令

|
|

wget -qO- https://get.docker.com/ | sh 安装docker可以使用阿里云加速安装过程 curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - 下载镜像也可以使用阿里云加速 sudo tee /etc/docker/daemon.json «-‘EOF’ { “registry-mirrors”:[“https://nbijnqvd.mirror.aliyuncs.com”] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

Aug. 5, 2026

docker常用安装服务命令

|
|

rabbitmq docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3.7.25- management-alpine docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3.7.25- management-alpine docker.io/rabbitmq:3.7.25-management-alpine docker run -id –name rabbitmq -v /data/rabbitmq:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=rabbitmq -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:3.7.25-management-alpine es docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/elasticsearch:7.12.0 docker run -d –name es1 -e “ES_JAVA_OPTS=-Xms512m -Xmx512m”
-e “discovery.type=single-node”
-v /opt/elasticsearch/data:/usr/local/elasticsearch7.12.0/data
-v /opt/elasticsearch/plugins:/usr/local/elasticsearch7.12.0/plugins -v /opt/elasticsearch/logs:/usr/local/elasticsearch7.12.0/logs
–privileged
-p 9200:9200
-p 9300:9300 redis docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:6-alpine docker run -d –name redis –restart=always -v /opt/redis/data:/data -p 6379:6379 3900abf41552 redis-server –requirepass 123456 chmod -R 755 /home/dawenzi/docker/redis/data docker run -d
–name redis
-p 6379:6379 \

Aug. 5, 2026

Docker常用命令

|
|

设置为自启动: chkconfig docker on 下载docker镜像 docker pull rabbitmq:management 启用rabbitmq 也可以用: sudo docker start rabbitmq(NAMES) 或者用: sudo docker start 62332131(CONTAINER ID ) sudo docker run -p 192.168.11.30:8080:8081 tomcat:latest(docker run -d -it -p 8000:80 tang1:latest /bin/bash)(不好使) sudo docker run -d –hostname tomcat –name tomcat9 -p 8083:8080 –restart=always tomcat:9 sudo docker run -d –hostname rabbit –name rabbit2 -v /data/rabbit2:/var/lib/rabbitmq -p 5673:5672 -p 15673:15672 –restart=always rabbitmq:management sudo docker load < taomcat.tar # 导入镜像 启动tomcat并将端口与文件映射到制定地方 sudo docker run -d –name tomcat -v /home/dou/cas/:/usr/local/tomcat -p 8083:8080 – restart=always tomcat sudo docker run –name tomcat1 -p 8090:8080 -v /home/data/tomcat/:/usr/local/tomcat/webapps/ –restart=always -d tomcat 关闭rabbitmq

Aug. 5, 2026

docker开启2375端口

|
|

修改/etc/docker/daemon.json,添加hosts部分 { “hosts”: [ “unix:///var/run/docker.sock”, “tcp://0.0.0.0:2375” ], “registry-mirrors”: [ “https://docker.hpcloud.cloud”, “https://docker.m.daocloud.io”, “https://docker.unsee.tech”, “https://docker.1panel.live”, “http://mirrors.ustc.edu.cn”, “https://docker.chenby.cn”, “http://mirror.azure.cn”, “https://dockerpull.org”, “https://dockerhub.icu”, “https://hub.rat.dev” ] } 修改/usr/lib/systemd/system/docker.service 修改如下:

ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock

ExecStart=/usr/bin/dockerd 重启 划重点:systemctl daemon-reload 然后:systemctl restart docker

Aug. 5, 2026

docker启动mysql镜像

|
|

docker run -p 3306:3306 –name mysql-5.7 -v $PWD/home/dawenzi/mysql/conf/my.cnf:/etc/mysql//my.cnf -v $PWD/home/dawenzi/mysql/logs:/logs -v $PWD/home/dawenzi/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 docker run -d -p 8088:8088 -v D:/Docker/Superset:/home/superset amancevice/superset -d:表示后台运行 -p:表示宿主机和容器的端口映射,以上面为例冒号前的9088是你自己主机的端口号,冒号后的8088是容器自身的端口 号 -v:表示宿主机与容器的文件路径映射,以上面为例D:/Docker/Superset是你自己主机的目录,/home/superset是容器内 应用目录。 docker run -p 3306:3306 -v /home/lib/mysql/data:/var/lib/mysql:rw -v /home/lib/mysql/log:/var/log/mysql:rw -v /home/lib/mysql/config/my.cnf:/etc/mysql/my.cnf:rw -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=root –name mysql8 –restart=always -d mysql docker run -p 3306:3306 –name mysql -v /home/lib/mysql/conf:/etc/mysql/conf.d -v /home/lib/mysql/logs:/logs -v /home/lib/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root –restart=always -d mysql:latest 配置文件(mysql8): my.cnf 出现连接不上时: https://blog.csdn.net/mxskymx/article/details/88765072  1.登录mysql :   mysql -u root -p 2.输入密码:    Enter password:  xxxxx —— Server version: 8.0.15 MySQL Community Server - GPL 3.进入mysql数据库:use mysql; 4.设置允许远程用户访问:

Aug. 5, 2026

docker容器间的相互通信

|
|

一、根据对外暴漏的端口通信 二、每个容器都会被docker分配一个ip,一般是172开头的,直接根据ip通 信,但是这个ip每次都会变,实用性不强。 三、使用–link参数,–link就是在hosts里面添加映射(官方不推荐使用) 第一步先启动访问目标容器 docker run -it -d -p 9081:80 –name nginx1 nginx 第二步启动客户端容器,并使用–link指定目标服务器的访问别名(第一个是容器的名称/ID,第二个是访问别 名) docker run -it -d -p 9091:80 –link nginx1:qyg –name nginx2 nginx docker exec -it nginx2 /bin/bash root@d323c08453f0:/# cat /etc/hosts 127.0.0.1localhost ::1localhost ip6-localhost ip6-loopback fe00::0ip6-localnet ff00::0ip6-mcastprefix ff02::1ip6-allnodes ff02::2ip6-allrouters 172.17.0.3qyg 274ba29d1624 nginx1 172.17.0.4d323c08453f0 四、自定义bridge网桥 首先在主机上创建一个网络,命令如下: docker network create mynet docker network create \ –driver bridge \ – subnet=172.25.0.0/16 \ –gateway=172.25.0.1 \ –ip-range=172.25.50.0/24 \ –aux- address=“my-router=172.25.50.10”\ my-custom-network // 已启动的连接如网络 docker network connect –alias db wisemapping-network mysql // 检查王国有哪些镜像

Aug. 5, 2026

Docker无法在WSL2的Ubuntu启动的问题

|
|

Docker无法在WSL2的Ubuntu启动的问题 今天在更新了WSL2上的Ubuntu22.04版本,在安装Docker后无法启动,查看Docker的日志显示如下的错误 INFO[2022-04-22T16:14:55.718999500+08:00] stopping event stream following graceful shutdown error="" module=libcontainerd namespace=moby INFO[2022-04-22T16:14:55.719787400+08:00] stopping event stream following graceful shutdown error=“context canceled” module=libcontainerd namespace=plugins.moby INFO[2022-04-22T16:14:55.719906400+08:00] stopping healthcheck following graceful shutdown module=libcontainerd failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables failed: iptables –wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER- ISOLATION-STAGE-1 (exit status 4)) 原因是由于新的ubuntu系统使用了iptables-nft,而WSL2不支持导致的。 可以通过以下命令进行修改 sudo update-alternatives –config iptables There are 2 choices for the alternative iptables (providing /usr/sbin/iptables). Selection Path Priority Status 0 /usr/sbin/iptables-nft 20 auto mode 1 /usr/sbin/iptables-legacy 10 manual mode 2 /usr/sbin/iptables-nft 20 manual mode Press to keep the current choice[*], or type selection number: 1 update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode 修改完成后重启Docker服务即可。

Aug. 5, 2026

docker因系统变成只读导致的无法启动

|
|

failed to start daemon: failed to dial “/run/containerd/containerd.sock”: unknown service contain… 在搭建k8s集群时,有两台主机中途重启过,然后出现docker无法启动的问题,通过journalctl -u docker.service发报如下错 误: Nov 08 14:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE Nov 08 14:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Failed with result ’exit-code’. Nov 08 14:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: Failed to start Docker Application Container Engine. Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Service RestartSec=2s expired, scheduling restart. Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Scheduled restart job, restart counter is at 2. Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: Stopped Docker Application Container Engine. Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: Starting Docker Application Container Engine… Nov 08 14:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: time=“2021-11- 08T14:54:05.000732056+08:00” level=info msg=“Starting up” Nov 08 14:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: chmod /var/lib/docker: read-only file system 可以看到是出现了read-only file system错误导致的,这是由于突然断电停机,导致服务器磁盘处于了保护状态,禁止写,解决 办法为执行mount -o remount rw / 执行完成后,再运行systemctl start docker.service,此时仍然失败,再使用journalctl -u docker.service查看日志,出现如下错 误 Nov 09 09:32:45 iZm5ehqytm0v0o8vdvzuykZ dockerd[45470]: time=“2021-11- 09T09:32:45.783089413+08:00” level=info msg=“Starting up” Nov 09 09:32:45 iZm5ehqytm0v0o8vdvzuykZ dockerd[45470]: time=“2021-11- 09T09:32:45.785039235+08:00” level=info msg=“parsed scheme: "unix"” module=grpc

Aug. 5, 2026

docker中安装Oracle 11g

|
|

1.安装docker 已完成,记录于centos中docker安装mysql 2.获取Oracle 11g docker镜像 [root@plmomn-gw ~]# docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g Using default tag: latest latest: Pulling from helowin/oracle_11g [DEPRECATION NOTICE] Docker Image Format v1 and Docker Image manifest version 2, schema 1 support is disabled by default and will be removed in an upcoming release. Suggest the author of registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latest to upgrade the image to the OCI Format or Docker Image manifest v2, schema 2. More information at https://docs.docker.com/go/deprecated-image-specs/ 3.创建容器 [root@plmomn-gw ~]# docker run -d –privileged -p 1521:1521 –name oracle11g – restart=always -v /home/oracle/data:/data/oracle registry.cn- hangzhou.aliyuncs.com/helowin/oracle_11g 命令说明: -p:端口映射,主机端口:容器端口 -v:挂载文件夹,主机文件夹:容器文件夹 –privileged 允许挂在数据卷,默认读写权限rw 创建成功 4.修改root密码 进入容器,切换到root用户 [root@plmomn-gw ~]# docker exec -it oracle11g bash [oracle@3fe959481973 /]$ su root Password: helowin 修改root用户密码,失败 [root@3fe959481973 /]# passwd

Aug. 5, 2026

查看docker启动日志docker logs

|
|

sudo docker logs –tail=100 bz-inner-cst 查看docker内部日志

Aug. 5, 2026

containerd基础概念

|
|

docker-cli:这是一个命令行工具,它是用来完成 docker pull ,build,run,exec containerd:这是一个管理和运行容器的守护进程。它推送和拉动镜像,管理存储和网络,并监督容器的运 行。 runc:这是低级别的容器运行时间(实际创建和运行容器的东西)。它包括 libcontainer,一个用于创建容 器的基于 Go 的本地实现。实现了容器启停、资源隔离等功能。 更换 Containerd 后,以往我们常用的 docker 命令也不再使用,取而代之的分别是 crictl 和 ctr 两个 命令客户端。 crictl 是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜 像。 ctr 是 containerd 的一个客户端工具。 ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认 为 crictl 是用于 k8s 的。 一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装 了 containerd 服务后就可以操作 ctr 命令。 使用crictl命令之前,需要先配置/etc/crictl.yaml如下: runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false 或者使用命令: crictl config runtime-endpoint unix:///run/containerd/containerd.sock crictl config image-endpoint unix:///run/containerd/containerd.sock 由于 Containerd 也有 namespaces 的概念,对于上层编排系统的支持,ctr 客户端主要区分了 3 个命名 空间分别是k8s.io、moby和default, k8s会使用k8s.io作为命名空间, containerd默认会使用default。 docker 其实也是默认调用的 containerd,事实上 docker 使用的 containerd 下面的命名空间默认 是 moby。 以上我们用crictl操作的均在k8s.io命名空间,使用ctr 看镜像列表就需要加上-n 参数。crictl 是只有一 个k8s.io命名空间,但是没有-n 参数。 【温馨提示】ctr images pull 拉取的镜像默认放在default,而 crictl pull 和 kubelet 默认拉取的镜 像都在 k8s.io 命名空间下。所以通过ctr导入镜像的时候特别注意一点,最好指定命名空间。 注意-n不能放在命令最后面,下面几行查看的镜像是一样的 ctr -n=k8s.io image ls ctr -n k8s.io image ls

Aug. 5, 2026

Debian 11 安装postgresql 14.2

|
|

1、安装基础包 apt-get install -y gnupg2 sudo vim wget 2、添加源 sudo sh -c ’echo “deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main” > /etc/apt/sources.list.d/pgdg.list' wget –quiet -O- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 3、安装postgresql-14 apt-get update&&apt-get -y install postgresql-14 4、添加访问权限 sudo sed -i ‘/^local/s/peer/trust/’/etc/postgresql/14/main/pg_hba.conf sudo sed -i ‘/^host/s/ident/md5/’/etc/postgresql/14/main/pg_hba.conf 5、允许ipv4和ipv6访问 sudo vim /etc/postgresql/14/main/pg_hba.conf

添加下面这两行在图片位置 host all all 0.0.0.0/32 md5 host all all 0.0.0.0/0 md5 sudo vim /etc/postgresql/14/main/postgresql.conf 添加这行在图片位置 listen_addresses=’*’

6、重启数据库、设置开机自启 sudo systemctl restart postgresql sudo systemctl enable postgresql 7、创建角色名为admin密码为MyPassword的角色 sudo -u postgres psql CREATE ROLE admin WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD ‘MyPassword’; 8、连接数据库 数据库连接工具:Download | DBeaver Community 选择PostgreSQL

Aug. 5, 2026

postgresql restart

|
|

默认超级用户(root)不能启动postgresql,需要建用户postgres。 安装完毕后,系统会创建一个数据库超级用户 postgres,密码为空。 默认psql本地登录是不需要密码的,即使我们设置了密码,也不需要密码就能登录。应为配置文件 pg_hba.conf中的local设置为trust

su - postgres 与下面的相同

sudo -i -u postgres

这时使用以下命令进入 postgres,输出以下信息,说明安装成功: ~$ psql psql (9.5.17) Type “help” for help. postgres=# 查看版本 psql -V 输入以下命令退出 PostgreSQL 提示符: \q PostgreSQL 安装完成后默认是已经启动的,但是也可以通过下面的方式来手动启动服务。 sudo /etc/init.d/postgresql start # 开启 sudo /etc/init.d/postgresql stop # 关闭 sudo /etc/init.d/postgresql restart # 重启 创建数据库test CREATE DATABASE test; 创建用户 create user server with password ‘123456’; 查看用户列表 \du 使用 \l 用于查看已经存在的数据库: 接下来我们可以使用 \c + 数据库名来进入数据库: 我们可以使用 \d 命令来查看表 在系统的命令行查看,我么可以在连接数据库后面添加数据库名来选择数据库: psql -h localhost -p 5432 -U postgres runoobdb

Aug. 5, 2026

获取表的字段名

|
|

select COLUMN_NAME from information_schema.columns where table_name=‘TableName’

Aug. 5, 2026

详解PostgreSql数据库对象信息及应用

|
|
  1. 查询数据库对象 下面通过示例分别展示如何查询各种数据库对象。 1.1 表查询 PostgreSql 表信息可以从information_schema.tables 或 pg_catalog.pg_tables 视图中查询: select * from information_schema.tab 1 les; 2 select * from pg_catalog.pg_tables; 1.2 查询Schema 获取用户当前选择的schema: 1select current_schema(); 返回数据库中所有schema: select * from information_schema.sch 1emata; 2select * from pg_catalog.pg_namespac e 1.3 查询数据库 查询当前选择的数据库: 1select current_database(); 返回服务器上所有数据库: 1select * from pg_catalog.pg_database 1.4 查询视图 查询数据库中所有schema中的所有视图: select * from information_schema.vie 1 ws 2 3 select * from pg_catalog.pg_views; 1.5 查询表的列信息 查询某个表的列信息:

SELECT * FROM information_schema.columns WHERE 6    table_name = ’employee' ORDER BY ordinal_position; 1.6 查询索引信息 查询数据库中所有索引信息; 1select * from pg_catalog.pg_indexes; 1.6 查询函数信息 返回数据库中所有函数。对于用户定义函数,routine_definition 列会有函数体: select * from information_schema.rou 1tines where routine_type = ‘FUNCTION’; 1.7 触发器 查询数据库中所有触发器,action_statemen类别包括触发器body信息: select * from information_schema.tri 1 ggers; 2. 查询表占用空间 2.1 查询表占用空间 实际应用中,通常需要表占用磁盘空间情况,我们可以利用系统表实现: SELECT nspname || ‘.’ || relname AS"relation", pg_size_pretty(pg_total_relation_si 1 ze(C.oid))AS “total_size” 2 FROM pg_class C 3 LEFT JOIN pg_namespace N ON (N.oid 4 = C.relnamespace) 5 WHERE nspname NOT IN (‘pg_catalog’, 6 ‘information_schema’) 7 AND C.relkind <> ‘i’ 8 AND nspname !~ ‘^pg_toast’ 9 ORDER BY pg_total_relation_size(C.o id) DESC LIMIT 5; 示例输出:

Aug. 5, 2026

游标 mysql

|
|

协和2.5柜子数据初始化及程序更新说明.docx 数据初始化存储过程.txt

Aug. 5, 2026

语法

|
|

CREATEDATABASEIFNOTEXISTS boot_tool CHARACTERSET utf8mb4 collate utf8mb4_general_ci;

Aug. 5, 2026

资源文件

|
|

资源文件properties: url=jdbc:mysql://localhost/studentManagement?useUnicode=true&characterEncoding=utf-8 driver=com.mysql.jdbc.Driver userName=root password=root 工具程序: package com.dawenzi.conn; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Properties; /**

  • Created by root on 16-12-14. */ public class ConnectionDatabase { private static Properties properties=new Properties(); static { try { properties.load(ConnectionDatabase.class.getResourceAsStream(“ConnectionMessage.properties”)); } catch (IOException e) { e.printStackTrace(); } } public Connection conn; public PreparedStatement pst=null; public String sql=null; public void createConn(){ try { Class.forName(properties.getProperty(“driver”)); conn= DriverManager.getConnection( properties.getProperty(“url”), properties.getProperty(“userName”), properties.getProperty(“password”));

if (sql!=null){ pst=conn.prepareStatement(sql); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public void close(){ try { this.conn.close(); if (sql!=null){ pst1.close(); } } catch (SQLException e) { e.printStackTrace(); } } }

Aug. 5, 2026

mysql8安装默认路径

|
|

linux应用之mysql8安装 1、安装前工作 在安装前需要确定现在这个系统有没有 mysql,如果有那么必须卸载(在 centos7 自带的是 mariaDb 数据库,所以第 一步是卸载数据库)。 #查看mariadb数据库:rpm -qa | grep mariadb #卸载mariadb数据库:rpm -e –nodeps  mariadb文件名 #查看 mysql 数据库:rpm -qa | grep -i mysql #卸载 mysql 数据库:rpm -e mysql文件名 # 如果有关联文件,不能直接卸载。可以用一下命令强制卸载:rpm -e - -nodeps mysql文件名) #删除etc目录下的my.cnf文件:rm /etc/my.cnf 2、官网下载 下载成功之后,上传到云服务(我是上传到/usr/src目录下)可先安装rz命令(yum install lrzsz -y) 3、解压到local下面,并且重新命名为mysql 解压命令:tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ 重命名命令:mv mysql-8.0.13-linux-glibc2.12-x86_64/ mysql 4、添加mysql用户组和用户 #首先检查mysql用户和组是否存在 cat /etc/group | grep mysql

cat /etc/passwd | grep mysql #添加mysql用户和组 groupadd mysql useradd -r -g mysql mysql 5、初始化mysql配置表 # chown -R mysql:mysql ./  修改当前目录为mysql用户

Aug. 5, 2026

mysql8安装自定义路径

|
|

一、下载 链接:https://dev.mysql.com/downloads/mysql/ 点击 Download,如下图:

没有登陆,点击 “No thanks,just start my downlaod.” 即可下载 二、安装 2.1 将下载的mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz上传到服务器,并解压为tar 命令:xz -dev mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz 如下图: 2.2 解压mysql-8.0.23-linux-glibc2.12-x86_64.tar 到目录 /opt/module下面 解压命令:tar -xvf mysql-8.0.23-linux-glibc2.12-x86_64.tar -C /opt/module/ 重命名:mv mysql-8.0.23-linux-glibc2.12-x86_64 mysql8 如下图, 2.3 进入mysql解压后的目录mysql8,并创建存放mysql日志的目录 cd /opt/module/mysql8/ mkdir data

2.4 配置mysql环境变量 MYSQL_HOME=/opt/module/mysql8/bin PATH=$PATH:$MYSQL_HOME export MYSQL_HOME PATH 如下图: 配置完成后重载: source /etc/profile 2.5 创建mysql用户组和mysql用户 groupadd mysql useradd -g mysql mysql 如下图: 2.6 关联myql用户到mysql用户组中 进入到mysql8所在目录,此例中为/opt/module/ chown -R mysql:mysql ./ chown -R mysql:mysql ./data/ chown -R mysql ./data/ chown -R mysql ./ 2.7 更改mysql安装文件夹mysql的权限 [root@localhost module]# chmod -R 755 mysql8 2.8 安装libaio依赖包 查询是否安装libaio依赖包

Aug. 5, 2026

mysql修改重置自增id不生效

|
|

一、mysql8修改AUTO_INCREMENT的值。执行sql如下,“tablename”为数据表名称。 注意:修改的auto_increment的值得大于现有主键的最大值。否则,语句不报错,但不会生效。 ALTER TABLE tablename auto_increment=1; 二、修改后查询一下auto_increment的值,执行下面sql可查询(结果发现还是修改之前的值) SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name=“tablename”; 三、分析数据表。重新分析一下数据表即可,执行如下sql。 analyze table tablename; 分析数据表之后,在执行第二步中的查询即可看到auto_increment的值修改成功。

Aug. 5, 2026

mysql主从复制

|
|

mysql 版本 8.0.28 master192.168.2.123 slave192.168.2.124 部署请参考(linux下tar包mysql8安装(经过本人多次测试)) 配置文件如下: my.cnf 1、主从服务器分别作以下操作: 1.1、版本一致 1.2、初始化表,并在后台启动mysql 1.3、修改root的密码 2、修改主服务器master #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必须]启用二进制日志 server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段 3、修改从服务器slave: #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[不是必须]启用二进制日志 server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段 4、重启两台服务器的mysql /etc/init.d/mysql restart 5、在主服务器上建立帐户并授权slave:

#/usr/local/mysql/bin/mysql -uroot -p123456 #use mysql; #CREATE USER ‘slave’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’; #mysql> GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’; //一般不用root帐号 ‘%‘表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如 192.168.137.141,加强安全。 6、登录主服务器的mysql,查询master的状态 mysql>show master status; ±—————–±———±————-±—————–+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | ±—————–±———±————-±—————–+ | bin.000005 | 694 | | | ±—————–±———±————-±—————–+ 1 row in set (0.00 sec) 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化 7、从服务器设置普通用户只读模式 mysql>create user ‘test’@’%’ identified by ‘123456’; // 创建普通用户,可以远程连接 mysql> grant select on . to test@’%‘identified by ‘123456’; //授权所有库,只能查询操作 mysql> grant all privileges on . to test@’%‘identified by ‘123456’; //这是授予所有权限 关于mysql创建用户以及权限,下面有详细说明;这里只是做了主从复制避免从库添加数据做准备; 从库远程登录就用刚才设置的普通的只要查询权限的账号去登录,避免导致主从出错 8、配置从服务器Slave: 在从库上配置需要连接的主库信息: mysql>change master to master_host=‘192.168.2.123’,master_user=‘slave’,master_password=‘123456’, master_log_file=‘bin.000005’,master_log_pos=694; //注意不要断开,308数字前后无单引号。 Mysql>start slave; //启动从服务器复制功能

Aug. 5, 2026

oracle linux下yum安装mysql8初始化后无法启动问题 mysqld File auto.cnf not found

|
|

yum安装没有问题 执行初始化命令执行也没有问题 mysqld –user=mysql –datadir=/var/lib/data –lower-case-table-names=1 –initialize- insecure 执行启动命令无法启动 查看mysql的日志如下 2023-09-21T08:47:39.248185Z 0 [System] [MY- 013169] [Server] /usr/sbin/mysqld (mysqld 8.0.34) initializing of server in progress as p rocess 14205 2023-09-21T08:47:39.257367Z 1 [System] [MY- 013576] [InnoDB] InnoDB initialization has started. 2023-09-21T08:47:39.815707Z 1 [System] [MY- 013577] [InnoDB] InnoDB initialization has ended. 2023-09-21T08:47:41.364490Z 6 [Warning] [MY- 010453] [Server] root@localhost is created with an empty password ! Please consider switc hing off the –initialize-insecure option. 2023-09-21T08:48:23.110943Z 0 [System] [MY- 010116] [Server] /usr/sbin/mysqld (mysqld 8.0.34) starting as process 14314 2023-09-21T08:48:23.116456Z 0 [Warning] [MY- 010075] [Server] No existing UUID has been found, so we assume that this is the first tim e that this server has been started. Generating a new UUID: 9f31a861-585b-11ee-a8e0- 00505685cbf9. mysqld: File ‘/var/lib/data/auto.cnf’ not found (OS errno 13 - Permission denied) 2023-09-21T08:48:23.116508Z 0 [ERROR] [MY- 010183] [Server] Failed to create file(file: ‘/var/lib/data/auto.cnf’, errno 13) 2023-09-21T08:48:23.116516Z 0 [ERROR] [MY- 010076] [Server] Initialization of the server’s UUID failed because it could not be read from the auto.cnf file. If this is a new server, the initialization failed because it was not possible to generate a new UUID. 2023-09-21T08:48:23.116543Z 0 [ERROR] [MY-010119] [Server] Aborting 2023-09-21T08:48:23.116995Z 0 [System] [MY- 010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.34)  MySQL Community Ser ver - GPL. 一直报 mysqld: File ‘/var/lib/data/auto.cnf’ not found (OS errno 13 - Permissio n denied)

Aug. 5, 2026

sql优化

|
|

SELECT t.id AS id, t.count AS count, t.basenum AS bnum, c1.cst_name AS NAME, v.vendor_name AS vname, m.name AS mname, c1.cst_code AS cstcode, c1.wrap_name AS wrapname FROM ( SELECT d.id AS id, d.hospital_consumable_code AS hcode, c.status AS status, s.id AS sid, d.base_num AS basenum, COUNT(*) AS count FROM consumables_inventory c LEFT JOIN department_store_house d ON c.department_store_house_code = d.code LEFT JOIN store_house s ON s.code = d.store_house_code WHERE STATUS = 3 AND s.id = 1 GROUP BY id, hcode, status, sid, basenum – HAVING – status=3 AND sid = 1 ) AS t LEFT JOIN hospital_consumable h ON h.code = t.hcode LEFT JOIN consumables_dict c1 ON h.consumables_dict_code = c1.code LEFT JOIN vendor_dict v ON v. CODE = c1.vendor_dict_code LEFT JOIN manufacturer m ON m. CODE = c1.manufacturer_code WHERE t.count < t.basenum LIMIT 0,10

Aug. 5, 2026

添加外键失败(cannot add foreign key constraint)

|
|

原因有四种: (1)外键对应的字段数据类型不一致 (2)两张表的存储引擎不一致 (3)设置外键时“删除时”设置为“SET NULL” (4)字段的编码或排序不一致 (5) 外键所关联的字段的值在另一张表不存在

Aug. 5, 2026

图解SQL的inner join、left join、right join、full outer join、union、union all的区别

|
|

图解SQL的inner join、left join、right join、full outer join、union、union all的区别 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的 Join。我觉得清楚易懂,转过来。 假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所 示:让我们看看不同JOIN的不同 1.INNER JOIN SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name 2.FULL [OUTER] JOIN (1) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

4.RIGHT [OUTER] JOIN RIGHT OUTERJOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。 5.UNION 与 UNION ALL UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的 列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。 (1)SELECT name FROM TableA UNION SELECT name FROM TableB

Aug. 5, 2026

一文详解脏读、不可重复读、幻读以及四种隔离级别

|
|

四种隔离级别 1.读未提交(Read Uncommitted) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比 其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read) 2.读已提交(Read Committed) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提 交事务所做的改变。这种隔离级别也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实 例处理其间可能会有新的commit,所以同一select可能返回不同结果 3.可重复读(Repeatable Read) 这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致 另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该 范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。 4.可串行化(Serializable) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据 行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争 这四种隔离级别越往后越影响性能,如何选取根据业务需求而定。以下是四种隔离级别中对脏读、不可重复读、幻读的 影响情况。

读未提交(Read Uncommitted)依旧存在脏读、不可重复读和幻读; 读已提交(Read Committed)解决了脏读问题,因为发生脏读的条件就是读未提交的数据; 可重复读(Repeatable Read)进一步解决了不可重复读的问题,从隔离名称就可以看出,但还存在幻读问题; 可串行化(Serializable)解决了脏读、幻读、不可重复读问题,但是设立这种隔离级别会大大消耗性能。

page1

page2

Aug. 5, 2026

centos stream8 rpm 安装mysql8

|
|

1.下载mysql rpm 安装包。选择对应的操作系统版本官网地址:如下  2.上传tar 包到linux 服务器并解压 3.解压结果如上图,会产生多个rpm包,我们不会用到这么多,只会用到其中的四个,依次执行下面命令(具体到版本号 有差别,请注意) rpm -ivh mysql-community-common-5.7.22-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.22-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.22-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.7.22-1.el7.x86_64.rpm 4、安装过程中出现

error: Failed dependencies: libcrypto.so.10()(64bit) is needed by mysql-community-libs-8.0.27-1.el7.x86_64 libcrypto.so.10(libcrypto.so.10)(64bit) is needed by mysql-community-libs-8.0.27- 1.el7.x86_64 libssl.so.10()(64bit) is needed by mysql-community-libs-8.0.27-1.el7.x86_64 libssl.so.10(libssl.so.10)(64bit) is needed by mysql-community-libs-8.0.27-1.el7.x86_64 mysql-community-client-plugins = 8.0.27-1.el7 is needed by mysql-community-libs-8.0.27- 1.el7.x86_64 需要安装compat-openssl10-1.0.2o-3.el8.x86_64.rpm 下载 wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm  安装 rpm -ivh compat-openssl10-1.0.2o-3.el8.x86_64.rpm 安装 rpm -ivh mysql-community-client-8.0.27-1.el7.x86_64.rpm warning: mysql-community-client-8.0.27-1.el7.x86_64.rpm: Header V3 DSA/SHA256 Signature, key ID 5072e1f5: NOKEY error: Failed dependencies: libncurses.so.5()(64bit) is needed by mysql-community-client-8.0.27-1.el7.x86_64 libtinfo.so.5()(64bit) is needed by mysql-community-client-8.0.27-1.el7.x86_64 解决 [root@localhost mysql]# sudo yum install libncurses* [root@localhost mysql8]# systemctl status mysqld ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Wed 2023-04-12 13:32:56 CST; 3min 24s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html  Process: 3930 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE) Process: 3851 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 3930 (code=exited, status=1/FAILURE) Status: “Server startup in progress” Error: 13 (Permission denied)

Aug. 5, 2026

error while loading shared librarieslibtinfo.so.5 cannot open shared object file

|
|

error while loading shared libraries:libtinfo.so.5: cannot open shared object file : No such file error while loading shared libraries:libtinfo.so.5: cannot open shared object file : No such file or directory 一、错误原因 进入到 mysql 的 bin 目录时,进行登录,报出如上的错误, 从错误信息可知,服务器上没有 libtinfo.so.5 这个文件或者 目录 二、解决方案 在docs 命令下执行以下命令 安装yum install libncurses* 或者

软连接出一个新的文件

sudo ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5

执行完上条指令后,重新进行登录即可

./mysql -u root -p ————————————————

版权声明:本文为CSDN博主「976979786」的原创文章, 遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及 本声明。 原文链接: https://blog.csdn.net/hbtstsxy/article/details/125479835

Aug. 5, 2026

linux下tar包mysql8安装(经过本人多次测试)

|
|

本文以mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz为例 第一步:预置环境 1.1、将软件包上传到服务器上,上传完成后解压软件,解压后将软件重命名,最后将软件移 动到/usr/local下 tar -xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.28-linux-glibc2.12-x86_64 mysql-8.0.28 mv mysql-8.0.28 /usr/local/ 1.2、添加数据文件目录、日志文件目录,添加用户与用户组,修改文件夹及其下所有文件的 用户及用户组 mkdir -p /usr/local/mysql-8.0.28/logs cd /usr/local/mysql-8.0.28/logs mkdir err_logs slow_logs bin_logs touch err_logs/error.log #此处注意数据文件夹下不能有任何的文件或者文件夹 mkdir -p /data/mysql groupadd mysql #此处要建立系统账号加-r useradd -r -g mysql mysql chown -R mysql.mysql /data/mysql/ chown -R mysql.mysql /usr/local/mysql-8.0.28/ 第二部:初始化mysql 2.1、在/etc创建配置文件my.cnf 简版-my.cnf 完善版-my.cnf

将配置my.cnf文件放置在/etc下 **注意先配置配置文件初始化后mysql.service直接就能用,后配置配置文件还需要手动修改mysql.service 之后才能使用 2.2、执行初始化脚本,记录生成的临时密码 #注意  –initialize-insecure 初始化后无密码 –initialize 有密码 cd /usr/local/mysql-8.0.28 [root@localhost mysql-8.0.28]# ./bin/mysqld –initialize –user=mysql – basedir=/usr/local/mysql-8.0.28/ –datadir=/data/mysql –lower_case_table_names=1 – console 2022-06-30T15:10:43.926164Z 0 [Warning] [MY-010918] [Server] ‘default_authentication_plugin’ is deprecated and will be removed in a future release. Please use authentication_policy instead. 2022-06-30T15:10:43.927002Z 0 [System] [MY-013169] [Server] /usr/local/mysql- 8.0.28/bin/mysqld (mysqld 8.0.28) initializing of server in progress as process 1563 2022-06-30T15:10:44.341508Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2022-06-30T15:10:55.721028Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2022-06-30T15:11:25.709770Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: rX.hycK1lqy_ 上面的 “rX.hycK1lqy_” 既是生成的随机文件 2.3、启动mysql 配置service启动文件 cp support-files/mysql.server /etc/init.d/mysql chmod 755 /etc/init.d/mysql 将mysql服务加到系统服务中 chkconfig –add mysql 开机自启动 chkconfig mysql on #启动mysql service mysql start

Aug. 5, 2026

mysql alter 操作

|
|

#添加字段 ALTER TABLE doc_file_info ADD COLUMN chunk_count int DEFAULT NULL COMMENT ‘分片大小’ after size;

Aug. 5, 2026

mysql 存储过程

|
|

/* Navicat MySQL Data Transfer Source Server         : localhost Source Server Version : 50519 Source Host           : localhost:3306 Source Database       : test Target Server Type    : MYSQL Target Server Version : 50519 File Encoding         : 65001 Date: 2015-11-23 11:28:21 */ SET FOREIGN_KEY_CHECKS=0;


– Table structure for club_customer


DROP TABLE IF EXISTS club_customer; CREATE TABLE club_customer ( id int(11) NOT NULL AUTO_INCREMENT, custname varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

Aug. 5, 2026

MySQL 索引失效的常见原因

|
|

1.1 概述 有时候不知道小伙伴有没有跟我一样的情况,明明已经建立了索引,但是通过explain发 现语句并没有使用上索引,这可能是某些原因导致了我们的索引失效。所以本篇主要介绍的 是索引失效的常见原因和如何用好索引,给有需要的朋友一个参考。 1.2 索引失效 1.2.1 索引失效常见原因 我们先来看一张图,总结了常见的索引失效的原因 1.2.2 索引失效常见误区 1.2.3 索引设计的几个建议

1.3 索引示例 1.3.1 准备工作 创建一张表 test1 CREATE TABLE test1 ( id bigint NOT NULL, code varchar(30) NOT NULL, age int NOT NULL, name varchar(30) NOT NULL, height int NOT NULL, PRIMARY KEY (id), KEY idx_code_age_name (code,age,name) USING BTREE, KEY idx_height (height) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 插入两条数据:

INSERT INTO test1(id, code, name, age,height) VALUES (1, ‘001’, ‘张飞’, 18,‘7’); INSERT INTO test1(id, code, name, age,height) VALUES (2, ‘002’, ‘关羽’, 19,‘8’); 查询一下: select * from test1; 结果: 此外建立了两个索引:idx_code_age_name( code , age , name )联合索引和 idx_height(height)普通索引 1.3.2 索引失效常见原因 1.3.2.1 不满足最左前缀原则 1.3.2.1.1 第1种情况 where 条件后的字段包含了联合索引的所有索引字段,并且顺序是按照: code 、 age 、 name 执行sql如下: explain select * from test1 where code=‘001’ and age=18 and name=‘张飞’ ; 可以看出已经走了联合索引idx_code_name_age,并且索引的长度是 188, 188 = 30 * 3 + 2

Aug. 5, 2026

mysql5.7.xthis is incompatible with DISTINCT

|
|

DISTINCT关键字经常在MySQL中使用,在mysql5.7以前的版本中一般 没有什么问题,但是在5.7以后的版本中会遇到这样的错误 Caused by: java.sql.SQLException: Expression #1 of ORDER BY clause is not in SELECT list, references column ‘game.giftbag0_.create_date’ which is not in SELECT list; this is incompatible with DISTINCT 错误提示DISTINCT不兼容,要么更改SQL,但是对于开发者来讲,sql运行一直都是正常的,可能是 mysql 版本升级导致的安全问题,5.7.x安全性提升了很多,解决办法可以考虑修改MySQL配置文件,找到 对应的my.cnf或者my.ini sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 1 添加该行就ok! 还有一种错也是不兼容的问题导致的 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘nctest.pivot.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 这种问题就是sql_mode=only_full_group_by导致的,去掉only_full_group_by就解决了 查看方法 SELECT @@GLOBAL.sql_mode 解决办法,在navicat里所操作的库里执行 SET GLOBAL sql_mode = ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO _CREATE_USER,NO_ENGINE_SUBSTITUTION '

Aug. 5, 2026

MySQL8.0 配置文件详细说明

|
|

客户端设置

[client] port = 3306

默认情况下,socket文件应为/usr/local/mysql/mysql.socket,所以可以ln -s xx /tmp/mysql.sock

socket = /tmp/mysql.sock

服务端设置

[mysqld] ######################################################################################### #################

基础信息

#Mysql服务的唯一编号每个mysql服务Id需唯一 server-id = 1 #服务端口号默认3306 port = 3306

启动mysql服务进程的用户

user = mysql ######################################################################################### #################

安装目录相关

mysql安装根目录

basedir = /usr/local/mysql-5.7.21

mysql数据文件所在位置

datadir = /usr/local/mysql-5.7.21/data

临时目录比如load data infile会用到,一般都是使用/tmp

tmpdir = /tmp

设置socke文件地址

socket = /tmp/mysql.sock ######################################################################################### #################

事务隔离级别,默认为可重复读(REPEATABLE-READ)。(此级别下可能参数很多间隙锁,影响性能,但是

修改又影响主从复制及灾难恢复,建议还是修改代码逻辑吧)

隔离级别可选项目:READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE

transaction_isolation = READ-COMMITTED

transaction_isolation = REPEATABLE-READ ######################################################################################### #################

数据库引擎与字符集相关设置

mysql 5.1之后,默认引擎就是InnoDB了

default_storage_engine = InnoDB

内存临时表默认引擎,默认InnoDB

default_tmp_storage_engine = InnoDB

Aug. 5, 2026

MySQL事务(transaction)

|
|

一、事务的四个特性(ACID)【面试常考项】 😀 有都发生和都不发生两种情况 一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致 状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元, 王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五 转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元, 王五还没加上50元这个中间状态是不可见的。 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的 操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互 相干扰。 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永 久性的,接下来的其他操作或故障不应对其有任何影响

Aug. 5, 2026

DBHelper

|
|

package database; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /**

  • Created by root on 16-11-15. */ publicclassDatabasesManager{ publicstatic final String url =“jdbc:mysql://127.0.0.1/shop?"+ “useUnicode=true&characterEncoding=utf-8”; publicstatic final String name =“com.mysql.jdbc.Driver”; publicstatic final String user =“root”; publicstatic final String password =”"; public Connection conn =null; public PreparedStatement pst =null; public String sql =null; publicDatabasesManager(){} publicvoidcreateconn(){ try{ //1、注册连接数据库的驱动 Class.forName(name); try{ //2、创建数据库连接 conn = DriverManager.getConnection(url, user, password); //设置数据库自动提交属性为假 // conn.setAutoCommit(false); //3、创建数据库命令 pst = conn.prepareStatement(sql); }catch(SQLException e){ e.printStackTrace(); } }catch(ClassNotFoundException e){ e.printStackTrace();

} } publicvoidclose(){ try{ //关闭数据库链接 this.conn.close(); //关闭数据库命令 this.pst.close(); }catch(SQLException e){ e.printStackTrace(); } } }

Aug. 5, 2026

doris常用命令

|
|

SHOW PROC ‘/backends’; SHOW PROC ‘/frontends’; ALTER SYSTEM DROP FOLLOWER “211.67.156.98:9010”; ALTER SYSTEM ADD FOLLOWER “211.67.156.98:9010”; ALTER SYSTEM ADD BACKEND “192.168.0.1:9050”; IP 内存 priority_networks = 211.67.156.98/24 1stop fe 2 ALTER SYSTEM DROP FOLLOWER “211.67.156.98:9010”; ALTER SYSTEM ADD FOLLOWER “211.67.156.98:9010”; 3 换包 –helper 211.67.156.99:9010 –daemon /opt/user/jdk1.8.0_181/ SHOW PROC ‘/backends’; SHOW PROC ‘/frontends’;

ALTER SYSTEM DROP FOLLOWER “211.67.156.99:9010”; ALTER SYSTEM ADD FOLLOWER “211.67.156.99:9010”; curl -i -k https://117.158.83.73:8001/api/v1/auth/get-access-token curl -i -k https://172.16.251.2:8001/api/v1/auth/get-access-token select DISTINCT TO_CHAR(CLRQ,‘yyyy-MM-dd’) c from T_REC_CONSUME ORDER BY c desc; ALTER SESSION SET NLS_DATE_LANGUAGE=‘simplified chinese’; select DISTINCT TO_CHAR(cast(to_timestamp(OPDT,‘dd-MON-yy hh:mi:ss.ff AM’) as date),‘yyyy-MM-dd’) c from T_REC_KQMJ ORDER BY c desc; select DISTINCT TO_CHAR(CLRQ,‘yyyy-MM-dd’) c from T_REC_SAVE ORDER BY c desc; select DISTINCT TO_CHAR(SWINGTIME,‘yyyy-MM-dd’) c from DZ_T_SJTB_MJJL ORDER BY c desc; select DISTINCT TO_DATE((SUBSTR(HSRQ, 0, 10)||’ ‘||SUBSTR(HSRQ, 11, 18)),‘yyyy-MM-dd HH24:mi:ss’) c from T_TS_JYLS ORDER BY c desc; select DISTINCT left(CLRQ,10) c from T_REC_SAVE ORDER BY c desc; select DISTINCT left(CLRQ,10) c from T_REC_CONSUME ORDER BY c desc; SHOW PROC ‘/backends’; SHOW PROC ‘/frontends’; SHOW PROC ‘/statistic’; SHOW PROC ‘/statistic/6119160’; SHOW TABLET FROM dmm_dw.STU_COURSE; ADMIN SHOW REPLICA STATUS FROM dmm_dw.STU_COURSE PARTITION (p1, p2, p3) WHERE STATUS = “NORMAL”;

Aug. 5, 2026

error while loading shared libraries libtinfo.so.5 cannot open s

|
|

解决,查看MYSQL的依赖 $ ldd mysql libtinfo.so.5 => not found 1 2 查看依赖是否存在 $ ls /lib/x86_64-linux-gnu/libtinfo.so.* 1 如果不存在,则去一个好的ubunu中复制一个libtinfo.so.5,并放入 /lib/x86_64-linux-gnu 目录下: $ locate libtinfo.so.5 # 或者直接定位看linux中有没有然后复制一个就可以了 1 sudo mv libtinfo.so.5 /lib/x86_64-linux-gnu/ 1 就可以了

Aug. 5, 2026

Failed to start mysql service

|
|

tar包安装mysql8 Failed to start mysql.service: Unit mysql.service not found. 想利用 service mysql start 启动mysql数据库,但是发现出现错误: Failed to start mysql.service: Unit not found. 1、查询/etc/init.d/下是否存在mysql ll /etc/init.d/ | grep mysql 发现该目录下并没有mysql的文件,若存在,请备份一下 2、查询mysql.server find / -name mysql.server mysql.server一般在你安装的mysql目录下,自己是编译安装,所以知道目录在哪里,不知道的这样看一下 3、执行复制操作,/usr/local/mysql/是我自己的mysql安装目录,大家根据查询出来的结果复制 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 然后 service mysql start 启动成功!

Aug. 5, 2026

Linux安装mysql默认配置文件位置

|
|

在 Linux 下安装 mysql,想要知道 mysql 服务默认去哪里加载配置文件,包括查找顺序,只要通过下面这条语句即可: 1.mysqld –verbose –help | grep -A 1’Default options' 可以看到,配置文件查找顺序是:/etc/my.cnf > /etc/mysql/my.cnf > ~/.my.cnf 知道了配置文件目录(如上 /etc/my.cnf ),就可以在配置文件下进行相关配置了。或者如果该目录下没有配置文件,可 以拷贝外部配置文件到该目录下,甚至自己在目录下创建配置文件。 延伸 另外,怎么让 my.cnf include 其他配置文件呢?在 my.cnf 内加如下内容: 1.!includedir /etc/mysql/conf.d/ 则除加载 my.cnf 配置文件外,还会到/etc/mysql/conf.d/目录下加载其他配置文件。当然可以配置多个!includedir 这样做的好处是可以把不同目的或功能的配置放在不同的多个文件下,然后由 my.cnf 去统一加载这些配置。避免所有 配置在一个文件中。

page1

Aug. 5, 2026

Liunx AnolisOS8.4下安装Mysql5.7.x

|
|

一:下载Mysql安装包 Mysql5.7.35下载地址,或者直接去官网找到对应的包下载也行。我这边就直接用命令的方式下载了。废话不多说直接 开干。 // 进入local目录,这里你可以自定义其它安装目录 [root@xxxx/]# cd /usr/local/ // 下载mysql5.7.35版本的安装包 [root@xxxx local]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.35- linux-glibc2.12-x86_64.tar.gz 下图表示下载完成 二:安装 // 解压安装包 [root@xxxx local]# tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz // 重命名为mysql目录 [root@xxxx local]# mv mysql-5.7.35-linux-glibc2.12-x86_64/ mysql // 创建mysql用户组和用户 [root@xxxx local]# groupadd mysql [root@xxxx local]# useradd -r -g mysql mysql [root@xxxx local]# groups mysql mysql : mysql [root@xxxx local]# cd mysql/ // 创建目录 [root@xxxx mysql]# mkdir data // 赋权 [root@xxxx mysql]# chown -R mysql:mysql ./ // 配置my.cnf [root@xxxx mysql]# vim /etc/my.cnf my.cnf配置如下 [mysqld] bind-address=0.0.0.0 port=3306 user=mysql basedir=/usr/local/mysql

Aug. 5, 2026

merge批量更新数据

|
|

merge into T_USER_MEA_RESULT_DATA_INFO3 t1 using (select USERNUM,MEAYEARNAME,sum(WEIGHTSCORE) score from T_USER_MEA_RESULT_DATA_INFO3 t1 group by USERNUM,MEAYEARNAME) t2 on (t1.MEAYEARNAME=t2.MEAYEARNAME and t1.USERNUM=t2.USERNUM) when matched then UPDATE SET MEASCORE = t2.score 注意 update后面不跟表名直接跟set 适合两个以内的表关联的大数据量的更新

Aug. 5, 2026

MySQL Expalin 详解

|
|

1.1 概述 做完项目上线前,都需要做一些测试,比如:使用jmeter进行压力测 试、使用慢查询日志/mySQLdumslow对数据库的查询响应做测试,找到一 些执行时间比较久的SQL语句,然后对这些SQL语句进行优化,优化过程常 常这样做:我们常常用到explain这个命令来查看SQL语句的执行计划,查看 该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain 命令来查看。 1.2 expalin 介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句。 在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执 行查询会返回执行计划的信息,而不是执行SQL。 1.2.1 expalin 作用 通过explain+sql语句可以知道如下内容: 1、表的读取顺序。(对应id) 2、数据读取操作的操作类型。(对应select_type) 3、哪些索引可以使用。(对应possible_keys) 4、哪些索引被实际使用。(对应key) 5、表直接的引用。(对应ref) 6、每张表有多少行被优化器查询。(对应rows) 1.2.2 expalin 使用方法 1、只需要在SELECT前面加上EXPLAIN即可,例如 explain select surname,first_name form a,b where a.id=b.id 2、在语句结尾(;之前)加上\G能够更清晰的查看。

3、需要说的是EXPLAIN只对SELECT查询作解释,INSERT、UPDATE、 DELETE不会 mysql> explain select * from servers; +—-+————-+———+——+—————+——+———+——+——+—– –+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +—-+————-+———+——+—————+——+———+——+——+—– –+ | 1 | SIMPLE | servers | ALL | NULL | NULL | NULL | NULL | 1 | NULL | +—-+————-+———+——+—————+——+———+——+——+—– –+ row in set (0.03 sec) expain出来的信息有10列,分别是id、select_type、table、type、 possible_keys、key、key_len、ref、rows、Extra。 1.3 explain详解 1.3.1 id SQL执行的成功的标识,SQL从大到小的执行。 id相同时,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行,id为 NULL最后执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越 大,优先级越高,越先执行 mysql> explain select * from (select * from ( select * from t3 where id=123) a) b; +—-+————-+————+——–+——————-+———+———+—— +——+——-+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

Aug. 5, 2026

oracle表空间不足

|
|

查询所有的表空间

SELECT tablespace_name, block_size, initial_extent, next_extent, min_extents, max_extents, status, contents, logging, allocation_type, extent_management, segment_space_management FROM dba_tablespaces; SELECT tablespace_name,–表空间名称 file_id,–文件ID file_name,–文件名 round( bytes / ( 1024 * 1024 ), 0 ) total_space –数据文件大小(M) FROM dba_data_files WHERE tablespace_name = ‘TSP_DPSTAR’ ORDER BY tablespace_name; –查询表空间文件 ALTER database datafile ‘/u01/app/oracle/product/11.2.0/dbhome_1/dbs/dpstar_temp01.dbf’ r esize 32000M; –修改已有数据文件大小 根据用户查询所在表空间 select default_tablespace from dba_users where username=‘DATA_PLATFORM’; select a.tablespace_name as “表空间名” , a.bytes / 1024 / 1024 as “表空间大小(M)” , (a.bytes - b.bytes) / 1024 / 1024 as “已使用空间(M)” , b.bytes / 1024 / 1024 “空闲空间(M)” , round(((a.bytes - b.bytes) / a.bytes) * 100, 2) “使用比” from ( select tablespace_name, sum (bytes) bytes from dba_data_files group by tablespace_name) a, ( select tablespace_name, sum (bytes) bytes, max (bytes) largest from dba_free_space group by tablespace_name) b where a.tablespace_name = b.tablespace_name

Aug. 5, 2026

oracle导出dmp文件

|
|

dmp文件导出 dmp文件导出用的比较多的一般是三种,他们分别是:导出整个数据库实例下的所有数据、导出指定用户的所有表、 导出指定表。 这里已我的数据库为例,进行介绍,我的Oracle数据库实例为"ORACLE",查看自己数据库实例可以从"任务管理器–> 服务"中进行查看,如下图 打开命令行: 1,将数据库ORACLE完全导出,用户名system密码manager 导出到c:\daochu.dmp中 exp system/manager@ORACLE  file=c:\daochu.dmp full=y 2,将数据库中RFD用户与,JYZGCX用户的表导出 exp system/manager@ORACLE  file=d:\daochu.dmpowner=(RFD,JYZGCX) 3,将数据库中的表T_USER、T_ROLE导出 expJYZGCX/JYZGCX@ORACLEfile= d:\data\newsmgnt.dmp tables=(T_USER,T_ROLE) 上面的system为用户名,manager为密码,ORACLE为数据库实例名,其实不一定非的用system用户,只要是拥有 管理员权限的用户都可以。 dmp文件导入 步骤如下: 机器环境是windows条件下,win7: 1.打开“开始”—>输入cmd,打开cmd命令窗口,输入:sqlplus / as sysdba;然后使用conn / as sysdba;这样就可以以超 级管理员的最高权限登录,当然这决定于init.ora 文件中的数据库初始化参数,可以参考: http://blog.chinaunix.net/uid-43642-id-2124603.html 2.上面以sysdba登录后,就可以创建表空间和用户了。(打开“开始”–>输入cmd—> sqlplus /nolog;输入 conn / as sysdba管理员账户登录;) 由于目前有dmp文件,可以用notepad++(或者Editplus或者UltraEdit)打开dmp文件(UltraEdit或者Editplus打开效果 更好,没有乱码,因为是二进制文件嘛,不过其他方面我更喜欢notepad++),使用快捷键ctrl+F,查找tablespace , 可以找到这个dmp文件所对应数据库的表空间,我查找我的表空间的名称是USERS,下面创建语句创建的表空间的名 称就是USERS,创建语句不太明白的,可以百度一下。 2.1然后创建表空间,命令如下: create tablespace USERS logging

datafile ‘D:\oracle\product\10.2.0\oradata\orcl\USERS.dbf’ size 32m autoextend on next 32m maxsize 2048m extent management local; 2.2创建用户,命令如下: 创建test用户,密码也是test222,使用上面创建的表空间 create user test identified by test222 default tablespace USERS 3.给创建的test用户分配权限,这里我比较懒,直接分配了dba权限,命令如下: grant dba to test; 这样前期工作准备就绪了,然后可以关掉刚刚这个命令窗口了。 4.打开“开始”–>输入cmd(记住:这里是cmd窗口,不是sqlplus窗口!!!) 由于在上面几个步骤中,创建了test这个用户,所以往test用户导入数据: 直接输入如下语句:imp test/test222@localhost/orcl file=“C:\Users\zhengyi\Desktop\test20140221.DMP”  full=y; 上述语句说明如下: test是上面创建的登录数据库用户名; test222是登录数据库的密码; localhost:代表当前数据库的地址是本机,如果是远程导入,替换成对应的ip地址就行 orcl:是实例名称(这个如果不知道实例名称的话,应该可以查,如果不能查,额,我还不知道咋弄,我先试试!) file:后面的是你当前dmp文件存放的路径 full=y,这个貌似是全部导入,我再查查核实一下! 1.导出用户所有的表到D盘:exp aa/1234 file=D:\biao.dmp owner=aa; 2.导出用户aa中的表dept到D盘:exp aa/1234 file=d:\dept.dmp tables=(dept); 3.导出用户aa中的表dept,emp到D盘:exp aa/1234 file=d:\dept.dmp tables=(dept,emp); 只导出owner=DMM_TZJK的所有表 exp DMM_TZJK/DMM_TZJK@127.0.0.1 /ORCL file=C:\Users\Administrator\Desktop\EXPORT\TZJK.dmp owne r=DMM_TZJK log=C:\Users\Administrator\Desktop\EXPORT\gd_base.log 导出所有表(DMM_TZJK必须是系统用户) exp DMM_TZJK/DMM_TZJK@127.0.0.1 /ORCL file=C:\Users\Administrator\Desktop\EXPORT\TZJK.dmp log=C:\Users\Administrator\Desktop\EXPORT\gd_base.log full=y

Aug. 5, 2026

Oracle树形结构查询(递归)

|
|

Oracle树形结构查询(递归) 引用:https://blog.csdn.net/u012615705/article/details/78321022文章转自上述地址,内部有稍许改动,如 有需要请查看原文。 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经 常遇到的。 概要:树状结构通常由根节点、父节点、子节点和叶节点组成,简单来说,一张表中存在两个字段, dept_id,par_dept_id,那么通过找到每一条记录的父级id即可形成一个树状结构,也就是par_dept_id(子) =dept_id(父),通俗的说就是这条记录的par_dept_id是另外一条记录也就是父级的dept_id,其树状结构层级查 询的基本语法是: SELECT [LEVEL],* FEOM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDERBY 排序字段 说明:LEVEL—伪列,用于表示树的层次 条件1—根节点的限定条件,当然也可以放宽权限,以获得多个根节点,也就是获取多个树 条件2—连接条件,目的就是给出父子之间的关系是什么,根据这个关系进行递归查询 条件3—过滤条件,对所有返回的记录进行过滤。 排序字段—对所有返回记录进行排序 对prior说明:要的时候有两种写法:connect by prior dept_id=par_dept_id 或 connect by dept_id=prior par_dept_id,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上 的搜索方式(先找叶子节点然后找父节点)。 树状结构层次化查询需要对树结构的每一个节点进行访问并且不能重复,其访问步骤为:

大致意思就是扫描整个树结构的过程即遍历树的过程,其用语言描述就是: 步骤一:从根节点开始; 步骤二:访问该节点; 步骤三:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行 第四步; 步骤四:若该节点为根节点,则访问完毕,否则执行第五步; 步骤五:返回到该节点的父节点,并执行第三步骤。 除此之外,sys_connect_by_path函数是和connect  by 一起使用的,在实战中具体带目的具体介绍! 实战:最近做项目的组织结构,对于部门的各级层次显示,由于这部分掌握不牢固,用最笨的like模糊查询解决了,虽 然功能实现了,但是问题很多,如扩展性不好,稍微改下需求就要进行大改,不满意最后对其进行了优化。在开发中能 用数据库解决的就不要用java去解决,这也是我一直保持的想法并坚持着。 创建表: 1: create table SYS_DEPT 2: ( 3:   dept_id         VARCHAR2(32) not null, 4:   dept_name       VARCHAR2(128), 5:   dept_code       VARCHAR2(32), 6:   par_dept_id     VARCHAR2(32), 7:   dept_leader     VARCHAR2(32), 8:   dept_desc       VARCHAR2(256), 9:   create_time     CHAR(19), 10:   org_id          VARCHAR2(32), 11:   dept_type       VARCHAR2(1), 12:   order_id        NUMBER, 13:   state           CHAR(1) default'1’, 14:   bqq_dept_id     VARCHAR2(128), 15:   bqq_par_dept_id VARCHAR2(128) 16: ) 17: 18: – Add comments to the table 19: comment on table SYS_DEPT 20:is’部门信息,和单位多对一’; 21: – Add comments to the columns 22: comment on column SYS_DEPT.dept_id 23:is’主键’; 24: comment on column SYS_DEPT.dept_name 25:is’名称’; 26: comment on column SYS_DEPT.dept_code 27:is’编码,用于递归';

Aug. 5, 2026

Oracle相同ID有多条记录,取时间最近的一条

|
|

select * from (select t.*, row_number() over(partition by t.strcaseid order by t.cu_date desc) rn from b_push t) c where rn = 1; 1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by  order by 的执行。 partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能 够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。

Aug. 5, 2026

oracle中 connect by prior 递归算法

|
|

Oracle中start with…connect by prior子句使用方法 connect by 是结构化查询中用到的,其基本的语法是: select … from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = ‘HBHqfWGWPy’ connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比方一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就能够形成一个树状结构。 用上述语法的查询能够取得这棵树的全部记录。 当中: 条件1 是根结点的限定语句,当然能够放宽限定条件,以取得多个根结点,实际就是多棵树。 条件2 是连接条件,当中用PRIOR表示上一条记录,比方 CONNECT BY PRIOR org_id = parent_id就是说上一条 记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 条件3 是过滤条件,用于对返回的全部记录进行过滤。 简介例如以下: 早扫描树结构表时,须要依此訪问树结构的每一个节点,一个节点仅仅能訪问一次,其訪问的过程例如以下: 第一步:从根节点開始; 第二步:訪问该节点; 第三步:推断该节点有无未被訪问的子节点,若有,则转向它最左側的未被訪问的子节,并运行第二步,否则运行第四 步; 第四步:若该节点为根节点,则訪问完成,否则运行第五步; 第五步:返回到该节点的父节点,并运行第三步骤。 总之:扫描整个树结构的过程也即是中序遍历树的过程。 1.树结构的描写叙述 树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描写叙述,如EMP表中的 EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的 EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每一个节点的父节点,就能够确定整个 树结构。 在SELECT命令中使用CONNECT BY 和蔼START WITH 子句能够查询表中的树型结构关系。其命令格式例如以下: SELECT 。。。 CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2} [START WITH]; 当中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运 算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一側表示父节点,在还有一 側表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了能够使用列名外,还同意

Aug. 5, 2026

常用语句

|
|

#查询所有的表 SELECT * FROM USER_TABLES; #查询所有的用户 select username from sys.dba_users; #查询对象是表还是视图 Select OBJECT_NAME,OBJECT_TYPE From user_objects Where object_name=‘DDDFF’; #获取表或视图的ddl语句 SELECT DBMS_METADATA.GET_DDL(‘VIEW’,‘C_TONGBU’) FROM DUAL; #查询所有的表空间 SELECT tablespace_name, block_size, initial_extent, next_extent, min_extents, max_extents, status, contents, logging, allocation_type, extent_management, segment_space_management FROM dba_tablespaces; #查询指定的表空间 SELECT tablespace_name,–表空间名称 file_id,–文件ID file_name,–文件名 round( bytes / ( 1024 * 1024 ), 0 ) total_space –数据文件大小(M) FROM dba_data_files WHERE tablespace_name = ‘TSP_DPSTAR’ ORDER BY tablespace_name; #创建表空间 CREATE TABLESPACE test LOGGING DATAFILE ‘/data/oracle/oradata/orcl/test01.dbf’ SIZE 500M AUTOEXTEND ON NEXT 500M MAXSIZE 20480M EXTENT MANAGEMENT LOCAL;

Aug. 5, 2026

分组求和后再求总量

|
|

sum() over ( ) ratio_to_report () over ( ) SELECT b.zdmc,SUM(CZE/100) as je,sum(SUM(CZE/100)) over ( ) AS ttje FROM T_YKT_REC_CONSUME c left join SJZX.T_YKT_BASE_TERM b on c.ZDBH=b.ZDBH INNER JOIN SJZX.T_BZKS s on s.XH = c.XGH AND to_date(s.SJBYSJ,‘yyyy-MM-dd HH24:mi:ss’)>sysdate GROUP BY b.zdmc ORDER BY je desc

Aug. 5, 2026

solr-8.11单机安装

|
|

1、官网下载最新版的solr 官网地址:https://solr.apache.org/downloads.html 上传压缩包到服务器,解压压缩包将解压后的文件下移动到自己的目录下 tar-zxvf solr-8.11.2.tgz mv solr-8.11.2 /usr/local/ 2、solr单机服务启动 增加solr用户以及solr组 cd 至solr文件夹下进入到bin目录启动服务默认IP为8983 调整防火墙IP groupadd solr useradd solr -G solr chown -R solr.solr /usr/local/solr-8.11.2 cd /usr/local/solr-8.11.2 ./bin/solr start -force #启动服务

新建core 1、复制configsets/_default/conf 到新建的core目录下 pe_book为新建的core cd .. cd .. cp -rf solr-8.10.1/server/solr/configsets/_default/conf solr-8.10.1/server/solr/pe_book/ 或者 cp -rf /usr/local/solr-8.10.1/server/solr/configsets/_default/conf /usr/local/solr- 8.10.1/server/solr/pe_book/ 2、新建core

三、中文分词插件安装 1、solr8 自带分词工具 在slor的 solr-8.10.1/contrib/analysis-extras/lucene-libs 目录下找到lucene-analyzers-smartcn-8.10.1.jar cp 到 webapp 路径的lib 下路径为 solr-8.10.1/server/solr-webapp/webapp/WEB-INF/lib 配置文件managed-schema 增加配置 大抵命令原理是这样得 cp contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-8.10.1.jar server/solr- webapp/webapp/WEB-INF/lib/ image.png

cd /usr/local/solr-8.10.1/server/solr/pe_book/conf/ 如果你找不到managed-schema在哪,可以使用以下命令进行查询 find /usr/local/ -type f -name “managed-schema”

Aug. 5, 2026

Solr+ZooKeeper运行报错

|
|

错误内容: Could not execute ruok towards ZK host xxx:2181. Add this line to the ‘zoo.cfg’ configuration file on each zookeeper node: ‘4lw.commands.whitelist=mntr,conf,ruok’. See also chapter ‘Setting Up an External ZooKeeper Ensemble’ in the Solr Reference Guide. 其中xxx是主机名或IP地址 解决方法: 就是按提示里面说的,在zoo.cfg里面添加一行4lw.commands.whitelist=mntr,conf,ruok vim zookeeper/conf/zoo.cfg 在末尾加入一行: 4lw.commands.whitelist=mntr,conf,ruok 保存后退出,然后重启ZooKeeper: zkServer.sh restart

Aug. 5, 2026

javax.security.auth.login.LoginException Cannot locate KDC

|
|

ERROR: “javax.security.auth.login.LoginException: Cannot locate KDC” while testing Kafka connection in Application Integration. 此问题的原因之一是连接无法找到 krb5.conf/krb5.ini 文件,或者无法在代理上访问该文件。 上传krb5.conf

Aug. 5, 2026

kafka-run-class.sh第309 行exec java 未找到

|
|

启动kafka报错: /home/app/kafka/kafka_2.12-2.4.0/bin/kafka-run-class.sh: 第 309 行:exec: java: 未找到 查了相关资料,分析可能是Kafka默认路径与我实际的路径不一致导致的。 解决: ln -s /usr/local/jdk1.8.0_202/bin/java /usr/bin/java 结束。

Aug. 5, 2026

kafka(2.3.1)-zookeeper(3.4.12)集群开启kerberos认证部署详解

|
|

前置条件:服务器及安装情况 hostnameprincipal 192.168.2.123db-123kerberos zookeeper、kafkakafka/db-124@DB-123.COM zookeeper、kafkakafka/db-125@DB-123.COM zookeeper、kafkakafka/db-126@DB-123.COM java version 1.8.0_241 zookeeper 版本:zookeeper-3.4.12 安装路径 /usr/local/kafka_zk/zookeeper-3.4.12 kafka 版本:kafka_2.12-2.3.1 安装路径 /usr/local/kafka_zk/kafka_2.12-2.3.1 配置文件路径: /usr/local/kafka_zk/config, 包括: kafka124.keytab kafka与zookeeper所需的principal(两个principal放在了一起) kafka.jaas kafka的jaas文件 ker.pro kafka的consumer与producer所需的认证文件 zookeeper.jaas zookeeper的jaas文件 一、安装kerberos服务 请参考Kerberos认证原理与环境部署 二、创建principal导出keytable文件以及其他相关的配置 三台服务器分别按照前置条件修改hostname与hosts 分别添加san’taisantai服务器的principal并生成ketable 将keytable文件放到三台服务器中对应的服务器的指定的位置/usr/local/kafka_zk/config下 三、部署zookeeper并开启kerberos 分别在三台服务器做以下配置,注意相关地址的修改,以下以db-124为例 3.1、修改zoo.cfg 添加以下安全相关的配置追加下文 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=3600000

#完整配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/kafka_zk/zookeeper-3.4.12/data clientPort=2181 server.124=db-124:2888:3888 server.125=db-125:2888:3888 server.126=db-126:2888:3888 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=3600000 3.2、在conf目录创建java.env文件,添加以下内容 export JVMFLAGS="- Djava.security.auth.login.config=/usr/local/kafka_zk/config/zookeeper.jaas" 3.3、在/usr/local/kafka_zk/config目录创建zookeeper.jaas文件 Server{ com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/usr/local/kafka_zk/config/kafka124.keytab" principal=“zookeeper/db-124@DB-123.COM ” userTicketCache=false; }; Client{ com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true

Aug. 5, 2026

kafka3.1.0集群部署(zookeeper模式)

|
|

集群环境: 节点名ip地址OS版本部署服务broker信息 kafka01192.168.96.10CentOS Linux release 7.9.2009(Core)jdk、zookeeper、kafka broker :0 kafka02192.168.96.11CentOS Linux release 7.9.2009(Core)jdk、zookeeper、kafka broker :1 kafka03192.168.96.12CentOS Linux release 7.9.2009(Core)jdk、zookeeper、kafka broker :2 软件版本: jdk 1.8版本: https://www.oracle.com/java/technologies/downloads/#java8 zookeeper 3.7.0版本:  https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache- zookeeper-3.7.0-bin.tar.gz kafka 2.13-3.1.0版本:  https://dlcdn.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz 开始部署: 一、部署jdk 解压并重命名服务 cd /opt/software/ tar -zxvf jdk-8u321-linux-x64.tar.gz mv jdk1.8.0_321/usr/local/jdk1.8.0 添加环境变量 vi /etc/profile

在文件尾部追加以下内容

exportJAVA_HOME=/usr/local/jdk1.8.0 exportJRE_HOME=${JAVA_HOME}/jre exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib exportPATH=${JAVA_HOME}/bin:$PATH 重载环境变量,使新配置生效 source /etc/profile 验证 java -version 继续按照以上方法部署另外2台服务器

二、部署zookeeper 在线下载安装包 cd /opt/software/ wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0- bin.tar.gz –no-check-certificate 解压并重命名服务 tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz mv apache-zookeeper-3.7.0-bin /usr/local/zookeeper-3.7.0 创建zookeeper服务的data目录 mkdir /usr/local/zookeeper-3.7.0/data 创建myid文件(zookeeper用于惟一标识自己的id) echo 1>/usr/local/zookeeper-3.7.0/data/myid 生成zoo.cfg配置文件 cp /usr/local/zookeeper-3.7.0/conf/zoo_sample.cfg /usr/local/zookeeper-3.7.0/conf/zoo.cfg 修改zoo.cfg配置文件 vi /usr/local/zookeeper-3.7.0/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper-3.7.0/data clientPort=2181 server.1=192.168.96.10:2888:3888 server.2=192.168.96.11:2888:3888 server.3=192.168.96.12:2888:3888 使用scp同步发送到另外2台服务器 scp -r /usr/local/zookeeper-3.7.0 root@192.168.96.11 :/usr/local/ scp -r /usr/local/zookeeper-3.7.0 root@192.168.96.12 :/usr/local/ 配置另外2个节点的myid文件 192.168.96.11服务器 echo 2>/usr/local/zookeeper-3.7.0/data/myid 192.168.96.12服务器

Aug. 5, 2026

kafka3.1集群搭建(kraft模式)

|
|

导读 我公司有一个项目现场那边说zk有漏洞,所以我们就打算部署一套不依赖zookeeper的kafka高版本集群,也就是Kraft模 式。 Apache Kafka3.0.0的发布为kafka彻底去掉Zookeeper铺平了道路,Kafka Raft 支持元数据主题的快照以及自我管理, 而3.1.0版本在2022.1.24发布,对3.0.0版本又修改了。我们先来初步体验一下KRaft的入门。 KRaft简介 Kafka的共识机制KRaft,仍然处于预览机制。未来KRaft将作为Apache Kafka的内置共识机制将取代Zookeeper。该模 式在2.8版本当中就已经发布了体验版本,在3.X系列中KRaft是一个稳定release版本。 KRaft运行模式的kafka集群,不会将元数据存储在zookeeper中,即部署新集群的时候,无需部署zk集群,因为Kafka将 元数据存储在Controller节点的KRaft Quorum中。KRAFT可以带来很多好处,比如可以支持更多的分区,更快速的切换 Controller,也可以避免Controller缓存的元数据和zk存储的数据不一致带来的一系列问题。 KRaft架构 首先来看一下KRaft在系统架构层面和之前的版本有什么区别。KRaft模式提出来去zookeeper后的kafka整体架构入下图 是前后架构图对比: 在当前架构中,一个kafka集群包含多个broker节点个一个ZooKeeper集群。我们在这张图中描绘了一个典型的集群结 构:4个broker节点个3个ZooKeeper节点。kafka集群的Controller(橙色)在被选中后,会从ZooKeeper中加载他的状 态。Controller指向其他Broker节点的箭头表示Controller在通知其他briker发生了变更,如Leaderanddisr和 Updatemetdata请求。

在新的架构中,3个Controller节点代替三个ZooKeeper节点。控制器节点和Broker节点在不同的进程中。Controller节点 中会选择一个成为Leader(橙色)。新架构中,控制器不会想Broker推送更新,而是Broker从这个Controller Leader拉 取元数据的更新信息。 注意:尽管Controller进程在逻辑上与Broker进程是分离的,但他们不需要再物理上分离,即在某些情况下,部分所有 Controller进程和Broker进程可以使同一个进程,即一个broker节点即是Broker也是Controller。另外在同一个节点上可 以运行两个进程,一个是Controller进程,一个是broker进程,这相当于在较小的及群众。Zookeeper进程可以想Kafka Broker一样部署在相同的节点上。 部署 首先目前官方页面上并没有集群搭建文档。我们下载安装包,查看config/kraft下的README.md文件。可以看到详细说 明。 根据说明,这里我搭建Kraft模式的kafka集群。这里我用的是3.1版本 这里我准备三台机器: HOSTNAMEIPOS node2192.168.0.113centos7.9 node3192.168.0.114centos7.9 node4192.168.0.115centos7.9 下载 官网下载:Apache Kafka

或者我提供的安装包:kafka_2.13-3.1.0.tgz 上传服务器并解压 这里我在node2机器上传到自己的目录下/home/guohao cd /home/guohao #解压 tar -zxvf kafka_2.13-3.1.0.tgz cd /home/guohao/kafka_2.13-3.1.0/ 配置server.properties cd config/kraft/ vi server.properties

节点角色

process.roles=broker,controller #节点ID,和节点所承担的角色想关联 node.id=1

集群地址

controller.quorum.voters=1@192.168.0.113 :9093,2@192.168.0.114:9093,3@192.168.0.115:9093 #本机节点 listeners=PLAINTEXT://192.168.0.113:9092,CONTROLLER://192.168.0.113:9093

这里我修改了日志文件的路径,默认是在/tmp目录下的

log.dirs=/home/guohao/kafka_2.13-3.1.0/kraftlog/kraft-combined-logs Process.Roles 每个Kafka服务器现在都有一个新的配置项,叫做Process.Roles, 这个参数可以有以下值: 如果Process.Roles = Broker, 服务器在KRaft模式中充当 Broker。

Aug. 5, 2026

kafka3.1只能启动一个节点其余节点报错NoAuth for brokers ids

|
|

ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /brokers/ids at org.apache.zookeeper.KeeperException.create(KeeperException.java:120) at org.apache.zookeeper.KeeperException.create(KeeperException.java:54) at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:566) at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1729) at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1627) at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1(KafkaZkClient.scala:1619) at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1$adapted(KafkaZkClient.scala:1619) at scala.collection.immutable.List.foreach(List.scala:431) at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1619) at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:492) at kafka.server.KafkaServer.startup(KafkaServer.scala:201) at kafka.Kafka$.main(Kafka.scala:109) at kafka.Kafka.main(Kafka.scala) 已解决不能配置 zookeeper.set.acl=true

Aug. 5, 2026

Kerberos认证原理与环境部署

|
|

一、概述 Kerberos是为TCP/IP网络系统设计的可信的第三方认证协议,用于身份认证。网络上的Keberos服务 基于DES对称加密算法,但也可以用其他算法替代。因此,Keberos是一个在许多系统中获得广泛应 用的认证协议。Keberos最初是美国麻省理工学院(MIT)为Athena项目开发的。 官网:https://www.kerberos.org/ 官方文档:http://web.mit.edu/kerberos/krb5-current/doc/ 1)应用场景 Kerberos采用客户端/服务器(CS)结构与DES加密技术,并且能够进行相互认证,即客户端和服务 器端均可对对方进行身份认证,是一种应用对称密钥体制进行密钥管理的系统。可以用于防止窃听、 防止replay攻击、保护数据完整性等场合。 2)功能特性 1.安全性 Kerberos提供双向认证,不仅Server可以对Client 进行认证,Client也能对Server进行认证。Server 对Client认证成功之后,通过返回Client发送的时间戳,向Client提供验证自己身份的手段。 1.可靠性 认证服务是其他服务的基础,服务认证过程有助于提升整个系统的可用性和高可靠性。 1.可扩展性 KDC(秘钥分配中心)是秘钥体系的重要部分,旨在减少密钥体制所固有的交换密钥时所面临的风 险。用户可以根据需要扩展多个KDC。 1.开放性 Kerberos已经成为计算机领域一个被广泛接受的标准,所以使用Kerberos可以轻松实现不同平台之 间的互操作。 二、Kerberos中的核心概念 Kerberos中有以下一些概念需要了解: KDC:密钥分发巾心,负责管理发放票据,记录授权。 Realm: Kerberos管理领域的标识。 principal:Kerberos 下的用户可以称为 Principal,当每添加一个用户或服务的时候都需要向kdc 添加一条principal, principal的形式为:主名称/实例名@领域名。 主名称:主名称可以是用户名或服务名,表示是用于提供各种网络服务(如hdfs、yam,、hive) 的主体。 实例名:实例名简单理解为主机名。 keytab文件:存储了用户的加密密码。常用这种方式认证。 1)用户principal 用户principal的形式: Name[/Instance]@REALM 其中Instance是可选的,通常用于更好地限定用户的类型。比如,一个管理员用户通常会有admin instance,即Name/admin@REALM。 下面是指代用户的一些principal的例子: pippo@EXAMPLE.COM admin/admin@EXAMPLE.COM

cnicetoupp/admin@EXAMPLE.COM 2)服务principal 用户principal的形式: Service/Hostname@REALM 第一部分是service的名字,比如imap, AFS, ftp. 通常’host’这个名字被用于指明对一台机器的 通用的访问(telnent, rsh, ssh)。 第二个component是提供这个服务的机器的全限定域名(FQDN)。这个component跟DNS对应用 服务器的IP地址进行逆向解析后得到的主机名。 下面是指代服务principal的例子: imap/hadoop-node1@EXAMPLE.COM host/hadoop-node1@EXAMPLE.COM afs/hadoop-node1@EXAMPLE.COM 3)Ticket Ticket分两种: Ticket Granting Ticket,TGT:这是KDC中的Authentication Server(简称AS)产生的,TGT是 向Ticket Granting Server(TGS)用于表明自己真实身份的东西。 Service Ticket:这是KDC中的Ticket Granting Server(简称TGS)产生的,Service Ticket 是用于 向应用服务器表明自己身份的东西 三、Kerberos架构与工作原理 AS_REQ是在初始化一个用户(kinit)的时候发出的用户认证请求,这个请求是发给KDC中的 Authentication Server (AS); AS_REP是 AS回复给client的信息,其中包括TGT (用TGS secret key加密过的) and the session key (用发请求的用户的secret key加密过的); TGS_REQ是client为了一个service ticket向Ticket Granting Server (TGS)的信息. 其中包括上一条信息 中获得的TGT (用TGS secret key加密过的) ,一个客户端产生的一个authenticator(用session key加 密过的). TGS_REP是TGS回复给TGS_REQ的信息. 其中包括service ticket(用appservice的secret key加密 过),和一个TGS产生的service sessinon key(之前AS产生的一条session key给加密过的) AP_REQ是一条客户端发给appserver的访问服务的请求,其中包括service ticket和一个authenticator (使用TGS产生的service session key 加密过的) AP_REP是appserver回复给client的一条信息,证明这个appserver确实是客户端希望访问的server。 不过这条信息也不一定总是要回复的。比如当客户端和appserver需要相互认证的时候,客户端向 appserver发出请求,这个时候就不需要回复信息。

Aug. 5, 2026

kinit Cannot contact any KDC for realm 'EXAMPLE.COM' while getting initial

|
|

kinit: Cannot contact any KDC for realm ‘EXAMPLE.COM’ while getting initial credentials 客户端和KDC之间的网络问题 krb5.conf中的KDC详细信息不正确

Aug. 5, 2026

zookeeper能启动但是选举失败

|
|

原来配置: quorum.auth.enableSasl=true quorum.auth.learnerRequireSasl=true quorum.auth.serverRequireSasl=true quorum.auth.learner.saslLoginContext=QuorumLearner quorum.auth.server.saslLoginContext=QuorumServer quorum.auth.kerberos.servicePrincipal=zookeeper/db-126 quorum.cnxn.threads.size=20 查看官方文档:https://cwiki.apache.org/confluence/display/ZOOKEEP ER/Server-Server+mutual+authentication 支持授权: 如果主体名称采用以下格式,ZooKeeper 服务器将支持授权,并在zoo.cfg文件中的仲裁服务器主体中 servicename/fully.qualified.domain.name@EXAMPLE.COM 配置“ ”通配符,如下所示,_HOST quorum.auth.kerberos.servicePrincipal= servicename/_HOST 现在,QuorumServer 将对配置的授权主机进行授权检查。此授权主机列表将使用zoo.cfg文件中的集成服务器详细信息 进行准备。在 LE 期间,QuorumLearner 会向 QuorumServer 发送一个认证包。现在,QuorumServer 将检查连接的 QuorumLearner 的主机名是否存在于授权主机中。如果不存在,则连接的对等方无权加入此集合,请求将立即被拒绝。 例如,zoo.cfg包含以下服务器详细信息。现在,只FQDN1, FQDN2, FQDN3允许主机加入 ZooKeeper 集群。所有其他将被 拒绝为未经授权的连接。 动物园.cfg server.1=FQDN1:port:port server.2=FQDN2:port:port server.3=FQDN3:port:port 修改后 quorum.auth.enableSasl=true quorum.auth.learnerRequireSasl=true quorum.auth.serverRequireSasl=true quorum.auth.learner.saslLoginContext=QuorumLearner quorum.auth.server.saslLoginContext=QuorumServer quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST

quorum.cnxn.threads.size=20

Aug. 5, 2026

配置SASL_PLAINTEXT认证和ACLS授权常见问题

|
|

kafka启动报错 问题1 [Controller id=11, targetBrokerId=11] Failed authentication with nj03-ns-passport-201611-c2c-m12- 09.nj03.baidu.com/10.194.202.17 (Authentication failed: Invalid username or password) (org.apache.kafka.common.network.Selector) 原因: SASL_PLAINTEXT认证时用户密码验证不通过,即 kafka_server_jaas.conf 文件中KafkaServer 模块 Broker与 Broker之间sasl用户密码验证不通过,如下: username=“kafkacluster1” password=“kafkaclusterpasswd” user_kafkacluster=“kafkaclusterpasswd” 复制代码 问题2 ERROR [KafkaApi-11] Error when handling request: clientId=11, correlationId=0, api=UPDATE_METADATA, version=6, body= {controller_id=11,controller_epoch=1,broker_epoch=4294970758,topic_states=[],live_brokers= [{id=11,endpoints= [{port=8092,host=10.194.202.17,listener=SASL_PLAINTEXT,security_protocol=2,_tagged_fields= {}}],rack=null,_tagged_fields={}}],_tagged_fields={}} (kafka.server.KafkaApis) org.apache.kafka.common.errors.ClusterAuthorizationException: Request Request(processor=0, connectionId=10.194.202.17:8092-10.194.202.17:59100-0, session=Session(User:kafkacluster,/10.194.202.17), listenerName=ListenerName(SASL_PLAINTEXT), securityProtocol=SASL_PLAINTEXT, buffer=null) is not authorized 原因: kafka_server_jaas.conf 文件中KafkaServer 模块 Broker与Broker之间sasl用户密码验证正确,但acls 授权没通过。 需要添加超级用户,超级用户不需要acls授权,在server.properties文件中添加kafkacluster用户,如下: super.users=User:admin;User:kafkacluster 复制代码

kafka 客户端(包括consumer和producer)连接报错 问题1 [2020-04-17 16:17:20,986] WARN [Consumer clientId=consumer_01, groupId=c1] Bootstrap broker 10.194.202.17:8092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient) [2020-04-17 16:17:20,989] ERROR Error processing message, terminating consumer process: (kafka.tools.ConsoleConsumer$) org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed: Invalid username or password 原因:SASL_PLAINTEXT认证时用户密码验证不通过,即 kafka_server_jaas.conf 文件中KafkaServer 模块 client与 Broker之间sasl用户密码验证不通过。检查如下用户名密码: sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=‘consumer’ password=‘consumerpasswd’; 复制代码 问题2 [2020-04-17 16:17:01,166] WARN [Consumer clientId=consumer_01, groupId=c1] Error while fetching metadata with correlation id 2 : {test.1=TOPIC_AUTHORIZATION_FAILED} (org.apache.kafka.clients.NetworkClient) [2020-04-17 16:17:01,172] ERROR [Consumer clientId=consumer_01, groupId=c1] Topic authorization failed for topics [test.1] (org.apache.kafka.clients.Metadata) [2020-04-17 16:17:01,174] ERROR Error processing message, terminating consumer process: (kafka.tools.ConsoleConsumer$) org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [test.1] 原因:SASL_PLAINTEXT认证时用户密码验证正确,但acls 授权没通过,即此用户没有访问此topic(test.1)的权限,请联 系管理员对用户授权 作者:ponylee 链接:https://juejin.cn/post/7129758240719503374 来源:稀土掘金

Aug. 5, 2026

实践真知:KAFKA JAVA CONSUMER

|
|

首先创建Consumer需要的配置信息,最基本的有五个信息: Kafka集群的地址。 发送的Message中Key的序列化方式。 发送的Message中Value的序列化方式。 指定Consumer Group。 指定拉取Message范围的策略。 Properties properties =newProperties(); properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“IP:Port”); properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG,“consumer_group_1”); properties.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“latest”);// earliest, none 然后传入上面实例化好的配置信息,实例化Consumer: KafkaConsumer<String, String> consumer =newKafkaConsumer<String, String>(properties); 然后通过Consumer的方法订阅Topic: consumer.subscribe(Arrays.asList(“first_topic”)); 最后获取Topic里的Message,将Message信息输出到日志中: while(true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for(ConsumerRecord<String, String> record : records) { logger.info(“Key: " + record.key() + “, Value: " + record.value()); logger.info(“Partition: " + record.partition() + “, Offset: " + record.offset()); } }

Consumer的方法可以设置获取数据的时间间隔,同时回忆一下在之前 Consumer章节的Consumer Poll Options小节中,说过关于Consumer获取Message的四个配置项,都 可以在Properties里进行设置。 启动Java Consumer后,在控制台可以看到如下信息: [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 2.0.0 [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : 3402a8361b734732 [main] INFO org.apache.kafka.clients.Metadata - Cluster ID: 4nh_0r5iQ_KsR_Fzf1HTGg [main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer clientId=consumer-1, groupId=consumer_group_1] Discovered group coordinator IP:9092 (id: 2147483647 rack: null) [main] INFO org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer clientId=consumer-1, groupId=consumer_group_1] Revoking previously assigned partitions [] [main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer clientId=consumer-1, groupId=consumer_group_1] (Re-)joining group [main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer clientId=consumer-1, groupId=consumer_group_1] Successfully joined group with generation 1 [main] INFO org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer clientId=consumer-1, groupId=consumer_group_1] Setting newly assigned partitions [first_topic-0, first_topic-1, first_topic-2] [main] INFO org.apache.kafka.clients.consumer.internals.Fetcher - [Consumer clientId=consumer-1, groupId=consumer_group_1] Resetting offset for partition first_topic-0 to offset 23. [main] INFO org.apache.kafka.clients.consumer.internals.Fetcher - [Consumer clientId=consumer-1, groupId=consumer_group_1] Resetting offset for partition first_topic-1 to offset 24. [main] INFO org.apache.kafka.clients.consumer.internals.Fetcher - [Consumer clientId=consumer-1, groupId=consumer_group_1] Resetting offset for partition first_topic-2 to offset 21. 在上面的信息中,可以看到 这句话,说明当前这个Consumer会获取这个Topic中全部Partition中的 Message。 如果我们再启动一个Consumer,这个Consumer和第一个在同一个组里,看看会有什么输出信息: [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 2.0.0 [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : 3402a8361b734732 [main] INFO org.apache.kafka.clients.Metadata - Cluster ID: 4nh_0r5iQ_KsR_Fzf1HTGg

Aug. 5, 2026

Caused by GSSException No valid credentials provided (Mechanism level Serve

|
|

[2023-04-27 16:35:37,701] INFO [ZooKeeperClient] Connected. (kafka.zookeeper.ZooKeeperClient) [2023-04-27 16:35:37,706] ERROR An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member’s received SASL token. Zookeeper Client will go to AUTH_FAILED state. (org.apache.zookeeper.client.ZooKeeperSaslClient) [2023-04-27 16:35:37,707] ERROR SASL authentication with Zookeeper Quorum member failed: javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member’s received SASL token. Zookeeper Client will go to AUTH_FAILED state. (org.apache.zookeeper.ClientCnxn) [2023-04-27 16:35:37,707] ERROR [ZooKeeperClient] Auth failed. (kafka.zookeeper.ZooKeeperClient) [2023-04-27 16:35:37,739] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) org.apache.zookeeper.KeeperException$AuthFailedException: KeeperErrorCode = AuthFailed for /consumers at org.apache.zookeeper.KeeperException.create(KeeperException.java:126) at org.apache.zookeeper.KeeperException.create(KeeperException.java:54) at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:499) at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1449) at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1371) at kafka.zk.KafkaZkClient$$anonfun$createTopLevelPaths$1.apply(KafkaZkClient.scala:1363) at kafka.zk.KafkaZkClient$$anonfun$createTopLevelPaths$1.apply(KafkaZkClient.scala:1363) at scala.collection.immutable.List.foreach(List.scala:392) at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1363) at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:373) at kafka.server.KafkaServer.startup(KafkaServer.scala:202) at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38) at kafka.Kafka$.main(Kafka.scala:75) at kafka.Kafka.main(Kafka.scala) [2023-04-27 16:35:37,740] INFO shutting down (kafka.server.KafkaServer) [2023-04-27 16:35:37,744] WARN (kafka.utils.CoreUtils$) java.lang.NullPointerException at kafka.server.KafkaServer$$anonfun$shutdown$5.apply$mcV$sp(KafkaServer.scala:579) at kafka.utils.CoreUtils$.swallow(CoreUtils.scala:86) at kafka.server.KafkaServer.shutdown(KafkaServer.scala:579) at kafka.server.KafkaServer.startup(KafkaServer.scala:329) at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38) at kafka.Kafka$.main(Kafka.scala:75)

Aug. 5, 2026

Could not find a 'KafkaClient' entry in the JAAS configuration. System property

|
|

Could not find a ‘KafkaClient’ entry in the JAAS configuratio n. System property ‘java.security.auth.login.config’ is System.setProperty(“java.security.auth.login.config”, jaasPath); pro.put(“sasl.jaas.config”, “com.sun.security.auth.module.Krb5LoginModule required " + 表示如果同时设置了这两个,则启用sasl.jaas.config。所以需要检查是哪个生效了,

Aug. 5, 2026

Error while fetching metadata with correlation id 47 {test1=LEADER_NOT_AVA

|
|

Error while fetching metadata with correlation id 47 : {test1=LEADER_NOT_AVAILABLE} Error while fetching metadata with correlation id : {LEADER_NOT_AVAILABLE} 表示无法识别kafka hostname 正确处理姿势 1、修改server.properties如下,目的是让kafka监听的到红框两个都要写 vi /opt/kafka/kafka/config/server.properties 同时一定写正确主机名称,切记!! 我的之前写成hostname,正确的是host.name !注意一定要多看配置中的 注释和小心谨慎。否则后期的排除bug真心是个力气活!!!

page1

page2

Aug. 5, 2026

Exception in thread main org.apache.kafka.common.errors.TopicAuthorizationE

|
|

Exception in thread “main” org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [demo1] 原因是该消费者组没有消费主题的权限,即 ACL 操作,当然换成 admin 是不存在这个问题的

Aug. 5, 2026

kafka consumer.seek 之后立即 poll 可能拉不到消息

|
|

问题# 有个需求,需要频繁seek到指定partition的指定offset,然后poll,且只poll一次,目的是为了快速将指定 offset的消息拉取出来。 通常的poll写法是,将poll逻辑放在死循环里,第一次拉不到,第二次继续。如果offset上有消息,就一定 能消费到: Copy consumer.subscribe(“topics”); while(true){ records = consumer.poll(Duration.ofSeconds(1)); // do something with records } 但我使用的是consumer.assign()方法,而不是subscribe()。因为要灵活指定分区,用subscribe的话,触 发rebalance很麻烦。代码如下: Copy public ConsumerRecord<String, String> seekAndPoll(String topic, int partition, long offset) { TopicPartitiontp=newTopicPartition(topic, partition); consumer.assign(Collections.singleton(tp)); System.out.println(“assignment:” + consumer.assignment()); // 这里是有分配到分区的 consumer.seek(tp, offset); ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)) if(records.isEmpty()){ // 大概率拉取不到消息,进入此分支 returnnull; } else { return records.iterator().next(); } } 由于我只poll一次,这就要求必须一次拉到消息。从现象上看,感觉是在seek之后,kafka有些metadata 更新之类的操作未执行完毕,此时poll就拉不到消息。 我在StackOverflow上也搜到了这个问题(java - Kafka Cluster sometimes returns no records during see k and poll - Stack Overflow),但是没有答案。在解决了这个问题后,我添加了一个答案。 分析# 猜测1 新旧poll方法的区别# 在测试时,发现有时使用旧版本的方法有效,使用新版本的方法 无效。会不会跟这个有关?(调式发现无关,不感兴趣的可跳过这一节) 两个poll方法签名如下: Copy @Deprecated public ConsumerRecords<K, V> poll(finallong timeoutMs) { return poll(time.timer(timeoutMs), false); }

Aug. 5, 2026

Kafka连接服务器出现Connection to node 1 (localhost127.0.0.19092) could not be establish

|
|

Kafka连接服务器出现:Connection to node 1 (localhost/127.0.0.1:9092) could not be established.「建议 收藏」 解决问题 修改server.properties的两行默认配置,即可通过外网连接服务器Kafka,问题解决:

允许外部端口连接

listeners=PLAINTEXT://0.0.0.0:9092

外部代理地址

advertised.listeners=PLAINTEXT://自己ip:9092

Aug. 5, 2026

KeeperErrorCode = AuthFailed for consumers

|
|

[2022-11-20 21:23:29,448] ERROR SASL authentication failed using login context ‘Client’ with exception: {} (org.apache.zookeeper.client.ZooKeeperSaslClient) javax.security.sasl.SaslException: Error in authenticating with a Zookeeper Quorum member: the quorum member’s saslToken is null. at org.apache.zookeeper.client.ZooKeeperSaslClient.createSaslToken(ZooKeep [2022-11-20 21:23:29,487] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) org.apache.zookeeper.KeeperException$AuthFailedException: KeeperErrorCode = AuthFailed for /consumers at org.apache.zookeeper.KeeperException.create(KeeperException.java:126) at org.apache.zookeeper.KeeperException.create(KeeperException.java:54) at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:560) at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1610) at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1532) at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1(KafkaZkClient.scala:1524) at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1$adapted(KafkaZkClient.scala:1524) at scala.collection.immutable.List.foreach(List.scala:392) at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1524) at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:388) at kafka.server.KafkaServer.startup(KafkaServer.scala:207) at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38) at kafka.Kafka$.main(Kafka.scala:84) at kafka.Kafka.main(Kafka.scala) [2022-11-20 21:23:29,489] INFO shutting down (kafka.server.KafkaServer) [2022-11-20 21:23:29,491] INFO [ZooKeeperClient Kafka server] Closing. (kafka.zookeeper.ZooKeeperClient) [2022-11-20 21:23:29,496] INFO [ZooKeeperClient Kafka server] Closed. (kafka.zookeeper.ZooKeeperClient) [2022-11-20 21:23:29,498] INFO shut down completed (kafka.server.KafkaServer) [2022-11-20 21:23:29,498] ERROR Exiting Kafka. (kafka.server.KafkaServerStartable) [2022-11-20 21:23:29,505] INFO shutting down (kafka.server.KafkaServer) 有可能是因为 kafka 集群中节点信息与zookeeper中存储的不一致导致的,删除所有节点数据重启

Aug. 5, 2026

git还原到之前某个版本,本地和远程都还原

|
|

git还原到之前某个版本,本地和远程都还原 命令行操作: 第一步: git log 查看之前的commit的id,找到想要还原的版本 第二步: git reset –hard 44bd896bb726be3d3815f1f25d738a9cd402a477   还原到之前的某个版本 第三步: git push -f origin master  强制push到远程

作者:李大瑞 来源:CSDN 原文:https://blog.csdn.net/li295214001/article/details/71194564 版权声明:本文为博主原创文章,转载请附上博文链接!

Aug. 5, 2026

idea配置git

|
|

1、默认安装git与idea 2、打开idea的git项目 3、在setting的 4、可以配置github选项但是我没成功,可以不配置此项。 5、打开gitbash 检查有无生成密钥,这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经 存在,那么你可以跳过步骤6,直接进入步骤7。 命令: 6、创建一个 SSH key , 命令: 代码参数含义: -t 指定密钥类型,默认是 rsa ,可以省略。 -C 设置注释文字,比如邮箱。 -f 指定密钥文件存储文件名。 以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如: Generating public/private rsa key pair.

Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]

当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。 接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码), 当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了,如: Enter passphrase (empty for no passphrase):

Enter same passphrase again:

接下来,就会显示如下代码提示,如: Your identification has been saved in /c/Users/you/.ssh/id_rsa.

Aug. 5, 2026

报错:We trust you have received the usual lecture from the local System

|
|

因为没有应用sshpass 的形式操作文件;以后应用的scp 进行文件的操作;可能会提醒 报错: We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. sudo: no tty present and no askpass program specified Cleaning up project directory and file based variables 00:00 ERROR: Job failed: exit status 1 起因: 因为尝试应用sudo运行命令引起的,然而调用用户没有被受权应用 sudo 解决: 关上 sudoers 文件vim /etc/sudoers ;将以下内容增加到文件底部 gitlab-runner ALL=(ALL) NOPASSWD: ALL

Aug. 5, 2026

常用 Git 命令清单

|
|

我每天使用 Git ,但是很多命令记不住。 一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐 怕要记住60~100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一、新建代码库

在当前目录新建一个Git代码库

$ git init

新建一个目录,将其初始化为Git代码库

$ git init [project-name]

下载一个项目和它的整个代码历史

$ git clone [url] 二、配置 Git的设置文件为,它可以在用户主目录下(全局配置),也可以在 项目目录下(项目配置)。

显示当前的Git配置

$ git config –list

编辑Git配置文件

$ git config -e [–global]

设置提交代码时的用户信息

$ git config [–global] user.name “[name]” $ git config [–global] user.email “[email address]” 三、增加/删除文件

添加指定文件到暂存区

$ git add [file1][file2]…

添加指定目录到暂存区,包括子目录

$ git add [dir]

添加当前目录的所有文件到暂存区

$ git add .

Aug. 5, 2026

常用命令

|
|

命令用于切换到某个快照。 命令用于展示某个快照的所有代码变动。 命令查看整个版本历史(命令只显示当前分支的变动,没提交到分支的不显示)

Aug. 5, 2026

撤销 Git 操作

|
|

一、撤销提交 一种常见的场景是,提交代码以后,你突然意识到这个提交有问题,应该撤 销掉,这时执行下面的命令就可以了。 $ git revert HEAD 上面命令的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导 致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代 码的风险。 命令只能抵消上一个提交,如果想抵消多个提交,必须在命令行依 次指定这些提交。比如,抵消前两个提交,要像下面这样写。 $ git revert [倒数第一个提交][倒数第二个提交] 命令还有两个参数。 –no-edit:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。 –no-commit:只抵消暂存区和工作区的文件变化,不产生新的提交。 二、丢弃提交 如果希望以前的提交在历史中彻底消失,而不是被抵消掉,可以使用 命令,丢弃掉某个提交之后的所有提交。 $ git reset [last good SHA] 的原理是,让最新提交的指针回到以前某个时点,该时点之后的提交 都从历史中消失。 默认情况下,不改变工作区的文件(但会改变暂存区),参数 可以让工作区里面的文件也回到以前的状态。 $ git reset –hard [last good SHA] 执行命令之后,如果想找回那些丢弃掉的提交,可以使用命 令,具体做法参考这里。不过,这种做法有时效性,时间长了可能找不回 来。 三、替换上一次提交 提交以后,发现提交信息写错了,这时可以使用命令的参数, 可以修改上一次的提交信息。

$ git commit –amend -m “Fixes bug #42” 它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。 这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,不仅 可以修改提交信息,还可以整个把上一次提交替换掉。 四、撤销工作区的文件修改 如果工作区的某个文件被改乱了,但还没有提交,可以用命令找 回本次修改之前的文件。 $ git checkout –[filename] 它的原理是先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢 复上一次提交的版本。 注意,工作区的文件变化一旦被撤销,就无法找回了。 五、从暂存区撤销文件 如果不小心把一个文件添加到暂存区,可以用下面的命令撤销。 $ git rm –cached [filename] 上面的命令不影响已经提交的内容。 六、撤销当前分支的变化 你在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放 到另一个分支。

Aug. 5, 2026

删除 一些 没有 git add 的 文件;

|
|

删除一些没有 git add 的文件; git clean 参数 -n 显示将要删除的文件和目录 -f 删除文件,-df 删除文件和目录 git clean -n git clean -df git clean -f # 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git clean -fd # 连 gitignore 的untrack 文件/目录也一起删掉(慎用,一般这个是用来删掉编译出来的 .o之类的文件用的) git clean -xfd # 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删 git clean -nxfd git clean -nf git clean -nfd

Aug. 5, 2026

centos安装gitlab(rpm包)

|
|

1、在清华源网站下载安装包 Index of /gitlab-ce/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、执行安装命令 rpm -ivh gitlab-ce-14.9.2-ce.0.el8.x86_64.rpm 3.修改配置文件 (1)在虚拟机上打开终端,如果你不是root身份那么打开终端后,首先需要输入:su -(ps:su和-之间 是有空格滴),然后回车;输入你虚拟机的登录密码。哦了,此时你已经是root身份了。 (2)在以上窗口命令行中输入 vim /etc/gitlab/gitlab.rb后(ps:gitlab.rb就是各位小伙伴儿需要修改的文 件),如下图

需要配置以下几个位置,来,跟我做: 第1个位置:配置Gitlab的地址,即上文中我说的ip地址(由于我没给ip映射域名,所以就写的事虚拟机的 ip地址)。如下图: 第2个位置:用鼠标拉动命令行的滚动条,当命令行右下角显示2%(大概这个位置)的时候,你会看到 以下内容

按照图中我的修改,各位小伙伴儿相应的修改成自己的就行。其实就需要修改三行内容就行(有红色字 体的3行),并且这3行的每行开头的#一定要删了,否则就算你修改了,也不能生效的。 总之,改这个3行的意思就是说,配置一个发邮件的邮箱(可以理解为管理员邮箱)。也就是说,在以后 使用gitlab的时候,如果有邮件通知,用哪个邮箱来发邮件。从图中的3行可以看到,有两个配邮箱地址 的地址,一个是发邮件的邮箱,一个是回复邮件时回复到哪个邮箱。一般情况下,这两个地方是的邮箱 是一样的,各位小伙伴儿不要太纠结了。 第3个位置:用鼠标拉动命令行的滚动条,当命令行右下角显示24%(大概这个位置)的时候,你会看到 以下内容,按照下面的例子照猫画虎就行。

这个地方的配置和上一步配邮箱地址是息息相关的。由于上一步我配置发邮件的邮箱是网易的126邮 箱,所以这个地方我的配置是这样的(特别提醒:上图中的‘smtp_password’是邮箱的授权码,不是邮箱 的登录密码)。 (2)执行下面命令让配置生效。 gitlab-ctl reconfigure sudo gitlab-ctl start # 启动所有 gitlab 组件; sudo gitlab-ctl stop # 停止所有 gitlab 组件; sudo gitlab-ctl restart # 重启所有 gitlab 组件; sudo gitlab-ctl status # 查看服务状态; sudo gitlab-ctl reconfigure # 从新加载配置文件; sudo vim /etc/gitlab/gitlab.rb # 修改默认的配置文件; gitlab-rake gitlab:check SANITIZE=true –trace # 检查gitlab; sudo gitlab-ctl tail # 查看日志; 4. 配置防火墙 (1)开启防火墙 systemctl status firewalld systemctl start firewalld systemctl enable firewalld (2)开放所需服务,如下是开通ssh, http,https服务. [root@c7201 gitlab]# firewall-cmd –permanent –add-service ssh success [root@c7201 gitlab]# firewall-cmd –permanent –add-service http

Aug. 5, 2026

conda使用

|
|

conda create -n rnaseq #创建conda小环境 - -n 用来指定环境的名称 conda create -n database python=3.7.3 #指定环境中需要带的python的版本 conda activate rnaseq # 启动小环境 conda deactivate #退出小环境111 conda env list / conda info –env #查看共有多少个小环境 conda remove -n python –all #删除conda小环境 conda create -n envname python=3.4 scipy=0.15.0 astroib numpy conda info –env conda info -e conda remove -n python39 –all conda list ##获取当前环境中已安装的包 conda list -n python39 ##获取指定环境中已安装的包 conda list –explicit > requirements.txt conda create –name newenv –requirements.txt conda install –name newenv –file requirements.txt conda install –offline package.tar

Aug. 5, 2026

debian12安装Miniconda3

|
|

下载Miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

清华源

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.9.2-0- Linux-x86_64.sh 安装Miniconda sh Miniconda3-latest-Linux-x86_64.sh 会强制读取协议协议拉到最后等一会就会弹出安装页面根据提示选择安装就好 Conda常用命令 删除缓存(分别表示删除无用的package,删除无用的tar,删除无用的tar和 cache) conda clean -p conda clean -t conda clean –all 镜像源(设置清华源) conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda- forge/ conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/

镜像源(设置阿里云源) conda config –add channels https://mirrors.aliyun.com/anaconda/pkgs/free conda config –add channels https://mirrors.aliyun.com/anaconda/pkgs/main 镜像源(显示目前源) conda config –show channels 镜像源(删除源) conda config –remove channels 镜像源(删除所有源) conda config –remove-key channels 更新conda conda update conda 查看虚拟环境版本历史 conda list –revisions 恢复到某个版本的虚拟环境

Aug. 5, 2026

debian12下安装英伟达显卡驱动和CUDA套件

|
|

检查仓库源 确保仓库包含contrib和non-free部分。Kali默认就有此部分。Debian可能需要自己手动添加,建议检查下为好。 检查是否包括contrib和non-free grep “contrib non-free” /etc/apt/sources.list 如果没有的话,需要手动添加。源文件在/etc/apt/sources.list apt edit-sources 或 vim /etc/apt/sources.list deb http://deb.debian.org/debian/ bookworm main non-free-firmware 改为 deb http://deb.debian.org/debian/ bookworm main non-free-firmware non-free contrib 更新软件包 apt update 检查显卡 #lspci | grep -i vga root@ecs-70211683:~# lspci 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) 00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] 00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] 00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) 00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03) 00:02.0 VGA compatible controller: Cirrus Logic GD 5446 00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device 00:04.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI 00:05.0 Communication controller: Red Hat, Inc. Virtio console

Aug. 5, 2026

dify本地源码部署

|
|

官方文档 本地源码启动 | Dify 一、下载源码 仓库地址:https://github.com/langgenius/dify.git 二、安装所需组件 需要docker环境部署所需组件,分别是 redis postgres weaviate(向量数据库) #注意除了映射地址之外尽量不要改动,账号密码在项目中已有默认配置,改动的话要做相应的改动 docker run -d –name redis –restart=always -v /data/redis/data:/data -p 6379:6379 redis:6-alpine redis-server –requirepass difyai123456 docker run -it –name postgres –restart always -e POSTGRES_PASSWORD=‘difyai123456’ -e POSTGRES_DB=‘dify’ -e PGDATA=’/var/lib/postgresql/data/pgdata’ -v /data/db/data:/var/lib/postgresql/data -p 5432:5432 -d postgres:15-alpine docker run -it –name weaviate –restart=always -v /data/weaviate:/var/lib/weaviate -e QUERY_DEFAULTS_LIMIT=25 -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=‘false’ -e PERSISTENCE_DATA_PATH=’/var/lib/weaviate’ -e DEFAULT_VECTORIZER_MODULE=‘none’ -e CLUSTER_HOSTNAME=‘node1’ -e AUTHENTICATION_APIKEY_ENABLED=‘true’ -e AUTHENTICATION_APIKEY_ALLOWED_KEYS=‘WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih’ -e AUTHENTICATION_APIKEY_USERS='hello@dify.ai ’ -e AUTHORIZATION_ADMINLIST_ENABLED=‘true’ -e AUTHORIZATION_ADMINLIST_USERS='hello@dify.ai ’ -p 8080:8080 -d semitechnologies/weaviate:1.19.0 三、配置后端环境 1、进入到项目目录的api下 cd api 2、复制环境变量配置文件 cp .env.example .env 3、生成随机密钥,并替换 .env 中 SECRET_KEY 的值 openssl rand -base64 42 sed -i ’s/SECRET_KEY=.*/SECRET_KEY=<your_value>/’ .env 4、使用conda 创建新的环境 conda create -n dify310 python=3.10

Aug. 5, 2026

git Filename too long

|
|

C:\Users\User\Desktop>git clone https://github.com/XXXXXXXXXX.git Cloning into ‘one-piece’… remote: Counting objects:5463, done. remote: Compressing objects:100%(3600/3600), done. remote: Total 5463(delta 1539), reused 5359(delta 1438), pack-reused 0 Receiving objects:100%(5463/5463),5.08 MiB |1.38 MiB/s, done. Resolving deltas:100%(1539/1539), done. Checking connectivity… done. warning: unable to access ‘hackathon/node_modules/noble/node_modules/bluetooth-hci- socket/node_modules/usb /node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there- yet/node_modules/readable-stream/ node_modules/core-util-is/lib/.gitattributes’: Filename too long fatal: cannot create directory at ‘hackathon/node_modules/noble/node_modules/bluetooth- hci-socket/node_mod ules/usb/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there- yet/node_modules/readable -stream/node_modules/process-nextick-args’: Filename too long warning: Clone succeeded, but checkout failed. You can inspect what was checked out with’git status’ and retry the checkout with’git checkout -f HEAD’ git有可以创建4096长度的文件名,然而在windows最多是260,因为git用了旧版本的windows api,为此 踩了个坑。 解决 打开git命令行: git config –global core.longpaths true

Aug. 5, 2026

git cherry-pick 把一个分支的commit 提交到另外一个分支

|
|

git cherry-pick 0128660c08e325d410cb845616af355c0c19c6fe 一、基本用法 命令的作用,就是将指定的提交(commit)应用于其他分支。 $ git cherry-pick 上面命令就会将指定的提交,应用于当前分支。这会在当前分支产 生一个新的提交,当然它们的哈希值会不一样。 举例来说,代码仓库有和两个分支。 a - b - c - d Master
e - f - g Feature 现在将提交应用到分支。

切换到 master 分支

$ git checkout master

Cherry pick 操作

$ git cherry-pick f 上面的操作完成以后,代码库就变成了下面的样子。 a - b - c - d - f Master
e - f - g Feature 从上面可以看到,分支的末尾增加了一个提交。 命令的参数,不一定是提交的哈希值,分支名也是可以的,表 示转移该分支的最新提交。 $ git cherry-pick feature 上面代码表示将分支的最近一次提交,转移到当前分支。 二、转移多个提交 Cherry pick 支持一次转移多个提交。

Aug. 5, 2026

gitlab-runner安装

|
|

1、在清华源网站下载安装包 Index of /gitlab-runner/yum/el8-x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、执行安装命令 #rpm离线安装gitlab runner,需要依赖git,所以请提前安装git rpm -ivh 3、启动runner systemctl daemon-reload #重新加载配置 systemctl start gitlab-runner #启动服务 systemctl enable gitlab-runner #设置开机启动 systemctl restart gitlab-runner #重启服务 4、注册runner runner 分为三种: Shared Runners: Group Runners: Specific Runners: 不同类型的runner是通过取自不同位置的token来指定的,管理员用户从软件设置处取得的为shared runner,从group的ci/cd取得的token则为group类型,一次类推。下面示例是shared runner。 一台机器可以注册多个runner gitlab-runner register root@k8s-node02 ~]# gitlab-runner register Runtime platform arch=amd64 os=linux pid=6245 revision=ac8e767a version=12.6.0 Running in system-mode. #输入公司的gitlab公网地址 Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/) : http://192.168.200.133/

Aug. 5, 2026

gitlab-runner执行docker命令提示权限不足的问题

|
|

验证是否有权限 sudo -u gitlab-runner -H docker info 将gitlab-runner用户添加到docker组 sudo usermod -aG docker gitlab-runne 验证是否生效: sudo -u gitlab-runner -H docker info

page1

Aug. 5, 2026

git常见错误处理

|
|

如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突: error: Your local changes to the following files would be overwritten by merge: protected/config/main.PHP Please, commit your changes or stash them before you can merge. 如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下: git stash git pull git stash pop 然后可以使用Git diff -w +文件名来确认代码自动合并的情况. 反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下: git reset –hard git pull 其中git reset是针对版本,如果想针对文件回退本地修改,使用 [plain]view plaincopy 1.git checkout HEAD file/to/restore iefreer

Aug. 5, 2026

git切换分支

|
|

git一般有很多分支,我们clone到本地的时候一般都是master分支,那么如何切换到其他分支呢?主要命令如 下:

  1. 查看远程分支 $ git branch -a 我在mxnet根目录下运行以上命令: ~/mxnet$ git branch -a
  • master remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/nnvm remotes/origin/piiswrong-patch-1 remotes/origin/v0.9rc1 1 2 3 4 5 6 7 8 可以看到,我们现在在master分支下
  1. 查看本地分支 ~/mxnet$ git branch
  • master 1 2
  1. 切换分支 $ git checkout -b v0.9rc1 origin/v0.9rc1 Branch v0.9rc1 set up to track remote branch v0.9rc1 from origin. Switched to a new branch ‘v0.9rc1’ #已经切换到v0.9rc1分支了 $ git branch master
  • v0.9rc1 #切换回master分支 $ git checkout master Switched to branch ‘master’ Your branch is up-to-date with ‘origin/master’.

Aug. 5, 2026

本地安装Pytorch的依赖torch torchvision torchaudio

|
|

更新 阿里云也有cpu版的镜像了 pytorch-wheels安装包下载_开源镜像站-阿里云 简介 PyTorch是一个用于机器学习和深度学习的开源深度学习框架,由Facebook于2016年发布,其主要实现了自动微分功 能,并引入动态计算图使模型建立更加灵活。Pytorch可分为前后端两个部分,前端是与用户直接交互的python API,后 端是框架内部实现的部分,包括Autograd,它是一个自动微分引擎。 网络安装 打开PyTorch官方网站,按照自己所需的方式选择安装方式,获取安装的命令。 安装包下载 以上官方网站的安装方式访问的是外国的地址,网速很慢,很难安装成功,所以可以先下载安装包,然后本地安装。 所需下载的包 一、torch 官方的下载地址:https://download.pytorch.org/whl/torch/ 清华源的地址:https://pypi.tuna.tsinghua.edu.cn/simple/torch/(此地址下载的版本不对,无法使用)

按照自己的环境选择自己所需的版本。例如:torch-2.4.1+cu124-cp310-cp310-win_amd64.whl torch版本2.4.1 GPU 的cuda的版本12.4 python版本3.10 二、torchaudio 官方的下载地址:https://download.pytorch.org/whl/torchaudio/ 清华源的地址:https://pypi.tuna.tsinghua.edu.cn/simple/torchaudio/

按照自己的环境选择自己所需的版本。例如:torchaudio-2.4.1+cu124-cp310-cp310-win_amd64.whl torchaudio版本 2.4.1 GPU 的cuda的版本12.4 python版本3.10 torch与torchaudio版本对应关系:Torchaudio documentation (pytorch.org) 来源:(PyTorch中torch、torchvision、torchaudio、torchtext版本对应关系_torch2.0.1对应的torchvision-CSDN博客) 三、torchvision 官方的下载地址:https://download.pytorch.org/whl/torchvision/ 清华源的地址:https://pypi.tuna.tsinghua.edu.cn/simple/torchaudio/

按照自己的环境选择自己所需的版本。例如:torchvision-0.19.1-cp310-cp310-win_amd64.whl torch与torchvision版本对应关系:GitHub - pytorch/vision: Datasets, Transforms and Mod els specific to Computer Vision pip本地安装

外网地址下载很慢,国内镜像下载很快,下载完了就可以执行pip安装 #先安装 torch,conda环境下先切换到想要的环境下在执行命令 pip install torch-2.4.1+cu124-cp310-cp310-win_amd64.whl pip install torchaudio-2.4.1+cu124-cp310-cp310-win_amd64.whl pip install torchvision-0.19.1-cp310-cp310-win_amd64.whl #安装完后在当前环境下切换到python命令模式下执行以下代码 #当显示True表示GPU 版本 torch安装成功,其他包测试方法同上。 import torch torch.cuda.is_available()

Aug. 5, 2026

容器内pytorch无法运行报错Unexpected error from cudaGetDeviceCount()

|
|

报错如下: root@9e039aacfc5e:/opt/video-subtitle-generator/py38# python Python 3.8.19 (default, Sep 5 2024, 00:27:22) [GCC 12.2.0] on linux Type “help”, “copyright”, “credits” or “license” for more information.

import torch torch.cuda.is_available() /usr/local/lib/python3.8/site-packages/torch/cuda/init.py:128: UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 500: named symbol not found (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.) return torch._C._cuda_getDeviceCount() > 0 False 原因: 在容器内运行 CUDA 应用程序时,带有 WSL2 的 NVIDIA 驱动程序 555.85 返回错误 500“找不到命名符号” ·问题 #520 ·NVIDIA/nvidia-容器工具包 解决: 安装新版的:nvidia-container-toolkit 仓库安装有很多教程 下面记录手动安装: 下载地址:Releases · NVIDIA/nvidia-container-toolkit

Aug. 5, 2026

conda 启动报错 Invoke-Expression

|
|

今天装完 conda ,第一次启动的时候报错 环境:win11 Invoke-Expression : 所在位置行:1 字符: 1097 + … \Installation\mingw64\bin;C:\Installation\node_js;“C:\Program Files\J … + ~~~~~~~~~~ 表达式或语句中包含意外的标记“C:\Program”。所在位置行:1 字符: 1172 + … k- 1.8\bin;C:\Program Files\Java\jdk-1.8\jre\bin;”;“C:\Program Files\M … + ~~~~~~~~~~ 表达式或语句中包含意外的标记 “C:\Program”。所在位置行:1 字符: 1219 + … ;”;“C:\Program Files\MySQL\MySQL Server 8.0\bin;”;“C:\Program Files\J … + ~~~~~~~~~~ 表达式或语句中包含意外的标记“C:\Program”。所在位置 C:\ProgramData\miniconda3\shell\condabin\Conda.psm1:76 字符: 9 + Invoke-Expression -Command $activateCommand; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand 1 AI助手 原因:之前配置 java 环境变量的时候,在一行里写了两个路径,用了分号隔开,导致 conda 启动的时候解析环境变量 的时候出错。 like: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 1 AI助手 分 2 行写就可以了 %JAVA_HOME%\bin %JAVA_HOME%\jre\bin

Aug. 5, 2026

ElasticSearch 7.12.1 IK分词器-安装及使用

|
|

使用中文,建议使用IK分词器! IK提供了两个分词算法:ik_smart 和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分! 下载 下载对应es版本的ik分词器zip(版本一定要对应)  安装 将下载好的zip文件包解压,放入到ik文件夹 #进入es安装目录下的plugins下,创建ik文件夹 cd /elasticsearch-7.12.1/plugins mkdir ik #将下载好的zip包放入ik文件夹下,执行解压 unzip elasticsearch-analysis-ik-7.12.1.zip 重启es服务 #切换成有权限的es用户 su es #杀掉进程,重启ps -ef | grep elastic kill -9 端口号 ./elsaticsearch-7.12.1/bin/elasticsearch -d 验证 http://127.0.0.1:9200/_cat/plugins

Aug. 5, 2026

ElasticSearch 7.12.1安装

|
|

前言 安装ES之前,请先检查JDK版本,es使用java编写,强依赖java环境。JDK安装过程略。 安装步骤 1.下载地址 下载 Elasticsearch | Elastic 2.解压elasticsearch-7.12.1-windows-x86_64.zip到指定目录: D:\elasticsearch\elasticsearch-7.12.1 3.进入解压后的elasticsearch目录:

  1. 新建data目录: mkdir data 2) 修改config/elasticsearch.yml: #集群名称 cluster.name: xxx #节点名称 node.name: node-1 #数据和日志的存储目录 path.data: D:\elasticsearch\elasticsearch-7.12.1\data path.logs: D:\elasticsearch\elasticsearch-7.12.1\logs #设置绑定的ip,设置为0.0.0.0以后就可以让任何计算机节点访问到了 network.host: 0.0.0.0 #默认端口 http.port: 9200 #设置在集群中的所有节点名称

cluster.initial_master_nodes: [“node-1”] 3) 修改es占用jvm空间分配(默认2G,正式服根据实际情况配置) #进入config目录下 #打开jvm.optionsvim jvm.options#设置占用空间(注意m、g小写) -Xms200m -Xmx200m 4.用户权限问题(linux) 由于es可以输入且执行脚本,为了系统安全,不允许使用root启动,添加一个新用户: #添加用户和设置密码adduser espasswd es#授权 /usr/local/elasticsearch-7.2.0 目录下的文件拥有者为 es chown es /usr/local/elasticsearch-7.2.0/ -R 5.解决会出现的问题 1) 解决 max virtual memory areas vm.max_map_count [65530] is too low 原因:max_map_count这个参数就是允许一个进程在VMAs(虚拟内存区域)拥有最大数量,VMA是 一个连续的虚拟地址空间,当进程创建一个内存映像文件时VMA的地址空间就会增加,当达到 max_map_count了就是返回out of memory errors // 修改下面的文件里面是一些内核参数vim /etc/sysctl.conf //在末尾添加以下配置 vm.max_map_count=655360 添加完保存,然后执行 sysctl -p //-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

Aug. 5, 2026

ingest-attachment 插件实现多格式文件的全文检索

|
|
  1. 安装 ingest-attachment 插件 首先,确保你已经安装了ElasticSearch。ingest-attachment插件是ElasticSearch的一个官方插件,用于处理和分析二进 制文件(如PDF、Word文档等)中的文本内容。你可以通过以下命令来安装它(以Linux环境为例):

进入ElasticSearch的插件目录

cd /path/to/elasticsearch/plugins

下载并安装ingest-attachment插件

bin/elasticsearch-plugin install ingest-attachment 2. 配置 Pipeline 在ElasticSearch中,Pipeline是一种处理文档的方式,它允许你在索引文档之前对文档进行一系列的处理操作。为了使 用ingest-attachment插件,你需要配置一个Pipeline,指定如何处理附件文件。 PUT _ingest/pipeline/attachment { “description”:“Extract attachment information”, “processors”:[ { “attachment”:{ “field”:“data”, “target_field”:“attachment”, “indexed_chars”:-1, “ignore_missing”:true } }, { “remove”:{ “field”:“data” } } ] } 在这个Pipeline中,attachment处理器用于解析data字段中的文件内容,并将解析结果存储在attachment字段中。 indexed_chars设置为-1表示不限制索引的字符数。 3. 索引文件

接下来,你可以通过HTTP API将文件发送到ElasticSearch进行索引。这里假设你已经有一个包含文件内容的Base64编 码的字符串,并准备将其发送到ElasticSearch。 curl -X POST “localhost:9200/my_index/_doc?pipeline=attachment” -H ‘Content-Type: application/json’ -d’ { “data”: “”, “file_name”: “example.pdf” } ' 注意,这里的data字段包含了文件的Base64编码内容,file_name字段是可选的,用于记录文件名。 4. 执行搜索 一旦文件被索引,你就可以像搜索普通文本一样搜索这些文件了。例如,搜索包含特定关键字的文档: GET /my_index/_search { “query”: { “match”: { “attachment.content”: “your search keyword” } } } 5. 注意事项与优化 性能考虑:对于大型文件或高并发的应用场景,建议优化ElasticSearch的资源配置,如增加内存、调整JVM设置 等。 安全性:确保通过安全的方式传输文件数据,如使用HTTPS协议。 存储与备份:考虑文件的存储和备份策略,以防数据丢失。 结论 通过ingest-attachment插件,ElasticSearch能够轻松实现对多种格式文件的全文检索。无论是企业级的文档管理系统, 还是个人用户的知识库建设,这一功能都能极大地提升信息的检索效率和便利性。希望本文能为你实现类似功能提供有 价值的参考和帮助。

Aug. 5, 2026

Ollama调用AMD 780m集显

|
|

Ollama调用AMD 780m集显 必要软件下载 AMD-Software-PRO-Edition-25.Q3-Win10-Win11-For-HIP.exe Release v0.12.7 · likelovewant/ollama-for-amd Release v0.6.4.2 · likelovewant/ROCmLibs-for-gfx1103-AMD780M-APU · GitHub 版本对应关系OllamaSetup12.7对应rocm.gfx1103.for.hip.6.4.2.7z 安装Ollama for AMD ollama for AMD (OllamaSetup.exe) 安装和官方安装一样双击下一步到底就行。默认安装路径 在C:\Users%username%\AppData\Local\Programs\Ollama 替换ROCmLibs库 从Github ROCmLibs 下载的包rocm.gfx1103.for.hip.6.4.2.7z

备份替换 rocblas.dll 备份替换library 重启ollama服务,再次测试并观察GPU占用情况

page1

page2

page2

page2

Aug. 5, 2026

Windows 11 上 WSL2 Docker 容器如何启用 GPU

|
|

一、确保宿主机安装了NVIDIA驱动和NVIDIA Docker Toolkit。 1.1、添加nvidia的仓库 sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey |
sudo apt-key add - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia- container-runtime.list |
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list sudo apt-get update 1.2、安装nvidia-container-runtime sudo apt-get install -y nvidia-container-toolkit(新版) sudo nvidia-ctk runtime configure –runtime=docker 1.3、使用以下命令配置容器运行时nvidia-ctk

该nvidia-ctk命令修改/etc/docker/daemon.json主机上的文件。该文件已更新,以便 Docker 可以使

用 NVIDIA 容器运行时。 sudo nvidia-ctk runtime configure –runtime=docker #检查 Docker 配置文件,确保已启用对 GPU 的支持 { “registry-mirrors”: [ “https://xxxx.mirror.aliyuncs.com” ], “runtimes”: { “nvidia”: { “args”: [],

“path”: “nvidia-container-runtime” } } } 1.4、重新启动 Docker 守护进程 sudo systemctl restart docker 1.5 测试

Mar. 20, 2026

Openclaw 集成企业微信

|
|

openclaw 支持很多通信工具,国内的飞书、企业微信、钉钉等都有插件支持,本文只介绍企业微信集成方法。

需要先安装openclaw,本文在 openclaw + ollama 本地源码安装 基础上进行操作。

Mar. 18, 2026

openclaw + ollama 本地源码安装

|
|

本文采用源码安装openclaw,并结合ollama本地运行大模型的方式,运行openclaw。本文安装的版本为OpenClaw 2026.3.13

Aug. 3, 2019

Introduction

Hugo is an open-source project and lives by the work of its contributors. There are plenty of open issues, and we need your help to make Hugo even more awesome. You don’t need to be a Go guru to contribute to the project’s development.

Jul. 1, 2019

What is Hugo

Hugo is a fast and modern static site generator written in Go, and designed to make website creation fun again.