环境说明:
主机名 | 操作系统版本 | ip | docker version | kubelet version | helm version | 配置 | 备注 |
---|---|---|---|---|---|---|---|
master | Centos 7.6.1810 | 172.27.9.131 | Docker 18.09.6 | V1.14.2 | v2.14.3 | 2C2G | master主机 |
node01 | Centos 7.6.1810 | 172.27.9.135 | Docker 18.09.6 | V1.14.2 | v2.14.3 | 2C2G | node节点 |
node02 | Centos 7.6.1810 | 172.27.9.136 | Docker 18.09.6 | V1.14.2 | v2.14.3 | 2C2G | node节点 |
centos7 | Centos 7.3.1611 | 172.27.9.181 | × | × | × | 1C1G | nfs服务器 |
k8s集群部署详见:Centos7.6部署k8s(v1.14.2)集群
k8s学习资料详见:基本概念、kubectl命令和资料分享
k8s高可用集群部署详见:Centos7.6部署k8s v1.16.4高可用集群(主备模式)
Helm是一个Kubemetes包管理器(类似于OS包管理器,比如Linux中的yum、apt,或者MacOS中的 homebrew)。
Helm包括两个部分:helm客户端和tiller服务端。
helm客户端
helm客户端是一个命令行工具,负责管理charts、repository和release。它通过gPRC API(使用kubectl port-forward将tiller的端口映射到本地,然后再通过映射后的端口跟tiller通信)向tiller发送请求,并由tiller来管理对应的Kubernetes资源。helm作用:
tiller 服务端
tiller 接收来自helm客户端的请求,并把相关资源的操作发送到Kubernetes,负责管理(安装、查询、升级或删除等)和跟踪 Kubernetes 资源。为了方便管理,tiller把release的相关信息保存在kubernetes的ConfigMap中。tiller作用:
Kubernetes虽然提供了多种容器编排对象,例如Deployment、StatefulSet、DeamonSet、Job等,还有多种基础资源封装例如ConfigMap、Secret、Serivce等,但是一个应用往往有多个服务,有的可能还要依赖持久化存储,当这些服务之间直接互相依赖,需要有一定的组合的情况下,使用YAML文件的方式配置应用往往十分繁琐还容易出错,这时候就需要服务编排工具。
服务编排管理工具就是构建在kubernetes的基础object之上,统筹各个服务之间的关系和依赖的。目前常用到的工具是Helm。
- Chart:一个Helm包,其中包含了运行一个应用所需要的工具和资源定义,还可能包含Kubernetes集群中的服务定义,类似于Homebrew中的formula、APT中的dpkg或者Yum中的RPM文件:
- Release:在Kubernetes集群上运行的一个Chart实例。在同一个集群上,一个Chart可以安装多次。例如有一个MySQLChart,如果想在服务器上运行两个MySQL数据库,就可以基于这个Chart安装两次,每次安装都会生成新的Release,会有独立的Release名称;
- Repository:用于存放和共享Chart的仓库。
Helm将charts安装到Kubernetes中,每个安装创建一个新release。要找到新的chart,可以搜索Helm charts存储库repositories。
Helm客户端可以从源代码安装,也可以从预构建的二进制版本安装或执行安装脚本。
Helm现在有一个安装shell脚本,将自动获取最新版本的Helm客户端并在本地安装。
[root@master ~]# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
脚本方式安装很简单,执行一条命令就行。
这种方式可以选择helm客户端安装版本,下载二进制文件:https://github.com/helm/helm/releases/ ,例如下载2.14.2版本:
[root@master ~]# curl -L https://get.helm.sh/helm-v2.14.2-linux-amd64.tar.gz -o helm-v2.14.2-linux-amd64.tar.gz
[root@master ~]# tar -zxvf helm-v2.14.2-linux-amd64.tar.gz
linux-amd64/
linux-amd64/LICENSE
linux-amd64/helm
linux-amd64/README.md
linux-amd64/tiller
[root@master ~]# cp linux-amd64/helm /usr/bin
[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Error: could not find tiller
下载二进制文件、解压、拷贝命令,执行helm version命令发现helm客户端版本为v2.14.2,服务端tiller还未安装,本文测试基于v2.14.3最新版。
[root@master ~]# echo "source <(helm completion bash)" >> .bash_profile
[root@master ~]# source .bash_profile
[root@master ~]# mkdir helm
[root@master ~]# echo 'export HELM_HOME=~/helm' >> .bash_profile
[root@master ~]# source .bash_profile
[root@master ~]# echo $HELM_HOME
/root/helm
设置helm的home目录为/root/helm,tiller将安装于该目录下
[root@master ~]# more rbac-config.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
[root@master ~]# kubectl create -f rbac-config.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
[root@master ~]# kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller
secret/tiller-token-dz4lt
serviceaccount/tiller
clusterrolebinding.rbac.authorization.k8s.io/tiller
否则helm install可能会报权限错误:
Error: no available release name found
Error: the server does not allow access to the requested resourc
[root@master helm]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
[root@master helm]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 gcr.io/kubernetes-helm/tiller:v2.14.3
[root@master helm]# docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
由于网络原因官网镜像无法下载,下载阿里源镜像,打上tag并删除原镜像。注意,每个node节点都需执行以上操作。
[root@master ~]# helm init --service-account tiller
安装的tiller版本与helm客户端版本一致
[root@master ~]# helm reset --force
[root@master ~]# kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system delete
[root@master ~]# kubectl get all -n kube-system -l app=helm -o name|xargs kubectl delete -n kube-system
[root@master ~]# rm -rf /root/helm
卸载tiller,删除相关资源和文件
[root@master ~]# rm -rf /usr/bin/helm
[root@master ~]# rm -rf helm-v2.14.3-linux-amd64.tar.gz
[root@master ~]# rm -rf linux-amd64/
helm客户端卸载只需移除相关文件即可
Kubeapps提供了一个开源的Helm UI界面,方便以图形界面的形式管理Helm应用。Kubeapps特点:
- 部署应用。可从公共或私有仓库中浏览chart并将其部署到集群中;
- 管理应用。升级、管理和删除部署在kubernetes集群中的应用程序;
- 搜索功能。Kubeapps提供chart搜索页面;
[root@master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
[root@master ~]# helm update
Command "update" is deprecated, use 'helm repo update'
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "bitnami" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
[root@master ~]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
bitnami https://charts.bitnami.com/bitnami
[root@master ~]# helm install --name kubeapps --namespace kubeapps bitnami/kubeapps
安装的时候主要遇到的问题是网络,即镜像下载失败,可通过手动方式下载镜像到对应节点方式解决。
kubeappspod资源列表如下:
[root@master ~]# kubectl create -n default serviceaccount example
serviceaccount/example created
[root@master ~]# kubectl get -n default secret $(kubectl get -n default serviceaccount example -o jsonpath='{.secrets[].name}') -o jsonpath='{.data.token}' | base64 --decode
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImV4YW1wbGUtdG9rZW4tdHBmdHoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZXhhbXBsZSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFhZTIxZmE0LWU5N2ItMTFlOS05Njk0LTAwMGMyOWQ5OWJhMyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmV4YW1wbGUifQ.Cto0Csh7n6Uk_cgGWGGGiMXVie8IBX-yu3fKWGFgX4rxhjT1pwS1PXI7Kq2M-c00DJhHEih3cHFZ7trwZdLrBpI3qJUz5Ymta3I3k5V2m0C_H3wXH9KODIRAhOxT45yFPk3gmdfl8-QBKLD8bB8WufHTTO0SeJ1hsAWDX5S9f3EyTmYhjI6UPEnlWiheq-WjiR1Ba7ZRzCCr4KU3_UIZ_GTF0D_1a5yghizwwngdOs7dPdLfuKOwbgjBhEBlWP4nINa2ixo03EE2EzjfAVtX6SQTuJu1lAmH-vZZi19pKc6PyMzSjfUKHmB-W5dfcbmPhv4OAlJxx4tZffq8fKP0cw[root@master ~]#
创建serviceaccount example并获取secret,登录时会用到。
[root@master ~]# more kubeapps-service.yaml
apiVersion: v1
kind: Service
metadata:
name: kubeapps-svc
namespace: kubeapps
spec:
type: NodePort
selector:
app: kubeapps
ports:
- protocol: TCP
nodePort: 30002
port: 8080
targetPort: 8080
[root@master ~]# kubectl apply -f kubeapps-service.yaml
service/kubeapps-svc created
[root@master ~]# kubectl get service -n kubeapps
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubeapps ClusterIP 10.103.27.24 <none> 80/TCP 46m
kubeapps-internal-chartsvc ClusterIP 10.102.122.69 <none> 8080/TCP 46m
kubeapps-internal-dashboard ClusterIP 10.110.249.91 <none> 8080/TCP 46m
kubeapps-internal-tiller-proxy ClusterIP 10.105.104.45 <none> 8080/TCP 46m
kubeapps-mongodb ClusterIP 10.96.175.241 <none> 27017/TCP 46m
kubeapps-svc NodePort 10.98.2.173 <none> 8080:30002/TCP 6s
创建servicekubeapps-svc用于登陆访问。
登录kubeapps,地址为:http://NodeIp:30002,密码为之前创建的secret
输入secret后登陆成功
[root@master ~]# kubectl create clusterrolebinding example --clusterrole=cluster-admin --serviceaccount=default:example
clusterrolebinding.rbac.authorization.k8s.io/example created
授予example用户集群管理访问权限
部署mysql服务时需8G的pv
nfs和pv搭建详见:k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)
[root@master ~]# more kubeapps-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-mysql
spec:
capacity:
storage: 8Gi #指定PV容量为8G
volumeMode: Filesystem #卷模式,默认为Filesystem,也可设置为'Block'表示支持原始块设备
accessModes:
- ReadWriteOnce #访问模式,该卷可以被单个节点以读/写模式挂载
persistentVolumeReclaimPolicy: Retain #回收策略,Retain(保留),表示手动回收
nfs: #指定NFS共享目录和IP信息
path: /backup/v1
server: 172.27.9.181
[root@master ~]# kubectl apply -f kubeapps-pv.yaml
persistentvolume/pv-mysql created
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-mysql 8Gi RWO Retain Available 5s
仓库选择stable
选择deploy
name为mysql-stable,submit
mysql部署成功
[root@master ~]# kubectl get secret --namespace default mysql-stable -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
L31oZF8AJ2
[root@master ~]# kubectl exec -it mysql-stable-76674bc757-8crfk sh
# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.7.14 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
[root@master ~]# helm search mysql
使用search命令可搜索仓库中的mysql应用
[root@master ~]# helm inspect values stable/mysql
使用inspect查询package详细信息,之前kubeapps部署mysql时需要8G的pv就是通过该命令获得的。
[root@master ~]# helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
kubeapps 1 Tue Oct 8 10:41:57 2019 DEPLOYED kubeapps-2.1.6 v1.5.1 kubeapps
mysql-stable 1 Tue Oct 8 15:39:07 2019 DEPLOYED mysql-1.4.0 5.7.27 default
[root@master ~]# helm status mysql-stable
通过status查询之前部署的服务mysql-stable的状态
[root@master ~]# helm delete --purge mysql-stable
release "mysql-stable" deleted
通过delete可删除之前部署的mysql-stable服务
[root@master ~]# helm install --name my-database stable/mysql
通过install安装部署package,服务名为my-database;由于pv回收策略为Retain,需手动回收,故删除pv并重建。
[root@master ~]# helm upgrade --force --set imageTag=5.7.15 my-database stable/mysql
mysql镜像由5.7.14升级到了5.7.15
[root@master ~]# helm history my-database
REVISION UPDATED STATUS CHART DESCRIPTION
1 Wed Oct 9 17:28:51 2019 SUPERSEDED mysql-1.4.0 Install complete
2 Wed Oct 9 17:31:09 2019 DEPLOYED mysql-1.4.0 Upgrade complete
[root@master ~]# helm rollback my-database 1
Rollback was a success.
[root@master ~]# kubectl get deployments. -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
my-database-mysql 1/1 1 1 16m my-database-mysql mysql:5.7.14 app=my-database-mysql,release=my-database
回滚至上一个版本,镜像版本回退为5.7.14
[root@master ~]# helm fetch stable/mysql
[root@master ~]# ll|grep mysql
-rw-r--r-- 1 root root 10657 10月 10 11:20 mysql-1.4.0.tgz
可通过helm fetch命令下载chart
[root@master ~]# helm fetch stable/wordpress
[root@master ~]# tar -zxvf wordpress-7.3.9.tgz
以wordpress为例介绍Charts目录结构
文件名 | 说明 |
---|---|
charts | 可选,包含该Chart所依赖的其他Chart,依赖管理推荐采用requirements.yaml文件来进行 |
Chart.yaml | 用于描述Chart信息的YAML文件 |
requirements.yaml | 指明Chart可能依赖其他的Chart,与charts区别是charts需要提供整个Chart的文件,requirements仅需要注明依赖Chart的仓库信息 |
templates | 可选,结合values.yaml,能够生成Kubernetes的manifest文件 |
templates/NOTES | 可选,文本文件,用法描述 |
values.yaml | 提供了Chart定制化安装是配置参数的默认值 |
在master节点上启动httpd容器来搭建私有仓库,容器的volume采用Bind mounts方式,挂载点使用NFS共享存储,Docker Bind mounts实践详见:Docker实践(三):数据持久化及共享
[root@master ~]# helm create mychart
Creating mychart
[root@master ~]# helm package mychart/
Successfully packaged chart and saved it to: /root/mychart-0.1.0.tgz
Helm会自动创建目录mychart,并生成了各类chart文件,默认包含一个 nginx 应用示例。
[root@master ~]# mkdir /repo
[root@master ~]# showmount -e 172.27.9.181
[root@master ~]# mount -t nfs 172.27.9.181:/helm-repo /repo
本地新建目录repo,挂载nfs共享目录/helm-repo
[root@master ~]# docker run -d -p 81:80 -v /repo/:/usr/local/apache2/htdocs --name web-repo httpd
新建容器web-repo,端口映射为81
[root@master ~]# mkdir /repo/charts
[root@master ~]# mv mychart-0.1.0.tgz /repo/charts/
[root@master ~]# helm repo index /repo/charts --url http://172.27.9.131:81/charts
新建目录/repo/charts,Helm会扫描/repo/charts目录中的所有tgz包并生成index.yaml。--url指定的是新仓库的访问路径。新生成的 index.yaml记录了当前仓库中所有chart的信息
[root@master charts]# helm repo add pri-repo http://172.27.9.131:81/charts
"pri-repo" has been added to your repositories
新仓库命名为pri-repo
[root@master charts]# helm install pri-repo/mychart
从新的仓库pri-repo中部署应用,访问nginx服务正常;当然,私有镜像也可以部署在其他节点或者专门的镜像服务器上。
[root@master charts]# helm repo index /repo/charts --url http://172.27.9.131:81/charts
[root@master charts]# helm repo update
当本地仓库有chart增减时,可通过执行update更新。
本文所有脚本和配置文件已上传:k8s实践(九):Helm and Kubeapps UI
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。