1,部署helm

https://github.com/helm/helm/blob/master/docs/charts.md

1.1 什么是 Helm ?

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 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 被安装到 Kubernetes 集群,就生成 一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release

Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示:

Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。Tiller 服务器运行在 Kubernetes 集群 中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互

1.2 Helm 部署

越来越多的公司和团队开始使用 Helm 这个 Kubernetes 的包管理器,我们也将使用 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 工具可以 在这台机器上访问 apiserver 且正常使用。 这里的 node1 节点以及配置好了 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: tillernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding
metadata:name: tiller
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:- kind: ServiceAccountname: tillernamespace: kube-system
kubectl create -f rbac-config.yamlserviceaccount/tiller created clusterrolebinding.rbac.authorization.k8s.io/tiller created
kubectl create -f rbac-config.yamlserviceaccount/tiller created clusterrolebinding.rbac.authorization.k8s.io/tiller created
helm init --service-account tiller --skip-refresh

1.3 tiller 默认被部署在 k8s 集群中的 kube-system 这个 namespace 下

kubectl get pod -n kube-system -l app=helm
NAME                            READY   STATUS    RESTARTS   AGE tiller-deploy-c4fd4cd68-dwkhv   1/1     Running   0          83shelm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

1.4 Helm 自定义模板

# 创建文件夹
$ mkdir ./hello-world $ cd ./hello-world# 创建自描述文件 Chart.yaml , 这个文件必须有 name 和 version 定义 $ cat <<'EOF' > ./Chart.yaml
name: hello-world
version: 1.0.0
EOF# 创建模板文件, 用于生成 Kubernetes 资源清单(manifests)
$ mkdir ./templates
$ cat <<'EOF' > ./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: hello-world
spec:replicas: 1template:metadata:labels:app: hello-worldspec:containers:- name: hello-worldimage: hub.atguigu.com/library/myapp:v1 ports:- containerPort: 80protocol: TCP
EOF
$ cat <<'EOF' > ./templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: hello-world
spec:type: NodePortports:- port: 80 targetPort: 80 protocol: TCP selector:app: hello-world EOF
# 使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release $ helm install
# 列出已经部署的 Release
$ helm ls
# 查询一个特定的 Release 的状态
$ helm status RELEASE_NAME
# 移除所有与这个 Release 相关的 Kubernetes 资源
$ helm delete cautious-shrimp
# helm rollback RELEASE_NAME REVISION_NUMBER
$ helm rollback cautious-shrimp 1
# 使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个 Release 的记录
$ helm delete --purge cautious-shrimp
$ helm ls --deleted
# 配置体现在配置文件 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: extensions/v1beta1
kind: Deployment
metadata:name: hello-world
spec:replicas: 1template:metadata:labels:app: hello-worldspec:containers:- name: hello-worldimage: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports:- containerPort: 8080protocol: 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 .

1.5 Debug

# 使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。
# 使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署 helm install . --dry-run --debug --set image.tag=latest

2,使用Helm部署 dashboard

2.1 kubernetes-dashboard.yaml:

image:repository: k8s.gcr.io/kubernetes-dashboard-amd64 tag: v1.10.1
ingress:enabled: truehosts:- k8s.frognew.comannotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" tls:- secretName: frognew-com-tls-secrethosts:- k8s.frognew.com
rbac:clusterAdminRole: true
helm install stable/kubernetes-dashboard \ -n kubernetes-dashboard \
--namespace kube-system  \
-f kubernetes-dashboard.yaml

输出如下:

kubectl -n kube-system get secret | grep kubernetes-dashboard-token
kubernetes.io/service-account-token   3      3m7s kubectl describe -n kube-system
secret/kubernetes-dashboard-token-pkm2s Name:         kubernetes-dashboard-token-pkm2s
Namespace:    kube-system Labels:       <none> Annotations:  kubernetes.io/service-account.name: kubernetes-dashboard kubernetes.io/service-account.uid: 2f0781dd-156a-11e9-b0f0-080027bb7c43
Type:  kubernetes.io/service-account-token Data ==== ca.crt:     1025 bytes namespace:  11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5 pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQ vc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1wa20ycyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWF jY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2Vydml jZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjJmMDc4MWRkLTE1NmEtMTFlOS1iMGYwLTA4MDAyN2JiN2M0MyIsInN 1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.24ad6ZgZMxdydp wlmYAiMxZ9VSIN7dDR7Q6-RLW0qC81ajXoQKHAyrEGpIonfld3gqbE0xO8nisskpmlkQra72-9X6sBPoByqIKyTsO83BQlME2sfOJemWD0HqzwSCjvSQa0x-bUlq9HgH2vEXzpFuSS6Svi7RbfzLXlEuggNoC4MfA4E2hF1OX_ml8iAKx-49y1BQQe5FGWyCyBSi1TD_-ZpVs44H5gIvsGK2kcvi0JT4oHXtWjjQBKLIWL7xxyRCSE4HmUZT2StIHnOwlX7IEIB0oBX4mPg2_xNGnqwcu-8OERU9IoqAAE2cZa0v3b5O2LMcJPrcxrVOukvRIumA

3 使用Helm部署metrics-server

从 Heapster 的 github <https://github.com/kubernetes/heapster >中可以看到已经,heapster 已经DEPRECATED。 这里是 heapster的deprecation timeline。 可以看出 heapster 从 Kubernetes 1.12 开始将从 Kubernetes 各种安装脚 本中移除。Kubernetes 推荐使用 metrics-server。我们这里也使用helm来部署metrics-server。

3.1 metrics-server.yaml:

args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
helm install stable/metrics-server \ -n metrics-server \
--namespace kube-system \
-f metrics-server.yaml

3.2 使用下面的命令可以获取到关于集群节点基本的指标信息:

kubectl top node
NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY% node1   650m         32%    1276Mi          73% node2   73m          3%     527Mi           30%
kubectl top pod --all-namespaces
NAMESPACE       NAME                                             CPU(cores)   MEMORY(bytes) ingress-nginx   nginx-ingress-controller-6f5687c58d-jdxzk        3m           142Mi ingress-nginx   nginx-ingress-controller-6f5687c58d-lxj5q        5m           146Mi ingress-nginx   nginx-ingress-default-backend-6dc6c46dcc-lf882   1m           4Mi
kube-system     coredns-86c58d9df4-k5jkh                         2m           15Mi
kube-system     coredns-86c58d9df4-rw6tt                         3m           23Mi
kube-system     etcd-node1                                       20m          86Mi
kube-system     kube-apiserver-node1                             33m          468Mi
kube-system     kube-controller-manager-node1                    29m          89Mi
kube-system     kube-flannel-ds-amd64-8nr5j                      2m           13Mi
kube-system     kube-flannel-ds-amd64-bmncz                      2m           21Mi
kube-system     kube-proxy-d5gxv                                 2m           18Mi
kube-system     kube-proxy-zm29n                                 2m           16Mi
kube-system     kube-scheduler-node1                             8m           28Mi
kube-system     kubernetes-dashboard-788c98d699-qd2cx            2m           16Mi
kube-system     metrics-server-68785fbcb4-k4g9v                  3m           12Mi
kube-system     tiller-deploy-c4fd4cd68-dwkhv                    1m           24Mi

4,部署Prometheus

4.1 相关地址信息

Prometheus github 地址:https://github.com/coreos/kube-prometheus

4.2 组件说明

1.MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如 kubectl,hpa,scheduler等。 2.PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。 3.NodeExporter:用于各node的关键度量指标状态数据。 4.KubeStateMetrics:收集kubernetes集群内资源对象数 据,制定告警规则。 5.Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数 据,通过http协议传输。 6.Grafana:是可视化数据统计和监控平台。

4.3 构建记录

git clone https://github.com/coreos/kube-prometheus.git cd /root/kube-prometheus/manifests

4.4 修改 grafana-service.yaml 文件,使用 nodepode 方式访问 grafana:

vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:name: grafananamespace: monitoring
spec:type: NodePort      #添加内容ports:- name: httpport: 3000targetPort: httpnodePort: 30100   #添加内容selector:app: grafana

4.5 修改 prometheus-service.yaml,改为 nodepode

vim prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:labels:prometheus: k8sname: prometheus-k8s namespace: monitoring spec:type: NodePort ports:- name: webport: 9090 targetPort: web nodePort: 30200 selector:app: prometheus prometheus: k8s

4.6 修改 alertmanager-service.yaml,改为 nodepode

vim alertmanager-service.yaml apiVersion: v1
kind: Service
metadata:labels:alertmanager: mainname: alertmanager-main namespace: monitoring
spec:type: NodePortports:- name: webport: 9093targetPort: web nodePort: 30300 selector:alertmanager: main app: alertmanager

4.7 Horizontal Pod Autoscaling

Horizontal Pod Autoscaling 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者 Replica Set 中的 Pod 数量

kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80

创建 HPA 控制器 - 相关算法的详情请参阅这篇文档:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

增加负载,查看负载节点数目:

$ kubectl run -i --tty load-generator --image=busybox /bin/sh
$ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

4.8 资源限制 - Pod

Kubernetes 对资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程的 相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup

默认情况下,Pod 运行没有 CPU 和内存的限额。 这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一 样,消耗足够多的 CPU 和内存 。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 resources 的 requests 和 limits 来实现

spec:containers:- image: xxxx imagePullPolicy: Always name: auth ports:- containerPort: 8080 protocol: TCP resources: limits: cpu: "4" memory: 2Gi requests: cpu: 250m memory: 250Mi

requests 要分分配的资源,limits 为最高请求的资源值。可以简单理解为初始值和最大值

4.9 资源限制 - 名称空间

Ⅰ、计算资源配额

apiVersion: v1
kind: ResourceQuota metadata:name: compute-resources namespace: spark-cluster spec:hard:pods: "20" requests.cpu: "20" requests.memory: 100Gi limits.cpu: "40" limits.memory: 200Gi

Ⅱ、配置对象数量配额限制

apiVersion: v1
kind: ResourceQuota
metadata:name: object-counts namespace: spark-cluster
spec:hard:configmaps: "10" persistentvolumeclaims: "4" replicationcontrollers: "20" secrets: "10"services: "10" services.loadbalancers: "2"

Ⅲ、配置 CPU 和 内存 LimitRange

apiVersion: v1
kind: LimitRange metadata:name: mem-limit-range spec:limits:- default: memory: 50Gi cpu: 5 defaultRequest: memory: 1Gi cpu: 1type: Container
  • default 即 limit 的值
  • defaultRequest 即 request 的值

4.10 访问 prometheus

prometheus 对应的 nodeport 端口为 30200,访问 http://MasterIP:30200

通过访问 http://MasterIP:30200/target 可以看到 prometheus 已经成功连接上了 k8s 的 apiserver:

查看 service-discovery:

Prometheus 自己的指标:

prometheus 的 WEB 界面上提供了基本的查询 K8S 集群中每个 POD 的 CPU 使用情况,查询条件如下:

 sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )

上述的查询有出现数据,说明 node-exporter 往 prometheus 中写入数据正常,接下来我们就可以部署 grafana 组件,实现更友好的 webui 展示数据了

4.11 访问 grafana

查看 grafana 服务暴露的端口号:

kubectl get service -n monitoring  | grep grafanagrafana         NodePort    10.107.56.143    <none>        3000:30100/TCP      20h

如上可以看到 grafana 的端口号是 30100,浏览器访问 http://MasterIP:30100 用户名密码默认 admin/admin

修改密码并登陆:

添加数据源 grafana 默认已经添加了 Prometheus 数据源,grafana 支持多种时序数据源,每种数据源都有各自 的查询编辑器

Prometheus 数据源的相关参数:

目前官方支持了如下几种数据源:

5,部署EFK平台

5.1 添加 Google incubator 仓库

helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator

5.2 部署 Elasticsearch

kubectl create namespace efk
helm fetch incubator/elasticsearch
helm  install --name els1 --namespace=efk -f values.yaml incubator/elasticsearch kubectl  run cirror-$RANDOM --rm -it --image=cirros -- /bin/shcurl Elasticsearch:Port/_cat/nodes

5.3 部署 Fluentd

helm fetch stable/fluentd-elasticsearch
vim  values.yaml# 更改其中 Elasticsearch 访问地址
helm install --name flu1 --namespace=efk -f values.yaml stable/fluentd-elasticsearch

5.4 部署 kibana

helm fetch stable/kibana --version 0.14.8
helm install --name kib1 --namespace=efk -f values.yaml stable/kibana --version 0.14.8

9,kubernetes-Helm及其他功能性组件相关推荐

  1. Helm及其它功能性组件

    Helm 1 helm介绍 1.1 为什么需要helm 1.2 helm中几个概念 1.3 helm安装 2 自定义的chart 2.1 模板文件目录结构 2.2 自定义chart的示例 2.3 he ...

  2. 七、功能性组件与事件逻辑(IVX 快速开发教程)

    七.功能性组件与事件逻辑 由于 iVX 极度易用的特性,在 iVX 中开发微信小程序.WebApp.小游戏应用的开发流程大致相同.介绍完基础可视化组件后通过后台的服务.数据库与事件结合即可完成一个应用 ...

  3. 应用IMXMLObject自定义功能性组件

    在flex项目中,应用到非显示的功能性组件,一种方法是直接定义actionScript类.另外一种方法是实现IMXMLObject接口.实现IMXMLObject接口的好处,是可以直接调用功能函数. ...

  4. kubernetes Helm

    Helm产生原因 利用Kubernetes部署一个应用,需要Kubernetes原生资源文件如deployment.replicationcontroller.service或pod 等.而对于一个复 ...

  5. Kubernetes Helm入门指南

    什么是Helm?这可不是暗黑破坏神里装备的名称:头盔,而是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.我们Helm和Kubernetes的关系,我们可以理解成y ...

  6. Kubernetes — Helm 软件包管理工具

    目录 文章目录 目录 Helm Helm 所解决的问题 Helm 的三大概念 Helm 的软件架构 安装 Helm Client 安装 Tiller server 配置 Repository 安装 H ...

  7. Kubernetes helm burrow 集成

    环境 [root@k8s-master-a ~]# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core)[root@k8s-node ...

  8. 二进制方式搭建kubernetes集群-部署master组件

    文章目录 1. 安装docker 1.1 解压二进制包 1.2 systemd管理docker 1.3 创建配置文件 1.4 重启docker 2. 部署Master Node 2.1 生成kube- ...

  9. Kubernetes安装系列之网络组件-Flannel安装设定

    这篇文章整理以下Master节点的flannel的安装与设定方法,本文以脚本的方式进行固化,内容仍然放在github的easypack上. 整体操作 https://blog.csdn.net/liu ...

最新文章

  1. properties 配置回车_非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!...
  2. centos7 python tab补全
  3. 关于MYSQL 的 AUTO-INC Locks
  4. Scala的隐式参数、隐式值、隐式对象
  5. jzoj3086,luogu3831-[SHOI2012]回家的路【最短路,拆点】
  6. “阿法狗”之父:关于围棋,人类3000年来犯了一个错
  7. YOCTO项目介绍:通过提供模版、工具和方法帮助开发者创建基于linux内核的定制系统
  8. openstack根据公网查不到路由_从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践...
  9. Python3爬虫入门之pyquery库的使用
  10. java 管理系统 注释_员工管理系统--带注释--oracle系统--java项目
  11. mysql索引和事务_mysql的索引和事务详细解读
  12. php_D3_“简易聊天室 ”实现的关键技术 详解
  13. 快讯:百度正式宣布CTO李一男离职
  14. 本科计算机er发篇论文,其实没有那么难
  15. 2020年毕业水平测试计算机内容,2020年高中信息技术学业水平测试指导
  16. 使用mysql.help_topic生成序列
  17. 计算机学院机考,东华大学计算机学院研究生复试上机考真题.doc
  18. u-boot下载地址
  19. 微博评论点赞mysql设计_微博点赞功能设计得是否合理?
  20. 一文教你如何使用Mybatis Plugin 以及Druid Filer 改写SQL

热门文章

  1. 数据结构 期末复习主观题练习题(答案版)
  2. SparkCore核心机制详解
  3. 四大微信小程序测评结果出炉
  4. cocos2dx-精灵的移动跳跃
  5. 教你一步一步实现图标无缝变形切换
  6. 模电(二)半导体二极管
  7. ildasm Reflector
  8. 【计算机毕业设计】Java ssm高校英语四六级报名系统
  9. Java项目:毕业论文管理系统(java+SSM+JSP+Tomcat+mysql)
  10. 微信小程序生成二维码的两种方式