k8s学习--k8s群集部署zookeeper应用及详细解释

文章目录

  • zookeeper
    • 什么是zookeeper
    • 基本概念
    • 主要功能
    • 工作原理
    • 使用场景
    • 优点
    • 缺点
  • k8s集群部署zookeeper
    • 环境
      • 一、zookeeper部署YAML资源清单准备
      • 二、zookeeper部署及部署验证
      • 三、zookeeper应用验证


zookeeper

什么是zookeeper

ZooKeeper 是一个开源的分布式协调服务,主要用于分布式应用程序中,管理数据、同步服务以及维护配置信息。它是由 Apache Software Foundation 管理和维护的。

基本概念

ZNode: ZooKeeper 的数据存储单元,类似于文件系统中的文件和目录。ZNode 可以存储数据和子节点。

Zookeeper Ensemble: 一个 ZooKeeper 服务通常由多个 ZooKeeper 服务器(节点)组成,称为一个 ensemble。通常会有一个主节点(Leader)和若干个跟随节点(Follower)。

Session: 客户端与 ZooKeeper 服务器之间的会话。每个客户端会话都有一个唯一的会话 ID。

主要功能

命名服务(Naming Service): 类似于 DNS,允许分布式应用程序使用路径来访问资源和服务。

配置管理(Configuration Management): 存储和更新配置信息,使得分布式应用程序的各个部分能够同步读取最新的配置。

分布式同步(Distributed Synchronization): 支持分布式锁和队列,帮助多个进程协调对共享资源的访问。

组服务(Group Services): 用于维护分布式系统中群组成员的列表,监控集群中节点的状态。

工作原理

ZooKeeper 采用了一个简单的、基于全局数据一致性的模型:

Leader Election: 当 ZooKeeper 集群启动时,节点之间通过投票选举出一个 Leader。Leader 负责处理所有写请求,而读请求可以由任何节点处理。

Watches: 客户端可以在 ZNode 上设置 watch,当 ZNode 的数据或子节点变化时,ZooKeeper 会通知客户端。

Atomic Broadcast (Zab): ZooKeeper 使用一种叫做 Zab 协议的原子广播协议,确保所有服务器上的数据一致性。所有的写操作都会被记录为事务日志,并通过 Zab 协议广播给其他节点。

使用场景

分布式锁: 使用临时 ZNode 实现分布式锁,确保多个进程不会同时访问共享资源。

集群管理: 在分布式系统中,使用 ZooKeeper 监控集群中的节点,处理节点的动态增加和减少。

配置管理: 存储和分发分布式应用程序的配置参数,确保所有节点使用相同的配置。

命名服务: 管理分布式系统中服务的命名和查找。

优点

高可用性: ZooKeeper 采用分布式架构,保证了高可用性和容错能力。

高性能: ZooKeeper 的读性能非常高,适合高读负载的场景。

一致性: 提供严格的数据一致性,确保分布式系统中各个节点的数据一致。

缺点

单点瓶颈: Leader 处理所有写请求,可能成为性能瓶颈。

复杂性: 部署和管理 ZooKeeper 集群需要一定的技术门槛。

k8s集群部署zookeeper

环境

虚拟机

Ip主机名cpu内存硬盘
192.168.10.11master012cpu双核4G100G
192.168.10.12worker012cpu双核4G100G
192.168.10.13worker022cpu双核4G100G
192.168.10.18nfs1cpu一核2G40G

版本 centos7.9
已部署k8s-1.27

需要做的前置配置
storageclass
详情请看
链接: k8s练习–StorageClass详细解释与应用
区别仅有ip不一致,按本次ip来

Ingress(本章使用nodeport方式访问)
详情请看
链接: k8s学习–ingress详细解释与应用(nginx ingress controller))

本章不再过多叙述

一、zookeeper部署YAML资源清单准备

master节点配置

vim zookeeper.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: smart

---
apiVersion: v1
kind: Service
metadata:
  name: zk-headless 
  namespace: smart
  labels:
    app: zk
spec:
  ports:
  - port: 2888 
    name: server
  - port: 3888 
    name: leader-election
  clusterIP: None  #无头服务集群内访问
  selector:
    app: zk
---
apiVersion: v1
kind: Service
metadata:
  name: zk-np 
  namespace: smart
  labels:
    app: zk
spec:
  type: NodePort    #对外发布访问
  ports:
  - port: 2181
    targetPort: 2181
    name: client
    nodePort: 32181
  selector:
    app: zk
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
  namespace: smart
spec:
  selector:
    matchLabels:
      app: zk
  maxUnavailable: 1  #允许失效pod的数量
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zookeeper
  namespace: smart
spec:
  serviceName: zk-headless
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: zk
  template:
    metadata:
      labels:
        app: zk
    spec:
      affinity:  #pod粘滞
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: kubernetes-zookeeper
        image: k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10
        imagePullPolicy: Always
        resources:
          requests:
            memory: "1Gi"
            cpu: "0.5"
        ports:
        - containerPort: 2181
          name: client
        - containerPort: 2888
          name: server
        - containerPort: 3888
          name: leader-election
        command:
        - sh
        - -c
        - "start-zookeeper \
          --servers=3 \
          --data_dir=/var/lib/zookeeper/data \
          --data_log_dir=/var/lib/zookeeper/data/log \
          --conf_dir=/opt/zookeeper/conf \
          --client_port=2181 \
          --election_port=3888 \
          --server_port=2888 \
          --tick_time=2000 \
          --init_limit=10 \
          --sync_limit=5 \
          --heap=512M \
          --max_client_cnxns=60 \
          --snap_retain_count=3 \
          --purge_interval=12 \
          --max_session_timeout=40000 \
          --min_session_timeout=4000 \
          --log_level=INFO"
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - "zookeeper-ready 2181"
          initialDelaySeconds: 10
          timeoutSeconds: 5
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - "zookeeper-ready 2181"
          initialDelaySeconds: 10
          timeoutSeconds: 5
        volumeMounts:
        - name: datadir
          mountPath: /var/lib/zookeeper
        - name: localtime
          mountPath: /etc/localtime
      volumes:
      - name: localtime
        hostPath:
          path: /etc/localtime  #pod时间同步于宿主机时间
          type: ''

  volumeClaimTemplates:
  - metadata:
      name: datadir
      annotations:
        volume.alpha.kubernetes.io/storage-class: anything
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "nfs-client"
      resources:
        requests:
          storage: 1Gi

用于创建一个zookeeper群集
简单来说就是创建一个命令空间存放相关资源,两个service一个对内一个对外发布服务,还有一个statefulset控制器创建pod,特点是在每个节点至少部署一个,适用于有状态服务,比如说数据库之类

二、zookeeper部署及部署验证

应用yaml文件

kubectl apply -f zookeeper.yaml 

Zookeeper运行pod数量一般为奇数,每节点上会运行一个pod,k8sworker节点如果不够,可能会出现如下现象

kubectl get pod -n smart -o wide

在这里插入图片描述
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。
如果希望将k8s-master也当作Node使用,可以执行如下命令:
查看master01调度控制(Taints污点设置,NoSchedule不被调度)

kubectl describe node master01 | grep Taints

可以看到是noscheduler
禁止调用
在这里插入图片描述

取消污点设置:

kubectl taint node master01 node-role.kubernetes.io/control-plane-

在这里插入图片描述
再查看就好了

 kubectl get pod -n smart -o wide

在这里插入图片描述


如果发现pod只有一个且一直pending,那就是storageclass没有做好,nfs的pod没有或无法起来,pv无法调度存储设备的资源,请详细查看
链接: k8s练习–StorageClass详细解释与应用

查看statefulset应用\

kubectl get sts -n smart 

在这里插入图片描述

查看service

kubectl get svc -n smart

在这里插入图片描述
如果想取消被调度,执行如下命令即可,不会影响已经被调度的pod

kubectl taint node master01 node-role.kubernetes.io/control-plane:NoSchedule

三、zookeeper应用验证

zookeeper访问连接信息验证

dig -t a zk-headless.smart.svc.cluster.local @10.96.0.10
dig -t a zk-np.smart.svc.cluster.local @10.96.0.10```

在这里插入图片描述
在这里插入图片描述

在kubernetes集群内访问验证

kubectl exec -it zookeeper-0 -n smart -- bash
root@zookeeper-0:/# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] create /key1 111
[zk: localhost:2181(CONNECTED) 1] get /key1
[zk: localhost:2181(CONNECTED) 2] quit
root@zookeeper-0:/# exit

在这里插入图片描述
在kubernetes集群外访问验证:
下载客户端软件

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

会提示,由于是虚拟机环境且只是查看能不能用,所以使用不安全的方式链接也无伤大雅
在这里插入图片描述

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz --no-check-certificate
tar xf apache-zookeeper-3.8.4-bin.tar.gz
cd apache-zookeeper-3.8.4-bin/
cd bin/
./zkCli.sh -server 192.168.10.11:32181

出现以下提示说明需要jdk包
在这里插入图片描述

安装jdk
呃呃呃,路径忘了,但包名是
jdk-8u191-linux-x64.tar.gz
可以自己试着找找,我上传的时候显示资源已存在,可以找一找
传到虚拟机内

tar xf jdk-8u191-linux-x64.tar.gz
mv jdk1.8.0_191/ /usr/local/jdk
echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile
source /etc/profile
cd /root/apache-zookeeper-3.8.4-bin/bin
./zkCli.sh -server 192.168.10.11:32181
[zk: 192.168.10.11:32181(CONNECTED) 2] create /key2 123
[zk: 192.168.10.11:32181(CONNECTED) 3] get /key2
[zk: 192.168.10.11:32181(CONNECTED) 4] quit

在这里插入图片描述
完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows11 安装MySQL

MySQL下载官网 安装教程参考 选择Windows离线安装 典型安装

优化页面加载时间

注:机翻,未校对。 本文年代久远,除了少部分不合时宜的,其他仍有借鉴意义。 Optimizing Page Load Time 优化页面加载时间 It is widely accepted that fast-loading pages improve the user experience. In recent years, many …

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行(RCE)漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

java项目总结2

3.了解Java的内存分配 4.重载 定义:在一个类中,有相同名的,但是却是不同参数(返回类型可以不一样) 重载的优点: 1.减少定义方法时使用的单词 2.减少调用方法时候的麻烦(比如sum的返回两个数的…

5月1日起,《碳排放权交易管理暂行条例》正式施行

2024年5月1日,《碳排放权交易管理暂行条例》(以下简称《条例》)正式施行,作为我国应对气候变化领域的第一部专门法规,《条例》首次以行政法规的形式明确了碳排放权市场交易制度。 作为碳排放权交易市场的重要补充&…

关于腾讯的哪些事(4月新闻纪要)

科技进步一等奖! 这份文件是关于腾讯Angel机器学习平台获得2023年中国电子学会科学技术奖科技进步一等奖的详细介绍。主要内容涵盖了获奖项目《面向大规模数据的Angel机器学习平台关键技术及应用》的技术特点、应用效果以及发展历程。以下是详细总结: 获…

数据结构——树的基础概念

目录 1.树的概念 2.树的相关概念 3.树的表示 (1)直接表示法 (2)双亲表示法 (3)左孩子右兄弟表示法 4.树在实际中的运用(表示文件系统的目录树结构) 1.树的概念 树是一种非线性的数据结构&#xff0…

关于一些数据资源入表事项

一、入表条件: 2024年1月1日《企业数据资源相关会计处理暂行规定》开始执行,以上简称《企业会计准则》,它将资产定义为“企业过去的交易或者事项形成的、由企业拥有或者控制的、预期会给企业带来经济利益的资源”。需要说明的是,…

github 设置中文,亲测有效

点进去 安装 选上面第二个,不行再选第一个 GitHub - maboloshi/github-chinese: GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese)

Java学习十二—Java8特性之Optional类

一、简介 Java 8 引入了 Optional​ 类作为一种容器,可以用来显式地表示一个值存在或不存在。它解决了传统上可能会遇到的空指针异常问题,同时提供了一种更优雅的方式来处理可能为null的情况。 Java 8 中引入 Optional​ 类的背景可以从以下几个方面来理…

Ubuntu查看opencv版本c++

✗命令行中直接输入: pkg-config --modversion opencv✔命令行中直接输入: pkg-config --modversion opencv4注解:附上在markdown中打勾,对号和打叉。使用时将&和#之间的空格去掉,这里只是为了不让CSDN自动转换才…

内容监管与自由表达:Facebook的平衡之道

在当今数字化信息社会中,社交媒体平台不仅是人们交流和获取信息的主要渠道,也是自由表达的重要舞台。Facebook,作为全球最大的社交网络平台,连接了数十亿用户,形成了一个丰富多样的信息生态。然而,如何在维…

怎么加密CAD图纸丨企业级图纸加密软件排行榜

我们为什么需要一款好用的图纸加密软件? CAD图纸包含企业的核心设计和技术,是宝贵的知识产权。加密软件可以防止未经授权的人员获取和复制这些设计。 通过加密,可以有效防止CAD图纸在传输或存储过程中被窃取或泄露,特别是在互联…

软考的报名详细流程

2024年软考的考试时间已经公布,分别为5月25日至28日和11月9日至12日。准备参加2024年软考的朋友们,一定要提前关注官方发布的考试安排。 本文将详细介绍软考报考的整个流程。准备报考的朋友们,阅读本文就足够啦!软考的报考流程大致…

面向高精度导航定位领域的UM980RTK定位模块

UM980 是和芯星通自主研发的新一代 BDS/GPS/GLONASS/Galileo/QZSS 全系统全频高精度 RTK 定位模块,基于和芯星通自主研发的新一代射频基带及高精度算法一体化GNSS SoC 芯片—NebulasIV 设计。可同时跟踪 BDS, GPS, GLONASS, Galileo, QZSS, NavIC, SBAS, L-Band* 等…

docker容器间网络仿真工具-pumba

docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预,包括延迟,丢包,带宽限制等。 但是我在实际使用时,发现docker-tc这个工具在进行网络进行模…

大屏开发系列——Echarts的基础使用

本文为个人近期学习总结,若有错误之处,欢迎指出! Echarts在vue2中的基础使用 一、简单介绍二、基本使用(vue2中)1.npm安装2.main.js引入3.使用步骤(1)准备带有宽高的DOM容器;(2)初始化echarts实例&#xff…

React+TS前台项目实战(二十五)-- 全局常用排序组件SortButton封装

文章目录 前言SortButton组件1. 功能分析2. 代码详细注释3. 使用到的全局hook代码4. 使用方式5. 效果展示 总结 前言 今天要封装的SortButton 组件,主要用在表格列排序上,运用于更新路由并跳转更新,起到刷新页面仍然处于当前排序数据。 Sor…

2024最新PyCharm安装教程(附激活码)

今天讲解的是PyCharm安装教程 一、软件简介 PyCharm是一款Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外…

鸿翼ECM统一AI检索应用全景,为企业打造全方位搜索服务

随着企业的发展和信息化进程的加快,海量数据已沉淀至企业各类系统,系统间信息孤立、信息利用率低、数据价值无法发挥成为制约企业发展的重要因素。如何对散落在企业各系统中的数据、内容进行统一管理和高效利用,实现高效精准的信息检索&#…