• 云原生Kubernetes:简化K8S应用部署工具Helm


    目录

    一、理论

    1.HELM

    ​编辑

    2.部署HELM2

    3.部署HELM3(2to3方式)

    4.部署HELM3(单独安装)

    二、实验

    1.部署 HELM2

    2.部署HELM3(2to3方式)

    3.部署HELM3(单独安装)

    三、问题

    1.api版本过期

    2.helm初始化报错

    3.pod状态为ImagePullBackOff

    4.helm 命令显示 no repositories to show 的错误

    5.Helm安装报错

    6.git命令报错

    7.CentOS 7 下git clone配置使用

    8.签名密钥(signing keys)和认证密钥(authentication keys)的区别

    9.make build 报错

    10.查看helm的plugin路径

    11.go 语言 proxy.golang.org timeout 无法访问

    12.Go mod问题

    13.使用 --dry-run 参数验证 Chart 的配置报错

    13.新增Harbor服务器出现网络异常

    14.安装Harbor报错

    四、总结


    一、理论

    1.HELM

    (1)简介

         Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来管理 Charts。有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。对于使用者而言,使用 Helm 后不用需要编写复杂的应用部署文件,可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序。

        在 Kubernetes 中部署容器云的应用也是一项有挑战性的工作,Helm 就是为了简化在 Kubernetes 中安装部署容器云应用的一个客户端工具。通过 helm 能够帮助开发者定义、安装和升级 Kubernetes 中的容器云应用,同时也可以通过 helm 进行容器云应用的分享。在 Kubeapps Hub 中提供了包括 Redis、MySQL 和 Jenkins 等常见的应用,通过 helm 可以使用一条命令就能够将其部署安装在自己的 Kubernetes 集群中。

    Helm 是管理 Kubernetes 包的工具,Helm 能提供下面的能力:

    1. 1)创建新的 charts(图表)
    2. 2)将 charts 打包成 tgz 文件
    3. 3)与 chart 仓库交互
    4. 4)安装和卸载 Kubernetes 的应用
    5. 5)管理使用 Helm 安装的 charts 的生命周期

    (2)架构

     Helm 架构由 Helm 客户端、Tiller 服务器端和 Chart 仓库所组成;Tiller 部署在 Kubernetes 中,Helm 客户端从 Chart 仓库中获取 Chart 安装包,并将其安装部署到 Kubernetes 集群中。

    (3)重要概念

    1. 1)Charts:是创建 Kubernetes 应用实例的信息集合,也就是一个 helm 的程序包,它包含了运行一个 k8s 应用所有需要的镜像、依赖关系和资源定义等,必要时还会包含 Service 资源定义,它类似于 yum 的 rpm 文件
    2. 2)Repository:Chart 仓库,用于集中存储和分发 Charts。
    3. 3)Config:应用程序实例化安装时运行使用的配置信息
    4. 4)Release:chart 的运行实例,包含特定的 config

    (4)组件

    在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器。

    ① helm 客户端

    它是一个供终端用户使用的命令行工具

    客户端负责如下的工作:

    1. 1)本地 chart 开发
    2. 2)管理仓库
    3. 3)与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)

    ② Tiller 服务器

    Tiller 是 helm 的服务器端,一般运行于 kubernetes 集群之上,定义 tiller 的 ServiceAccount,并通过 ClusterRoleBinding 将其绑定至集群管理员角色 cluster-admin,从而使得它拥有集群级别所有的最高权限

    Tiller 服务器负责如下的工作:

    1. 1)监听来自于 Helm 客户端的请求
    2. 2)组合 chart 和配置来构建一个发布
    3. 3)在 Kubernetes 中安装,并跟踪后续的发布
    4. 4)通过与 Kubernetes 交互,更新或者 chart

    (5)版本

    区别:

    1. Helm2是C/S架构,主要分为客户端helm和服务端Tiller; 与之前版本相同。
    2. Helm3同样在Release页面提供了预编译好的二进制文件。
    3. 差别在于原先的二进制包下载下来你会看到helm和tiller 。而Helm3则只有helm的存在了。
    4. Tiller主要用于在Kubernetes集群中管理各种应用发布的版本,在Helm3中移除了Tiller, 版本相关的数据直接存储在了Kubernetes中。

    Helm2的问题:

    1. Helm2的一个主要问题是需要在k8s集群里面运行一个服务端,而这就需要把tiller的端口暴露给外界,会产生安全隐患。
    2. 在helm 2中引入的tiller主要是当时k8s还没有RBAC机制,所以就引入了服务端tiller。
    3. 而后来k8s的功能相应完善,加入了RBAC和CRD等,都使得tiller这个东西显得多余。

    Helm3:

    1. helm3只有一个客户端,没有服务端,所以安装起来很方便,把相应的程序下下来即可,不需要helm init安装了。
    2. 相对于helm2,helm3有几大特性:
    3. 1)移除了tiller
    4. 2)支持分布式helm hub, 有了它就可以在很多时候不需要手动添加非官方repo了,例如helm3 search hub
    5. 3)为chart输入值进行json schema验证。
    6. 4)可以给helm charts添加test了,通过helm test 就能针对部署的应用跑一些tests。
    7. 5)部署的时候release name必须指定了,helm2的时候不指定会自动生成一个。
    8. 6)删除的时候不需要--purge了,删了就是删了。

    Helm2到Helm3的迁移:

    1. helm官方提供了一个小插件,帮助我们把已经部署的helm2应用迁移到helm3上。
    2. 安装插件
    3. $ helm3 plugin install https://github.com/helm/helm-2to3
    4. 迁移helm2的配置,例如仓库
    5. $ helm3 2to3 move config
    6. 迁移helm2部署的应用(确保helm2和helm3同时安装在同一台机器上)
    7. $ helm3 2to3 convert --delete-v2-releases

    (6)HELM2常用命令

    1. #查看版本
    2. helm version
    3. #查看当前安装的charts
    4. helm list
    5. #查询 charts
    6. helm search nginx
    7. #安装charts
    8. helm install --name nginx --namespace test aliyun/nginx
    9. #查看charts状态
    10. helm status nginx
    11. #删除charts
    12. helm delete --purge nginx
    13. #增加repo
    14. helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    15. #更新repo仓库资源
    16. helm repo update
    17. #创建charts
    18. helm create helm_charts
    19. #测试charts语法
    20. helm lint
    21. #打包charts
    22. cd helm_charts && helm package ./
    23. #查看生成的yaml文件
    24. helm template helm_charts-0.1.1.tgz
    25. #更新image
    26. helm upgrade --set image.tag=‘v2019-05-09-18-48-40’ study-api-en-oral myharbor/study-api-en-oral
    27. #回滚relase
    28. helm hist study-api-en-oral
    29. helm rollback study-api-en-oral 4

    (7) HELM3命令

    (8)Helm 3不再存在的Helm 2的命令

    在前面的示例中,发现helm init已经在Helm 3中不存在了。类似的共有如下7条命令,在Helm 3中或删除或改名或则功能增强,比如因为Tiller的去除,所以导致了reset命令没有存在的意义,同时init存在仅剩客户端需要设定的功能,所以被去除了。另外诸如fetch命令,而在Helm 3中提供了pull命令予以替代。本来home命令用于显示HELM_HOME环境变量,而在Helm 3中提供env命令可以显示所有的环境变量信息,用增强的功能予以了替换。但是无论如何,总之已经无法在Helm 3中直接使用如下7条命令。

    (9)Helm 3:相较与Helm 2新增的命令

    相较于Helm 2,从helm --help中获得的信息看到如下5条命令在Helm 3中为新增的命令。

    说明如下:

    1. env是对被删除的命令home的强化
    2. pull是对被删除的命令fetch的替换
    3. show是对被删除的命令inspect的替换
    4. help命令本身在Helm 2时代就可以使用,只是helm --help里面没有显示,算是文档自包含的强化
    5. uninstall是功能特性的增强

    (10)Helm 3:命令说明发生变化

    由于Tiller的移除,版本显示命令helm version的表述从显示client/server的版本信息变成了显示client的版本信息,类似的发生变化的共有5条命令,到底是文档的变化还是功能性的反映,在后续的文章中将继续通过实例进行进一步的说明。

    (11)Helm版本支持策略

    Helm | Helm版本支持策略

    支持的版本

    1. Helm的版本用 x.y.z 描述,x是主版本,y是次版本,z是补丁版本,遵循 语义化版本 术语。
    2. Helm项目维护了一个针对最近次要版本的发布分支。适当的修复,包括安全修复、从发布分支中的cherry-pick, 视严重程度而定。更多细节请查看 Helm版本策略。

    可支持的版本偏差

    1. 当一个Helm的新版本发布时,它是针对Kubernetes的一个特定的次版本编译的。比如,Helm 3.0.0 与Kubernetes的1.16.2的客户端版本交互,一次可以兼容Kubernetes 1.16。
    2. 从Helm 3开始,Helm 编译时假定与针对n-3版本的Kubernetes兼容。由于Helm 2对Kubernetes次版本变更的支持稍微严格一点, 则假定与Kubernetes的n-1版本兼容。
    3. 例如,如果在使用一个针对Kubernetes 1.17客户端API版本编译的Helm 3版本,那么它应该可以安全地使用Kubernetes 1.17, 1.16,1.15,以及1.14。如果您在使用一个针对Kubernetes 1.16客户端API版本编译的Helm 2版本,那么它应该可以安全地使用 Kubernetes 1.16 和 1.15。
    4. 不推荐将Helm用于比编译它所依赖的版本更高的Kubernetes版本,因为Helm并没有做出任何向前兼容的保证。
    5. 如果选择了一个Kubernetes版本不支持的Helm,需自负风险。

    Helm版本与K8S集群兼容:

    2.部署HELM2

    (1)安装 helm 客户端

    1. [root@master ~]# wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
    2. [root@master ~]# tar zxvf helm-v2.14.3-linux-amd64.tar.gz
    3. [root@master ~]# mv linux-amd64/helm /usr/local/bin/
    4. [root@master ~]# chmod +x /usr/local/bin/helm
    5. [root@master ~]# echo 'source <(helm completion bash)' >> /etc/profile
    6. [root@master ~]# . /etc/profile

    (2)安装 Tiller server(需要创建授权用户)

    第一种方法:(K8s1.16以下版本)

    1. #创建授权用户
    2. [root@master ~]# vim tiller-rbac.yaml
    3. apiVersion: v1
    4. kind: ServiceAccount
    5. metadata:
    6. name: tiller
    7. namespace: kube-system
    8. ---
    9. apiVersion: rbac.authorization.k8s.io/v1beta1
    10. kind: ClusterRoleBinding
    11. metadata:
    12. name: tiller
    13. roleRef:
    14. apiGroup: rbac.authorization.k8s.io
    15. kind: ClusterRole
    16. name: cluster-admin
    17. subjects:
    18. - kind: ServiceAccount
    19. name: tiller
    20. namespace: kube-system
    1. [root@master ~]# kubectl apply -f tiller-rbac.yaml
    2. [root@master ~]# helm init --service-account=tiller
    3. [root@master ~]# kubectl get pod -n kube-system | grep tiller
    4. [root@master ~]# kubectl edit pod tiller-deploy-8557598fbc-tvfsj -n kube-system
    5. //编辑 pod 的 yaml 文件,将其使用的镜像改为国内阿里云的,默认是 Google 的镜像,下载不下来
    6. //修改 spec 字段的 image 指定的镜像如下:
    7. image: gcr.io/kubernetes-helm/tiller:v2.14.3
    8. //修改如下:
    9. image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
    10. //修改后,保存退出即可,它会去自动下载新镜像(如果没有自动下载,就想办法吧,比如说在 tiller 容器所在的节点手动下载下来镜像,然后重启该节点的 kubelet,或重启该容器)
    11. [root@master ~]# kubectl get pod -n kube-system | grep tiller
    12. //只要保证 tiller 的 pod 正常运行即可
    13. tiller-deploy-8557598fbc-m986t 1/1 Running 0 7m54s

    第二种方法: (k8s1.16以上版本)

    1. kubectl create serviceaccount --namespace kube-system tiller
    2. kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    3. helm init --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -
    1. [root@master ~]# kubectl get pod -n kube-system | grep tiller
    2. [root@master ~]# kubectl edit pod tiller-deploy-8557598fbc-tvfsj -n kube-system
    3. //编辑 pod 的 yaml 文件,将其使用的镜像改为国内阿里云的,默认是 Google 的镜像,下载不下来
    4. //修改 spec 字段的 image 指定的镜像如下:
    5. image: gcr.io/kubernetes-helm/tiller:v2.14.3
    6. //修改如下:
    7. image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
    8. //修改后,保存退出即可,它会去自动下载新镜像(如果没有自动下载,就想办法吧,比如说在 tiller 容器所在的节点手动下载下来镜像,然后重启该节点的 kubelet,或重启该容器)
    9. [root@master ~]# kubectl get pod -n kube-system | grep tiller
    10. //只要保证 tiller 的 pod 正常运行即可
    11. tiller-deploy-54d45574c4-zdt72 1/1 Running 0 7m54s

    (3)配置 helm 仓库

    1. [root@master ~]# helm repo list //查看其仓库信息
    2. NAME URL
    3. stable https://kubernetes-charts.storage.googleapis.com
    4. //如上,默认是 Google,在国外,速度特别慢
    5. local http://127.0.0.1:8879/charts
    6. //执行下面命令,更改为国内阿里云的仓库
    7. [root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    8. [root@master ~]# helm repo list //再次查看,可以发现更改生效了
    9. NAME URL
    10. stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    11. local http://127.0.0.1:8879/charts
    12. [root@master ~]# helm repo update //更新一下 helm 仓库
    13. [root@master ~]# helm version //查看 helm 版本信息,必须保证可以查看出来 client 和 server,才可正常使用 helm
    14. Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
    15. Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}

    (4)测试 helm 是否可以正常使用

    1. [root@master ~]# helm search mysql //搜索 MySQL
    2. //查看到的是 charts 包文件,查出来的版本是 helm 的 Charts 包的版本
    3. [root@master ~]# helm inspect stable/mysql //查看其详细信息
    4. [root@master ~]# helm fetch stable/mysql //下载搜索到的包到本地
    5. [root@master templates]# helm install stable/mysql //在线安装这个 MySQL

    如在线安装失败,需要更换stable repo源

    1. [root@master1 ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts/
    2. "stable" has been added to your repositories
    3. 您在 /var/spool/mail/root 中有新邮件
    4. [root@master1 ~]# helm search mysql
    5. NAME CHART VERSION APP VERSION DESCRIPTION
    6. stable/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy to use op...
    7. stable/mysqldump 2.6.2 2.4.1 DEPRECATED! - A Helm chart to help backup MySQL databases...
    8. stable/prometheus-mysql-exporter 0.7.1 v0.11.0 DEPRECATED A Helm chart for prometheus mysql exporter wit...
    9. stable/percona 1.2.3 5.7.26 DEPRECATED - free, fully compatible, enhanced, open sourc...
    10. stable/percona-xtradb-cluster 1.0.8 5.7.19 DEPRECATED - free, fully compatible, enhanced, open sourc...
    11. stable/phpmyadmin 4.3.5 5.0.1 DEPRECATED phpMyAdmin is an mysql administration frontend
    12. stable/gcloud-sqlproxy 0.6.1 1.11 DEPRECATED Google Cloud SQL Proxy
    13. stable/mariadb 7.3.14 10.3.22 DEPRECATED Fast, reliable, scalable, and easy to use open...
    14. [root@master1 ~]# helm repo list
    15. NAME URL
    16. stable http://mirror.azure.cn/kubernetes/charts/

    在线安装

    1. [root@master1 ~]# helm install stable/mysql
    2. NAME: exegetical-lionfish
    3. LAST DEPLOYED: Thu Oct 5 15:44:37 2023
    4. NAMESPACE: default
    5. STATUS: DEPLOYED
    6. RESOURCES:
    7. ==> v1/ConfigMap
    8. NAME DATA AGE
    9. exegetical-lionfish-mysql-test 1 1s
    10. ==> v1/Deployment
    11. NAME READY UP-TO-DATE AVAILABLE AGE
    12. exegetical-lionfish-mysql 0/1 1 0 0s
    13. ==> v1/PersistentVolumeClaim
    14. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    15. exegetical-lionfish-mysql Pending 0s
    16. ==> v1/Pod(related)
    17. NAME READY STATUS RESTARTS AGE
    18. exegetical-lionfish-mysql-8ffb45b5f-pfjr6 0/1 Pending 0 0s
    19. ==> v1/Secret
    20. NAME TYPE DATA AGE
    21. exegetical-lionfish-mysql Opaque 2 1s
    22. ==> v1/Service
    23. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    24. exegetical-lionfish-mysql ClusterIP 10.96.248.54 3306/TCP 0s
    25. NOTES:
    26. MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
    27. exegetical-lionfish-mysql.default.svc.cluster.local
    28. To get your root password run:
    29. MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default exegetical-lionfish-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
    30. To connect to your database:
    31. 1. Run an Ubuntu pod that you can use as a client:
    32. kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
    33. 2. Install the mysql client:
    34. $ apt-get update && apt-get install mysql-client -y
    35. 3. Connect using the mysql cli, then provide your password:
    36. $ mysql -h exegetical-lionfish-mysql -p
    37. To connect to your database directly from outside the K8s cluster:
    38. MYSQL_HOST=127.0.0.1
    39. MYSQL_PORT=3306
    40. # Execute the following command to route the connection:
    41. kubectl port-forward svc/exegetical-lionfish-mysql 3306
    42. mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}

    3.部署HELM3(2to3方式)

     (1)下载helm3最新版本

    可以从rancher国内仓库下载helm3工具

    1. wget http://rancher-mirror.cnrancher.com/helm/v3.4.1/helm-v3.4.1-linux-amd64.tar.gz
    2. tar -zxvf helm-v3.4.1-linux-amd64.tar.gz
    3. cp linux-amd64/helm /usr/local/bin/helm3

    确认helm版本

    1. # helm3 version
    2. WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
    3. version.BuildInfo{Version:"v3.4.1", GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29", GitTreeState:"clean", GoVersion:"go1.14.11"}

    (2)安装helm-2to3插件

    参考:https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/

     第一种方法:(网页安装)

    helm3 plugin install https://github.com/helm/helm-2to3
    

    第二种方法:(源码安装)

    1. yum install -y git
    2. yum install -y go
    1. $ mkdir -p ${GOPATH}/src/github.com/helm
    2. $ cd $_
    3. $ git clone git@github.com:helm/helm-2to3.git
    4. $ cd helm-2to3
    5. $ make build
    6. $ export HELM_LINTER_PLUGIN_NO_INSTALL_HOOK=true
    7. $ helm plugin install /helm-2to3

    (3)查看helm3插件

    1. # helm3 plugin list
    2. WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
    3. NAME VERSION DESCRIPTION
    4. 2to3 0.7.0 migrate and cleanup Helm v2 configuration and releases in-place to Helm v3

    (4)迁移helm2配置至helm3

    迁移helm2部署的应用(确保helm2和helm3同时安装在同一台机器上)

    首先来检查可用的选项:

    1. $ helm3 2to3 convert -h
    2. migrate Helm v2 release in-place to Helm v3
    3. Usage:
    4. 2to3 convert [flags] RELEASE
    5. Flags:
    6. --delete-v2-releases v2 releases are deleted after migration. By default, the v2 releases are retained
    7. --dry-run simulate a convert
    8. -h, --help help for convert
    9. -l, --label string label to select tiller resources by (default "OWNER=TILLER")
    10. -s, --release-storage string v2 release storage type/object. It can be 'secrets' or 'configmaps'. This is only used with the 'tiller-out-cluster' flag (default "secrets")
    11. -t, --tiller-ns string namespace of Tiller (default "kube-system")
    12. --tiller-out-cluster when Tiller is not running in the cluster e.g. Tillerless

    列出Helm v2的releases,并从中挑选一个用于迁移测试:

    $ helm list

    为了保证安全,我们先使用–dry-run 标志:

    1. $ helm3 2to3 convert --dry-run postgres
    2. NOTE: This is in dry-run mode, the following actions will not be executed.
    3. Run without --dry-run to take the actions described below:
    4. Release "postgres" will be converted from Helm 2 to Helm 3.
    5. [Helm 3] Release "postgres" will be created.
    6. [Helm 3] ReleaseVersion "postgres.v1" will be created.

    执行真正的迁移工作:

    1. $ helm3 2to3 convert postgres
    2. Release "postgres" will be converted from Helm 2 to Helm 3.
    3. [Helm 3] Release "postgres" will be created.
    4. [Helm 3] ReleaseVersion "postgres.v1" will be created.
    5. [Helm 3] ReleaseVersion "postgres.v1" created.
    6. [Helm 3] Release "postgres" created.
    7. Release "postgres" was converted successfully from Helm 2 to Helm 3. Note: the v2 releases still remain and should be removed to avoid conflicts with the migrated v3 releases.

    检查是否迁移成功:

    1. $ helm list
    2. $ helm3 list

    如果还有其他应用,需要一个个迁移过来

    (6)清理helm2数据

    注意:由于我们并没有指定 --delete-v2-releases 标志,所以Helm v2 的postgres release仍然保留了下来,以后我们可以使用kubectl命令来删除它。

    迁移时直接删除helm2 release。

    helm3 2to3 convert  --delete-v2-releases

    当已经准备好了迁移你所有的releases时,可以在一个循环中自动运行它,以应用helm3 2to3 转换每一个Helm v2对应的release。

    注意,这一步将会删tiller pod以及helm2在主机上相关文件,执行之后无法还原,如果不确定可以先不执行

    helm3 2to3 cleanup
    

    4.部署HELM3(单独安装)

    (1)部署

    1. 1、安装 helm
    2. //下载二进制 Helm client 安装包
    3. https://github.com/helm/helm/tags
    4. tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
    5. mv linux-amd64/helm /usr/local/bin/helm
    6. helm version
    7. //命令补全
    8. source <(helm completion bash)
    9. 2、使用 helm 安装 Chart
    10. //添加常用的 chart 仓库,
    11. helm repo add bitnami https://charts.bitnami.com/bitnami
    12. helm repo add stable http://mirror.azure.cn/kubernetes/charts
    13. helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    14. helm repo add incubator https://charts.helm.sh/incubator
    15. //更新 charts 列表
    16. helm repo update
    17. helm repo list
    18. //查看 stable 仓库可用的 charts 列表
    19. helm search repo stable
    20. //删除 incubator 仓库
    21. helm repo remove incubator
    22. //查看 chart 信息
    23. helm show chart stable/mysql #查看指定 chart 的基本信息
    24. helm show all stable/mysql #获取指定 chart 的所有信息
    25. //安装 chart
    26. helm install my-redis bitnami/redis [-n default] #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace
    27. helm install bitnami/redis --generate-name #不指定 release 的名字时,需使用 –generate-name 随机生成一个名字
    28. //查看所有 release
    29. helm ls
    30. helm list
    31. //查看指定的 release 状态
    32. helm status my-redis
    33. //删除指定的 release
    34. helm uninstall my-redis

    (2)Helm 自定义模板 

    1. charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。
    2. //拉取 chart
    3. mkdir /opt/helm
    4. cd /opt/helm
    5. helm pull stable/mysql
    6. ls
    7. mysql-1.6.9.tgz
    8. tar xf mysql-1.6.9.tgz
    9. yum install -y tree
    10. tree mysql
    11. mysql
    12. ├── Chart.yaml
    13. ├── README.md
    14. ├── templates
    15. │   ├── configurationFiles-configmap.yaml
    16. │   ├── deployment.yaml
    17. │   ├── _helpers.tpl
    18. │   ├── initializationFiles-configmap.yaml
    19. │   ├── NOTES.txt
    20. │   ├── pvc.yaml
    21. │   ├── secrets.yaml
    22. │   ├── serviceaccount.yaml
    23. │   ├── servicemonitor.yaml
    24. │   ├── service.yaml
    25. │   ├── ingress.yaml
    26. │   └── tests
    27. │   ├── test-configmap.yaml
    28. │   └── test.yaml
    29. └── values.yaml
    30. 可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。
    31. #chart 是包含至少两项内容的helm软件包:
    32. (1)软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义
    33. (2)一个或多个模板,其中包含 Kubernetes 清单文件:
    34. ●NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
    35. ●deployment.yaml:创建 deployment 的资源清单文件
    36. ●service.yaml:为 deployment 创建 service 的资源清单文件
    37. ●ingress.yaml: 创建 ingress 对象的资源清单文件
    38. ●_helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用
    39. //创建自定义的 chart
    40. helm create nginx
    41. tree nginx
    42. nginx
    43. ├── charts
    44. ├── Chart.yaml
    45. ├── templates
    46. │   ├── deployment.yaml
    47. │   ├── _helpers.tpl
    48. │   ├── hpa.yaml
    49. │   ├── ingress.yaml
    50. │   ├── NOTES.txt
    51. │   ├── serviceaccount.yaml
    52. │   ├── service.yaml
    53. │   └── tests
    54. │   └── test-connection.yaml
    55. └── values.yaml
    56. cat nginx/templates/deployment.yaml
    57. #在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。
    58. 比如在 deployment.yaml 中定义的容器镜像:
    59. image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
    60. cat nginx/values.yaml | grep repository
    61. repository: nginx
    62. #以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。
    63. //修改 chart
    64. vim nginx/Chart.yaml
    65. apiVersion: v2
    66. name: nginx #chart名字
    67. description: A Helm chart for Kubernetes
    68. type: application #chart类型,application或library
    69. version: 0.1.0 #chart版本
    70. appVersion: 1.16.0 #application部署版本
    71. vim nginx/values.yaml
    72. replicaCount: 1
    73. image:
    74. repository: nginx
    75. pullPolicy: IfNotPresent
    76. tag: "latest" #设置镜像标签
    77. imagePullSecrets: []
    78. nameOverride: ""
    79. fullnameOverride: ""
    80. serviceAccount:
    81. create: true
    82. annotations: {}
    83. name: ""
    84. podAnnotations: {}
    85. podSecurityContext: {}
    86. # fsGroup: 2000
    87. securityContext: {}
    88. # capabilities:
    89. # drop:
    90. # - ALL
    91. # readOnlyRootFilesystem: true
    92. # runAsNonRoot: true
    93. # runAsUser: 1000
    94. service:
    95. type: ClusterIP
    96. port: 80
    97. ingress:
    98. enabled: true #开启 ingress
    99. className: ""
    100. annotations: {}
    101. # kubernetes.io/ingress.class: nginx
    102. # kubernetes.io/tls-acme: "true"
    103. hosts:
    104. - host: www.david.com #指定ingress域名
    105. paths:
    106. - path: /
    107. pathType: Prefix #指定ingress路径类型
    108. tls: []
    109. # - secretName: chart-example-tls
    110. # hosts:
    111. # - chart-example.local
    112. resources:
    113. limits:
    114. cpu: 100m
    115. memory: 128Mi
    116. requests:
    117. cpu: 100m
    118. memory: 128Mi
    119. autoscaling:
    120. enabled: false
    121. minReplicas: 1
    122. maxReplicas: 100
    123. targetCPUUtilizationPercentage: 80
    124. # targetMemoryUtilizationPercentage: 80
    125. nodeSelector: {}
    126. tolerations: []
    127. affinity: {}
    128. //打包 chart
    129. helm lint nginx #检查依赖和模版配置是否正确
    130. helm package nginx #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz
    131. //部署 chart
    132. helm install nginx ./nginx --dry-run --debug #使用 --dry-run 参数验证 Chart 的配置,并不执行安装
    133. helm install nginx ./nginx -n default #部署 chart,release 版本默认为 1
    134. 或者
    135. helm install nginx ./nginx-0.1.0.tgz
    136. #可根据不同的配置来 install,默认是 values.yaml
    137. helm install nginx ./nginx -f ./nginx/values-prod.yaml
    138. helm ls
    139. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    140. nginx default 1 2023-10-10 09:58:45.891472283 +0800 CST deployed nginx-0.1.0 1.16.0
    141. kubectl get pod,svc
    142. NAME READY STATUS RESTARTS AGE
    143. pod/nginx-7d9c8bf85c-dwf9b 1/1 Running 0 34s
    144. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    145. service/kubernetes ClusterIP 10.96.0.1 443/TCP 92d
    146. service/nginx ClusterIP 10.96.155.244 80/TCP 34s
    147. #部署 ingress
    148. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
    149. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
    150. kubectl apply -f mandatory.yaml
    151. kubectl apply -f service-nodeport.yaml
    152. kubectl get pod,svc -n ingress-nginx
    153. NAME READY STATUS RESTARTS AGE
    154. pod/nginx-ingress-controller-54b86f8f7b-ltltd 1/1 Running 0 50s
    155. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    156. service/ingress-nginx NodePort 10.96.127.18 80:30912/TCP,443:31732/TCP 16s
    157. kubectl get ingress
    158. NAME CLASS HOSTS ADDRESS PORTS AGE
    159. nginx www.david.com 10.96.127.18 80 10m
    160. vim /etc/hosts
    161. .....
    162. 192.168.204.182 www.david.com
    163. curl http://www.david.com:31732
    164. //修改为 NodePort 访问后,升级
    165. vim nginx/values.yaml
    166. service:
    167. type: NodePort
    168. port: 80
    169. nodePort: 30080
    170. ingress:
    171. enabled: false
    172. vim nginx/templates/service.yaml
    173. apiVersion: v1
    174. kind: Service
    175. metadata:
    176. name: {{ include "nginx.fullname" . }}
    177. labels:
    178. {{- include "nginx.labels" . | nindent 4 }}
    179. spec:
    180. type: {{ .Values.service.type }}
    181. ports:
    182. - port: {{ .Values.service.port }}
    183. targetPort: http
    184. protocol: TCP
    185. name: http
    186. nodePort: {{ .Values.service.nodePort }} #指定 nodePort
    187. selector:
    188. {{- include "nginx.selectorLabels" . | nindent 4 }}
    189. 升级 release,release 版本加 1
    190. helm upgrade nginx nginx
    191. kubectl get svc
    192. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    193. kubernetes ClusterIP 10.96.0.1 443/TCP 92d
    194. nginx NodePort 10.96.155.244 80:30080/TCP 21m
    195. curl 192.168.204.182:30080
    196. //回滚
    197. #根据 release 版本回滚
    198. helm history nginx #查看 release 版本历史
    199. REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
    200. 1 Tue Oct 10 09:58:45 2023 superseded nginx-0.1.0 1.16.0 Install complete
    201. 2 Tue Oct 10 10:19:33 2023 deployed nginx-0.1.0 1.16.0 Upgrade complete
    202. helm rollback nginx 1 #回滚 release 到版本1
    203. helm history nginx #nginx release 已经回滚到版本 1
    204. REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
    205. 1 Tue Oct 10 09:58:45 2023 superseded nginx-0.1.0 1.16.0 Install complete
    206. 2 Tue Oct 10 10:19:33 2023 superseded nginx-0.1.0 1.16.0 Upgrade complete
    207. 3 Tue Oct 10 10:24:39 2023 deployed nginx-0.1.0 1.16.0 Rollback to 1
    208. #通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。
    209. //在命令行使用 --set 指定参数来部署(install,upgrade)release
    210. #注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。
    211. helm upgrade nginx nginx --set image.tag='1.15'

    (3)Helm 仓库

    helm 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。
     

    1. //安装 harbor
    2. #上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
    3. cd /opt
    4. cp docker-compose /usr/local/bin/
    5. chmod +x /usr/local/bin/docker-compose
    6. tar zxf harbor-offline-installer-v1.9.1.tgz
    7. cd harbor/
    8. vim harbor.yml
    9. hostname: 192.168.204.30
    10. harbor_admin_password: Harbor12345 #admin用户初始密码
    11. data_volume: /data #数据存储路径,自动创建
    12. chart:
    13. absolute_url: enabled #在chart中启用绝对url
    14. log:
    15. level: info
    16. local:
    17. rotate_count: 50
    18. rotate_size: 200M
    19. location: /var/log/harbor #日志路径
    20. #安装带有 Clair service 和 chart 仓库服务的 Harbor
    21. ./install.sh --with-clair --with-chartmuseum
    22. //安装 push 插件
    23. #在线安装
    24. helm plugin install https://github.com/chartmuseum/helm-push
    25. #离线安装
    26. wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
    27. mkdir ~/.local/share/helm/plugins/helm-push
    28. tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
    29. helm repo ls
    30. #登录 Harbor WEB UI 界面,创建一个新项目
    31. 浏览器访问:http://192.168.204.30 ,默认的管理员用户名和密码是 admin/Harbor12345
    32. 点击 “+新建项目” 按钮
    33. 填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目
    34. #添加仓库
    35. helm repo add harbor http://192.168.204.30/chartrepo/chart_repo --username=admin --password=Harbor12345
    36. #注:这里的 repo 的地址是/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
    37. #推送 chart 到 harbor 中
    38. cd /opt/helm
    39. helm push nginx harbor
    40. #查看 chart_repo 项目中的 Helm Charts

    二、实验

    1.部署 HELM2

     (1)安装 helm 客户端

    (2)安装 Tiller server(需要创建授权用户)

    使用第二种方法(k8s 1.16以上版本)

    编辑 pod 的 yaml 文件,将其使用的镜像改为国内阿里云的

    修改 spec 字段的 image 指定的镜像如下:

    tiller 的 pod 正常运行

    (3)配置 helm 仓库

    (4)测试 helm 是否可以正常使用

    搜索 MySQL,查看到的是 charts 包文件,查出来的版本是 helm 的 Charts 包的版本

    查看其详细信息

    下载搜索到的包到本地

    在线安装这个 MySQL,如遇到报错需要更换stable repo源

    安装

    2.部署HELM3(2to3方式)

    (1)下载helm3最新版本

    可以从rancher国内仓库下载helm3工具

    确认helm版本

    (2)安装helm-2to3插件

    采用第二种方法:(源码安装)


     

    (3)更新repo源

    查看repo源

    3.部署HELM3(单独安装)

     (1)部署

    安装 helm

    命令补全

    使用 helm 安装 Chart

    添加常用的 chart 仓库

    更新 charts 列表

    查看 stable 仓库可用的 charts 列表

    删除 incubator 仓库

    查看 chart 信息:

    查看指定 chart 的基本信息


      获取指定 chart 的所有信息

    安装 chart

    指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace


     

    不指定 release 的名字时,需使用 –generate-name 随机生成一个名字

    查看所有 release


    查看指定的 release 状态

    删除指定的 release

    (2)Helm 自定义模板 

    拉取 chart

    解压

    安装

    查看结构

    1. 可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。
    2. #chart 是包含至少两项内容的helm软件包:
    3. (1)软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义
    4. (2)一个或多个模板,其中包含 Kubernetes 清单文件:
    5. ●NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
    6. ●deployment.yaml:创建 deployment 的资源清单文件
    7. ●service.yaml:为 deployment 创建 service 的资源清单文件
    8. ●ingress.yaml: 创建 ingress 对象的资源清单文件
    9. ●_helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

    创建自定义的 chart

    在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。

    比如在 deployment.yaml 中定义的容器镜像:

    以下变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

    修改 chart

    设置镜像标签

    开启 ingress、指定ingress域名、指定ingress路径类型

    ③ 打包 chart

    检查依赖和模版配置是否正确

    打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz

    ④部署 chart

    使用 --dry-run 参数验证 Chart 的配置,并不执行安装

    部署 chart,release 版本默认为 1

    查看信息

    ⑤ 部署 ingress

    下载

    创建资源

    查看信息

    修改地址

    测试

    修改为 NodePort 访问后,升级

    修改

    指定 nodePort

    添加

    ⑦ 升级 release,release 版本加 1

    查看svc

    测试

    ⑧ 回滚

    查看 release 版本历史

    回滚 release 到版本1

    nginx release 已经回滚到版本 1

    (3)Helm 仓库

    helm 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。
    上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录

    添加docker-compose命令

    安装 harbor

    在chart中启用绝对url

    数据库存储路径,自动创建

    安装带有 Clair service 和 chart 仓库服务的 Harbor

    ③ 离线安装 push 插件

    查看

    登录 Harbor WEB UI 界面

    ⑥ 创建一个新项目

    添加仓库

    注:这里的 repo 的地址是/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。

    推送 chart 到 harbor 中

    ⑨ 查看 chart_repo 项目中的 Helm Charts

    三、问题

    1.api版本过期

    (1)问题

    (2)原因分析

    api已经过期了,因为现在使用的是1.20版本,有的api版本已经过期,需要修改下
     

    (3)解决方法

    1. rbac.authorization.k8s.io/v1beta1 
    2. 改为:
    3. rbac.authorization.k8s.io/v1

    修改前:

    修改后:

    成功:

    2.helm初始化报错

    (1)报错

    k8s主节点部署helm(版本:v2.14.3),初始化报错

    (2)原因分析

    第一种原因:

    因访问权限原因导致

    第二种原因:

    仓库地址变更

    1. https://kubernetes-charts.storage.googleapis.com/index.yaml 已经弃用,
    2. 新的仓库是:
    3. https://charts.helm.sh/stable

    第三种原因:

    参考:Helm · Kubernetes指南 (gitbooks.io)

    对于 Kubernetes v1.16.0 以上的版本,有可能会碰到 Error: error installing: the server could not find the requested resource 的错误。这是由于 extensions/v1beta1 已经被 apps/v1 替代。
     

    (3)解决方法

    第一种方法:

    创建丢失文件,再次执行helm init 即可

    echo "" > /root/.helm/repository/repositories.yaml

    第二种方法:

    修改仓库地址

    1. #tiller服务端
    2. helm init --stable-repo-url=https://charts.helm.sh/stable --service-account=tiller
    3. #client客户端
    4. helm init --stable-repo-url=https://charts.helm.sh/stable --client-only

    第三种方法:

    1. kubectl create serviceaccount --namespace kube-system tiller
    2. kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    3. helm init --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed 's@apiVersion: extensions/v1beta1@apiVersion: apps/v1@' | kubectl apply -f -

    这里采用第三种方法:

    3.pod状态为ImagePullBackOff

    (1)报错

    (2)原因分析

    查看pod的事件

    1. [root@master2 ~]# kubectl describe pod tiller-deploy-54d45574c4-zdt72 -n kube-system
    2. Name: tiller-deploy-54d45574c4-zdt72
    3. Namespace: kube-system
    4. Priority: 0
    5. Node: node1/192.168.204.182
    6. Start Time: Thu, 05 Oct 2023 14:43:44 +0800
    7. Labels: app=helm
    8. name=tiller
    9. pod-template-hash=54d45574c4
    10. Annotations: cni.projectcalico.org/podIP: 10.244.166.148/32
    11. cni.projectcalico.org/podIPs: 10.244.166.148/32
    12. Status: Pending
    13. IP: 10.244.166.148
    14. IPs:
    15. IP: 10.244.166.148
    16. Controlled By: ReplicaSet/tiller-deploy-54d45574c4
    17. Containers:
    18. tiller:
    19. Container ID:
    20. Image: gcr.io/kubernetes-helm/tiller:v2.14.3
    21. Image ID:
    22. Ports: 44134/TCP, 44135/TCP
    23. Host Ports: 0/TCP, 0/TCP
    24. State: Waiting
    25. Reason: ImagePullBackOff
    26. Ready: False
    27. Restart Count: 0
    28. Liveness: http-get http://:44135/liveness delay=1s timeout=1s period=10s #success=1 #failure=3
    29. Readiness: http-get http://:44135/readiness delay=1s timeout=1s period=10s #success=1 #failure=3
    30. Environment:
    31. TILLER_NAMESPACE: kube-system
    32. TILLER_HISTORY_MAX: 0
    33. Mounts:
    34. /var/run/secrets/kubernetes.io/serviceaccount from tiller-token-fj88w (ro)
    35. Conditions:
    36. Type Status
    37. Initialized True
    38. Ready False
    39. ContainersReady False
    40. PodScheduled True
    41. Volumes:
    42. tiller-token-fj88w:
    43. Type: Secret (a volume populated by a Secret)
    44. SecretName: tiller-token-fj88w
    45. Optional: false
    46. QoS Class: BestEffort
    47. Node-Selectors:
    48. Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
    49. node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    50. Events:
    51. Type Reason Age From Message
    52. ---- ------ ---- ---- -------
    53. Normal Scheduled 15m default-scheduler Successfully assigned kube-system/tiller-deploy-54d45574c4-zdt72 to node1
    54. Normal Pulling 12m (x4 over 15m) kubelet Pulling image "gcr.io/kubernetes-helm/tiller:v2.14.3"
    55. Warning Failed 12m (x4 over 14m) kubelet Failed to pull image "gcr.io/kubernetes-helm/tiller:v2.14.3": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
    56. Warning Failed 12m (x4 over 14m) kubelet Error: ErrImagePull
    57. Normal BackOff 5m7s (x33 over 14m) kubelet Back-off pulling image "gcr.io/kubernetes-helm/tiller:v2.14.3"
    58. Warning Failed 8s (x53 over 14m) kubelet Error: ImagePullBackOff
    59. [root@master2 ~]#

    获取 gcr.io/kubernetes-helm/tiller:v2.14 镜像失败。

    (3)解决方法

    修改前:

    修改后:

    成功:

    4.helm 命令显示 no repositories to show 的错误

    (1)报错

    (2)原因分析

    没有添加任何 Helm 仓库。

    (3)解决方法

    添加一个 Helm 仓库,可以使用以下命令添加官方的 Helm 仓库:

    helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    
    helm repo add stable https://charts.helm.sh/stable
    

    5.Helm安装报错

    (1)报错

    (2)原因分析

    ali的非最新版本,有的是手动改,有的是用shell改,根本原因还是chart源没有实时更新以匹配k8s版本。

    (3)解决方法

    更换stable repo源,这里使用的是azure的:

    helm repo add stable http://mirror.azure.cn/kubernetes/charts/

    成功:

    6.git命令报错

    (1)报错

    当服务器git clone远程仓库的时候出现-bash: git: 未找到命令

    (2)原因分析

    需要安装git

    (3)解决方法

    安装git

    yum install -y git

    再执行git clone

    7.CentOS 7 下git clone配置使用

    (1)报错

    (2)原因分析

    未认证授权

    (3)解决方法

    检查git是否安装和配置用户名和邮箱

    git --version
    
    1. git config --global user.name “你的名称”
    2. git config --global user.email “你的邮箱”
    3. git config --global user.password “xxxxx密码”

    查看配置

    git config --list
    

    检查是否已安装ssh key

    1. $ cd ~/.ssh
    2. $ ls

    检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在,那么你可以跳过步骤2,直接进入步骤3

     创建一个ssh key

    $ ssh-keygen -t rsa
    

    一路回车,执行完后再检查就发现已经有了 id_rsa.pub 或 id_dsa.pub文件

    添加ssh key到github上

    使用cat命令查看id_rsa.pub文件内容,并复制下来

    $ cat id_rsa.pub
    

    登录github账户,点击右上角头像 - setting - SSH and GPG keys - New SSH key

    测试 SSH key

    ssh -T git@github.com
    

    git clone@git

    git clone git@github.com:helm/helm-2to3.git

    成功:

    8.签名密钥(signing keys)和认证密钥(authentication keys)的区别

    (1)问题

    登录github账户,点击右上角头像 - setting - SSH and GPG keys - New SSH key,出现Key type选项,共有2个:

    Authentication key 和Signing Key

    (2)分析

    1. The difference between signing keys and authentication keys is that :
    2. • signing keys can be used to sign Git commits
    3. • authentication keys can be used to access repositories.
    4. • If you add a key as only one type, then it can be used only for that purpose, but the same key may be added for both.

    翻译为:

    1. 1. 签名密钥用于签名 Git 提交(commit)和标签(tag),用于验证提交者身份。
    2. 2. 认证密钥用于访问仓库(repository),实现免密码 git 操作。
    3. 如果只添加一种类型的密钥,那么它只能用于对应的用途:
    4. • 只添加签名密钥,可以用于签名提交,但不能用于 SSH 访问
    5. • 只添加认证密钥,可以用于 SSH 访问,但不能用于签名提交
    6. • 但是,同一个密钥可以同时添加为两种类型,既可用于签名提交,也可用于 SSH 访问。

    (3)小结

    1. 1. 签名密钥用于验证 Git 操作的身份
    2. 2. 认证密钥用于访问 Git 仓库和免密码操作
    3. 3. 同一把密钥可以同时用作签名密钥和认证密钥
    4. 4. 添加密钥类型决定了它可以用于的用途

    9.make build 报错

    (1)报错

    (2)原因分析

    未安装go

     (3)解决方法

    安装go

    yum install -y go
    

    成功:

    10.查看helm的plugin路径

    (1)问题

    无法确认helm安装插件位置

     helm plugin install /helm-2to3

    (2)分析

    helm命令查询

    (3)解决方法

    1. #helm2命令
    2. helm home
    3. /root/.helm
    4. #helm3命令
    5. helm3 env
    6. ……
    7. HELM_PLUGINS="/root/.local/share/helm/plugins"
    8. ……

    Helm2命令查询

    Helm3命令查询

    11.go 语言 proxy.golang.org timeout 无法访问

    (1)报错

    (2)原因分析

    go包管理网址无法访问,默认使用的是proxy.golang.org,在国内无法访问

    (3)解决方法

    换一个国内能访问的代理地址:https://goproxy.cn

    go env -w GOPROXY=https://goproxy.cn

    查看go环境

    成功:

    12.Go mod问题

    (1)报错

    (2)原因分析

    这个通常是因为 Go 的版本不同导致的,

    (3)解决方法

    在使用 Go 1.13 以上的版本,通过 GOSUMDB 的环境变量调整就可以了。

    1. export GOSUMDB=off
    2. go mod download

    13.使用 --dry-run 参数验证 Chart 的配置报错

    (1)报错

    (2)原因分析

    service “nginx”已存在

    Deployment "nginx" 已存在

    (3)解决方法

    查看service

    删除service

    查看deployment

    删除deployment

    成功:

    13.新增Harbor服务器出现网络异常

    (1)报错

    重启机器后,网络异常报:Failed to start LSB: Bring up/down networking

    重启网络服务

    1. #重启网络:注意CentOS6需要使用service network restart命令
    2. [root@localhost ~]# systemctl restart network
    3. Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
    4. #执行'systemctl status network.service'进一步排查
    5. [root@localhost ~]# systemctl status network.service
    6. ● network.service - LSB: Bring up/down networking
    7. Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
    8. Active: failed (Result: exit-code) since 二 2023-10-10 11:05:55 CST; 3s ago
    9. Docs: man:systemd-sysv-generator(8)
    10. Process: 2513 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=1/FAILURE)
    11. 10月 10 11:05:55 localhost.localdomain network[2513]: RTNETLINK answers: File exists
    12. 10月 10 11:05:55 localhost.localdomain network[2513]: RTNETLINK answers: File exists
    13. 10月 10 11:05:55 localhost.localdomain network[2513]: RTNETLINK answers: File exists
    14. 10月 10 11:05:55 localhost.localdomain network[2513]: RTNETLINK answers: File exists
    15. 10月 10 11:05:55 localhost.localdomain network[2513]: RTNETLINK answers: File exists
    16. 10月 10 11:05:55 localhost.localdomain network[2513]: RTNETLINK answers: File exists
    17. 10月 10 11:05:55 localhost.localdomain systemd[1]: network.service: control process exited, code=exited...s=1
    18. 10月 10 11:05:55 localhost.localdomain systemd[1]: Failed to start LSB: Bring up/down networking.
    19. 10月 10 11:05:55 localhost.localdomain systemd[1]: Unit network.service entered failed state.
    20. 10月 10 11:05:55 localhost.localdomain systemd[1]: network.service failed.
    21. Hint: Some lines were ellipsized, use -l to show in full.

    (2)原因分析

    未禁用NetworkManager与防火墙

    (3)解决方法

    禁用NetworkManager

    1. #关闭NetworkManager服务,重启机器后会失效
    2. [root@localhost ~]# systemctl stop NetworkManager
    3. #永久关闭NetworkManager服务,重启机器后不会失效
    4. [root@localhost ~]# systemctl disable NetworkManager

    关闭防火墙

    1. # 查看防火墙状态
    2. [root@localhost ~]# firewall-cmd --state
    3. running ---运行中,即开启状态
    4. # 关闭防火墙
    5. [root@localhost ~]# systemctl stop firewalld
    6. # 查看是否关闭成功
    7. [root@localhost ~]# firewall-cmd --state
    8. not running ---不在运行中,即关闭状态

    关闭selinux

    1. #查看selinux状态
    2. [root@localhost ~]# getenforce
    3. Enforcing ---表示开启状态
    4. # 临时关闭
    5. [root@localhost ~]# setenforce 0 ---立即生效,重启后失效
    6. # 永久关闭,修改selinux配置文件。 ---重启后生效
    7. [root@localhost ~]# vim /etc/selinux/config
    8. ...
    9. # 将SELINUX的值修改为disabled
    10. SELINUX=disabled
    11. ...
    12. #后者一句命令实现
    13. [root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    14. # 关闭后再次查看是否关闭成功
    15. [root@localhost ~]# getenforce
    16. Disabled ---表示关闭状态

    重启机器&重启网络

    1. #重启机器
    2. [root@localhost ~]# reboot
    3. ...
    4. # 再次重启网络,无报错
    5. [root@localhost ~]# systemctl restart network
    6. # 查看网络是否重启成功
    7. [root@localhost ~]# ip a
    8. 1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    9. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    10. inet 127.0.0.1/8 scope host lo
    11. valid_lft forever preferred_lft forever
    12. inet6 ::1/128 scope host
    13. valid_lft forever preferred_lft forever
    14. 2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
    15. link/ether 00:0c:29:18:e8:df brd ff:ff:ff:ff:ff:ff
    16. inet 192.168.204.30/24 brd 192.168.204.255 scope global ens33
    17. valid_lft forever preferred_lft forever
    18. inet6 fe80::20c:29ff:fe18:e8df/64 scope link
    19. valid_lft forever preferred_lft forever
    20. ...

    14.安装Harbor报错

    (1)报错

    (2)原因分析

    需要安装docker(17.06.0)以上版本

    (3) 解决方法

    安装docker

    成功:

    四、总结

    HELM有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。

    Charts是创建 Kubernetes 应用实例的信息集合,也就是一个 helm 的程序包,它包含了运行一个 k8s 应用所有需要的镜像、依赖关系和资源定义等,必要时还会包含 Service 资源定义,它类似于 yum 的 rpm 文件。

    HELM v3版本与v2版本的架构变化

    1. 1. 最大的改动就是移除了 Tiller 组件,所有功能都通过 Helm CLI 与 ApiServer 直接交互。
    2. 2. release在v3版本中可以实现不同的namespace空间中重用;
    3. 3. 可以将chart推入到docker仓库中。

    HELM3特性:

    1. 一、新的功能
    2. 1.版本以新格式存储
    3. 2.没有群集内(tiller)组件
    4. 3.Helm 3包括对新版Helm图表的支持(图表v2)
    5. 4.Helm 3还支持库图表-图表主要用作其他图表的资源。
    6. 5.用于在OCI注册表中存储Helm图表的实验支持(例如Docker Distribution)可以进行试。
    7. 6.现在在升级Kubernetes资源时将应用3向战略合并补丁。
    8. 7.现在可以根据JSON模式验证图表提供的值
    9. 8.为了使Helm更安全,可用和健壮,已进行了许多小的改进。
    10. 二、 Helm3的内部实现已从 Helm2发生了很大变化,使其与 Helm2不兼容
    11. 该版本主要变化如下
    12. 1. 最明显的变化是 Tiller的删除
    13. 2. Release 不再是全局资源,而是存储在各自命名空间内
    14. 3. Values 支持 JSON Schema校验器,自动检查所有输入的变量格式
    15. 4. 移除了用于本地临时搭建 Chart Repository 的 helm serve 命令。
    16. 5. helm install 不再默认生成一个 Release 的名称,除非指定了 --generate-name。
    17. 6. Helm CLI 个别更名,但旧的命令当前仍能使用。
    18. (1) helm delete更名为 helm uninstall
    19. (2) helm inspect更名为 helm show
    20. (3) helm fetch更名为 helm pull
  • 相关阅读:
    java计算机毕业设计红色主题旅游网站MyBatis+系统+LW文档+源码+调试部署
    玩转 CMS
    pool = multiprocessing.Pool()报错:module object has no attribute Pool
    RecyclerView的item布局预览显示是一行两块 运行后显示了一行一块,怎么回事
    深入Linux内核理解epoll事件轮询机制
    机器学习——机器学习概述
    MySQL内核查询优化规则
    【Redis】Redis Cluster-集群故障转移
    vite打包流程和原理
    拥塞控制 计算机网络
  • 原文地址:https://blog.csdn.net/cronaldo91/article/details/133578560