Helm管理Kubernetes应用
  CXvnc1NhAWTQ 2023年11月02日 54 0

一、简介

Helm是一个Kubernetes的包管理工具,就像linux下的包管理器,如yum/apt-get等。它将Kubernetes的资源打包到一个Chart中,并将制作、测试完成的各个Chart保存到仓库进行存储和分发。
       Helm接入Kubernetes集群完成管理的逻辑与kubectl相似,都是加载kubeconfig文件。而kubeconfig配置文件保存的认证凭据的用户的身份被授予什么权限,则Helm也就对应具有什么权限。
      相关概念介绍如下:

  • Helm

Helm是一个命令行下的客户端工具。主要用于Kubernetes应用程序Chart的创建、打包、发布及创建和管理本地和远程的Chart仓库。

  • Chart

Chart是一个Helm的程序包,包含了运行一个Kubernetes应用程序所需的各类资源配置文件。这些配置文件内置了很多模板字串,这些模板字串都被内置提供了默认值,保存在values.yaml。可从社区中获取(https://artifacthub.io/),也可自行创建,并通过社区分发。

  • Repoistory

Repoistory是Helm的软件仓库,Repository本质上是一个Web服务器,该服务器保存了一系列的Chart软件包以供用户下载,并且提供了该Repository的Chart包的清单文件便于查询。Helm可以同时管理多个不同的Repository。

  • Release

Release是应用程序运行Chart之后,得到的一个实例。如果部署在同一名称空间下,这些Release需要具有不同的名字。

  • Config

Chart实例化安装运行时使用的配置信息。

  • Tiller

Tiller是Helm的服务端,部署在Kubernetes集群中,Tiller用于接收Helm的请求,并根据Chart生成Kubernetes的部署文件,然后提交给Kubernetes创建应用。通常用于Helm v2版本,v3版本Tiller被废除。

二、使用Helm部署应用的过程

1st.配置仓库

如同使用apt/yum在操作系统部署应用一样,使用Helm也要部署仓库。在仓库中指明哪些Chart可用。

2nd.获取Chart

配置仓库的目的是为了下载Chart。配置仓库完成后,即可将Chart下载到仓库中。

3rd.通过向Chart中模板字串赋值完成其实例化(即模板渲染)

模板字串的渲染方式:

(1)直接在helm install的命令行,通过--set选项进行;

       (2)自定义values.yaml,由helm install命令加载该文件;

       实例化的结果,就可以部署到Kubernetes上。每个部署出来的结果被称为一个Release。

三、Helm的部署和应用

3.1 安装Helm客户端

具体参考https://github.com/helm/helm

wget https://get.helm.sh/helm-v3.12.2-linux-amd64.tar.gz
tar -xf helm-v3.12.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin
#查看Helm版本信息
helm version
#更新helm仓库
helm repo update

3.2 Helm部署Mysql

#添加仓库到本地
helm repo add bitnami https://charts.bitnami.com/bitnami
#查看仓库的详细信息
helm repo list

Helm管理Kubernetes应用_Helm

#在本地的仓库搜索Mysql。如果search命令使用hub子选项,则在整个artifacthub社区去搜索想要的软件包。社区地址:https://artifacthub.io/
helm search repo mysql

Helm管理Kubernetes应用_Helm_02

但是,这些软件包里面使用的Mysql镜像是啥,是否配置主从,均需手动定义。可以pull一个Chart来看看它里面的结构:

helm pull bitnami/mysql
tar -xf mysql-9.10.8.tgz && cd mysql

Helm管理Kubernetes应用_Helm_03

  • Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等
  • values.yaml:用于存储 templates 目录中模板文件中用到变量的值
  • templates:目录里面存放所有 yaml 模板文件

这里在blog名称空间下部署一个部署名为mysql的实例,使用的Chart名字为bitnami/mariadb,同时设置了一主一从架构。执行如下命令:

helm install mysql --set auth.rootPassword=wxd --set global.storageClass=nfs-csi --set architecture=replication --set auth.database=wpdb --set auth.username=wpuser --set auth.password='wxd' --set secondary.replicaCount=1 --set auth.replicatinotallow='wxd' bitnami/mariadb -n blog

参数介绍如下:

  • auth.rootPassword:管理员密码
  • global.storageClass:使用的全局范围内(主从节点均使用)的存储类(要事先定义好)
  • architecture:设置mysql架构。replication表示复制(即主从)
  • auth.database:初始化用的数据库名
  • auth.username:初始化用的用户名
  • auth.password:初始化用户认证需要的密码
  • secondary.replicaCount:设置从节点的个数

运行成功后会给出一系列提示,包括Service、管理员密码、相关的测试命令。这些提示信息也可通过helm status命令去查看。

NAME: mysql
LAST DEPLOYED: Fri Jul 28 13:11:18 2023
NAMESPACE: blog
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mariadb
CHART VERSION: 12.2.9
APP VERSION: 10.11.4
** Please be patient while the chart is being deployed **
Tip:
 Watch the deployment status using the command: kubectl get pods -w --namespace blog -l app.kubernetes.io/instance=mysql
Services:
 echo Primary: mysql-mariadb-primary.blog.svc.cluster.local:3306
 echo Secondary: mysql-mariadb-secondary.blog.svc.cluster.local:3306
Administrator credentials:
 Username: root
 Password : $(kubectl get secret --namespace blog mysql-mariadb -o jsnotallow="{.data.mariadb-root-password}" | base64 -d)
To connect to your database:
 1. Run a pod that you can use as a client:
 kubectl run mysql-mariadb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mariadb:10.11.4-debian-11-r46 --namespace blog --command -- bash
 2. To connect to primary service (read/write):
 mysql -h mysql-mariadb-primary.blog.svc.cluster.local -uroot -p wpdb
 3. To connect to secondary service (read-only):
 mysql -h mysql-mariadb-secondary.blog.svc.cluster.local -uroot -p wpdb
To upgrade this helm chart:
 1. Obtain the password as described on the 'Administrator credentials' section and set the 'auth.rootPassword' parameter as shown below:
 ROOT_PASSWORD=$(kubectl get secret --namespace blog mysql-mariadb -o jsnotallow="{.data.mariadb-root-password}" | base64 -d)
 helm upgrade --namespace blog mysql oci://registry-1.docker.io/bitnamicharts/mariadb --set auth.rootPassword=$ROOT_PASSWORD

        此时,查看Pod也是正常运行的。

Helm管理Kubernetes应用_Helm_04

开始测试主从复制的效果。

#先进入mysql-mariadb-primary-0这个Pod
kubectl exec -it mysql-mariadb-primary-0 -n blog -- bash
#连接主数据库(输root用户密码)
mysql -h mysql-mariadb-primary.blog.svc.cluster.local -uroot -p wpdb
#在wpdb库创建测试表,并写入数据
CREATE TABLE test_table (id INT, name VARCHAR(255));
INSERT INTO test_table VALUES (1, 'test');
#再连接从数据库(输入root用户密码),查看数据是否存在。若存在,说明主从复制已成功部署
mysql -h mysql-mariadb-secondary.blog.svc.cluster.local -uroot -p wpdb
select * from test_table;

Helm管理Kubernetes应用_Helm_05

要想查看部署的实例,可用helm list命令查看

helm list -n blog

Helm管理Kubernetes应用_Helm_06

如果发现部署时某个参数有问题,可使用helm upgrade去更新。同时支持回滚(helm rollback命令)。

3.3 Helm部署WordPress

这里引用外部的数据,支持Ingress,且使用的Mysql支持主从架构

helm install wordpress --set mariadb.enabled=false --set externalDatabase.host=mysql-mariadb-primary.blog.svc.cluster.local --set externalDatabase.user=wpuser --set externalDatabase.password='wxd' --set externalDatabase.database=wpdb --set externalDatabase.port=3306 --set persistence.storageClass=nfs-csi --set ingress.enabled=true --set ingress.ingressClassName=nginx --set ingress.hostname=blog.wxd.com --set ingress.pathType=Prefix --set wordpressUsername=admin --set wordpressPassword='wxd' bitnami/wordpress -n blog

相关参数介绍如下:

  • mariadb.enabled:是否使用默认的mariadb。默认值为true
  • externalDatabase.host:外部的数据库主机名。这里就使用之前部署的Mysql主节点的主机名(Pod名),与上面的保持一致
  • externalDatabase.user:外部数据库(初始化)使用的用户名
  • externalDatabase.password:外部数据库用户使用的密码
  • externalDatabase.database:外部数据库使用的库名
  • externalDatabase.port:外部数据库使用的端口
  • persistence.storageClass:持久卷存储类
  • ingress.enabled:是否使用ingress。设为true,则在Ingress控制器创建Ingress资源以发布服务
  • ingress.ingressClassName:设置IngressClass名称(事先部署好)
  • ingress.hostname:设置Ingress的主机名
  • ingress.pathType:设置Ingress的路径格式,通常设置为Prefix较合理

此时,查看Pod也能正常运行。查看对应的Ingress记录会发现blog.wxd.com这个主机名对应的IP地址为192.168.131.100,原因在于在一开始部署Ingress控制器时为其加了个外部IP地址(具体方式参考https://blog.51cto.com/u_15796303/6788265)

Helm管理Kubernetes应用_Helm_07

在物理机的hosts文件做如下解析:

192.168.131.100 blog.wxd.com

访问blog.wxd.com/admin,用户名为admin,密码为wxd,之后即可登录到WordPress界面。

Helm管理Kubernetes应用_Helm_08

3.4 Helm部署Harbor

#添加仓库
helm repo add harbor https://helm.goharbor.io
#设置名称空间
kubectl create ns harbor
#部署名为harbor的实例。使用harbor仓库下名为的harbor的Chart。这里指定值文件为harbor-values.yaml,里面有自定义的配置,未定义的均使用默认值
cd learning-k8s/helm/harbor
helm install harbor -f harbor-values.yaml harbor/harbor -n harbor

此时,查看相关Pod也是正常运行的,相应的ingress资源也生成了。虽然ingressclass未关联到,但由于harbor-values.yaml加了ingress注解(expose.ingress.annotations:”kubernetes.io/ingress.class: ‘nginx’”),因此在ingress-nginx(ingress控制器)这个Pod内的nginx配置文件仍能看到相关虚拟主机的定义。

Helm管理Kubernetes应用_Helm_09

这里最好让ingress绑定ingressClass。

kubectl edit ingress harbor-ingress -n harbor

在spec字段下添加ingressClassName: nginx这个内容,再查看ingress资源就发现添加成功了。

Helm管理Kubernetes应用_Helm_10

在物理机的hosts文件和其它节点均做如下解析(后续测试用):

192.168.131.100 hub.magedu.com

访问hub.magedu.com,用户名admin,密码magedu.com(因为harbor-values.yaml中harborAdminPassword的值就定义为magedu.com)。之所以显示证书无效,是因为harbor-ca默认自动生成了自签证书(expose.tls.certSource的值默认为auto)。

Helm管理Kubernetes应用_Helm_11

Helm管理Kubernetes应用_Helm_12

由于这里用到了Https服务,此时要么让docker忽略这里的证书验证,要么将CA配置上去,否则镜像推送不上去。

在harbor-ingress 的secret里面找到data下的ca.crt,之后解码

kubectl get secret harbor-ingress -n harbor -o yaml

Helm管理Kubernetes应用_Helm_13

echo 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGRENDQWZ5Z0F3SUJBZ0lSQU9uRlNmWUdSNFl4aHpJelJjeWFsQjh3RFFZSktvWklodmNOQVFFTEJRQXcKRkRFU01CQUdBMVVFQXhNSmFHRnlZbTl5TFdOaE1CNFhEVEl6TURjeU9URXpNelV5T1ZvWERUSTBNRGN5T0RFegpNelV5T1Zvd0ZERVNNQkFHQTFVRUF4TUphR0Z5WW05eUxXTmhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUE0OWtoQzZNMCtvMXBHblJHM0J5Yk1jaVViWnJmSkpoTWpLNEQwUkNSVWVOanVYb0gKemsxVWRsVXRoKzBHTXNRWkt3eWo0NGxvMGUwY081eXM3L2d3MUlmZHlBSERNZEF4cm4xY01EdStEY2lWNVZrWAppajJmallwMUxpb0NyeUZWUDJua0J5RzQ4Qm0vYnZpY2VvVjBLMTQvV1NOYlpZZG50NzRibVZIL0psT1E1MkVwCi9OampqeWlqdkFzenNERUZIT0R1bVFya0Y3QkFMMGtGKzhicjdvU3V4ZmxZSlk4YmIzVTJsZ2FMaFJSQWpOMSsKNWtTbXVzZVo2b2oydFBmcG5PUStxZ2NVMW5hUC9KeFZCNUpiK0lvS2JQRlp1Wko4OEtna2QvbTh4dWZyTFFaZwpyeUh1a0s4TzZvaFFlYlk0TGtHaHJ4TExNeEsxZWFodlE5OGJaUUlEQVFBQm8yRXdYekFPQmdOVkhROEJBZjhFCkJBTUNBcVF3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGRWgxS0lIUUpISTBJUVJDUzBuaW9oeXpGWGJJTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQWVDTWlVMURjMFZuN1lBNHZ3eVdacFMzTWM2bkUyaXZWL1Z2Tm1wV1M1Q25JVEV0T21JUjJBCmRXVk5taTF6RDlYd3NnQStSNkUvZ2NQSFJrd0IyRU95cVNDa1d5c1VHa2xpSDlicmdya2FtUXoxTVdGMkZXN0QKdEVLOHlGRDYxZnlBcFEvUWs0aXVrSjNmTUJVVUQxeDFlYitmak5JOG9oNUZYTDNINnhiNmJrRXI4ekhGNkI2RwpxbEJqV0Z0dGJ6VmRDMlFUcG1UTzJDMEdodHVZZXVsUWpjOEc3TUgwRGJoRWRGYzJRQnZkNlVDYTZmNURaWDBNCnNQR3dXZXAxbUZDcTBjSlRJdDlTaGwwT092SnJpUFRJMjFBYkRCaFpNWVVPMVZpeFBQQ1ArZjhTTUl4NFFTOHcKM2lWMUJjd0pVTDF5RDFmTGUrc3Y1S1Z6ZGtHdTExYSsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=' | base64 -d > ca.crt

将证书保存在docker目录下,创建根域名相同的子目录,这一步建议所有机器都执行,之后就可以登录了。

mkdir -p /etc/docker/certs.d/hub.magedu.com
cp ca.crt /etc/docker/certs.d/hub.magedu.com

Helm管理Kubernetes应用_Helm_14

可以测试上传&下载镜像。这里先新建个仓库wxd,之后用来测试

docker tag nginx:alpine hub.magedu.com/wxd/nginx:alpine
docker push hub.magedu.com/wxd/nginx:alpine

Helm管理Kubernetes应用_Helm_15

在Node节点下载镜像,也是可以的。

Helm管理Kubernetes应用_Helm_16

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

CXvnc1NhAWTQ