Helm
包管理工具
yum解决了rpm包依赖的问题
在k8s包,主要是解决了安装服务问题。
通过仓库下载想要的yaml文件,通过修改yaml文件属性就可以安装想要的。
一、Helm简介
在没使用helm之前,向kubernetes部署应用,我们要依次部署deployment、svc等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理
Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成,通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml),然后调用 Kubectl 自动执行 K8s 资源部署
Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成,通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml),然后调用 Kubectl 自动执行 K8s 资源部署
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和releasechart
- chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包
- release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release
Helm 包含两个组件:Helm 客户端和 Tiller 服务器
Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。
Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互
二、Helm部署
1.下载helm命令行工具
下载helm命令行工具到master节点node1的/usr/local/install-k8s下,这里下载的是2.13.1版本:
ntpdate np1.aliyun.com
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
chmod a+x /usr/local/bin/helm
2.安装服务端tiller
为了安装服务端tiller,还需要在这台机器上配置好kubecti工具和kubeconfig文件,确保 kubectl工具可以在这台机器上访问 apiserver 且正常使用。这里的node1节点以及配置好了kubectl
因为Kubernetes APIServer 开启了RBAC访问控制,所以需要创建 tiller 使用的 service account:tiller并分配合适的角色给它。详细内容可以查看helm文档中的[Role-based Access Control(https://docs.helm.sh/
using helm/#role-based-access-control)。这里简单起见直接分配cluster-admin 这个集群内置的CclusterRole给它。
创建rbac-config.yaml文件:
vim rbac-config.yaml
apiVersion: v1
kind: ServiceAccount # SA创建
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
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 create -f rbac-config.yaml
将yaml文件部署下去后,使用helm init --service-account tiller --skip-refresh命令初始化Heml
helm init --service-account tiller --skip-refresh
下载镜像失败 需要自己下载镜像导入到Docker中(三台节点)
[root@k8s-master01 helm]# kubectl describe pod tiller-deploy-58565b5464-brcbb -n kube-system
gcr.io/kubernetes-helm/tiller:v2.13.1下载不了,三个节点导入docker load -i
[root@k8s-master01 helm]# docker load -i helm-tiller.tar
[root@k8s-master01 helm]# kubectl get pod -n kube-system
[root@k8s-master01 helm]# helm init --service-account tiller --skip-refresh
[root@k8s-master01 helm]# helm version
访问helm仓库,有指导如何安装
hub.helm.sh/charts
3.Helm自定义模板
# 创建文件夹
[root@k8s-master01 helm]# pwd
/usr/local/install-k8s/helm
[root@k8s-master01 helm]# mkdir test
[root@k8s-master01 helm]# cd test
# 创建自描述文件 Chart.yaml,这个文件必须有name和version定义
[root@k8s-master01 test]# cat <<'EOF' > ./Chart.yaml
name: hello-world
version: 1.0.0
EOF
# 创建模板文件,用于生成 Kubernetes资源清单(mainfests)
[root@k8s-master01 test]# mkdir ./templates 必须是templates,固定,template目录下的yaml文件都会执行一遍
[root@k8s-master01 test]# cat <<'EOF' > ./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hub.atguigu.com/library/myapp:v1
ports:
- containerPort: 80
protocol: TCP
EOF
[root@k8s-master01 test]# cat <<'EOF' > ./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: hello-world
EOF
# 使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release
$ helm install .
# 列出已经部署的
helm ls
# 更新
[root@k8s-master01 test]# pwd
/usr/local/install-k8s/helm/test
[root@k8s-master01 test]# ls
Chart.yaml templates
[root@k8s-master01 test]# helm upgrade unrealized-rat .
[root@k8s-master01 test]# helm history unrealized-rat
# 查看状态
helm status unrealized-rat
访问:http://10.0.100.10:31091
在k8s的helm是把一个集群的部署方案写入到charts里,通过charts部署一个集群,生成对应replicas。
达到效果:更改values文件,即可更改pod镜像的目的
# 配置体现在配置文件 values.yaml
cat << 'EOF' > ./values.yaml
image:
repository: wangyanglinux/myapp
tag: 'v2'
EOF
# 这个文件中定义的值,在模板文件中可以通过 .values对象访问到
cat <<'EOF' > ./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: {
{
.Values.image.repository }}:{
{
.Values.image.tag }}
ports:
- containerPort: 80
protocol: TCP
EOF
# 升级版本
[root@k8s-master01 test]# cat values.yaml
image:
repository: wangyanglinux/myapp
tag: 'v2'
# 版本v2
helm upgrade -f values.yaml unrealized-rat .
#整个更新
#helm upgrade unrealized-rat .
kubectl get pod
浏览器访问,得出结果v2
# 在values.yaml 中的值可以被部署 release时用到的参数 --values YAML_FILE_PATH
# 或 --set key1=value1,key2=value2 覆盖掉
helm upgrade unrealized-rat --set image.tag='v3' .
4.命令补充
用上purge就是彻底删除
三、使用Helm部署Dashboard
在BS结构中管理集群的工具
kubernetes-dashboard.yaml:
image:
repository: k8s.gcr.io/kubernetes-dashboard-amd64
tag: v1.10.1
ingress:
enabled: true
hosts:
- k8s.frognew.com
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
tls:
- secretName: frognew-com-tls-secret
hosts:
- k8s.frognew.com
rbac:
clusterAdminRole: true
更新仓库
#建议将helm的源换成阿里的,避免更新失败
helm repo remove stable
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
helm fetch stable/kubernetes-dashboard-0.6.0 # 要具有科学上网条件
tar -zxvf kubernetes-dashboard-0.6.0.tgz
cd kubernetes-dashboard
helm install . -n kubernetes-dashboard \
-n kubernetes-dashboard \
--namespace kube-system \
-f kubernetes-dashboard.yaml
kubectl get pod -n kube-system -o wide
上传dashboard.tar,每个节点都要加载
docker load -i dashboard.tar
kubectl get pod -n kube-system -o wide
kubectl get svc -n kube-system
如果想让浏览器访问,改成NodePort类型
kubectl edit svc kubernetes-dashboard -n kube-system
kubectl get svc -n kube-system
访问https://10.0.100.10:30509
Google访问需要:/etc/kubernetes/pki/ca.crt
Firefox访问:同意
kubectl -n kube-system get secret | grep kubernetes-dashboard-token
kubectl describe secret kubernetes-dashboard-token-wszpz -n kube-system
复制token到网页,通过令牌方式登录
使用测试
四、Prometheus
1.组件说明
1.MetricServer:是kubernetes装群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl,hpa,scheduler等
2.PrometheusOpdrator:是一个系统检测和警捉工具箱,用来存储监控数据。
3.NodeExporter:用于node的关健度量指标状态数据。
4.KubeStateMetrics:收案ubernetes 集群内资源对象数据,制定告等规则5.Prometheus:采pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通i过http协议传貌。
6.Grafana:是可视化数据统计和监控平台。
2.创建
[root@k8s-master01 ~]# cd /usr/local/install-k8s/plugin/
[root@k8s-master01 plugin]# pwd
/usr/local/install-k8s/plugin
[root@k8s-master01 plugin]# mkdir prometheus
[root@k8s-master01 plugin]# cd prometheus/
[root@k8s-master01 prometheus]# ls
[root@k8s-master01 prometheus]# git clone https://github.com/coreos/kube-prometheus.git
3.修改
[root@k8s-master01 prometheus]# cd kube-prometheus/manifests
(1)修改grafana-service.yaml文件,使用nodepode方式访问grafana:
apiVersion: v1
kind: Service
metadata:
labels:
app: grafana
name: grafana
namespace: monitoring
spec:
type: NodePort #添加内容
ports:
- name: http
port: 3000
targetPort: http
nodePort: 30100 #添加内容
selector:
app: grafana
(2)修改prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
prometheus: k8s
name: prometheus-k8s
namespace: monitoring
spec:
type: NodePort #添加内容
ports:
- name: web
port: 9090
targetPort: web
nodePort: 30200 #添加内容
selector:
app: prometheus
prometheus: k8s
sessionAffinity: ClientIP
(3)修改alertmanager-service.yaml,改为nodepode
apiVersion: v1
kind: Service
metadata:
labels:
alertmanager: main
name: alertmanager-main
namespace: monitoring
spec:
type: NodePort
ports:
- name: web
port: 9093
targetPort: web
nodePort: 30300
selector:
alertmanager: main
app: alertmanager
sessionAffinity: ClientIP
4.导入镜像
将以下三个文件,导入到,/usr/local/install-k8s/plugin/prometheus/kube-prometheus
[root@k8s-master01 prometheus]# tar -zxvf prometheus.tar.gz
[root@k8s-master01 prometheus]# cat load-images.sh
[root@k8s-master01 prometheus]# mv prometheus load-images.sh /root/
[root@k8s-master01 prometheus]# cd
[root@k8s-master01 ~]# chmod a+x load-images.sh
[root@k8s-master01 ~]# ./load-images.sh
[root@k8s-master01 ~]# scp -r prometheus/ load-images.sh root@k8s-node01:/root/
[root@k8s-master01 ~]# scp -r prometheus/ load-images.sh root@k8s-node01:/root/
[root@k8s-master01 ~]# scp -r prometheus/ load-images.sh root@k8s-node02:/root/
[root@k8s-node01 ~]# ./load-images.sh
[root@k8s-node02 ~]# ./load-images.sh
[root@k8s-master01 manifests]# pwd
/usr/local/install-k8s/plugin/prometheus/kube-prometheus/manifests
[root@k8s-master01 manifests]# kubectl apply -f ../manifests/
多运行几次,因为要互相链接
运行始终报错的话,先进入到
[root@k8s-master01 manifests]# cd setup/
[root@k8s-master01 setup]# pwd
/usr/local/install-k8s/plugin/prometheus/kube-prometheus/manifests/setup
[root@k8s-master01 setup]# kubectl apply -f .
[root@k8s-master01 manifests]# kubectl get pod
[root@k8s-master01 manifests]# kubectl get pod -n monitoring
数据显示查看
[root@k8s-master01 manifests]# kubectl top node
[root@k8s-master01 manifests]# kubectl top pod
查看当前访问的状态
[root@k8s-master01 manifests]# kubectl get svc -n --all-namespace
我也一直运行失败,尝试多次也不行。别人的效果图:
访问 prometheusprometheus
对应的 nodeport 端口为 30200,访问http://MasterIP:30200
通过访问http://MasterIP:30200/target(在Status下)可以看到 prometheus 已经成功连接上了 k8s 的 apiserver
节点全部健康
prometheus 的 WEB 界面上提供了基本的查询 K8S 集群中每个 POD 的 CPU 使用情况
sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )
上述的查询有出现数据,说明 node-exporter 往 prometheus 中写入数据正常
访问 grafana查看
grafana 服务暴露的端口号:
kubectl getservice-n monitoring | grep grafana
grafana NodePort 10.107.56.143 <none> 3000:30100/TCP
浏览器访问http://MasterIP:30100
用户名密码默认 admin/admin
查看Kubernetes API server的数据
5.压力测试HPA
Horizontal Pod Autoscaling 可以根据CPU利用率自动伸缩一个Replication Controller、Deployment 或者Replica Set中的Pod数量
导入hpa-example.tar,这是谷歌用PHP开发的,能对机器造成资源消耗。
三个节点
docker load -i hpa-example.tar
--request-cpu=200m ,容器最大的CPU利用,防止出现OMM机制,把一些重要的进程杀死
--cpu-percent=50 ,即 100m,最大增长不超过10个节点
扩容快,回收比较慢
防止:因为网络波动问题,造成访问压力没这么大,然后就关闭了,这种是不合理的
6.资源限制-pod
request可以理解为软限制,limit是硬限制
7.资源限制-名称空间
1、计算资源配额
2、配置对象数量配额限制
3、配置CPU和内存LimitRange
五、EFK日志
/var/log/containers/ 中采集在当前节点运行pod的日志信息
1、添加Google incubator仓库
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
2、部署Elasticsearch
[root@k8s-master01 elasticsearch]# kubectl create namespace efk
[root@k8s-master01 elasticsearch]# helm fetch incubator/elasticsearch
[root@k8s-master01 elasticsearch]# tar -zxvf elasticsearch-1.10.2.tgz
[root@k8s-master01 elasticsearch]# vim values.yaml
MINIMUM_MASTER_NODES: "1"
由于16G,带不动,故此由2改成1个
无额外持久卷,false
master:
name: master
exposeHttp: false
replicas: 1
heapSize: "512m"
persistence:
enabled: false
data:
name: data
exposeHttp: false
replicas: 1
heapSize: "1536m"
persistence:
enabled: false
[root@k8s-master01 elasticsearch]# helm install --name els1 --namespace=efk -f values.yaml incubator/elasticsearch
[root@k8s-master01 elasticsearch]# kubectl get pod -n efk
全都Running后再执行下一条
[root@k8s-master01 elasticsearch]# kubectl run cirror-$RANDOM --rm -it --image=cirros -- /bin/sh
[root@k8s-master01 elasticsearch]# curl Elasticsearch:Port/_cat/nodes
[root@k8s-master01 elasticsearch]# kubectl describe pod -n efk
报错:0/3 nodes are available: 1 node(s) had taints that the pod didn’t tolerate, 2 Insufficient memory.
解决:kubectl taint nodes --all node-role.kubernetes.io/master-
3、部署Fluentd
[root@k8s-master01 efk]# pwd
/usr/local/install-k8s/efk
[root@k8s-master01 efk]# helm fetch stable/fluentd-elasticsearch
[root@k8s-master01 efk]# tar -zxvf fluentd-elasticsearch-2.0.7.tgz
[root@k8s-master01 efk]# cd fluentd-elasticsearch
[root@k8s-master01 fluentd-elasticsearch]# vim values.yaml
# 更改其中Elasticsearch访问地址
elasticsearch:
host: '10.102.94.81'
# kubectl get svc -n efk 获取到client的IP地址
[root@k8s-master01 fluentd-elasticsearch]# helm install --name flu1 --namespace=efk -f values.yaml .
[root@k8s-master01 fluentd-elasticsearch]# kubectl get pod -n efk
4、部署kibana数据展示
E和K的版本一定要一致
master:
# helm fetch stable/kibana --version 0.14.8
# vim values.yaml
files:
kibana.yml
elasticsearch.url: http://10.102.94.81:9200
三个节点:
# 在values.yaml看到kibana-oss也要下载
# docker pull docker.elastic.co/kibana/kibana-oss:6.4.2
# docker save -o kibana.tar docker.elastic.co/kibana/kibana-oss:6.4.2
# docker load -i kibana.tar 其他节点
# helm install --name kib1 --namespace=efk -f values.yaml stable/kibana --verison 0.14.8
# kubectl get svc -n efk
# kubectl edit svc kib1-kibana -n efk
默认是ClusterIP
type: NodePort
浏览器访问:
这次学的不太行,有些环境问题,完成不了。