一、Helm的介绍
1,概念
Helm 把 k8s 资源(比如 deployments、services 或 ingress 等)打包到一个 chart 中,而 chart 被保存到 chart 仓库。通过 chart 仓库 可用来存储和分享 chart。Helm 使发布可配置,支持发布应用配置的版本管理,简化了 k8s 部署应用的版本控制、打包、发布、删除、更新等操作。
做为 k8s 的一个包管理工具,Helm 具有如下功能:
- 创建新的 chart
- chart 打包成 tgz 格式
- 上传 chart 到 chart 仓库或从仓库中下载 chart
- 在 k8s 集群中安装或卸载 chart
- 管理用 Helm 安装的 chart 的发布周期
2,Helm的三个重要概念
- chart:包含创建k8s的一个应用实例的必要信息
- config:包含了应用发布配置信息
- release:是一个chart及其配置的运行实例
3,Helm的组成部分
Helm Client
是用户命令行工具,其主要负责如下:
- 本地 chart 开发
- 仓库管理
- 与 Tiller sever 交互
- 发送预安装的 chart
- 查询 release 信息
- 要求升级或卸载已存在的 release
Tiller Server
是一个部署在 k8s 集群内部的 server,其与 Helm client、apiserver 进行交互。Tiller server 主要负责如下:
- 监听来自 Helm client 的请求
- 通过 chart 及其配置构建一次发布
- 安装 chart 到 k8s 集群,并跟踪随后的发布
- 通过与 k8s 交互升级或卸载 chart
简单的说,client 管理 charts,而 server 管理发布 release。
二、Helm安装
1,安装Helm客户端
下载客户端包:https://github.com/helm/helm/releases
cd /usr/local/install-k8s/plugin/helm #可提前下载安装包 wget https://get.helm.sh/helm-v2.13.1-linux-amd64.tar.gz tar -zxvf helm-v2.13.1-linux-amd64.tar.gz.tar cp ./linux-amd64/helm /usr/local/bin/
2,安装Tiller服务端
rbac.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.yaml helm init --service-account tiller helm init --service-account tiller --skip-refresh #查看tiller的pod kubectl get pod -n kube-system
如果gcr.io/kubernetes-helm/tiller:v2.13.1镜像下载失败可采用离线docker load -i的方式导入。
3,查看Helm版本
[root@master01 helm]# helm version Client: &version.Version{SemVer:"v2.13.1", GitCommit:"...", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.13.1", GitCommit:"...", GitTreeState:"clean"}
三、定义Helm模板
helm的模板库:https://hub.helm.sh/
1,安装redis
#进入网址 https://hub.helm.sh/charts/bitnami/redis helm repo add bitnami https://charts.bitnami.com/bitnami helm install bitnami/redis --version 11.0.0
2,自定义模板
自定义模板一般会用到 Chart.yaml
、values.yaml
和 templates 文件夹
,其中:
- Chart.yaml:必需。声明一个 Helm 模板,必须要有 name 和 version 两个属性,其值可以自定义。
- templates 文件夹:必需。存放资源清单,比如 deployment.yaml、service.yaml 等等。运行 helm 就是为我们创建这里定义的资源。
- valuse.yaml:可选。为资源清单提供可配置的 key - value 数据。
Chart.yaml
name: my-template version: 1.0
values.yaml
#注意:在 values.yaml 中的值可以被部署 release 时用到的参数 --values yaml_file_path 或者 --set key1=value1, key2=value2 覆盖掉。 #例如 helm install --set image.tag=v2 . image: repository: hub.xcc.com/my-xcc/my-nginx tag: v1
templates 下的 deployment.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: deployment-nginx spec: replicas: 3 template: metadata: labels: app: nginx-app spec: containers: - name: nginx-container image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 80
templates 下的 svc.yaml
apiVersion: v1 kind: Service metadata: name: svc-nginx spec: type: NodePort selector: app: nginx-app ports: - name: http port: 80 targetPort: 80 nodePort: 30131
执行命令
#在Chart.yaml和values.yaml同级目录下
helm install .
#查看helm或者使用 helm ls
helm list
四、helm常用命令
#查看帮助 helm help #安装 helm install . #查看helm列表 helm list helm ls #查看helm被删除列表 helm ls --deleted #查看helm状态 helm status#更新配置 helm upgrade . #删除helm(标记删除) helm delete #彻底删除 helm delete --purge #查看历史记录 helm history #回滚helm,先查询上一步历史记录,根据记录回滚 helm rollback #检验文件正确性 helm install --dry-run .
五、修改证书有效时长
1,查看证书有效时长
#进入证书存放目录 cd /etc/kubernetes/pki #查看apiserver.crt 证书有效期 为2020.7.11~2021.7.11 openssl x509 -in apiserver.crt -text -noout ... Validity Not Before: Jul 11 07:41:55 2020 GMT Not After : Jul 11 07:41:56 2021 GMT ...
2,修改有效时长
修改方式有很多,这里我们采用通过修改kubeadm源码的方式,来实现延长证书的有效时长。
a)安装go语言
因为 kubeadm 是 go 语言编写的,所以需要安装 go 语言。进入 go语言中文社区 点击下载。
#解压文件到指定目录 tar -xvf go1.15.2.linux-amd64.tar.gz -C /usr/local #配置环境变量 echo "PATH=/usr/local/go/bin:$PATH" >> /etc/profile source /etc/profile #查看版本 go version
b)下载kubeadm源码
#下载源码 git clone https://github.com/kubernetes/kubernetes.git cd kubernetes #查看kubeadm版本 kubeadm version #切换至kubeadm版本v1.15.1 git checkout -b remotes/origin/release-1.15.1 v1.15.1
c)修改代码
# kubeadm 1.14版本之后是修改这个文件 [root@master01 kubernetes]# vim cmd/kubeadm/app/util/pkiutil/pki_helpers.go ...... // NewSignedCert creates a signed certificate using the given CA certificate and key func NewSignedCert(cfg *certutil.Config, key crypto.Signer, caCert *x509.Certificate, caKey crypto.Signer) (*x509.Certificate, error) { # 定义一个我们想要的时间,time.Hour 表示一小时 const addTime = time.Hour * 24 * 365 * 10 serial, err := cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64)) if err != nil { return nil, err } if len(cfg.CommonName) == 0 { return nil, errors.New("must specify a CommonName") } if len(cfg.Usages) == 0 { return nil, errors.New("must specify at least one ExtKeyUsage") } certTmpl := x509.Certificate{ Subject: pkix.Name{ CommonName: cfg.CommonName, Organization: cfg.Organization, }, DNSNames: cfg.AltNames.DNSNames, IPAddresses: cfg.AltNames.IPs, SerialNumber: serial, NotBefore: caCert.NotBefore, # 然后修改NotAfter # NotAfter: time.Now().Add(kubeadmconstants.CertificateValidity).UTC(), NotAfter: time.Now().Add(addTime).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: cfg.Usages, } certDERBytes, err := x509.CreateCertificate(cryptorand.Reader, &certTmpl, caCert, key.Public(), caKey) if err != nil { return nil, err } return x509.ParseCertificate(certDERBytes) } ......
编译生效
#重新编译 make WHAT=cmd/kubeadm GOFLAGS=-v # 将编译好的 kubeadm 放入 /root 下 cp _output/bin/kubeadm /root/kubeadm #将原有的 kubeadm 备份一下 cp /usr/bin/kubeadm /usr/bin/kubeadm.bak #用新的 kubeadm 覆盖旧的 kubeadm mv /root/kubeadm /usr/bin/kubeadm # 赋予权限 chmod a+x /usr/bin/kubeadm #备份 pki 文件夹 cp -r /etc/kubernetes/pki/ /etc/kubernetes/pki.bak #重新生成证书文件 kubeadm alpha certs renew all --config=/usr/local/install-k8s/core/kubeadm-config.yaml
再次查看证书有效期。