容器云计算,Devops,DBA,网络安全。 https://micoder.cc/index.php Simple-Log 2024-11-21 14:57:56 https://micoder.cc/themes/default/logo.jpg https://micoder.cc/index.php kafka3.X集群安装(不使用zookeeper) admin /blog.php?id=2766 kafka3.X集群安装(不使用zookeeper)

一、kafka集群实例角色规划

 

上图中黑色代表broker(消息代理服务),褐色/蓝色代表Controller(集群控制器服务)

  • 左图(kafka2.0):一个集群所有节点都是broker角色,kafka从三个broker中选举出来一个Controller控制器,控制器将集群元数据信息(比如主题分类、消费进度等)保存到zookeeper,用于集群各节点之间分布式交互。

  • 右图(kafka3.0):假设一个集群有四个broker,指定三个作为Conreoller角色(蓝色),从三个Controller中选举出来一个Controller作为主控制器(褐色),其他的2个备用。zookeeper不再被需要!相关的元数据信息以kafka日志的形式存在(即:以消息队列消息的形式存在)。

  • controller通信端口:9093, 作用与zk的2181端口类似 。

在搭建kafka3.0集群之前, 我们需要先做好kafka实例角色规划。

(四个broker, 需要通过主动配置指定三个作为Controller, Controller需要奇数个, 这一点和zk是一样的)

主机名称ip角色node.id
kafka-vm1192.168.1.111broker,controller1
kafka-vm2192.168.1.112broker,controller2
kafka-vm3192.168.1.113broker,controller3
kafka-vm4192.168.1.114broker4

二、准备工作

  • kafka3.x不再支持JDK8,建议安装JDK11或JDK17。

  • 新建kafka持久化日志数据mkdir -p /data/kafka;并保证安装kafka的用户具有该目录的读写权限。

各个机器节点执行:

# 安装jdk(kafka3.x不再支持JDK8,建议安装JDK11或JDK17, 这里安装jdk11)
# 下载安装jdk11, 参考: https://blog.csdn.net/justlpf/article/details/127268046
 
# 下载kafka
adduser kafka
cd /opt
wget https://downloads.apache.org/kafka/3.3.1/kafka_2.12-3.3.1.tgz
tar -xf kafka_2.12-3.3.1.tgz
 
chown -R kafka:kafka kafka_2.12-3.3.1*
 
mkdir -p /data/kafka
chown -R kafka:kafka /data/kafka

 vi /etc/hosts,各个节点,添加如下内容:

192.168.1.111 data-vm1
192.168.1.112 data-vm2
192.168.1.113 data-vm3
192.168.1.114 data-vm4

三、修改Kraft协议配置文件

在kafka3.x版本中,使用Kraft协议代替zookeeper进行集群的Controller选举,所以要针对它进行配置。

vi /opt/kafka_2.12-3.3.1/config/kraft/server.properties

具体配置参数如下:

# data-vm1节点
node.id=1
process.roles=broker,controller
listeners=PLAINTEXT://data-vm1:9092,CONTROLLER://data-vm1:9093
advertised.listeners=PLAINTEXT://:9092
controller.quorum.voters=1@data-vm1:9093,2@data-vm2:9093,3@data-vm3:9093
log.dirs=/data/kafka/
 
# data-vm2节点
node.id=2
process.roles=broker,controller
listeners=PLAINTEXT://data-vm2:9092,CONTROLLER://data-vm2:9093
advertised.listeners=PLAINTEXT://:9092
controller.quorum.voters=1@data-vm1:9093,2@data-vm2:9093,3@data-vm3:9093
log.dirs=/data/kafka/
 
# data-vm3节点
node.id=3
process.roles=broker,controller
listeners=PLAINTEXT://data-vm3:9092,CONTROLLER://data-vm3:9093
advertised.listeners=PLAINTEXT://:9092
controller.quorum.voters=1@data-vm1:9093,2@data-vm2:9093,3@data-vm3:9093
log.dirs=/data/kafka/
  • node.id:这将作为集群中的节点 ID,唯一标识,按照我们事先规划好的(上文),在不同的服务器上这个值不同。

  • 其实就是kafka2.0中的broker.id,只是在3.0版本中kafka实例不再只担任broker角色,也有可能是controller角色,所以改名叫做node节点。

  • process.roles:一个节点可以充当broker或controller或两者兼而有之。

  • 按照我们事先规划好的(上文),在不同的服务器上这个值不同。多个角色用逗号分开。


  • listeners: broker将使用9092端口,而kraft controller控制器将使用9093端口。

  • advertised.listeners: 这里指定kafka通过代理暴漏的地址,如果都是局域网使用,就配置PLAINTEXT://:9092即可。

  • controller.quorum.voters:这个配置用于指定controller主控选举的投票节点,所有process.roles包含controller角色的规划节点都要参与,

  • 即:zimug1、zimug2、zimug3。其配置格式为:node.id1@host1:9093,node.id2@host2:9093

  • log.dirs:kafka 将存储数据的日志目录,在准备工作中创建好的目录。

所有kafka节点都要按照上文中的节点规划进行配置,完成config/kraft/server.properties配置文件的修改。

四、格式化存储目录

生成一个唯一的集群ID(在一台kafka服务器上执行一次即可),这一个步骤是在安装kafka2.0版本的时候不存在的。

$ /opt/kafka_2.12-3.3.1/bin/kafka-storage.sh random-uuid
SzIhECn-QbCLzIuNxk1A2A

使用生成的集群ID+配置文件格式化存储目录log.dirs,

所以这一步确认配置及路径确实存在,

并且kafka用户有访问权限(检查准备工作是否做对)。

每一台主机服务器都要执行命令:

/opt/kafka_2.12-3.3.1/bin/kafka-storage.sh format \
-t SzIhECn-QbCLzIuNxk1A2A \
-c /opt/kafka_2.12-3.3.1/config/kraft/server.properties

格式化操作完成之后,log.dirs目录下多出一个Meta.properties文件,

存储了当前的kafka节点的id(node.id),当前节点属于哪个集群(cluster.id)

[root@data-vm2 ~]# ll /data/kafka/
总用量 8
-rw-r--r--. 1 root root 249 10月 11 18:23 bootstrap.checkpoint
-rw-r--r--. 1 root root  86 10月 11 18:23 meta.properties
 
$ cat /data/kafka/meta.properties
#
#Tue Apr 12 07:39:07 CST 2022
node.id=1
version=1
cluster.id=SzIhECn-QbCLzIuNxk1A2A

五、 启动集群,完成基础测试

zimug1 zimug2 zimug3是三台应用服务器的主机名称(参考上文中的角色规划),实现方式已经在本专栏《linux主机与ip解析》中进行了说明。

将下面的命令集合保存为一个shell脚本,并赋予执行权限。执行该脚本即可启动kafka集群所有的节点,

前提是:你已经按照本专栏的《集群各节点之间的ssh免密登录》安装方式做了集群各节点之间的ssh免密登录。

启动命令:

bin/kafka-server-start.sh \
/opt/kafka_2.12-3.3.1/config/kraft/server.properties
 
# 后台运行
nohup bin/kafka-server-start.sh \
/opt/kafka_2.12-3.3.1/config/kraft/server.properties 2>&1 &

脚本: 

#!/bin/bash
kafkaServers='data-vm1 data-vm2 data-vm3'
#启动所有的kafka
for kafka in $kafkaServers
do
    ssh -T $kafka <<EOF
    nohup /opt/kafka_2.12-3.3.1/bin/kafka-server-start.sh /opt/kafka_2.12-3.3.1/config/kraft/server.properties 1>/dev/null 2>&1 &
EOF
echo 从节点 $kafka 启动kafka3.0...[ done ]
sleep 5
done

六、一键停止集群脚本

一键停止kafka集群各节点的脚本,与启动脚本的使用方式及原理是一样的。

停止命令:

/opt/kafka_2.12-3.3.1/bin/kafka-server-stop.sh

执行脚本:

#!/bin/bash
kafkaServers='data-vm1 data-vm2 data-vm3'
#停止所有的kafka
for kafka in $kafkaServers
do
    ssh -T $kafka <<EOF
    cd /opt/kafka_2.12-3.3.1
    bin/kafka-server-stop.sh
EOF
echo 从节点 $kafka 停止kafka...[ done ]
sleep 5
done

七、测试Kafka集群

7.1 创建topic

[root@data-vm1 kafka_2.12-3.3.1]# bin/kafka-topics.sh \
--create \
--topic quickstart-events \
--bootstrap-server data-vm4:9092
 
Created topic quickstart-events.
[root@data-vm1 kafka_2.12-3.3.1]#
 
# 
[root@data-vm1 kafka_2.12-3.3.1]# bin/kafka-topics.sh \
--create \
--topic quickstart-events \
--bootstrap-server data-vm1:9092,data-vm2:9092,data-vm3:9092

7.2 查看topic列表

bin/kafka-topics.sh \
--list \
--bootstrap-server data-vm4:9092
 
# 
bin/kafka-topics.sh \
--list \
--bootstrap-server data-vm1:9092,data-vm2:9092,data-vm3:9092,data-vm4:9092

7.3 查看消息详情

[root@data-vm1 kafka_2.12-3.3.1]# bin/kafka-topics.sh \
--describe \
--topic quickstart-events \
--bootstrap-server data-vm3:9092
 
Topic: quickstart-events        TopicId: zSOJC6wNRRGQ4MudfHLGvQ PartitionCount: 1       ReplicationFactor: 1    Configs: segment.bytes=1073741824
        Topic: quickstart-events        Partition: 0    Leader: 1       Replicas: 1     Isr: 1
 
[root@data-vm1 kafka_2.12-3.3.1]#

7.4 生产消息

[root@data-vm1 kafka_2.12-3.3.1]# bin/kafka-console-producer.sh \
--topic quickstart-events \
--bootstrap-server data-vm1:9092
 
# 参考: 创建并配置topic
bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--create \
--topic my-topic \
--partitions 1 \
--replication-factor 1 \
--config max.message.bytes=64000 \
--config flush.messages=1
 
# ------------------------- 参考 ------------------------ #
# 1: 修改已创建topic配置
# (Overrides can also be changed or set later using the alter configs command.)
bin/kafka-configs.sh \
--bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name my-topic \
--alter \
--add-config max.message.bytes=128000
 
# 2: 检查已修改的topic配置是否生效
# (To check overrides set on the topic you can do)
bin/kafka-configs.sh \
--bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name my-topic \
--describe
 
# 3. 恢复到原来的配置
# (To remove an override you can do)
bin/kafka-configs.sh \
--bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name my-topic \
--alter \
--delete-config max.message.bytes
 
# 4. 增加分区数
# (To add partitions you can do)
bin/kafka-topics.sh \
--bootstrap-server broker_host:port \
--alter \
--topic my_topic_name \
--partitions 40
 
# 5. 添加配置
# (To add configs:)
bin/kafka-configs.sh \
--bootstrap-server broker_host:port \
--entity-type topics \
--entity-name my_topic_name \
--alter \
--add-config x=y
 
# 6. 移除配置
# (To remove a config:)
bin/kafka-configs.sh \
--bootstrap-server broker_host:port \
--entity-type topics \
--entity-name my_topic_name \
--alter \
--delete-config x
 
# 7. 删除topic
# (And finally deleting a topic:)
bin/kafka-topics.sh \
--bootstrap-server broker_host:port \
--delete \
--topic my_topic_name

7.5 消费消息

bin/kafka-console-consumer.sh \
--topic quickstart-events \
--from-beginning \
--bootstrap-server data-vm4:9092

7.6 查看消费者组

# 检查消费者postition
# Checking consumer position
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--describe \
--group my-group
 
  TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG        CONSUMER-ID                                       HOST                           CLIENT-ID
  my-topic                       0          2               4               2          consumer-1-029af89c-873c-4751-a720-cefd41a669d6   /127.0.0.1                     consumer-1
  my-topic                       1          2               3               1          consumer-1-029af89c-873c-4751-a720-cefd41a669d6   /127.0.0.1                     consumer-1
  my-topic                       2          2               3               1          consumer-2-42c1abd4-e3b2-425d-a8bb-e1ea49b29bb2   /127.0.0.1                     consumer-2

7.7 查看消费者组列表

# list all consumer groups across all topics
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--list
 
  test-consumer-group
 
 
# To view offsets, as mentioned earlier, 
# we "describe" the consumer group like this:
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--describe \
--group my-group
 
  TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                    HOST            CLIENT-ID
  topic3          0          241019          395308          154289          consumer2-e76ea8c3-5d30-4299-9005-47eb41f3d3c4 /127.0.0.1      consumer2
  topic2          1          520678          803288          282610          consumer2-e76ea8c3-5d30-4299-9005-47eb41f3d3c4 /127.0.0.1      consumer2
  topic3          1          241018          398817          157799          consumer2-e76ea8c3-5d30-4299-9005-47eb41f3d3c4 /127.0.0.1      consumer2
  topic1          0          854144          855809          1665            consumer1-3fc8d6f1-581a-4472-bdf3-3515b4aee8c1 /127.0.0.1      consumer1
  topic2          0          460537          803290          342753          consumer1-3fc8d6f1-581a-4472-bdf3-3515b4aee8c1 /127.0.0.1      consumer1
  topic3          2          243655          398812          155157          consumer4-117fe4d3-c6c1-4178-8ee9-eb4a3954bee0 /127.0.0.1      consumer4
 
# 更多配置参考:
# https://kafka.apache.org/32/documentation.html#uses
]]>
Wed, 06 Nov 2024 17:01:29 +0800 /blog.php?id=2766
Ansible 的stat模块用于获取文件或目录的状态信息 admin /blog.php?id=2765 Ansible 的stat模块用于获取文件或目录的状态信息

Ansible 的 stat 模块用于获取文件或目录的状态信息。在执行任务之前检查文件或目录是否存在、获取文件的属性(如权限、所有者、大小、修改时间等)、验证路径是文件还是目录等方面非常有用。它可以用于条件检查、错误处理、决策分支等。

参数总结

  1. path:

    • 描述:要获取状态信息的文件或目录的路径。

    • 类型:字符串

    • 必需:是

  2. follow:

    • 描述:如果为 yes,则跟随符号链接。

    • 类型:布尔值

    • 默认值:no

  3. get_md5:

    • 描述:如果为 yes,则计算文件的 MD5 校验和(仅适用于文件)。

    • 类型:布尔值

    • 默认值:no

  4. checksum_algorithm:

    • 描述:指定用于计算校验和的算法(如果 get_checksum 为 yes)。

    • 可选值:md5sha1sha256

    • 类型:字符串

    • 默认值:sha1

  5. get_checksum:

    • 描述:如果为 yes,则计算文件的校验和(默认算法为 sha1)。

    • 类型:布尔值

    • 默认值:no

  6. checksum:

    • 描述:指定要使用的校验和算法的别名(仅适用于 md5 和 sha1),等价于 checksum_algorithm

    • 类型:字符串

    • 默认值:无

返回值

stat 模块返回的结果是一个字典,包含了指定文件或目录的状态信息。常见的返回值包括:

  • exists:如果文件或目录存在,则为 true,否则为 false

  • isdir:如果指定路径是目录,则为 true,否则为 false

  • isfile:如果指定路径是文件,则为 true,否则为 false

  • uid:文件或目录的所有者的用户 ID。

  • gid:文件或目录的所有者的组 ID。

  • size:文件大小(以字节为单位)。

  • mtime:文件或目录的修改时间(时间戳)。

  • atime:文件或目录的访问时间(时间戳)。

  • ctime:文件或目录的创建时间(时间戳)。

  • inode:文件或目录的 inode 号。

  • device:文件或目录所在的设备号。

 

基础语法

ansible <hostname or group> -m stat -a "path=<file_or_directory_path> <additional_arguments>" [options]


常见的命令行示例


示例1:检查文件是否存在
ansible all -m stat -a "path=/tmp/sample.txt" --become

上述命令会检查 /tmp/sample.txt 文件是否存在,--become 选项用于以特权执行。


示例2:获取文件详细信息
ansible all -m stat -a "path=/tmp/sample.txt" -v

-v 选项用于启用详细输出,以显示文件的详细状态信息。


示例3:检查目录是否存在
ansible all -m stat -a "path=/tmp/sample_dir" --become

此命令会检查 /tmp/sample_dir 目录是否存在。


示例4:获取文件的 MD5 校验和
ansible all -m stat -a "path=/tmp/sample.txt get_md5=yes" --become

此命令会获取 /tmp/sample.txt 文件的 MD5 校验和。


示例5:获取文件的 MIME 类型
ansible all -m stat -a "path=/tmp/sample.txt get_mime=yes" --become

此命令会获取 /tmp/sample.txt 文件的 MIME 类型信息。


高级使用

结合多个参数完成更复杂的操作:

示例6:获取文件的 SHA256 校验和
ansible all -m stat -a "path=/tmp/sample.txt checksum_algorithm=sha256" --become

此命令会获取 /tmp/sample.txt 文件的 SHA256 校验和。


带环境变量和特权操作

示例7:使用用户特权并设置环境变量
ansible all -m stat -a "path=/tmp/sample.txt" --become --extra-vars "ansible_user=your_user ansible_password=your_password"

 

Playbook示例 


示例1:检查文件是否存在
---
- name: Check if a file exists
  hosts: all
  tasks:
    - name: Check file existence
      stat:
        path: /tmp/sample.txt
      register: file_stat

    - name: Display file existence
      debug:
        msg: "File exists: {
  { file_stat.stat.exists }}"


示例2:检查目录是否存在
---
- name: Check if a directory exists
  hosts: all
  tasks:
    - name: Check directory existence
      stat:
        path: /tmp/sample_dir
      register: dir_stat

    - name: Display directory existence
      debug:
        msg: "Directory exists: {
  { dir_stat.stat.isdir }}"


示例3:获取文件详细信息
---
- name: Get file detailed information
  hosts: all
  tasks:
    - name: Get file status
      stat:
        path: /tmp/sample.txt
      register: file_stat

    - name: Display file details
      debug:
        var: file_stat.stat


示例4:条件任务执行

根据文件的存在性执行条件任务:

---
- name: Conditional tasks based on file existence
  hosts: all
  tasks:
    - name: Check if a file exists
      stat:
        path: /tmp/sample.txt
      register: file_stat

    - name: Create file if not exists
      file:
        path: /tmp/sample.txt
        state: touch
      when: not file_stat.stat.exists


示例5:获取文件的 MD5 校验和
---
- name: Get file MD5 checksum
  hosts: all
  tasks:
    - name: Check file status with MD5
      stat:
        path: /tmp/sample.txt
        get_md5: yes
      register: file_stat

    - name: Display MD5 checksum
      debug:
        msg: "File MD5 checksum: {
  { file_stat.stat.md5 }}"


示例6:获取文件的 MIME 类型
---
- name: Get file MIME type
  hosts: all
  tasks:
    - name: Get file status with MIME type
      stat:
        path: /tmp/sample.txt
        get_mime: yes
      register: file_stat

    - name: Display MIME type
      debug:
        msg: "File MIME type: {
  { file_stat.stat.mime_type }}"


示例7:获取文件的 SHA256 校验和
---
- name: Get file SHA256 checksum
  hosts: all
  tasks:
    - name: Check file status with SHA256 checksum
      stat:
        path: /tmp/sample.txt
        checksum_algorithm: sha256
      register: file_stat

    - name: Display SHA256 checksum
      debug:
        msg: "File SHA256 checksum: {
  { file_stat.stat.checksum }}"


综合示例

结合多个参数和任务的示例:

---
- name: Comprehensive example of stat usage
  hosts: all
  tasks:
    - name: Check if a file exists and get details
      stat:
        path: /tmp/sample.txt
        get_md5: yes
        get_mime: yes
        checksum_algorithm: sha256
      register: file_stat

    - name: Display file details
      debug:
        var: file_stat.stat

    - name: Create file if not exists
      file:
        path: /tmp/sample.txt
        state: touch
      when: not file_stat.stat.exists

    - name: Display MD5 checksum if file exists
      debug:
        msg: "File MD5 checksum: {
  { file_stat.stat.md5 }}"
      when: file_stat.stat.exists
    
    - name: Display MIME type if file exists
      debug:
        msg: "File MIME type: {
  { file_stat.stat.mime_type }}"
      when: file_stat.stat.exists
    
    - name: Display SHA256 checksum if file exists
      debug:
        msg: "File SHA256 checksum: {
  { file_stat.stat.checksum }}"
      when: file_stat.stat.exists
]]>
Thu, 05 Sep 2024 18:15:30 +0800 /blog.php?id=2765
ansible 实现文件上传与md5校验 admin /blog.php?id=2764 ansible 实现文件上传与md5校验


---
- name: 上传文件并进行MD5校验
  hosts: target_hosts  # 请替换为您的目标主机组
  gather_facts: false

  vars:
    source_file: /path/to/local/file.txt  # 请替换为本地源文件路径
    dest_file: /path/to/remote/file.txt   # 请替换为远程目标文件路径
    expected_md5: "your_expected_md5_here"  # 请替换为预期的MD5值

  tasks:
    - name: 上传文件到目标主机
      copy:
        src: "{{ source_file }}"
        dest: "{{ dest_file }}"
      register: copy_result

    - name: 计算目标文件MD5
      command: md5sum "{{ dest_file }}"
      register: md5_output
      changed_when: false

    - name: 显示MD5校验结果
      debug:
        msg:
          - "文件上传状态: {{ '成功' if copy_result.changed else '失败或文件已存在' }}"
          - "计算的MD5: {{ md5_output.stdout.split()[0] }}"
          - "预期的MD5: {{ expected_md5 }}"
          - "MD5校验结果: {{ 'Pass' if md5_output.stdout.split()[0] == expected_md5 else 'Fail' }}"

    - name: 检查MD5是否匹配
      fail:
        msg: "MD5校验失败:文件可能已被修改或上传不完整"
      when: md5_output.stdout.split()[0] != expected_md5



]]>
Thu, 05 Sep 2024 18:14:28 +0800 /blog.php?id=2764
Centos7 安装Ntop监控软件 admin /blog.php?id=2763 Centos7 安装Ntop监控软件


1,命令记录下

          cd /etc/yum.repos.d/
  113  wget --no-check-certificate https://packages.ntop.org/centos-stable/ntop.repo -O ntop.repo
  114  cd /etc/yum.repos.d/

  116  wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/artifactory/os-conf/centos/centos-7.repo
  117  yum install pfring n2disk nprobe ntopng ntopng-data cento nbox -y
 
  119  vi /etc/ntopng/ntopng.conf
  120  systemctl start redis
  121  systemctl start ntopng


2,登陆web

账号与密码是admin 

]]>
Sun, 18 Aug 2024 00:23:19 +0800 /blog.php?id=2763
windows强制更新组策略命令 admin /blog.php?id=2762

windows强制更新组策略命令


PowerShell执行命令:gpupdate /force,更新组策略

]]>
Tue, 06 Aug 2024 09:06:47 +0800 /blog.php?id=2762
零信任aTrust VPN安装在Windows server admin /blog.php?id=2761 零信任aTrust VPN安装在Windows server



不让下载用于Windows终端接入,适用于win7、win10、win11和Server2008及以上的服务器版本;可适用aTrust服务端范围:v2.2.10及以上。 注意:其中在windows server服务器安装是,需将安装包修改为aTrustInstaller[WinServer].exe


aTrust最低可支持和win7同内核版本的server,即支持windows server 2008R2及以上版本,更低版本不再支持。
注意:server使用需要用在 一人一机 的场景上,不能多人多会话 同时登录aTrust。
使用方式:需要修改安装包文件名,在安装包名称后面加上[WinServer] 就可以安装了。注:WinServer前后带英文方括号



零信任安装在Windows server服务器上需要做下这个操作。

Windows Server下操作方法:在Windows Server系统需要重命名安装包,增加一个[WinServer]]的标记,即将Windows客户端安装包原名称aTrustInstallerXXX.exe修改为aTrustInstallerXXX[WinServer].exe

]]>
Tue, 30 Jul 2024 21:45:07 +0800 /blog.php?id=2761
openEuler 22.03LTS 安装部署nvidia open gpu driver admin /blog.php?id=2760 openEuler 22.03LTS 安装部署nvidia open gpu driver


环境信息:

  1. 禁用开源驱动nouveau

rmmod nouveau

echo “blacklist nouveau” >> /etc/modprobe.d/blacklist.conf

  1. 下载Nvidia 驱动源码

安装时构建的内核模块必须与gsp一起使用。bin固件和用户空间NVIDIA GPU驱动程序组件来自相应的515.43.04驱动程序版本。因此在安装源码前需要安装nvidia gpu驱动。

wget https://cn.download.nvidia.cn/XFree86/aarch64/515.43.04/NVIDIA-Linux-aarch64-515.43.04.run 16

安装gpu驱动:

sh ./NVIDIA-Linux-[version].run --no-kernel-modules

  1. 下载Nvidia 驱动源码

wget https://cn.download.nvidia.cn/XFree86/aarch64/515.43.04/NVIDIA-Linux-aarch64-515.43.04.run 16

  1. 安装gpu驱动:

bash ./NVIDIA-Linux-aarch64-515.43.04.run --no-kernel-modules

  1. 下载开源驱动源码

git clone GitHub - NVIDIA/open-gpu-kernel-modules: NVIDIA Linux open GPU kernel module source 10

  1. 编译源码

cd open-gpu-kernel-modules-main

make modules -jnproc

  1. 安装源码

make modules_install -jnproc

  1. 编译安装nvidia驱动

cd /lib/modules/5.10.0/kernel/drivers/video/

insmod nvidia.ko

  1. 查看驱动信息

modinfo nvidia

Agenda

  1. 编译nvidia开源驱动报错,无法找到/lib/modules/4.19.90-2204.3.0.0146.oe1.aarch64/build

下载内核源码包,创建软链接指向当前下载的源码路径:

ln -s /usr/src/kernels/4.19.90-2205.1.0.0148.oe1.aarch64 /lib/modules/4.19.90-2204.3.0.0146.oe1.aarch64/build

  1. 安装nvidia驱动报错,无法找到目录/lib/modules/5.10.0

在2022/7/14使用github上最新的代码进行编译安装时,提示无法找到目录/lib/modules/5.10.0,这个是因为内核检查的是5.10.0大版本,设置软链接指向该目录即可:

ln -s /lib/modules/5.10.0-60.18.0.50.oe2203.aarch64 /lib/modules/5.10.0

  1. 安装nvidia驱动报错,内核签名校验失败

这个是内核签名校验失败,ko已经编译完成,可以进入对应目录手动安装ko文件。

cd /usr/lib/modules/${编译的内核版本}/kernel/drivers/video

insmod nvidia.ko

  1. 编译失败,出现modpost undfined error

如果使用515.43.04版本的开源驱动代码,并且在aarch64上编译,会产生如下错误。这个是程序代码问题,在 515.48.07版本中已被修复。

本次安装的gpu固件驱动版本和open gpu 版本不一致,所以无法使用相关命令,后续会在安装对应版本的固件驱动和开源驱动后重新使用,然后更新文档。

]]>
Wed, 24 Jul 2024 11:20:50 +0800 /blog.php?id=2760
OpenEuler2203编译打包升级高版本kernel6.6版本内核 admin /blog.php?id=2759

OpenEuler2203编译打包升级高版本kernel6.6版本内核

一,使用以下方法,编译官方提供的内核版本。


git clone https://gitee.com/openeuler/kernel.git
cd kernel/
git checkout OLK-6.6
make  openeuler_defconfig
make  -j4
yum install elfutils-libelf-devel dwarves openssl-devel rsync -y
make binrpm-pkg -j64
cd kernel
rpm -ivh ./rpmbuild/RPMS/x86_64/kernel-6.6.0+-2.x86_64.rpm
yum install ./rpmbuild/RPMS/x86_64/kernel-headers-6.6.0+-2.x86_64.rpm


二,kernel内核官网最新版6.6.40编译方法

 1,下载对应版本的内核源码包并解压

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.6.40.tar.gz

tar -zxvf linux-6.6.40.tar.gz -C /usr/src/

2,下载openeuler官网内核源码打包文件

这里主要是借用内核编译配置文件,这样就不用编译时作选择了。

wget https://mirror.nju.edu.cn/openeuler/openEuler-24.03-LTS/everything/x86_64/Packages/kernel-source-6.6.0-28.0.0.34.oe2403.x86_64.rpm

rpm -ivh kernel-source-6.6.0-28.0.0.34.oe2403.x86_64.rpm

3,安装依赖包

yum -y install elfutils-libelf-devel dwarves openssl-devel rsync

4,编译内核

   cd /usr/src/

   cp /usr/src/linux-6.6.0-28.0.0.34.oe2403.x86_64/arch/x86/configs/openeuler_defconfig  /usr/src/linux-6.6.40/arch/x86/configs/
   make  openeuler_defconfig
   make  -j4

5,打包内核RPM包


  make binrpm-pkg -j64

6,安装RPM包

   rpm -ivh ./rpmbuild/RPMS/x86_64/kernel-6.6.40-2.x86_64.rpm 
   rpm -ivh ./rpmbuild/RPMS/x86_64/kernel-headers-6.6.40-2.x86_64.rpm 
   或是
  rpm -Uvh ./rpmbuild/RPMS/x86_64/ kernel-headers-6.6.40-2.x86_64.rpm 

7,修改启动项

grub2-set-default 0

8,重启系统,查看内核信息

[root@k8sm1 ~]# uname -a


Linux k8sm1 6.6.40 #2 SMP Thu Jul 18 15:16:11 CST 2024 x86_64 x86_64 x86_64 GNU/Linux


]]>
Wed, 17 Jul 2024 10:15:04 +0800 /blog.php?id=2759
Openeuler2203编译安装openssh9.8p1,RPM打包,解决漏洞问题 admin /blog.php?id=2758 Openeuler2203编译安装openssh9.8p1,RPM打包,解决漏洞问题


1,使用rpmbuild将tar包打成rpm包,不喜欢编译升级的,使用RPM升级就方便多了。

    想使用openssh的源码包编译安装的,参考这里:

OpenSSH-9.8p1 (linuxfromscratch.org)



2,准备编译环境

    [root@centos7-31 ~]#  yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel  libXt-devel gtk2-devel make perl -y

    [root@centos7-31 ~]#  dnf install imake -y 

    [root@centos7-31 ~]#  mkdir -p /root/rpmbuild/

    [root@centos7-31 ~]#   cd /root/rpmbuild

    [root@centos7-31 ~]#    mkdir BUILD BUILDROOT RPMS SOURCES SPECS SRPMS

3,下载软件包

    [root@centos7-31 ~]#  cd SOURCES/

    [root@centos7-31 ~]#  wget  https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz

    [root@centos7-31 ~]#   wget https://mirrors.slackware.com/slackware/slackware-14.2/source/xap/x11-ssh-askpass/x11-ssh-askpass-1.2.4.1.tar.gz



   4,解压软件包,修改相关配置文件,再重新打包

    [root@centos7-31 ~]#  tar zxvf openssh-9.8p1.tar.gz

    [root@centos7-31 ~]#   cd openssh-9.8p1/

    [root@centos7-31 ~]#   cp /etc/pam.d/sshd contrib/redhat/sshd.pam


    注意这里还需要修改/root/rpmbuild/SOURCES/openssh-9.8p1/sshd_config文件内容,这样升级后就不修改系统的sshd_config的配置内容。

    根据自己情况修改。

    [root@centos7-31 ~]#   cd /root/rpmbuild/SOURCES/

    [root@centos7-31 ~]#    tar -zcpf openssh-9.8p1.tar.gz openssh-9.8p1



   5,修改打包配置文件。

   

    #将openssh.spec配置文件拷贝到,编译目录下

     cp  /root/rpmbuild/SOURCES/openssh-9.8p1/contrib/redhat/openssh.spec  /root/rpmbuild/SPECS/ 

     cd /root/rpmbuild/SPECS

     

   # 解决PreReq报错

   cat /root/rpmbuild/SPECS/openssh.spec | grep PreReq

   sed -i '/PreReq/s/^/#/' openssh.spec


   以下是源码包修改了相关配置文件,包含打包配置文件,可以直接用来打包,使用此文件可解决没有ssh-copy-id命令的问题

      

openssh9.8p1源码与RPM包


    


   6,打包软件

    [root@centos7-31 ~]#   rpmbuild -ba openssh.spec 

    

   7,删除旧版软件,并安装openssh9.8p1

    [root@centos7-31 ~]#   cd /root/rpmbuild/RPMS/x86_64/

[root@centos7-31 ~]#    rpm -Uvh openssh-*.rpm

或是使用以下命令删除旧软件包,再安装。

    [root@centos7-31 ~]#     rpm -e $(rpm -qa |grep openssh) --nodeps

    [root@centos7-31 ~]#   rpm -ivh openssh-*.rpm

    

   8,检查配置文件内容是否有误,启用sshd服务

    [root@centos7-31 ~]#    sshd -t

    [root@centos7-31 ~]#     systemctl disable sshd

    [root@centos7-31 ~]#     systemctl enable sshd

    [root@centos7-31 ~]#    systemctl restart sshd


   以下是openssh9.8p1的rpm包下载地址


 openssh9.8p1源码与RPM包


]]>
Mon, 15 Jul 2024 12:34:59 +0800 /blog.php?id=2758
华为云21天转型微服务实战营全部资源 admin /blog.php?id=2757 华为云21天转型微服务实战营全部资源


华为云21天转型微服务实战营.zip





什么是微服务
微服务架构是一种架构模式,它要求开发者以一种不同于以往的开发方式进行软件
开发,设计功能比较单一,拥有接口的服务,他们都可以被独立的构建,测试,部
署。
微服务是得益于DevOps文化的发展,持续集成工具的成熟,越来越多的公司向敏
捷转型,微服务架构模式可以指导企业开发出具有可伸缩,弹性,高可用的系统,
从以往的几个月的上线频率,缩短为几周甚至几天。
传统软件是由单一服务构成,微服务提倡将一个软件按照功能模块进行划分.


为什么使用微服务
- 独立运行:服务异常不再彼此影响,必要时将非核心功能隔离,不影响主要功能运转。
一个服务实例崩溃不会影响其他实例,整体系统依然正常。按功能伸缩,当某个模块算
力需求变化时只进行该功能实例的伸缩,而不是整个系统的伸缩,减少资源浪费。
- 独立升级:一个小特性的更改或者bug fix不会影响大部分功能的正常运转
- 代码复用:一套代码可以用于不同的独立系统中,在公司内部或者开源社区中进行分享。
比如,支付服务,用户管理服务,认证鉴权。
- 技术演进:单体服务使用陈旧的技术,想象你过去使用struts1+spring,你想升级struts2
来获得一定的收益,接着你想整体切换到Spring MVC,彻底摆脱struts框架,不断地切换
框架为工程稳定性带来风险,而陈旧的框架又无人维护。而微服务项目不受旧代码拘束。
- 语言限制:当你发现某个新功能更适合使用Go而不是java时该怎么办,Java也不是万金
油,每种语言都有适合自己的场景,微服务使开发者能根据服务场景选择语言。招聘开
发者也不必局限于语言
- 团队:小团队运作更加敏捷,配合紧密,开发周期短,组织扩张灵活

历史
微服务的演进历史是漫长的,从单体的MVC架构到分布式SOA架构,在结合了敏捷开发,DevOps等理念
后最终诞生了微服务。一个很好的印证是,在我深入的实践了DevOps和敏捷开发后,自发地开始萌芽了
微服务的思想理论。
微服务最早出现在国内是在2015年初的时候,成功的案例有AWS以及Netflix等公司。
EC2最早是亚马逊内部使用的一个服务,最终被作为一种服务对外提供成为AWS,而基于微服务架构,
AWS基于现有的服务之上快速迭代新的产品,丰富AWS能力,现在已经拥有100多种不同的服务,回报
是巨大的。
华为很早便践行了微服务理论并对外开源了微服务相关项目,华为云得益于微服务架构快速推出大量新的
云服务。
 
Service微服务面临的挑战
1. 持续集成:大量的工程,需要一个持续集成工具自动完成编译,打包,发布,部署等工
2. 版本管理:大量的版本,就会遇到兼容性问题。你需要让项目可控
3. 文档管理:版本在持续升级,服务接口不匹配。你需要一个文档管理系统,并让开发者
严格遵守文档进行开发
4. 生命周期管理:服务运行期,需要一个平台管理服务,除了部署,启停,还要能够在服
务崩溃时自动拉起服务
5. 运维:运维人员操作服务,查看指标,日志,分布式调用链,更改配置项都由于微服务
架构而变得比以往更加复杂
6. 调试:在开发期你如果依赖于很多微服务,如何方便地在本地去调用依赖的服务。
7. 网络调用:从过去本地的内存栈调用变为了网络调用,不再可靠
8. 安全:如何控制不让未经授权的调用者访问到自己的数据
9. 如何云服务化:转型微服务涉及一系列的工作,处理以上复杂的问题需要大量的基础代
码研发,如何能驾驭诸多的技术和文化变更



]]>
Fri, 05 Jul 2024 09:43:42 +0800 /blog.php?id=2757
kubernetes离线安装KubePi admin /blog.php?id=2756 kubernetes离线安装KubePi



kubernetes离线安装KubePi

介绍

KubePi 是一个现代化的 K8s 面板。

KubePi 允许管理员导入多个 Kubernetes 集群,并且通过权限控制,将不同 cluster、namespace 的权限分配给指定用户。它允许开发人员管理 Kubernetes 集群中运行的应用程序并对其进行故障排查,供开发人员更好地处理 Kubernetes 集群中的复杂性。

离线安装包

见附件

安装步骤如下:

1、导入KubePi 镜像文件(1panel_kubepi_latest.tar) - 安装Docker的任意机器 :

docker load < 1panel_kubepi_latest.tar

2、创建KubePi数据目录

mkdir -p /data/kubepi

3、安装KubePi


docker run --privileged -d -v /data/kubepi:/var/lib/kubepi --restart=unless-stopped -p 49999:80 1panel/kubepi

注意:

49999 端口可以根据实际情况进行调整

4、访问KubePi

http://IP:49999/kubepi

IP : 替换为部署KubePi的真实IP


默认登录信息:(必须在登录系统后修改密码)

用户名: admin

密码: kubepi

>>>示例账户

admin/9R1MWSwDeNloMUgyu6HOoI&Z



5、导入集群

获取kubeconfig内容,在kubernetes的master节点执行如下命令:

cat ~/.kube/config


把上面的内容复制到下面的输入框中,点击“确定”,完成导入 



操作说明参考下面官方提供的文档

https://github.com/1Panel-dev/KubePi/wiki


]]>
Thu, 20 Jun 2024 09:54:33 +0800 /blog.php?id=2756
Openeuler2203编译安装openssh9.7p1,RPM打包,解决漏洞问题 admin /blog.php?id=2755 Openeuler2203编译安装openssh9.7p1,RPM打包,解决漏洞问题


1,使用rpmbuild将tar包打成rpm包,不喜欢编译升级的,使用RPM升级就方便多了。

    想使用openssh的源码包编译安装的,参考这里:

OpenSSH-9.7p1 (linuxfromscratch.org)



2,准备编译环境

    [root@centos7-31 ~]#  yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel  libXt-devel gtk2-devel make perl -y

    [root@centos7-31 ~]#  dnf install imake -y 

    [root@centos7-31 ~]#  mkdir -p /root/rpmbuild/

    [root@centos7-31 ~]#   cd /root/rpmbuild

    [root@centos7-31 ~]#    mkdir BUILD BUILDROOT RPMS SOURCES SPECS SRPMS

3,下载软件包

    [root@centos7-31 ~]#  cd SOURCES/

    [root@centos7-31 ~]#  wget  https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz

    [root@centos7-31 ~]#   wget https://mirrors.slackware.com/slackware/slackware-14.2/source/xap/x11-ssh-askpass/x11-ssh-askpass-1.2.4.1.tar.gz



   4,解压软件包,修改相关配置文件,再重新打包

    [root@centos7-31 ~]#  tar zxvf openssh-9.7p1.tar.gz

    [root@centos7-31 ~]#   cd openssh-9.7p1/

    [root@centos7-31 ~]#   cp /etc/pam.d/sshd contrib/redhat/sshd.pam

    注意这里还需要修改/root/rpmbuild/SOURCES/openssh-9.6p1/sshd_config文件内容,这样升级后就不修改系统的sshd_config的配置内容。

    根据自己情况修改。

    [root@centos7-31 ~]#   cd /root/rpmbuild/SOURCES/

    [root@centos7-31 ~]#    tar -zcpf openssh-9.7p1.tar.gz openssh-9.7p1



   5,修改打包配置文件。

   

    #将openssh.spec配置文件拷贝到,编译目录下

     cp  /root/rpmbuild/SOURCES/openssh-9.7p1/contrib/redhat/openssh.spec  /root/rpmbuild/SPECS/ 

     cd /root/rpmbuild/SPECS

     

   # 解决PreReq报错

   cat /root/rpmbuild/SPECS/openssh.spec | grep PreReq

   sed -i '/PreReq/s/^/#/' openssh.spec


   以下是源码包修改了相关配置文件,包含打包配置文件,可以直接用来打包,使用此文件可解决没有ssh-copy-id命令的问题

      

openssh-9.7p1.tar.gz


    


   6,打包软件

    [root@centos7-31 ~]#   rpmbuild -ba openssh.spec 

    

   7,删除旧版软件,并安装openssh9.7p1

    [root@centos7-31 ~]#   cd /root/rpmbuild/RPMS/x86_64/

[root@centos7-31 ~]#    rpm -Uvh openssh-*.rpm

或是使用以下命令删除旧软件包,再安装。

    [root@centos7-31 ~]#     rpm -e $(rpm -qa |grep openssh) --nodeps

    [root@centos7-31 ~]#   rpm -ivh openssh-*.rpm

    

   8,检查配置文件内容是否有误,启用sshd服务

    [root@centos7-31 ~]#    sshd -t

    [root@centos7-31 ~]#     systemctl disable sshd

    [root@centos7-31 ~]#     systemctl enable sshd

    [root@centos7-31 ~]#    systemctl restart sshd


   以下是openssh9.7p1的rpm包下载地址


openssh9.7p1.zip


]]>
Fri, 14 Jun 2024 18:50:08 +0800 /blog.php?id=2755
MySQL8的binlog文件保存时间 admin /blog.php?id=2754 MySQL8的binlog文件保存时间


MySQL expire_logs_days 参数用于控制Binlog文件的保存时间,当Binlog文件存在的时间超过该参数设置的阈值时,

Binlog文件就会被自动清除,该参数的时间单位是天,设置为0,表示Binlog文件永不过期,即不自动清除Binlog文件。



在MySQL 8.0 版本,expire_logs_days参数被废弃,使用新的参数binlog_expire_logs_seconds代替,新参数的时间粒度是秒,能够更加灵活的控制Binlog文件过期时间。


expire_logs_days:
默认0代表99天,也是最大值

动态修改:Yes
作用范围:Global
取值范围:0~99

默认值:0


binlog_expire_logs_seconds:


动态修改:Yes
作用范围:Global
取值范围:0~4294967295
默认值:2592000(30天)

 

mysql>  show variables like 'log_%';
+----------------------------------------+----------------------------------------+
| Variable_name                          | Value                                  |
+----------------------------------------+----------------------------------------+
| log_bin                                | ON                                     |
| log_bin_basename                       | /var/lib/mysql/mysql-bin               |
| log_bin_index                          | /var/lib/mysql/mysql-bin.index         |
| log_bin_trust_function_creators        | OFF                                    |
| log_bin_use_v1_row_events              | OFF                                    |
| log_error                              | stderr                                 |
| log_error_services                     | log_filter_internal; log_sink_internal |
| log_error_suppression_list             |                                        |
| log_error_verbosity                    | 2                                      |
| log_output                             | FILE                                   |
| log_queries_not_using_indexes          | OFF                                    |
| log_raw                                | OFF                                    |
| log_replica_updates                    | ON                                     |
| log_slave_updates                      | ON                                     |
| log_slow_admin_statements              | OFF                                    |
| log_slow_extra                         | OFF                                    |
| log_slow_replica_statements            | OFF                                    |
| log_slow_slave_statements              | OFF                                    |
| log_statements_unsafe_for_binlog       | ON                                     |
| log_throttle_queries_not_using_indexes | 0                                      |
| log_timestamps                         | UTC                                    |
+----------------------------------------+----------------------------------------+
21 rows in set (0.04 sec)


mysql> 
mysql> 
mysql> 
mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_auto_purge  | ON      |
| binlog_expire_logs_seconds     | 2592000 |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
4 rows in set (0.03 sec)

使用set命令配置过期日期

mysql> set global  binlog_expire_logs_seconds=60*60*24;
Query OK, 0 rows affected (0.00 sec)




MySQL 8.0关闭binlog默认开启binlog,即使在my.ini或my.cnf的[mysqld]部分没有。

MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉一部分没用的日志。

windows


1.登录mysql数据库,mysql -uroot –p
2.查看binlog是否开启,log_bin的状态未ON,表明binlog日志开启

mysql> show variables like 'log_%';
+----------------------------------------+---------------------------------------------------------------+
| Variable_name                          | Value                                                         |
+----------------------------------------+---------------------------------------------------------------+
| log_bin                                | ON                                                            |
| log_bin_basename                       | C:\Program Files\mysql-8.0.15-winx64\data\binlog              |
| log_bin_index                          | C:\Program Files\mysql-8.0.15-winx64\data\binlog.index        |
| log_bin_trust_function_creators        | OFF                                                           |
| log_bin_use_v1_row_events              | OFF                                                           |
| log_error                              | C:\Program Files\mysql-8.0.15-winx64\data\DESKTOP-SK4KOON.err |
| log_error_services                     | log_filter_internal; log_sink_internal                        |
| log_error_suppression_list             |                                                               |
| log_error_verbosity                    | 2                                                             |
| log_output                             | FILE                                                          |
| log_queries_not_using_indexes          | OFF                                                           |
| log_slave_updates                      | ON                                                            |
| log_slow_admin_statements              | OFF                                                           |
| log_slow_extra                         | OFF                                                           |
| log_slow_slave_statements              | OFF                                                           |
| log_statements_unsafe_for_binlog       | ON                                                            |
| log_throttle_queries_not_using_indexes | 0                                                             |
| log_timestamps                         | UTC                                                           |
+----------------------------------------+---------------------------------------------------------------+
18 rows in set, 1 warning (0.00 sec)

3.查看binary log(我这个之前已经清理过了)

mysql> show binary logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000007 |       199 | No        |
| binlog.000008 |       155 | No        |
+---------------+-----------+-----------+
2 rows in set (0.00 sec)

4.删除binlog日志文件,切勿删除正在使用的binlog!!(所以删除老年的即可,不要全删)

不要轻易手动去删除binlog,会导致binlog.index和真实存在的binlog不匹配,使用PURGE,根据自己需求改写下面命令

mysql> PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY);//删除1天前的binlog日志文件
或者
mysql>purge binary logs before '2019-11-25 13:09:51';  //将指定时间之前的binlog清掉:
或者
mysql>purge binary logs to 'bin.000055';  //将bin.000055之前的binlog清掉:

5.设置binlog的过期时间,binlog失效日期参数为 binlog_expire_logs_seconds,默认2592000(30天)过期,可以设置 604800(7天)

mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_seconds     | 2592000 |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
3 rows in set (0.00 sec)


mysql> set global  binlog_expire_logs_seconds=60*60*24;
Query OK, 0 rows affected (0.00 sec)


mysql> show variables like '%expire%';
+--------------------------------+---------+
| Variable_name                  | Value   |
+--------------------------------+---------+
| binlog_expire_logs_seconds     | 604800  |
| disconnect_on_expired_password | ON      |
| expire_logs_days               | 0       |
+--------------------------------+---------+
3 rows in set (0.00 sec)


mysql> flush logs;
Query OK, 0 rows affected, 64 warnings (0.16 sec)

binlog_expire_logs_seconds设置之后不会立即清除过期的,触发条件是:

  • binlog大小超过max_binlog_size
  • 手动执行flush logs
  • 重新启动时(MySQL将会new一个新文件用于记录binlog)

如果binlog非常多,不要轻易设置改参数,有可能导致io争用,所以我先使用purge命令清除老年的binlog。
过期时间设置的要适当,对于主从复制,要看从库的延迟决定过期时间,避免主库binlog还未传到从库便因过期而删除,导致主从不一致!!!

5.5设置过期时间也可以直接修改my.ini配置文件,关闭修改再重启

expire_logs_days = 7 #自动删除15天前的日志。默认值为0,表示从不删除。

6.如果你希望关闭binlog
8.0版本情况下,关闭mysql服务,找到my.ini, 在[mysqld] 下添加 skip-log-bin,然后重启MySQL,不可以不关闭的情况下,修改重启。
在关闭后,可以下使用reset master把现有的binlog都删除掉,因为binlog关闭了,不会有正在使用的binlog,所以没问题。

 [mysqld] 
...
...
skip-log-bin

也有说想要关闭binlog,只将这两条注释(添加#),不知道哪个对,可能都对,或者是版本原因,我没试

#log-bin=mysql-bin #注释掉之后,会关闭binlog日志
#binlog_format=mixed #注释掉之后,会关闭binlog日志

如果找不到my.ini,可以手动打开显示C盘的隐藏文件选项(不会百度),就会出现ProgramData文件夹,找到mysql文件夹,就可以找到my.ini文件




使用RESET MASTER可以删除任何二进制日志文件及其相关的二进制日志索引文件,从而使主数据库恢复到开始二进制日志记录之前的状态

mysql>RESET MASTER;

 

]]>
Thu, 25 Apr 2024 10:18:52 +0800 /blog.php?id=2754
openEuler部署Kubernetes 1.29.4版本集群 admin /blog.php?id=2753 openEuler部署Kubernetes 1.29.4版本集群

一、Kubernetes集群节点准备

1.1 主机操作系统说明

序号 操作系统及版本 备注
1 CentOS7u9或 OpenEuler2203

1.2 主机硬件配置说明

需求 CPU 内存 硬盘 角色 主机名
值 8C 8G 1024GB master k8s-master01
值 8C 16G 1024GB worker(node) k8s-worker01
值 8C 16G 1024GB worker(node) k8s-worker02

1.3 主机配置

1.3.1 主机名配置

由于本次使用3台主机完成kubernetes集群部署,其中1台为master节点,名称为k8s-master01;其中2台为worker节点,名称分别为:k8s-worker01及k8s-worker02

# master节点

hostnamectl set-hostname k8s-master01

#worker01节点
hostnamectl set-hostname k8s-worker01
 
#worker02节点
hostnamectl set-hostname k8s-worker02

1.3.2 IP地址,名称解析与互信

#IP配置这里不再讲解

#下面是名称解析配置
[root@k8s-master01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.11 k8s-master01
192.168.0.12 k8s-worker01
192.168.0.13 k8s-worker02

#主机互信配置  
[root@k8s-master01 ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Rr6W4rdnY350fzMeszeWFR/jUJt0VOZ3yZECp5VJJQA root@k8s-master01
The key's randomart image is:
+---[RSA 3072]----+
|         E.o+=++*|
|            ++o*+|
|        .  .  +oB|
|       o     . *o|
|        S     o =|
|       . o  . ..o|
|      . +  . . +o|
|     . o. = .  *B|
|      ...*.o  oo*|
+----[SHA256]-----+
[root@k8s-master01 ~]# for i in {11..13};do ssh-copy-id 192.168.0.${i};done

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.11 (192.168.0.11)' can't be established.
ED25519 key fingerprint is SHA256:s2R582xDIla4wyNozHa/HEmRR7LOU4WAciEcAw57U/Q.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Authorized users only. All activities may be monitored and reported.
root@192.168.0.11's password: 

Number of key(s) added: 1

1.3.4 防火墙配置

所有主机均需要操作。

关闭现有防火墙firewalld

# systemctl disable firewalld

# systemctl stop firewalld

systemctl disable --now firewalld

查看firewalld状态

# firewall-cmd --state

not running

参考运行命令:

[root@k8s-master01 ~]# for i in {11..13};do ssh  192.168.0.${i} 'systemctl disable --now firewalld' ;done

Authorized users only. All activities may be monitored and reported.

Authorized users only. All activities may be monitored and reported.

Authorized users only. All activities may be monitored and reported.
[root@k8s-master01 ~]# for i in {11..13};do ssh  192.168.0.${i} 'firewall-cmd --state' ;done

Authorized users only. All activities may be monitored and reported.
not running

Authorized users only. All activities may be monitored and reported.
not running

Authorized users only. All activities may be monitored and reported.
not running
 

1.3.5 SELINUX配置

所有主机均需要操作。修改SELinux配置需要重启操作系统。

# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# sestatus

参考运行命令:

[root@k8s-master01 ~]# for i in {11..13};do ssh  192.168.0.${i} 'sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config' ;done

Authorized users only. All activities may be monitored and reported.

Authorized users only. All activities may be monitored and reported.

Authorized users only. All activities may be monitored and reported.
 
[root@k8s-master01 ~]# for i in {11..13};do ssh  192.168.0.${i} 'sestatus' ;done

Authorized users only. All activities may be monitored and reported.
SELinux status:                 disabled

Authorized users only. All activities may be monitored and reported.
SELinux status:                 disabled

Authorized users only. All activities may be monitored and reported.
SELinux status:                 disabled
 

1.3.6 时间同步配置

所有主机均需要操作。最小化安装系统需要安装ntpdate软件。

# crontab -l

0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
for i in {11..13};do ssh  192.168.0.${i} ' echo '0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com' >> /etc/crontab' ;done
#设置上海时区,东八区

timedatectl set-timezone Asia/Shanghai

for i in {11..13};do ssh  192.168.0.${i} ' timedatectl set-timezone Asia/Shanghai' ;done
 

1.3.7 升级操作系统内核

centos系统需要升级内容,具体百度,OpenEuler2203不需要

1.3.8 配置内核路由转发及网桥过滤

所有主机均需要操作。

添加网桥过滤及内核转发配置文件

sed -i 's/net.ipv4.ip_forward=0/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
# 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
vm.swappiness = 0
EOF
# 配置加载br_netfilter模块

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

#加载br_netfilter overlay模块
modprobe br_netfilter
modprobe overlay
#查看是否加载

# lsmod | grep br_netfilter

br_netfilter           22256  0
bridge                151336  1 br_netfilter

# 使其生效

 sysctl --system

# 使用默认配置文件生效
sysctl -p 

# 使用新添加配置文件生效
sysctl -p /etc/sysctl.d/k8s.conf  

1.3.9 安装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.module &&  /etc/sysconfig/modules/ipvs.module

查看对应的模块是否加载成功
# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
k8s集群默认采用iptables 方式,如果集群在部署后已经是iptables 可以修改为ipvs模式

1.在master节点执行
# kubectl edit cm kube-proxy -n kube-system
...
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"   # 此处修改为ipvs,默认为空
    nodePortAddresses: null
 
...

1.在master节点执行
# kubectl edit cm kube-proxy -n kube-system
...
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"   # 此处修改为ipvs,默认为空
    nodePortAddresses: null
 
...
 
2.查看当前的kube-proxy
# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-84c476996d-8kz5d   1/1     Running   0             62m
calico-node-8tb29                          1/1     Running   0             62m
calico-node-9dkpd                          1/1     Running   0             62m
calico-node-wnlgv                          1/1     Running   0             62m
coredns-74586cf9b6-jgtlq                   1/1     Running   0             84m
coredns-74586cf9b6-nvkz4                   1/1     Running   0             84m
etcd-k8s-master01                          1/1     Running   2             84m
kube-apiserver-k8s-master01                1/1     Running   0             84m
kube-controller-manager-k8s-master01       1/1     Running   1 (69m ago)   84m
kube-proxy-l2vfq                           1/1     Running   0             45m
kube-proxy-v4drh                           1/1     Running   0             45m
kube-proxy-xvtnh                           1/1     Running   0             45m
kube-scheduler-k8s-master01                1/1     Running   1 (69m ago)   84m
 
3.删除当前的kube-proxy
# kubectl delete pod kube-proxy-f7rcx kube-proxy-ggchx kube-proxy-hbt94 -n kube-system
pod "kube-proxy-f7rcx" deleted
pod "kube-proxy-ggchx" deleted
pod "kube-proxy-hbt94" deleted
 
4.查看新自动创建的kube-proxy
# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-74586cf9b6-5bfk7             1/1     Running   0          77m
coredns-74586cf9b6-d29mj             1/1     Running   0          77m
etcd-master-140                      1/1     Running   0          78m
kube-apiserver-master-140            1/1     Running   0          78m
kube-controller-manager-master-140   1/1     Running   0          78m
kube-proxy-7859q                     1/1     Running   0          44s
kube-proxy-l4gqx                     1/1     Running   0          43s
kube-proxy-nnjr2                     1/1     Running   0          43s
kube-scheduler-master-140            1/1     Running   0          78m
 

1.3.10 关闭SWAP分区

修改完成后需要重启操作系统,如不重启,可临时关闭,命令为swapoff -a

永远关闭swap分区,需要重启操作系统

# cat /etc/fstab

......

# /dev/mapper/centos-swap swap                    swap    defaults        0 0

在上一行中行首添加#

二、containerd容器环境安装

2.1 安装containerd环境包

所有主机均需要操作。

 # 打包的文件

for i in {11..13};do ssh  192.168.0.${i} ' wget https://blog-source-mkt.oss-cn-chengdu.aliyuncs.com/resources/k8s/kubeadm%20init/k8s1.29.tar.gz'; done

# 解压containerd并安装
for i in {11..13};do ssh  192.168.0.${i} ' tar -zxvf /root/k8s1.29.tar.gz'; done

for i in {11..13};do ssh  192.168.0.${i} ' tar -zxvf /root/workdir/containerd-1.7.11-linux-amd64.tar.gz && mv /root/bin/* /usr/local/bin/ && rm -rf /root/bin'; done
# 创建服务,所有主机都要操作
cat << EOF > /usr/lib/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF
# 启动容器服务
for i in {11..13};do ssh  192.168.0.${i} 'systemctl daemon-reload && systemctl enable --now containerd '; done

# 安装runc
for i in {11..13};do ssh  192.168.0.${i} 'install -m 755 /root/workdir/runc.amd64 /usr/local/sbin/runc '; done
# 安装cni插件
for i in {11..13};do ssh  192.168.0.${i} 'mkdir -p /opt/cni/bin && tar -xzvf  /root/workdir/cni-plugins-linux-amd64-v1.4.0.tgz -C /opt/cni/bin/ '; done
# 生成容器配置文件并修改
for i in {11..13};do ssh  192.168.0.${i} 'mkdir -p /etc/containerd && containerd config default | sudo tee /etc/containerd/config.toml '; done 
 
# 修改沙箱镜像,所有主机都要操作

sed -i 's#sandbox_image = "registry.k8s.io/pause:.*"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
#重启containerd
systemctl restart containerd

2.2 master主机安装k8s

# 配置k8s v2.19源,所有节点均要安装
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF
# 安装k8s工具,所有节点均要安装
yum clean all && yum makecache

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#  配置kubelet为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。所有节点均要安装

# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

或是下面命令
echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' > /etc/sysconfig/kubelet
systemctl enable kubelet 

#注意,kubelet不要启动,kubeadm会自动启动,如果已启动,安装会报错。

# 安装k8s命令,主master节点执行,这里只有1.29.4版本镜像

kubeadm init --apiserver-advertise-address=192.168.0.11  --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.29.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.224.0.0/16
# 最后执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

export KUBECONFIG=/etc/kubernetes/admin.conf

2.3 安装calico网络插件

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 最后查看节点与pod支行情况

kubectl get nodes
 
kubectl get pods -A
]]>
Fri, 19 Apr 2024 16:58:49 +0800 /blog.php?id=2753
使用 kubeadm 构建 Kubernetes v1.29 集群 admin /blog.php?id=2752 使用 kubeadm 构建 Kubernetes v1.29 集群

 

如何使用 kubeadm 设置三节点 Kubernetes v1.29 集群

 

介绍

  • kubeadm 是用于创建 Kubernetes 集群的工具
  • 它通过引导控制平面、加入节点等来自动创建 Kubernetes 集群
  • 遵循 Kubernetes 发布周期
  • 由 Kubernetes 社区维护的开源工具

先决条件

  • 为控制平面 node-1 和 node-2 创建三个 Ubuntu 22.04 LTS 实例
  • 每个实例的最低规格为 2 个 CPU 和 2 GB RAM
  • 必须在实例之间启用联网
  • 实例之间必须允许使用所需的端口
  • 必须在实例上禁用交换

初始配置

在控制平面、节点 1 和节点 2 上设置唯一的主机名 设置主机名后,从当前会话注销并重新登录以反映更改

 

# control-plane

sudo hostnamectl set-hostname control-plane

 

# node-1

sudo hostnamectl set-hostname node-1

 

# node-2

sudo hostnamectl set-hostname node-2

更新控制平面、节点 1 和节点 2 上的主机文件,以启用通过主机名进行通信

 

# control-plane, node-1 and node-2

sudo vi /etc/hosts

172.31.81.34 control-plane
172.31.81.93 node-1
172.31.90.71 node-2

 

在控制平面、节点 1 和节点 2 上禁用交换,如果 fstab 文件中存在交换条目,则注释掉该行

从 v1.22 开始支持 swap,从 v1.28 开始,swap 仅对 cgroup v2 支持。kubelet 的 NodeSwap 功能门卡是 beta 版,但默认禁用。如果 kubelet 未正确配置为使用 swap,则必须禁用 swap。

 

# control-plane, node-1 and node-2

sudo swapoff -a

sudo vi /etc/fstab
  # comment out swap entry

要在控制平面 node-1 和 node-2 上将 containerd 设置为容器运行时,首先需要加载一些内核模块并修改系统设置

 

# control-plane, node-1 and node-2

cat << EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay

sudo modprobe br_netfilter

 

# control-plane, node-1 and node-2

cat << EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

安装

加载内核模块并修改系统设置后,现在我们可以在控制平面、节点 1 和节点 2 上安装 containerd 运行时

 

# control-plane, node-1 and node-2

sudo apt update

sudo apt install -y containerd

安装包后,在控制平面、node-1 和 node-2 上为 containerd 生成默认配置文件

 

# control-plane, node-1 and node-2

sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml

在 containerd 配置文件中将 SystemdCgroup 值更改为 true,然后重新启动服务

 

# control-plane, node-1 and node-2

sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

sudo systemctl restart containerd

我们需要在控制平面 node-1 和 node-2 上安装一些必备软件包,以配置 Kubernetes 软件包存储库

 

# control-plane, node-1 and node-2

sudo apt update

sudo apt install -y apt-transport-https ca-certificates curl gpg

在控制平面、node-1 和 node-2 上下载 Kubernetes 软件包存储库的公共签名密钥

 

# control-plane, node-1 and node-2

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

在控制平面 node-1 和 node-2 上添加相应的 Kubernetes apt 存储库

 

# control-plane, node-1 and node-2

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

安装 kubeadm、kubelet 和 kubectl 工具,并在控制平面、node-1 和 node-2 上保存它们的包版本

 

# control-plane, node-1 and node-2

sudo apt update

sudo apt install -y kubeadm=1.29.0-1.1 kubelet=1.29.0-1.1 kubectl=1.29.0-1.1

sudo apt-mark hold kubeadm kubelet kubectl

在控制平面上使用 kubeadm 初始化集群

 

# control-plane

sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version 1.29.0

安装完成后,在控制平面上设置对集群的访问权限

 

# control-plane

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

通过列出节点来验证我们的集群状态但是我们的节点处于 NotReady 状态,因为我们尚未设置网络

 

# control-plane

kubectl get nodes
NAME            STATUS     ROLES           AGE   VERSION
control-plane   NotReady   control-plane   45s   v1.29.0

kubectl get nodes -o wide
NAME            STATUS     ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
control-plane   NotReady   control-plane   52s   v1.29.0   172.31.81.34   <none>        Ubuntu 22.04.3 LTS   6.2.0-1012-aws   containerd://1.7.2

将 Calico 网络插件安装到集群并验证节点的状态

 

# control-plane

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml

 

# control-plane

kubectl -n kube-system get pods
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-7c968b5878-x5trl   1/1     Running   0          46s
calico-node-grrf4                          1/1     Running   0          46s
coredns-76f75df574-cdcj2                   1/1     Running   0          4m19s
coredns-76f75df574-z4gxg                   1/1     Running   0          4m19s
etcd-control-plane                         1/1     Running   0          4m32s
kube-apiserver-control-plane               1/1     Running   0          4m34s
kube-controller-manager-control-plane      1/1     Running   0          4m32s
kube-proxy-78gqq                           1/1     Running   0          4m19s
kube-scheduler-control-plane               1/1     Running   0          4m32s

kubectl get nodes
NAME            STATUS   ROLES           AGE     VERSION
control-plane   Ready    control-plane   4m53s   v1.29.0

启用网络后,将我们的工作负载节点加入集群 使用 kubeadm 从控制平面获取 join 命令

 

# control-plane

kubeadm token create --print-join-command

从控制平面检索到 join 命令后,在 node-1 和 node-2 中执行它

 

# node-1 and node-2

sudo kubeadm join 172.31.81.34:6443 --token kvzidi.g65h3s8psp2h3dc6 --discovery-token-ca-cert-hash sha256:56c208595372c1073b47fa47e8de65922812a6ec322d938bd5ac64d8966c1f27

验证我们的集群和所有节点是否都处于就绪状态

 

# control-plane

kubectl get nodes
NAME            STATUS   ROLES           AGE     VERSION
control-plane   Ready    control-plane   7m50s   v1.29.0
node-1          Ready    <none>          76s     v1.29.0
node-2          Ready    <none>          79s     v1.29.0

kubectl get nodes -o wide
NAME            STATUS   ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
control-plane   Ready    control-plane   8m12s   v1.29.0   172.31.81.34   <none>        Ubuntu 22.04.3 LTS   6.2.0-1012-aws   containerd://1.7.2
node-1          Ready    <none>          98s     v1.29.0   172.31.81.93   <none>        Ubuntu 22.04.3 LTS   6.2.0-1012-aws   containerd://1.7.2
node-2          Ready    <none>          101s    v1.29.0   172.31.90.71   <none>        Ubuntu 22.04.3 LTS   6.2.0-1012-aws   containerd://1.7.2

应用程序部署

部署一个 Nginx Pod,将其公开为 ClusterIP 并验证其状态

 

# control-plane

kubectl run nginx --image=nginx --port=80 --expose
service/nginx created
pod/nginx created

kubectl get pods nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          34s   192.168.247.1   node-2   <none>           <none>

kubectl get svc nginx
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.102.86.253   <none>        80/TCP    56s

使用控制平面中的端口转发访问 Nginx 默认页面

 

# control-plane

kubectl port-forward svc/nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

curl -i http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.25.3

这就是现在的全部内容

参考

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

]]>
Fri, 19 Apr 2024 09:17:19 +0800 /blog.php?id=2752
openeuler系统增加虚拟声卡-模拟声卡 admin /blog.php?id=2751  openeuler系统增加虚拟声卡-模拟声卡


在hyper-v虚拟机中安装openeuler系统,再安装ukui图形界面后,

发现没有声卡,检索信息发现hyper-v没法给虚拟机增加声卡。

这样就只能增加虚拟声卡了。


经过bing信息后,发现一个简单的方法,增加 snd-dummy驱动模块后,就可以打开声卡了。


modprobe snd-dummy pcm_devs=1

]]>
Thu, 18 Apr 2024 08:56:15 +0800 /blog.php?id=2751
OpenEuler安装ukui图形界面无法登陆root账号 admin /blog.php?id=2750 OpenEuler安装ukui图形界面无法登陆root账号


安装ukui后,切换图形登陆,只有普通账号,没有root账号的解决方法:


openEuler22.03及之后的版本在终端执行


/usr/share/lightdm/lightdm.conf.d/95-ukui-greeter.conf 或是 /etc/lightdm/lightdm.conf

添加以下两行:

greeter-show-manual-login=true

all-guest=false

开启登录选项:



注销或者重启lightdm服务(systemctl restart lightdm)]]>
Wed, 17 Apr 2024 11:40:05 +0800 /blog.php?id=2750
MySQL字段编码不一致导致的“Illegal mix of collations”错误 admin /blog.php?id=2749 MySQL字段编码不一致导致的“Illegal mix of collations”错误


在MySQL数据库中,当字段的字符集和排序规则不一致时,可能会出现“Illegal mix of collations”错误。

如报错: 

### Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
; uncategorized SQLException; SQL state [HY000]; error code [1267]; Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='; nested exception is java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='] with root cause


这个错误通常发生在执行涉及不同字符集和排序规则的数据比较操作时。以下是解决这个问题的步骤:
步骤一:检查数据库和表的字符集
首先,您需要确定数据库、表和字段的字符集设置。可以使用以下命令来查看:

  1. SHOW CREATE DATABASE your_database_name;
  2. SHOW CREATE TABLE your_table_name;

这将显示数据库和表的创建语句,从中可以查看字符集设置。


步骤二:统一字符集和排序规则


如果发现数据库、表或字段的字符集不一致,您需要将它们统一到一个字符集和排序规则下。

可以使用以下命令来修改数据库、表或字段的字符集和排序规则:

  1. ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  3. ALTER TABLE your_table_name CHANGE column_name column_name column_type CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

在上述命令中,将your_database_name替换为实际的数据库名称,your_table_name替换为实际的表名称,column_name替换为实际的列名称,column_type替换为列的数据类型。

select

table_schema,

table_name,

column_name,

character_set_name,

collation_name

from

information_schema.columns

where

TABLE_SCHEMA ='db2'

order by

table_schema,

table_name,

ordinal_position;

通过以上命令查看哪些表或字段名规则不一致,可以根据情况修改


步骤三:检查数据的一致性


在进行字符集和排序规则的修改后,您需要检查数据的一致性,确保没有数据丢失或损坏。可以使用以下命令来检查数据的一致性:

  1. CHECK TABLE your_table_name;

这将检查表中的数据是否符合当前的字符集和排序规则要求。如果出现错误,请根据错误信息进行相应的处理。
注意事项:在进行字符集和排序规则的修改之前,请务必备份数据库或表的数据,以防意外情况发生。

此外,修改字符集和排序规则可能会对已有的应用程序产生影响,请确保在修改之前进行充分的测试和验证。


总结:解决MySQL字段编码不一致导致的“Illegal mix of collations”错误需要统一数据库、表和字段的字符集和排序规则。通过检查数据库、表和字段的字符集设置,并进行相应的修改,可以避免出现这个错误。在进行修改之前,请务必备份数据并测试应用程序的兼容性。


]]>
Mon, 08 Apr 2024 14:45:36 +0800 /blog.php?id=2749
AI生成用来清理iptables规则的脚本 admin /blog.php?id=2748 AI生成用来清理iptables规划的脚本


1,有多台主机使用iptables写入的相同的规则,给input链一个关于auth的规则,

具体规划如下:


2,现需要删除,

使用ai生成了一个shell脚本,经过修改后内容如下


# 检查iptables中是否有匹配"auth"的规则
if iptables -nL | grep -q "auth"; then
    # 获取匹配"auth"的规则所在行号
    i=$(iptables -nL | grep -n "auth" | awk -F: '{print $1}')
    # 如果行号为3,则删除该规则并从/etc/sysconfig/iptables中删除匹配的行
    if [ "$i" -eq 3 ]; then
        iptables -D INPUT 1
        sed -i '/auth/d' /etc/sysconfig/iptables
    fi
fi


]]>
Tue, 02 Apr 2024 11:55:35 +0800 /blog.php?id=2748
GPT3.5生成的PLSQL代码用来删除与迁移大量对象 admin /blog.php?id=2747 GPT3.5生成的PLSQL代码用来删除与迁移大量对象

1,批量删除plsql

oracle通过imp导入大量对象到sysl用户下,现在需要批量删除

-----使用gpt-3.5生成plsql

DECLARE
    v_object_type VARCHAR2(50);
    v_object_name VARCHAR2(100);
BEGIN
    FOR obj IN (SELECT object_type, object_name
                FROM all_objects
                WHERE owner = 'SYSL'
                AND created >= TO_DATE('2024-03-12', 'YYYY-MM-DD'))
    LOOP
        v_object_type := obj.object_type;
        v_object_name := obj.object_name;
        
        BEGIN
            IF v_object_type = 'TABLE' THEN
                EXECUTE IMMEDIATE 'DROP TABLE SYSL.' || v_object_name;
                DBMS_OUTPUT.PUT_LINE('Table ' || v_object_name || ' dropped successfully.');
            ELSIF v_object_type = 'VIEW' THEN
                EXECUTE IMMEDIATE 'DROP VIEW SYSL.' || v_object_name;
                DBMS_OUTPUT.PUT_LINE('View ' || v_object_name || ' dropped successfully.');
            ELSIF v_object_type = 'PROCEDURE' THEN
                EXECUTE IMMEDIATE 'DROP PROCEDURE SYSL.' || v_object_name;
                DBMS_OUTPUT.PUT_LINE('Procedure ' || v_object_name || ' dropped successfully.');
            ELSIF v_object_type = 'FUNCTION' THEN
                EXECUTE IMMEDIATE 'DROP FUNCTION SYSL.' || v_object_name;
                DBMS_OUTPUT.PUT_LINE('Function ' || v_object_name || ' dropped successfully.');
            ELSIF v_object_type = 'PACKAGE' THEN
                EXECUTE IMMEDIATE 'DROP PACKAGE SYSL.' || v_object_name;
                DBMS_OUTPUT.PUT_LINE('Package ' || v_object_name || ' dropped successfully.');
            END IF;
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('Error dropping ' || v_object_type || ' ' || v_object_name || ': ' || SQLERRM);
        END;
    END LOOP;
END;
/

2,批量迁移对象

此前导入对象没有进入sysl表空间,都是user表空间,现需要迁移到sysl表空间中
----使用gpt3.5生成的plsql代码

DECLARE
    CURSOR cur_move_objects IS
          SELECT OBJECT_NAME, OBJECT_TYPE
            FROM all_objects
           WHERE OWNER = 'SYSL'
             AND OBJECT_TYPE IN ('TABLE', 'INDEX', 'SEQUENCE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE')
        ORDER BY 2;

    c_m cur_move_objects%ROWTYPE;
BEGIN
    FOR c_m IN cur_move_objects LOOP
        BEGIN
            IF c_m.OBJECT_TYPE IN ('TABLE', 'INDEX', 'SEQUENCE', 'VIEW') THEN
                EXECUTE IMMEDIATE 'ALTER ' || c_m.OBJECT_TYPE || '  SYSL.' || c_m.OBJECT_NAME || ' MOVE TABLESPACE SYSL';
                DBMS_OUTPUT.PUT_LINE(c_m.OBJECT_NAME || ' 的类型是: ' || c_m.OBJECT_TYPE || ', 迁移成功');
            ELSIF c_m.OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE') THEN
                EXECUTE IMMEDIATE 'ALTER ' || c_m.OBJECT_TYPE || ' SYSL.' || c_m.OBJECT_NAME || ' COMPILE';
                DBMS_OUTPUT.PUT_LINE(c_m.OBJECT_NAME || ' 的类型是: ' || c_m.OBJECT_TYPE || ', 迁移成功');
            END IF;
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('Error moving ' || c_m.OBJECT_TYPE || ' ' || c_m.OBJECT_NAME || ': ' || SQLERRM);
        END;
    END LOOP;

    COMMIT;
END;
/
]]>
Tue, 12 Mar 2024 17:14:59 +0800 /blog.php?id=2747