当前位置: 首页 > news >正文

使用 ChartMuseum 容器搭建私有 Helm Chart 仓库

前言

本文介绍如何在 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 容器

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

(2) 验证 ChartMuseum 是否正常运行

curl http://myhelmrepo.com:8080/index.yaml

如果返回类似以下内容,则说明服务已成功启动:

apiVersion: v1
entries: {}
generated: "2025-03-23T07:32:46Z"
serverInfo: {}

2. 上传 Helm Chart 到仓库

(1) 上传 Chart
假设你有一个名为 flask-app-chart-0.1.0.tgz 的 Helm Chart,可以通过以下命令将其上传到仓库:

curl --data-binary "@flask-app-chart-0.1.0.tgz" http://myhelmrepo.com:8080/api/charts

如果返回以下内容,则表示上传成功:

{"saved":true}

(2) 验证上传结果
再次检查 index.yaml 文件以确认 Chart 成功添加

curl http://myhelmrepo.com:8080/index.yaml
apiVersion: v1
entries:
  flask-app-chart:
  - apiVersion: v2
    appVersion: "1.0"
    created: "2025-03-23T07:38:06.252423409Z"
    description: A Helm chart for deploying a simple Flask app
    digest: c6ad11cf3c0b9c2068b5cb3502c8faabc700646b4a7fe9d1c3e779827658a474
    name: flask-app-chart
    type: application
    urls:
    - charts/flask-app-chart-0.1.0.tgz
    version: 0.1.0
generated: "2025-03-23T07:38:06Z"
serverInfo: {}

3. 添加私有 Helm 仓库

(1) 添加私有仓库

helm repo add my-private-repo http://myhelmrepo.com:8080

更新仓库缓存:

helm repo update

如果返回以下内容,则表示仓库添加成功:

Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "my-private-repo" chart repository
Update Complete. ⎈Happy Helming!⎈

(2) 查看仓库列表

helm repo list

NAME            URL
my-private-repo http://myhelmrepo.com:8080

(3) 查看仓库中的 Charts

helm search repo -l flask

NAME                            CHART VERSION   APP VERSION     DESCRIPTION
my-private-repo/flask-app-chart 0.1.0           1.0             A Helm chart for deploying a simple Flask app

4. 下载或安装 Chart

(1) 下载 Chart
下载刚才上传的 Chart:

helm pull my-private-repo/flask-app-chart

解压并查看内容:

tar -tvf flask-app-chart-0.1.0.tgz

(2) 安装 Chart
通过以下命令安装 Chart:

helm install flask-app my-private-repo/flask-app-chart --namespace flask-app

参数说明:

  • flask-app: 指定本次安装的 Release 名称。
  • my-private-repo/flask-app-chart: 指定 Chart 的完整路径。
  • –namespace flask-app: 指定安装的目标命名空间。

5. 启用 HTTPS 和 Basic 认证

为了提高安全性,在生产环境中需要启用 HTTPS 和 Basic 认证。

(1) 安装相关软件

yum install nginx httpd-tools -y

(2) 启用 Basic 认证
重新启动 ChartMuseum 容器并启用认证:

docker run -d \
  --name private-helm-repo \
  -p 127.0.0.1:8080:8080 \
  --restart=always \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  -v /charts:/charts \
  -e AUTH_ANONYMOUS_GET=false \
  -e BASIC_AUTH_USER=helmuser \
  -e BASIC_AUTH_PASS=123456 \
  --user root \
  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/helm/chartmuseum:v0.16.2

测试认证是否生效:

# 不带认证访问
curl localhost:8080
# 返回 {"error":"unauthorized"}

# 带认证访问
curl -u helmuser:123456 localhost:8080
# 返回 200 OK

(3) 启用 HTTPS
生成自签名证书, 创建目录并生成自签名 SANs 证书:

sudo mkdir -p /etc/nginx/ssl/myhelmrepo.com
cd /etc/nginx/ssl/myhelmrepo.com

创建 OpenSSL 配置文件(openssl.cnf):

[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt             = no

[ req_distinguished_name ]
C  = CN
ST = State
L  = City
O  = Organization
OU = Organizational Unit
CN = myhelmrepo.com

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = myhelmrepo.com
DNS.2 = localhost
IP.1 = 127.0.0.1

生成证书和密钥:

openssl req -x509 -config openssl.cnf -extensions 'req_ext' -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/myhelmrepo.com/myhelmrepo.com.key \
  -out /etc/nginx/ssl/myhelmrepo.com/myhelmrepo.com.crt

编辑 Nginx 主配置文件(/etc/nginx/nginx.conf):

server {
    listen 443 ssl;
    server_name myhelmrepo.com;

    ssl_certificate /etc/nginx/ssl/myhelmrepo.com/myhelmrepo.com.crt;
    ssl_certificate_key /etc/nginx/ssl/myhelmrepo.com/myhelmrepo.com.key;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

重启 Nginx:

systemctl restart nginx

测试 HTTPS

curl https://myhelmrepo.com/index.yaml -k
# 返回 401 Authorization Required

curl -u helmuser:123456 https://myhelmrepo.com/index.yaml -k
# 返回 200 OK

(4) 配置 Helm 使用 HTTPS
由于使用的是自签名证书,Helm默认无法信任。将证书复制到本地并配置 Helm

mkdir -p ~/.helm/certs
scp root@myhelmrepo.com:/etc/nginx/ssl/myhelmrepo.com/myhelmrepo.com.crt ~/.helm/certs/

重新添加仓库:

helm repo rm my-private-repo
helm repo add my-private-repo https://myhelmrepo.com \
  --ca-file ~/.helm/certs/myhelmrepo.com.crt \
  --username helmuser \
  --password 123456

更新仓库缓存并查看Chart

helm repo update
helm search repo -l flask
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
my-private-repo/flask-app-chart 0.1.0           1.0             A Helm chart for deploying a simple Flask app

安装Chart, 测试OK

helm install flask-app my-private-repo/flask-app-chart --namespace flask-app

参考

【1】https://chartmuseum.com/docs/

相关文章:

  • C++面试题总结
  • React+Ant Design的Layout布局实现暗黑模式切换
  • [极客大挑战 2019]Upload_3.19BUUCTF练习day3(2)
  • Ubuntu如何部署AI-Sphere-Butler(metahuman-stream)
  • 23种设计模式-创建型模式-抽象工厂
  • python中两个星号什么意思
  • C#入门学习记录(五)轻松掌握条件分支与循环语句
  • AI+金融 应用 使用DeepSeek、Qwen等大模型输入自然语言,得到通达信等行情软件公式代码,导入后使用
  • 日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(25):解释说明:という
  • draw.io费的思维导图软件、支持ProcessOn无水印导出。
  • M-LAG 技术全面解析
  • 基于springboot的墙绘产品展示交易平台(037)
  • 进程状态与PV操作
  • Android 13组合键截屏功能的彻底移除实战
  • 数据库MVCC详解
  • Netty——NIO 空轮询 bug
  • 直观理解ECC椭圆曲线加密算法
  • 特征工程自动化(FeatureTools实战)
  • Windows 上彻底卸载 Node.js
  • Linux信号处理:从内核机制到工程艺术
  • 马上评丨未成年人“擦边”短视频岂能成流量密码
  • 中国一直忽视欧盟经贸问题关切?外交部:事实证明中欧相互成就,共同发展
  • 尹锡悦涉嫌发动内乱案举行第三次庭审
  • 郑州通报“夜市摊贩收取香烟交给城管”:涉事人员停职调查
  • 郎朗也来了,在辰山植物园“轻松听古典”
  • 跨越时空的“精神返乡”,叶灵凤藏书票捐赠上海文学馆