【DevOps】基于 KubeSphere 的 Kubernetes 生产实践之旅(万字长文)

基于 KubeSphere 的 Kubernetes 生产实践

  • 1.KubeSphere 简介
    • 1.1 全栈的 Kubernetes 容器云 PaaS 解决方案
    • 1.2 选型理由(从运维的角度考虑)
  • 2.部署架构图
  • 3.节点规划
    • 3.1 软件版本
    • 3.2 规划说明
      • 3.2.1 K8s 集群规划
      • 3.2.2 存储集群
      • 3.2.3 中间件集群
      • 3.2.4 网络规划
      • 3.2.5 存储选型说明
    • 3.3 Kubernetes 集群节点规划
    • 3.4 存储集群节点规划
    • 3.5 中间件节点规划
  • 4.K8s 集群服务器基础配置
    • 4.1 操作系统基础配置
    • 4.2 基本的安全配置
    • 4.3 Docker 安装配置
  • 5.安装配置负载均衡
    • 5.1 三种解决方案
    • 5.2 安装配置
      • 5.2.1 安装软件包(所有负载均衡节点)
      • 5.2.2 配置 HAproxy(所有负载均衡节点,配置相同)
      • 5.2.3 配置 Keepalived
      • 5.2.4 验证
  • 6.KubeSphere 安装 Kubernetes
    • 6.1 下载 KubeKey
    • 6.2 创建包含默认配置的示例配置文件 config-sample.yaml
    • 6.3 根据规划,编辑修改配置文件
    • 6.4 安装 KubeSphere 和 Kubernetes 集群
    • 6.5 验证安装结果

1.KubeSphere 简介

1.1 全栈的 Kubernetes 容器云 PaaS 解决方案

KubeSphere 是在 Kubernetes 之上构建的以应用为中心的 多租户容器平台,提供全栈的 IT 自动化运维 的能力,简化企业的 DevOps 工作流。KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。

  • ✅ 完全开源:通过 CNCF 一致性认证的 Kubernetes 平台, 100 100% 100 开源,由社区驱动与开发。
  • ✅ 简易安装:支持部署在任何基础设施环境,提供在线与离线安装,支持一键升级与扩容集群。
  • ✅ 功能丰富:在一个平台统一纳管 DevOps、云原生可观测性、服务网格、应用生命周期、多租户、多集群、存储与网络。
  • ✅ 模块化 & 可插拔。
  • ✅ 平台中的所有功能都是可插拔与松耦合,您可以根据业务场景可选安装所需功能组件。

官网地址:https://kubesphere.io/zh/

1.2 选型理由(从运维的角度考虑)

  • 🚀 安装简单,使用简单。
  • 🚀 具备构建一站式企业级的 DevOps 架构与可视化运维能力(省去自己用开源工具手工搭积木)。
  • 🚀 提供从平台到应用维度的日志、监控、事件、审计、告警与通知,实现集中式与多租户隔离的可观测性。
  • 🚀 简化应用的持续集成、测试、审核、发布、升级与弹性扩缩容。
  • 🚀 为云原生应用提供基于微服务的灰度发布、流量管理、网络拓扑与追踪。
  • 🚀 提供易用的界面命令终端与图形化操作面板,满足不同使用习惯的运维人员。
  • 🚀 可轻松解耦,避免厂商绑定。

2.部署架构图

在这里插入图片描述

3.节点规划

3.1 软件版本

  • 操作系统版本:centos 7.9

  • KubeSphere: v3.1.1

  • KubeKey 版本:v1.1.1

  • Kubernetes 版本:v1.20.4

  • Docker 版本:v19.03.15

3.2 规划说明

3.2.1 K8s 集群规划

  • 负载均衡
    • 2 2 2 节点,HAProxy,使用 keepalived 实现高可用。
  • Master 节点
    • 3 3 3 节点,部署 KubeSphere 和 Kubernetes 的管理组件,etcd 等服务。
    • 本方案并没有把 etcd 单独部署,有条件或是规模较大的场景可以单独部署 etcd
  • Worker 节点
    • 6 6 6 节点,部署应用,根据实际需求决定数量。

3.2.2 存储集群

  • 3 3 3 节点,GlusterFS
  • 每个节点 1 T 1T 1T 数据盘

3.2.3 中间件集群

  • 在 K8s 集群之外,独立部署的常见中间件。
  • Nginx 代理节点,使用 keepalived 实现高可用,不采用 Ingress
  • MySQL 数据库,主从架构,中小规模使用,大规模需要专业运维人员或是使用云上成熟的产品,最好使用云服务商的产品。
  • Ansible,单独的自动化运维管理节点,执行日常批量运维管理操作。
  • GitLab,运维代码管理,实现 GitOps。
  • Harbor,镜像仓库。
  • Elasticsearch 3 3 3 节点,存储日志。
  • Prometheus,单独部署,用于 K8s 集群和 Pod 的监控。
  • Redis 集群 3 3 3 节点哨兵模式,该集群暂时还是部署在 K8s 上,后期考虑单独部署,因此预先规划预留机器,建议考虑云服务商的产品。
  • RocketMQ 集群 3 3 3 节点,该集群暂时还是部署在 K8s 上,后期考虑单独部署,因此预先规划预留机器,建议考虑云服务上的产品。

3.2.4 网络规划

我们网络要求比较多。因此,不同功能模块,规划了不同的网段,各位可根据需求合理规划。

功能域网段说明
K8s 集群192.168.9.0/24K8s 集群内部节点使用
存储集群192.168.10.0/24存储集群内部节点使用
中间件集群192.168.11.0/24独立在 K8s 集群外的,各种中间件节点使用

3.2.5 存储选型说明

  • 候选者
存储方案优点缺点说明
Ceph资源多没有 Ceph 集群故障处理能力,最好不要碰曾经,经历过 3 3 3 副本全部损坏数据丢失的惨痛经历,因此没有能力处理各种故障之前不会再轻易选择
GlusterFS部署、维护简单;多副本高可用资料少部署和维护简单,出了问题找回数据的可能性大一些
NFS使用广泛单点、网络抖动据说生产环境用的很多,但是单点和网络抖动风险,隐患不小,暂不考虑
MinIO官宣全球领先的对象存储先锋,还未实践
Longhorn官宣企业级云原生容器存储解决方案,还未实践
  • 入选者(暂定):GlusterFS

  • 说明

    • 以上方案为初期初选,属于摸着石头过河,选一个先用着,后期根据运行情况再重新调整。
    • 大家请根据自己的存储需求和团队运维能力选择适合的方案。
    • 因为我们的业务场景对于持久化存储的需求也就是存放一些 Log 日志,能承受一定的数据损失,因此综合选择了 GlusterFS。
    • 存储规划中假设 1 T 1T 1T 数据满足需求,没考虑扩容,后续会做补充。

3.3 Kubernetes 集群节点规划

节点角色主机名CPU(核)内存(GB)系统盘(GB)数据盘(GB)IP备注
负载均衡k8s-slb-02450192.168.9.2 / 192.168.9.1
负载均衡k8s-slb-12450192.168.9.3 / 192.168.9.1
Masterk8s-master-083250500192.168.9.4
Masterk8s-master-183250500192.168.9.5
Masterk8s-master-283250500192.168.9.6
Workerk8s-node-083250500192.168.9.7
Workerk8s-node-183250500192.168.9.8
Workerk8s-node-283250500192.168.9.9
Workerk8s-node-383250500192.168.9.10
Workerk8s-node-483250500192.168.9.11
Workerk8s-node-583250500192.168.9.12
Workerk8s-node-n83250500根据自己的业务需求增加节点

3.4 存储集群节点规划

节点角色主机名CPU(核)内存(GB)系统盘(GB)数据盘(GB)IP备注
存储节点glusterfs-node-0416501000192.168.10.1
存储节点glusterfs-node-1416501000192.168.10.2
存储节点glusterfs-node-2416501000192.168.10.3

3.5 中间件节点规划

节点角色主机名CPU(核)内存(GB)系统盘(GB)数据盘(GB)IP备注
nginx 代理nginx-041650192.168.11.2 / 192.168.11.1自建域名网关,不采用 Ingress
nginx 代理nginx-141650192.168.11.3 / 192.168.11.1自建域名网关,不采用 Ingress
MySQL-主db-master41650500192.168.11.4
MySQL-从db-slave41650500192.168.11.5
Elasticsearchelastic-0416501000192.168.11.6
Elasticsearchelastic-1416501000192.168.11.7
Elasticsearchelastic-2416501000192.168.11.8
自动化运维ansible2450192.168.11.9安装 ansible,用于自动化运维
配置管理harbor41650500192.168.11.10安装 gitlabharbor
Prometheusmonitor41650500192.168.11.11
Redisredis-041650200192.168.11.12预留
Redisredis-141650200192.168.11.13预留
Redisredis-241650200192.168.11.14预留
RocketMQrocketmq-041650200192.168.11.15预留
RocketMQrocketmq-141650200192.168.11.16预留
RocketMQrocketmq-241650200192.168.11.17预留

4.K8s 集群服务器基础配置

4.1 操作系统基础配置

(1)以下操作在 K8s 集群的 Master 和 Worker 节点均执行。
(2)以下操作为了记录博客,采用的手工命令的方式,实践中都采用的 Ansible 进行的自动化配置。

  • 关闭防火墙和 SELinux

本环境没有考虑更多的安全配置,因此关闭了防火墙和 SELinux,有更高安全要求的环境不需要关闭,而是需要进行更多的安全配置。

[root@k8s-master-0 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@k8s-master-0 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  • 配置主机名
[root@k8s-master-0 ~]# hostnamectl set-hostname 规划的主机名
  • 配置主机名解析(可选)

  • 挂载数据盘

# 查看数据盘盘符
[root@k8s-master-0 ~]# lsblk  
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
├─vda1 253:1 0 4G 0 part
└─vda2 253:2 0 36G 0 part /
vdb 253:16 0 500G 0 disk

# 分区
[root@k8s-master-0 ~]# fdisk /dev/vdb
n
p
一路回车
....
w 

# 格式化文件系统(可选 ext4 或是 xfs)
[root@k8s-master-0 ~]# mkfs.ext4 /dev/vdb1

# 创建挂载目录
[root@k8s-master-0 ~]# mkdir /data

# 挂载磁盘
[root@k8s-master-0 ~]# mount /dev/vdb1 /data

# 开机自动挂载
[root@k8s-master-0 ~]# echo '/dev/vdb1 /data ext4 defaults 0 0' >> /etc/fstab
  • 更新操作系统并重启
[root@k8s-master-0 ~]# yum update
[root@k8s-master-0 ~]# reboot
  • 安装依赖软件包
[root@k8s-master-0 ~]# yum install socat conntrack ebtables ipset

4.2 基本的安全配置

基线加固配置

  • 每个企业的基线扫描标准和工具不尽相同,因此本节内容请自行根据漏扫报告的整改要求进行配置。
  • 如有有需要,后期可以分享我们使用的基线加固的自动化配置脚本。

4.3 Docker 安装配置

容器运行时,我们生产环境保守的选择了 19.03 版本的 Docker,安装时选择最新版的即可。

  • 配置 docker yum
[root@k8s-master-0 ~]# vi /etc/yum.repods.d/docker.repo

[docker-ce-stable]
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/$releasever/$basearch/stable
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg
enabled=1

[root@k8s-master-0 ~]# yum clean all
[root@k8s-master-0 ~]# yum makecache
  • 创建 Docker 的配置文件目录和配置文件
[root@k8s-master-0 ~]# mkdir -p /etc/docker/

[root@k8s-master-0 ~]# vi /etc/docker/daemon.json

{
  "data-root": "/data/docker",
  "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
  "log-opts": {
    "max-size": "5m",
    "max-file":"3"
  },
  "exec-opts": ["native.cgroupdriver=systemd"]
}
  • 安装 Docker
[root@k8s-master-0 ~]# yum install  docker-ce-19.03.15-3.el7  docker-ce-cli-19.03.15-3.el7 -y
  • 启动服务并设置开机自启动
[root@k8s-master-0 ~]# systemctl restart docker.service && systemctl enable docker.service
  • 验证
[root@k8s-master-0 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.15
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        99e3ed8919
 Built:             Sat Jan 30 03:17:57 2021
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.15
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       99e3ed8919
  Built:            Sat Jan 30 03:16:33 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

5.安装配置负载均衡

5.1 三种解决方案

  • 采用公有云或是私有云平台上自带的弹性负载均衡服务

配置监听器监听的端口

服务协议端口
apiserverTCP 6443 6443 6443
ks-consoleTCP 30880 30880 30880
httpTCP 80 80 80
httpsTCP 443 443 443
  • 采用 HAProxy 或是 Nginx 自建负载均衡(此次选择)

  • 使用 KubeSphere 自带的解决方案部署 HAProxy

    • KubeKey v1.2.1 开始支持
    • 参考 使用 KubeKey 内置 HAproxy 创建高可用集群

5.2 安装配置

5.2.1 安装软件包(所有负载均衡节点)

[root@k8s-master-0 ~]# yum install haproxy keepalived

5.2.2 配置 HAproxy(所有负载均衡节点,配置相同)

  • 编辑配置文件
[root@k8s-master-0 ~]# vi /etc/haproxy/haproxy.cfg
  • 配置示例
global
    log /dev/log  local0 warning
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

   stats socket /var/lib/haproxy/stats

defaults
  log global
  option  httplog
  option  dontlognull
        timeout connect 5000
        timeout client 50000
        timeout server 50000

frontend kube-apiserver
  bind *:6443
  mode tcp
  option tcplog
  default_backend kube-apiserver

backend kube-apiserver
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server kube-apiserver-1 192.168.9.4:6443 check # Replace the IP address with your own.
    server kube-apiserver-2 192.168.9.5:6443 check # Replace the IP address with your own.
    server kube-apiserver-3 192.168.9.6:6443 check # Replace the IP address with your own.

frontend ks-console
  bind *:30880
  mode tcp
  option tcplog
  default_backend ks-console

backend ks-console
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server kube-apiserver-1 192.168.9.4:30880 check # Replace the IP address with your own.
    server kube-apiserver-2 192.168.9.5:30880 check # Replace the IP address with your own.
    server kube-apiserver-3 192.168.9.6:30880 check # Replace the IP address with your own.
  • 启动服务并设置开机自启动(所有负载均衡节点)
[root@k8s-master-0 ~]# systemctl restart haproxy && systemctl enable haproxy

5.2.3 配置 Keepalived

  • 编辑配置文件(所有负载均衡节点)
[root@k8s-master-0 ~]# vi /etc/keepalived/keepalived.conf
  • LB 节点 1 1 1 配置文件示例
global_defs {
  notification_email {
  }
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp_script chk_haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}

vrrp_instance haproxy-vip {
  state MASTER                   # 主服务器的初始状态
  priority 100                   # 优先级主服务器的要高
  interface eth0                 # 网卡名称,根据实际情况替换
  virtual_router_id 60
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  unicast_src_ip 192.168.9.2      # 本机eth0网卡的IP地址
  unicast_peer {
    192.168.9.3                   # SLB节点2的IP地址
  }

  virtual_ipaddress {
    192.168.9.1/24               # VIP地址
  }

  track_script {
    chk_haproxy
  }
}
  • LB 节点 2 2 2 配置文件示例
global_defs {
  notification_email {
  }
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp_script chk_haproxy {
  script "killall -0 haproxy"
  interval 2
  weight 2
}

vrrp_instance haproxy-vip {
  state BACKUP                   # 从服务器的初始状态
  priority 99                    # 优先级,从服务器的低于主服务器的值
  interface eth0                 # 网卡名称,根据实际情况替换
  virtual_router_id 60
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  unicast_src_ip 192.168.9.3      # 本机eth0网卡的IP地址
  unicast_peer {
    192.168.9.2                   # SLB节点1的IP地址
  }

  virtual_ipaddress {
    192.168.9.1/24                # VIP地址
  }

  track_script {
    chk_haproxy
  }
}
  • 启动服务并设置开机自启动(所有负载均衡节点)
[root@k8s-master-0 ~]# systemctl restart keepalived && systemctl enable keepalived

5.2.4 验证

  • 查看 VIP(在负载均衡节点)
[root@k8s-slb-0 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:9e:27:38:c8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.9.2/24 brd 192.168.9.255 scope global noprefixroute dynamic eth0
       valid_lft 73334sec preferred_lft 73334sec
    inet 192.168.9.1/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::510e:f96:98b2:af40/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
  • 验证 VIP 的连通性(在 k8s-master 其他节点)
[root@k8s-master-0 ~]# ping -c 4 192.168.9.1
PING 192.168.9.1 (192.168.9.1) 56(84) bytes of data.
64 bytes from 192.168.9.1: icmp_seq=1 ttl=64 time=0.664 ms
64 bytes from 192.168.9.1: icmp_seq=2 ttl=64 time=0.354 ms
64 bytes from 192.168.9.1: icmp_seq=3 ttl=64 time=0.339 ms
64 bytes from 192.168.9.1: icmp_seq=4 ttl=64 time=0.304 ms

--- 192.168.9.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.304/0.415/0.664/0.145 ms

6.KubeSphere 安装 Kubernetes

6.1 下载 KubeKey

KubeKey 安装在了 master-0 节点,也可以安装在运维管理节点。

# 使用国内环境
[root@k8s-master-0 ~]# export KKZONE=cn

# 执行以下命令下载 KubeKey
[root@k8s-master-0 ~]# curl -sfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -

# 为kk添加可执行权限(可选)
[root@k8s-master-0 ~]# chmod +x kk

6.2 创建包含默认配置的示例配置文件 config-sample.yaml

[root@k8s-master-0 ~]# ./kk create config --with-kubesphere v3.1.1 --with-kubernetes v1.20.4
  • -‌-with-kubesphere 指定 KubeSphere 版本 v3.1.1

  • -‌-with-kubernetes 指定 Kubernetes 版本 v1.20.4

6.3 根据规划,编辑修改配置文件

  • vi config-sample.yaml
apiVersion: kubekey.kubesphere.io/v1alpha1
kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: k8s-master-0, address: 192.168.9.3, internalAddress: 192.168.9.3, user: root, password: P@ssw0rd@123}
  - {name: k8s-master-1, address: 192.168.9.4, internalAddress: 192.168.9.4, user: root, password: P@ssw0rd@123}
  - {name: k8s-master-2, address: 192.168.9.5, internalAddress: 192.168.9.5, user: root, password: P@ssw0rd@123}
  - {name: k8s-node-0, address: 192.168.9.6, internalAddress: 192.168.9.6, user: root, password: P@ssw0rd@123}
  - {name: k8s-node-1, address: 192.168.9.7, internalAddress: 192.168.9.7, user: root, password: P@ssw0rd@123}
  - {name: k8s-node-2, address: 192.168.9.8, internalAddress: 192.168.9.8, user: root, password: P@ssw0rd@123}
  roleGroups:
    etcd:
    - k8s-master-0
    - k8s-master-1
    - k8s-master-2
    master:
    - k8s-master-0
    - k8s-master-1
    - k8s-master-2
    worker:
    - k8s-node-0
    - k8s-node-1
    - k8s-node-2
  controlPlaneEndpoint:
    domain: lb.kubesphere.local
    address: "192.168.9.1"
    port: 6443
  kubernetes:
    version: v1.20.4
    imageRepo: kubesphere
    clusterName: cluster.local
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
  registry:
    registryMirrors: []
    insecureRegistries: []
  addons: []

---
apiVersion: installer.kubesphere.io/v1alpha1
kind: ClusterConfiguration

....(后面太多都是ks的配置,本文不涉及,先省略)

重点配置项说明

  • hosts 配置 K8s 集群节点的名字、IP、管理用户、管理用户名

  • roleGroups

    • etcdetcd 节点名称

    • mastermaster 节点的名称

    • workerworker 节点的名称

  • controlPlaneEndpoint

    • domain:负载衡器 IP 对应的域名,一般形式 lb.clusterName

    • address:负载衡器 IP 地址

  • kubernetes

    • clusterNamekubernetes 集群的集群名称

6.4 安装 KubeSphere 和 Kubernetes 集群

[root@k8s-master-0 ~]# ./kk create cluster -f config-sample.yaml

6.5 验证安装结果

  • 验证安装过程
[root@k8s-master-0 ~]# kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
  • 验证集群状态

安装完成后,您会看到如下内容:

#####################################################
###              Welcome to KubeSphere!           ###
#####################################################

Console: http://192.168.9.2:30880
Account: admin
Password: P@88w0rd

NOTES:
  1. After you log into the console, please check the
     monitoring status of service components in
     the "Cluster Management". If any service is not
     ready, please wait patiently until all components
     are up and running.
  2. Please change the default password after login.

#####################################################
https://kubesphere.io             20xx-xx-xx xx:xx:xx
#####################################################

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

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

相关文章

kafka,RabbitMQ,RocketMQ,他们之间的区别,架构,如何保证消息的不丢失,保证不重复消费,保证消息的有序性

文章目录 Kafka、RabbitMQ、RocketMQ 之间的区别是什么&#xff1f;性能数据可靠性服务可用性功能 RabbitMQ如何保证消息不丢失&#xff1f;Kafka 的架构说一下&#xff1f;Kafka 怎么保证消息是有序的&#xff1f;Kafka 怎么解决重复消费&#xff1f;Kafka 怎么保证消息不丢失…

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…

spring boot整合Jasypt实现配置加密

文章目录 目录 文章目录 前言 一、Jasypt是什么&#xff1f; 二、使用步骤 1.引入 2.测试使用 3.结果 总结 前言 一、Jasypt是什么&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#xff0c;提供了一种简单的加密解密方式&#xff0c…

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目&#xff0c;网页显示如下&#xff0c;需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null&#xff0c;则执行下面的逻辑。在下面的…

Qt4用子类化ProxyModel和子类化MainWindow实现全表筛选,中文排序和复制粘贴

目录 1 需求 2 子类化ProxyModel实现全表筛选 3 字符串列表实现中文排序 3.1 Qt5中文排序 3.2 Qt4排序 4 表格的复制粘贴 5 应用 1 需求 模型视图编程是Qt开发的基本功&#xff0c;其中有几个关键问题需要解决&#xff1a; 全表筛选&#xff0c;或者说多列搜索中文排序…

100元预算,轻松涨粉1000!腾讯运营面试秘籍大揭秘!

大家好啊&#xff01;小米在这里&#xff5e; 很高兴又有机会和大家见面啦&#xff01;最近小米参加了一场腾讯的运营面试&#xff0c;遇到了一个超有趣的问题&#xff1a;如果让你运营一个公众号&#xff0c;近期需要增加1000个关注&#xff0c;预算100元&#xff0c;怎么完成…

RocketMq 主题(TOPIC)生产级应用

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官方…

【C++初阶】STL详解(八)List的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

2018年2月16日 Go生态洞察:Go 1.10版本发布分析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Autosar MCAL-RH850P1HC-MCAL配置环境搭建

文章目录 前言下载安装包软件安装安装SIP包安装MCAL文件配置工程配置生成代码测试静态代码路径总结前言 对于RH850P1HC,官网有免费的MCAL,但官网的MCAL没有CAN模块(原厂反馈为Bosch IP,CAN Driver他们没有),也没有FEE模块。如果需要,可以找第三方软件公司,如ETAS.虽然M…

1.3 取反器和8位取反器

取反器真值表: 取反开关输入输出011000110101 取反器相当于一个异或门 8位取反器

bit_set位图|布隆过滤器

位图 对于海量整形数据的处理&#xff0c;通常是上百个G的代码。 通常有如下的应用&#xff1a; 1. 快速查找某个数据是否在一个集合中 2. 排序 去重 3. 求两个集合的交集、并集等 4. 操作系统中磁盘块标记 如果将数据加载到内存中&#xff0c;运用基本数据结构处理&…

【Python】用三种方法创建tkinter桌面窗口

Python的tkinter是Python的标准GUI库之一&#xff0c;它是一个开源的、跨平台的GUI工具包&#xff0c;可以用于创建桌面应用程序。 tkinter提供了许多常见的GUI组件&#xff0c;例如按钮、文本框、标签、列表框等等&#xff0c;可以轻松地创建各种类型的桌面应用程序。它还支持…

计算机组成原理-Cache的基本概念和原理

文章目录 存储系统存在的问题Cache的工作原理局部性原理性能分析例题界定何为局部部分问题总结 存储系统存在的问题 增加Cache层来缓和CPU和主存的工作速度矛盾 Cache的工作原理 启动某个程序后&#xff0c;将程序的代码从辅存中取出放入内存中&#xff0c;再从内存中将代码…

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

电子学会C/C++编程等级考试2023年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字字符求和 请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536输入 一行字符串,长度不超过100,字符串中不含空格。输出 字符串中所有数字字符作为数…

Java核心知识点整理大全14-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

SpringBoot 2 系列停止维护,Java8 党何去何从?

SpringBoot 2.x 版本正式停止更新维护&#xff0c;官方将不再提供对 JDK8 版本的支持 SpringBoot Logo 版本的新特性 3.2 版本正式发布&#xff0c;亮点包括&#xff1a; 支持 JDK17、JDK21 版本 对虚拟线程的完整支持 JVM Checkpoint Restore&#xff08;Project CRaC&…

2023-11-25 LeetCode每日一题(二叉树中的伪回文路径)

2023-11-25每日一题 一、题目编号 1457.二叉树中的伪回文路径二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中…

python中模块的创建及引用(import as,import,from)

模块&#xff08;module&#xff09;简介&#xff1a; 1.模块化&#xff0c;模块化指将一个完整的程序分解为一个一个的小模块&#xff0c; 通过将模块组合&#xff0c;来搭建出一个完整的程序 2.不采用模块化就是统一将所有的代码编写到一个文件中&#xff0c;采用 模块化就是…