helm:存放配单清单的 chart图表 chart仓库
chart,helm-->Tiller-->api server -->kube_cluster
chart--->release
helm:
核心术语
chart: 一个helm程序包,部署清单的定义,包含资源关系,镜像定义,并不包含镜像,
repository: chart仓库,存放chart的,就是一个https/http服务器
release:特定的chart部署于目标集群上的一个实例
chart -->configmap --> Relese
values.yaml
程序架构:
helm:客户端,管理本地chart仓库,管理chart,与Tiller服务器交互,用于发送chart,实例安装,查询,卸载等操作
Tiller:服务端 监听来自helm的请求,接收helm发来的chart与config,合并生成release;
部署helm
https://github.com/helm/helm/releases/tag/v2.9.1
mkdir helm && cd helm
tar xf helm-v2.9.1-linux-amd64.tar.gz && cd linux-amd64/
mv helm /usr/bin/
helm --help
部署Tiller
建议部署在k8s集群上
ls .kube/config 是kubectl的文件,能够被helm获取到
服务账号是tiller,需要很大权限,用clusterrolebing绑定在cluster-admin角色上
kubeadm安装方式强制启用了rbac
rbac文件:https://github.com/helm/helm/blob/master/docs/rbac.md
vim tiller-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
kubectl apply -f tiller-rbac.yaml
初始化helm
export NO_PROXY="172.20.0.0/16,127.0.0.0/8"
helm init --service-account tiller --upgrade --tiller-image=registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.11.0
kubectl get pods -n kube-system 看pods是否运行起来了
vim ~/.helm/repository/repositories.yaml
url: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 修改远程charts仓库
使用helm
source <(helm completion bash) helm命令自动补全
helm repo update 更新仓库
https://helm.sh 官方网站
https://hub.kubeapps.com 官方可用charts列表
helm repo list 查看可用仓库
helm search 列出可用charts
helm inspect stable/mysql 查看charts详细信息
charts名
安装运用
helm install --name mem1 stable/memcached
安装命名release 仓库名/安装的运用名
验证
kubectl get pods --namespace default -l "app=mem1-memcached" -o jsonpath="{.items[0].metadata.name}”
或 kubectl get pods
卸载运用
helm delete --help
helm delete mem1
查看release
helm list
helm list --all
滚动更新
helm upgrade
回滚
helm rollback
下载charts
helm fetch stable/mysql
release管理:install ,delete, upgrade/rollback ,list, histoty,status
charts管理: fetch,create,inspect,verify,package
每安装一个charts,都会下载 charts到 ~ .helm/cache/archive/这个目录
values.yaml 定义默认值 修改默认值并单独引用这个文件,则会生效
cp values.yaml ~
vim values.yaml
replicaCount: 2 修改部署节点数
helm install --name mem3 stable/memcached -f values.yaml
对于redis
persistence:
enabled: false 关闭持久存储
annotations:
prometheus.io/scrape: "true" 允许prometheus抓取数据
charts介绍
https://helm.sh/docs/developing_charts/#charts
helm dep up foochart 下载依赖关系的chart
templates and values
模板语法:https://golang.org/pkg/text/template/
模板实例
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}} .Value表示来自values.yaml这个文件 一级字段或二级字段
imagePullPolicy: {{.Values.pullPolicy}}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{default "minio" .Values.storage}} 如果在values.yaml没有设置storage这个key,就用这个默认值
对应的values.yaml
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"
内建变量
Predefined Values
可以使用自定义的文件
wordpress这个charts组成如下
wordpress:
Chart.yaml
requirements.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mysql/
Chart.yaml
# ...
charts/ 表示wordpress依赖这个chart目录下的chart
helm install --values=myvals.yaml wordpress
自定义模板参数或文件 安装wordpress这个chart
自定义chart
helm create myapp 自动生成myapp目录,即自动生成chart文件
myapp这个chart组成如下
myapp/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ └── service.yaml
└── values.yaml
vim Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes myapp chart
name: myapp
version: 0.0.1
maintainer:
- name: mageedu
email: mage@126.com
url: https://www.baidu.com
依赖其他charts的说明文件
vim requirements.yaml
cd templates/
NOTES.txt release信息
_helpers.tpl 模板文件语法帮助
vim values.yaml
replicaCount: 2 以下为改动的地方
image:
repository: ikubernetes/myapp:v1
tag: v1
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
模板值语法检查
helm lint ../myapp
打包成charts
helm package --help
helm package myapp/
对myapp目录打包 没写路径,默认放在当前目录myapp-0.0.1.tgz
在当前存放charts的目录开启helm仓库服务
helm serve
打开另一终端测试
helm search myapp
修改NOTE.txt以便能正确显示release安装后信息
测试helm安装
helm install --name myapp local/myapp
release名 仓库名/charts名
helm delete --purge myapp1
删除release安装的pod同时也把release名也删除 这样release名就可以重复使用了
添加仓库
https://hub.kubeapps.com/charts/incubator
helm repo add --help
helm repo add stable1 https://kubernetes-charts.storage.googleapis.com
helm repo add incubator https://storage.googleapis.com/kubernetes-charts-incubator
helm repo remove incubator 删除incubator仓库
EFK日志系统组件部署
部署elasticsearch
elasticsearch架构 data<-->master<--client
cd helm/
docker pull docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2 拖镜像
helm repo add incubator https://storage.googleapis.com/kubernetes-charts-incubator
helm fetch incubator/elasticsearch
tar xf elasticsearch-1.10.2.tgz
cd elasticsearch/
vim values.yaml
appVersion: "6.2.4"
image:
repository: "docker.elastic.co/elasticsearch/elasticsearch-oss"
tag: "6.3.1" 版本 与kibana版本一致
cluster:
name: "elasticsearch"
config:
MINIMUM_MASTER_NODES: "1" 最少节点数
client:
name: client
replicas: 1 启用1个副本
master:
name: master
exposeHttp: false
persistence:
enabled: false
replicas: 1
data:
name: data
exposeHttp: false
persistence:
enabled: false 关闭持久存储
replicas: 1 根据node资源调整pod数量
kubectl create namespace efk
helm install --name els6 --namespace=efk -f values.yaml incubator/elasticsearch
els1-elasticsearch-client.efk.svc.cluster.local 服务访问入口
测试
kubectl run cirror-$RANDOM --rm -it --image=cirros -- /bin/sh 开启一个pod和终端
curl els6-elasticsearch-client.efk.svc.cluster.local
curl els6-elasticsearch-client.efk.svc.cluster.local:9200/_cat/nodes 查看有多少个节点
curl els6-elasticsearch-client.efk.svc.cluster.local:9200/_cat/indices 查看生成多少索引
部署fluentd-elasticsearch 收集工具
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/fluentd-elasticsearch:v2.3.2 拖镜像
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/fluentd-elasticsearch:v2.3.2 gcr.io/google-containers/fluentd-elasticsearch:v2.3.2 改镜像名
helm fetch incubator/fluentd-elasticsearch
tar xf fluentd-elasticsearch-2.0.7.tgz && cd fluentd-elasticsearch/
elasticsearch:
host: 'els1-elasticsearch-client.efk.svc.cluster.local' 添加elasticsearch集群服务
podAnnotations: 添加被prometheus监控
prometheus.io/scrape: "true"
prometheus.io/port: "24231"
service: 添加监控的service
type: ClusterIP
ports:
- name: "monitor-agent"
port: 24231
tolerations: 添加master污点容忍
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
helm install --name flu1 --namespace=efk -f values.yaml incubator/fluentd-elasticsearch
部署kibana
helm fetch stable/kibana
tar xf kibana-0.2.2.tgz
cd kibana/
vim values.yaml
image:
repository: "docker.elastic.co/kibana/kibana-oss"
tag: "6.3.1" 版本 与elasticsearch版本一致
service:
type: NodePort
ELASTICSEARCH_URL: http://els6-elasticsearch-client.efk.svc.cluster.local:9200
helm install --name kib1 --namespace=efk -f values.yaml stable/kibana
release名 指定ns 指定自定义模板 仓库/charts名
测试
kubectl get svc -n efk
kib1-kibana NodePort 10.105.194.250 <none> 443:30240/TCP
匹配字段
logstash-*
@timestamp
最后点击 create index pattern