云原生Kubernetes:简化K8S应用部署工具Helm
目录
一、理论
1.HELM
2.部署HELM2
3.部署HELM3
二、实验
1.部署 HELM2
2.部署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问题
四、总结
一、理论
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)创建新的 charts(图表)
2)将 charts 打包成 tgz 文件
3)与 chart 仓库交互
4)安装和卸载 Kubernetes 的应用
5)管理使用 Helm 安装的 charts 的生命周期
(2)架构
Helm 架构由 Helm 客户端、Tiller 服务器端和 Chart 仓库所组成;Tiller 部署在 Kubernetes 中,Helm 客户端从 Chart 仓库中获取 Chart 安装包,并将其安装部署到 Kubernetes 集群中。
(3)重要概念
1)Charts:是创建 Kubernetes 应用实例的信息集合,也就是一个 helm 的程序包,它包含了运行一个 k8s 应用所有需要的镜像、依赖关系和资源定义等,必要时还会包含 Service 资源定义,它类似于 yum 的 rpm 文件
2)Repository:Chart 仓库,用于集中存储和分发 Charts。
3)Config:应用程序实例化安装时运行使用的配置信息
4)Release:chart 的运行实例,包含特定的 config
(4)组件
在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器。
① helm 客户端
它是一个供终端用户使用的命令行工具
客户端负责如下的工作:
1)本地 chart 开发
2)管理仓库
3)与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)
② Tiller 服务器
Tiller 是 helm 的服务器端,一般运行于 kubernetes 集群之上,定义 tiller 的 ServiceAccount,并通过 ClusterRoleBinding 将其绑定至集群管理员角色 cluster-admin,从而使得它拥有集群级别所有的最高权限
Tiller 服务器负责如下的工作:
1)监听来自于 Helm 客户端的请求
2)组合 chart 和配置来构建一个发布
3)在 Kubernetes 中安装,并跟踪后续的发布
4)通过与 Kubernetes 交互,更新或者 chart
(5)版本
区别:
Helm2是C/S架构,主要分为客户端helm和服务端Tiller; 与之前版本相同。
Helm3同样在Release页面提供了预编译好的二进制文件。
差别在于原先的二进制包下载下来你会看到helm和tiller 。而Helm3则只有helm的存在了。Tiller主要用于在Kubernetes集群中管理各种应用发布的版本,在Helm3中移除了Tiller, 版本相关的数据直接存储在了Kubernetes中。
Helm2的问题:
Helm2的一个主要问题是需要在k8s集群里面运行一个服务端,而这就需要把tiller的端口暴露给外界,会产生安全隐患。在helm 2中引入的tiller主要是当时k8s还没有RBAC机制,所以就引入了服务端tiller。而后来k8s的功能相应完善,加入了RBAC和CRD等,都使得tiller这个东西显得多余。
Helm3:
helm3只有一个客户端,没有服务端,所以安装起来很方便,把相应的程序下下来即可,不需要helm init安装了。相对于helm2,helm3有几大特性:
1)移除了tiller
2)支持分布式helm hub, 有了它就可以在很多时候不需要手动添加非官方repo了,例如helm3 search hub <package name>
3)为chart输入值进行json schema验证。
4)可以给helm charts添加test了,通过helm test <release>就能针对部署的应用跑一些tests。
5)部署的时候release name必须指定了,helm2的时候不指定会自动生成一个。
6)删除的时候不需要--purge了,删了就是删了。
Helm2到Helm3的迁移:
helm官方提供了一个小插件,帮助我们把已经部署的helm2应用迁移到helm3上。安装插件
$ helm3 plugin install https://github.com/helm/helm-2to3
迁移helm2的配置,例如仓库
$ helm3 2to3 move config
迁移helm2部署的应用(确保helm2和helm3同时安装在同一台机器上)
$ helm3 2to3 convert <release-name> --delete-v2-releases
(6)HELM2常用命令
#查看版本
helm version
#查看当前安装的charts
helm list
#查询 charts
helm search nginx
#安装charts
helm install --name nginx --namespace test aliyun/nginx
#查看charts状态
helm status nginx
#删除charts
helm delete --purge nginx
#增加repo
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#更新repo仓库资源
helm repo update
#创建charts
helm create helm_charts
#测试charts语法
helm lint
#打包charts
cd helm_charts && helm package ./
#查看生成的yaml文件
helm template helm_charts-0.1.1.tgz
#更新image
helm upgrade --set image.tag=‘v2019-05-09-18-48-40’ study-api-en-oral myharbor/study-api-en-oral
#回滚relase
helm hist study-api-en-oral
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中为新增的命令。
说明如下:
env是对被删除的命令home的强化
pull是对被删除的命令fetch的替换
show是对被删除的命令inspect的替换
help命令本身在Helm 2时代就可以使用,只是helm --help里面没有显示,算是文档自包含的强化
uninstall是功能特性的增强
(10)Helm 3:命令说明发生变化
由于Tiller的移除,版本显示命令helm version的表述从显示client/server的版本信息变成了显示client的版本信息,类似的发生变化的共有5条命令,到底是文档的变化还是功能性的反映,在后续的文章中将继续通过实例进行进一步的说明。
(11)Helm版本支持策略
支持的版本
Helm的版本用 x.y.z 描述,x是主版本,y是次版本,z是补丁版本,遵循 语义化版本 术语。Helm项目维护了一个针对最近次要版本的发布分支。适当的修复,包括安全修复、从发布分支中的cherry-pick, 视严重程度而定。更多细节请查看 Helm版本策略。
可支持的版本偏差
当一个Helm的新版本发布时,它是针对Kubernetes的一个特定的次版本编译的。比如,Helm 3.0.0 与Kubernetes的1.16.2的客户端版本交互,一次可以兼容Kubernetes 1.16。从Helm 3开始,Helm 编译时假定与针对n-3版本的Kubernetes兼容。由于Helm 2对Kubernetes次版本变更的支持稍微严格一点, 则假定与Kubernetes的n-1版本兼容。例如,如果在使用一个针对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。不推荐将Helm用于比编译它所依赖的版本更高的Kubernetes版本,因为Helm并没有做出任何向前兼容的保证。如果选择了一个Kubernetes版本不支持的Helm,需自负风险。
Helm版本与K8S集群兼容:
2.部署HELM2
(1)安装 helm 客户端
[root@master ~]# wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
[root@master ~]# tar zxvf helm-v2.14.3-linux-amd64.tar.gz
[root@master ~]# mv linux-amd64/helm /usr/local/bin/
[root@master ~]# chmod +x /usr/local/bin/helm
[root@master ~]# echo 'source <(helm completion bash)' >> /etc/profile
[root@master ~]# . /etc/profile
(2)安装 Tiller server(需要创建授权用户)
第一种方法:(K8s1.16以下版本)
#创建授权用户
[root@master ~]# vim tiller-rbac.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
[root@master ~]# kubectl apply -f tiller-rbac.yaml
[root@master ~]# helm init --service-account=tiller
[root@master ~]# kubectl get pod -n kube-system | grep tiller
[root@master ~]# kubectl edit pod tiller-deploy-8557598fbc-tvfsj -n kube-system
//编辑 pod 的 yaml 文件,将其使用的镜像改为国内阿里云的,默认是 Google 的镜像,下载不下来
//修改 spec 字段的 image 指定的镜像如下:image: gcr.io/kubernetes-helm/tiller:v2.14.3
//修改如下:image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
//修改后,保存退出即可,它会去自动下载新镜像(如果没有自动下载,就想办法吧,比如说在 tiller 容器所在的节点手动下载下来镜像,然后重启该节点的 kubelet,或重启该容器)
[root@master ~]# kubectl get pod -n kube-system | grep tiller
//只要保证 tiller 的 pod 正常运行即可
tiller-deploy-8557598fbc-m986t 1/1 Running 0 7m54s
第二种方法: (k8s1.16以上版本)
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
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 -
[root@master ~]# kubectl get pod -n kube-system | grep tiller
[root@master ~]# kubectl edit pod tiller-deploy-8557598fbc-tvfsj -n kube-system
//编辑 pod 的 yaml 文件,将其使用的镜像改为国内阿里云的,默认是 Google 的镜像,下载不下来
//修改 spec 字段的 image 指定的镜像如下:image: gcr.io/kubernetes-helm/tiller:v2.14.3
//修改如下:image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
//修改后,保存退出即可,它会去自动下载新镜像(如果没有自动下载,就想办法吧,比如说在 tiller 容器所在的节点手动下载下来镜像,然后重启该节点的 kubelet,或重启该容器)
[root@master ~]# kubectl get pod -n kube-system | grep tiller
//只要保证 tiller 的 pod 正常运行即可
tiller-deploy-54d45574c4-zdt72 1/1 Running 0 7m54s
(3)配置 helm 仓库
[root@master ~]# helm repo list //查看其仓库信息
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
//如上,默认是 Google,在国外,速度特别慢
local http://127.0.0.1:8879/charts
//执行下面命令,更改为国内阿里云的仓库
[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@master ~]# helm repo list //再次查看,可以发现更改生效了
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
[root@master ~]# helm repo update //更新一下 helm 仓库
[root@master ~]# helm version //查看 helm 版本信息,必须保证可以查看出来 client 和 server,才可正常使用 helm
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
(4)测试 helm 是否可以正常使用
[root@master ~]# helm search mysql //搜索 MySQL
//查看到的是 charts 包文件,查出来的版本是 helm 的 Charts 包的版本
[root@master ~]# helm inspect stable/mysql //查看其详细信息
[root@master ~]# helm fetch stable/mysql //下载搜索到的包到本地
[root@master templates]# helm install stable/mysql //在线安装这个 MySQL
如在线安装失败,需要更换stable repo源
[root@master1 ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts/
"stable" has been added to your repositories
您在 /var/spool/mail/root 中有新邮件
[root@master1 ~]# helm search mysql
NAME CHART VERSION APP VERSION DESCRIPTION
stable/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy to use op...
stable/mysqldump 2.6.2 2.4.1 DEPRECATED! - A Helm chart to help backup MySQL databases...
stable/prometheus-mysql-exporter 0.7.1 v0.11.0 DEPRECATED A Helm chart for prometheus mysql exporter wit...
stable/percona 1.2.3 5.7.26 DEPRECATED - free, fully compatible, enhanced, open sourc...
stable/percona-xtradb-cluster 1.0.8 5.7.19 DEPRECATED - free, fully compatible, enhanced, open sourc...
stable/phpmyadmin 4.3.5 5.0.1 DEPRECATED phpMyAdmin is an mysql administration frontend
stable/gcloud-sqlproxy 0.6.1 1.11 DEPRECATED Google Cloud SQL Proxy
stable/mariadb 7.3.14 10.3.22 DEPRECATED Fast, reliable, scalable, and easy to use open...
[root@master1 ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts/
在线安装
[root@master1 ~]# helm install stable/mysql
NAME: exegetical-lionfish
LAST DEPLOYED: Thu Oct 5 15:44:37 2023
NAMESPACE: default
STATUS: DEPLOYEDRESOURCES:
==> v1/ConfigMap
NAME DATA AGE
exegetical-lionfish-mysql-test 1 1s==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
exegetical-lionfish-mysql 0/1 1 0 0s==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
exegetical-lionfish-mysql Pending 0s==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
exegetical-lionfish-mysql-8ffb45b5f-pfjr6 0/1 Pending 0 0s==> v1/Secret
NAME TYPE DATA AGE
exegetical-lionfish-mysql Opaque 2 1s==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
exegetical-lionfish-mysql ClusterIP 10.96.248.54 <none> 3306/TCP 0sNOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
exegetical-lionfish-mysql.default.svc.cluster.localTo get your root password run:MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default exegetical-lionfish-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)To connect to your database:1. Run an Ubuntu pod that you can use as a client:kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il2. Install the mysql client:$ apt-get update && apt-get install mysql-client -y3. Connect using the mysql cli, then provide your password:$ mysql -h exegetical-lionfish-mysql -pTo connect to your database directly from outside the K8s cluster:MYSQL_HOST=127.0.0.1MYSQL_PORT=3306# Execute the following command to route the connection:kubectl port-forward svc/exegetical-lionfish-mysql 3306mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
3.部署HELM3
(1)下载helm3最新版本
可以从rancher国内仓库下载helm3工具
wget http://rancher-mirror.cnrancher.com/helm/v3.4.1/helm-v3.4.1-linux-amd64.tar.gz
tar -zxvf helm-v3.4.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/helm3
确认helm版本
# helm3 version
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
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
第二种方法:(源码安装)
yum install -y gityum install -y go
$ mkdir -p ${GOPATH}/src/github.com/helm$ cd $_$ git clone git@github.com:helm/helm-2to3.git$ cd helm-2to3$ make build$ export HELM_LINTER_PLUGIN_NO_INSTALL_HOOK=true$ helm plugin install <your_path>/helm-2to3
(3)查看helm3插件
# helm3 plugin list
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
NAME VERSION DESCRIPTION
2to3 0.7.0 migrate and cleanup Helm v2 configuration and releases in-place to Helm v3
(4)迁移helm2配置至helm3
迁移helm2部署的应用(确保helm2和helm3同时安装在同一台机器上)
首先来检查可用的选项:
$ helm3 2to3 convert -h
migrate Helm v2 release in-place to Helm v3Usage:2to3 convert [flags] RELEASEFlags:--delete-v2-releases v2 releases are deleted after migration. By default, the v2 releases are retained--dry-run simulate a convert-h, --help help for convert-l, --label string label to select tiller resources by (default "OWNER=TILLER")-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")-t, --tiller-ns string namespace of Tiller (default "kube-system")--tiller-out-cluster when Tiller is not running in the cluster e.g. Tillerless
列出Helm v2的releases,并从中挑选一个用于迁移测试:
$ helm list
为了保证安全,我们先使用–dry-run 标志:
$ helm3 2to3 convert --dry-run postgres
NOTE: This is in dry-run mode, the following actions will not be executed.
Run without --dry-run to take the actions described below:Release "postgres" will be converted from Helm 2 to Helm 3.
[Helm 3] Release "postgres" will be created.
[Helm 3] ReleaseVersion "postgres.v1" will be created.
执行真正的迁移工作:
$ helm3 2to3 convert postgres
Release "postgres" will be converted from Helm 2 to Helm 3.
[Helm 3] Release "postgres" will be created.
[Helm 3] ReleaseVersion "postgres.v1" will be created.
[Helm 3] ReleaseVersion "postgres.v1" created.
[Helm 3] Release "postgres" created.
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.
检查是否迁移成功:
$ helm list$ helm3 list
如果还有其他应用,需要一个个迁移过来
(6)清理helm2数据
注意:由于我们并没有指定 --delete-v2-releases 标志,所以Helm v2 的postgres release仍然保留了下来,以后我们可以使用kubectl命令来删除它。
迁移时直接删除helm2 release。
helm3 2to3 convert <release-name> --delete-v2-releases
当已经准备好了迁移你所有的releases时,可以在一个循环中自动运行它,以应用helm3 2to3 转换每一个Helm v2对应的release。
注意,这一步将会删除tiller pod以及helm2在主机上相关文件,执行之后无法还原,如果不确定可以先不执行
helm3 2to3 cleanup
二、实验
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
(1)下载helm3最新版本
可以从rancher国内仓库下载helm3工具
确认helm版本
(2)安装helm-2to3插件
采用第二种方法:(源码安装)
(3)更新repo源
查看repo源
三、问题
1.api版本过期
(1)问题
(2)原因分析
api已经过期了,因为现在使用的是1.20版本,有的api版本已经过期,需要修改下
(3)解决方法
rbac.authorization.k8s.io/v1beta1
改为:
rbac.authorization.k8s.io/v1
修改前:
修改后:
成功:
2.helm初始化报错
(1)报错
k8s主节点部署helm(版本:v2.14.3),初始化报错
(2)原因分析
第一种原因:
因访问权限原因导致
第二种原因:
仓库地址变更
https://kubernetes-charts.storage.googleapis.com/index.yaml 已经弃用,
新的仓库是:
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
第二种方法:
修改仓库地址
#tiller服务端
helm init --stable-repo-url=https://charts.helm.sh/stable --service-account=tiller#client客户端
helm init --stable-repo-url=https://charts.helm.sh/stable --client-only
第三种方法:
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
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的事件
[root@master2 ~]# kubectl describe pod tiller-deploy-54d45574c4-zdt72 -n kube-system
Name: tiller-deploy-54d45574c4-zdt72
Namespace: kube-system
Priority: 0
Node: node1/192.168.204.182
Start Time: Thu, 05 Oct 2023 14:43:44 +0800
Labels: app=helmname=tillerpod-template-hash=54d45574c4
Annotations: cni.projectcalico.org/podIP: 10.244.166.148/32cni.projectcalico.org/podIPs: 10.244.166.148/32
Status: Pending
IP: 10.244.166.148
IPs:IP: 10.244.166.148
Controlled By: ReplicaSet/tiller-deploy-54d45574c4
Containers:tiller:Container ID: Image: gcr.io/kubernetes-helm/tiller:v2.14.3Image ID: Ports: 44134/TCP, 44135/TCPHost Ports: 0/TCP, 0/TCPState: WaitingReason: ImagePullBackOffReady: FalseRestart Count: 0Liveness: http-get http://:44135/liveness delay=1s timeout=1s period=10s #success=1 #failure=3Readiness: http-get http://:44135/readiness delay=1s timeout=1s period=10s #success=1 #failure=3Environment:TILLER_NAMESPACE: kube-systemTILLER_HISTORY_MAX: 0Mounts:/var/run/secrets/kubernetes.io/serviceaccount from tiller-token-fj88w (ro)
Conditions:Type StatusInitialized True Ready False ContainersReady False PodScheduled True
Volumes:tiller-token-fj88w:Type: Secret (a volume populated by a Secret)SecretName: tiller-token-fj88wOptional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 15m default-scheduler Successfully assigned kube-system/tiller-deploy-54d45574c4-zdt72 to node1Normal Pulling 12m (x4 over 15m) kubelet Pulling image "gcr.io/kubernetes-helm/tiller:v2.14.3"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)Warning Failed 12m (x4 over 14m) kubelet Error: ErrImagePullNormal BackOff 5m7s (x33 over 14m) kubelet Back-off pulling image "gcr.io/kubernetes-helm/tiller:v2.14.3"Warning Failed 8s (x53 over 14m) kubelet Error: ImagePullBackOff
[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
git config --global user.name “你的名称”
git config --global user.email “你的邮箱”
git config --global user.password “xxxxx密码”
查看配置
git config --list
②检查是否已安装ssh key
$ cd ~/.ssh
$ 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)分析
The difference between signing keys and authentication keys is that :
• signing keys can be used to sign Git commits
• authentication keys can be used to access repositories.
• 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. 签名密钥用于签名 Git 提交(commit)和标签(tag),用于验证提交者身份。
2. 认证密钥用于访问仓库(repository),实现免密码 git 操作。
如果只添加一种类型的密钥,那么它只能用于对应的用途:
• 只添加签名密钥,可以用于签名提交,但不能用于 SSH 访问
• 只添加认证密钥,可以用于 SSH 访问,但不能用于签名提交
• 但是,同一个密钥可以同时添加为两种类型,既可用于签名提交,也可用于 SSH 访问。
(3)小结
1. 签名密钥用于验证 Git 操作的身份
2. 认证密钥用于访问 Git 仓库和免密码操作
3. 同一把密钥可以同时用作签名密钥和认证密钥
4. 添加密钥类型决定了它可以用于的用途
9.make build 报错
(1)报错
(2)原因分析
未安装go
(3)解决方法
安装go
yum install -y go
成功:
10.查看helm的plugin路径
(1)问题
无法确认helm安装插件位置
helm plugin install <your_path>/helm-2to3
(2)分析
helm命令查询
(3)解决方法
#helm2命令
helm home
/root/.helm#helm3命令
helm3 env
……
HELM_PLUGINS="/root/.local/share/helm/plugins"
……
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
的环境变量调整就可以了。
export GOSUMDB=off
go mod download
四、总结
HELM有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。
Charts是创建 Kubernetes 应用实例的信息集合,也就是一个 helm 的程序包,它包含了运行一个 k8s 应用所有需要的镜像、依赖关系和资源定义等,必要时还会包含 Service 资源定义,它类似于 yum 的 rpm 文件。
HELM v3版本与v2版本的架构变化
1. 最大的改动就是移除了 Tiller 组件,所有功能都通过 Helm CLI 与 ApiServer 直接交互。
2. release在v3版本中可以实现不同的namespace空间中重用;
3. 可以将chart推入到docker仓库中。
HELM3特性:
一、新的功能
1.版本以新格式存储
2.没有群集内(tiller)组件
3.Helm 3包括对新版Helm图表的支持(图表v2)
4.Helm 3还支持库图表-图表主要用作其他图表的资源。
5.用于在OCI注册表中存储Helm图表的实验支持(例如Docker Distribution)可以进行试。
6.现在在升级Kubernetes资源时将应用3向战略合并补丁。
7.现在可以根据JSON模式验证图表提供的值
8.为了使Helm更安全,可用和健壮,已进行了许多小的改进。二、 Helm3的内部实现已从 Helm2发生了很大变化,使其与 Helm2不兼容
该版本主要变化如下
1. 最明显的变化是 Tiller的删除
2. Release 不再是全局资源,而是存储在各自命名空间内
3. Values 支持 JSON Schema校验器,自动检查所有输入的变量格式
4. 移除了用于本地临时搭建 Chart Repository 的 helm serve 命令。
5. helm install 不再默认生成一个 Release 的名称,除非指定了 --generate-name。
6. Helm CLI 个别更名,但旧的命令当前仍能使用。(1) helm delete更名为 helm uninstall(2) helm inspect更名为 helm show(3) helm fetch更名为 helm pull
相关文章:
云原生Kubernetes:简化K8S应用部署工具Helm
目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…...
qml保姆级教程五:视图组件
💂 个人主页:pp不会算法v 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一:布局组件 文章目录 列表视图ListVi…...
2310d编译不过
struct A {this(int[] data) safe { a data; }int[] a; }void main() safe {int[3] test [1, 2, 3];A a A(test); }应该给data参数加上return scope.或让构造器为模板参数来推导,否则,构造器可以把栈分配切片赋值给全局变量....
CleanMyMac X4.14.1最新版本下载
CleanMyMac X是一个功能强大的Mac清理软件,它的设计理念是提供多个模块,包括垃圾清理、安全保护、速度优化、应用程序管理和文档管理粉碎等,以满足用户的不同需求。软件的界面简洁直观,让用户能够轻松进行日常的清理操作。 使用C…...
芯驰D9评测(3)--建立开发环境
1. 建立交叉编译链接环境 官网下载的SDK包中就有交叉工具链,米尔提供的这个 SDK 中除了包含各种源代码外还提供了必要的交叉工具链,可以直接用于编译应用程序等。 用户可以直接使用次交叉编译工具链来建立一个独立的开发环境,可单独编译…...
阿里云服务器IP地址查询方法(公网IP和私网IP)
阿里云服务器IP地址在哪查看?在云服务器ECS管理控制台即可查看,阿里云服务器IP地址包括公网IP和私有IP地址,阿里云百科分享阿里云服务器IP地址查询方法: 目录 阿里云服务器IP地址查询 阿里云服务器IP地址查询 1、登录到阿里云服…...
第47节——使用bindActionCreators封装actions模块
一、什么是action creators 1、概念 在Redux中,Action Creators是一种函数,它用于创建一个描述应用程序状态变化的action对象。Action对象是一个普通JavaScript对象,它包含一个描述action类型的字符串属性(通常称为“type”&…...
QT、c/c++通过宏自动判断平台
QT、c/c通过宏自动判断平台 Chapter1 QT、c/c通过宏自动判断平台 Chapter1 QT、c/c通过宏自动判断平台 原文链接:https://blog.csdn.net/qq_32348883/article/details/123063830 背景 为了更好的进行跨平台移植、编译、调试。 具体操作 宏操作 #ifdef _WIN32//d…...
对比表:阿里云轻量应用服务器和服务器性能差异
阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…...
中国1km分辨率月最低温和最高温度数据集(1901-2020)
简介: 中国1km分辨率月最低温度数据集(1901-2020)是根据CRU发布的全球0.5气候数据集以及WorldClim发布的全球高分辨率气候数据集,通过Delta空间降尺度方案在中国地区降尺度生成的。使用了496个独立气象观测点数据进行验证&#x…...
EasyX图形库note4,动画及键盘交互
大家好,这里是Dark Flame Master,专栏从这篇开始就会变得很有意思,我们可以利用今天所学的只是实现很多功能,同样为之后的更加好玩的内容打下基础,从这届开始将会利用所学的知识制作一些小游戏,废话不多说&…...
C++设计模式-原型(Prototype)
目录 C设计模式-原型(Prototype) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-原型(Prototype) 一、意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 二、适用性 当…...
[补题记录] Atcoder Beginner Contest 322(E)
URL:https://atcoder.jp/contests/abc322 目录 E Probelm/题意 Thought/思路 Code/代码 E Probelm/题意 有 N 个改进计划,每个计划可以执行一次;有 K 个参数,每个计划可以将所有参数提升固定值,即计划 i 可以为第…...
目标检测算法改进系列之Backbone替换为FocalNet
FocalNet 近些年,Transformers在自然语言处理、图像分类、目标检测和图像分割上均取得了较大的成功,归根结底是自注意力(SA :self-attention)起到了关键性的作用,因此能够支持输入信息的全局交互。但是由于…...
buuctf-[BSidesCF 2020]Had a bad day 文件包含
打开环境 就两个按钮,随便按按 url变了 还有 像文件包含,使用php伪协议读取一下,但是发现报错,而且有两个.php,可能是自己会加上php后缀 所以把后缀去掉 /index.php?categoryphp://filter/convert.base64-encode/resourcei…...
Elasticsearch:什么时候应该考虑在 Elasticsearch 中添加协调节点?
仅协调节点(coordinating only nodes)充当智能负载均衡器。 仅协调节点的这种特殊角色通过减轻数据和主节点的协调责任,为广泛的集群提供了优势。 加入集群后,这些节点与任何其他节点类似,都会获取完整的集群状态&…...
Dubbo3应用开发—Dubbo注册中心引言
Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理。 注册中心的运行流程 使用注册中心的好处 可以有效的管理RPC集群的健康情况,动态的上线或者下线服务。让我…...
AS环境,版本问题,android开发布局知识
项目模式下有一个build.gradle,每个模块也有自己的build.gradle Android模式下有多个build.gradle,汇总在一起。(都会有标注是哪个模块下的) C:\Users\Administrator\AndroidStudioProjects 项目默认位置 Java web项目与android项目的区别…...
OpenCV查找和绘制轮廓:findContours和drawContours
1 任务描述: 绘制图中粗线矩形的2个边界,并找到其边界的中心线 图1 原始图像 2.函数原型 findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, …...
毕设-原创医疗预约挂号平台分享
医疗预约挂号平台 不是尚医通项目,先看项目质量(有源码论文) 项目链接:医疗预约挂号平台git地址 演示视频:医疗预约挂号平台 功能结构图 登录注册模块:该模块具体分为登录和注册两个功能,这些…...
PLL锁相环倍频原理
晶振8MHz,但是处理器输入可以达到72MHz,是因为PLL锁相环提供了72MHz。 锁相环由PD(鉴相器)、LP(滤波器)、VCO(压控振荡器)组成。 处理器获得的72MHz并非晶振提供,而是锁…...
POJ 2886 Who Gets the Most Candies? 树状数组+二分
一、题目大意 我们有N个孩子,每个人带着一张卡片,一起顺时针围成一个圈来玩游戏,第一回合时,第k个孩子被淘汰,然后他说出他卡片上的数字A,如果A是一个正数,那么下一个回合他左边的第A个孩子被淘…...
阿里云服务器镜像系统Anolis OS龙蜥详细介绍
阿里云服务器Anolis OS镜像系统由龙蜥OpenAnolis社区推出,Anolis OS是CentOS 8 100%兼容替代版本,Anolis OS是完全开源、中立、开放的Linux发行版,具备企业级的稳定性、高性能、安全性和可靠性。目前阿里云服务器ECS可选的Anolis OS镜像系统版…...
数学建模Matlab之基础操作
作者由于后续课程也要学习Matlab,并且之前也进行了一些数学建模的练习(虽然是论文手),所以花了几天零碎时间学习Matlab的基础操作,特此整理。 基本运算 a55 %加法,同理减法 b2^3 %立方 c5*2 %乘法 x 1; …...
[计算机入门] Windows附件程序介绍(工具类)
3.14 Windows附件程序介绍(工具类) 3.14.1 计算器 Windows系统中的计算器是一个内置的应用程序,提供了基本的数学计算功能。它被设计为一个方便、易于使用的工具,可以满足用户日常生活和工作中的基本计算需求。 以下是计算器程序的主要功能:…...
队列(循环数组队列,用队列实现栈,用栈实现队列)
基础知识 队列(Queue):先进先出的数据结果,底层由双向链表实现 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为对头 常用方法 boolean offer(E e) 入队 E(弹出元素的类型) poll() 出队 peek() 获取队头 int size 获取队列元素个数 boolean isEmpty(…...
卷积神经网络-池化层和激活层
2.池化层 根据特征图上的局部统计信息进行下采样,在保留有用信息的同时减少特征图的大小。和卷积层不同的是,池化层不包含需要学习的参数。最大池化(max-pooling)在一个局部区域选最大值作为输出,而平均池化(average pooling)计算一个局部区…...
API基础————包
什么是包,package实际上就是一个文件夹,便于程序员更好的管理维护自己的代码。它可以使得一个项目结构更加清晰明了。 Java也有20年历史了,这么多年有这么多程序员写了无数行代码,其中有大量重复的,为了更加便捷省时地…...
【C++】一文带你走入vector
文章目录 一、vector的介绍二、vector的常用接口说明2.1 vector的使用2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector 增删查改 三、总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ" 一、vector的介绍 vector…...
《Secure Analytics-Federated Learning and Secure Aggregation》论文阅读
背景 机器学习模型对数据的分析具有很大的优势,很多敏感数据分布在用户各自的终端。若大规模收集用户的敏感数据具有泄露的风险。 对于安全分析的一般背景就是认为有n方有敏感数据,并且不愿意分享他们的数据,但可以分享聚合计算后的结果。 联…...
长春商城网站建设/全媒体运营师报名费多少钱
第 1 节 MFC定义了哪些消息 根据《深入浅出MFC》上所描述的,MFC的消息分为:消息和命令和Control Notification,消息的命令是以WM_作为开头的,命令是以ID开头的,那么这些消息或命令到底是在哪儿进行定义的呢?…...
品牌推广途径/优化网站有哪些方法
数据库开发可视工具还是很方便的 数据库语句以前只知道sql语句 今天才知道还有 ddl语句数据定义语句 dml语句数据操作语句...
凡科网多页网站怎样做/网站seo优化的目的
1.单行单列选择工具一般用于画直线,然后编辑---填充,再选择---取消选择。 2.羽化:使选区更好滴颜色过渡。 一般PS抠出的图,直接用于设计的时候图层之间的衔接会显得很硬,所以一般用羽化处理下,羽化也就是让…...
网站的域名是什么/各城市首轮感染高峰期预测
9月3日凌晨,英特尔发布了9款11代酷睿处理器,英特尔还表示第11代的奔腾、赛扬、博锐平台以及DG1独立显卡将在晚些时候发布。日前,英特尔终于低调上线了三款基于Tiger Lake的11代奔腾、赛扬处理器。这三款处理器分别是奔腾金牌7505、赛扬6305和…...
欧洲站vat激活/海外建站
一句好的广告语,能强烈的激发人的感情,产生心理认同感。对于广告人来说,无论走到哪里,最敏感的就是广告语。一句广告语,可能只有短短几个字或一两句话,却是一个品牌的精华所在。能不能第一时间吸引受众眼球…...
公司注册网站有安全风险怎么注销/优化网站标题是什么意思
1、JavaScript面向对象的三大特性 JavaScript的三大特性:封装性、继承性、多态性。 2、JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能。js当中只能依靠变量的作用域来实现封装的特性,并且只能模拟出public和private两种特性。封装…...