# 構建私有Chart倉庫
使用Chart便于封裝和管理kubernetes中的應用,因此當企業內部的應用多了以后,互相依賴、部署環境復雜之后,原先的直接使用yaml文件的管理方式已經不再適應生產的需要,因此我們有必要構建自己的chart倉庫。本文中我們將使用 GitHub Pages 來構建我們自己的 chart 倉庫。
## 目的
我們需要構建一個GitHub pages存儲所有chart的壓縮文件,最好還要有一個前端來展示和搜索chart。
## 什么是Chart
Chart是helm管理的應用的打包格式。它包括如下特征:
- Chart中包括一系列的yaml格式的描述文件。
- 一個Chart只用來部署單個的應用的,不應該過于復雜,不應該包含多個依賴,相當于一個微服務。
Chart有特定的目錄結構,可以打包起來進行版本控制。
### Chart的組成結構
我們以nginx的chart為例,講解chart的組成結構。
```bash
nginx/
Chart.yaml # 必須:一個包含chart的名稱、版本和啟用條件信息等的YAML文件
LICENSE # 可選: chart的許可證
README.md # 可選: 使用說明
requirements.yaml # 可選: 該chart的依賴配置
values.yaml # 必須:該chart的默認配置值
charts/ # 可選: 包含該chart依賴的chart
templates/ # 可選:kubernetes manifest文件模板,用于生成kubernetes yaml文件
templates/NOTES.txt # 可選: 該chart的使用說明和提示信息文本文件,作為helm install后的提示信息
```
### Chart的安裝方式
安裝chart主要分為安裝本地定義的chart和遠程chart倉庫中的chart兩種方式。
**安裝本地chart**
- 指定本地chart目錄:helm install .
- 指定本地chart壓縮包:helm install nginx-1.2.3.tgz
**安裝chart倉庫中的chart**
- 使用默認的遠程倉庫:helm install stable/nginx
- 使用指定的倉庫:helm install localhost:8879/nginx-1.2.3.tgz
實際上可以將chart打包后作為靜態文件托管到web服務器上,例如GitHub pages作為chart倉庫也可以。
### 依賴管理
有兩種方式來管理chart的依賴。
- 直接在本的chart的`charts`目錄下定義
- 通過在`requirements.yaml`文件中定義依賴的chart
在每個chart的`charts`目錄下可以定義依賴的子chart。子chart有如下特點:
- 無法訪問父chart中的配置
- 父chart可以覆蓋子chart中的配置
## Chart倉庫
Chart 倉庫(repository)是一個用來托管`index.yaml`文件和打包好的chart文件的web服務器。當前chart倉庫本身沒有設置身份和權限驗證,查看[此鏈接](https://github.com/kubernetes/helm/issues/1038)獲取該問題的最新進展。
因為chart倉庫只是一個HTTP服務,通過HTTP GET獲取YAML文件和chart的壓縮包,所以可以將這些文件存儲在web服務器中,例如GCS、Amazon S3、GitHub Pages等。
關于chart倉庫的更多信息請參考[Helm chart文檔](https://github.com/kubernetes/helm/blob/master/docs/chart_repository.md)。
## 使用GitHub pages托管charts
我們在上文中說到,chart可以使用GitHub pages做存儲,接下來我們將會把之前夠夠構建的chart上傳到GitHub pages并在helm中新增一個repo。
## 構建Monocular UI
克隆項目到本地
```bash
git clone https://github.com/kubernetes-helm/monocular.git
```
### 依賴環境
- [Angular 2](https://angular.io/)
- [angular/cli](https://github.com/angular/angular-cli)
- Typescript
- Sass
- [Webpack](https://webpack.github.io/)
- Bootstrap
在`monoclar/scr/ui`目錄下執行以下命令安裝依賴:
```bash
yarn install
npm install -g @angular/cli
npm install -g typescript
npm install -g webpack
```
## 運行
### 使用docker-compose
最簡單的運行方式使用[docker-compose](https://docs.docker.com/compose/):
```bash
docker-comopse up
```
該命令需要用到如下鏡像:
- bitnami/mongodb:3
- bitnami/node:8
- quay.io/deis/go-dev:v1.5.0
會有一個很長的build過程,構建失敗。
### 使用helm
首先需要已在本地安裝了helm,并在kubernetes集群中安裝了tiller,見[使用helm管理kubernetes應用](helm.md)。
```bash
# 需要安裝nginx ingress
$ helm install stable/nginx-ingress
$ helm repo add monocular https://kubernetes-helm.github.io/monocular
$ helm install monocular/monocular
```

因為nginx ingress配置問題,官方的chart中api與ui使用的是同樣的domain name,我使用的是traefik ingress,`api`訪問不到,所以加載不了chart。
## 參考
- [Monocular UI](https://github.com/kubernetes-helm/monocular)
- [Helm Chart - GitHub](https://github.com/kubernetes/helm/blob/master/docs/charts.md)
- [簡化Kubernetes應用部署工具-Helm之應用部署](https://www.kubernetes.org.cn/2706.html)
- [Speed deployment on Kubernetes with Helm Chart – Quick YAML example from scratch](https://www.ibm.com/blogs/bluemix/2017/10/quick-example-helm-chart-for-kubernetes/)
- [Using a private github repo as helm chart repo (https access)](https://medium.com/@kavehmz/using-a-private-github-repo-as-helm-chart-repo-https-access-95629b2af27c)
- 序言
- 云原生
- 云原生(Cloud Native)的定義
- CNCF - 云原生計算基金會簡介
- CNCF章程
- 云原生的設計哲學
- Play with Kubernetes
- 快速部署一個云原生本地實驗環境
- Kubernetes與云原生應用概覽
- 云原生應用之路——從Kubernetes到Cloud Native
- 云原生編程語言
- 云原生編程語言Ballerina
- 云原生編程語言Pulumi
- 云原生的未來
- Kubernetes架構
- 設計理念
- Etcd解析
- 開放接口
- CRI - Container Runtime Interface(容器運行時接口)
- CNI - Container Network Interface(容器網絡接口)
- CSI - Container Storage Interface(容器存儲接口)
- Kubernetes中的網絡
- Kubernetes中的網絡解析——以flannel為例
- Kubernetes中的網絡解析——以calico為例
- 具備API感知的網絡和安全性管理開源軟件Cilium
- Cilium架構設計與概念解析
- 資源對象與基本概念解析
- Pod狀態與生命周期管理
- Pod概覽
- Pod解析
- Init容器
- Pause容器
- Pod安全策略
- Pod的生命周期
- Pod Hook
- Pod Preset
- Pod中斷與PDB(Pod中斷預算)
- 集群資源管理
- Node
- Namespace
- Label
- Annotation
- Taint和Toleration(污點和容忍)
- 垃圾收集
- 控制器
- Deployment
- StatefulSet
- DaemonSet
- ReplicationController和ReplicaSet
- Job
- CronJob
- Horizontal Pod Autoscaling
- 自定義指標HPA
- 準入控制器(Admission Controller)
- 服務發現
- Service
- Ingress
- Traefik Ingress Controller
- 身份與權限控制
- ServiceAccount
- RBAC——基于角色的訪問控制
- NetworkPolicy
- 存儲
- Secret
- ConfigMap
- ConfigMap的熱更新
- Volume
- Persistent Volume(持久化卷)
- Storage Class
- 本地持久化存儲
- 集群擴展
- 使用自定義資源擴展API
- 使用CRD擴展Kubernetes API
- Aggregated API Server
- APIService
- Service Catalog
- 資源調度
- QoS(服務質量等級)
- 用戶指南
- 資源對象配置
- 配置Pod的liveness和readiness探針
- 配置Pod的Service Account
- Secret配置
- 管理namespace中的資源配額
- 命令使用
- Docker用戶過度到kubectl命令行指南
- kubectl命令概覽
- kubectl命令技巧大全
- 使用etcdctl訪問kubernetes數據
- 集群安全性管理
- 管理集群中的TLS
- kubelet的認證授權
- TLS bootstrap
- 創建用戶認證授權的kubeconfig文件
- IP偽裝代理
- 使用kubeconfig或token進行用戶身份認證
- Kubernetes中的用戶與身份認證授權
- Kubernetes集群安全性配置最佳實踐
- 訪問Kubernetes集群
- 訪問集群
- 使用kubeconfig文件配置跨集群認證
- 通過端口轉發訪問集群中的應用程序
- 使用service訪問群集中的應用程序
- 從外部訪問Kubernetes中的Pod
- Cabin - Kubernetes手機客戶端
- Kubernetic - Kubernetes桌面客戶端
- Kubernator - 更底層的Kubernetes UI
- 在Kubernetes中開發部署應用
- 適用于kubernetes的應用開發部署流程
- 遷移傳統應用到Kubernetes中——以Hadoop YARN為例
- 最佳實踐概覽
- 在CentOS上部署Kubernetes集群
- 創建TLS證書和秘鑰
- 創建kubeconfig文件
- 創建高可用etcd集群
- 安裝kubectl命令行工具
- 部署master節點
- 安裝flannel網絡插件
- 部署node節點
- 安裝kubedns插件
- 安裝dashboard插件
- 安裝heapster插件
- 安裝EFK插件
- 生產級的Kubernetes簡化管理工具kubeadm
- 使用kubeadm在Ubuntu Server 16.04上快速構建測試集群
- 服務發現與負載均衡
- 安裝Traefik ingress
- 分布式負載測試
- 網絡和集群性能測試
- 邊緣節點配置
- 安裝Nginx ingress
- 安裝配置DNS
- 安裝配置Kube-dns
- 安裝配置CoreDNS
- 運維管理
- Master節點高可用
- 服務滾動升級
- 應用日志收集
- 配置最佳實踐
- 集群及應用監控
- 數據持久化問題
- 管理容器的計算資源
- 集群聯邦
- 存儲管理
- GlusterFS
- 使用GlusterFS做持久化存儲
- 使用Heketi作為Kubernetes的持久存儲GlusterFS的external provisioner
- 在OpenShift中使用GlusterFS做持久化存儲
- GlusterD-2.0
- Ceph
- 用Helm托管安裝Ceph集群并提供后端存儲
- 使用Ceph做持久化存儲
- 使用rbd-provisioner提供rbd持久化存儲
- OpenEBS
- 使用OpenEBS做持久化存儲
- Rook
- NFS
- 利用NFS動態提供Kubernetes后端存儲卷
- 集群與應用監控
- Heapster
- 使用Heapster獲取集群和對象的metric數據
- Prometheus
- 使用Prometheus監控kubernetes集群
- Prometheus查詢語言PromQL使用說明
- 使用Vistio監控Istio服務網格中的流量
- 分布式跟蹤
- OpenTracing
- 服務編排管理
- 使用Helm管理Kubernetes應用
- 構建私有Chart倉庫
- 持續集成與發布
- 使用Jenkins進行持續集成與發布
- 使用Drone進行持續集成與發布
- 更新與升級
- 手動升級Kubernetes集群
- 升級dashboard
- 領域應用概覽
- 微服務架構
- 微服務中的服務發現
- 使用Java構建微服務并發布到Kubernetes平臺
- Spring Boot快速開始指南
- Service Mesh 服務網格
- 企業級服務網格架構
- Service Mesh基礎
- Service Mesh技術對比
- 采納和演進
- 定制和集成
- 總結
- Istio
- 安裝并試用Istio service mesh
- 配置請求的路由規則
- 安裝和拓展Istio service mesh
- 集成虛擬機
- Istio中sidecar的注入規范及示例
- 如何參與Istio社區及注意事項
- Istio教程
- Istio免費學習資源匯總
- 深入理解Istio Service Mesh中的Envoy Sidecar注入與流量劫持
- 深入理解Istio Service Mesh中的Envoy Sidecar代理的路由轉發
- Linkerd
- Linkerd 使用指南
- Conduit
- Condiut概覽
- 安裝Conduit
- Envoy
- Envoy的架構與基本術語
- Envoy作為前端代理
- Envoy mesh教程
- SOFAMesh
- SOFAMesh中的Dubbo on x-protocol
- SOFAMosn
- 使用 SOFAMosn 構建 SOFAMesh
- 大數據
- Spark standalone on Kubernetes
- 運行支持Kubernetes原生調度的Spark程序
- Serverless架構
- 理解Serverless
- FaaS-函數即服務
- OpenFaaS快速入門指南
- 邊緣計算
- 人工智能