分享

k8s集群安装学习笔记八——Helm部署及使用

 bin仔学习园地 2022-11-04 发布于上海

Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。

Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互 。

Helm 部署

越来越多的公司和团队开始使用 Helm 这个 Kubernetes 的包管理器,我们也将使用 Helm 安装 Kubernetes 的常用组件。
Helm 由helm客户端命令行工具服务端 tiller 组成,Helm 的安装十分简单。
下载 helm 命令行工具到master 节点 node1 的 /usr/local/bin 下,这里下载的 2.13. 1版本:
复制代码
ntpdate ntp1.aliyun.com 
官网下载地址:https://github.com/kubernetes/helm/releases
wget https://get.helm.sh/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/
复制代码

helm命令行工具完成

为了安装服务端 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 文件: 
复制代码
$ vim rbac-config.yaml
apiVersion: v1 kind: ServiceAccount 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 

 tiller服务端安装(指定上面创建的service account初始化)

helm init --service-account=tiller --skip-refresh

注:如果镜像下载失败,可以换成阿里云的镜像

进入查看安装结果

kubectl edit pod tiller-deployment-xxx -n kube-system

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 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 自定义模板

# 创建文件夹 
$ mkdir ./test
$ cd ./test
复制代码
# 创建自描述文件 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: 1 
  template: 
    metadata: 
      labels: 
        app: hello-world 
    spec: 
      containers: 
        - name: hello-world 
          image: wangyanglinux/myapp:v1 
          ports: 
            - containerPort: 80 
              protocol: TCP 
EOF 

$ 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运行列表信息

如果修改了yaml文件需要更新时:

查看更新历史:

回滚

helm rollback nobby-eel 1 

查看当前pod信息:

查看当前helm运行状态:

 

访问测试:

就可以把下面的目录打包发给别人,用于部署应用程序(当然以上实验比较简单,只包含了一个应用程序,可以部署多个或者集群)

简单总结下关系概念:

在docker里,它会把我们的应用程序封装成一个镜像,在部署应用程序时,只需要运行镜像即可。

在k8s里,helm是把我们集群的部署方案写入到Chart中,然后通过Chart去部署出来一个集群,

也就是生成对应的release,然后在docker里面就会生成对应的容器。

常用其他命令:

复制代码
# 列出已经部署的 Release 
$ helm list

# 查询一个特定的 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 list --deleted
复制代码

更新操作

复制代码
# 新建配置文件 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: 8080 
              protocol: TCP 
EOF

$ helm upgrade nobby-eel .
复制代码

 查看更新结果:

或者使用更简单的方式更新:

helm upgrade nobby-eel  --set image.tag='v3' .

由此可知道:如果我们把当前公司的集群项目改成Chart方案,后续我们更新资料的时候,只需要指定values更改即可。

Debug方式创建

使用模板动态生成K8s资源清单时,非常需要能提前预览生成的结果

# 使用--dry-run --debug 选项来打印出生成的清单文件内容,尝试而不执行部署
$ helm install --dry-run . $ helm
install . --dry-run --debug --set image.tag=latest

使用Helm部署 dashboard (K8S官方管理工具)

更换helm仓库源的方式部署dashboard

使用helm fetch  stable/kubernetes-dashboard 把Chart的压缩包下载到本地使用。

(可能会提示更新repo,使用helm repo update)--类似于Linux中yum仓库更新

或者直接下载再上传

http://mirror./kubernetes/charts/kubernetes-dashboard-1.8.0.tgz

 下载后得到下载的压缩包

解压并进入目录

 会发现和上面自己创建的目录结构一样。

创建kubernetes-dashboard.yaml: (和上面实验创建的value.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.tar包,免得下面部署的时候下载慢或者下载失败问题

docker load -i dashboard.tar

使用helm创建release

helm install . \ 
-n kubernetes-dashboard \  #指定名称
--namespace kube-system \  #指定名称空间
-f kubernetes-dashboard.yaml  #指定创建的yaml文件

查看Pod创建情况,查看svc创建情况

 

 现在是ClusterIP方式,修改为NodePort方式(或者Ingress),暴露服务给外界访问。

kubectl edit svc kubernetes-dashboard -n kube-system

再查看svc信息(注意:这是https协议访问的)

访问测试:

 

 可以通过指定kubeconfig文件访问,也可以通过令牌token的方式访问。

查看token

复制代码
$ 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
复制代码

 然后通过输入token登录

 

进入管理页面

然后就可以在管理页面创建应用了

使用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。
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
使用下面的命令可以获取到关于集群节点基本的指标信息:

 

 

部署Prometheus(监控项目)

注意:部署Prometheus和metrics-server时选其一,前者集成了后者,且功能更多。

相关地址信息 

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

组件说明 

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:是可视化数据统计和监控平台。

构建记录

mkdir prometheus && cd prometheus
git clone https://github.com/coreos/kube-prometheus.git cd /root/kube-prometheus/manifests
修改 grafana-service.yaml 文件,使用 NodePort 方式访问 grafana: 
复制代码
vim grafana-service.yaml 
apiVersion: v1 
kind: Service 
metadata: 
  name: grafana 
  namespace: monitoring 
spec: 
  type: NodePort #添加内容 
  ports: 
  - name: http 
    port: 3000 
    targetPort: http 
    nodePort: 30100 #添加内容 
  selector: 
    app: grafana
复制代码
修改 prometheus-service.yaml,改为 NodePort
复制代码
vim 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
复制代码
修改 alertmanager-service.yaml,改为 NodePort
复制代码
vim alertmanager-service.yaml 
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
复制代码

下载并上传加载 PrometheusOperator的镜像文件(更快,否则会在部署的时候自动下载,速度很慢)

解压并执行load-images.sh加载脚本

将上面使用文件拷贝到node节点服务器(node01、node02)

 然后在node节点服务器同样执行导入镜像操作

通过yaml文件创建

进入解压缩后的kube-prometheus\manifests目录下,可看到全是yaml文件

kubectl apply -f ../manifests/

查看pod创建状态

然后就可以查看监控信息了

kubectl top node
kubectl top pod

访问 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 展示数据了

访问 grafana

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

修改密码并登陆 

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

Prometheus 数据源的相关参数: 

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

 就可以实现资源的监控了,例如node节点监控信息

 监控部分就完成了!

Horizontal Pod Autoscaling

没外网可先下载上传压缩包然后加载镜像(node节点服务器执行相同操作导入镜像)

先下载示例镜像

docker load -i hpa-example.tar

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

 --requests=cpu=200m:就是一个资源限制,初始分配值

查看pod的监控信息(是否能正常获取)

 

创建 HPA 控制器(CPU负载超过50%就扩容,最大扩容数为10,负载小了之后会减小节点数,最少保持1个)

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

查看hpa信息(现在的负载为0%)

 已经获取到资源了

增加负载,查看负载节点数目 (压测)

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

 可以看到CPU利用率上去了,然后就会自动扩容增加Pod数量减压,最大增加到上面设置的10个上限

查看此时Pod的创建状态

稍等会儿就可以看到创建了10个pod,第10个正在被创建

 

资源限制 - 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 为最高请求的资源值。可以简单理解为初始值和最大值

资源限制 - 名称空间

Ⅰ、计算资源配额 
复制代码
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'  #PV限制
    replicationcontrollers: '20' #RC限制
    secrets: '10' 
    services: '10' 
    services.loadbalancers: '2'
复制代码

Ⅲ、配置 CPU 和 内存 LimitRange (如果上面两种都没设置,如下这样限制pod使用的最大资源)

复制代码
apiVersion: v1 
kind: LimitRange 
metadata: 
  name: mem-limit-range 
spec: 
  limits: 
    - default: #最大值
      memory: 50Gi 
      cpu: 5 
    defaultRequest:  #初始值
      memory: 1Gi 
      cpu: 1 
    type: Container
复制代码
·default 即 limit 的值
·defaultRequest 即 request 的值 

部署 EFK日志平台

(部署很简单,但是对系统要求很高,默认配置内存至少需要20G以上)

添加 Google incubator 仓库 

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

部署 Elasticsearch

复制代码
kubectl create namespace efk  #创建名称空间
helm fetch incubator/elasticsearch  #提前下载好镜像
tar -xf elasticsearch-xxx.tgz && cd elasticsearch #如果服务器配置不够,可以修改values.yaml对应的集群节点和PVC设置,生产的也可以不修改

#安装运行 helm
install --name els1 --namespace=efk -f values.yaml .

#启动测试 kubectl run cirror-$RANDOM --rm -it --image=cirros -- /bin/sh curl Elasticsearch:Port/_cat/nodes
复制代码

部署 Fluentd 

复制代码
helm fetch stable/fluentd-elasticsearch 
# 解压进入修改文件 vim values.yaml # 更改其中 Elasticsearch 访问地址
# 安装运行 helm
install --name flu1 --namespace=efk -f values.yaml . 
复制代码

部署 kibana

注意:部署EFK时,E和K的版本必须一致,否则会报错

helm fetch stable/kibana --version 0.14.8 
# 同样需要进入values.yaml中Elasticsearch的访问地址
helm install --name kib1 --namespace=efk -f values.yaml . --version 0.14.8

查看Pod创建情况

修改svc访问方式(默认不允许外部访问)

$ kubectl edit svc kib1-kibana -n efk
type: NodePort

修改后:

访问测试:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多