首页
登录
windows
Linux
AI
搜索
登录
搜索
钟小言
致力于为您提供丰富而有趣的内容,旨在启发思考、分享知识。
累计撰写
20
篇文章
累计收到
4
条评论
首页
栏目
首页
登录
windows
Linux
AI
Exchange 2013/2016安装SSL证书步骤
【Windows Server】由于没有远程桌面授权服务器可以提供许可
openEuler-22.03-LTS部署kubernetes
VNC一款超好用的局域网远程控制工具
DeepSeek本地部署,保姆级教程,带你打造最强AI
推荐
chatgpt-on-wechat 项目多种部署方式
推荐
DeepSeek本地部署,保姆级教程,带你打造最强AI
最新文章
2025-2-7
置顶
DeepSeek本地部署,保姆级教程,带你打造最强AI
deepseek本地部署 第一步:安装ollama https://ollama.com/download 第二步:在ollama 官网搜索 https://ollama.com/ 模型大小与显卡需求 第三步:在终端执行 命令 等待安装即可 第五步:基本命令 #退出模型 >>> /bye #查看模型 C:\Users\chk>ollama list NAME ID SIZE MODIFIED deepseek-r1:1.5b a42b25d8c10a 1.1 GB 3 minutes ago #启动模型 ollama run deepseek-r1:1.5b >>> #查看帮助 C:\Users\chk>ollama -h Large language model runner Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model stop Stop a running model pull Pull a model from a registry push Push a model to a registry list List models ps List running models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command. 可视化部署Web UI 第一步:下载Chatbox AI https://chatboxai.app/zh 设置中文 第二步:将 Chatbox 连接到远程 Ollama 服务 1.在 Windows 上配置环境变量 在 Windows 上,Ollama 会继承你的用户和系统环境变量。 通过任务栏退出 Ollama。 打开设置(Windows 11)或控制面板(Windows 10),并搜索“环境变量”。 点击编辑你账户的环境变量。 为你的用户账户编辑或创建新的变量 OLLAMA_HOST,值为 0.0.0.0; 为你的用户账户编辑或创建新的变量 OLLAMA_ORIGINS,值为 *。 点击确定/应用以保存设置。 从 Windows 开始菜单启动 Ollama 应用程序。 2.服务 IP 地址 配置后,Ollama 服务将能在当前网络(如家庭 Wifi)中提供服务。你可以使用其他设备上的 Chatbox 客户端连接到此服务。Ollama 服务的 IP 地址是你电脑在当前网络中的地址。 3.注意事项 可能需要在防火墙中允许 Ollama 服务的端口(默认为 11434),具体取决于你的操作系统和网络环境。 为避免安全风险,请不要将 Ollama 服务暴露在公共网络中。家庭 Wifi 网络是一个相对安全的环境。 4.Chatbox配置模型
2025年-2月-7日
6006 阅读
1 评论
AI
2024-12-19
置顶
openEuler-22.03-LTS部署kubernetes
一、安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: • 一台或多台机器,操作系统 欧拉系统 • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 • 集群中所有机器之间网络互通 • 可以访问外网,需要拉取镜像 • 禁止swap分区 1.2 主机硬件配置说明 CPU 内存 角色 主机名 4C 4G Master k8s-master 4C 4G Node01 k8s-node01 4C 4G Node02 k8s-node02 二、主机准备 2.1 主机名配置 由于本次使用3台主机完成kubernetes集群部署,其中1台为master节点,名称为k8s-master01;其中2台为node节点,名称分别为:k8s-node01及k8s-node02 master节点 hostnamectl set-hostname k8s-master01 node01节点 hostnamectl set-hostname k8s-node01 node02节点 hostnamectl set-hostname k8s-node02 在master添加hosts: cat >> /etc/hosts << EOF 192.168.10.1 k8s-master 192.168.10.2 k8s-node1 192.168.10.3 k8s-node2 EOF 2.2 主机IP地址配置 k8s-master01节点IP地址为:192.168.10.1/24 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.10.1" PREFIX="24" GATEWAY="192.168.10.254" DNS1="8.8.8.8" k8s-node01节点IP地址为:192.168.10.2/24 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.10.2" PREFIX="24" GATEWAY="192.168.10.254" DNS1="8.8.8.8" k8s-node02节点IP地址为:192.168.10.3/24 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.10.3" PREFIX="24" GATEWAY="192.168.10.254" DNS1="8.8.8.8" 2.3 主机名与IP地址解析 所有集群主机均需要进行配置。 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.1 k8s-master01 192.168.10.2 k8s-node01 192.168.10.3 k8s-node02 2.4 防火墙配置 所有主机均需要操作。 关闭现有防火墙firewalld systemctl disable firewalld systemctl stop firewalld firewall-cmd --state not running 2.5 SELINUX配置 所有主机均需要操作。修改SELinux配置需要重启操作系统。 sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 2.6 时间同步配置 所有主机均需要操作。最小化安装系统需要安装ntpdate软件。 yum install ntpdate -y ntpdate time1.aliyun.com 修改时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改语言 sudo echo 'LANG="en_US.UTF-8"' >> /etc/profile;source /etc/profile 2.7 配置内核转发及网桥过滤 所有主机均需要操作。 将桥接的IPv4流量传递到iptables的链: cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF sysctl --system 开启内核路由转发 vi /etc/sysctl.conf net.ipv4.ip_forward=1 添加网桥过滤及内核转发配置文件 cat /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness = 0 加载br_netfilter模块 modprobe br_netfilter 查看是否加载 lsmod | grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter 使用默认配置文件生效 sysctl -p 使用新添加配置文件生效 sysctl -p /etc/sysctl.d/k8s.conf 2.8 安装ipset及ipvsadm 所有主机均需要操作。 安装ipset及ipvsadm yum -y install ipset ipvsadm 配置ipvsadm模块加载方式 添加需要加载的模块 cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF 授权、运行、检查是否加载 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack 2.9 关闭SWAP分区 修改完成后需要重启操作系统,如不重启,可临时关闭,命令为swapoff -a 临时关闭 swapoff -a 永远关闭swap分区,需要重启操作系统 cat /etc/fstab ...... # /dev/mapper/openeuler-swap none swap defaults 0 0 在上一行中行首添加# 三、容器运行时工具安装及运行 查看是否存在docker软件 yum list | grep docker pcp-pmda-docker.x86_64 5.3.7-2.oe2203sp1 docker-client-java.noarch 8.11.7-2.oe2203sp1 docker-client-java.src 8.11.7-2.oe2203sp1 docker-compose.noarch 1.22.0-4.oe2203sp1 docker-compose.src 1.22.0-4.oe2203sp1 docker-engine.src 2:18.09.0-316.oe220 docker-engine.x86_64 2:18.09.0-316.oe220 docker-engine.x86_64 2:18.09.0-316.oe220 docker-engine-debuginfo.x86_64 2:18.09.0-316.oe220 docker-engine-debugsource.x86_64 2:18.09.0-316.oe220 docker-runc.src 1.1.3-9.oe2203sp1 docker-runc.x86_64 1.1.3-9.oe2203sp1 podman-docker.noarch 1:0.10.1-12.oe2203s python-docker.src 5.0.3-1.oe2203sp1 python-docker-help.noarch 5.0.3-1.oe2203sp1 python-docker-pycreds.src 0.4.0-2.oe2203sp1 python-dockerpty.src 0.4.1-3.oe2203sp1 python-dockerpty-help.noarch 0.4.1-3.oe2203sp1 python3-docker.noarch 5.0.3-1.oe2203sp1 python3-docker-pycreds.noarch 0.4.0-2.oe2203sp1 python3-dockerpty.noarch 0.4.1-3.oe2203sp1 安装docker dnf install docker Last metadata expiration check: 0:53:18 ago on Dependencies resolved. =============================================================================== Package Architecture Version Repository Size =============================================================================== Installing: docker-engine x86_64 2:18.09.0-316.oe2203sp1 OS 38 M Installing dependencies: libcgroup x86_64 0.42.2-3.oe2203sp1 OS Transaction Summary =============================================================================== Install 2 Packages Total download size: 39 M Installed size: 160 M Is this ok [y/N]: y Downloading Packages: (1/2): libcgroup-0.42.2-3.oe2203sp1.x86_64.rpm 396 kB/s | 96 kB 00:00 (2/2): docker-engine-18.09.0-316.oe2203sp1.x86_64.rpm 10 MB/s | 38 MB 00:03 -------------------------------------------------------------------------------- Total 10 MB/s | 39 MB 00:03 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Running scriptlet: libcgroup-0.42.2-3.oe2203sp1.x86_64 1/2 Installing : libcgroup-0.42.2-3.oe2203sp1.x86_64 1/2 Running scriptlet: libcgroup-0.42.2-3.oe2203sp1.x86_64 1/2 Installing : docker-engine-2:18.09.0-316.oe2203sp1.x86_64 2/2 Running scriptlet: docker-engine-2:18.09.0-316.oe2203sp1.x86_64 2/2 Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. Verifying : docker-engine-2:18.09.0-316.oe2203sp1.x86_64 1/2 Verifying : libcgroup-0.42.2-3.oe2203sp1.x86_64 2/2 Installed: docker-engine-2:18.09.0-316.oe2203sp1.x86_64 libcgroup-0.42.2-3.oe2203sp1.x86_64 Complete! 设置docker开机启动并启动 systemctl enable --now docker 查看docker版本 docker version Client: Version: 18.09.0 EulerVersion: 18.09.0.316 API version: 1.39 Go version: go1.17.3 Git commit: 9b9af2f Built: Tue Dec 27 14:25:30 2022 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.09.0 EulerVersion: 18.09.0.316 API version: 1.39 (minimum version 1.12) Go version: go1.17.3 Git commit: 9b9af2f Built: Tue Dec 27 14:24:56 2022 OS/Arch: linux/amd64 Experimental: false 四、K8S软件安装 安装k8s依赖,连接跟踪 dnf install conntrack k8s master节点安装 dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-master k8s worker节点安装 dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-node systemctl enable kubelet 五、K8S集群初始化master kubeadm init --apiserver-advertise-address=192.168.10.1 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.2 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 输出: [init] Using Kubernetes version: v1.20.2 [preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [WARNING FileExisting-socat]: socat not found in system path [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [k8s-master01 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.1.0.1 192.168.10.1] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [k8s-master01 localhost] and IPs [192.168.10.1 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [k8s-master01 localhost] and IPs [192.168.10.1 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "sa" key and public key [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "kubelet.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Starting the kubelet [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s [apiclient] All control plane components are healthy after 6.502722 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config-1.20" in namespace kube-system with the configuration for the kubelets in the cluster [upload-certs] Skipping phase. Please see --upload-certs [mark-control-plane] Marking the node k8s-master01 as control-plane by adding the labels "node-role.kubernetes.io/master=''" and "node-role.kubernetes.io/control-plane='' (deprecated)" [mark-control-plane] Marking the node k8s-master01 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: jvx2bb.pfd31288qyqcfsn7 [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [addons] Applied essential addon: CoreDNS [addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.10.1:6443 --token jvx2bb.pfd31288qyqcfsn7 \ --discovery-token-ca-cert-hash sha256:740fa71f6c5acf156195ce6989cb49b7a64fd061b8bf56e4b1b684cbedafbd40 [root@k8s-master01 ~]# mkdir -p $HOME/.kube [root@k8s-master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@k8s-master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config 六、K8S集群工作节点加入 [root@k8s-node01 ~]kubeadm join 192.168.10.1:6443 --token jvx2bb.pfd31288qyqcfsn7 \ --discovery-token-ca-cert-hash sha256:740fa71f6c5acf156195ce6989cb49b7a64fd061b8bf56e4b1b684cbedafbd40 # [root@k8s-node02 ~]kubeadm join 192.168.10.1:6443 --token jvx2bb.pfd31288qyqcfsn7 \ --discovery-token-ca-cert-hash sha256:740fa71f6c5acf156195ce6989cb49b7a64fd061b8bf56e4b1b684cbedafbd40 [root@k8s-master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master01 NotReady control-plane,master 3m59s v1.20.2 k8s-node01 NotReady <none> 18s v1.20.2 k8s-node02 NotReady <none> 10s v1.20.2 七、K8S集群网络插件使用 [root@k8s-master01 ~]# wget https://docs.projectcalico.org/v3.19/manifests/calico.yaml 由于网络问题,我这边使用离线方式安装插件calico 1. 去github上面下载自己所需的calico离线包,项目地址: https://github.com/projectcalico/calico 2. 假设要安装最新版本v3.28.0,首先可以下载这个版本的calico.yaml,具体命令是 curl -O -L https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml 3. 下载完成之后可以通过calico.yaml查看需要安装哪些离线包,命令是: cat calico.yaml | grep image image: docker.io/calico/cni:v3.28.0 imagePullPolicy: IfNotPresent image: docker.io/calico/cni:v3.28.0 imagePullPolicy: IfNotPresent image: docker.io/calico/node:v3.28.0 imagePullPolicy: IfNotPresent image: docker.io/calico/node:v3.28.0 imagePullPolicy: IfNotPresent image: docker.io/calico/kube-controllers:v3.28.0 imagePullPolicy: IfNotPresent 4. 通过上述命令,查看到需要安装calico-cni.tar, calico-kube-controllers.tar 和 calico-node.tar三个包,然后需要将这三个包导入到k8s的命名空间中 使用导入命令将这三个包导入到k8s的命名空间中: docker load -i calico-cni.tar docker load -i calico-node.tar docker load -i calico-kube-controllers.tar 5. 导入之后就可以apply calico.yaml 文件了 6. 导入之后查看calico的pod,发现calico和coredns已经起来了 kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-8d76c5f9b-brv86 1/1 Running 0 22h calico-node-hxks2 1/1 Running 0 22h coredns-66f779496c-9hqsx 1/1 Running 0 23h coredns-66f779496c-rcc74 1/1 Running 0 23h etcd-kevin-pc 1/1 Running 4 (28m ago) 23h kube-apiserver-kevin-pc 1/1 Running 4 (28m ago) 23h kube-controller-manager-kevin-pc 1/1 Running 4 (28m ago) 23h kube-proxy-gglh4 1/1 Running 1 (28m ago) 23h kube-scheduler-kevin-pc 1/1 Running 4 (28m ago) 23h
2024年-12月-19日
7624 阅读
2 评论
other
2024-12-9
置顶
【Windows Server】由于没有远程桌面授权服务器可以提供许可
由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。请跟服务器管理员联系。原因是服务器安装了远程桌面服务RemoteApp,这个是需要授权的。但是微软官方给予了120天免授权使用,超过120天还没有可用授权就会出现远程会话被中断,可修改注册表来延长使用期限,此方法win2008和win2012适用 1、 首先进入安装了远程桌面服务RemoteApp的服务器,我这里是win2012 2、 按 win+R 键 打开运行,输入regedit 然后按 确定 3、 然后就打开了注册表编辑器 4、 然后进入 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Terminal Server \ RCM \ GracePeriod ,选中 GracePeriod 然后右键 点击 权限 选择Administrators , 把完全控制勾上,点击确定后提示:无法保存对GracePeriod权限所作的更改。 5、administrator权限赋予 回到GracePeriod,右键权限,点击高级 点击更改所有者 注意:这里选择的是Administrators,看上图中的图标。 更改所有者后在审核里进行添加 选择Administrators为主体后,在此处添加完全控制权限 6、、 选择Administrators , 然后把 完全控制 勾上 , 再按确定 7、、 选中注册表中的 REG_BINARY,然后右键 删除 8、、 选择 是 9、然后关掉注册表编辑器,重启服务器 10、重启服务器后就不会被中断了,此方法可以继续使用120天,等到120天到了再按此方法进行操作就可以再继续使用了
2024年-12月-9日
6973 阅读
0 评论
windows
2025-4-17
多Master节点的k8s集群部署
多Master节点的k8s集群部署 一、准备工作 1.准备五台主机(三台Master节点,一台Node节点,一台普通用户)如下: 角色 IP 内存 核心 磁盘 Master01 192.168.116.141 4G 4个 55G Master02 192.168.116.142 4G 4个 55G Master03 192.168.116.143 4G 4个 55G Node 192.168.116.144 4G 4个 55G 普通用户 192.168.116.150 4G 4个 55G 2.关闭SElinux,因为SElinux会影响K8S部分组件无法正常工作: sed -i '1,$s/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config reboot 3.四台主机分别配置主机名(不包括普通用户),如下: 控制节点Master01: hostnamectl set-hostname master01 && bash 控制节点Master02: hostnamectl set-hostname master02 && bash 控制节点Master03: hostnamectl set-hostname master03 && bash 工作节点Node: hostnamectl set-hostname node && bash 4.四台主机(不包括普通用户)分别配置host文件: 进入hosts文件: vim /etc/hosts 修改文件内容,添加四台主机以及IP: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.116.141 master01 192.168.116.142 master02 192.168.116.143 master03 192.168.116.144 node 修改完可以四台主机用ping命令检查是否连通: ping -c1 -W1 master01 ping -c1 -W1 master02 ping -c1 -W1 master03 ping -c1 -W1 node 5.四台主机(不包括普通用户)分别下载所需意外组件包和相关依赖包: yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip autoconf automake zlib-devel epel-release openssh-server libaio-devel vim ncurses-devel socat conntrack telnet ipvsadm 所需相关意外组件包解释如下: yum-utils:提供了一些辅助工具用于 yum 包管理器,比如 yum-config-manager,repoquery 等。 device-mapper-persistent-data:与 Linux 的设备映射功能相关,通常与 LVM(逻辑卷管理)和容器存储(如 Docker)有关。 lvm2:逻辑卷管理器,用于管理磁盘上的逻辑卷,允许灵活的磁盘分区管理。 wget:一个非交互式网络下载工具,支持 HTTP、HTTPS 和 FTP 协议,常用于下载文件。 net-tools:提供一些经典的网络工具,如 ifconfig,netstat 等,用于查看和管理网络配置。 nfs-utils:支持 NFS(网络文件系统)的工具包,允许客户端挂载远程文件系统。 lrzsz:lrz 和 lsz 是 Linux 系统下用于 X/ZMODEM 文件传输协议的命令行工具,常用于串口传输数据。 gcc:GNU C 编译器,用于编译 C 语言程序。 gcc-c++:GNU C++ 编译器,用于编译 C++ 语言程序。 make:用于构建和编译程序,通常与 Makefile 配合使用,控制程序的编译和打包过程。 cmake:跨平台的构建系统生成工具,用于管理项目的编译过程,特别适用于大型复杂项目。 libxml2-devel:开发用的 libxml2 库头文件,libxml2 是一个用于解析 XML 文件的 C 库。 openssl-devel:用于 OpenSSL 库开发的头文件和开发库,OpenSSL 是用于 SSL/TLS 加密的库。 curl:一个用于传输数据的命令行工具,支持多种协议(HTTP、FTP 等)。 curl-devel:开发用的 curl 库和头文件,支持在代码中使用 curl 相关功能。 unzip:用于解压缩 .zip 文件。 autoconf:自动生成配置脚本的工具,常用于生成软件包的 configure 文件。 automake:自动生成 Makefile.in 文件,结合 autoconf 使用,用于构建系统。 zlib-devel:zlib 库的开发头文件,zlib 是一个用于数据压缩的库。 epel-release:用于启用 EPEL(Extra Packages for Enterprise Linux)存储库,提供大量额外的软件包。 openssh-server:OpenSSH 服务器,用于通过 SSH 远程登录和管理系统。 libaio-devel:异步 I/O 库的开发头文件,提供异步文件 I/O 支持,常用于数据库和高性能应用。 vim:一个强大的文本编辑器,支持多种语言和扩展功能。 ncurses-devel:开发用的 ncurses 库,提供终端控制和用户界面的构建工具。 socat:一个多功能的网络工具,用于双向数据传输,支持多种协议和地址类型。 conntrack:连接跟踪工具,显示和操作内核中的连接跟踪表,常用于网络防火墙和 NAT 配置。 telnet:用于远程登录的一种简单网络协议,允许通过命令行与远程主机进行通信。 ipvsadm:用于管理 IPVS(IP 虚拟服务器),这是一个 Linux 内核中的负载均衡模块,常用于高可用性负载均衡集群。 6.配置主机之间免密登录 四台节点同时执行: 1)配置三台Master主机到另外一台Node主机免密登录: ssh-keygen # 遇到问题不输入任何内容,直按回车 2)把刚刚生成的公钥文件传递到其他Master和node节点,输入yes后,在输入主机对应的密码: ssh-copy-id master01 ssh-copy-id master02 ssh-copy-id master03 ssh-copy-id node 7.关闭所有主机的firewall防火墙 如果不想关闭防火墙可以添加firewall-cmd规则进行过滤筛选,相关内容查询资料,不做演示。 关闭防火墙: systemctl stop firewalld && systemctl disable firewalld systemctl status firewalld # 查询防火墙状态,关闭后应为 Active: inactive (dead) 添加防火墙规则: 6443:Kubernetes Api Server 2379、2380:Etcd数据库 10250、10255:kubelet服务 10257:kube-controller-manager 服务 10259:kube-scheduler 服务 30000-32767:在物理机映射的 NodePort端口 179、473、4789、9099:Calico 服务 9090、3000:Prometheus监控+Grafana面板 8443:Kubernetes Dashboard控制面板 # Kubernetes API Server firewall-cmd --zone=public --add-port=6443/tcp --permanent # Etcd 数据库 firewall-cmd --zone=public --add-port=2379-2380/tcp --permanent # Kubelet 服务 firewall-cmd --zone=public --add-port=10250/tcp --permanent firewall-cmd --zone=public --add-port=10255/tcp --permanent # Kube-Controller-Manager 服务 firewall-cmd --zone=public --add-port=10257/tcp --permanent # Kube-Scheduler 服务 firewall-cmd --zone=public --add-port=10259/tcp --permanent # NodePort 映射端口 firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent # Calico 服务 firewall-cmd --zone=public --add-port=179/tcp --permanent # BGP firewall-cmd --zone=public --add-port=473/tcp --permanent # IP-in-IP firewall-cmd --zone=public --add-port=4789/udp --permanent # VXLAN firewall-cmd --zone=public --add-port=9099/tcp --permanent # Calico 服务 #Prometheus监控+Grafana面板 firewall-cmd --zone=public --add-port=9090/tcp --permanent firewall-cmd --zone=public --add-port=3000/tcp --permanent # Kubernetes Dashboard控制面板 firewall-cmd --zone=public --add-port=8443/tcp --permanent # 重新加载防火墙配置以应用更改 firewall-cmd --reload 8.四台主机关闭swap交换分区 swap 分区的读写速度远低于物理内存。如果 Kubernetes 工作负载依赖于 swap 来补偿内存不足,会导致性能显著下降,尤其是在资源密集型的容器应用中。Kubernetes 更倾向于让节点直接面临内存不足的情况,而不是依赖 swap,从而促使调度器重新分配资源。 Kubernetes 默认会在 kubelet 启动时检查 swap 的状态,并要求其关闭。如果 swap 未关闭,Kubernetes 可能无法正常启动并报出错误。例如: [!WARNING] kubelet: Swap is enabled; production deployments should disable swap. 为了让 Kubernetes 正常工作,建议在所有节点上永久关闭 swap,同时调整系统的内存管理: swapoff -a # 关闭当前swap sed -i '/swap/s/^/#/' /etc/fstab # swap前添加注释 grep swap /etc/fstab # 成功关闭会这样:#/dev/mapper/rl-swap none swap defaults 0 0 9.修改内核参数 四台主机(不包括普通用户)分别执行: modprobe br_netfilter modprobe:用于加载或卸载内核模块的命令。 br_netfilter:该模块允许桥接的网络流量被 iptables 规则过滤,通常在启用网络桥接的情况下使用。 该模块主要在 Kubernetes 容器网络环境中使用,确保 Linux 内核能够正确处理网络流量的过滤和转发,特别是在容器间的通信中。 四台主机分别执行: cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf # 使配置生效 net.bridge.bridge-nf-call-ip6tables = 1:允许 IPv6 网络流量通过 Linux 网络桥接时使用 ip6tables 进行过滤。 net.bridge.bridge-nf-call-iptables = 1:允许 IPv4 网络流量通过 Linux 网络桥接时使用 iptables 进行过滤。 net.ipv4.ip_forward = 1:允许 Linux 内核进行 IPv4 数据包的转发(路由)。 这些设置确保在 Kubernetes 中,网络桥接流量可通过 iptables 和 ip6tables 过滤,并启用 IPv4 数据包转发,提升网络安全性和通信能力。 10.配置安装Docker和Containerd的yum源 四台主机分别安装docker-ce源(任选其一,只安装一个),后续操作只演示阿里源的。 # 阿里源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 清华大学开源软件镜像站 yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo # 中国科技大学开源镜像站 yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo # 中科大镜像源 yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo # 华为云源 yum-config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo 11.配置K8S命令行工具所需要的yum源 cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum makecache 12.四台主机进行时间同步 Chrony 和 NTPD都是用于时间同步的工具,但 Chrony 在许多方面有其独特的优点。以下是 Chrony 相较于 NTPD 的一些主要优点,并基于此,进行chrony时间同步的部署: 1) 四台主机安装Chrony yum -y install chrony 2)四台主机修改配置文件,添加国内 NTP 服务器 echo "server ntp1.aliyun.com iburst" >> /etc/chrony.conf echo "server ntp2.aliyun.com iburst" >> /etc/chrony.conf echo "server ntp3.aliyun.com iburst" >> /etc/chrony.conf echo "server ntp.tuna.tsinghua.edu.cn iburst" >> /etc/chrony.conf tail -n 4 /etc/chrony.conf systemctl restart chronyd 3) 可以设置定时任务,每分钟重启chrony服务,进行时间校准(非必须) echo "* * * * * /usr/bin/systemctl restart chronyd" | tee -a /var/spool/cron/root 建议手动进行添加,首先执行crontab -e命令,在将如下内容添加至定时任务中 * * * * * /usr/bin/systemctl restart chronyd 这五个星号表示时间调度,每个星号代表一个时间字段,从左到右分别是: 第一个星号:分钟(0-59) 第二个星号:小时(0-23) 第三个星号:日期(1-31) 第四个星号:月份(1-12) 第五个星号:星期几(0-7,0 和 7 都代表星期天) 在这里,每个字段都用 表示“每一个”,因此 的意思是“每分钟的每一秒”。 /usr/bin/systemctl 是 systemctl 命令的完整路径,用于管理系统服务。 13.安装Containerd Containerd 是一个高性能的容器运行时,在 Kubernetes 中它负责容器的生命周期管理,包括创建、运行、停止和删除容器,同时支持从镜像仓库拉取和管理镜像。Containerd 提供容器运行时接口 (CRI),与 Kubernetes 无缝集成,确保高效的资源利用和快速的容器启动时间。除此之外,它还支持事件监控和日志记录,方便运维和调试,是实现容器编排和管理的关键组件。 四台主机安装containerd1.6.22版本 yum -y install containerd.io-1.6.22 yum -y install containerd.io-1.6.22 --allowerasing # 如果安装有问题选择这个,默认用第一个 创建containerd的配置文件目录并修改自带的config.toml。 mkdir -pv /etc/containerd vim /etc/containerd/config.toml 修改内容如下: disabled_plugins = [] imports = [] oom_score = 0 plugin_dir = "" required_plugins = [] root = "/var/lib/containerd" state = "/run/containerd" temp = "" version = 2 [cgroup] path = "" [debug] address = "" format = "" gid = 0 level = "" uid = 0 [grpc] address = "/run/containerd/containerd.sock" gid = 0 max_recv_message_size = 16777216 max_send_message_size = 16777216 tcp_address = "" tcp_tls_ca = "" tcp_tls_cert = "" tcp_tls_key = "" uid = 0 [metrics] address = "" grpc_histogram = false [plugins] [plugins."io.containerd.gc.v1.scheduler"] deletion_threshold = 0 mutation_threshold = 100 pause_threshold = 0.02 schedule_delay = "0s" startup_delay = "100ms" [plugins."io.containerd.grpc.v1.cri"] device_ownership_from_security_context = false disable_apparmor = false disable_cgroup = false disable_hugetlb_controller = true disable_proc_mount = false disable_tcp_service = true enable_selinux = false enable_tls_streaming = false enable_unprivileged_icmp = false enable_unprivileged_ports = false ignore_image_defined_volumes = false max_concurrent_downloads = 3 max_container_log_line_size = 16384 netns_mounts_under_state_dir = false restrict_oom_score_adj = false sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" selinux_category_range = 1024 stats_collect_period = 10 stream_idle_timeout = "4h0m0s" stream_server_address = "127.0.0.1" stream_server_port = "0" systemd_cgroup = false tolerate_missing_hugetlb_controller = true unset_seccomp_profile = "" [plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/opt/cni/bin" conf_dir = "/etc/cni/net.d" conf_template = "" ip_pref = "" max_conf_num = 1 [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "runc" disable_snapshot_annotations = true discard_unpacked_layers = false ignore_rdt_not_enabled_errors = false no_pivot = false snapshotter = "overlayfs" [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime] base_runtime_spec = "" cni_conf_dir = "" cni_max_conf_num = 0 container_annotations = [] pod_annotations = [] privileged_without_host_devices = false runtime_engine = "" runtime_path = "" runtime_root = "" runtime_type = "" [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] base_runtime_spec = "" cni_conf_dir = "" cni_max_conf_num = 0 container_annotations = [] pod_annotations = [] privileged_without_host_devices = false runtime_engine = "" runtime_path = "" runtime_root = "" runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] BinaryName = "" CriuImagePath = "" CriuPath = "" CriuWorkPath = "" IoGid = 0 IoUid = 0 NoNewKeyring = false NoPivotRoot = false Root = "" ShimCgroup = "" SystemdCgroup = true [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime] base_runtime_spec = "" cni_conf_dir = "" cni_max_conf_num = 0 container_annotations = [] pod_annotations = [] privileged_without_host_devices = false runtime_engine = "" runtime_path = "" runtime_root = "" runtime_type = "" [plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime.options] [plugins."io.containerd.grpc.v1.cri".image_decryption] key_model = "node" [plugins."io.containerd.grpc.v1.cri".registry] config_path = "" [plugins."io.containerd.grpc.v1.cri".registry.auths] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.headers] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming] tls_cert_file = "" tls_key_file = "" [plugins."io.containerd.internal.v1.opt"] path = "/opt/containerd" [plugins."io.containerd.internal.v1.restart"] interval = "10s" [plugins."io.containerd.internal.v1.tracing"] sampling_ratio = 1.0 service_name = "containerd" [plugins."io.containerd.metadata.v1.bolt"] content_sharing_policy = "shared" [plugins."io.containerd.monitor.v1.cgroups"] no_prometheus = false [plugins."io.containerd.runtime.v1.linux"] no_shim = false runtime = "runc" runtime_root = "" shim = "containerd-shim" shim_debug = false [plugins."io.containerd.runtime.v2.task"] platforms = ["linux/amd64"] sched_core = false [plugins."io.containerd.service.v1.diff-service"] default = ["walking"] [plugins."io.containerd.service.v1.tasks-service"] rdt_config_file = "" [plugins."io.containerd.snapshotter.v1.aufs"] root_path = "" [plugins."io.containerd.snapshotter.v1.btrfs"] root_path = "" [plugins."io.containerd.snapshotter.v1.devmapper"] async_remove = false base_image_size = "" discard_blocks = false fs_options = "" fs_type = "" pool_name = "" root_path = "" [plugins."io.containerd.snapshotter.v1.native"] root_path = "" [plugins."io.containerd.snapshotter.v1.overlayfs"] root_path = "" upperdir_label = false [plugins."io.containerd.snapshotter.v1.zfs"] root_path = "" [plugins."io.containerd.tracing.processor.v1.otlp"] endpoint = "" insecure = false protocol = "" [proxy_plugins] [stream_processors] [stream_processors."io.containerd.ocicrypt.decoder.v1.tar"] accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"] args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"] env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"] path = "ctd-decoder" returns = "application/vnd.oci.image.layer.v1.tar" [stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"] accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"] args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"] env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"] path = "ctd-decoder" returns = "application/vnd.oci.image.layer.v1.tar+gzip" [timeouts] "io.containerd.timeout.bolt.open" = "0s" "io.containerd.timeout.shim.cleanup" = "5s" "io.containerd.timeout.shim.load" = "5s" "io.containerd.timeout.shim.shutdown" = "3s" "io.containerd.timeout.task.state" = "2s" [ttrpc] address = "" gid = 0 uid = 0 sandbox 镜像源:设置 Kubernetes 使用的沙箱容器镜像,支持高效管理容器。 sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.9” hugeTLB 控制器:禁用 hugeTLB 控制器,减少内存管理复杂性,适合不需要的环境。 disable_hugetlb_controller = true 网络插件路径:指定 CNI 网络插件的二进制和配置路径,确保网络功能正常。 bin_dir = “/opt/cni/bin” conf_dir = “/etc/cni/net.d” 垃圾回收调度器:调整垃圾回收阈值和启动延迟,优化容器资源管理和性能。 pause_threshold = 0.02 startup_delay = “100ms” 流媒体服务器:配置流媒体服务的地址和端口,实现与客户端的有效数据传输。 stream_server_address = “127.0.0.1” stream_server_port = “0” 启动并设置containerd开机自启 systemctl enable containerd --now systemctl status containerd 14.安装Docker-ce(使用docker的拉镜像功能) 1)四台主机分别安装docker-ce最新版: yum -y install docker-ce 2)启动并设置docker开机自启: systemctl start docker && systemctl enable docker.service 3)配置docker的镜像加速器地址: 注:阿里加速地址登录阿里云加速器官网查看,每个人的加速地址不同 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://fb3aq27p.mirror.aliyuncs.com", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://dockerhub.azk8s.cn", "http://hub-mirror.c.163.com" ] } EOF systemctl daemon-reload systemctl restart docker systemctl status docker 二、K8S安装部署 1.安装K8S相关核心组件 四台主机分别安装K8S相关核心组件: yum -y install kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 systemctl enable kubelet kubelet 是 Kubernetes 集群中每个节点上的核心代理,它负责根据控制平面的指示管理和维护节点上的 Pod 及容器的生命周期,确保容器按规范运行并定期与控制平面通信。kubelet 会将节点和 Pod 的状态上报给控制节点的 apiServer,apiServer再将这些信息存储到 etcd 数据库中。 kubeadm 是一个用于简化 Kubernetes 集群安装和管理的工具,快速初始化控制平面节点和将工作节点加入集群,减少手动配置的复杂性。 kubectl 是 Kubernetes 的命令行工具,用于管理员与集群进行交互,执行各种任务,如部署应用、查看资源、排查问题、管理集群状态等,通过命令行与 Kubernetes API 直接通信。 2.通过keepalived+nginx实现kubernetes apiServer的节点高可用 1)在三台Master节点分别安装keepalived+nginx,实现对apiserver的负载均衡和反向代理。Master01作为keepalived的主节点,Master02和Master03作为keepalived的备用节点。 yum -y install epel-release nginx keepalived nginx-mod-stream 2)修改配置nginx.conf配置文件: vim /etc/nginx/nginx.conf 3)更改配置配置文件完整信息如下: user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } 新增 stream 配置 stream { # 日志格式 log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent'; # 日志存放路径 access_log /var/log/nginx/k8s-access.log main; # master 调度资源池 upstream k8s-apiserver { server 192.168.116.141:6443 weight=5 max_fails=3 fail_timeout=30s; server 192.168.116.142:6443 weight=5 max_fails=3 fail_timeout=30s; server 192.168.116.143:6443 weight=5 max_fails=3 fail_timeout=30s; } server { listen 16443; # 避免与 Kubernetes master 节点冲突 proxy_pass k8s-apiserver; # 做反向代理到资源池 } } http { include /etc/nginx/mime.types; default_type application/octet-stream; # 日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } stream模块用于四层负载均衡,转发到多个k8s-apiserver节点。 四层负载均衡工作在传输层,仅关注 TCP/UDP 连接的信息,例如源IP地址、端口、目标IP地址和端口,基于这些信息进行流量转发,不关心传输的数据内容。 七层负载均衡工作在应用层,理解更高层的协议(如 HTTP、HTTPS),根据请求的具体内容(例如URL、Cookies、Headers)进行更复杂的流量分配和处理。 log_format和access_log用于记录日志。 upstream定义了多个k8s-apiserver服务器,负载均衡策略基于权重weight,并有故障处理机制。 server块中,listen使用端口16443,以避免与Kubernetes master节点的默认端口6443冲突。 4)重启nginx并设置开机自启: systemctl restart nginx && systemctl enable nginx 5)先编写keepalived的检查脚本: 注:将这个脚本分别放到三台Master节点上,建议放在/etc/keepalived/目录,方便后续进行优化更新。 #!/bin/bash Author :lyx Description :check nginx Date :2024.10.06 Version :2.3 # 定义日志文件路径 ```python LOG_FILE="/var/log/nginx_keepalived_check.log" MAX_LINES=1000 # 设置日志保留1000行(因为不做限制日志会无限增大,占用大量磁盘空间) 记录日志的函数,带有详细的时间格式,并保留最后1000行日志 log_message() { local time_stamp=$(date '+%Y-%m-%d %H:%M:%S') # 定义时间格式 echo "$time_stamp - $1" >> $LOG_FILE # 截取日志文件,只保留最后1000行 tail -n $MAX_LINES $LOG_FILE > ${LOG_FILE}.tmp && mv ${LOG_FILE}.tmp $LOG_FILE } 检测 Nginx 是否在运行的函数 check_nginx() { pgrep -f "nginx: master" > /dev/null 2>&1 echo $? } 1. 检查 Nginx 是否存活 log_message "正在检查 Nginx 状态..." if [ $(check_nginx) -ne 0 ]; then log_message "Nginx 未运行,尝试启动 Nginx..." # 2. 如果 Nginx 不在运行,则尝试启动 systemctl start nginx sleep 2 # 等待 Nginx 启动 # 3. 再次检查 Nginx 状态 log_message "启动 Nginx 后再次检查状态..." if [ $(check_nginx) -ne 0 ]; then log_message "Nginx 启动失败,停止 Keepalived 服务..." # 4. 如果 Nginx 启动失败,停止 Keepalived systemctl stop keepalived else log_message "Nginx 启动成功。" fi else log_message "Nginx 正常运行。" fi 若nginx出现问题会打印中文日志到:/var/log/nginx_keepalived_check.log , 可以手动进行查看输出的日志消息,再根据对应故障的具体时间,结合nginx的日志来进行修复或者优化。 分别授予脚本可执行权限: chmod +x /etc/keepalived/keepalived_nginx_check.sh 这个脚本的主要作用是监控 Nginx 服务的运行状态,并在检测到 Nginx 停止运行时,尝试重启它。如果重启失败,脚本会停止 Keepalived 服务,避免继续提供不可用的服务。 监控 Nginx 状态:脚本定期检查 Nginx 是否正常运行,使用 pgrep 命令检测主进程状态。 自动修复机制:如果 Nginx 未运行,尝试重启服务,并再次检测其状态;若重启成功,记录日志。 停止 Keepalived:如果 Nginx 无法启动,停止 Keepalived 服务,防止服务器继续作为故障节点运行。 6)修改keepalived主节点Master01的配置文件: global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 # 用来发送、接收和中转电子邮件的服务器 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script keepalived_nginx_check { # 这里是上一步骤添加的脚本,在这里进行调用 script "/etc/keepalived/keepalived_nginx_check.sh" # 根据自己添加的脚本路径进行修改,建议还是放在这个目录下便于管理 } vrrp_instance VI_1 { state MASTER # 主修改state为MASTER,备修改为BACKUP interface ens160 # 修改自己的实际网卡名称 virtual_router_id 51 # 主备的虚拟路由ID要相同 priority 100 # 优先级,备服务器设置优先级比主服务器的优先级低一些 advert_int 1 # 广播包发送间隔时间为1秒 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.116.16/24 # 虚拟IP修改为没有占用的IP地址,主备的虚拟IP相同就好 } track_script { keepalived_nginx_check # vrrp_script 定义的脚本名,放到这里进行追踪调用,Keepalived 可以根据脚本返回的结果做出相应的动作 } 7)修改keepalived备份节点Master02的配置文件: global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 # 用来发送、接收和中转电子邮件的服务器 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script keepalived_nginx_check { # 这里是上一步骤添加的脚本,在这里进行调用 script "/etc/keepalived/keepalived_nginx_check.sh" # 根据自己添加的脚本路径进行修改,建议还是放在这个目录下便于管理 } vrrp_instance VI_1 { state BACKUP # 主修改state为MASTER,备修改为BACKUP interface ens160 # 修改自己的实际网卡名称 virtual_router_id 51 # 主备的虚拟路由ID要相同 priority 90 # 优先级,备服务器设置优先级比主服务器的优先级低一些 advert_int 1 # 广播包发送间隔时间为1秒 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.116.16/24 # 虚拟IP修改为没有占用的IP地址,主备的虚拟IP相同就好 } track_script { keepalived_nginx_check # vrrp_script 定义的脚本名,放到这里进行追踪调用,Keepalived 可以根据脚本返回的结果做出相应的动作 } } 7)修改keepalived备份节点Master03的配置文件: global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 # 用来发送、接收和中转电子邮件的服务器 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script keepalived_nginx_check { # 这里是上一步骤添加的脚本,在这里进行调用 script "/etc/keepalived/keepalived_nginx_check.sh" # 根据自己添加的脚本路径进行修改,建议还是放在这个目录下便于管理 } vrrp_instance VI_1 { state BACKUP # 主修改state为MASTER,备修改为BACKUP interface ens160 # 修改自己的实际网卡名称 virtual_router_id 51 # 主备的虚拟路由ID要相同 priority 80 # 优先级,备服务器设置优先级比主服务器的优先级低一些 advert_int 1 # 广播包发送间隔时间为1秒 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.116.16/24 # 虚拟IP修改为没有占用的IP地址,主备的虚拟IP相同就好 } track_script { keepalived_nginx_check # vrrp_script 定义的脚本名,放到这里进行追踪调用,Keepalived 可以根据脚本返回的结果做出相应的动作 } } 三台节点主要的修改内容为这三部分: state MASTER / BACKUP interface ens160 priority 100 / 90 / 80 8)重载配置文件并重启nginx+keepalived服务: systemctl daemon-reload && systemctl restart nginx systemctl restart keepalived && systemctl enable keepalived 9)检查虚拟IP是否绑定成功: ip address show | grep 192.168.116.16 # 根据你们自己设置的虚拟IP来检查 如果成功绑定会有如下信息: [!IMPORTANT] inet 192.168.116.16/24 scope global secondary ens160 10)检查keepalived漂移是否设置成功(keepalived_nginx_check.sh脚本是否生效) (1)在keepalived的主节点Master01关闭keepalived服务: systemctl stop keepalived (2)切换到keepalived的备节点Master01查看网卡信息 ip address show | grep 192.168.116.16 # 根据你们自己设置的虚拟IP来检查 若出现如下提示,即为漂移成功: [!IMPORTANT] inet 192.168.116.16/24 scope global secondary ens160 注:如果主keepalived不异常的情况下,在两个备节点是无法查看到192.168.116.16虚拟IP的。 3.初始化K8S集群 1)Master01节点分别使用kubeadm初始化K8S集群: 注:kubeadm安装K8S,控制节点和工作节点的组件都是基于Pod运行的。 kubeadm config print init-defaults > kubeadm.yaml 生成默认的配置文件重定向输出到 kubeadm.yaml 中 2)修改刚刚用kubeadm生成的kubeadm.yaml文件: sed -i '/localAPIEndpoint/s/^/#/' kubeadm.yaml sed -i '/advertiseAddress/s/^/#/' kubeadm.yaml sed -i '/bindPort/s/^/#/' kubeadm.yaml sed -i '/name: node/s/^/#/' kubeadm.yaml sed -i "s|criSocket:.*|criSocket: unix://$(find / -name containerd.sock | head -n 1)|" kubeadm.yaml sed -i 's|imageRepository: registry.k8s.io|imageRepository: registry.aliyuncs.com/google_containers|' kubeadm.yaml # 原配置为国外的k8s源,为了加速镜像的下载,需改成国内源 sed -i '/serviceSubnet/a\ podSubnet: 10.244.0.0/12' kubeadm.yaml # /a\ 表示在serviceSubnet行下方一行内容 cat <<EOF >> kubeadm.yaml --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF more kubeadm.yaml # 手动检查一下 advertiseAddress 是 Kubernetes 控制节点的广告地址,其他节点通过这个地址与控制平面节点通信。它通常是控制节点所在服务器的 IP 地址,为了确保控制平面节点能在网络中通过正确的控制节点 IP 地址(我的MasterIP为:192.168.116.131)进行通信。 criSocket 指定的是 Kubernetes 使用的容器运行时(CRI)套接字地址,K8S 使用这个套接字与容器运行时(如 containerd)进行通信,来管理和启动容器。为了确保 K8S使用正确的容器运行时套接字。通过 find 命令查找 containerd.sock 文件路径并替换进配置文件,可以保证路径的准确性,避免手动查找和配置错误。 IPVS 模式支持更多的负载均衡算法,性能更好,尤其在集群节点和服务较多的情况下,可以显著提升网络转发效率和稳定性(如果没有指定mode为ipvs,则默认选定iptables,iptables性能相对较差)。 统一使用 systemd 作为容器和系统服务的 cgroup 驱动,避免使用 cgroupfs 时可能产生的资源管理不一致问题,提升 Kubernetes 和宿主机系统的兼容性和稳定性。 注:主机 IP、Pod IP 和 Service IP 不能在同一网段,因会导致 IP 冲突、路由混乱及网络隔离失败,影响 Kubernetes 的正常通信和网络安全。 3)基于kubeadm.yaml 文件初始化K8S,Master01节点拉取 Kubernetes 1.28.0 所需的镜像(两个方法可以二选一): (1)使用使用 kubeadm 命令,快速拉取 Kubernetes 所有核心组件的镜像,并确保版本一致。 kubeadm config images pull --image-repository="registry.aliyuncs.com/google_containers" --kubernetes-version=v1.28.0 (2)使用 ctr 命令,需要更细粒度的控制,或在 kubeadm 拉取镜像过程中出现问题时,可以使用 ctr 命令手动拉取镜像。 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.9 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0 ctr -n=k8s.io images pull registry.aliyuncs.com/google_containers/coredns:v1.10.1 4)在Master控制节点,初始化 Kubernetes 主节点 kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification 个别操作系统可能会出现kubelet启动失败的情况,如下提示,如果提示successfully则忽略以下步骤: [!WARNING] dial tcp [::1]:10248: connect: connection refused 执行systemctl status kubelet发现出现以下错误提示: [!WARNING] Process: 2226953 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE) Main PID: 2226953 (code=exited, status=1/FAILURE) 解决方法如下,控制节点执行: sed -i 's|ExecStart=/usr/bin/kubelet|ExecStart=/usr/bin/kubelet --container-runtime-endpoint=unix://$(find / -name containerd.sock | head -n 1) --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml|' /usr/lib/systemd/system/kubelet.service systemctl daemon-reload systemctl restart kubelet kubeadm reset # 删除安装出错的K8S kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification # 重新安装 3.设置 Kubernetes 的配置文件,以便让当前用户能够使用 kubectl 命令与 Kubernetes 集群进行交互 控制节点Master01执行: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 4.扩容k8s控制节点,将Master01和Master02加入到k8s集群 1)Master02和Master03创建证书存放目录: mkdir -pv /etc/kubernetes/pki/etcd && mkdir -pv ~/.kube/ 2)远程拷贝证书文件到Master02: scp /etc/kubernetes/pki/ca.crt root@192.168.116.142:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/ca.key root@192.168.116.142:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/sa.key root@192.168.116.142:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/sa.pub root@192.168.116.142:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-ca.crt root@192.168.116.142:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-ca.key root@192.168.116.142:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/etcd/ca.crt root@192.168.116.142:/etc/kubernetes/pki/etcd/ scp /etc/kubernetes/pki/etcd/ca.key root@192.168.116.142:/etc/kubernetes/pki/etcd/ 3)远程拷贝证书文件到Master03: scp /etc/kubernetes/pki/ca.crt root@192.168.116.143:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/ca.key root@192.168.116.143:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/sa.key root@192.168.116.143:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/sa.pub root@192.168.116.143:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-ca.crt root@192.168.116.143:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-ca.key root@192.168.116.143:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/etcd/ca.crt root@192.168.116.143:/etc/kubernetes/pki/etcd/ scp /etc/kubernetes/pki/etcd/ca.key root@192.168.116.143:/etc/kubernetes/pki/etcd/ 4)控制节点Master01生成集群token: kubeadm token create --print-join-command 生成token如下: [!IMPORTANT] kubeadm join 192.168.116.141:6443 --token pb1pk7.6p6w2jl1gjvlmmdz --discovery-token-ca-cert-hash sha256:b3b9de172cf6c48d97396621858a666e0be2d2d5578e4ce0fba5f1739b735fc1 如果控制节点加入集群需要在生成的token后加入 --control-plane ,如下: kubeadm join 192.168.116.141:6443 --token pb1pk7.6p6w2jl1gjvlmmdz --discovery-token-ca-cert-hash sha256:b3b9de172cf6c48d97396621858a666e0be2d2d5578e4ce0fba5f1739b735fc1 --control-plane 控制节点加入集群后执行如下命令,即可使用kubectl命令工作: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 如果工作节点加入集群,直接复制生成的这行命令到node主机执行即可: kubeadm join 192.168.116.141:6443 --token pb1pk7.6p6w2jl1gjvlmmdz --discovery-token-ca-cert-hash sha256:b3b9de172cf6c48d97396621858a666e0be2d2d5578e4ce0fba5f1739b735fc1 工作节点加入集群后,设置一个用户的 kubectl 环境,使其能够与 Kubernetes 集群进行交互:: mkdir ~/.kube cp /etc/kubernetes/kubelet.conf ~/.kube/config 注意:如果扩容节点时,有以下报错: [!CAUTION] [preflight] Reading configuration from the cluster… [preflight] FYI: You can look at this config file with ‘kubectl -n kube-system get cm kubeadm-config -o yaml’ 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: The cluster has a stable controlPlaneEndpoint address. The certificates that must be shared among control plane instances are provided. To see the stack trace of this error execute with --v=5 or higher 解决方法为添加 controlPlaneEndpoint: kubectl -n kube-system edit cm kubeadm-config 添加如下 controlPlaneEndpoint: 192.168.116.141:6443 (Master01的IP地址) 即可解决: kind: ClusterConfiguration kubernetesVersion: v1.18.0 controlPlaneEndpoint: 192.168.116.141:6443 重新复制生成的这行命令到node主机执行(控制节点需要添加 --control-plane),提示为如下内容则为成功扩容: To start administering your cluster from this node, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Run 'kubectl get nodes' to see this node join the cluster. 5.安装k8s网络组件Calico Calico 是一个流行的开源网络解决方案,专为 Kubernetes 提供高效、可扩展和安全的网络连接。它采用了基于 IP 的网络模型,使每个 Pod 都能获得一个唯一的 IP 地址,从而简化了网络管理。Calico 支持多种网络策略,可以实现细粒度的流量控制和安全策略,例如基于标签的访问控制,允许用户定义哪些 Pod 可以相互通信。(简单来说就是给Pod和Service分IP的,还能通过网络策略做网络隔离) 1)四台主机分别安装calico: ctr image pull -n=k8s.io swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.25.0 ctr image pull -n=k8s.io swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/pod2daemon-flexvol:v3.25.0 ctr image pull -n=k8s.io swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0 ctr image pull -n=k8s.io swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0 ctr image pull -n=k8s.io swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/typha:v3.25.0 2) 控制节点下载calico3.25.0的yaml配置文件(下载失败把URL复制到浏览器,手动复制粘贴内容到Master01节点效果相同) curl -O -L https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml 3)编辑calico.yaml,找到CLUSTER_TYPE行,在下面添加一对键值对,确保使用网卡接口(注意缩进): 原配置: - name: CLUSTER_TYPE value: "k8s,bgp" 新配置: - name: CLUSTER_TYPE value: "k8s,bgp" - name: IP_AUTODELECTION_METHOD value: "interface=ens160" 注:不同操作系统的网卡名称有差异,例:centos7.9的网卡名称为ens33,就要填写value: “interface=ens33”,需灵活变通。 注:如果出现calico拉取镜像错误问题,可能是没有修改imagePullPresent规则,可以修改官方源下载为华为源下载,如下: sed -i '1,$s|docker.io/calico/cni:v3.25.0|swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.25.0|g' calico.yaml sed -i '1,$s|docker.io/calico/node:v3.25.0|swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0|g' calico.yaml sed -i '1,$s|docker.io/calico/kube-controllers:v3.25.0|swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0|g' calico.yaml 4)部署calico网络服务 kubectl apply -f calico.yaml 查看在 Kubernetes 集群中查看属于 kube-system 命名空间的所有 Pod 的详细信息(控制节点和工作节点都查的到): kubectl get pod --namespace kube-system -o wide calico安装成功的信息大概如下: [!IMPORTANT] NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-kube-controllers-665548954f-5dgjw 1/1 Running 0 3m3s 10.255.112.131 master01 calico-node-4gb27 1/1 Running 0 3m3s 192.168.116.142 master02 calico-node-4kckd 1/1 Running 0 3m3s 192.168.116.144 node calico-node-cpnwp 1/1 Running 0 3m3s 192.168.116.141 master01 calico-node-hldt2 1/1 Running 0 3m3s 192.168.116.143 master03 coredns-66f779496c-8pzvp 1/1 Running 0 61m 10.255.112.129 master01 coredns-66f779496c-frsvq 1/1 Running 0 61m 10.255.112.130 master01 etcd-master01 1/1 Running 0 61m 192.168.116.141 master01 etcd-master02 1/1 Running 0 21m 192.168.116.142 master02 etcd-master03 1/1 Running 0 20m 192.168.116.143 master03 kube-apiserver-master01 1/1 Running 0 61m 192.168.116.141 master01 kube-apiserver-master02 1/1 Running 0 22m 192.168.116.142 master02 kube-apiserver-master03 1/1 Running 1 (21m ago) 19m 192.168.116.143 master03 kube-controller-manager-master01 1/1 Running 1 (21m ago) 61m 192.168.116.141 master01 kube-controller-manager-master02 1/1 Running 0 22m 192.168.116.142 master02 kube-controller-manager-master03 1/1 Running 0 20m 192.168.116.143 master03 kube-proxy-jvt6w 1/1 Running 0 31m 192.168.116.144 node kube-proxy-lw8g4 1/1 Running 0 61m 192.168.116.141 master01 kube-proxy-mjw8h 1/1 Running 0 22m 192.168.116.142 master02 kube-proxy-rtlpz 1/1 Running 0 21m 192.168.116.143 master03 kube-scheduler-master01 1/1 Running 1 (21m ago) 61m 192.168.116.141 master01 kube-scheduler-master02 1/1 Running 0 22m 192.168.116.142 master02 kube-scheduler-master03 1/1 Running 0 19m 192.168.116.143 master03 6.配置Etcd的高可用 Etcd默认的yaml文件–initial-cluster只指定自己,所以需要修改为指定我们的三台Master节点主机: Master01节点 sed -i 's|--initial-cluster=master01=https://192.168.116.141:2380|--initial-cluster=master01=https://192.168.116.141:2380,master02=https://192.168.116.142:2380,master03=https://192.168.116.143:2380|' /etc/kubernetes/manifests/etcd.yaml Master02节点 sed -i 's|--initial-cluster=master01=https://192.168.116.141:2380|--initial-cluster=master01=https://192.168.116.142:2380,master02=https://192.168.116.142:2380,master03=https://192.168.116.143:2380|' /etc/kubernetes/manifests/etcd.yaml Master03节点 sed -i 's|--initial-cluster=master01=https://192.168.116.141:2380|--initial-cluster=master01=https://192.168.116.143:2380,master02=https://192.168.116.142:2380,master03=https://192.168.116.143:2380|' /etc/kubernetes/manifests/etcd.yaml 修改的目的是在 Kubernetes 高可用(HA)集群 中为 etcd 集群 提供节点的初始集群信息。简单来说就是,--initial-cluster 的配置作用是告诉 etcd 节点关于集群中的其他成员信息,这样它们可以相互通信、保持一致并提供高可用性保障。 7.k8s的apiserver证书续期 查看 Kubernetes API 服务器的证书有效期: openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not [!CAUTION] Not Before: Oct 6 14:09:37 2024 GMT Not After : Oct 6 14:55:00 2025 GMT 使用kubeadm部署k8s自动创建的crt证书有效期是1年时间,为了确保证书长期有效,这里选择修改crt证书的过期时间为100年,下载官方提供的 update-kubeadm-cert.sh 脚本(在Master控制节点操作): git clone https://github.com/yuyicai/update-kube-cert.git cd update-kube-cert chmod 755 update-kubeadm-cert.sh sed -i '1,$s/CERT_DAYS=3650/CERT_DAYS=36500/g' update-kubeadm-cert.sh ./update-kubeadm-cert.sh all ./update-kubeadm-cert.sh all --cri containerd openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not [!CAUTION] Not Before: Oct 6 15:43:28 2024 GMT Not After : Sep 12 15:43:28 2124 GMT 证书时效延长成功!
2025年-4月-17日
6261 阅读
0 评论
other
2025-4-17
欧拉系统双Master高可用Kubernetes集群一键式部署指南
欧拉系统双Master高可用Kubernetes集群一键式部署指南 一、系统初始化(所有节点执行) # ===================== 基础配置 ===================== # 禁用防火墙与SELinux sudo systemctl stop firewalld && sudo systemctl disable firewalld sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config # 关闭Swap sudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 配置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system # 设置主机名解析(根据实际IP修改) cat <<EOF | sudo tee -a /etc/hosts 172.20.1.11 master01 172.20.1.12 master02 172.20.1.21 node01 172.20.1.10 lb-vip EOF # ===================== 时间同步 ===================== sudo yum install -y chrony sudo systemctl enable chronyd && sudo systemctl start chronyd chronyc sources -v # 验证输出包含^*表示同步正常 # ===================== 日志审计 ===================== sudo mkdir -p /var/log/kubernetes/audit 二、负载均衡层部署(lb01/lb02执行) # ===================== HAProxy安装 ===================== sudo yum install -y haproxy # 生成配置文件(注意替换实际Master IP) cat <<EOF | sudo tee /etc/haproxy/haproxy.cfg global log /dev/log local0 maxconn 20000 user haproxy group haproxy defaults log global mode tcp timeout connect 5s timeout client 50s timeout server 50s frontend k8s-api bind *:6443 default_backend k8s-api backend k8s-api balance roundrobin option tcp-check server master01 172.20.1.11:6443 check port 6443 inter 5s fall 3 rise 2 server master02 172.20.1.12:6443 check port 6443 inter 5s fall 3 rise 2 frontend k8s-http bind *:80 bind *:443 default_backend k8s-http backend k8s-http balance roundrobin server master01 172.20.1.11:80 check server master02 172.20.1.12:80 check EOF # 启动服务 sudo systemctl enable haproxy && sudo systemctl restart haproxy ss -ltnp | grep 6443 # 应显示HAProxy监听端口 # ===================== Keepalived配置 ===================== sudo yum install -y keepalived # 主节点配置(lb01) cat <<EOF | sudo tee /etc/keepalived/keepalived.conf vrrp_script chk_haproxy { script "pidof haproxy" interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 172.20.1.10/24 } track_script { chk_haproxy } } EOF # 备节点配置(lb02): # 修改state为BACKUP,priority改为90 sudo systemctl enable keepalived && sudo systemctl restart keepalived ip addr show eth0 | grep '172.20.1.10' # 应看到VIP绑定 三、容器运行时安装(所有节点执行) # ===================== Containerd安装 ===================== cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter sudo yum install -y containerd sudo containerd config default | sudo tee /etc/containerd/config.toml sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml sudo systemctl enable containerd && sudo systemctl restart containerd # 验证运行时状态 sudo ctr version # 应显示客户端和服务端版本 四、Kubernetes组件安装(所有节点执行) # ===================== 配置仓库 ===================== cat <<EOF | sudo tee /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 EOF # ===================== 安装指定版本 ===================== sudo yum install -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2 sudo systemctl enable kubelet # 检查版本 kubeadm version -o short # 应输出v1.28.2 五、首个Master节点初始化(master01执行) # ===================== 生成初始化配置 ===================== cat <<EOF | tee kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: criSocket: "unix:///var/run/containerd/containerd.sock" --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.28.2 controlPlaneEndpoint: "lb-vip:6443" networking: podSubnet: 10.244.0.0/16 apiServer: certSANs: - "lb-vip" - "172.20.1.10" imageRepository: registry.aliyuncs.com/google_containers EOF # ===================== 执行初始化 ===================== sudo kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log # 配置kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 获取加入命令 echo "Master加入命令:" grep 'kubeadm join' kubeadm-init.log -A2 echo "Worker加入命令:" kubeadm token create --print-join-command 六、第二个Master节点加入(master02执行) # 使用master01生成的control-plane加入命令 sudo kubeadm join lb-vip:6443 --token <your-token> \ --discovery-token-ca-cert-hash sha256:<your-hash> \ --control-plane --certificate-key <your-cert-key> \ --apiserver-advertise-address=172.20.1.12 # 验证etcd集群 sudo docker run --rm -it \ --net host \ -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \ registry.aliyuncs.com/google_containers/etcd:3.5.6-0 \ etcdctl --endpoints=https://172.20.1.11:2379 \ --cert=/etc/kubernetes/pki/etcd/peer.crt \ --key=/etc/kubernetes/pki/etcd/peer.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ endpoint health 七、Worker节点加入(node01执行) # 使用worker加入命令 sudo kubeadm join lb-vip:6443 --token <your-token> \ --discovery-token-ca-cert-hash sha256:<your-hash> # 在主节点验证 kubectl get nodes -o wide -w 八、网络插件部署(任一Master执行) # ===================== Calico安装 ===================== kubectl apply -f https://docs.projectcalico.org/v3.26/manifests/calico.yaml # 监控安装进度 watch kubectl get pods -n kube-system -l k8s-app=calico-node # 验证网络连通性 kubectl create deployment nginx --image=nginx:alpine kubectl expose deployment nginx --port=80 kubectl run test --image=busybox --rm -it -- ping nginx.default.svc.cluster.local 九、验证高可用性 # 模拟Master节点故障 ssh master01 "sudo systemctl stop kube-apiserver" kubectl get componentstatus # 观察服务状态切换 # 验证VIP漂移 ssh lb01 "sudo systemctl stop keepalived" ping -c 5 lb-vip # 应持续可达 十、部署后检查清单 # 集群状态检查 kubectl get componentstatus kubectl get nodes -o wide kubectl get pods -A -o wide # 网络策略验证 kubectl run test-pod --image=nginx:alpine --restart=Never --rm -it -- sh # 在容器内执行: curl -I http://kubernetes.default ping <其他节点Pod IP> # 存储验证 kubectl apply -f - <<EOF apiVersion: v1 kind: PersistentVolume metadata: name: test-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle hostPath: path: /data/test-pv EOF kubectl get pv 故障排查命令速查: # 查看kubelet日志 journalctl -u kubelet -f # 检查证书有效期 kubeadm certs check-expiration # 重置节点(危险!) kubeadm reset -f rm -rf /etc/cni/net.d /etc/kubernetes/ $HOME/.kube # 强制删除Pod kubectl delete pod <pod-name> --grace-period=0 --force 部署完成验证清单: 所有节点状态为Ready calico-node Pod全部Running coredns Pod正常运行 能跨节点访问Service VIP漂移测试成功 控制平面组件无警告信息
2025年-4月-17日
4257 阅读
0 评论
other
2025-3-11
Browser-Use:让 AI 掌控浏览器帮你干活
在当今数字化的浪潮中,AI 技术正以前所未有的速度改变着我们的生活和工作方式。今天,我们要为大家介绍一款名为 Browser-Use 的开源项目,它能够让 AI 轻松控制浏览器,为我们带来全新的自动化体验。 项目简介 Browser-Use 是一个强大的工具,旨在帮助开发者将 AI 与浏览器无缝连接。它就像是一座桥梁,让 AI 能够像人类一样在浏览器中进行各种操作,如打开网页、查找信息、填写表单等。这个项目的出现,为自动化测试、数据采集、网页交互等领域带来了新的可能性。 部署方案 本地部署 1. 环境准备 确保你已经安装了 Python 3.11 或更高版本。可以使用以下命令检查 Python 版本: python --version 2. 安装依赖 使用 pip 安装 Browser-Use 及其相关依赖: pip install browser-use playwright install 3. 配置 API 密钥 在项目根目录下创建一个 .env 文件,并添加你使用的 AI 提供商的 API 密钥,例如: OPENAI_API_KEY=your_openai_api_key 4. 运行示例代码 以下是一个简单的示例代码,用于比较 gpt-4o 和 DeepSeek-V3 的价格: from langchain_openai import ChatOpenAI from browser_use import Agent import asyncio from dotenv import load_dotenv load_dotenv() async def main(): agent = Agent( task="Compare the price of gpt-4o and DeepSeek-V3", llm=ChatOpenAI(model="gpt-4o"), ) await agent.run() asyncio.run(main()) 云部署 如果你想跳过本地部署的繁琐步骤,可以尝试使用 Browser-Use 的云版本。只需访问 https://cloud.browser-use.com,即可立即开始使用浏览器自动化服务。 使用场景 自动化测试 在软件开发过程中,自动化测试是确保软件质量的重要环节。Browser-Use 可以帮助开发者编写自动化测试脚本,模拟用户在浏览器中的各种操作,如点击按钮、输入文本、提交表单等。例如,在测试一个电商网站时,可以使用 Browser-Use 自动添加商品到购物车、填写收货地址、完成支付流程,从而快速发现潜在的问题。 数据采集 在信息时代,数据是企业的重要资产。Browser-Use 可以用于自动化数据采集,从网页上提取所需的信息。例如,在市场调研中,可以使用 Browser-Use 自动访问各大电商平台,收集商品的价格、销量、评价等信息,为企业的决策提供有力支持。 网页交互自动化 对于一些重复性的网页操作,如登录、签到、发送消息等,Browser-Use 可以实现自动化,提高工作效率。例如,在社交媒体管理中,可以使用 Browser-Use 自动登录多个社交媒体账号,定时发布内容、回复评论,节省大量的时间和精力。 与 Slack 集成 Browser-Use 还支持与 Slack 集成,方便团队协作。以下是集成的具体步骤: 1. 创建 Slack 应用 访问 https://api.slack.com/apps,点击 “Create New App”。 选择 “From scratch”,并为你的应用命名,选择要使用的工作空间。 提供机器人的名称和描述。 2. 配置机器人 导航到 “OAuth & Permissions” 选项卡,在 “Scopes” 中添加必要的机器人令牌范围,如 “chat:write”、“channels:history”、“im:history”。 3. 启用事件订阅 导航到 “Event Subscriptions” 选项卡,启用事件并添加必要的机器人事件,如 “message.channels”、“message.im”。 添加你的请求 URL(可以使用 ngrok 暴露本地服务器)。 4. 获取签名密钥和机器人令牌 导航到 “Basic Information” 选项卡,复制 “Signing Secret”。 导航到 “OAuth & Permissions” 选项卡,复制 “Bot User OAuth Token”。 5. 配置环境变量 在项目根目录下的 .env 文件中添加以下内容: SLACK_SIGNING_SECRET=your-signing-secret SLACK_BOT_TOKEN=your-bot-token 6. 邀请机器人到频道 在 Slack 频道中使用 /invite @your-bot-name 命令邀请机器人。 7. 运行代码 运行 examples/slack_example.py 启动机器人,然后在 Slack 频道中输入 $bu whats the weather in Tokyo? 即可开始一个 Browser-Use 任务并获取响应。 总结 Browser-Use 是一个功能强大、易于使用的开源项目,它为 AI 与浏览器的交互提供了一种简单而有效的方式。通过本地部署或云部署,我们可以在各种场景中使用 Browser-Use 实现自动化操作,提高工作效率和质量。同时,与 Slack 的集成也为团队协作带来了便利。
2025年-3月-11日
4638 阅读
0 评论
AI
2025-3-11
Story Flicks:一键生成故事视频的神器
在信息爆炸的时代,如何以生动有趣的方式呈现故事成为了许多人的追求。今天要给大家介绍的 Story Flicks 项目,就为我们提供了一个绝佳的解决方案。它能够让用户通过输入故事主题,利用大语言模型轻松生成包含 AI 图像、故事内容、音频和字幕的故事视频。 项目介绍 Story Flicks 是一个集故事创作与视频生成于一体的项目。用户只需输入一个故事主题,系统就能借助强大的大语言模型,自动生成精彩的故事内容,同时搭配 AI 生成的精美图片、合适的音频以及准确的字幕,最终合成一个完整的故事视频。 技术栈 后端:采用 Python + FastAPI 框架构建,保证了系统的高效性和稳定性,能够快速处理用户的请求并生成所需的故事内容。 前端:基于 React + Ant Design + Vite 搭建,提供了简洁美观、易于操作的用户界面,让用户能够轻松上手。 视频示例 项目提供了两个精彩的视频示例,让我们先来一睹为快。 如果你无法看到该视频,那么可能你的电脑不支持该文件格式。 如果你无法看到该视频,那么可能你的电脑不支持该文件格式。 部署方法及具体步骤 1. 下载项目 首先,我们需要将项目克隆到本地。打开终端,执行以下命令: git clone https://github.com/alecm20/story-flicks.git 2. 设置模型信息 2.1 切换到后端目录 cd backend 2.2 复制环境变量示例文件 cp .env.example .env 2.3 编辑 .env 文件 在 .env 文件中,我们需要设置模型的相关信息,以下是详细的参数说明: text_provider = "openai" # 文本生成模型的提供商,目前支持 openai、aliyun、deepseek、ollama 和 siliconflow # 阿里云文档:https://www.aliyun.com/product/bailian image_provider = "aliyun" # 图像生成模型的提供商,目前支持 openai、aliyun 和 siliconflow openai_base_url="https://api.openai.com/v1" # OpenAI 的基础 URL aliyun_base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" # 阿里云的基础 URL deepseek_base_url="https://api.deepseek.com/v1" # DeepSeek 的基础 URL ollama_base_url="http://localhost:11434/v1" # Ollama 的基础 URL siliconflow_base_url="https://api.siliconflow.cn/v1" # SiliconFlow 的基础 URL openai_api_key= # OpenAI 的 API 密钥,只需提供一个密钥 aliyun_api_key= # 阿里云百炼的 API 密钥,只需提供一个密钥 deepseek_api_key= # DeepSeek 的 API 密钥,目前仅支持文本生成 ollama_api_key= # 如果需要使用,将 api_key 设置为 “ollama”。目前,此 API 密钥仅支持文本生成,不能用于参数过少的模型。建议使用 qwen2.5:14b 或更大的模型。 siliconflow_api_key= # SiliconFlow 的 API 密钥,SiliconFlow 的文本模型目前仅支持与 OpenAI 格式兼容的大模型,如图像模型仅对 black-forest-labs/FLUX.1-dev 进行了测试。 text_llm_model=gpt-4o # 如果 text_provider 设置为 openai,只能使用 OpenAI 模型,如 gpt-4o。如果选择阿里云,可以使用阿里云模型,如 qwen-plus 或 qwen-max。Ollama 模型不能使用参数过少的模型,建议使用 qwen2.5:14b 或更大的模型。 image_llm_model=flux-dev # 如果 image_provider 设置为 openai,只能使用 OpenAI 模型,如 dall-e-3。如果选择阿里云,建议使用阿里云模型,如 flux-dev,目前可免费试用。更多详情:https://help.aliyun.com/zh/model-studio/getting-started/models#a1a9f05a675m4。 3. 启动项目 3.1 手动启动后端项目 # 首先,切换到项目根目录 cd backend # 创建并激活虚拟环境 conda create -n story-flicks python=3.10 conda activate story-flicks # 安装依赖 pip install -r requirements.txt # 启动后端服务 uvicorn main:app --reload 如果项目启动成功,终端将输出以下信息: INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [78259] using StatReload INFO: Started server process [78261] INFO: Waiting for application startup. INFO: Application startup complete. 项目优势 简单易用 用户只需输入故事主题,无需复杂的操作,即可快速生成故事视频,大大节省了时间和精力。 多样化的模型支持 支持多种文本和图像生成模型,用户可以根据自己的需求选择合适的模型,满足不同场景的创作需求。 丰富的功能 生成的视频包含 AI 图像、故事内容、音频和字幕,内容丰富多样,能够吸引观众的注意力。 总的来说,Story Flicks 是一个非常实用的故事视频生成项目,无论是个人创作者还是企业宣传,都能借助它轻松打造出精彩的故事视频。赶快动手部署,开启你的故事创作之旅吧!
2025年-3月-11日
4640 阅读
0 评论
AI
2025-3-10
OpenManus 项目部署详细教程
一、项目简介 OpenManus 是一个功能强大的多功能智能代理项目,由来自 MetaGPT 等组织的开发者共同构建。其原型在 3 小时内就已推出,并且团队一直在持续完善。借助 OpenManus,用户无需邀请码就能利用各种工具解决各类任务,实现各种创意。此外,还有与之相关的 OpenManus - RL 开源项目,专注于基于强化学习(如 GRPO)的大语言模型代理调优方法。 二、部署前准备 (一)系统要求 确保你的系统已经安装了以下软件和工具: Python 3.12:OpenManus 项目要求 Python 版本至少为 3.12。 Conda 或 uv:Conda 是一个常用的环境管理工具,而 uv 是一个快速的 Python 包管理器,推荐使用 uv 进行部署。 (二)API 密钥 你需要准备好所使用的大语言模型(LLM)的 API 密钥,例如 OpenAI 的 API 密钥。 不同的大语言模型获取 API 密钥的方式有所不同,以下为你详细介绍几个常见大语言模型 API 密钥的获取方法: 1、OpenAI API 密钥获取 OpenAI 提供了强大的语言模型,如 GPT - 3.5、GPT - 4 等。 步骤 注册账号 访问 OpenAI 官网,点击右上角的 “Sign up” 按钮。 按照提示填写邮箱、设置密码等信息完成注册。注册过程中可能需要进行邮箱验证。 登录控制台 注册成功后,使用注册的账号和密码登录 OpenAI 控制台。 创建 API 密钥 登录控制台后,点击右上角的个人头像,在下拉菜单中选择 “API keys”。 在 API keys 页面,点击 “Create new secret key” 按钮。 输入一个密钥名称(可选),然后点击 “Create secret key”。 此时会弹出一个窗口显示新生成的 API 密钥,这个密钥只会显示一次,务必妥善保存,之后可以将其用于 OpenManus 项目的配置文件中。 注意事项 OpenAI 使用的是付费模式,在使用 API 时会根据使用的额度进行计费。可以在控制台的 “Usage” 页面查看使用情况和费用。 API 密钥是访问 OpenAI 服务的重要凭证,不要将其泄露给他人,以免造成不必要的费用损失。 2、百度千帆大模型平台(以文心一言为例) 百度千帆提供了多种大模型服务,文心一言是其中较为知名的。 步骤 注册并登录 访问 百度千帆大模型平台,点击右上角的 “注册” 按钮,使用百度账号进行注册登录。如果已有百度账号,直接登录即可。 创建应用 登录后,进入控制台,在左侧导航栏中找到 “应用管理” 并点击。 点击 “创建应用” 按钮,填写应用名称、描述等信息,选择所需的模型(如文心一言),点击 “创建”。 获取 API 信息 创建应用成功后,在应用列表中找到刚刚创建的应用,点击进入应用详情页。 在应用详情页中,可以看到 “API Key” 和 “Secret Key”,这两个密钥组合起来用于调用 API 服务。 注意事项 百度千帆平台也有不同的计费策略,使用前需要了解清楚费用情况。 同样要妥善保管好 API Key 和 Secret Key,避免泄露。 3、阿里云通义千问 阿里云的通义千问也是一款优秀的大语言模型。 步骤 注册并开通服务 访问 阿里云官网,注册并登录阿里云账号。 搜索 “通义千问”,进入通义千问的产品页面,点击 “立即开通” 按钮,按照提示完成服务开通流程。 创建 AccessKey 登录阿里云控制台,点击右上角的个人头像,在下拉菜单中选择 “AccessKey 管理”。 如果之前没有创建过 AccessKey,点击 “创建 AccessKey” 按钮,根据提示完成身份验证后生成 AccessKey ID 和 AccessKey Secret。 使用 API 通过阿里云的 SDK 或 API 调用通义千问服务时,使用生成的 AccessKey ID 和 AccessKey Secret 进行身份验证。 注意事项 阿里云的服务使用会根据具体的用量进行计费,需要关注费用情况。 AccessKey 是访问阿里云服务的重要凭证,要严格保密,定期更换。 三、部署步骤 (一)方式一:使用 Conda 部署 创建新的 Conda 环境 打开终端,执行以下命令创建一个名为 open_manus 的 Conda 环境,并激活该环境: bash conda create -n open_manus python=3.12 conda activate open_manus 注意事项: 确保你的 Conda 已经正确安装并且配置好了环境变量,否则可能会提示 conda 命令找不到。 如果创建环境时提示磁盘空间不足,需要清理磁盘或者更换磁盘空间充足的路径创建环境。 克隆仓库 使用 git 命令将 OpenManus 项目的仓库克隆到本地,并进入项目目录: bash git clone https://github.com/mannaandpoem/OpenManus.git cd OpenManus 注意事项: 确保你的网络可以正常访问 GitHub,否则可能会出现克隆失败的情况。你可以尝试使用代理或者切换网络环境。 如果本地已经存在同名的文件夹,克隆操作可能会失败,建议提前删除或者重命名该文件夹。 安装依赖 在项目目录下,使用 pip 安装项目所需的依赖: bash pip install -r requirements.txt 注意事项: 安装依赖可能需要一些时间,具体取决于你的网络速度和服务器响应情况。 如果安装过程中出现依赖冲突的错误,可能是因为某些依赖版本不兼容。可以尝试更新 pip 到最新版本,或者手动指定依赖的版本。 (二)方式二:使用 uv 部署(推荐) 安装 uv 在终端中运行以下命令安装 uv: bash curl -LsSf https://astral.sh/uv/install.sh | sh 注意事项: 确保你的系统中已经安装了 curl 工具,否则命令会执行失败。可以使用 sudo apt-get install curl(Ubuntu/Debian)或者 brew install curl(macOS)来安装。 安装过程可能需要管理员权限,根据提示输入密码进行确认。 克隆仓库 同样使用 git 命令克隆项目仓库并进入项目目录: bash git clone https://github.com/mannaandpoem/OpenManus.git cd OpenManus 注意事项:与使用 Conda 部署时克隆仓库的注意事项相同,确保网络和本地文件夹情况正常。 3. 创建并激活虚拟环境 使用 uv 命令创建虚拟环境,并根据不同的操作系统激活该环境: bash uv venv source .venv/bin/activate # Unix/macOS 系统 Windows 系统使用: .venv\Scripts\activate 注意事项: 对于 Windows 系统,确保在命令提示符或者 PowerShell 中以管理员身份运行,否则可能会出现权限不足的错误。 如果激活虚拟环境后,命令行前缀没有显示虚拟环境名称,可能是激活失败,可以尝试重新执行激活命令。 安装依赖 使用 uv 安装项目所需的依赖: bash uv pip install -r requirements.txt 注意事项:与使用 pip 安装依赖的注意事项类似,关注网络和依赖冲突问题。 四、配置项目 OpenManus 项目需要对所使用的大语言模型(LLM)API 进行配置,具体步骤如下: 创建配置文件 在 config 目录下创建 config.toml 文件,你可以从示例文件复制一份: bash cp config/config.example.toml config/config.toml 注意事项: 确保 config 目录存在,并且你有足够的权限在该目录下创建文件。 复制文件时,要注意文件路径是否正确,避免复制到错误的位置。 编辑配置文件 使用文本编辑器打开 config/config.toml 文件,添加你的 API 密钥并自定义相关设置。以下是一个示例配置: toml #Global LLM configuration [ llm ] model = "gpt-4o" base_url = "https://api.openai.com/v1" api_key = "sk-..." # Replace with your actual API key max_tokens = 4096 temperature = 0.0 #Optional configuration for specific LLM models [ llm.vision ] model = "gpt-4o" base_url = "https://api.openai.com/v1" api_key = "sk-..." # Replace with your actual API key 注意事项: 确保 API 密钥的准确性,任何错误或者遗漏都可能导致 API 认证失败。 不要将包含 API 密钥的配置文件公开分享,以免造成安全风险。 五、启动项目 完成部署和配置后,就可以启动 OpenManus 项目了。 (一)稳定版本启动 在终端中输入以下命令启动稳定版本: bash python main.py 启动后,你可以通过终端输入你的创意,即可开始使用 OpenManus 解决任务。 注意事项: 如果启动过程中出现 ModuleNotFoundError 错误,说明可能有依赖没有正确安装,需要检查并重新安装依赖。 确保你的 API 密钥有效且具有足够的权限,否则可能会在使用过程中遇到请求失败的问题。 (二)开发中版本启动 如果想体验开发中版本,可以运行以下命令: bash python run_flow.py 注意事项:开发中版本可能存在一些不稳定因素,遇到问题可以及时反馈给项目开发者。 六、常见问题及解决方法 (一)依赖安装失败 问题描述:在使用 pip 或 uv 安装依赖时出现错误。 解决方法:检查网络连接是否正常,确保可以访问所需的软件源。如果使用的是国内网络,可以考虑更换为国内的镜像源,例如使用清华大学的 PyPI 镜像源: bash pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple (二)API 密钥配置错误 问题描述:启动项目后提示 API 认证失败。 解决方法:检查 config.toml 文件中的 API 密钥是否正确,确保没有遗漏或输入错误。同时,要注意 API 密钥的有效期和权限。 七、总结 希望本教程能帮助你顺利部署 OpenManus 项目,享受智能代理带来的便利!
2025年-3月-10日
5609 阅读
0 评论
AI
2025-2-25
微语 - 对话即服务-宝塔面板部署
步骤一 步骤二:添加容器编排 复制如下编排内容 最新docker-compose.yaml-需要自行安装ollama 最新docker-compose-ollama.yaml-默认集成ollama 下面是 docker-compose.yaml 内容: services: bytedesk-mysql: image: mysql:latest container_name: mysql-bytedesk environment: MYSQL_DATABASE: bytedesk MYSQL_ROOT_PASSWORD: r8FqfdbWUaN3 ports: - "13306:3306" volumes: - mysql_data:/var/lib/mysql networks: - bytedesk-network bytedesk-redis: image: redis/redis-stack-server:latest container_name: redis-bytedesk ports: - "16379:6379" environment: - REDIS_ARGS=--requirepass qfRxz3tVT8Nh volumes: - redis_data:/data networks: - bytedesk-network bytedesk: # image: bytedesk/bytedesk:latest # hub.docker.com enterprise # image: bytedesk/bytedesk-ce:latest # hub.docker.com community image: registry.cn-hangzhou.aliyuncs.com/bytedesk/bytedesk:latest # aliyun enterprise # mage: registry.cn-hangzhou.aliyuncs.com/bytedesk/bytedesk-ce:latest # aliyun community container_name: bytedesk depends_on: - bytedesk-mysql - bytedesk-redis environment: # db config SPRING_DATASOURCE_URL: jdbc:mysql://mysql-bytedesk:3306/bytedesk?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: r8FqfdbWUaN3 SPRING_JPA_HIBERNATE_DDL_AUTO: update # redis config SPRING_DATA_REDIS_HOST: redis-bytedesk SPRING_DATA_REDIS_PORT: 6379 SPRING_DATA_REDIS_PASSWORD: qfRxz3tVT8Nh SPRING_DATA_REDIS_DATABASE: 0 # bytedesk config BYTEDESK_DEBUG: true BYTEDESK_EDITION: enterprise # enable custom config: name, logo, description BYTEDESK_CUSTOM_ENABLED: false BYTEDESK_NAME: BYTEDESK_LOGO: BYTEDESK_DESCRIPTION: BYTEDESK_VERSION: 0.6.4 # Admin config BYTEDESK_ADMIN_EMAIL: admin@email.com BYTEDESK_ADMIN_PASSWORD: admin BYTEDESK_ADMIN_PASSWORD_DEFAULT: 123456 BYTEDESK_ADMIN_NICKNAME: SuperAdmin BYTEDESK_ADMIN_MOBILE: 13345678000 BYTEDESK_ADMIN_MOBILE_WHITELIST: 18888888000,18888888001,18888888002,18888888003,18888888004,18888888005 BYTEDESK_ADMIN_EMAIL_WHITELIST: 100@email.com,101@email.com,102@email.com,103@email.com,104@email.com,105@email.com BYTEDESK_ADMIN_VALIDATE_CODE: 123456 BYTEDESK_ADMIN_FORCE_VALIDATE_MOBILE: true BYTEDESK_ADMIN_FORCE_VALIDATE_EMAIL: true # Organization config BYTEDESK_ORGANIZATION_NAME: MyCompany BYTEDESK_ORGANIZATION_CODE: bytedesk # Features config BYTEDESK_FEATURES_JAVA_AI: false BYTEDESK_FEATURES_PYTHON_AI: true BYTEDESK_FEATURES_EMAIL_TYPE: javamail BYTEDESK_FEATURES_ENABLE_REGISTRATION: false BYTEDESK_FEATURES_AVATAR_BASE_URL: # CORS config # BYTEDESK_CORS_ALLOWED_ORIGINS: * # JWT config BYTEDESK_JWT_SECRET_KEY: 1dfaf8d004207b628a9a6b859c429f49a9a7ead9fd8161c1e60847aeef06dbd2 BYTEDESK_JWT_EXPIRATION: 2592000000 BYTEDESK_JWT_REFRESH_TOKEN_EXPIRATION: 5184000000 # Cache config BYTEDESK_CACHE_LEVEL: 0 BYTEDESK_CACHE_PREFIX: bytedeskim BYTEDESK_CACHE_REDIS_STREAM_KEY: bytedeskim:stream # Upload config BYTEDESK_UPLOAD_TYPE: local BYTEDESK_UPLOAD_DIR: /app/uploads # 上传文件的访问地址,请修改为服务器实际的地址 BYTEDESK_UPLOAD_URL: http://127.0.0.1:9003 # Knowledge base config BYTEDESK_KBASE_THEME: default BYTEDESK_KBASE_HTML_PATH: helpcenter # 知识库的访问地址,请修改为服务器实际的地址 BYTEDESK_KBASE_API_URL: http://127.0.0.1:9003 # Socket config BYTEDESK_SOCKET_HOST: 0.0.0.0 BYTEDESK_SOCKET_WEBSOCKET_PORT: 9885 BYTEDESK_SOCKET_LEAK_DETECTOR_LEVEL: SIMPLE BYTEDESK_SOCKET_PARENT_EVENT_LOOP_GROUP_THREAD_COUNT: 1 BYTEDESK_SOCKET_CHILD_EVENT_LOOP_GROUP_THREAD_COUNT: 8 BYTEDESK_SOCKET_MAX_PAYLOAD_SIZE: 10240 # Cluster config BYTEDESK_CLUSTER_ENABLED: false # Push config # BYTEDESK_PUSH_APNS_BUNDLE_ID: com.kefux.im # BYTEDESK_PUSH_APNS_P12_URL: 123.p12 # BYTEDESK_PUSH_APNS_P12_PASSWORD: 123456 # Actuator security configuration MANAGEMENT_ENDPOINTS_ENABLED_BY_DEFAULT: false MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: '' MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_EXCLUDE: '*' MANAGEMENT_ENDPOINT_HEALTH_ENABLED: false MANAGEMENT_ENDPOINT_INFO_ENABLED: false MANAGEMENT_SERVER_PORT: -1 MANAGEMENT_ENDPOINTS_WEB_BASE_PATH: '/management' SPRING_SECURITY_BASIC_ENABLED: true # ai config # zhipuai # 申请智谱AI API Key:https://www.bigmodel.cn/usercenter/proj-mgmt/apikeys SPRING_AI_ZHIPUAI_API_KEY: '' SPRING_AI_ZHIPUAI_CHAT_ENABLED: false SPRING_AI_ZHIPUAI_CHAT_OPTIONS_MODEL: glm-4-flash SPRING_AI_ZHIPUAI_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_ZHIPUAI_EMBEDDING_ENABLED: false # ollama # ollama pull qwen2.5:1.5b SPRING_AI_OLLAMA_BASE_URL: http://host.docker.internal:11434 SPRING_AI_OLLAMA_CHAT_ENABLED: true # SPRING_AI_OLLAMA_CHAT_OPTIONS_MODEL: deepseek-r1:1.5b SPRING_AI_OLLAMA_CHAT_OPTIONS_MODEL: qwen2.5:1.5b SPRING_AI_OLLAMA_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_OLLAMA_EMBEDDING_ENABLED: true SPRING_AI_OLLAMA_EMBEDDING_OPTIONS_MODEL: qwen2.5:1.5b # deepseek # https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html SPRING_AI_DEEPSEEK_API_KEY: 'sk-xxx' SPRING_AI_DEEPSEEK_BASE_URL: https://api.deepseek.com SPRING_AI_DEEPSEEK_CHAT_ENABLED: false SPRING_AI_DEEPSEEK_CHAT_OPTIONS_MODEL: deepseek-chat SPRING_AI_DEEPSEEK_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_DEEPSEEK_EMBEDDING_ENABLED: false # openai # https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html SPRING_AI_OPENAI_API_KEY: 'sk-xxx' SPRING_AI_OPENAI_BASE_URL: https://api.openai.com SPRING_AI_OPENAI_CHAT_ENABLED: false SPRING_AI_OPENAI_CHAT_OPTIONS_MODEL: gpt-4o # SPRING_AI_OPENAI_CHAT_OPTIONS_MODEL: gpt-4o-mini SPRING_AI_OPENAI_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_OPENAI_EMBEDDING_ENABLED: false # alibaba # 阿里云百炼大模型获取api key: # https://bailian.console.aliyun.com/?apiKey=1#/api-key # 阿里云百炼大模型模型列表: # https://bailian.console.aliyun.com/?spm=a2c4g.11186623.0.0.11c67980m5X2VR#/model-market SPRING_AI_DASHSCOPE_API_KEY: 'sk-xxx' SPRING_AI_DASHSCOPE_CHAT_ENABLED: false SPRING_AI_DASHSCOPE_CHAT_OPTIONS_MODEL: deepseek-r1 SPRING_AI_DASHSCOPE_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_ENABLED: false SPRING_AI_DASHSCOPE_IMAGE_ENABLED: false SPRING_AI_DASHSCOPE_EMBEDDING_ENABLED: false SPRING_AI_DASHSCOPE_AUDIO_SYNTHESIS_ENABLED: false SPRING_AI_NACOS_PROMPT_TEMPLATE_ENABLED: false # moonshot SPRING_AI_MOONSHOT_CHAT_ENABLED: false SPRING_AI_MINIMAX_CHAT_ENABLED: false # vector store SPRING_AI_VECTORSTORE_REDIS_INITIALIZE_SCHEMA: true # SPRING_AI_VECTORSTORE_REDIS_URI: redis://:qfRxz3tVT8Nh@redis-bytedesk:6379 SPRING_AI_VECTORSTORE_REDIS_INDEX_NAME: bytedesk_vs_index # SPRING_AI_VECTORSTORE_REDIS_PREFIX: bytedesk_vs_prefix: # mcp SPRING_AI_MCP_CLIENT_ENABLED: false SPRING_AI_MCP_SERVER_ENABLED: false SPRING_AI_MCP_SERVER_STDIO: false SPRING_AI_MCP_SERVER_TYPE: SYNC # weaviate SPRING_AI_VECTORSTORE_WEAVIATE_ENABLED: false # SPRING_MAIN_ALLOW_BEAN_DEFINITION_OVERRIDING: true # wechat config WECHAT_PAY_ENABLED: false # springdoc SPRINGDOC_SHOW_ACTUATOR: false # swagger-ui # http://服务器ip:9003/swagger-ui/index.html SPRINGDOC_SWAGGER_UI_ENABLED: true SPRINGDOC_SWAGGER_UI_PATH: /index.html # api-docs SPRINGDOC_API_DOCS_ENABLED: true SPRINGDOC_API_DOCS_PATH: /v3/api-docs # knife4j # http://服务器ip:9003/doc.html KNIFE4J_ENABLED: true KNIFE4J_SETTING_LANGUAGE: zh_cn ports: - 9003:9003 - 9885:9885 volumes: - upload_data:/app/uploads networks: - bytedesk-network volumes: mysql_data: redis_data: upload_data: networks: bytedesk-network: driver: bridge 因项目默认使用ollama qwen2.5:1.5b模型,所以需要提前拉取模型 基于 docker-compose.yaml 配置文件,ollama拉取 ollama pull deepseek-r1:1.5b ollama pull qwen2.5:1.5b 基于 docker-compose-ollama.yaml 配置文件,使用docker拉取 docker exec ollama pull qwen2.5:1.5b docker exec ollama pull deepseek-r1:1.5b 如果不需要知识库AI问答功能,可以修改 docker-compose.yaml 或 docker-compose-ollama.yaml 关闭ollama对话和嵌入功能,以节省资源 关闭ollama对话 SPRING_AI_OLLAMA_CHAT_ENABLED: false 关闭ollama嵌入 SPRING_AI_OLLAMA_EMBEDDING_ENABLED: false 修改配置,否则上传图片、文件和知识库无法正常显示 修改上述编排文件 请将服务器127.0.0.1替换为你的服务器ip BYTEDESK_UPLOAD_URL: http://127.0.0.1:9003 BYTEDESK_KBASE_API_URL: http://127.0.0.1:9003 步骤三:等待中 步骤四:添加完成,关闭窗口 步骤五:安装成功 步骤六:开放端口 请开放内网入方向端口 • 9003 • 9885 步骤七:预览 请将127.0.0.1替换为你的服务器ip http://127.0.0.1:9003/ 修改默认密码 修改 docker-compose.yaml 文件 或 docker-compose-ollama.yaml 文件 中的默认管理员密码 BYTEDESK_ADMIN_EMAIL: admin@email.com BYTEDESK_ADMIN_PASSWORD: admin 或登录之后在个人资料修改密码
2025年-2月-25日
5434 阅读
0 评论
other
2025-2-24
Linux运维常用一键脚本
一键安装Apache服务器 #!/bin/bash sudo apt-get update sudo apt-get install -y apache2 sudo systemctl start apache2 sudo systemctl enable apache2 echo "Apache服务器已安装并启动" 功能用途:自动化安装并启动Apache服务器。 一键安装MySQL数据库 #!/bin/bash sudo apt-get update sudo apt-get install -y mysql-server sudo mysql_secure_installation sudo systemctl start mysql sudo systemctl enable mysql echo "MySQL数据库已安装并启动" 功能用途:自动化安装MySQL数据库,并提示进行安全配置。 一键备份MySQL数据库 #!/bin/bash USER="your_mysql_user" PASSWORD="your_mysql_password" DB_NAME="your_database_name" BACKUP_DIR="/path/to/backup" DATE=$(date +"%Y-%m-%d") mysqldump -u $USER -p$PASSWORD $DB_NAME > $BACKUP_DIR/$DB_NAME-$DATE.sql echo "数据库已备份到 $BACKUP_DIR" 功能用途:备份指定的MySQL数据库到指定目录。 一键安装Nginx #!/bin/bash sudo apt-get update sudo apt-get install -y nginx sudo systemctl start nginx sudo systemctl enable nginx echo "Nginx服务器已安装并启动" 功能用途:自动化安装并启动Nginx服务器。 一键配置防火墙 #!/bin/bash sudo ufw allow 'Nginx Full' sudo ufw allow 'OpenSSH' sudo ufw enable sudo ufw status echo "防火墙已配置并启用" 功能用途:配置防火墙以允许Nginx和SSH服务。 一键更新系统 #!/bin/bash sudo apt-get update sudo apt-get upgrade -y sudo apt-get dist-upgrade -y sudo reboot echo "系统已更新并重启" 功能用途:更新系统软件包,并重启系统以应用更改。 一键安装Docker #!/bin/bash sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce sudo systemctl start docker sudo systemctl enable docker sudo usermod -aG docker $USER echo "Docker已安装并启动,用户已添加到docker组" 功能用途:自动化安装Docker,并将当前用户添加到docker组。 一键清理系统日志 #!/bin/bash sudo find /var/log/ -type f -name "*.log" -exec truncate -s 0 {} \; echo "系统日志已清理" 功能用途:清空系统日志文件。 一键安装PHP #!/bin/bash sudo apt-get update sudo apt-get install -y php libapache2-mod-php php-mysql sudo systemctl restart apache2 echo "PHP已安装并配置为Apache模块" 功能用途:安装PHP及其Apache模块,以便在Apache服务器上运行PHP代码。 一键监控CPU和内存使用率 #!/bin/bash watch -n 1 'free -m && top -bn1 | grep "Cpu(s)"' 功能用途:实时监控CPU和内存使用率。 一键查找大文件 #!/bin/bash sudo find / -type f -size +100M -exec ls -lh {} \; | awk '{ print $9 ": " $5 }' 功能用途:查找系统中大于100MB的文件。 一键安装Git #!/bin/bash sudo apt-get update 一键安装Node.js #!/bin/bash VERSION="node_14.x" # 可以根据需要更改版本 DISTRO=$(lsb_release -s -c) echo "deb https://deb.nodesource.com/$VERSION $DISTRO main" | sudo tee /etc/apt/sources.list.d/nodesource.list sudo apt-get update sudo apt-get install -y nodejs echo "Node.js已安装" 功能用途:自动化安装指定版本的Node.js。 一键安装Redis #!/bin/bash sudo apt-get update sudo apt-get install -y redis-server sudo systemctl start redis sudo systemctl enable redis echo "Redis已安装并启动" 功能用途:自动化安装并启动Redis服务器。 一键安装MongoDB #!/bin/bash wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -sc)/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list sudo apt-get update sudo apt-get install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod echo "MongoDB已安装并启动" 功能用途:自动化安装并启动MongoDB数据库。 一键配置SSH无密码登录 #!/bin/bash read -p "请输入要配置的SSH密钥文件路径: " KEY_PATH ssh-copy-id -i $KEY_PATH user@remote_host # 替换user和remote_host为实际值 echo "SSH无密码登录已配置" 功能用途:将本地SSH密钥复制到远程主机,实现无密码登录。 一键安装Python虚拟环境 #!/bin/bash PYTHON_VERSION="3.8" # 可以根据需要更改版本 sudo apt-get update sudo apt-get install -y python3-$PYTHON_VERSION python3-venv echo "Python虚拟环境工具已安装" 功能用途:安装指定版本的Python及其虚拟环境工具。 一键压缩目录 #!/bin/bash read -p "请输入要压缩的目录路径: " DIR_PATH read -p "请输入压缩文件的名称: " ARCHIVE_NAME tar -czvf $ARCHIVE_NAME.tar.gz -C $(dirname $DIR_PATH) $(basename $DIR_PATH) echo "目录已压缩为 $ARCHIVE_NAME.tar.gz" 功能用途:压缩指定目录为tar.gz格式文件。 一键安装Java #!/bin/bash sudo apt-get update sudo apt-get install -y openjdk-11-jdk echo "Java已安装" 功能用途:安装OpenJDK 11。 一键检查磁盘空间 #!/bin/bash df -h | grep -Ev '^Filesystem|tmpfs|cdrom' 功能用途:检查并显示系统中各磁盘分区的使用情况,排除临时文件系统、光盘等。 这些脚本覆盖了Linux运维中的常见任务,包括服务器安装、数据库管理、系统更新、日志清理、开发工具安装等。请根据实际情况调整脚本中的参数和路径。
2025年-2月-24日
5494 阅读
0 评论
other
2025-2-19
chatgpt-on-wechat 项目多种部署方式
chatgpt-on-wechat 项目提供了多种部署方式,以下是详细的部署步骤: 本地部署 1. 准备工作 系统要求:支持 Linux、MacOS、Windows 系统(可在Linux服务器上长期运行),同时需安装 Python。建议Python版本在 3.7.1 - 3.9.X 之间,推荐3.8版本,3.10及以上版本在 MacOS 可用,其他系统上不确定能否正常运行。 克隆项目代码: git clone https://github.com/zhayujie/chatgpt-on-wechat cd chatgpt-on-wechat/ 注:如遇到网络问题可选择国内镜像 https://gitee.com/zhayujie/chatgpt-on-wechat。 安装依赖: 核心依赖(必选):能够使用itchat创建机器人,并具有文字交流功能所需的最小依赖集合。 pip3 install -r requirements.txt 拓展依赖(可选,建议安装): pip3 install -r requirements-optional.txt 注意:如果某项依赖安装失败可注释掉对应的行再继续。 配置文件: 配置文件的模板在根目录的config-template.json中,需复制该模板创建最终生效的 config.json 文件: cp config-template.json config.json 然后在config.json中填入配置,以下是对默认配置的说明,可根据需要进行自定义修改(注意实际使用时请去掉注释,保证JSON格式的完整): { "model": "gpt-3.5-turbo", // 模型名称, 支持 gpt-3.5-turbo, gpt-4, gpt-4-turbo, wenxin, xunfei, glm-4, claude-3-haiku, moonshot "open_ai_api_key": "YOUR API KEY", // 如果使用openAI模型则填入上面创建的 OpenAI API KEY "open_ai_api_base": "https://api.openai.com/v1", // OpenAI接口代理地址 "proxy": "", // 代理客户端的ip和端口,国内环境开启代理的需要填写该项,如 "127.0.0.1:7890" "single_chat_prefix": ["bot", "@bot"], // 私聊时文本需要包含该前缀才能触发机器人回复 "single_chat_reply_prefix": "[bot] ", // 私聊时自动回复的前缀,用于区分真人 "group_chat_prefix": ["@bot"], // 群聊时包含该前缀则会触发机器人回复 "group_name_white_list": ["ChatGPT测试群", "ChatGPT测试群2"] // 开启自动回复的群名称列表 } 2. 运行项目 使用nohup命令在后台运行程序: nohup python3 app.py & tail -f nohup.out # 在后台运行程序并通过日志输出二维码 扫码登录后程序即可运行于服务器后台,此时可通过 ctrl+c 关闭日志,不会影响后台程序的运行。使用 ps -ef | grep app.py | grep -v grep 命令可查看运行于后台的进程,如果想要重新启动程序可以先 kill 掉对应的进程。日志关闭后如果想要再次打开只需输入 tail -f nohup.out。此外,scripts 目录下有一键运行、关闭程序的脚本供使用。 多账号支持:将项目复制多份,分别启动程序,用不同账号扫码登录即可实现同时运行。 特殊指令:用户向机器人发送 #reset 即可清空该用户的上下文记忆。 Docker部署 前提条件:需要安装好 docker 及 docker-compose,安装成功的表现是执行 docker -v 和 docker-compose version (或 docker compose version) 可以查看到版本号,可前往 docker官网 进行下载。 步骤: 1.下载 docker-compose.yml 文件: wget https://open-1317903499.cos.ap-guangzhou.myqcloud.com/docker-compose.yml 下载完成后打开 docker-compose.yml 修改所需配置,如 OPEN_AI_API_KEY 和 GROUP_NAME_WHITE_LIST 等。 2.启动容器: 在 docker-compose.yml 所在目录下执行以下命令启动容器: sudo docker compose up -d 注意:如果 docker-compose 是 1.X 版本 则需要执行 sudo docker-compose up -d 来启动容器。 运行 sudo docker ps 能查看到 NAMES 为 chatgpt-on-wechat 的容器即表示运行成功。 3.查看容器运行日志: sudo docker logs -f chatgpt-on-wechat 扫描日志中的二维码即可完成登录。 4.插件使用: 如果需要在docker容器中修改插件配置,可通过挂载的方式完成,将 插件配置文件 重命名为 config.json,放置于 docker-compose.yml 相同目录下,并在 docker-compose.yml 中的 chatgpt-on-wechat 部分下添加 volumes 映射: volumes: - ./config.json:/app/plugins/config.json Railway部署 Railway 每月提供5刀和最多500小时的免费额度。 (07.11更新: 目前大部分账号已无法免费部署) 步骤: 进入 Railway。 点击 Deploy Now 按钮。 设置环境变量来重载程序运行的参数,例如open_ai_api_key, character_desc。 一键部署: https://railway.com/template/qApznZ?referralCode=RC3znh
2025年-2月-19日
5421 阅读
0 评论
AI
2025-2-10
DeepSeek 满血版本地化傻瓜式可视化部署方案
DeepSeek满血版本地化傻瓜式可视化部署方案 一、方案背景与目标 背景 DeepSeek作为先进的大语言模型,具备强大的语言理解和生成能力。将其进行本地化部署,能够在保障数据安全和隐私的同时,满足特定场景下的高效使用需求。本方案旨在为非专业技术人员提供一种简单、直观的方式,实现DeepSeek满血版的本地部署与使用。 目标 通过傻瓜式、可视化的部署流程,让用户能够轻松在本地环境搭建DeepSeek模型,并通过可视化界面与之交互,完成文本生成、问答等任务。 二、准备工作 硬件要求 硬件组件 推荐配置 说明 CPU Intel Core i7 及以上或 AMD Ryzen 7 及以上 多核心处理器可加速模型推理过程 内存 16GB 及以上 足够的内存可避免因内存不足导致的程序崩溃 硬盘 512GB 及以上 SSD 快速的读写速度可加快模型文件加载和数据处理 GPU NVIDIA GeForce RTX 3060 及以上 支持 CUDA 加速,显著提升模型运行效率 网络 稳定的宽带网络 用于下载软件、代码和模型文件 软件准备 Anaconda Anaconda 是一个开源的 Python 发行版本,包含了 Python、众多科学计算库以及包管理工具 conda。 下载:访问 Anaconda 官网(https://www.anaconda.com/download ),根据自己的操作系统(Windows、Mac OS、Linux)选择对应的安装包进行下载。 安装:运行下载好的安装包,按照安装向导的提示进行操作。在安装过程中,建议勾选“Add Anaconda to my PATH environment variable”选项,以便在命令行中可以直接使用 conda 命令。 Git 客户端 Git 是一种分布式版本控制系统,用于管理代码的版本和协作开发。 下载:访问 Git 官网(https://git-scm.com/downloads ),选择适合自己操作系统的版本进行下载。 安装:运行下载好的安装包,按照默认设置完成安装。安装完成后,在命令行中输入 git --version 验证安装是否成功。 NVIDIA 驱动 如果你的计算机配备了 NVIDIA GPU,需要安装相应的驱动程序以支持 CUDA 加速。 下载:访问 NVIDIA 官网(https://www.nvidia.com/Download/index.aspx ),根据自己的 GPU 型号、操作系统和 CUDA 版本选择合适的驱动程序进行下载。 安装:运行下载好的驱动程序安装包,按照安装向导的提示完成安装。安装完成后,在命令行中输入 nvidia-smi 验证驱动是否安装成功。 CUDA 和 cuDNN(可选但推荐) CUDA 是 NVIDIA 推出的并行计算平台和编程模型,cuDNN 是 NVIDIA 提供的深度神经网络库,它们可以显著加速基于 GPU 的深度学习模型训练和推理。 CUDA 安装:访问 NVIDIA CUDA 官网(https://developer.nvidia.com/cuda-downloads ),选择适合自己操作系统的 CUDA 版本进行下载和安装。安装过程中按照提示进行操作,注意记录安装路径。 cuDNN 安装:访问 NVIDIA cuDNN 官网(https://developer.nvidia.com/cudnn ),注册并登录后下载与 CUDA 版本兼容的 cuDNN 库。将下载的压缩包解压后,将其中的文件复制到 CUDA 安装目录对应的文件夹中。 三、部署步骤 1. 创建并激活 Anaconda 环境 打开 Anaconda Prompt(Windows)或终端(Mac OS、Linux)。 输入以下命令创建一个名为 deepseek_env 的 Python 3.8 环境: conda create -n deepseek_env python=3.8 输入以下命令激活该环境: conda activate deepseek_env 2. 获取 DeepSeek 代码 在激活的 Anaconda 环境下,打开 Git Bash(Windows)或终端(Mac OS、Linux)。 输入以下命令将 DeepSeek 代码克隆到本地: git clone <DeepSeek代码仓库地址> 请将 <DeepSeek代码仓库地址> 替换为 DeepSeek 官方提供的真实代码仓库链接。如果代码仓库是私有的,可能需要输入用户名和密码进行身份验证。 3. 安装依赖包 进入克隆下来的 DeepSeek 代码目录,例如: cd deepseek 输入以下命令安装运行所需的依赖包: pip install -r requirements.txt 安装过程可能会持续一段时间,具体时间取决于网络速度和依赖包的数量。如果在安装过程中遇到问题,可以尝试使用国内镜像源加速下载,例如: pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 4. 下载模型文件 从 DeepSeek 官方指定的模型下载地址获取满血版模型文件。这些文件可能包含模型权重、配置文件等。 创建一个 models 文件夹用于存放模型文件: mkdir models 将下载好的模型文件解压到 models 文件夹中。确保文件路径与代码中配置的模型路径一致。 5. 配置环境变量(可选) 如果安装了 CUDA 和 cuDNN,需要配置相应的环境变量,以便程序能够正确找到这些库。 在 Windows 系统中,右键点击“此电脑”,选择“属性” -> “高级系统设置” -> “环境变量”,在系统变量中添加以下变量: CUDA_PATH:指向 CUDA 安装目录,例如 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7 PATH:在原有的 PATH 变量中添加 %CUDA_PATH%\bin 和 %CUDA_PATH%\libnvvp 在 Linux 或 Mac OS 系统中,编辑 ~/.bashrc 或 ~/.zshrc 文件,添加以下内容: export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH 然后执行 source ~/.bashrc 或 source ~/.zshrc 使配置生效。 6. 启动可视化界面 在代码目录下,输入以下命令启动可视化界面: python app.py 启动成功后,会在命令行中显示一个本地链接,如 http://127.0.0.1:7860。 打开浏览器,输入该链接,即可看到 DeepSeek 的可视化界面。 四、测试与优化 简单测试 在可视化界面中输入一些测试文本,例如:“介绍一下人工智能”,然后点击生成按钮。 观察生成结果是否符合预期,包括文本的逻辑性、语法正确性和相关性。 如果生成结果出现错误或不符合要求,可以尝试调整输入文本的表述方式或修改模型的参数设置。 性能优化 调整模型参数 在可视化界面的设置选项中,通常可以找到一些模型参数,如生成的最大长度、采样温度等。 最大长度:适当降低最大长度可以减少生成时间,但可能会导致生成的文本不够完整。 采样温度:降低采样温度可以使生成的文本更加确定和保守,提高采样温度可以使生成的文本更加多样化和随机。 资源管理 定期清理缓存文件,释放硬盘空间。可在代码目录下找到缓存文件夹进行清理。 关闭不必要的后台程序,以确保计算机有足够的资源用于运行 DeepSeek 模型。 硬件升级 如果在使用过程中发现性能仍然无法满足需求,可以考虑升级硬件,如增加内存、更换更强大的 GPU 等。 五、常见问题及解决方法 依赖包安装失败 问题描述:在执行 pip install -r requirements.txt 时,部分依赖包安装失败。 解决方法: 检查网络连接是否稳定,尝试使用国内镜像源加速下载。 查看错误信息,可能是某些依赖包版本不兼容。可以尝试手动安装指定版本的依赖包,例如 pip install package_name==version_number。 模型文件加载失败 问题描述:启动可视化界面时,提示模型文件加载失败。 解决方法: 检查模型文件是否完整下载并解压到正确的目录。 确保代码中配置的模型路径与实际模型文件路径一致。 GPU 加速未生效 问题描述:计算机配备了 NVIDIA GPU,但在运行过程中未使用 GPU 加速。 解决方法: 检查 NVIDIA 驱动、CUDA 和 cuDNN 是否正确安装并配置。 在代码中添加相应的 GPU 配置代码,例如: import torch device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) 六、总结 通过以上步骤,你可以轻松地在本地环境实现 DeepSeek 满血版的傻瓜式、可视化部署。在部署过程中,按照准备工作的要求确保硬件和软件环境的正确性,严格遵循部署步骤进行操作。遇到问题时,参考常见问题及解决方法进行排查和修复。
2025年-2月-10日
6769 阅读
0 评论
AI
2025-2-8
DeepSeek 本地部署AI对话网页版
DeepSeek 本地部署AI对话网页版 安装指南 安装 ollama 访问 https://www.ollama.com/ ,下载安装包,安装 ollama 安装deepseek-r1:7b模型 访问 https://www.ollama.com/library/deepseek-r1 ,在命令行执行如下命令,安装deepseek-r1:7b模型 ollama run deepseek-r1:14b 下载本项目代码,DeepSeek 本地部署AI对话网页版 下载本项目代码。 git clone https://gitee.com/deepseeklocal/deepseek-local.git 安装nodejs 访问 https://nodejs.org/zh-cn/download ,下载安装包,安装nodejs 进入deepseek-local目录,运行如下命令,启动nodejs服务 npm install node app.js 访问 http://localhost:8888 ,即可看到DeepSeek 本地部署AI对话网页版 管理员默认登录账号: admin 密码:111111 点击“聊天”,即可看到DeepSeek 本地部署AI对话网页版
2025年-2月-8日
5561 阅读
0 评论
AI
2025-2-7
如何将 Chatbox 连接到远程 Ollama 服务
现在有越来越多的开源模型,可以让你在自己的电脑或服务器上运行。使用本地模型有许多优势: 完全离线运行,保护隐私数据安全 无需支付在线 API 费用 完全离线,服务稳定,无网络延迟 可以自由调整和定制模型参数 Chatbox 可以很好地连接到 Ollama 服务,让你在使用本地模型时可以获取 Chatbox 提供的更多强大功能,比如 Artifact Preview、文件解析、会话话题管理、Prompt 管理等。 (注意:运行本地模型对你的电脑配置有一定要求,包括内存、GPU 等。如果出现卡顿,请尝试降低模型参数。) 安装 Ollama Ollama 是一个开源的本地模型运行工具,可以方便地下载和运行各种开源模型,比如 Llama、Qwen、DeepSeek 等。这个工具支持 Windows、MacOS、Linux 等操作系统。 Ollama 下载地址 https://ollama.com/ 下载并运行本地模型 下载并安装 Ollama 后,请打开命令行终端,输入命令下载并运行本地模型。你可以在这里查看到所有 ollama 支持的模型列表:Ollama 模型列表。 举例1:下载并运行 llama3.2 模型 ollama run llama3.2 举例2:下载并运行 deepseek-r1:8b 模型(注意:Ollama 上的 DeepSeek R1 模型实际上是蒸馏模型) ollama run deepseek-r1:8b 在 Chatbox 中连接本地 Ollama 服务 在 Chatbox 中打开设置,在模型提供方中选择 Ollama,即可在模型下拉框中看见你运行的本地模型。 点击保存,即可正常聊天使用。 在 Chatbox 中连接远程 Ollama 服务 除了可以轻松连接本地 Ollama 服务,Chatbox 也支持连接到运行在其他机器上的远程 Ollama 服务。 例如,你可以在家中的电脑上运行 Ollama 服务,并在手机或其他电脑上使用 Chatbox 客户端连接到这个服务。 你需要确保远程 Ollama 服务正确配置并暴露在当前网络中,以便 Chatbox 可以访问。默认情况下,需要对远程 Ollama 服务进行简单的配置。 如何配置远程 Ollama 服务? 默认情况下,Ollama 服务仅在本地运行,不对外提供服务。要使 Ollama 服务能够对外提供服务,你需要设置以下两个环境变量: OLLAMA_HOST=0.0.0.0 OLLAMA_ORIGINS=* 在 MacOS 上配置 1、打开命令行终端,输入以下命令: launchctl setenv OLLAMA_HOST "0.0.0.0" launchctl setenv OLLAMA_ORIGINS "*" 2、重启 Ollama 应用,使配置生效。 在 Windows 上配置 在 Windows 上,Ollama 会继承你的用户和系统环境变量。 1、通过任务栏退出 Ollama。 2、打开设置(Windows 11)或控制面板(Windows 10),并搜索“环境变量”。 3、点击编辑你账户的环境变量。 为你的用户账户编辑或创建新的变量 OLLAMA_HOST,值为 0.0.0.0; 为你的用户账户编辑或创建新的变量 OLLAMA_ORIGINS,值为 *。 4、点击确定/应用以保存设置。 5、从 Windows 开始菜单启动 Ollama 应用程序。 在 Linux 上配置 如果 Ollama 作为 systemd 服务运行,应使用 systemctl 设置环境变量: 1、调用 systemctl edit ollama.service 编辑 systemd 服务配置。这将打开一个编辑器。 2、在 [Service] 部分下为每个环境变量添加一行 Environment: [Service] Environment="OLLAMA_HOST=0.0.0.0" Environment="OLLAMA_ORIGINS=*" 3、保存并退出。 4、重新加载 systemd 并重启 Ollama: systemctl daemon-reload systemctl restart ollama 服务 IP 地址 配置后,Ollama 服务将能在当前网络(如家庭 Wifi)中提供服务。你可以使用其他设备上的 Chatbox 客户端连接到此服务。 Ollama 服务的 IP 地址是你电脑在当前网络中的地址,通常形式如下: 192.168.XX.XX 在 Chatbox 中,将 API Host 设置为: http://192.168.XX.XX:11434 注意事项 可能需要在防火墙中允许 Ollama 服务的端口(默认为 11434),具体取决于你的操作系统和网络环境。 为避免安全风险,请不要将 Ollama 服务暴露在公共网络中。家庭 Wifi 网络是一个相对安全的环境。
2025年-2月-7日
5381 阅读
0 评论
AI
1
2