0%

CoreDNS是什么

CoreDNS是一个灵活可扩展的DNS服务器,使用Go语言编写,旨在提供快速、灵活的DNS服务

为什么需要CoreDNS

CoreDNS为Kubernetes集群内部的DNS解析提供服务,使得服务之间能够通过域名互相通信
Kubernetes集群中, CoreDNS是运行在kube-system这个namespace下的Pod

1
2
3
kubectl -n kube-system get pod coredns-66f779496c-b7mmz
NAME READY STATUS RESTARTS AGE
coredns-66f779496c-b7mmz 1/1 Running 4 (28m ago) 4d23h

k8s集群中的域名是如何解析的

比如服务a访问服务b:

  • 如果a和b在同一个namespace下, 可以直接在pod a中, 通过curl b来访问b
  • 如果a和b不在同一个namespace下, 在pod a中需要通过curl b.namespaceb来访问b

以下动手测试

阅读全文 »

前言

本文介绍如何在 Rocky Linux 9.5 上使用 ChartMuseum 搭建一个私有的 Helm Chart 仓库,并启用 HTTPS 和 Basic 认证以提高安全性

环境准备

  • 一台Rocky Linux 9.5 x86_64, 作为Helm Repo, 安装Docker, 域名: myhelmrepo.com
  • Kubernetes 集群 v1.28.x, Helm v3.16.0

1. 安装并启动 ChartMuseum

(1) 启动 ChartMuseum 容器

1
2
3
4
5
6
7
8
9
docker run -d \
--name private-helm-repo \
-p 8080:8080 \
--restart=always \
-e STORAGE=local \
-e STORAGE_LOCAL_ROOTDIR=/charts \
-v /charts:/charts \
--user root \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/helm/chartmuseum:v0.16.2
阅读全文 »

什么是Helm? Helm解决了哪些问题?

Helm是Kubernetes的包管理工具,类似于Linux中的apt或yum. Helm通过模板化和版本控制等机制, 帮助用户快速发现、共享和使用Kubernetes应用

在Helm出现之前,部署Kubernetes应用存在以下问题:
1. YAML配置复杂,部署和管理Kubernetes应用不方便

  • 问题:需要编写大量YAML文件定义Kubernetes资源。 随着项目规模增长, 维护这些配置文件变得困难, 尤其是在多环境部署时
  • Helm解决方案: 通过Helm模板功能,开发者可以创建一个Chart, 包含所有必要的Kubernetes资源定义, 并使用变量代替硬编码值

2. 更新或回滚到特定版本较为困难

  • 问题:缺乏版本控制功能,难以更新或回滚到指定版本。如果直接修改线上 YAML 文件,可能导致问题且难以恢复到稳定状态
  • Helm解决方案: Helm 通过Release概念支持版本控制,每次部署或更新应用时都会创建一个新的Release. 如果新版本出现问题, 可以通过helm rollback快速回滚到之前的稳定版本

3. 难以共享或复用k8s配置, 不利于多团队协作

  • 问题:在一个团队内部,不同项目可能有相似需求(如都需要部署同一套系统)。然而,由于缺少有效的共享机制,每个项目需要从头开始配置,浪费了大量时间精力
  • Helm解决方案: Helm Charts 可以通过仓库共享,每个人可以从仓库中下载官方或其他团队成员发布的Charts,也可以上传自己的Charts,实现了Kubernetes配置的共享和复用

快速上手Helm

Helm的三个基本概念

  • Chart, 一个Helm安装包,包含了运行一个应用所需要的镜像、依赖和资源定义等
  • Release, 在Kubernetes集群上运行的一个Chart实例
  • Repository, 发布和存储Chart的仓库
阅读全文 »

前言

在Linux双系统升级过程中, 需要先备份新系统的所有文件得到升级包, 然后在需要升级的机器上解压升级包, 完成升级. tar是Linux系统最常用的备份工具之一。
然而, 在这种跨系统的备份和迁移中, 如果没有正确地处理文件所有者信息, 就会导致权限混乱, 升级后出现一些严重问题, 例如用户无法登录。

我在实际项目中遇到了这个问题。 以下说明为什么使用tar备份Linux系统时需要添加--numeric-owner参数

tar的--numeric-owner参数是什么

--numeric-owner是tar的一个选项, 用于在打包或解包时, 保留文件的UID和GID, 而不是直接映射当前系统的用户名称和组名称

为什么需要--numeric-owner参数

因为在跨系统迁移时,源系统和目标系统的用户配置可能是不一致的,例如:

  • 目标系统有一个用户alice(UID=1002), 源系统虽然也有用户alice, 但UID=1000
  • 这种情况很常见, 比如说目标系统和原系统的OS不一致, 或者在目标系统上新增了一些用户, 造成这种不一致
  • 如果备份时没有使用--numeric-owner, 源系统解压了tar包后得到的文件UID是1000; 升级到目标系统后, alice(UID=1002)并不是UID=1000的文件所有者, 就会出现权限错误的问题

演示案例

以下通过演示, 说明备份系统时忽略--numeric-owner时存在的问题

阅读全文 »

什么是消息队列

消息队列是在消息传输过程中保存消息的容器。 通常有生产者和消费者两个角色:

  • 生产者只负责发送数据到消息队列,谁消费他不管
  • 消费者只负责从消息队列中取数据处理,谁发送数据他不管

常见消息队列中间件

  • Kafka 高吞吐量, 实时日志采集
  • RabbitMQ Erlang语言, 灵活性和易用性,中小规模应用
  • RocketMQ 阿里出品, Java开发, 国内市场有很高知名度和应用案例

为什么使用消息队列

阅读全文 »

前言

Linux安装RabbitMQ
官方教程

1. Hello RabbitMQ

使用Python pika客户端, 写一个简单的生产者和消费者

1
Producer ------> Queue -----> Consumer

编写Producer(send.py)

先连接Broker, 建立connection和channel

1
2
3
4
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

接着声明一个队列; 在RabbitMQ中,消息不是直接发送到队列,而是先发送到交换机(exchange), 由交换机发送到队列。

1
channel.queue_declare(queue='hello')

使用basic_publish发送消息。 这里使用默认交换机(‘’), routing_key参数指定为队列名称

1
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
阅读全文 »

数组(vector)

初始化

1
2
3
vector<int> v(size);
vector<int> v(size, init_value);
v.emplace_back(a.begin(), a.begin() + 3); # 用另一个vector的某一区间初始化vector

遍历数组

1
2
3
for (int i = 0; i < vec.size(); ++i) {
vec[i] = i;
}

数组追加到另一个数组

1
vec1.insert(vec1.end(), vec2.begin(), vec2.end());

排序数组+去重

1
2
sort(nums.begin(), nums.end());
nums.erase(unique(nums.begin(), nums.end()), nums.end());

逆序排序

1
sort(nums.begin(), nums.end(), greater<int>());

二维vector初始化

1
vector<vector<bool>> visited(rows, vector<bool>(cols, false));
阅读全文 »

Docker Compose 是什么

Docker Compose 是一个用于运行多容器应用的工具, 通过一个docker-compose.yml文件, 配置应用的服务、网络和卷,然后使用简单的命令启动或停止所有服务

为什么需要 Docker Compose

当你有一个包含多个相互依赖的容器应用时,手动管理每个服务的启动、停止以及配置会比较复杂且容易出错
Docker Compose 提供了一种更简便的方法, 在单节点部署多个容器, 使得开发测试环境的一致性得到保证,同时简化了部署过程

示例: 使用Docker Compose 部署一个WordPress站点

下面演示如何使用 Docker Compose 在单个节点上部署一个包含 WordPress 和 MySQL 的简单网站。

1. 安装Docker Compose

官网上查找匹配版本安装, 我直接取最新版本安装

1
2
3
curl -L "https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
阅读全文 »