使用 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/

搭建私有 Helm 仓库通常是为了管理和分发组织内部自定义的应用依赖。HelmKubernetes 的包管理工具,用于安装、升级和卸载容器化的应用程序(Charts)。以下是创建私有 Helm 仓库的基本步骤: 1. **准备环境**: - 确保你有一个可用的 Kubernetes 集群和集群内的访问权限。 - 安装 Helm:`curl https://get.helm.sh/helm-v3.5.0-linux-amd64.tar.gz | tar xzv --strip-components=1 -C /usr/local/bin` 2. **创建证书**: - 为了保护通信安全,你需要生成一个 TLS 证书。可以使用 `openssl` 工具,比如: ``` openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365 -subj "/CN=my-helm-repo" ``` 3. **初始化仓库**: - 使用 `helm init --service-account` 创建一个新的 ServiceAccount,并授予足够的权限。 - 创建一个名为 `.helmrepo` 的目录作为仓库: ``` mkdir .helmrepo ``` 4. **配置仓库**: - 将证书文件添加到 `.helmrepo` 中: ``` cat cert.pem > .helmrepo/cert.pem cat key.pem > .helmrepo/key.pem ``` - 初始化仓库配置: ``` helm repo create --url https://my-private-repo.example.com --ca-cert .helmrepo/cert.pem --signer .helmrepo/key.pem . ``` 5. **上传图表**: - 将你的自定义 Charts 放入 `.helmrepo/charts` 目录下。 - 使用 `helm repo add` 添加本地仓库到 Helm 的索引: ``` helm repo index --url https://my-private-repo.example.com --merge .helmrepo/index.yaml ``` 6. **测试访问**: - 检查是否可以从新仓库成功拉取图表: ``` helm search repo my-custom-chart ``` 7. **维护**: - 定期更新仓库索引并重新发布。 - 如果需要删除图表,从 `.helmrepo/charts` 删除,然后重新构建索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pcj_888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值