一、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-name> #更新配置 helm upgrade <helm-name> . #刪除helm(標記刪除) helm delete <helm-name> #徹底刪除 helm delete --purge <helm-name> #檢視歷史記錄 helm history <helm-name> #回滾helm,先查詢上一步歷史記錄,根據記錄回滾 helm rollback <helm-name> <reversion-number> #檢驗檔案正確性 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
再次檢視證書有效期。