【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏: 云原生K8S,零基础到进阶实战
景天的主页: 景天科技苑

文章目录

  • Helm
    • 引言
    • 环境准备
      • [1. 主机初始化配置](#1. 主机初始化配置)
      • [2. 部署Docker环境](#2. 部署Docker环境)
      • [3. 部署Kubernetes集群](#3. 部署Kubernetes集群)
    • 安装Helm
      • [1. 下载并安装Helm](#1. 下载并安装Helm)
      • [2. 初始化Helm](#2. 初始化Helm)
      • [3. 配置Helm仓库](#3. 配置Helm仓库)
    • 使用Helm部署应用
      • [1. 查找Chart](#1. 查找Chart)
      • [2. 安装Chart](#2. 安装Chart)
      • [3. 查看部署状态](#3. 查看部署状态)
      • [4. 自定义Chart](#4. 自定义Chart)
      • [5. 升级Chart](#5. 升级Chart)
      • [6. 回滚Chart](#6. 回滚Chart)
      • [7. 删除Chart](#7. 删除Chart)
      • [8. 创建自己的Chart](#8. 创建自己的Chart)
      • [9. Helm Chart的高级功能](#9. Helm Chart的高级功能)
        • [9.1 依赖管理](#9.1 依赖管理)
        • [9.2 模板功能](#9.2 模板功能)
        • [9.3 钩子(Hooks)](#9.3 钩子(Hooks))
        • [9.4 Chart版本管理](#9.4 Chart版本管理)
        • [9.5 Chart测试](#9.5 Chart测试)
      • [10. Helm与CI/CD集成](#10. Helm与CI/CD集成)
    • 结论

Helm

引言

随着容器化和微服务架构的普及,Kubernetes(简称K8s)已成为云原生应用部署和管理的首选平台。然而,对于复杂的Kubernetes应用,直接通过kubectl管理大量的YAML配置文件变得非常繁琐和容易出错。Helm,作为Kubernetes的包管理工具,通过引入Chart概念,极大地简化了Kubernetes应用的部署、升级、回滚和删除过程。本教程将结合实际案例,详细介绍如何通过Helm来管理Kubernetes集群。

环境准备

1. 主机初始化配置

在部署Kubernetes集群之前,我们需要准备几台满足要求的服务器。推荐配置为CPU: 2C+,Memory: 2G+。所有主机需要禁用防火墙和SELinux,并配置好主机名和hosts文件。

bash 复制代码
# 禁用SELinux
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

# 关闭防火墙和网络管理器
systemctl stop firewalld
systemctl disable firewalld
systemctl stop NetworkManager
systemctl disable NetworkManager

# 配置主机名
hostnamectl set-hostname k8s-master
echo "192.168.147.137 k8s-master" >> /etc/hosts
# 类似地,为其他节点配置主机名和hosts

# 安装必要的工具
yum -y install vim wget net-tools lrzsz

# 禁用swap
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

# 配置网络桥接
cat <<EOF >> /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF
modprobe br_netfilter
sysctl -p

2. 部署Docker环境

Kubernetes依赖Docker来管理容器,因此需要在所有节点上安装Docker。推荐使用阿里云的YUM源来安装Docker。

bash 复制代码
# 添加Docker的YUM源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all && yum makecache fast

# 安装Docker
yum -y install docker-ce

# 启动Docker服务
systemctl start docker
systemctl enable docker

# 配置Docker镜像加速
cat <<END > /etc/docker/daemon.json
{
  "registry-mirrors": ["https://nyakyfun.mirror.aliyuncs.com"]
}
END
systemctl daemon-reload
systemctl restart docker

3. 部署Kubernetes集群

这里我们使用kubeadm来部署Kubernetes集群。详细步骤包括安装kubelet、kubeadm、kubectl,配置init-config.yaml,初始化master节点,加入node节点等。

bash 复制代码
# 配置阿里云YUM源(略)

# 安装kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl

# 初始化master节点(详细步骤省略,需要配置init-config.yaml)
kubeadm init --config=init-config.yaml

# 将kubeadm join命令保存到文件,以便后续添加node节点
kubeadm join ... > join-command.sh

# 在node节点上执行kubeadm join命令
# scp join-command.sh k8s-node01:/root
# scp join-command.sh k8s-node02:/root
# 在每个node节点上执行 bash join-command.sh

# 安装flannel网络插件(略)

安装Helm

1. 下载并安装Helm

Helm是一个命令行工具,可以从其GitHub仓库下载并安装。

bash 复制代码
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

2. 初始化Helm

Helm 3版本移除了Tiller组件,简化了初始化流程。

bash 复制代码
# 初始化Helm,无需指定kube-context(如果使用默认的kube-context)
helm init

# 或者,如果您有多个Kubernetes集群上下文,可以指定kube-context
# helm init --kube-context [CONTEXT_NAME]

3. 配置Helm仓库

Helm支持从多个仓库中查找和安装Chart。首先,需要添加您需要的Helm仓库。

bash 复制代码
helm repo add stable https://charts.helm.sh/stable
helm repo update

使用Helm部署应用

1. 查找Chart

在部署应用之前,您可能需要查找适合您需求的Helm Chart。Helm提供了一个搜索功能,允许您按名称或描述查找Chart。

bash 复制代码
helm search repo nginx

这将列出所有与nginx相关的Chart,包括它们所属的仓库、版本以及简短描述。

2. 安装Chart

找到您需要的Chart后,就可以使用helm install命令来安装它了。以下是一个安装Nginx Chart的示例:

bash 复制代码
helm install my-nginx stable/nginx

在这个命令中,my-nginx是您给这个Nginx部署的自定义名称,stable/nginx是Chart的标识符(包括仓库名和Chart名)。

3. 查看部署状态

安装完成后,您可以使用kubectl命令来查看部署的状态。

bash 复制代码
kubectl get pods

您应该能看到与my-nginx相关的Pod正在运行。

4. 自定义Chart

Helm允许您通过values文件来自定义Chart。values文件是一个YAML文件,其中包含了可以覆盖Chart默认配置的键值对。

首先,您可以使用helm show values命令来查看Chart的默认values文件。

bash 复制代码
helm show values stable/nginx

然后,您可以创建一个自定义的values文件,例如custom-values.yaml,并在其中设置您想要的配置。

yaml 复制代码
# custom-values.yaml
replicaCount: 3
service:
  type: LoadBalancer
  port: 80

最后,在安装Chart时指定这个values文件。

bash 复制代码
helm install my-nginx-custom stable/nginx -f custom-values.yaml

5. 升级Chart

当Chart的新版本发布时,您可以使用helm upgrade命令来升级已部署的Chart。

bash 复制代码
helm upgrade my-nginx stable/nginx

如果您想同时应用一些自定义配置,可以像安装时一样指定values文件。

6. 回滚Chart

如果升级后出现问题,您可以使用helm rollback命令将Chart回滚到之前的版本。

bash 复制代码
helm rollback my-nginx [REVISION]

其中[REVISION]是您想要回滚到的版本编号。您可以使用helm history my-nginx命令来查看部署的历史版本。

7. 删除Chart

当您不再需要某个Chart时,可以使用helm uninstall命令来删除它。

bash 复制代码
helm uninstall my-nginx

这将删除与该Chart相关的所有Kubernetes资源,但不会删除Chart本身或values文件。

8. 创建自己的Chart

除了使用现有的Chart之外,Helm还允许您创建自己的Chart。这通常涉及以下几个步骤:

  1. 创建一个Chart目录结构。
  2. 编写Chart.yaml文件来描述Chart的基本信息。
  3. 编写values.yaml文件来定义可配置的参数。
  4. 编写Kubernetes模板文件(通常是YAML文件),这些文件将使用Go模板语言来动态生成Kubernetes资源定义。
  5. 使用helm lint命令来验证Chart的格式和语法。
  6. 使用helm package命令将Chart打包为tar.gz文件。
  7. (可选)将Chart添加到Helm仓库中,以便其他人可以安装它。

创建自己的Chart需要一定的Kubernetes和Helm知识,但一旦掌握了,就可以大大提高在Kubernetes上部署和管理应用的效率。

9. Helm Chart的高级功能

Helm Chart不仅仅是一个简单的应用部署工具,它还支持许多高级功能,可以帮助您更灵活地管理Kubernetes资源。

9.1 依赖管理

Helm Chart可以声明对其他Chart的依赖。这意味着您可以创建一个Chart,它依赖于其他Chart来提供某些功能或服务。当您安装这个Chart时,Helm会自动解析依赖关系,并按照正确的顺序安装所有必要的Chart。

Chart.yaml文件中,您可以使用dependencies字段来声明依赖项。但是,从Helm 3开始,推荐使用helm dependency命令来管理依赖项,而不是直接在Chart.yaml中声明它们。

bash 复制代码
# 初始化Chart的依赖目录
helm dependency init

# 更新Chart的依赖项
helm dependency update
9.2 模板功能

Helm Chart使用Go模板语言来动态生成Kubernetes资源定义。这意呀着您可以在模板中嵌入逻辑,以便根据不同的配置或环境生成不同的资源。

模板文件通常位于Chart的templates目录中,并以.yaml.tpl结尾。在模板中,您可以使用{``{ ... }}来包含Go模板表达式,这些表达式可以访问values文件中的数据、Helm的内置对象(如Release对象)以及自定义的函数和管道。

9.3 钩子(Hooks)

Helm Chart支持钩子,这是一种在Chart生命周期的特定点运行的特殊模板。钩子允许您在安装、升级、删除Chart之前或之后执行自定义操作,例如加载配置、执行测试或清理资源。

钩子是通过在模板文件的文件名中添加特定的注释来定义的。Helm会识别这些注释,并在适当的生命周期点执行相应的模板。

例如,您可以在Chart中定义一个post-install钩子来执行一些安装后的初始化任务:

yaml 复制代码
# templates/post-install-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: "{{ .Release.Name }}-post-install-job"
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: post-install-job
        image: "my-image"
        command: ["/bin/sh", "-c", "echo Hello from the post-install hook > /usr/share/nginx/html/index.html"]
      restartPolicy: Never
9.4 Chart版本管理

Helm Chart遵循语义化版本控制(SemVer 2),这意味着Chart的版本号遵循主版本号.次版本号.修订号的格式。当您更新Chart时,应该根据所做的更改的类型来递增相应的版本号部分。

Helm仓库中的Chart版本是独立的,但您可以在Chart的Chart.yaml文件中指定对特定Chart版本的依赖。这有助于确保安装的Chart之间的兼容性。

9.5 Chart测试

Helm支持在Chart中定义测试,这些测试将在Chart安装后自动运行。这有助于验证Chart是否按预期工作,并捕获可能的问题。

测试是通过在Chart的templates目录中定义测试模板来完成的。这些模板通常定义Kubernetes作业(Job)或Pod,它们包含执行测试所需的命令和脚本。

在Chart的Chart.yaml文件中,您可以使用schema字段来指定测试模板的路径。然后,您可以使用helm test命令来运行这些测试。

bash 复制代码
helm test my-nginx

10. Helm与CI/CD集成

Helm非常适合与持续集成/持续部署(CI/CD)管道集成,以实现自动化和可重复的Kubernetes应用部署。通过将Helm Chart存储在版本控制系统中,并在CI/CD管道中执行Helm命令,您可以确保每次部署都使用相同的配置和依赖项。

许多CI/CD工具(如Jenkins、GitLab CI/CD、GitHub Actions等)都支持Helm命令,并且可以轻松地将它们集成到您的部署流程中。

结论

Helm是一个功能强大的Kubernetes包管理工具,它通过引入Chart概念,极大地简化了Kubernetes应用的部署、升级、回滚和删除过程。通过使用Helm,您可以更高效地管理复杂的Kubernetes集群,并确保您的应用在不同的环境中以一致的方式运行。

通过本教程,您已经了解了Helm的基础知识,包括环境准备、安装、使用Chart、自定义Chart、升级、回滚和删除Chart,以及创建自己的Chart。此外,您还学习了Helm的一些高级功能,如依赖管理、模板功能、钩子、版本管理和测试。最后,您还了解了如何将Helm与CI/CD集成,以实现自动化

相关推荐
m0_741768855 小时前
使用docker的小例子
运维·docker·容器
最新小梦8 小时前
Docker日志管理
运维·docker·容器
ZHOU西口9 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
苓诣9 小时前
Submariner 部署全过程
云计算·k8s
有你的晚安._9 小时前
pod基本概念
kubernetes
Persistence is gold12 小时前
cassandra指定配置文件的docker启动方法
运维·docker·容器
C语言扫地僧13 小时前
Docker 镜像制作(Dockerfile)
linux·服务器·docker·容器
橙子家13 小时前
k8s 中的 Ingress 简介【k8s 系列之三】
k8s
无名之逆16 小时前
云原生(Cloud Native)
开发语言·c++·算法·云原生·面试·职场和发展·大学期末
Richardlygo17 小时前
(k8s)Kubernetes部署Promehteus
云原生·容器·kubernetes