资源规划

组件 LTSR003 LTSR005 LTSR006
OS centos7.6 centos7.6 centos7.6
Docker docker-ce-18.06.1 docker-ce-18.06.1 docker-ce-18.06.1
kubeadm kubeadm-1.18.0 kubeadm-1.18.0 kubeadm-1.18.0
kubectl kubectl-1.18.0 kubectl-1.18.0 kubectl-1.18.0
kubelet kubelet-1.18.0 kubelet-1.18.0 kubelet-1.18.0
Helm helm-3.2.1 N.A N.A

安装介质

版本:helm-v3.2.1-linux-amd64.tar.gz
下载:https://github.com/helm/helm/releaseshttps://helm.sh/docs/intro/quickstart

环境准备

安装K8s

参考:《CentOS7.6_kubeadm快速部署K8s集群

安装Helm

解压缩

  1. # root
  2. cd ~
  3. wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
  4. tar zxvf helm-v3.2.1-linux-amd64.tar.gz
  5. mv linux-amd64/helm /usr/bin/
  6. rm -rf linux-amd64/
  7. rm -rf helm-v3.2.1-linux-amd64.tar.gz

配置仓库

  • 新增Chart仓库

    1. # 微软仓库,基本上官网有的chart这里都有
    2. helm repo add azure http://mirror.azure.cn/kubernetes/charts
    3. # 阿里云仓库
    4. helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    5. helm repo add aliyun-hub https://apphub.aliyuncs.com
    6. helm repo add aliyun-incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator
    7. # 谷歌仓库
    8. helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
    9. # 官方仓库,国内基本无法使用
    10. helm repo add official https://hub.kubeapps.com/charts/incubator
  • 更新Chart仓库

    1. helm repo update
  • 搜索Chart仓库

    1. helm repo list
    2. helm search repo aliyun
  • 移除Chart仓库

    1. helm repo remove official

    安装Helm WebUI

  • 搜索并安装WebUI

    1. helm search repo weave
    2. helm show chart azure/weave-scope
    3. # 安装应用,语法:helm install ${自定义名称} ${helm仓库Chart应用名称}
    4. helm install helm-ui azure/weave-scope
    5. helm list
    6. helm status helm-ui
  • 暴露端口

    1. kubectl get svc
    2. kubectl edit svc helm-ui-weave-scope

    修改以下内容:

    1. spec:
    2. ....
    3. type: NodePort
    4. ....

    image.png

    自定义Chart

  1. 使用命令创建Chart。
    1. helm create mychart
    2. cd mychart
    说明:
  • Chart.yaml:当前Chart属性配置信息。
  • templates:编写yaml的存放目录。
  • values.yaml:全局变量(yaml中可引用)。
  1. 在templates文件夹下创建deployment.yaml和service.yaml。
    1. rm -rf templates/*
    2. cd templates
    3. kubectl create deployment web --image=nginx --dry-run -o yaml > deployment.yaml
    4. kubectl expose deployment web --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml
  • deployment.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. creationTimestamp: null
    5. labels:
    6. app: web
    7. name: web
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. app: web
    13. strategy: {}
    14. template:
    15. metadata:
    16. creationTimestamp: null
    17. labels:
    18. app: web
    19. spec:
    20. containers:
    21. - image: nginx
    22. name: nginx
    23. resources: {}
    24. status: {}
  • service.yaml

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. creationTimestamp: null
    5. labels:
    6. app: web
    7. name: web
    8. spec:
    9. ports:
    10. - port: 80
    11. protocol: TCP
    12. targetPort: 80
    13. selector:
    14. app: web
    15. type: NodePort
    16. status:
    17. loadBalancer: {}
  1. 安装Chart。

    1. # 返回到Chart上一级目录
    2. cd ../../
    3. helm install web mychart
    4. helm status web
  2. 升级。

    1. helm upgrade web mychart/
  3. 打包。

    1. helm package mychart/
    2. mv mychart-0.1.0.tgz helm-mychart-0.1.0.tgz

    Chart高效复用

    1. 动态传参

  • 思路

通过传递参数,动态渲染模板,yaml内容动态传入参数生成(由values.yaml文件定义全局变量)。

  • 步骤
  1. 在values.yaml定义变量和值。
  2. 在具体yaml文件获取定义变量值(取值表达式:{{ .Values.变量名称}})。
  • 参数项
    • image:镜像
    • tag:版本
    • label:名称
    • port:端口
    • replicas:副本数
  • 示例

    • values.yaml

      1. replicas: 1
      2. image: nginx
      3. tag: 1.16
      4. label: nginx
      5. port: 80
    • deployment.yaml

      1. apiVersion: apps/v1
      2. kind: Deployment
      3. metadata:
      4. name: {{ .Release.Name}}-deploy
      5. spec:
      6. replicas: 1
      7. selector:
      8. matchLabels:
      9. app: {{ .Values.label}}
      10. strategy: {}
      11. template:
      12. metadata:
      13. creationTimestamp: null
      14. labels:
      15. app: {{ .Values.label}}
      16. spec:
      17. containers:
      18. - image: {{ .Values.image}}
      19. name: {{ .Values.label}}
      20. resources: {}
      21. status: {}
  • service.yaml

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: {{ .Release.Name}}-svc
    5. spec:
    6. ports:
    7. - port: {{ .Values.port}}
    8. protocol: TCP
    9. targetPort: 80
    10. selector:
    11. app: {{ .Values.label}}
    12. type: NodePort
    13. status:
    14. loadBalancer: {}

    执行:

    1. helm install --dry-run web2 mychart/
    2. helm install web2 mychart/
    3. kubectl get pods,svc

    2. 安装前自定义配置选项

    自定义选项是因为并不是所有的chart都能按照默认配置运行成功, 可能会需要一些环境
    依赖, 例如 PV。所以我们需要自定义chart配置选项, 安装过程中有两种方法可以传递配置数据:

    • —values( 或-f) : 指定带有覆盖的YAML文件。 这可以多次指定, 最右边的文件优先。使用时,先将修改的变量写到一个文件中。
    • —set: 在命令行上指定替代。 如果两者都用, —set优先级高。
      1. helm search repo mysql
      2. helm show values azure/mysql
      3. mkdir db-mysql && cd ./db-mysql
      4. vi config.yaml
      配置如下:
      1. persistence:
      2. enabled: true
      3. storageClass: "mysql-nfs-storage"
      4. accessMode: ReadWriteOnce
      5. size: 8Gi
      6. mysqlUser: "k8s"
      7. mysqlPassword: "123456"
      8. mysqlDatabase: "k8s"
      安装:
      1. helm pull azure/mysql --untar
      2. helm install db -f config.yaml azure/mysql
      3. kubectl get pods,svc
      4. # kubectl describe pod ${pod-name}
      5. kubectl run -it db-client --rm --restart=Never --image=mysql:5.7 -- bash
      6. mysql -hdb-mysql -uk8s -p123456
      7. mysql> show databases;

      基本使用

      1. 安装

      1. helm install web azure/nginx-ingress

      2. 升级

      1. helm upgrade --set imageTag=1.17 web nginx
      2. helm upgrade -f values.yaml web nginx

      3. 回滚

      1. helm get all --revision 1 web
      2. helm history web
      3. helm rollback web 1

      4. 卸载

      1. helm uninstall web

      补充

      NFS安装配置

      1. 安装NFS

      1. yum install -y nfs-utils
      2. yum -y install rpcbind

      2. 配置NFS服务端数据目录

      1. mkdir -p /nfs/k8s/
      2. chmod 755 /nfs/k8s
      3. vim /etc/exports
      内容如下:
      1. /nfs/k8s/ *(async,insecure,no_root_squash,no_subtree_check,rw)

      3. 启动服务查看状态

      1. # ltsr007
      2. systemctl start nfs.service
      3. systemctl enable nfs.service
      4. showmount -e

      4. 客户端

      1. # 客户端不需要启动nfs服务
      2. # 开机启动
      3. sudo systemctl enable rpcbind.service
      4. # 启动rpcbind服务
      5. sudo systemctl start rpcbind.service
      6. # 检查NFS服务器端是否有目录共享
      7. showmount -e ltsr007

      PV配置

      这里采用StorageClass动态实现PV的方式,创建好StorageClass对象,只要在helm的values.yaml文件中指定storageClass为StorageClass名称即可动态在NFS上创建PV以及PVC。

      1. 创建Provisioner

      Provisioner是NFS的自动配置程序,可以使用自动配置好的NFS服务器,来自动创建持久卷,也就是自动创建PV。
      1. cd ~/k8s/
      2. vi nfs-client.yaml
      内容如下:
      1. apiVersion: apps/v1
      2. kind: Deployment
      3. metadata:
      4. name: nfs-client-provisioner
      5. spec:
      6. replicas: 1
      7. selector:
      8. matchLabels:
      9. app: nfs-client-provisioner
      10. strategy:
      11. type: Recreate
      12. template:
      13. metadata:
      14. labels:
      15. app: nfs-client-provisioner
      16. spec:
      17. serviceAccountName: default-admin
      18. containers:
      19. - name: nfs-client-provisioner
      20. image: quay.io/external_storage/nfs-client-provisioner:latest
      21. volumeMounts:
      22. - name: nfs-client-root
      23. mountPath: /persistentvolumes
      24. env:
      25. - name: PROVISIONER_NAME
      26. value: fuseim.pri/ifs
      27. - name: NFS_SERVER
      28. value: 192.168.0.17
      29. - name: NFS_PATH
      30. value: /nfs/k8s
      31. volumes:
      32. - name: nfs-client-root
      33. nfs:
      34. server: 192.168.0.17
      35. path: /nfs/k8s
      执行yaml:
      1. kubectl create -f nfs-client.yaml

      2. 创建ServiceAccount

      给Provisioner授权,使得Provisioner拥有对NFS增删改查的权限。
      1. vi nfs-client-sa.yaml
      内容如下: ```yaml

apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: gmo name: default-admin namespace: default


apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: default-crb roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: