
Kubeapps 是基于 Web 的 Helm 应用商店,用于在 Kubernetes 集群中部署和管理应用程序,从 Helm Chart 仓库中浏览并部署 Helm Chart 应用、管理集群中已有 Helm chart 应用的升级和卸载等。
安装 Kubeapps
Kubernetes 的版本需要 1.15+,helm 版本 3.10 +
# 添加 kubeapps 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 创建 kubeapps 的命名空间
kubectl create namespace kubeapps
# 安装
helm install kubeapps --namespace kubeapps bitnami/kubeapps
注:kubeapps 的数据默认没有持久化,可以通过下列参数开启
--set postgresql.persistence.enabled=true --set postgresql.persistence.storageClass={$storageClassName}
创建 serviceaccount 并进行角色绑定,Kubeapps 用于向 Kubernetes API 进行身份验证
kubectl create --namespace default serviceaccount kubeapps-operator
kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
安装时没有开启 ingress ,这里需要开放对外访问
# 使用 port-forward 的方式
kubectl port-forward -n kubeapps svc/kubeapps 8888:80
# 或编辑 kubeapps servicer 为 NodePort 类型
kubectl --namespace kubeapps edit kubeapps

获取 token
root@k8s-test-master01:~# kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{range .secrets[*]}{.name}{"\n"}{end}' | grep kubeapps-operator-token) -o jsonpath='{.data.token}' -o go-template='{{.data.token | base64decode}}' && echo
eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxdE1TdDZIU3VsSzlRSkRSNUhEeVVTTFBsOVdQdkVrc3lEQXNhTWFGR28ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yLXRva2VuLTVqN3g1Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjYzZDRmYzktMWQxZi00ODQwLWFiMWYtZmEyNTgxM2JkNDBlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6a3ViZWFwcHMtb3BlcmF0b3IifQ.TBeL7XxwOdCLbNsuV8f6F7_eM7abR_8EM7WKi8jP40_t5FNTdnyPo_PFnbasGN8ScqN6nft8iYP8vAZsKHbp8BKuIGcJVe6-Ic5kH3yeZTg1aIPI1xauzVAK85mTNoPsPZZoM3EBd2r97A05vawnlqDaK1byTI5I1Z1DnRnmPf09BakDQBb4-VKEnEJeGNw11pR98eOvo098ckFEDlhADVBq22FnCXT6LCXBsDjbNKQ8-IVX2G8mFCJpHu1b3T601fxRVmSrWCZpQIhTYwvVlthP1tZJTcAcgIZXqHZcgffSzxZKjPQlCzxkQujm2J6pmisXIL0XeHVt76eSzK_hdg
root@k8s-test-master01:~#

添加 helm 仓库
harbor 默认集成了 helm charts ,可以把它加入到 kubeapps 中

或者通过 yaml 文件添加
apiVersion: kubeapps.com/v1alpha1
kind: AppRepository
metadata:
name: my-repo
namespace: kubeapps
spec:
auth:
header:
secretKeyRef:
key: authorizationHeader
name: {secret}
spec:
containers:
- env:
- name: FOO
value: BAR
type: helm
url: https://my.charts.com/
kubeapps 默认 10 分钟同步仓库,可以在页面手动触发同步
root@k8s-test-master01:~# kubectl get po -n kubeapps | grep sync
apprepo-default-sync-liudengpeng-27013960-lpgg8 0/1 Completed 0 20m
apprepo-default-sync-liudengpeng-27013970-7hc9p 0/1 Completed 0 10m
apprepo-default-sync-liudengpeng-27013980-9wjlm 0/1 Completed 0 19s
apprepo-kubeapps-sync-bitnami-27013960-fgktz 0/1 Completed 1 20m
apprepo-kubeapps-sync-bitnami-27013970-6hjh6 0/1 Completed 0 10m
apprepo-kubeapps-sync-bitnami-27013980-swth8 0/1 Completed 0 19s
root@k8s-test-master01:~# kubectl get cj -n kubeapps
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
apprepo-default-sync-liudengpeng */10 * * * * False 0 33s 4d8h
apprepo-kubeapps-sync-bitnami */10 * * * * False 0 33s 4d8h
创建 chart
创建 charts 这里就不展开了,列举几个笔者认为有趣的写法
比如 MongoDB 的用户名环境变量可以通过模板来获取,在 _helpers.tpl 文件添加
{{- define "mongodb.database.username" -}}
{{- if eq .Values.global.database.username "nil" -}}
{{- printf "%s" "admin" -}}
{{- else -}}
{{- .Values.global.database.username -}}
{{- end -}}
{{- end -}}
如果没有传入 global.database.username 参数,那默认的用户名为 admin
在 MongoDB 的 statefulsets.yaml 文件引入模板即可
- name: MONGO_INITDB_ROOT_USERNAME
value: "{{ template "mongodb.database.username" . }}"
通过 contains 判断 service 的类型
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
{{- if contains "NodePort" .Values.service.type }}
nodePort: {{ .Values.service.nodeport }}
{{- end }}
name: http
如 service.type 为 NodePort 时,可以用 service.nodeport 定义 nodeport 端口
上传 chart 到 Harbor 仓库
需要在 harbor 仓库创建项目

安装 helm push
插件
# 当前系统需要安装 git
helm plugin install https://github.com/chartmuseum/helm-push
添加仓库
# helm repo add liudengpeng https://xxx.xxx.com/chartrepo/liudengpeng
# helm repo list
NAME URL
kubefed-charts https://raw.githubusercontent.com/kubernetes-sigs/kubefed/master/charts
liudengpeng https://xxx.xxx.com/chartrepo/liudengpeng
上传
helm push --username {$uname} --password {$password} ./ {$repo name} --version 1.0.0-alpha.8

到 kubeapps 应用中心查看

安装应用
到 kubeapps 应用中心,点击需要安装的应用

在 kubeapps 中,value.yaml 文件是可编辑的,编写 chart 时使用 {{- toYaml . }}
写法会很方便
在 kubeapps 中可以查看应用安装的信息

root@k8s-test-master01:~# kubectl get po,svc -l app.kubernetes.io/instance=dev
NAME READY STATUS RESTARTS AGE
pod/dev-mongodb-0 1/1 Running 0 10m
pod/dev-virtualcopter-front-6f949b584d-k28t8 1/1 Running 0 10m
pod/dev-virtualcopter-server-56b47d97fd-79h7h 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dev-mongodb-server ClusterIP 10.254.76.138 <none> 27017/TCP 10m
service/dev-virtualcopter-server ClusterIP 10.254.176.186 <none> 80/TCP 10m
service/virtualcopter-front ClusterIP 10.254.180.252 <none> 80/TCP 10m
参考文档:
https://kubeapps.com/docs/




