前言
一个帮助您管理 Kubernetes 应用程序——Helm Charts 帮助您定义、安装和升级最复杂的 Kubernetes 应用程序
Helm 可以使用 Charts 启动 Kubernetes 集群,提供可用的工作流:
一个 Redis 集群
一个ES集群,这篇文章要讲到的。
特性:
- 查找并使用流行的软件,将其打包为 Helm Charts,以便在 Kubernetes 中运行
- 以 Helm Charts 的形式共享您自己的应用程序
- 为您的 Kubernetes 应用程序创建可复制的构建
- 智能地管理您的 Kubernetes 清单文件
- 管理 Helm 包的发行版
Chart 是 Kubernetes 的单元,Helm 的架构参考 Homebrew。
安装:
- Homebrew 用户使用
brew install kubernetes-helm
. (Mac用户)- Chocolatey 用户使用
choco install kubernetes-helm
. (Windows用户)
1.我是mac用户,helm客户端程序安装都大同小异,大家可自行百度。
Mac用户使用终端安装kubectl helm客户端。
chengli.zou@clz-mbp ~ % brew install kubectl helm
复制k8s master节点上的.kube/config 文件。
chengli.zou@clz-mbp ~ % cd .kube
chengli.zou@clz-mbp .kube % pwd
/Users/chengli.zou/.kube
chengli.zou@clz-mbp .kube % scp -r root@master.k8s.xxx.com:~/.kube/config .
测试kubectl客户端能正常操作集群。
chengli.zou@clz-mbp .kube % kubectl get nodes
NAME STATUS ROLES AGE VERSION
master.k8s.xxx.com Ready master 66m v1.18.5
node00.k8s.xxx.com Ready <none> 65m v1.18.5
node01.k8s.xxx.com Ready <none> 65m v1.18.5
node02.k8s.xxx.com Ready <none> 65m v1.18.5
2.进入正题。使用helm安装es集群。我这里安装7.6.2版本。
添加helm仓库:
chengli.zou@clz-mbp .kube % helm repo add elastic https://helm.elastic.co
"elastic" has been added to your repositories
仓库添加好后,别急着安装,我们需要手动创建持久化卷,以及es要用到的持久化卷要求。
在即将要创建持久卷的节点创建好相关主机路径。也就是下面文件提到的hostPath对于的路径:/mnt/data
[root@master ~]# ssh node00 'mkdir /mnt/data && chmod -R 777 /mnt/data'
[root@master ~]# ssh node01 'mkdir /mnt/data && chmod -R 777 /mnt/data'
[root@master ~]# ssh node02 'mkdir /mnt/data && chmod -R 777 /mnt/data'
[root@master ~]# vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: node00-pv
labels:
type: local
spec:
storageClassName: node00-pv-class
capacity:
storage: 32Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: node01-pv
labels:
type: local
spec:
storageClassName: node01-pv-class
capacity:
storage: 32Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: node02-pv
labels:
type: local
spec:
storageClassName: node02-pv-class
capacity:
storage: 32Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: "/mnt/data"
[root@master ~]# kubectl create -f pv.yaml
[root@master ~]# vi es-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: elasticsearch-master-elasticsearch-master-0
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: node00-pv-class
resources:
requests:
storage: 30Gi
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: elasticsearch-master-elasticsearch-master-1
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: node01-pv-class
resources:
requests:
storage: 30Gi
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: elasticsearch-master-elasticsearch-master-2
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: node02-pv-class
resources:
requests:
storage: 30Gi
volumeMode: Filesystem
[root@master ~]# kubectl apply -f es-pvc.yaml
3.回到mac或者widnows客户端,就可以接着使用helm命令进行整体安装了。
chengli.zou@clz-mbp .kube % helm install es elastic/elasticsearch --set image=registry.cn-shanghai.aliyuncs.com/dockerio_containers/elasticsearch --version 7.6.2
NAME: es
LAST DEPLOYED: Mon Jul 13 18:11:01 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Watch all cluster members come up.
$ kubectl get pods --namespace=default -l app=elasticsearch-master -w
2. Test cluster health using Helm test.
$ helm test es --namespace=default
4.等待几分钟,每个节点需要拉镜像需要点时间。
chengli.zou@clz-mbp es % kubectl get pods
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 6m
elasticsearch-master-1 1/1 Running 0 6m
elasticsearch-master-2 1/1 Running 0 6m
5.es装成功了。那么如何访问9200默认开放端口呢?因为我们是k8s集群安装的,所以我们不像裸搭的那样直接,直接通过某个节点宿主机端口进行访问。k8s集群里访问某个服务标准化路线是 ingress --> service --> pod --> container。
查看相关service:
chengli.zou@clz-mbp es % kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch-master ClusterIP 10.1.161.25 <none> 9200/TCP,9300/TCP 26m
elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 26m
发现有两个相关服务,我们随便选择一个就好了。 我们就选择第一个吧。
根据上面的路线来看,我们service都有了,那么现在只缺一个ingress入口。我们来编辑一个es-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.allow-http: "true"
name: es-ingress
spec:
tls:
- hosts:
- es.k8s.xxx.com
secretName: admin-user-token-pjwck
rules:
- host: es.k8s.xxx.com
http:
paths:
- path: /
backend:
serviceName: elasticsearch-master-headless
servicePort: 9200
chengli.zou@clz-mbp es % kubectl apply -f ingress.yaml
去浏览器访问一波: