helm安装实现一键部署K8S下应用

helm简介

很多人都使用过Ubuntu下的ap-get或者CentOS下的yum, 这两者都是Linux系统下的包管理工具。采用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载应用程序。

我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。

对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。

对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。

除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。

Helm核心概念:

  • Chart:一个helm的程序包;
  • Repostriy:Charts仓库,https/http服务;
  • Release:特定的chart部署与目标集群上的一个实例;

Chart—>Config—>Release

程序架构:

  • helm:客户端,管理本地的Chart仓库,管理Chart,与Tiller服务器交互,发送Chart,实例安装、查询、卸载等操作。
  • Tiller:服务端,接受helm发来的Charts与Config,合并生成Release;

helm官方可用的chart列表:

helm官方可用的chart

go语言编写,基于gRPC协议与Tiller进行通信交互。

组件

Helm 有两个主要部分:

helm安装实现一键部署K8S下应用_第1张图片

 

Helm Client 是最终用户的命令行客户端。客户端负责以下部分:

  • 本地 chart 开发
  • 管理存储库
  • 与 Tiller 服务交互
  • 发送要安装的 chart
  • 查询有关发布的信息
  • 请求升级或卸载现有 release

Tiller Server 是一个集群内服务,与 Helm 客户端进行交互,并与 Kubernetes API 服务进行交互。服务负责以下内容:

  • 监听来自 Helm 客户端的传入请求
  • 结合 chart 和配置来构建发布
  • 将 chart 安装到 Kubernetes 中,然后跟踪后续 release
  • 通过与 Kubernetes 交互来升级和卸载 chart

简而言之,客户端负责管理 chart,而服务端负责管理 release。

 

 

1、helm 3安装

wget https://get.helm.sh/helm-v3.2.0-linux-amd64.tar.gz

tar xf helm-v3.2.0-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm

helm version

 

2、添加主要的在线仓库

helm repo add stable https://kubernetes-charts.storage.googleapis.com/

helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

helm repo add apphub https://apphub.aliyuncs.com/

helm repo list

 

3、kubectl客户端安装

cat < /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

enabled=1

gpgcheck=1

repo_gpgcheck=1y

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

yum makecache -y

yum install -y kubectl-1.17.2

 

mkdir -p ~/.kube

vi ~/.kube/config

#rancher ui的config内容写入

kubectl get pod

 

4、安装一个简单的服务

helm pull stable/mysql

cd ./mysql

helm install testmysql2 .

 

5、卸载服务

helm ls

helm uninstall testmysql

 

6、存储持久化(K8S下存储太多了根据自己的业务来选择存储)

longhorn基础环境安装--每节点执行

yum install -y targetcli

systemctl start target

systemctl enable target

yum -y install iscsi-initiator-utils

systemctl start iscsi

systemctl enable iscsi

iscsiadm --version

 

rancher 商店安装longhorn-system

 

镜像加速

vi /etc/docker/daemon.json

"registry-mirrors": [

"https://1nj0zren.mirror.aliyuncs.com",

"https://docker.mirrors.ustc.edu.cn",

"http://f1361db2.m.daocloud.io",

"https://registry.docker-cn.com",

"https://dockerhub.azk8s.cn",

"https://reg-mirror.qiniu.com",

"https://mirror.ccs.tencentyun.com"

]

 

systemctl daemon-reload

systemctl restart docker

 

helm安装chart需要根据脚本定义预先配置对应pv,chart启动后,服务绑定pv,成为pvc

如果pv选择 local node path插件,需要每个节点都配置好对应的目录

使用local node path插件存储status类数据的话,Pod转换节点之后,数据会丢失

 

因此,需要使用共享存储,目前选择longhorn(需提前安装环境及起服务)

修改配置,设置使用longhorn存储类,自动创建pvc

vi mysql/values.yaml

storageClassName: longhorn

 

kubectl get pvc

Kubernetes的三种外部访问方式:NodePort、LoadBalancer 和 Ingress

 

7、外部访问pod服务

方法一:hostPort端口映射,端口跟着node走

vi mysql/templates/deployment.yaml

containerPort下增加

hostPort: 33006

测试ok

mysql -h x192.168.1.10 -P33006 -u root -123456

 

方法二:NodePort端口群体映射,每个Node都会起一个32000端口,k8s自动管理流量

vi mysql/values.yaml

type: NodePort

port: 3306

nodePort: 32000

测试ok

mysql -h 192.168.1.10 -P32000 -u root -123456

每节点netstat -ntlup|grep 32000 ok

方法三:LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到你的服务。

1.安装metallb

配置网段与服务器IP在同一网段

configInline:
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.100-192.168.1.254

启动metallb

helm install metallb metallb

会启动两个服务controller和speaker,其中确保每台集群集群都有speaker

2.基础应用都是配置在helm 里面使用loadBalancerIP配置

templates/server.yaml配置:

{{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}

values.yaml配置:

service:

   type: LoadBalancer

   port: xxx

 

 

你可能感兴趣的:(运维技术,自动化运维)