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服务器, 如下图所示

image-20210109154137740

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
posted @ 2021-08-01 16:30  白色的番茄  阅读(236)  评论(0编辑  收藏  举报