環(huán)境說明:
善右網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
主機名 | 操作系統(tǒng)版本 | 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節(jié)點 |
node02 | Centos 7.6.1810 | 172.27.9.136 | Docker 18.09.6 | V1.14.2 | v2.14.3 | 2C2G | node節(jié)點 |
centos7 | Centos 7.3.1611 | 172.27.9.181 | × | × | × | 1C1G | nfs服務(wù)器 |
?
k8s集群部署詳見:Centos7.6部署k8s(v1.14.2)集群
k8s學(xué)習(xí)資料詳見:基本概念、kubectl命令和資料分享
k8s高可用集群部署詳見:Centos7.6部署k8s v1.16.4高可用集群(主備模式)
?
??Helm是一個Kubemetes包管理器(類似于OS包管理器,比如Linux中的yum、apt,或者MacOS中的 homebrew)。
?
??Helm包括兩個部分:helm客戶端和tiller服務(wù)端。
?
helm客戶端
helm客戶端是一個命令行工具,負(fù)責(zé)管理charts、repository和release。它通過gPRC API(使用kubectl port-forward將tiller的端口映射到本地,然后再通過映射后的端口跟tiller通信)向tiller發(fā)送請求,并由tiller來管理對應(yīng)的Kubernetes資源。helm作用:
?
tiller 服務(wù)端
tiller 接收來自helm客戶端的請求,并把相關(guān)資源的操作發(fā)送到Kubernetes,負(fù)責(zé)管理(安裝、查詢、升級或刪除等)和跟蹤 Kubernetes 資源。為了方便管理,tiller把release的相關(guān)信息保存在kubernetes的ConfigMap中。tiller作用:
??Kubernetes雖然提供了多種容器編排對象,例如Deployment、StatefulSet、DeamonSet、Job等,還有多種基礎(chǔ)資源封裝例如ConfigMap、Secret、Serivce等,但是一個應(yīng)用往往有多個服務(wù),有的可能還要依賴持久化存儲,當(dāng)這些服務(wù)之間直接互相依賴,需要有一定的組合的情況下,使用YAML文件的方式配置應(yīng)用往往十分繁瑣還容易出錯,這時候就需要服務(wù)編排工具。
?服務(wù)編排管理工具就是構(gòu)建在kubernetes的基礎(chǔ)object之上,統(tǒng)籌各個服務(wù)之間的關(guān)系和依賴的。目前常用到的工具是Helm。
- Chart:一個Helm包,其中包含了運行一個應(yīng)用所需要的工具和資源定義,還可能包含Kubernetes集群中的服務(wù)定義,類似于Homebrew中的formula、APT中的dpkg或者Yum中的RPM文件:
- Release:在Kubernetes集群上運行的一個Chart實例。在同一個集群上,一個Chart可以安裝多次。例如有一個MySQLChart,如果想在服務(wù)器上運行兩個MySQL數(shù)據(jù)庫,就可以基于這個Chart安裝兩次,每次安裝都會生成新的Release,會有獨立的Release名稱;
- Repository:用于存放和共享Chart的倉庫。
Helm將charts安裝到Kubernetes中,每個安裝創(chuàng)建一個新release。要找到新的chart,可以搜索Helm charts存儲庫repositories。
Helm客戶端可以從源代碼安裝,也可以從預(yù)構(gòu)建的二進制版本安裝或執(zhí)行安裝腳本。
Helm現(xiàn)在有一個安裝shell腳本,將自動獲取最新版本的Helm客戶端并在本地安裝。
[root@master ~]# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
腳本方式安裝很簡單,執(zhí)行一條命令就行。
這種方式可以選擇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
下載二進制文件、解壓、拷貝命令,執(zhí)行helm version命令發(fā)現(xiàn)helm客戶端版本為v2.14.2,服務(wù)端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
設(shè)置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可能會報權(quán)限錯誤:
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
由于網(wǎng)絡(luò)原因官網(wǎng)鏡像無法下載,下載阿里源鏡像,打上tag并刪除原鏡像。注意,每個node節(jié)點都需執(zhí)行以上操作。
[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,刪除相關(guān)資源和文件
[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客戶端卸載只需移除相關(guān)文件即可
Kubeapps提供了一個開源的Helm UI界面,方便以圖形界面的形式管理Helm應(yīng)用。Kubeapps特點:
- 部署應(yīng)用??蓮墓不蛩接袀}庫中瀏覽chart并將其部署到集群中;
- 管理應(yīng)用。升級、管理和刪除部署在kubernetes集群中的應(yīng)用程序;
- 搜索功能。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
安裝的時候主要遇到的問題是網(wǎng)絡(luò),即鏡像下載失敗,可通過手動方式下載鏡像到對應(yīng)節(jié)點方式解決。
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 ~]#
創(chuàng)建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 80/TCP 46m
kubeapps-internal-chartsvc ClusterIP 10.102.122.69 8080/TCP 46m
kubeapps-internal-dashboard ClusterIP 10.110.249.91 8080/TCP 46m
kubeapps-internal-tiller-proxy ClusterIP 10.105.104.45 8080/TCP 46m
kubeapps-MongoDB ClusterIP 10.96.175.241 27017/TCP 46m
kubeapps-svc NodePort 10.98.2.173 8080:30002/TCP 6s
創(chuàng)建servicekubeapps-svc用于登陸訪問。
登錄kubeapps,地址為:http://NodeIp:30002,密碼為之前創(chuàng)建的secret
輸入secret后登陸成功
[root@master ~]# kubectl create clusterrolebinding example --clusterrole=cluster-admin --serviceaccount=default:example
clusterrolebinding.rbac.authorization.k8s.io/example created
授予example用戶集群管理訪問權(quán)限
部署mysql服務(wù)時需8G的pv
nfs和pv搭建詳見:k8s實踐(七):存儲卷和數(shù)據(jù)持久化(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 #卷模式,默認(rèn)為Filesystem,也可設(shè)置為'Block'表示支持原始塊設(shè)備
accessModes:
- ReadWriteOnce #訪問模式,該卷可以被單個節(jié)點以讀/寫模式掛載
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應(yīng)用
[root@master ~]# helm inspect values stable/mysql
使用inspect查詢package詳細(xì)信息,之前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查詢之前部署的服務(wù)mysql-stable的狀態(tài)
[root@master ~]# helm delete --purge mysql-stable
release "mysql-stable" deleted
通過delete可刪除之前部署的mysql-stable服務(wù)
[root@master ~]# helm install --name my-database stable/mysql
通過install安裝部署package,服務(wù)名為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目錄結(jié)構(gòu)
文件名 | 說明 |
---|---|
charts | 可選,包含該Chart所依賴的其他Chart,依賴管理推薦采用requirements.yaml文件來進行 |
Chart.yaml | 用于描述Chart信息的YAML文件 |
requirements.yaml | 指明Chart可能依賴其他的Chart,與charts區(qū)別是charts需要提供整個Chart的文件,requirements僅需要注明依賴Chart的倉庫信息 |
templates | 可選,結(jié)合values.yaml,能夠生成Kubernetes的manifest文件 |
templates/NOTES | 可選,文本文件,用法描述 |
values.yaml | 提供了Chart定制化安裝是配置參數(shù)的默認(rèn)值 |
在master節(jié)點上啟動httpd容器來搭建私有倉庫,容器的volume采用Bind mounts方式,掛載點使用NFS共享存儲,Docker Bind mounts實踐詳見:Docker實踐(三):數(shù)據(jù)持久化及共享
[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會自動創(chuàng)建目錄mychart,并生成了各類chart文件,默認(rèn)包含一個 nginx 應(yīng)用示例。
[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記錄了當(dāng)前倉庫中所有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中部署應(yīng)用,訪問nginx服務(wù)正常;當(dāng)然,私有鏡像也可以部署在其他節(jié)點或者專門的鏡像服務(wù)器上。
[root@master charts]# helm repo index /repo/charts --url http://172.27.9.131:81/charts
[root@master charts]# helm repo update
當(dāng)本地倉庫有chart增減時,可通過執(zhí)行update更新。
?
?
本文所有腳本和配置文件已上傳:k8s實踐(九):Helm and Kubeapps UI
?
?