zoukankan      html  css  js  c++  java
  • Kubernetes中的Helm和修改证书有效时间(八)

    一、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语言中文社区 点击下载。

    #解压文件到指定目录 具体需要下载和解压的版本可根据kubeadm中的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

      再次查看证书有效期。

  • 相关阅读:
    基于FPGA的ARP协议实现
    Modelsim 仿真错误集锦
    基于FPGA的IIC驱动设计
    状态机跑飞的解决办法
    基于FPGA的检测时钟脉冲的高电平及低电平的中点标志位设计
    基于FPGA的UART实现
    基于FPGA的数字秒表设计
    Matlab的常用调试方法
    基于FPGA的花样流水灯
    **time_limited.sof文件
  • 原文地址:https://www.cnblogs.com/bbgs-xc/p/13691203.html
Copyright © 2011-2022 走看看