# Kubernetes 最佳实践 > 来源:原 mongodb 集合 `t_blog` · 整理日期:2026-08-25 > 分类 ID:`2022050319356100000000000001` · 排序:4 · 文章数:8 ## 目录 1. [Mongo Replica 集群搭建](#mongo-replica-集群搭建) 2. [kubernetes nfs](#kubernetes-nfs) 3. [Mongo Replica 集群搭建-1](#mongo-replica-集群搭建-1) 4. [kubernetes](#kubernetes) 5. [kubeadm](#kubeadm) 6. [kubernetes containerd](#kubernetes-containerd) 7. [新增加work节点](#新增加work节点) 8. [kubelet](#kubelet) --- ## 1. Mongo Replica 集群搭建 bid: `2023033021115000000000000029` ## Replica Set 集群搭建 本篇文章记录了基于mongodb-kubernetes-operator【Replica Set】模式集群搭建。 [1]() [2](https://github.com/mongodb/mongodb-kubernetes-operator) [3](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/install-upgrade.md#install-the-operator-using-kubectl) ### 1. 事前准备 > kubernetes 版本: 1.23.9 > mongodb 版本:6.0.2 > nfs: 提前搭建好了kubernetes的nfs系统(具体搭建可以参照)。 ### 2. github项目mongodb-kubernetes-operator [项目地址](https://github.com/mongodb/mongodb-kubernetes-operator) 我们使用mongodb 官网推荐的 mongodb-kubernetes-operator 来进行集群安装。 [document](https://github.com/mongodb/mongodb-kubernetes-operator/blob/master/docs/install-upgrade.md#install-the-operator-using-kubectl) 我们事先把 mongodb-kubernetes-operator 项目中我们要使用的yaml文件复制到我们的工作目录 mongo, 需要的文件夹如下: + mongo + config/crd/bases/ + config/rbac/ + config/manager/ + config/samples/mongodb.com_v1_mongodbcommunity_cr.yaml + deploy/clusterwide/ $ pwd /usr/local/kubernetes/mongo $ ls config deploy ### 3. 按照document依次进行安装 #### 3.1 创建 mongodb 使用的namespace kubectl create ns kube-mongo #### 3.2 创建集群rbac 权限 # 修改 deploy/clusterwide/cluster_role_binding.yaml 中namespace 为 3.1 中我我们创建的 [kube-mongo] kubectl apply -f deploy/clusterwide kubectl apply -k config/rbac --namespace kube-mongo #### 3.3 创建 crd kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml #### 3.4 安装operator kubectl create -f config/manager/manager.yaml --namespace kube-mongo #### 3.5 安装mongodb 修改 config/samples/mongodb.com_v1_mongodbcommunity_cr.yaml文件 - 修改 MongoDBCommunity 资源 我们修改 metadata.name=violin-mongodb 我们修改 spec.version= "6.0.2" 我们修改 spec.users.name[0].passwordSecretRef.name= kube-mongo-pw - 修改 Secret 资源 我们修改 metadata.name= kube-mongo-pw 我们修改 stringData.password= "任意随意写了吧" 然后进行安装 kubectl apply -f config/samples/mongodb.com_v1_mongodbcommunity_cr.yaml --namespace kube-mongo #### 3.6 重新创建pvc 由于我使用的是自定义的storageclass,pvc 处于 pending状态,我们删除掉pvc kubectl delete pvc data-volume-violin-mongodb-0 -n kube-mongo kubectl delete pvc logs-volume-violin-mongodb-0 -n kube-mongo 我们创建新的pvc定义文件: # pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-volume-violin-mongodb-0 namespace: kube-mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: managed-nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-volume-violin-mongodb-1 namespace: kube-mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: managed-nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-volume-violin-mongodb-2 namespace: kube-mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: managed-nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: logs-volume-violin-mongodb-0 namespace: kube-mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: managed-nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: logs-volume-violin-mongodb-1 namespace: kube-mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: managed-nfs-storage --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: logs-volume-violin-mongodb-2 namespace: kube-mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: managed-nfs-storage 我们 创建 pvc kubectl apply -f pvc.yaml # 查看pvc 是否已 kubectl get pvc -n kube-mongo kube-mongo data-volume-violin-mongodb-0 Bound pvc-1ac1a5fd-389c-496d-a47c-7df11d5f5a34 10Gi RWO managed-nfs-storage 41m kube-mongo data-volume-violin-mongodb-1 Bound pvc-39008253-8702-4cc5-876a-0561850929bb 10Gi RWO managed-nfs-storage 61m kube-mongo data-volume-violin-mongodb-2 Bound pvc-a7e867d3-b499-486a-9b39-a42ac5a00b43 10Gi RWO managed-nfs-storage 61m kube-mongo logs-volume-violin-mongodb-0 Bound pvc-209ed46c-d558-4a09-8a2f-edfddbed610c 1Gi RWO managed-nfs-storage 41m kube-mongo logs-volume-violin-mongodb-1 Bound pvc-664b307f-ab95-4af3-8851-17a3ecd2b57c 1Gi RWO managed-nfs-storage 61m kube-mongo logs-volume-violin-mongodb-2 Bound pvc-a8f3a8d2-337d-4470-9ef4-5dbe18a4100a 1Gi RWO managed-nfs-storage 61m ### 4. 关于删除资源的问题。 我们创建operator 或者 statefuset 出错的时候,可以重新删除他们。 #### 4.1 删除 operator kubectl delete deployments.apps mongodb-kubernetes-operator -n kube-mongo #### 4.1 删除 statefulset kubectl delete statefulsets.apps violin-mongodb -n kube-mongo ### 5. 关于 mongosh的使用 kubectl get secret -n -o json | jq -r '.data | with_entries(.value |= @base64d)' kubectl get secret violin-mongodb-admin-my-user -n kube-mongo -o json | jq -r '.data | with_entries(.value |= @base64d)' --- ## 2. kubernetes nfs bid: `2023040608509800000000000030` ## 1 概述 ---   本篇文章记录了violin-home网站NFS系统搭建过程。 采用腾讯云的3台公网云轻量服务器(ubuntu系统) > NFS服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad这5个服务.   其中 # 查看服务使用端口 # nfs : 2049 # portmapper: 111 # mountd, nlockmgr, rquotad 是随机的 # 所以事先要做好端口规划, 在轻量云服务器上开放对应的端口. ```bash rpcinfo -p ``` ## 2 nfs 服务器搭建 --- # install server apt-get install nfs-kernel-server # enable and start server systemctl enable nfs-server systemctl start nfs-server # confirm nfs-server status # create storage mkdir -p /data/nfs-volume && chmod -R 777 /data/nfs-volume # edit config file cat > /etc/exports << EOF /data/nfs-volume 49.233.4.79(rw,sync,no_root_squash) 43.138.55.43(rw,sync,no_root_squash) 43.138.73.106(rw,sync,no_root_squash) EOF # view nfs port usage rpcinfo -p # set port infomation for mountd、rquotad ser # edit nfs-common status vi /etc/default/nfs-common STATDOPTS="--port 31000" # edit nfs-kernel-server status vi /etc/default/nfs-kernel-server RPCMOUNTDOPTS="--manage-gids -p 31001" # edit nlockmgr ,就算进行了这一步操作,也可能不生效。 vi /etc/modprobe.d/options.conf options lockd nlm_udpport=31002 nlm_tcpport=31002 # to add locked vi /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. lockd vi /etc/sysctl.conf fs.nfs.nlm_udpport=31002 fs.nfs.nlm_tcpport=31002 # enable sysctl.conf /sbin/sysctl -p # reload server and service systemctl reload nfs-server systemctl restart rpcbind.service systemctl restart nfs.service # view nfs port usage again rpcinfo -p # to confirm client ip showmount -e 49.233.4.79 # Export list for 49.233.4.79: # /data/nfs-volume 43.138.73.106,43.138.55.43,49.233.4.79 ## 3 nfs 客户端搭建 ---   下面操作需要在每台node上操作,包括master节点。 # install client apt-get install nfs-common # create mount path for client(we use different path to server) mkdir /opt/nfs-volume # mount mount -t nfs 49.233.4.79:/data/nfs-volume /opt/nfs-volume df -h | tail -1 # config auto mount for client cat >> /etc/fstab << EOF 49.233.4.79:/data/nfs-volume /opt/nfs-volume defaults,_netdev 0 0 EOF ## 4 --- ## 3. Mongo Replica 集群搭建-1 bid: `2023040623407900000000000031` ## Replica Set 集群搭建 本篇文章记录了基于 helm bitnami/mongodb chat的【Replica Set】模式集群搭建。 [参照文档](https://github.com/bitnami/charts/tree/main/bitnami/mongodb) ### 1. 事前准备 > kubernetes 版本: 1.23.9 > mongodb 版本:6.0.2 > nfs: 提前搭建好了kubernetes的nfs系统(具体搭建可以参照)。 > storageclass: 提前准备好了基于nfs的storageclass。 > helm: 已经安装了helm ### 2. 添加bitnami repo helm repo add bitnami https://charts.bitnami.com/bitnami ### 3. 查询 mongodb 相关资源 helm repo update helm search repo mongodb NAME CHART VERSION APP VERSION DESCRIPTION bitnami/mongodb 13.9.4 6.0.5 MongoDB(R) is a relational open source NoSQL da... bitnami/mongodb-sharded 6.3.3 6.0.5 MongoDB(R) is an open source NoSQL database tha... ### 4. 创建helm 配置文件 ## values.yaml global: namespaceOverride: kube-mongo storageClass: "managed-nfs-storage" nameOverride: violin-mongo image: pullPolicy: IfNotPresent architecture: "replicaset" replicaCount: 3 #auth: # rootUser: "root" # rootPassword: "123654" # usernames: # - "guan" # passwords: # - "83201048" # databases: # - "violin" resources: requests: cpu: "0.2" memory: 200M limits: cpu: "0.3" memory: 300M containerPorts: mongodb: 27017 externalAccess: enabled: true service: externalTrafficPolicy: "Cluster" type: "ClusterIP" persistence: enabled: true size: 5Gi ### 5. 安装 mongodb helm install mongodb bitnami/mongodb -f values.yaml NAME: mongodb LAST DEPLOYED: Fri Apr 7 11:49:07 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mongodb CHART VERSION: 13.9.4 APP VERSION: 6.0.5 ** Please be patient while the chart is being deployed ** MongoDB® can be accessed on the following DNS name(s) and ports from within your cluster: mongodb-violin-mongo-0.mongodb-violin-mongo-headless.kube-mongo.svc.cluster.local:27017 mongodb-violin-mongo-1.mongodb-violin-mongo-headless.kube-mongo.svc.cluster.local:27017 mongodb-violin-mongo-2.mongodb-violin-mongo-headless.kube-mongo.svc.cluster.local:27017 To get the root password run: export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace kube-mongo mongodb-violin-mongo -o jsonpath="{.data.mongodb-root-password}" | base64 -d) To get the password for "guan" run: export MONGODB_PASSWORD=$(kubectl get secret --namespace kube-mongo mongodb-violin-mongo -o jsonpath="{.data.mongodb-passwords}" | base64 -d | awk -F',' '{print $1}') To connect to your database, create a MongoDB® client container: kubectl run --namespace kube-mongo mongodb-violin-mongo-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.5-debian-11-r4 --command -- bash Then, run the following command: mongosh admin --host "mongodb-violin-mongo-0.mongodb-violin-mongo-headless.kube-mongo.svc.cluster.local:27017,mongodb-violin-mongo-1.mongodb-violin-mongo-headless.kube-mongo.svc.cluster.local:27017,mongodb-violin-mongo-2.mongodb-violin-mongo-headless.kube-mongo.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD To connect to your database nodes from outside, you need to add both primary and secondary nodes hostnames/IPs to your Mongo client. To obtain them, follow the instructions below: ### 6. connect db.createUser({user: "root", pwd: "123654", roles: ["root"]}) --- ## 4. kubernetes bid: `2023040717276500000000000032` ## kubernetes 1.25.2 base Containerd ### 1. deploy schedule NAME | IP | ROLES | VERSION | OS k8s-master | 192.168.8.30 | master | 1.25.2 | ubuntu 22.04 k8s-node1 | 192.168.8.31 | worker | 1.25.2 | ubuntu 22.04 k8s-node2 | 192.168.8.32 | worker | 1.25.2 | ubuntu 22.04 ### 2. preparation #### 2.1 安装系统工具 ```bash apt-get update && apt-get install -y apt-transport-https ``` #### 2.2 安装 GPG 证书 ```bash curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - ``` #### 2.3 写入软件源 ```bash cat << EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF ``` #### 2.4 vi hostname ```bash vi /etc/hostname vi /etc/hosts reboot ``` #### 2.5 selinux ```bash sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config ``` #### 2.6 禁用交换分区 ```bash swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab ``` #### 2.7 iptables ```bash echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward = 1 cat <bid: `2023041008541300000000000036` ## 1. xxx 22.04.1-Ubuntu ```bash cat << EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/kubernetes-xenial main EOF ``` ```bash apt-get update apt-get install -y kubelet=1.25.2-00 kubeadm=1.25.2-00 kubectl=1.25.2-00 ``` ```bash sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config ``` 临时关闭swap分区,当前会话生效,重启失效 永久关闭swap分区 ```bash swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab ``` ```bash cat </proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward = 1 ``` ```bash cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <> /etc/hosts echo 192.168.8.30 k8s-master >> /etc/hosts echo 192.168.8.31 k8s-node1 >> /etc/hosts echo 192.168.8.32 k8s-node2 >> /etc/hosts ``` ## about docker and cri-dockerd ```bash docker pull golang:1.20.2 ``` download cri-dockerd ```bash echo "######### https://github.com/Mirantis/cri-dockerd/releases/tag/v0.3.2 ########' tar -zxvf cri-dockerd-0.3.2.tar.gz ``` ```bash echo "######## chuangjian guazai dian ########" mkdir /data cd /data mkdir go cd go echo "######## download cri-dockerd ########" echo "######## https://github.com/Mirantis/cri-dockerd/releases/tag/v0.3.2 ########' echo "######## jieya ########" tar -zxvf cri-dockerd-0.3.2.tar.gz echo "######## yunxing golang container ########" docker run -it -v /data/go:/data/go golang:1.20.2 /bin/sh ``` enter container ```bash cd /data/go/cri-dockerd-0.3.2 mkdir bin go build -o bin/cri-dockerd ``` out container ```bash cd /data/go/cri-dockerd-0.3.2 install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd cp -a packaging/systemd/* /etc/systemd/system sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service systemctl daemon-reload systemctl enable cri-docker.service systemctl enable --now cri-docker.socket ``` --- ## 6. kubernetes containerd bid: `2023041415557100000000000037` ## containerd ## ctr ## crictl ## nerdctl ## --- ## 7. 新增加work节点 bid: `2023061019139700000000000038` ## --- ## 8. kubelet bid: `2024042923524000000000000040` 该写点什么么... ---