Kubernetes中的Helm和修改證書有效時間(八)

MXC肖某某發表於2020-09-18

一、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的三個重要概念

  1. chart:包含建立k8s的一個應用例項的必要資訊
  2. config:包含了應用釋出配置資訊
  3. 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.yamlvalues.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

  再次檢視證書有效期。

 

相關文章