2024年11月

一、Helm 概述

Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 下的包管理工具如 yum、apt 等。可以方便的将之前打包好的 yaml 文件部署到 Kunernetes 上。

在 Helm 中有三个主要概念:

概念含义
helm一个命令行工具,主要用于 k8s 应用 Chart 的创建、打包、发布和管理。
Chart应用描述,它是一系列用于描述 k8s 资源相关文件的集合(可以理解为 yaml 的集合)。
Release基于 Chart 的部署实体,一个 Chart 被 Helm 运行后将会生成一个对应的 release,然后将在 k8s 中创建出真正运行的资源对象,它是一个应用级别的版本管理。

基于 Chart 的部署实体,一个 Chart 被 Helm 运行后将会生成一个对应的 release,然后将在 k8s 中创建出真正运行的资源对象,它是一个应用级别的版本管理。 在 2019 年 11 月 13日,Helm 团队发布了稳定版本Helm v3,这也是当前主流版本。该版本与往期版本相比较有主要以下变化:

  • 删除了 Tiller;

  • 支持 release 在不同命名空间中重用;

  • 支持直接将 Chart 推送到 docker 仓库中

v3 之前版本架构

v3 版本架构

Helm官网:

helm.sh/

Helm插件:

helm.sh/zh/docs/communi


二、Helm 部署安装

1)版本选择及下载安装

由于集群版本选择1.24版本,考虑后续兼容,选择3.12.x版本的helm

国内下载地址:

mirrors.huaweicloud.com

使用命令下载:

wget https://mirrors.huaweicloud.com/helm/v3.12.0/helm-v3.12.0-linux-amd64.tar.gz && tar -xvf helm-v3.12.0-linux-amd64.tar.gz &&  cp linux-amd64/helm /usr/local/bin/

2)基础配置

  • A)配置公有仓库

配置国内Chart仓库

helm repo add stable http://mirror.azure.cn/kubernetes/chartshelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 

helm repo add tkemarket https://market-tke.tencentcloudcr.com/chartrepo/opensource-stable
helm repo update
helm repo list

添加腾讯云镜像helm chart 仓库

helm repo add $instance-$namespace https://$instance.tencentcloudcr.com/chartrepo/$namespace --username $username --password $instance-token
  • B)连接集群

配置kubectl ,及 ~/.kube/config

chmod g-rw ~/.kube/configchmod o-r ~/.kube/config

Helm v3对比 Helm v2已移除 Tiller 组件,Helm 客户端可直接连接集群的 ApiServer,应用相关的版本数据直接存储在 Kubernetes 中。如下图所示:


参考腾讯云文档:

cloud.tencent.com/docum

注:

使用 Helm CLI 上传 Chart 包需要安装 helm-push 插件,该插件支持使用 helm push 指令推送 helm chart 至指定 repo,同时支持上传目录及压缩包。

helm plugin install https://github.com/chartmuseum/helm-push

安装插件后需要使用插件进行上传例如:【仓库不存在只是展示写法】

helm cm-push  kafka-28.2.1.tgz  kafka/common-job


  • C)安装插件

插件使用 $ helm plugin install <path|url> 命令安装插件。你可以在本地文件系统上传一个路径或远程仓库url给插件。The helm plugin install 命令会克隆或拷贝给定路径的插件到 $HELM_PLUGINS

$ helm plugin install https://github.com/adamreese/helm-env

如果是插件tar包,仅需解压插件到$HELM_PLUGINS目录。也可以用tar包的url直接安装: helm plugin install https://domain/path/to/plugin.tar.gz

插件安装说明官方文档:Helm插件指南

可以使用helm env 命令查看插件目录


在插件安装目录会找到插件的目录,以及目录bin目录下的二机制执行文件

实例安装

Dashboard 插件安装

国内镜像地址: hub.nuaa.cf/komodorio/h
推荐二进制安装: helm plugin install https://github.com/komodorio/helm-dashboard.git

【因为网络问题会无法安装,可以使用国内地址】


三、Helm 应用落地

1)工作流程简诉

以下是Helm的工作流程

简诉如下:

helm install my-work -n  my-namespace  my-work/ 
helm install my-work -n  my-namespace  my-company/my-work

helm : 工具

my-work : 需要安装的服务

my-work/ 或 my-company/my-work : chart包


2) Charts 包结构及使用简诉

以下内容为参考:Helm入门(一篇就够了)-阿里云开发者社区

使用helm create命令创建一个新的Chart,Chart目录包含描述应用程序的文件和目录,包括Chart.yaml、values.yaml、templates目录等;

A)创建Charts 包

在本地机器上使用helm create命令创建一个名为wordpressChart

B)Charts 目录


在当前文件夹,可以看到创建了一个wordpress的目录,且里面的内容如下:

创建/编辑Chart配置

使用编辑器编辑Chart配置文件,包括Chart.yaml和values.yaml。

C) Chart.yaml

Chart.yaml包含 Chart的元数据和依赖项

Chart.yaml的模板及注释如下:

apiVersion: chart API 版本 (必需)  #必须有name: chart名称 (必需)     # 必须有 version: 语义化2 版本(必需) # 必须有kubeVersion: 兼容Kubernetes版本的语义化版本(可选)description: 一句话对这个项目的描述(可选)type: chart类型 (可选)keywords:  - 关于项目的一组关键字(可选)home: 项目home页面的URL (可选)sources:  - 项目源码的URL列表(可选)dependencies: # chart 必要条件列表 (可选)  - name: chart名称 (nginx)    version: chart版本 ("1.2.3")    repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )    tags: # (可选)      - 用于一次启用/禁用 一组chart的tag    import-values: # (可选)      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用maintainers: # (可选) # 可能用到  - name: 维护者名字 (每个维护者都需要)    email: 维护者邮箱 (每个维护者可选)    url: 维护者URL (每个维护者可选)icon: 用做icon的SVG或PNG图片URL (可选)appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号deprecated: 不被推荐的chart (可选,布尔值)annotations:  example: 按名称输入的批注列表 (可选).

举例:

name: nginx-helm
apiVersion: v1
version: 1.0.0

D ) values.yaml

values.yaml包含应用程序的默认配置值,举例:

image:
  repository: nginx
  tag: '1.19.8'

E) templates

在模板中引入values.yaml里的配置,在模板文件中可以通过 .VAlues对象访问到,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-helm-{{ .Values.image.repository }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-helm
  template:
    metadata:
      labels:
        app: nginx-helm
    spec:
      containers:
      - name: nginx-helm
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80
          protocol: TCP

E) 打包Chart

使用helm package命令将Chart打包为一个tarball文件,例如在wordpress目录中使用helm package命令将Chart打包为一个tarball文件:

helm package wordpress/

这将生成一个名为wordpress-0.1.0.tgz的tarball文件。

F) 上传 Chart

将打包好的Chart发布到一个Helm Repository中。可以使用helm repo add命令添加一个Repository,然后使用helm push命令将Chart推送到Repository中,例如:

helm repo add myrepo https://example.com/charts
helm push wordpress-0.1.0.tgz myrepo

G) 安装 Release

使用helm install命令安装Chart的Release,可以通过命令行选项或指定values.yaml文件来配置Release,例如:

helm install mywordpress myrepo/wordpress

这将在Kubernetes集群中创建一个名为mywordpress的Release,包含WordPress应用程序和MySQL数据库。

H) 更新 Release

使用helm upgrade 命令查看当前运行的Release ,例如:

helm upgrade mywordpress myrepo/wordpress --set image.tag=5.7.3-php8.0-fpm-alpine


3) Charts 语法详述

A) 使用语法使用双花括号 {{ }}

B) 引用内置对象

前面提到过可以在模板中使用 {{ .Release.Name }} 获取 release 的名称,Release 是模板中可以访问的几个顶级对象之一:

  • Release:该对象描述了 release 本身的相关信息

    • Release.Name:release 名称

    • Release.Namespace:release 安装到的命名空间

    • Release.IsUpgrade:如果当前操作是升级或回滚,是为 true

    • Release.IsInstall:如果当前操作是否是安装,是为 true

    • Release.Revision:release 的 revision 版本号,在安装时为1,每次升级或回滚都会+1

    • Release.Service:渲染当前模板的服务,在 Helm 上,实际上该值始终为 Helm


  • Values:从 values.yaml 文件和用户提供的 values 文件传递到模板的 Values 值

  • Chart:获取 Chart.yaml 文件的内容,该文件中的任何数据都可以访问

  • Files:可以访问 chart 中的所有非特殊文件,虽然无法使用它来访问模板文件,但是可以来访问 chart 中的其他文件。

    • Files.Get:用于根据名称获取文件(比如 .Files.Get config.ini

    • Files.GetBytes:用于以 bytes 数组而不是字符串的形式来获取文件内容的函数

    • Files.Glob:用于返回名称于给定的 shell glob 模式匹配的文件列表

    • Files.Lines:可以逐行读取文件的函数,对于遍历文件中的每行内容很有用

    • Files.AsSecrets:将文件内容以 Base64 编码的字符串返回的函数

    • Files.AsConfig:将文件正文作为 YAML 字典返回的函数


  • Capabilities:获取有关 Kubernetes 集群的信息的对象

    • Capabilities.APIVersions:支持的版本集合

    • Capabilities.APIVersions.Has $version:判断一个版本(比如 batch/v1)或资源(比如 apps/v1/Deployment)是否可用

    • Capabilities.Kube.Version:Kubernetes 的版本

    • Capabilities.Kube:是 Kubernetes 版本的缩写

    • Capabilities.Kube.Major:Kubernetes 主版本

    • Capabilities.Kube.Minor:Kubernetes 的次版本


  • Template:当前正在执行的模板的相关信息

    • Name:当前模板的命名空间文件路径(比如 mychart/templates/mytemplate.yaml

    • BasePath:当前 chart 的模板目录的命名空间路径(比如 mychart/templates


更多具体用法可以参考官方文档:

helm.sh/zh/docs/howto/c

C) 使用管道 及 函数

模板语言有一个强大的功能就是管道(Pipeline),它可以将一系列模板命令链接在一起,一起对外提供服务

Helm 有60多种可用的函数,其中一些是由 Go 模板语言本身定义的,其他大多数都是 Sprig 模板库提供的,一般常用的也就是 Spig 模板库的函数 。

另外需要注意的是:在模板中,运算符(eq、ne、lt、gt、and、or 等等)均实现为函数,在管道中,运算符可以用括号()进行分割。

想要使用更多函数,可以查看文档:

masterminds.github.io/s
# chartdemo/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-ConfigMap
data:
  # default 函数,设置默认值
  DefaultFunc1: {{ .Values.name | default "abc" }}
  DefaultFunc2: {{ .Values.app | default "abc" }}
  # upper 函数,转换成大写
  UpperFunc: {{ .Values.name | default "abc" | upper }}
  # quote 函数,加引号
  QuoteFunc: {{ .Values.name | quote }}
  # repeat 函数,重复数据
  RepeatFunc: {{ .Values.name | repeat 5 }}

D) 控制语句

条件语句:

{{ if eq .Values.enableService true }}
kind: Service
{{ end }}

循环:

{{ range $index, $value := .Values.envVars }}
- name: {{ $value.name }}
  value: {{ $value.value }}
{{- end }}

E ) 变量

定义变量的方法有点类似 Golang 中的定义方法,只是需要一个$符号前缀

变量的使用频率较低,但可以用他们来简化代码,以及更好地使用withrange

在 with 下面是用的作用域里面的值还是外部的值。为了解决这个问题,就需要使用变量来进行改进

apiVersion: v1kind: ConfigMapmetadata:  name: {{ .Release.Name }}-ConfigMapdata:  {{- $releaseName := .Release.Name }}  {{- with .Values }}  releaseName: {{ $releaseName }}  name: {{ .name }}  {{- end }}apiVersion: v1kind: ConfigMapmetadata:  name: {{ .Release.Name }}-ConfigMapdata: |-  # 数组遍历  {{- range $index, $value := .Values.sports }}  {{ $index }}:{{ $value }} 
  {{- end }}  # 对象遍历  {{- range $index, $data := .Values.language }}  {{- range $k, $v := $data }}  {{ $k }}: {{ $v }}  {{- end }}  {{- end }}


F)访问文件

有时候需要导入一个不是模板的文件并注入其内容,此时就需要用到 .Files

Helm 提供了一个 .Files 对象对文件的访问,但在使用之前需要注意:

  • 可以在 Helm chart 中添加额外的文件,但这些文件也会被打包,由于 Kubernetes 对象的存储限制,Charts 必须小于 1M

  • 由于一些安全原因,通过 .Files 对象无法访问某些文件

    • 无法访问 templates/ 下面的文件

    • 无法访问使用 .helmignore 排除的文件

  • Chart 不会保留 UNIX 模式的信息,所以,当使用 .Files 对象时,文件级别的权限不会对文件的可用性产生影响。读取三个文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-ConfigMap
data:
  {{- $files := .Files }}
  {{- range tuple "f1.conf" "f2.conf" "f3.conf" }}
  {{ . }}: |-
    {{ $files.Get . }}
  {{- end }}

结果:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-1576046462-ConfigMap
data:
  f1.conf: |-
    message = 1

  f2.conf: |-
    message = 2

  f3.conf: |-
    message = 3

G)模板

_ 开头的这些文件其实就是 Helm 中的 partials 文件,所以我们完全可以将命名模板定义在这些 partials 文件中,默认就是 _helpers.tpl 文件。

通过 define 创建命名模板:

{{ define "MY.NAME" }}
  # 模板内容区域
{{ end }}

示例:

# chartdemo/templates/configmap.yaml
{{ define "chartdemo.labels" }}
labels:
  app: nginx
  author: {{ .Values.name }}
{{ end }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: myapp
  {{- template "chartdemo.labels" -}}
data:
  key: value

template 只能导入同文件:

{{ template "chartdemo.labels" . }}

导入【多种】:

{{ include "chartdemo.labels" . | indent 2 }}

在数据前面空两个格,实现数据 YAML 格式的合法性。通常在使用中也是推荐使用 include 而不是 template。

H ) NOTES.txt

在 chart 安装或者升级结束时,Helm 可以为用户打印出一些有用的信息,使用模板也可以自定义这些信息。

要将安装说明添加到 chart 中,只需要创建一个 templates/NOTES.txt 文件,该文件纯文本的,但是可以像模板一样进行处理,并具有所有常规模板的功能和可用对象。

Thank you for installing {{ .Chart.Name }}.

Your release is named {{ .Release.Name }}.

To learn more about the release, try:

  $ helm status {{ .Release.Name }}
  $ helm get {{ .Release.Name }}


4) 单个微服务Charts 包的详述与例析

A) 文件结构

微服务的构建一般我们需要以下的文件:


xxx-service/
|-- charts
|-- Chart.yaml
|-- templates
|   |-- deployment.yaml
|   |-- _helpers.tpl
|   |-- hpa.yaml
|   |-- ingress.yaml
|   |-- comfigmap.yaml
|   |-- NOTES.txt
|   |-- serviceaccount.yaml
|   |-- service.yaml
|   `-- tests
`-- values.yaml


Chart.yaml
apiVersion: v2
name: xxx-service
description: A Helm for TKE xxx-service

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 2024.05.0005                                   

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "V1.1"
values.yaml
# Default values for canna-admin.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: xxx.com/xxxx/xxxxx-service
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "V1.1"                             

imagePullSecrets: registrysecret
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  # Specifies whether a service account should be created
  create: false
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: LoadBalancer # ClusterIP
  port: 1234
  
envconfig:
  envname: xxxxx-service-env


env:
  TZ: Asia/Shanghai 

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: 
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  limits:
     cpu: 500m
     memory: 2048Mi
  requests:
     cpu: 500m
     memory: 1024Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

security: 
    groupid: xxxxx
                
nodeSelector: {
  xxxxxx: xxxxx
}

tolerations: []

affinity: {}
_helpers.tpl
{{/*
Expand the name of the chart.
*/}}
{{- define "app-server.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "app-server.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "app-server.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}


{{/*
Common labels
*/}}
{{- define "app-server.labels" -}}
helm.sh/chart: {{ include "app-server.chart" . }}
{{ include "app-server.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}

{{/*
Selector labels
*/}}
{{- define "app-server.selectorLabels" -}}
app.kubernetes.io/name: {{ include "app-server.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/*
Create the name of the service account to use
*/}}
{{- define "app-server.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "app-server.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}


deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "app-server.fullname" . }}
  labels:
    k8s.kuboard.cn/layer: svc
    {{- include "app-server.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "app-server.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      annotations:
        eks.tke.cloud.tencent.com/security-group-id: {{ .Values.security.groupid }}
      labels:
        {{- include "app-server.selectorLabels" . | nindent 8 }}
    spec:
      serviceAccountName: {{ include "app-server.serviceAccountName" . }}
      imagePullSecrets:
      - name: registrysecret
      volumes:
        - configMap:
            defaultMode: 420
            name: {{ .Values.envconfig.envname }}
          name: {{ .Values.envconfig.envname }}
        - name: xxxx-xxxx-logs
          persistentVolumeClaim:
            claimName: xxxxx-xxxx-logs
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          lifecycle:
            preStop:
              exec:
                command: ["/bin/sh","-c","/app/springboot.sh stop app.jar  >> /app/logs/catalina.out &&  sleep 60s"]
          volumeMounts:
            - mountPath: /app/config/bootstrap.properties
              name: {{ .Values.envconfig.envname }}
              readOnly: true
              subPath: bootstrap.properties
            - mountPath: /app/config/logback.xml
              name: {{ .Values.envconfig.envname }}
              readOnly: true
              subPath: logback.xml
            - mountPath: /app/logs
              name: xxxx-xxxx-logs
              subPathExpr: $(POD_NAME)_$(POD_IP)
          env:
           {{- range $key, $val := .Values.env }}
           - name: {{$key}}
             value: {{$val|quote}}
           {{- end}}
           - name: JAVA_HOME
             valueFrom:
               configMapKeyRef:
                 key: JAVA_HOME
                 name: {{ .Values.envconfig.envname }}
           - name: JAVA_OPTS
             valueFrom:
               configMapKeyRef:
                 key: JAVA_OPTS
                 name: {{ .Values.envconfig.envname }}
           - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
             valueFrom:
               configMapKeyRef:
                 key: SW_AGENT_COLLECTOR_BACKEND_SERVICES
                 name: {{ .Values.envconfig.envname }}
           - name: SW_AGENT_NAME
             valueFrom:
               configMapKeyRef:
                 key: SW_AGENT_NAME
                 name: {{ .Values.envconfig.envname }}

           - name: POD_NAME
             valueFrom:
               fieldRef:
                 fieldPath: metadata.name
           - name: POD_IP
             valueFrom:
               fieldRef:
                 apiVersion: v1
                 fieldPath: status.podIP
           - name: POD_NAMESPACE
             valueFrom:
               fieldRef:
                 apiVersion: v1
                 fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: {{ .Values.service.port }}
              protocol: TCP

          #livenessProbe:
          #  httpGet:
          #    path: /
          #    port: http
          #readinessProbe:
          #  httpGet:
          #    path: /
          #    port: http
          resources:
            requests:
            {{- with .Values.resources.requests }}
              cpu: {{ .cpu |quote}}
              memory: {{ .memory |quote}}
            {{- end}}
            limits:
            {{- with .Values.resources.limits }}
              cpu: {{ .cpu |quote}}
              memory: {{ .memory |quote}}
            {{- end}}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "app-server.fullname" . }}
  labels:
    {{- include "app-server.labels" . | nindent 4 }}
spec:
  allocateLoadBalancerNodePorts: true
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  type: {{ .Values.service.type }}
  ports:
    - name: {{ include "app-server.fullname" . }}
      port: {{ .Values.service.port }}
      protocol: TCP
      targetPort: {{ .Values.service.port }}
  selector:
    {{- include "app-server.selectorLabels" . | nindent 4 }}
serviceaccount.yaml
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "app-server.serviceAccountName" . }}
  labels:
    {{- include "app-server.labels" . | nindent 4 }}
  {{- with .Values.serviceAccount.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
{{- end }}
ingress.yaml
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "app-server.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
  {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
  {{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "app-server.labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
  ingressClassName: {{ .Values.ingress.className }}
  {{- end }}
  {{- if .Values.ingress.tls }}
  tls:
    {{- range .Values.ingress.tls }}
    - hosts:
        {{- range .hosts }}
        - {{ . | quote }}
        {{- end }}
      secretName: {{ .secretName }}
    {{- end }}
  {{- end }}
  rules:
    {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
          - path: {{ .path }}
            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
            pathType: {{ .pathType }}
            {{- end }}
            backend:
              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
              service:
                name: {{ $fullName }}
                port:
                  number: {{ $svcPort }}
              {{- else }}
              serviceName: {{ $fullName }}
              servicePort: {{ $svcPort }}
              {{- end }}
          {{- end }}
    {{- end }}
{{- end }}
NOTES.txt
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
  {{- range .paths }}
  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
  {{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "app-server.fullname" . }})
  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "app-server.fullname" . }}'
  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "app-server.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
  echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "app-server.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}


hpa.yaml
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ include "app-server.fullname" . }}
  labels:
    {{- include "app-server.labels" . | nindent 4 }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ include "app-server.fullname" . }}
  minReplicas: {{ .Values.autoscaling.minReplicas }}
  maxReplicas: {{ .Values.autoscaling.maxReplicas }}
  metrics:
    {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
    {{- end }}
    {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
    - type: Resource
      resource:
        name: memory
        targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
    {{- end }}
{{- end }}


test.yaml

test 测试用以测试测试是否正常,可以使用busybox 等容器的curl,wget,telnet 等命令去测试端口或基础功能的正常

apiVersion: v1kind: Podmetadata:  name: "{{ include "app-server.fullname" . }}-test-connection"  labels:    {{- include "app-server.labels" . | nindent 4 }}  annotations:    "helm.sh/hook": testspec:  containers:    - name: wget      image: busybox      command: ['wget']      args: ['{{ include "app-server.fullname" . }}:{{ .Values.service.port }}']  restartPolicy: Never


注:configmap 是定义key-value 类型的配置文件,可以自由定义



5)构建多层微服务-系统整体


针对于一个 Chart 进行的,某些复杂的操作可能还需要一些依赖项目,也就是子 Chart,也叫 subcharts。

了解子 Chart 之前,需要了解子 chart 相关的一些信息:

  • 子 chart 是独立的,这意味着子 chart 不能显示依赖其父 chart

  • 所以子 chart 无法访问其父级的值

  • 父 chart 可以覆盖子 chart 的值

  • Helm 中有可以被所有 charts 访问的全局值的概念


A) 子Charts 放置在charts 文件夹内

B)共享常量与全局常量

共享常量【拷贝】

在“k8sdemo”的“values.yaml”加入下面代码,注意节点的名字必须是子chart名(例如“k8sdemo-backend”)

k8sdemo-backend:
  replicaCount: 2
k8sdemo-database:
  replicaCount: 2

在“k8sdemo”的模板里就可以通过“{{ .Values.k8sdemo-database.replicaCount }}” 来访问。当Helm发现节点名是子chart名时,它会自动拷贝这个常量到子chart的“values.yaml”中,因此,在“k8sdemo-database”中,你也可以通过“{{ .Values.replicaCount }}” 来访问这个常量。注意这里并没有包含子chart(“k8sdemo-backend”),而是只有常量名,因为子chart名只是一个标识,而不是常量名的一部分。

全局常量

共享常量只能把常量共享给一个字chart,如果你需要多个子chart之间共享,就需要创建全局常量,它用“global”来标识,下面是示例。

在“k8sdemo-backend”的"values.yaml"中定义:

global:
  k8sdemoDatabaseService: &k8sdemoDatabaseService k8sdemo-database-service
  mysqlUserName: dbuser
  mysqlUserPassword: dbuser
  mysqlPort: 3306
  mysqlHost: *k8sdemoDatabaseService
  mysqlDatabase: service_config

在“k8sdemo-database”的"values.yaml"中定义:

global:
  k8sdemoDatabaseService: k8sdemo-database-service
  mysqlUserName: dbuser
  mysqlUserPassword: dbuser
  mysqlRootPassword: root
  mysqlDatabase: service_config

在“k8sdemo-database”的“deployment.yaml”中引用。

env:
  - name: MYSQL_ROOT_PASSWORD
    value: {{ .Values.global.mysqlRootPassword }}
  - name: MYSQL_USER_NAME
    value: {{ .Values.global.mysqlUserName }}
  - name: MYSQL_USER_PASSWORD
    value: {{ .Values.global.mysqlUserPassword }}
  - name: MYSQL_DATABASE
    value: {{ .Values.global.mysqlDatabase }}

C)Chart的依赖关系

我们需要解决问题,例如:十个微服务构成一个Helm 项目如何组合定义Charts 包问题

处理Chart的依赖关系有两种方式:

  1. 嵌入式:就是直接把依赖的chart放在“charts”子目录里,这样子chart是父chart的一部分。它是一种紧耦合的关系,好处是比较简单,但不够灵活。

  2. 依赖导入式:就是各个chart是并列关系,各自单独调试部署,互相独立,需要合并时再把子chart导入父chart里,它是一种松耦合的关系,好处是比较灵活,但设计更复杂。 在这种结构下,各个chart可以单独工作也可以联合工作。只有需要在chart之间共享的常量才需要在父chart里的"values.yaml"定义,其余的在各自子chart里的"values.yaml"定义就可以了。例如父Charts 可以有dev,uat,pro 三个环境的变量,每次部署可以使用如下命令去覆盖子charts 对应环境变量,而进行不同环境的部署。

helm install --dry-run --values ./k8sdemo/values-dev.yaml --debug k8sdemo ./k8sdemo


发布于 2024-05-30 15:02・IP 属地广东


1.概述

  helm是k8s的另外一个项目,相当于linux的yum,在yum仓库中,yum不光要解决包之间的依赖关系,还要提供具体的程序包,helm仓库里面只有配置清单文件,而没有镜像,镜像还是由镜像仓库来提供,比如hub.docker.com、私有仓库.

  helm提供了一个应用所需要的所有清单文件.比如对于一个nginx,我们需要一个deployment的清单文件、一个service的清单文件、一个hpa的清单文件,把这三个文件打包到一起,就是一个应用程序的程序包,称之为Chart.

  Chart是一个helm程序包,其实质只是一个模板,我们可以对这个模板进行赋值(value),形成我们自定义的清单文件,也就实现我们生产个性化的需求,这样的仓库叫Chart仓库,一个https/http服务器.

  Helm把Kubernetes资源打包到一个chart中,而chart被保存到chart仓库,通过chart仓库可用来存储和分享chart.helm工作在k8s集群之外,helm不直接操作apiserver,而是和Tiller交互,Tlller再和apiserver交互,最后由Apiserver把chart使用config赋值,最后部署成为release.helm是tiller的客户端,管理本地的chart仓库,作用:发送chart、实例安装、查询、卸载等.

  helm先去检查chart是否存在,如果存在就把chart下载到helm本机当前用户的家目录下,然后helm把Chart和Config交给tiller,tiller和api server交互,api server把chart部署在k8s集群上,就不再叫chart了,而叫release;一个chart赋值不同,完全可以部署出多个release出来,所以可以把chart看做是一个安装包的模板,如果发现chart更新了,helm会自动滚动更新,还支持一键回滚的操作.

访问:https://github.com/helm/helm/releases下载安装包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
tar xf helm-v2.12.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
rbac配置文件样例:https://github.com/helm/helm/blob/master/docs/rbac.md
cat tiller-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
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 apply -f tiller-rbac.yaml
cat /usr/lib/systemd/system/docker.service
Environment="NO_PROXY=127.0.0.1/8,127.0.0.1/16"
kubectl get pods --all-namespaces=true
# 下面这两步没用,还得下国内的镜像,直接执行第三步
export NO_PROXY="127.0.0.1/8,127.0.0.1/16"
helm init --service-account tiller
helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.12.2 \
--stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
 
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster
Happy Helming!
helm version
Client: &version.Version{SemVer:"v2.12.2",...)
Server: &version.Version{SemVer:"v2.12.2",...)

2.使用helm

官方charts列表 https://hub.kubeapps.com/

helm默认使用的charts源地址是https://kubernetes-charts.storage.googleapis.com,需要替换为阿里的helm源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
helm repo list
NAME    URL                                                  
stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local   http://127.0.0.1:8879/charts
# helm源已经变成国内的了,下面这两步是移除默认源的,不需要执行
helm repo remove stable
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
# 添加incubator源,这个源是开发版的安装包,用起来可能不稳定
helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
#列出charts仓库中所有可用的应用
helm search
helm search mysql
helm inspect stable/mysql
# 用helm安装软件包,-name:指定release名字
helm install --name mysql1 stable/mysql
helm list # 查看安装的软件包
helm delete mysql1

helm常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
release管理:
    install
    delete
    upgrade/rollback
    list
    history:查看release历史版本
    status:获取release状态信息
chart管理:
    create:创建一个chart,生成基础chart示例性文件,供我们修改用
    fetch:下载仓库中的一个char到本地
    get
    inspect
    package
    verify
 
# helm把安装包下载到当前用户的家目录下
ll /root/.helm/cache/archive/
# 修改chart里面的values.yaml实现定制,values.yaml文件中##是注释,#是可开启的参数
helm install --name mysql1 -f /root/values.yaml stable/mysql
metrics想要能被prometheus收集数据需要在metadata中将prometheus.io/scrape:设置为true
metadata:
  annotations:
    prometheus.io/scrape'true'
# 部署完应用包后,查看release提示信息
helm status mysql1
helm fetch stable/redis
查看chart官方手册,了解每个参数的含义https://docs.helm.sh/developing_charts/#charts
# 用helm生成基础chart示例性文件,myapp是chart的名字
helm create myapp
# 做语法检查
helm lint myapp
==> Linting myapp
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
# 打包
helm package myapp/
Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz
# 启动8879仓库的服务
helm serve
# 查看local仓库里面是否有我们创建的chart包
helm search myapp
# 部署我们自定义的chart
helm install --name myapp1 local/myapp
# 删除我们部署的chart
helm delete --purge myapp1

 

参考博客:http://blog.itpub.net/28916011/viewspace-2216650/

 


认识rancher

一、简介

1、什么rancher

Rancher是一个开源软件平台,使组织能够在生产中运行和管理Docker和Kubernetes。使用Rancher,组织不再需要使用一套独特的开源技术从头开始构建容器服务平台。Rancher提供了管理生产中的容器所需的整个软件堆栈。 

2、充分发挥K8s的潜力

Kubernetes并非没有挑战,对一个集群的严格控制可能会给运营团队带来压力。关注一个以上的问题会让他们不知所措。Kubernetes很容易为您的软件引入过多的复杂性。随着越来越多的供应商围绕Kubernetes部署解决方案,避免锁定只会变得更加困难。
Rancher解决了这些问题。它开箱即用地部署Prometheus和Grafana,以便对集群和工作负载的指标进行详细的可视化。它使新Kubernetes用户部署工作负载变得非常简单,同时仍然保留所有传统的访问通道供高级用户使用。它在一个集中身份验证提供者下统一管理每个集群。它将最佳实践转化为简单的实践,这将成为更安全的系统、更高效的团队,以及企业转向市场的灵活性。

3、基础架构流程

Rancher以linux主机的形式可以从任何公有/私有云中获取原始计算资源,每个linux主机可以是虚拟机/物理机。
Rancher实现了可移植的基础架构服务层,专门为容器话应用程序提供动力,Rancher基础架构服务包括网络,存储、负载均衡、DNS和安全性。Rancher基础结构服务通常本身是作为容器部署,因此同一Rancher基础结构服务可以在来自任何云、任何linux主机上运行

4、容器编排和调度

许多用户选择使用容器编排和调度框架来运行容器话的应用程序,Rancher包括当前所有留下的容器编排和调度框架的发行版,包括Docker Swarm,Kubernetes和Mesos,同一个用户可以创建多个Swarm或Kubernetes集群,然后,他们可以使用本机Swarm或Kubernetes和Mesos集群

5、应用目录

Rancher用户只需单击以下按钮,即可从应用程序目录中部署整个多容器集群应用程序,当新版本的应用程序可用时,用户可以管理已部署的应用程序并执行全自动升级,Rancher维护由Rancher社区贡献的流行应用程序组成的公共目录。Rancher用户可以创建自己的私有目录

6、企业级控制

Rancher支持灵活的用户身份验证差价,并与Active Directory,LDAP和GitHub进行了预先构建的用户身份验证集成。Rancher在环境级别支持基于角色的访问控制(RBAC),允许用户和组共享或拒绝对开发和生产环境的访问。

7、为什么使用rancher

Rancher是供采用容器的团队使用的完整软件堆栈。它解决了在任何基础架构上管理多个Kubernetes集群的运营和安全挑战,同时为DevOps团队提供了用于运行容器化工作负载的集成工具
用户不需要深入了解kubernetes概念就可以使用rancher,rancher包含应用商店,支持一键部署helm和compose模板。rancher通过各种云、本地生态系统产品认证,其中包括安全工具,监控系统,容器仓库以及存储和网络驱动程序,下图说明rancher在IT和DevOps组织中扮演的角色,每个团队都会在他们选择的公共云或私有云上部署应用

    

8、Rancher的主要组件和功能图示

 

9、新的功能

内置CI/CD;
告警和日志收集;
多集群管理;
rancher kubernetes engine(RKE);
与云Kubernetes服务(如GKE,EKS和AKS)集成; 

二、单节点部署并穿件K8S

流程:环境---》安装docker---》安装rancher---》部署k8s

1、环境

rancher:2.3.3
kubernetes:1.16.3
docker-ce:18.06.3
centos7:3.10

两台机器:

节点ip作用
node1192.168.216.51rancher
node2192.168.216.52k8s

官方要求

2、准备

两台主机都一样的部署
关闭防火墙

[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# systemctl disable firewalld

关闭selinux

1
sed '/SELINUX/s/enforcing/disabled/g /etc/sysconfig/selinux'

设置时间同步

1
2
[root@node2 ~]# systemctl start chronyd
[root@node2 ~]# systemctl enable chronyd


修改hosts

[root@node1 ~]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.216.51 node1192.168.216.52 node2192.168.216.53 node3

 

3、安装docker-ce

两台主机都安装

1)卸载旧版本docker

1
2
3
4
5
6
7
8
9
10
11
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
container*

  

2)配置docker源

安装公钥

1
2
yum install ca-certificates ;
update-ca-trust;

  

安装必要的一些系统工具

1
2
sudo yum install -y yum-utils device-mapper-persistent-data \
lvm2 bash-completion;

  

下载源并更新

1
2
3
4
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cp docker-ce.repo /etc/yum.repos.d/
yum clean all
yum make cache

  

3)安装docker-ce并启动

定义安装版本

1
2
export docker_version=18.06.3
yum -y install --setopt=obsoletes=0 docker-ce-${version} docker-ce-selinux-${version};

  

4)更改阿里源,镜像加速

vim /usr/lib/systemd/system/=/usr/bin/dockerd-current --registry-mirror=https:

 

5)、由于Centos安全限制,RKE或者custom安装k8s时无法使用root账户可以使用其他用户来运行docker

添加rancher用户

1
adduer rancher

设置rancher秘密

1
passwd rancher

添加sudo权限

1
echo "rancher ALL=(ALL)ALL" >> /etc/sudoers

加入docker组

suermod -aG docker rancher

6)、启动docker并设置开机自启

1
2
sudo systemctl start docker
sudo systemctl enable docker

  

4、安装rancher

node1

1
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:stable

5、登录web端创建kubernetes集群

1)登录并设置密码

https:192.168.216.51/login
我这里是admin/111111

2)创建集群

先可以调成中文在点击添加集群

点击创建集群---》点击自定义

这里只修改两项:

集群名称:test1
网络驱动:选择flannel(也可以保持默认)
其他保持默认点击下一步

点击下一步

2)下一步主机选项

三个全选:etcd/control plane/worker

然后复制黑色框里的命令在需要部署的机器上执行即可

3)在需要部署的机器上执行

需要部署的节点为:node2

node2上运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[rancher@node2 ~]$ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.3.3 --server https://192.168.216.51 --token ns6x6b2pc8lltbhjbjptqgx6bwcl52rd67px4kljrzdqzmk5h66xts --ca-checksum 72ff2101ce28276ebebc41386e4f7208349b16b0c8417a9ff589624451c03a9d --etcd --controlplane --worker
Unable to find image 'rancher/rancher-agent:v2.3.3' locally
v2.3.3: Pulling from rancher/rancher-agent
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
9d0628a9505a: Pull complete
86ff83498dc8: Pull complete
75a4645b34c1: Pull complete
24a0b57bdc62: Pull complete
f4f0caf7fc9b: Pull complete
e4f54def8dda: Pull complete
Digest: sha256:ad0b39814ba3f6e1e5e16e1c2b46f02c8056298a45f5feacf833126f66fb3fd6
Status: Downloaded newer image for rancher/rancher-agent:v2.3.3
ef59b4f733e45f045110ee119836909531586ec5ab947ab96af515b496ce5a3b
[rancher@node2 ~]$

部署需要等待一会

部署完成后会显示状态active

点击机器名称进入仪表盘

 

参考:

https://docs.rancher.cn/rancher2x/#_1-what-s-rancher%EF%BC%9F

https://rancher.com/docs/rancher/v2.x/en/installation/single-node/

https://rancher.com/docs/rancher/v2.x/en/backups/

https://www.cnblogs.com/horizonli/p/10572834.html

 

转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/11753959.html


介绍

安装时要注意版本问题。

rancher 2.8.5 最高只支持到k8s v1.28, 所以选择了v1.28.10+k3s1

suse.com/suse-rancher/s


Helm CLI 快速入门 | Rancher


环境

VMware® Workstation 17 Pro  17.5.2 build-23775571
CentOS-7-x86_64-DVD-2009.iso

k3s v1.28.10+k3s1
helm-v3.15.1-linux-amd64
cert-manager v1.15.0
rancher:v2.8.5

一开始给的是4G 4C, 但是后面安装操作非常卡顿,所以最后的配置是 8G 4C

solate:vmware centos7 k8s kubeadm 安装

环境可以参考上面链接,一直配置到docker 前的配置。docker后面这些都不用安装。


k3s

官方:

curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=<VERSION> sh -s - server --cluster-init

采用国内镜像

solate:k3s centos 安装

使用国内镜像源, 或者直接离线安装

curl –sfL \
  https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
  INSTALL_K3S_VERSION=v1.28.10+k3s1 \
  INSTALL_K3S_MIRROR=cn \
  sh -


操作记录

[root@master ~]# curl –sfL \
>   https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | \
>   INSTALL_K3S_VERSION=v1.28.10+k3s1 \
>   INSTALL_K3S_MIRROR=cn \
>   sh -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0curl: (6) Could not resolve host: xn--sfl-1n0a; Unknown error
100   388  100   388    0     0    859      0 --:--:-- --:--:-- --:--:--   860
sh: line 1: syntax error near unexpected token `newline'
sh: line 1: `<?xml version="1.0" encoding="UTF-8"?>'
[root@master ~]# curl –sfL \
>   https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
>   INSTALL_K3S_VERSION=v1.28.10+k3s1 \
>   INSTALL_K3S_MIRROR=cn \
>   sh -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve host: xn--sfl-1n0a; Unknown error
100 37345  100 37345    0     0   6029      0  0:00:06  0:00:06 --:--:-- 10153
[INFO]  Using v1.28.10+k3s1 as release
[INFO]  Downloading hash rancher-mirror.rancher.cn/k3s/v1.28.10-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary rancher-mirror.rancher.cn/k3s/v1.28.10-k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Finding available k3s-selinux versions
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=extras&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=updates&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
 * base: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
http://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
To address this issue please refer to the below wiki article

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.

http://mirrors.bupt.edu.cn/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
http://mirrors.bfsu.edu.cn/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
Trying other mirror.
base                                                                                                                                       | 3.6 kB  00:00:00     
extras                                                                                                                                     | 2.9 kB  00:00:00     
updates                                                                                                                                    | 2.9 kB  00:00:00     
Package yum-utils-1.1.31-54.el7_8.noarch already installed and latest version
Nothing to do
Loaded plugins: fastestmirror, langpacks
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
rancher-k3s-common-stable                                                                                                                  | 2.9 kB  00:00:00     
rancher-k3s-common-stable/primary_db                                                                                                       | 4.6 kB  00:00:01     
Resolving Dependencies
--> Running transaction check
---> Package k3s-selinux.noarch 0:1.5-1.el7 will be installed
--> Processing Dependency: container-selinux < 2:2.164.2 for package: k3s-selinux-1.5-1.el7.noarch
--> Processing Dependency: container-selinux >= 2:2.107-3 for package: k3s-selinux-1.5-1.el7.noarch
--> Running transaction check
---> Package container-selinux.noarch 2:2.119.2-1.911c772.el7_8 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================================================================================
 Package                              Arch                      Version                                        Repository                                    Size 
==================================================================================================================================================================
Installing:
 k3s-selinux                          noarch                    1.5-1.el7                                      rancher-k3s-common-stable                     16 k 
Installing for dependencies:
 container-selinux                    noarch                    2:2.119.2-1.911c772.el7_8                      extras                                        40 k 

Transaction Summary
==================================================================================================================================================================
Install  1 Package (+1 Dependent package)

Total download size: 56 k
Installed size: 135 k
Downloading packages:
warning: /var/cache/yum/x86_64/7/extras/packages/container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY ETA 
Public key for container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm is not installed
(1/2): container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm                                                                                |  40 kB  00:00:05     
warning: /var/cache/yum/x86_64/7/rancher-k3s-common-stable/packages/k3s-selinux-1.5-1.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID e257814a: NOKEY- ETA 
Public key for k3s-selinux-1.5-1.el7.noarch.rpm is not installed
(2/2): k3s-selinux-1.5-1.el7.noarch.rpm                                                                                                    |  16 kB  00:00:06     
------------------------------------------------------------------------------------------------------------------------------------------------------------------Total                                                                                                                             7.7 kB/s |  56 kB  00:00:07     
Retrieving key from https://rpm.rancher.io/public.key
Importing GPG key 0xE257814A:
 Userid     : "Rancher (CI) <ci@rancher.com>"
 Fingerprint: c8cf f216 4551 26e9 b9c9 18be 925e a29a e257 814a
 From       : https://rpm.rancher.io/public.key
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-9.2009.0.el7.centos.x86_64 (@anaconda)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch                                                                                             1/2 
setsebool:  SELinux is disabled.
  Installing : k3s-selinux-1.5-1.el7.noarch                                                                                                                   2/2 
  Verifying  : k3s-selinux-1.5-1.el7.noarch                                                                                                                   1/2 
  Verifying  : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch                                                                                             2/2 

Installed:
  k3s-selinux.noarch 0:1.5-1.el7

Dependency Installed:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8

Complete!
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s
[root@master ~]#

会自动安装依赖安装 k3s-selinux , container-selinux 。


查看版本

[root@master ~]# k3s -v
k3s version v1.28.10+k3s1 (a4c5612e)
go version go1.21.9

查看节点

[root@master ~]# kubectl get node
NAME     STATUS   ROLES                  AGE    VERSION
master   Ready    control-plane,master   115s   v1.28.10+k3s1


保存config

官方文档写的是

scp root@192.168.232.5:/etc/rancher/k3s/k3s.yaml ~/.kube/config

但是我们是本机安装,所以直接拷贝

cp /etc/rancher/k3s/k3s.yaml ~/.kube/config


镜像加速

solate:containerd k3s 镜像加速

添加代理

cat > /etc/rancher/k3s/registries.yaml << EOF
mirrors:
  docker.io:
    endpoint:
      - "https://fsp2sfpr.mirror.aliyuncs.com/"
      - "https://docker.mirrors.sjtug.sjtu.edu.cn"
EOF

重启

systemctl restart k3s


报错1

正常安装不会出现, 如果出现报错

Error: INSTALLATION FAILED: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp [::1]:8080: connect: connection refused

使用下面的命令添加

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pods --all-namespaces
helm ls --all-namespaces



helm

安装Helm

本次直接使用压缩包。

  1. 获取二进制文件

  2. 移动到 /usr/local/bin/

[root@master kk]# vmhgfs-fuse .host:/ /mnt/hgfs -o nonempty
[root@master kk]# cp /mnt/hgfs/workspace/helm-v3.15.1-linux-amd64.tar.gz .
[root@master kk]# tar -zxvf helm-v3.15.1-linux-amd64.tar.gz 
[root@master kk]# mv linux-amd64/helm /usr/local/bin/helm

验证

[root@master ~]# helm version
version.BuildInfo{Version:"v3.15.1", GitCommit:"e211f2aa62992bd72586b395de50979e31231829", GitTreeState:"clean", GoVersion:"go1.22.3"}


WARNING 提示解决

[root@master ~]# helm version
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config    
version.BuildInfo{Version:"v3.15.1", GitCommit:"e211f2aa62992bd72586b395de50979e31231829", GitTreeState:"clean", GoVersion:"go1.22.3"}

碰到WARNING 提示解决

删除Helm使用时关于kubernetes文件的警告_kubernetes configuration file is group-readable. t-CSDN博客

前两行警告信息的意思是当前使用的kubernetes的配置文件不安全,同用户组的用户和其他用户都可以读取这个文件

[root@master ~]# ll .kube/config 
-rw-rw-rw- 1 root root 2965 Jun 28 11:03 .kube/config

可以看到组内用户拥有读写权限(第二个rw),其他用户拥有读权限(第三个r)。

解决这个告警,修改权限即可:

[root@master ~]# chmod g-rw ~/.kube/config
[root@master ~]# chmod o-r ~/.kube/config
[root@master ~]# ll .kube/config 
-rw-----w- 1 root root 2965 Jun 28 11:03 .kube/config

再次执行helm命令,告警信息已经没有了:

[root@master ~]# helm version
version.BuildInfo{Version:"v3.15.1", GitCommit:"e211f2aa62992bd72586b395de50979e31231829", GitTreeState:"clean", GoVersion:"go1.22.3"}


cert-manager

由于Rancher Manager Server 默认需要SSL/TLS 配置来保证访问安全性,所以需要部署cert-manager, 用于自动签发证书使用。

也可以使用真实域名及真实域名证书。

cert-manager.io/docs/in

  1. 添加helm 仓库

helm repo add jetstack https://charts.jetstack.io --force-update

2. 安装cert-manager

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.15.0 \
  --set crds.enabled=true

输出

NAME: cert-manager
LAST DEPLOYED: Sat Jun 15 19:39:39 2024
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
cert-manager v1.15.0 has been deployed successfully!

In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).

More information on the different types of issuers and how to configure them
can be found in our documentation:

https://cert-manager.io/docs/configuration/

For information on how to configure cert-manager to automatically provision
Certificates for Ingress resources, take a look at the `ingress-shim`
documentation:

https://cert-manager.io/docs/usage/ingress/

查看结果

[root@master kk]# kubectl get pods -n cert-manager
NAME                                      READY   STATUS    RESTARTS   AGE
cert-manager-5968cf46f7-rhfb7             1/1     Running   0          4m42s
cert-manager-cainjector-ffdb48d95-gcb9l   1/1     Running   0          4m42s
cert-manager-webhook-cd4d58467-zzwx5      1/1     Running   0          4m42s


rancher

  1. 添加仓库

helm repo add rancher-latest https://releases.rancher.com/server-charts/latest

2. 创建命名空间

kubectl create namespace cattle-system

3. 安装rancher

安装 Rancher 的最终命令如下。该命令需要一个将流量转发到 Linux 主机的域名。为了简化本教程,你可以使用假域名。<IP_OF_LINUX_NODE>.sslip.io是一个假域名的例子。

要安装特定的 Rancher 版本,请使用--version标志(例如,--version 2.6.6)。否则,默认安装最新的 Rancher

请注意,密码至少需要 12 个字符。

操作 创建install.sh 文件, 改为国内镜像源,

[root@master ~]# mkdir -p workspace/rancher && cd workspace/rancher
[root@master rancher]# vim install.sh
[root@master rancher]# cat install.sh 
helm install rancher rancher-latest/rancher \
  --namespace cattle-system \
  --set hostname=192.168.232.5.sslip.io \
  --set replicas=1 \
  --set bootstrapPassword=root@123456789 \
  --set rancherImage=registry.cn-hangzhou.aliyuncs.com/rancher/rancher \
  --set systemDefaultRegistry=registry.cn-hangzhou.aliyuncs.com

启动脚本

[root@master rancher]# chmod +x install.sh 
[root@master rancher]# ./install.sh

等待pod 启动, 这样配置后,使用的镜像是是国内阿里云的镜像

registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.8.5

查看pod 启动情况

[root@master ~]#  kubectl get pods -n cattle-system
NAME                               READY   STATUS      RESTARTS   AGE
rancher-657b6f9f7d-xz8v8           1/1     Running     0          27m
helm-operation-nfrmt               0/2     Completed   0          22m
helm-operation-jf8x6               0/2     Completed   0          21m
helm-operation-48dbx               0/2     Completed   0          20m
rancher-webhook-868c78c94c-ksjgj   1/1     Running     0          20m
helm-operation-vs9pb               0/2     Completed   0          20m
helm-operation-f8rh4               0/2     Completed   0          19m
helm-operation-sb675               0/2     Completed   0          17m


根据提示获取访问地址

[root@master rancher]# echo https://192.168.232.5.sslip.io/dashboard/?setup=$(kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}')
https://192.168.232.5.sslip.io/dashboard/?setup=root@123456789
[root@master rancher]# kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{ "\n" }}'
root@123456789


因为是本机,所以需要修改hosts 文件

vim /etc/hosts

使用虚拟机中的firefox 访问会一直加载中,所以配置宿主机

修改win宿主机的hosts文件, 打开下面目录,找到hosts 文件

C:\Windows\System32\drivers\etc

修改host, 添加路由, 已管理员身份运行

192.168.232.5 192.168.232.5.sslip.io

在虚拟机中的界面firefox会一直转圈,

但是宿主机上是可以正常显示的。

显示界面

  1. 点击高级,继续前往

2. 进入登录界面, 输入密码进行登录 , 密码是刚才设置的 root@123456789

3. 前往地址, 需要勾选协议, 同意该协议,然后continue

4. 这样就进入了管理首页

pod 启动

使用pod 查看命令

[root@master ~]#  kubectl get pods -n cattle-system
NAME                               READY   STATUS      RESTARTS   AGE
rancher-657b6f9f7d-xz8v8           1/1     Running     0          35m
helm-operation-nfrmt               0/2     Completed   0          30m
helm-operation-jf8x6               0/2     Completed   0          29m
helm-operation-48dbx               0/2     Completed   0          28m
rancher-webhook-868c78c94c-ksjgj   1/1     Running     0          28m
helm-operation-vs9pb               0/2     Completed   0          28m
helm-operation-f8rh4               0/2     Completed   0          27m
helm-operation-sb675               0/2     Completed   0          25m
helm-operation-6xcxs               0/2     Completed   0          45s

有时候 helm-operation-xxx 状态会是Error, 但是不影响进入管理端。这些是和rancher-webhook 有关的一些pod, 可以先暂时忽略,等使用到的时候在去修复。


rancher 版本

有些版本在安装的时候会有这样或那样的问题导致安装有问题,这里记录一下现在正在运行的rancher版本号

[root@master ~]# kubectl describe pods -n cattle-system rancher-657b6f9f7d-xz8v8

可以看到使用的镜像是 rancher:v2.8.5

Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.8.5" in 3m34.589s



参考


k3s详细安装+rancher2.7界面展示

K3s+Rancher构建轻量k8s集群

How to install K3S and Rancher using Helm and manage Raspberry Pi CM4 cluster



编辑于 2024-07-14 12:37・IP 属地四川


关于 K3S

K3S 是专门针对 IoT 和边缘计算(Edge computing)设备开发的轻量级 Kubernetes 集群软件,特别适合低配置硬件的设备上使用比如树莓派(Raspberry Pi)或者OpenWrt的路由器设备上。K3S有单机和高可用(High-Availability)两种使用方式,官方文档在这里

安装 K3S

K3S 的安装非常简单,你可以通过一下命令直接安装。

curl -sfL https://get.k3s.io | sh -

但是有几个点需要注意的是,如果你的公网IP没有直接绑定到机器上(通过命令 ifconfig 查看)那么则需要加上--tls-san ip这个参数,以到达从公网通过 kube-config 来访问集群。

curl -sLS https://get.k3s.io | INSTALL_K3S_EXEC='server --tls-san 10.10.10.10' sh -

等待安装成功后,就可将 kubernetes 集群的 kubeconfig 文件下载本地电脑中,默认存放到 ~/.kube/ 目录中

cat /etc/rancher/k3s/k3s.yaml

修改 kubeconfig 文件的IP地址内容来达到远程访问管理集群的目的。

server: https://10.10.10.10:6443

接着在本地电脑的 Terminal 命令行工具中导出 kubeconfig 的环境变量即可。

export KUBECONFIG=~/.kube/my-k3s

添加 Worker 节点

如果有多台机器组成集群的话,可以给安装命令添加 K3S_TOKEN=mynodetoken 来完成。
K3S_TOKEN 存储在 master 节点的 /var/lib/rancher/k3s/server/node-token

如果 Worker 节点已经安装成功,则可以通过下面的命令来加入集群。

K3S_TOKEN=SECRET k3s agent --server https://fixed-registration-address:6443

Helm

Helm 是 kubernetes 非常好用的软件管理工具,K3S 默认开启 Helm 的支持。本地电脑可以通过官方文档的页面进行安装。安装后需要手动添加 Stable Repo

helm repo add stable https://kubernetes-charts.storage.googleapis.com
注意:本文例子都使用 Helm3 来操作,Helm 的 2.x 版本与 3.x 版本使用上有些不同。

Traefik

Traefik 是 kubernetes 的路由组件,可以将访问流量分发到不同的服务,可以简单理解为 Nginx。K3S 同样默认安装了该组件,你可以试着访问你的 IP 地址看看,如果你能看到一个 404 网页,那么说明 traefik 组件已经正常工作了。

Local Storage Provider

K3S 同样默认安装了本地存储服务,方便支持部署有状态的服务,比如 MySQL。你可以通过下面的命令查看状态。

kubectl get storageclass## 你将会看到如下的信息NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  47m

TLS 证书的自动化配置

Let’s Encrypt 是一个免费的 TLS 证书颁发服务,我们可以利用它来为我们自己的服务做 HTTPS 加持。因为 Let's Encrypt 颁发的证书只有 90 天的有效期,所以我们需要一个定时任务在证书过期之前延续有效期。还有就是当我们部署新服务的时候,也需要自动帮我们生成一个新的证书。

cert-manager 就是这样的一个服务,根据官方文档的描述,我们可以通过下面的方式来安装它。

# 首先我们添加自定义资源kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.13.0/deploy/manifests/00-crds.yaml# 接着创建命名空间kubectl create namespace cert-manager# 添加 Helm 的 Repohelm repo add jetstack https://charts.jetstack.io# 最后通过 Helm 进行安装helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v0.13.1

接下来需要创建一个 Issuer 资源,用来关联 Let's Encrypt 操作证书,关于 cert-managger 的 Issues 概念的更多信息,可以查看官网文档

# 下面这条命令,会在当前目录创建一个 letsencrypt-prod-issuer.yaml 文件,然后写入下面。cat <<EOF > letsencrypt-prod-issuer.yaml
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:    # You must replace this email address with your own.
    # Let's Encrypt will use this to contact you about expiring
    # certificates, and issues related to your account.
    email: gongzili456@gmail.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:      # Secret resource used to store the account's private key.
      name: letsencrypt-prod    # Add a single challenge solver, HTTP01 using nginx
    solvers:
      - http01:
          ingress:            class: traefik
EOF# 然后通过上面创建的文件来创建 Issues 资源kubectl apply -f letsencrypt-prod-issuer.yaml

安装应用

现在我们已经拥有一个完备的 kubernetes 集群了,是时候安装一个应用了。这里选用安装 nginx 项目来达到演示效果,你可以在这里查看部署的配置文件。

kubectl apply -f https://gist.githubusercontent.com/gongzili456/6f03623771ed02ea4a937aa969ac6d2d/raw/e156ebf8a4d168b7a8562a3a827daf8f22a6a1d8/nginx-k8s.yaml

删除演示应用

kubectl delete -f https://gist.githubusercontent.com/gongzili456/6f03623771ed02ea4a937aa969ac6d2d/raw/e156ebf8a4d168b7a8562a3a827daf8f22a6a1d8/nginx-k8s.yaml

至此我们拥有了一个基本可用的部署环境,方便我们做 side project。