10.Helm及其他功能性组件
一、Helm
什么是Helm
在没使用helm之前, 向kubenetes部署应用, 我们要依次部署deployment,svc等, 步骤较繁琐。 况且随着很多项目微服务化, 复杂的应用在容器中部署以及管理显得较为复杂, helm通过打包的方式, 支持发布的版本管理和控制, 很大程度上简化了kubernetes应用的部署和管理
helm本质就是让k8s的应用管理(deployment ,service等)可配置, 能动态生成。 通过动态生成k8s资源清单文件(deployment.yaml, service.yaml) 。 然后调用kubectl 自动执行k8s 资源部署
helm 是官方提供的类似于yum的包管理器, 是部署环境的流程封装。 Helm 有两个重要的概念:chart和release
- chart是创建一个应用的信息集合, 包括各种kubernetes对象的配置模板, 参数定义, 依赖关系, 文件说明等。 chart是应用部署的自包含逻辑单元。 可以将chart想象成apt,yum中的软件安装包
- release是chart的运行实例 , 代表了一个正在运行的应用。 当chart被安装到kubenetes集群, 就生成一个release,chart能够多次安装到同一个集群。 每次安装都是一个release
Helm包含两个组件: Helm客户端和Tiller服务器, 如下图所示
Helm 客户端负责chart和release的创建和管理以及和Tiller的交互。 Tiller服务器运行在kubernetes集群中, 它会处理Helm客户端的请求, 与kubernetes API Server交互
Helm 部署
越来越多的公司和团队开始使用Helm 这个kubenetes的包管理器, 我们也将使用helm 安装kubernetes的常用组件。 helm由客户端名helm命令行工具和服务端tiller组件。 helm的安装十分简单。 下载helm 命令行工具到master节点node1的/usr/local/bin下, 这里下载的2.13.1版本:
ntpdate ntp1.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
cd linux-amd64/
cp helm /usr/local/bin/
为了安装服务器端tiller, 还需要在这台机器上配置好kubectl 工具和kubeconfig文件。 确保kubectl工具可以在这台机器上访问api server且正常使用。 这里的node节点以及配置好了kubectl
因为kubernetes APIServer 开启了RBAC访问控制, 所以需要创建tiller使用的service account:tiller并分配合适的角色给它。 详细内容可以查看helm文件中的Role-based Access Control 。 这里简单起见直接分配cluster-admin这个集群内置的ClusterRole 给它。 创建rbac-config.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 create -f rbac-config.yaml
查看pod创建是否完成 ,
kubectl get pod -n kube-system
查看异常情况
kubectl describe pod tiller-deploy-58565b5464-4fcqh -n kube-system
镜像下载不下来,修改地址就好
docker pull sapcc/tiller:v2.13.1
修改镜像tag
docker tag cb5aea7d0466 gcr.io/kubernetes-helm/tiller:v2.13.1
或编辑 配置文件kubectl edit deployment tiller-deploy -n kube-system
helm init --service-account tiller --skip-refresh
二种:
1.下载脚本
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
2.执行安装
./get_helm.sh
helm init
3.创建tiller命名空间 注意:Helm 的服务器端部分 Tiller 通常运行在 Kubernetes 集群内部。但是对于开发,它也可以在本地运行,并配置为与远程 Kubernetes 群集通信。
创建tiller的serviceaccount和clusterrolebinding
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
4.快捷群集内安装
安装tiller到群集中最简单的方法就是运行helm init。这将验证helm本地环境设置是否正确(并在必要时进行设置)。然后它会连接到kubectl默认连接的任何集群(kubectl config view)。一旦连接,它将安装tiller到kube-system命名空间中。
你可以通过参数运行 helm init:
--canary-image 参数安装金丝雀版本
--tiller-image 安装特定的镜像(版本)
--kube-context 使用安装到特定群集
--tiller-namespace 用一个特定的命名空间 (namespace) 安装
--service-account 使用 Service Account 安装 RBAC enabled clusters)
--automount-service-account false 不适用 service account 安装
5.更新helm镜像仓库地址 (helm镜像仓库地址如果不能用根据自己的仓库地址更换)
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.17.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
6.将Tiller安装到Kubernetes集群中
helm init --history-max 200
7.应用程序设置serviceAccount 注意:默认情况下,部署舵柄与一个不安全的“允许未经身份验证的用户”政策。
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
8.验证并查看版本 注意:helm init以后,可以运行kubectl get pods --namespace kube-system并看到Tiller正在运行。tiller默认被部署在k8s集群中的kube-system这个namespace下。一旦安装了除非设置--tiller-namespace或TILLER_NAMESPACE参数,否则Helm将在命名空间kube-system中查找 Tiller
kubectl get pod -n kube-system -l app=helm
helm version
报错 ,所有节点安装
yum -y install socat
sshpass -p 123456 ssh -o "StrictHostKeyChecking no" -l root 192.168.31.71 'yum -y install socat'
sshpass -p 123456 ssh -o "StrictHostKeyChecking no" -l root 192.168.31.72 'yum -y install socat'
sshpass -p 123456 ssh -o "StrictHostKeyChecking no" -l root 192.168.31.73 'yum -y install socat'
sshpass -p 123456 ssh -o "StrictHostKeyChecking no" -l root 192.168.31.74 'yum -y install socat'
tiller默认被部署在k8s集群中的kube-system这个namspace下
kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-c4fd4cd68-dwkhv 1/1 Running 0 83s
helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4",GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4",GitTreeState:"clean"}
Helm换源
helm repo add ali-incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm repo add ali-stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
更新helm源
helm repo update
查看仓库
helm repo list
Helm自定义模板
#创建文件夹
mkdir ./hello-world
cd ./hello-world
#创建自描述文件chart.yaml , 这个文件必须有name和version定义
cat <<'EOF' >./Chart.yaml
name: hello-word
version: 1.0.0
EOF
#创建模板文件, 用户生成kubenetes资源清单(manifests)
mkdir ./templates
cat <<'EOF' >./templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: nginx
ports:
- containerPort: 80
protocal: TCP
EOF
cat <<'EOF' >./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: hello-world
EOF
#使用命令helm install RELATIVE_PATH_TOCHART创建一次Release
helm install .
命令 | 说明 |
---|---|
helm list | 列出已经部署的Release |
helm status RELEASE_NAME | 查询一个特定的Release的状态 |
helm delete cautious-shrimp | 移除所有与这个Release相关的kubernetes资源 |
helm rollback helm名称 版本号 | 回滚 |
helm delete --purge 名称 | 使用移除所有与指定Release相关的kubernetes 资源和所有这个Release的记录 |
helm delete --purge cautious-shrimp | |
helm ls --deleted | 查询已经删除的helm |
#配置体现在配置文件values.yaml
$cat <<'EOF' >./values.yaml
image:
repository: gcr.io/google-samples/node-hello
tag: '1.0'
EOF
# 这个文件中定义的值, 在模板文件中可以通过.VAlues对象访问到
$cat <<'EOF' >./templates/deployment.yaml
apiVersion: v1
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: 8080
protocol: TCP
EOF
#在values.yaml中的值可以被部署release时用到的参数--values YAML_FILE_PATH或--set key1=value1,key2=value2 覆盖掉
$helm install --set image.tag='latest'
#升级版本
helm upgrade -f values.yaml test .
Debug
#使用模板动态生成k8s 资源清单, 非常需要能提前预览生成的结果
# 使用--dry-run --debug 选项来打印生成的清单文件内容, 而不执行部署
helm install . --dry-run --debug --set image.tag=latest
二、dashboard
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
下载dashboard
helm fetch stable/kubernetes-dashboard
解压dash
helm install . \
-n kubernetes-dashboard \
--namespace kube-system \
-f ../kubernetes-dashboard.yaml
查看token
kubectl -n kube-system get secret | grep kubernetes-dashboard-token
kubectl -n kube-system describe secret/kubernetes-dashboard-token-f8wq6
三、prometheus
相关地址信息
环境:CentOS 7.6 kubernetes 1.18.3
Prometheus github 地址:
https://github.com/coreos/kube-prometheus
组件说明
- MetricServer: 是kubernetes 集群资源使用情况的聚合器 , 收集数据给kubernetes集群内使用, 如kubectl ,hpa ,scheduler 等
- PrometheusOperator:是一个系统检测和报警工具箱, 用来存储监控数据
- NodeExporter: 用于各node的关键度量指标状态数据
- KuberStateMetrics: 收集kubernetes集群内资源对象数据, 制定告警规则
- Prometheus:采用pull 方式收集apiserver ,scheduler ,controller-manager ,kubelet组件数据, 通过http协议传输
- Grafana:是可视化数据统计和监控平台
构架记录
git clone https://github.com/coreos/kube-prometheus.git
或
git clone https://gitee.com/RaYong8080/kube-prometheus.git
cd /root/kube-prometheus/manifests
修改grafana-service.yaml文件,使用nodepode方式访问grafana:
vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 8.0.3
name: grafana
namespace: monitoring
spec:
type: NodePort
ports:
- name: http
port: 3000
targetPort: http
nodePort: 30100
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
修改prometheus-service.yaml ,改为nodepode
vim prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.28.1
prometheus: k8s
name: prometheus-k8s
namespace: monitoring
spec:
type: NodePort
ports:
- name: web
port: 9090
targetPort: web
nodePort: 30200
selector:
app: prometheus
app.kubernetes.io/component: prometheus
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
prometheus: k8s
sessionAffinity: ClientIP
修改alertmanager-service.yaml ,改为nodepode
vim alertmanager-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
alertmanager: main
app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 0.22.2
name: alertmanager-main
namespace: monitoring
spec:
type: NodePort
ports:
- name: web
port: 9093
targetPort: web
nodePort: 30300
selector:
alertmanager: main
app: alertmanager
app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
sessionAffinity: ClientIP
修改镜像地址:
国外进修某些镜像无法拉取, 我们这里修改prometheus-operator,prometheus,alertmanager,kube-state-metrics,node-exporter,prometheus-adapter的镜像地址为国内镜像源。
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' setup/prometheus-operator-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-prometheus.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' alertmanager-alertmanager.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' kube-state-metrics-deployment.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' node-exporter-daemonset.yaml
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/g' prometheus-adapter-deployment.yaml
部署prometheus
安装CRD和prometheus-operator
kubectl apply -f setup/
查看prometheus-operator状态
kubectl get pod -n monitoring
安装prometheus,、alertmanager,、grafana、 kube-state-metrics,、node-exporter
kubectl apply -f ../manifests
kubectl get all -n monitoring -o wide
kubectl logs pod/node-exporter-cfdhd -n monitoring
kubectl describe pod/node-exporter-cfdhd -n monitoring
kubectl describe pod/kube-state-metrics-8cc99b46b-l7h6c -n monitoring
报错
unable to recognize "../manifests/prometheus-operator-prometheusRule.yaml": no matches for kind "PrometheusRule" in version "monitoring.coreos.com/v1"
unable to recognize "../manifests/prometheus-operator-serviceMonitor.yaml": no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"
unable to recognize "../manifests/prometheus-prometheus.yaml": no matches for kind "Prometheus" in version "monitoring.coreos.com/v1"
unable to recognize "../manifests/prometheus-prometheusRule.yaml": no matches for kind "PrometheusRule" in version "monitoring.coreos.com/v1"
unable to recognize "../manifests/prometheus-serviceMonitor.yaml": no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"
这里需要运行多次命令 如文章:
https://github.com/prometheus-operator/prometheus-operator/issues/1866
如果kubectl top node 报错是因为权限的问题
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
在node上执行
kubectl create clusterrolebinding system:node:k8s-node1 --clusterrole=cluster-admin --user=system:node:k8s-node1
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
apiextensions.k8s.io/v1beta1
Horizontal Pod Autoscaling
Horizontal Pod Autoscaling 可以根据CPU利用率自动伸缩一个Replication Controller,Deployment或者Replica Set 中的Pod数量
<!-- 为了演示 Horizontal Pod Autoscaler , 我们将使用一个基于php-apache镜像的定制Docker镜像 。 在【这里】(https://k8ssmeetup.github.io/docs/user-guide/horizontal-pod-autoscaling/image/Dockerfile)您可以查看完整的Dockerfile定义 。镜像中包括一个【index.php】(https://k8smeetup.github.io/docks/user-guide/horizontal-pod-autoscaling/image/index.php)页面, 其中包含了一些可以院系CPU密集计算任务的代码
--!>
kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80
创建HPA控制器, 相关算法可以goole
四、资源限制
五、EFK日志监控
添加goole incubator仓库
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
二选一
helm repo add mydlq http://chart.mydlq.club
部署elasticsearch
kubectl create namespace efk
helm fetch incubator/elasticsearch
helm fetch mydlq/elasticsearch
helm install --name els1 --namespace=efk -f values.yaml incubator/elasticsearch
kubectl run cirror-$RANDOM--rm-it--image=cirros -- /bin/sh
curl Elasticsearch:Port/_cat/nodes
编辑efk配置文件
# 这里是认为有几个状态是可用的
MINIMUM_MASTER_NODES: "1" # 改为一个 默认是两个
#改客户端
client:
name: client
replicas: 1 # 也可以改为一个
serviceType: ClusterIP
#master 也改成一个
master:
name: master
exposeHttp: false
replicas: 1
heapSize: "512m"
# additionalJavaOpts: "-XX:MaxRAM=512m"
persistence:
enabled: true # 这里如果没有pvc 可以改成false
accessMode: ReadWriteOnce
name: data
# data 也可以改数量
data:
name: data
exposeHttp: false
replicas: 1 # 副本的数量
heapSize: "1536m"
# additionalJavaOpts: "-XX:MaxRAM=1536m"
persistence:
enabled: false
helm install --name els1 --namespace=efk elasticsearch --version 1.26.1
部署Fluentd
helm fetch stable/fluentd-elasticsearchvim
values.yaml# 更改其中 Elasticsearch 访问地址
helm install --name flu1 --namespace=efk -f values.yaml stable/fluentd-elasticsearch
部署kibana
helm fetch stable/kibana --version0.14.8
helm install --name kib1 --namespace=efk -f values.yaml stable/kibana --version0.14.8