北戴河网站建设,做网页价格,公司品牌的塑造网站建设,网站推广设计制作Helm 使用
Helm 是一个 k8s 应用的包管理工具#xff0c;类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。
Helm 使用 chart 来封装 k8s 应用的 yaml 文件#xff0c;我们只需要设置自己的参数#xff0c;就可以实现自动化的快速部署应用。
Helm 通过打包的方式#xff0c;支…Helm 使用
Helm 是一个 k8s 应用的包管理工具类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。
Helm 使用 chart 来封装 k8s 应用的 yaml 文件我们只需要设置自己的参数就可以实现自动化的快速部署应用。
Helm 通过打包的方式支持发布的版本管理和控制很大程度上简化了 k8s 应用的部署和管理。
Helm 有一个跟 docker Hub 类似的应用中心https://artifacthub.io/我们可以在里面找到我们需要部署的应用。
helm 概述
Helm 是一个流行的 k8s 包管理工具它用于简化在 k8s 上部署、管理和扩展应用程序的过程。Helm 允许用户定义可重复使用的 k8s 部署模板称为 “charts”并使用这些 charts 来创建、配置和管理 k8s 中的应用程序。
Helm 由两个核心组件组成 Helm Clienthelm这是与用户交互的命令行工具。用户可以使用 Helm Client 来搜索、安装、升级和删除 charts并管理 Helm Repositories存储 charts 的位置。 Tiller已弃用在 Helm 2.x 版本中Tiller 是 Helm 的服务端组件负责将 charts 渲染为 k8s 资源对象并将它们部署到 k8s 集群中。然而在 Helm 3.x 版本中Tiller 已被移除取而代之的是直接通过 Helm Client 与 k8s API 交互。
Helm 的主要优势在于它提供了模板化的部署方式使得应用程序的部署过程更加可重复和可管理。通过使用 Helm您可以轻松地创建自定义的 charts并轻松地在不同的环境中部署和管理应用程序从而提高了开发人员和运维人员的效率。
helm 优点
Helm 在 k8s 中具有许多优点以下是其中一些主要优点
简化部署和管理Helm 允许用户将应用程序打包为可重复使用的 charts简化了应用程序的部署和管理过程。通过使用 Helm用户可以轻松地创建、安装、升级和删除应用程序而无需手动处理底层的 k8s 资源对象。可重用的部署模板Helm Charts 是可重用的部署模板可以定义应用程序的整个部署配置包括容器、服务、配置文件、存储卷等。这样用户可以通过 Charts 快速创建和部署应用程序减少了编写和维护大量 YAML 文件的工作量。版本控制和回滚Helm 具备版本控制功能可以管理不同版本的 Charts 和应用程序。这使得用户可以轻松地进行升级、回滚和管理应用程序的不同版本提高了应用程序的可控性和可靠性。社区支持和生态系统Helm 是一个开源项目有一个活跃的社区支持和贡献。Helm 社区维护了一个官方的 Charts 仓库其中包含了大量常用的应用程序 Charts用户可以直接使用这些 Charts 来部署和管理应用程序。此外还有许多第三方 Charts 仓库可供选择扩展了 Helm 的功能和应用场景。可扩展性和灵活性Helm 具有良好的扩展性和灵活性用户可以根据自己的需求定制 Charts 和插件以满足特定的部署和管理需求。用户可以根据需要配置应用程序的各种参数和选项以适应不同的环境和场景。
总的来说Helm 提供了简化和标准化 k8s 应用程序部署和管理的解决方案使得用户能够更高效地进行应用程序的开发、部署和运维工作。
安装 helm
安装地址https://helm.sh/zh/docs/intro/install/
# 国内下载不了
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash我们手动下载安装包
wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz[rootk8s-master home]# ll
total 14196
-rw-r--r-- 1 root root 14530566 Mar 27 04:05 helm-v3.10.0-linux-amd64.tar.gz
drwxr-xr-x 2 root root 4096 Mar 27 02:31 k8s下载完成后解压
# 解压压缩包
[rootk8s-master home]# tar -zxvf helm-v3.10.0-linux-amd64.tar.gz
linux-amd64/
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
[rootk8s-master home]# cd linux-amd64/
[rootk8s-master linux-amd64]# ll
total 43992
-rwxr-xr-x 1 3434 3434 45031424 Sep 22 2022 helm
-rw-r--r-- 1 3434 3434 11373 Sep 22 2022 LICENSE
-rw-r--r-- 1 3434 3434 3367 Sep 22 2022 README.md
# 在解压目中找到helm程序移动到需要的目录中
[rootk8s-master linux-amd64]# mv helm /usr/local/bin
# 出现以下版本信息代表安装成功
[rootk8s-master linux-amd64]# helm version
version.BuildInfo{Version:v3.10.0, GitCommit:ce66412a723e4d89555dc67217607c6579ffcb21, GitTreeState:clean, GoVersion:go1.18.6}添加一个稳定仓库
# 添加稳定仓库
[rootk8s-master linux-amd64]# helm repo add bitnami https://charts.bitnami.com/bitnami
bitnami has been added to your repositories
# 验证仓库是否添加完成
[rootk8s-master linux-amd64]# helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami三大概念
Chart 代表着 Helm 包。
它包含运行应用程序需要的所有资源定义和依赖相当于模版。类似于 maven 中的 pom.xml、Apt中的 dpkb 或 Yum 中的 RPM。
Repository仓库用来存放和共享 charts。
不用的应用放在不同的仓库中。
Release 是运行 chart 的实例。
一个 chart 通常可以在同一个集群中安装多次。
每一次安装都会创建一个新的 releaserelease name 不能重复。
下载一个 mysql 来启动
helm 的仓库中心https://artifacthub.io/相当于 docker hub
进入这个页面搜索 mysql里面有下载的命令以及配置参数的详细信息
下载命令容器名为my-mysql
helm install my-mysql bitnami/mysql参数
--set后面跟 keyvalue 的格式用于配置使用容器的一些参数key 在页面中有详细介绍--version指定容器的 charts 的版本默认是最新版
接下来我们下载一个 mysql 玩玩
helm install my-mysql --set-string auth.rootPassword123456 bitnami/mysql[rootk8s-master linux-amd64]# helm install my-mysql --set-string auth.rootPassword123456 bitnami/mysql
NAME: my-mysql
LAST DEPLOYED: Wed Mar 27 04:24:17 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 10.1.0
APP VERSION: 8.0.36# helm安装项目之后它会帮我们生成一个详细的使用文档
** Please be patient while the chart is being deployed **Tip:Watch the deployment status using the command: kubectl get pods -w --namespace default# 在k8s网络中如何访问该服务
Services:echo Primary: my-mysql.default.svc.cluster.local:3306Execute the following to get the administrator credentials:echo Username: rootMYSQL_ROOT_PASSWORD$(kubectl get secret --namespace default my-mysql -o jsonpath{.data.mysql-root-password} | base64 -d)# 连接到数据库的方式
To connect to your database:1. Run a pod that you can use as a client:kubectl run my-mysql-client --rm --tty -i --restartNever --image docker.io/bitnami/mysql:8.0.36-debian-12-r8 --namespace default --env MYSQL_ROOT_PASSWORD$MYSQL_ROOT_PASSWORD --command -- bash2. To connect to primary service (read/write):mysql -h my-mysql.default.svc.cluster.local -uroot -p$MYSQL_ROOT_PASSWORDWARNING: There are resources sections in the chart not set. Using resourcesPreset is not recommended for production. For production installations, please set the following values according to your workload needs:- primary.resources- secondary.resources
info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/它的本质是在我们的 k8s 集群上启动了一个 pod
[rootk8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-mysql-1 1/1 Running 0 3m14s # stafulset类型的可以部署有状态应用。
# **Release** 是运行 chart 的实例。
[rootk8s-master ~]# helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP
my-mysql default 1 2024-3-27 13:38:53.228239944 0800 CST deployed mysql-10.1.0 8.0.36 探究 helm
[rootk8s-master k8s]# helm create hello-world
Creating hello-world
[rootk8s-master k8s]# cd hello-world/
[rootk8s-master hello-world]# ll
total 16
drwxr-xr-x 2 root root 4096 Mar 27 04:44 charts # 当前我们创建的这个charts是否依赖与其他的charts如果有就在这里面
-rw-r--r-- 1 root root 1147 Mar 27 04:44 Chart.yaml # charts信息
drwxr-xr-x 3 root root 4096 Mar 27 04:44 templates # k8s 资源文件 模版 {{ 插值 }}
-rw-r--r-- 1 root root 1878 Mar 27 04:44 values.yaml # 具体的值
[rootk8s-master hello-world]# cd templates/
[rootk8s-master templates]# ll
total 32
-rw-r--r-- 1 root root 1856 Mar 27 04:44 deployment.yaml
-rw-r--r-- 1 root root 1822 Mar 27 04:44 _helpers.tpl
-rw-r--r-- 1 root root 928 Mar 27 04:44 hpa.yaml
-rw-r--r-- 1 root root 2087 Mar 27 04:44 ingress.yaml
-rw-r--r-- 1 root root 1763 Mar 27 04:44 NOTES.txt
-rw-r--r-- 1 root root 328 Mar 27 04:44 serviceaccount.yaml
-rw-r--r-- 1 root root 373 Mar 27 04:44 service.yaml
drwxr-xr-x 2 root root 4096 Mar 27 04:44 tests本质里面就是一堆 k8s 的资源文件helm 启动这个 charts相当于帮我们执行了 apply -f
我们可以检测这个 chart 是否有问题
helm lint charts目录# 检测 charts 包是否有问题
[rootk8s-master ~]# helm lint ./hello-world/Linting ./hello-world/
[INFO] Chart.yaml: icon is recommended1 chart(s) linted, 0 chart(s) failed这样就是没有问题 将 Helm Charts 渲染为 k8s 资源对象的 yaml 文件而不进行实际的部署操作 helm template charts包名这个命令非常有用可以方便地查看 Charts 的最终生成结果
[rootk8s-master k8s]# helm template hello-world/
---
# Source: hello-world/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: release-name-hello-worldlabels:helm.sh/chart: hello-world-0.1.0app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: 1.16.0app.kubernetes.io/managed-by: Helm
---
# Source: hello-world/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: release-name-hello-worldlabels:helm.sh/chart: hello-world-0.1.0app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: 1.16.0app.kubernetes.io/managed-by: Helm
spec:type: ClusterIPports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-name
---
# Source: hello-world/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: release-name-hello-worldlabels:helm.sh/chart: hello-world-0.1.0app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: 1.16.0app.kubernetes.io/managed-by: Helm
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-nametemplate:metadata:labels:app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-namespec:serviceAccountName: release-name-hello-worldsecurityContext:{}containers:- name: hello-worldsecurityContext:{}image: nginx:1.16.0imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80protocol: TCPlivenessProbe:httpGet:path: /port: httpreadinessProbe:httpGet:path: /port: httpresources:{}
---
# Source: hello-world/templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:name: release-name-hello-world-test-connectionlabels:helm.sh/chart: hello-world-0.1.0app.kubernetes.io/name: hello-worldapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: 1.16.0app.kubernetes.io/managed-by: Helmannotations:helm.sh/hook: test
spec:containers:- name: wgetimage: busyboxcommand: [wget]args: [release-name-hello-world:80]restartPolicy: Never安装 [rootk8s-master k8s]# helm install helloworld hello-world/
NAME: helloworld
LAST DEPLOYED: Wed Mar 27 04:56:06 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:export POD_NAME$(kubectl get pods --namespace default -l app.kubernetes.io/namehello-world,app.kubernetes.io/instancehelloworld -o jsonpath{.items[0].metadata.name})export CONTAINER_PORT$(kubectl get pod --namespace default $POD_NAME -o jsonpath{.spec.containers[0].ports[0].containerPort})echo Visit http://127.0.0.1:8080 to use your applicationkubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT可以直接通过仓库找到 charts 来安装
也可以自己编写 charts 包来安装git 下载 charts
helm 部署 mysql 主从复制集群
https://artifacthub.io/packages/helm/bitnami/mysql
安装过程中有两种方式传递配置数据
-f (或--values)使用 yaml 文件覆盖默认配置。可以指定多次优先使用最右边的文件。--set通过命令行的方式对指定项进行覆盖。
auth:rootPassword: 123456primary:persistence:size: 2Gienabled: truesecondary:replicaCount: 2persistence:size: 2Gienabled: truearchitecture: replication如果同时使用两种方式则 --set中的值会被合并到 -f中但是 --set中的值优先级更高。
主从复制原理
通过部署无头服务Headless Service将写操作指向固定的数据库。
部署一个 Service 用来做读操作的负载均衡。
数据库之间通过同步程序保持数据一致。 初始化容器Init Containers 初始化容器Init Containers是一种特殊容器它在 Pod 内的应用容器启动之前运行。
初始化容器未执行完毕或以错误状态退出Pod 内的应用容器不会启动。
初始化容器需要在 initContainers 中定义与 containers 同级。
基于上面的特性初始化容器通常用于
生成配置文件执行初始化命令或脚本执行健康检查检查依赖的服务是否处于 Ready 或健康 Health 的状态 这里有两个初始化容器。
init-mysql为 MySQL 实例分配server-id并将mysql-0的配置文件设置为primary.cnf其他副本设置为replica.cnfclone-mysql从前一个Pod中获取备份的数据文件放到自己的数据目录下 边车 Sidecar Pod 中运行了2个容器MySQL 容器和一个充当辅助工具的 xtrabackup 容器我们称之为边车sidecar。
Xtrabackup 是一个开源的 MySQL 备份工具支持在线热备份备份时不影响数据读写是目前各个云厂商普遍使用的 MySQL 备份工具。 sidecar容器负责将备份的数据文件发送给下一个Pod并在副本服务器初次启动时使用数据文件完成数据的导入。
MySQL 使用bin-log同步数据但是当数据库运行一段时间后产生了一些数据这时候如果我们进行扩容创建了一个新的副本有可能追溯不到bin-log的源头(可能被手动清理或者过期自动删除)因此需要将现有的数据导入到副本之后再开启数据同步sidecar只负责数据库初次启动时完成历史数据导入后续的数据 MySQL 会自动同步。
补充端口转发临时暴露服务
[rootk8s-master ~]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/my-db-mysql-primary-0 1/1 Running 0 15m
pod/my-db-mysql-secondary-0 1/1 Running 0 15m
pod/my-db-mysql-secondary-1 1/1 Running 0 13m
pod/nginx 1/1 Running 1 (invalid ago) 91mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 none 443/TCP 4d17h
service/my-db-mysql-primary ClusterIP 10.96.140.100 none 3306/TCP 15m
service/my-db-mysql-primary-headless ClusterIP None none 3306/TCP 15m
service/my-db-mysql-secondary ClusterIP 10.96.64.24 none 3306/TCP 15m
service/my-db-mysql-secondary-headless ClusterIP None none 3306/TCP 15mNAME READY AGE
statefulset.apps/my-db-mysql-primary 1/1 15m
statefulset.apps/my-db-mysql-secondary 2/2 15m
[rootk8s-master ~]# kubectl port-forward pods/my-db-mysql-primary-0 --address192.168.0.111 33060:3306
Forwarding from 192.168.0.111:33060 - 3306
Handling connection for 33060
Handling connection for 33060这个命令是前台命令退出后端口转发就失效了。常用来做测试。