Kubernetes 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

浏览器访问:

在这里插入图片描述

这次学的不太行,有些环境问题,完成不了。

猜你喜欢

转载自blog.csdn.net/qq_39578545/article/details/108943538