1. 程式人生 > >Helm安裝和專案使用

Helm安裝和專案使用

整體架構

 

1.為什麼要用?

首先在原來專案中都是基於yaml檔案來進行部署釋出的,而目前專案大部分微服務化或者模組化,會分成很多個元件來部署,每個元件可能對應一個deployment.yaml,一個service.yaml,一個Ingress.yaml還可能存在各種依賴關係,這樣一個專案如果有5個元件,很可能就有15個不同的yaml檔案,這些yaml分散存放,如果某天進行專案恢復的話,很難知道部署順序,依賴關係等,而所有這些包括

  • 基於yaml配置的集中存放
  • 基於專案的打包
  • 元件間的依賴

都可以通過helm來進行解決。

2.Helm 基本概念

Helm 可以理解為 Kubernetes 的包管理工具,可以方便地發現、共享和使用為Kubernetes構建的應用,它包含幾個基本概念

  • Chart:一個 Helm 包,其中包含了執行一個應用所需要的映象、依賴和資源定義等,還可能包含 Kubernetes 叢集中的服務定義
  • Release: 在 Kubernetes 叢集上執行的 Chart 的一個例項。在同一個叢集上,一個 Chart 可以安裝很多次。每次安裝都會建立一個新的 release。例如一個 MySQL Chart,如果想在伺服器上執行兩個資料庫,就可以把這個 Chart 安裝兩次。每次安裝都會生成自己的 Release,會有自己的 Release 名稱。
  • Repository:用於釋出和儲存 Chart 的倉庫。

3.Helm 元件及架構

Helm 採用客戶端/伺服器架構,有如下元件組成:

  • Helm CLI 是 Helm 客戶端,可以在本地執行
  • Tiller 是伺服器端元件,在 Kubernetes 群集上執行,並管理 Kubernetes 應用程式的生命週期
  • Repository 是 Chart 倉庫,Helm客戶端通過HTTP協議來訪問倉庫中Chart的索引檔案和壓縮包。

15019325767895

4.Helm的安裝

在下列網站下載helm的相關版本

https://github.com/kubernetes/helm/releases


tar -xvzf  $HELM.tar.gz 

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

 在K8s節點上配置.kube/config(我是因為之前沒搞這些,大家如果搞過就直接忽略)

[[email protected]1 ~]# kubectl config set-cluster kubernetes --server=http://192.168.0.104:8080
Cluster "kubernetes" set.


[[email protected]-node-1 ~]# kubectl config set-credentials admin
User "admin" set.

[[email protected]-node-1 ~]# kubectl config set-context kubernetes \
> --cluster=kubernetes \
> --user=admin
Context "kubernetes" set.


[[email protected]-node-1 ~]# kubectl config use-context kubernetes
Switched to context "kubernetes".
  • 執行安裝

 先建立使用者和角色。

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

[[email protected]-node-1 ~]# helm init --service-account tiller --skip-refresh
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

然後去檢視

[[email protected]1 ~]# kubectl get pod -n kube-system -l app=helm
NAME                             READY     STATUS              RESTARTS   AGE
tiller-deploy-3018021184-dxpfj   0/1       ContainerCreating   0          26s
[[email protected]1 ~]# kubectl describe pods tiller-deploy-3018021184-dxpfj -n kube-system
Name:        tiller-deploy-3018021184-dxpfj
Namespace:    kube-system
Node:        k8s-node-1/192.168.0.105
Start Time:    Fri, 23 Feb 2018 18:41:28 +0800
Labels:        app=helm
        name=tiller
        pod-template-hash=3018021184
Status:        Pending
IP:        
Controllers:    ReplicaSet/tiller-deploy-3018021184
Containers:
  tiller:
    Container ID:    
    Image:        gcr.io/kubernetes-helm/tiller:v2.8.1
    Image ID:        
    Ports:        44134/TCP, 44135/TCP
    State:        Waiting
      Reason:        ContainerCreating
    Ready:        False
    Restart Count:    0
    Liveness:        http-get http://:44135/liveness delay=1s timeout=1s period=10s #success=1 #failure=3
    Readiness:        http-get http://:44135/readiness delay=1s timeout=1s period=10s #success=1 #failure=3
    Volume Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from tiller-token-xng0h (ro)
    Environment Variables:
      TILLER_NAMESPACE:        kube-system
      TILLER_HISTORY_MAX:    0
Conditions:
  Type        Status
  Initialized     True 
  Ready     False 
  PodScheduled     True 
Volumes:
  tiller-token-xng0h:
    Type:    Secret (a volume populated by a Secret)
    SecretName:    tiller-token-xng0h
QoS Class:    BestEffort
Tolerations:    <none>
Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath        Type        Reason        Message
  ---------    --------    -----    ----            -------------        --------    ------        -------
  1m        1m        1    {default-scheduler }                Normal        Scheduled    Successfully assigned tiller-deploy-3018021184-dxpfj to k8s-node-1
  1m        1m        1    {kubelet k8s-node-1}    spec.containers{tiller}    Normal        Pulling        pulling image "gcr.io/kubernetes-helm/tiller:v2.8.1"

發現需要gcr.io/kubernetes-helm/tiller:v2.8.1

一番折騰後執行後完成,因為找不到2.8.1版本,所以最後搞了個2.6.0版本

[[email protected] helm]# helm init --service-account tiller --upgrade -i index.tenxcloud.com/kubernetes-helm/tiller:v2.6.0  --skip-refresh
Creating /root/.helm 
Creating /root/.helm/repository 
Creating /root/.helm/repository/cache 
Creating /root/.helm/repository/local 
Creating /root/.helm/plugins 
Creating /root/.helm/starters 
Creating /root/.helm/cache/archive 
Creating /root/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
  • 問題解決

先解決兩個錯誤:

  • unable to do port forwarding: socat not found.
[[email protected] hello-svc]# helm version
Client: &version.Version{SemVer:"v2.8.1", GitCommit:"6af75a8fd72e2aa18a2b278cfe5c7a1c5feca7f2", GitTreeState:"clean"}
E0224 14:13:16.077226    7416 portforward.go:331] an error occurred forwarding 37271 -> 44134: error forwarding port 44134 to pod 76a7312e49220a229e443546a4b32d3e0406f09fd9b3646b3d30f6833e121375, uid : unable to do port forwarding: socat not found.
Error: cannot connect to Tiller

解決辦法在node節點安裝socat

yum install socat

  • 版本不一致

重新下載一致的版本包,和images的版本保持一致

5.專案中如何使用

  • 針對每個專案形成一個chart,最後形成一個Chart Package

比如下面針對hello-svc這個基於tomcat的專案,先生成一個chart的結構

  • 建立chart及部署
[[email protected] ~]# helm create hello-svc
Creating hello-svc

按照我們自己的需求修改模板中的deployment.yaml,service.yaml和values.yaml檔案

[[email protected]master templates]# cat deployment.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tomcatjmx
spec:
  replicas: {{.Values.replicas}}
  template:
    metadata:
      labels:
        tomcat-app: "tomcatjmx"
        version: "1"
    spec:
      containers:
      - name: tomcatjmx
        image: tomcat:{{.Values.images.dockerTag}}
        ports:
        - containerPort: {{.Values.images.Port}}
          name: tomcatport
        - containerPort: 35135
          name: jmx
[[email protected]master templates]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: {{.Values.service.name}} 
  labels:
    tomcat-app: tomcatjmx
spec:
  ports:
  - port: {{.Values.service.Port}} 
    protocol: TCP
    targetPort: 8080
    name: http
  - name: jmx
    protocol: TCP
    port: 35135
    targetPort: {{.Values.service.targetPort}}
  type: NodePort
  selector:
    tomcat-app: tomcatjmx
[[email protected] hello-svc]# cat values.yaml 
# Default values for hello-svc.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicas: 1

images:
  dockerTag: jmxv4 
  Port: 8080

service:
  name: tomcatjmxsvc
  Port: 80
  targetPort: 35135

相應的NOTES.txt也進行調整直到驗證沒有問題,驗證完成通過install安裝

helm install --dry-run --debug ./
[[email protected] hello-svc]# helm install ./
NAME:   kindly-worm
LAST DEPLOYED: Sat Feb 24 14:45:58 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME          CLUSTER-IP     EXTERNAL-IP  PORT(S)                       AGE
tomcatjmxsvc  10.254.25.181  <nodes>      80:32733/TCP,35135:30714/TCP  1s

==> v1beta1/Deployment
NAME       DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
tomcatjmx  1        1        1           0          1s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -l "app=hello-svc,release=kindly-worm" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:80

[[email protected]-master hello-svc]# helm list
NAME           REVISION    UPDATED                     STATUS      CHART              NAMESPACE
kindly-worm    1           Sat Feb 24 14:45:58 2018    DEPLOYED    hello-svc-0.1.0    default  
  • 形成一個chart Package

 打包形成一個tgz檔案,估計是每個專案一個chart,對應一個tgz

helm package ./
  • Chart Package的集中管理和存放

上面我們是從本地的目錄結構中的chart去進行部署,如果要集中管理chart,就需要涉及到repository的問題,因為helm repository都是指到外面的地址,接下來我們可以通過minio建立一個企業私有的存放倉庫。

Minio提供物件儲存服務。它的應用場景被設定在了非結構化的資料的儲存之上了。眾所周知,非結構化物件諸如影象/音訊/視訊/log檔案/系統備份/映象檔案…等等儲存起來管理總是不那麼方便,size變化很大,型別很多,再有云端的結合會使得情況更加複雜,minio就是解決此種場景的一個解決方案。Minio號稱其能很好的適應非結構化的資料,支援AWS的S3,非結構化的檔案從數KB到5TB都能很好的支援。

Minio的使用比較簡單,只有兩個檔案,服務端minio,客戶訪問端mc,比較簡單。

在專案中,我們可以直接找一臺虛擬機器作為Minio Server,提供服務,當然minio也支援作為Pod部署。

1.安裝配置Minio

下載

在https://dl.minio.io/client/mc/release/linux-amd64/ 下載客戶端程式mc和服務端程式minio

啟動minio服務

minio server ./repository

 針對使用得客戶端加入security和token資訊

./mc config host add myminio http://192.168.44.108:9000 B0SW3MZ00J7OCG2JCG5D nZrG2olrz+aDbhbzVhft6JivkkoPQe2gp5JaG+XO

建立一個bucket同時設定許可權

mc mb myminio/minio-helm-repo
mc policy download myminio
/minio-helm-repo

  安裝完成後通過瀏覽器訪問minio的介面,http://192.168.44.108:9000/

這裡寫圖片描述

2.將我們上面建立的chart Package傳入Minio的Repository

index.yaml為了讓helm對裡面的包進行索引,找到各種entry,每個entry是一個專案,每個專案對應一個chart Package.

在本地建立一個index.yaml,然後上傳,將來在使用的時候可以通過程式實現自動新增。

[[email protected] minio-helm-repo]# cat index.yaml
apiVersion: v1
entries:
  hello-svc:
  - apiVersion: v1
    description: Distributed object storage server built for cloud applications and  devops.
    digest: 8440f6f064ed91a75194e77d4b2be99c491c1cb04fb34bca4a36a5be67e1ef2c
    name: hello-svc
    urls:
    - http://192.168.44.108:9000/minio-helm-repo/hello-svc-0.1.0.tgz
    version: 0.1.0

 將之前的tgz package和index檔案都傳入。

./mc cp ./index.yaml myminio/minio-helm-repo
./index.yaml:       601 B / 601 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 47.73 KB/s 0s

.
/mc cp /root/hello-svc/hello-svc-0.1.0.tgz myminio/minio-helm-repo ...-svc-0.1.0.tgz: 1.50 KB / 1.50 KB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 48.00 KB/s 0s

3.設定Helm

在helm中加入repository,加入完成後可以通過helm repo list進行羅列。修改了index.yaml後也需要用helm repo update進行更新。

[[email protected] helm]# helm repo add myrepo http://192.168.44.108:9000/minio-helm-repo
"myrepo" has been added to your repositories

[[email protected]
-master helm]# helm repo update Hang tight while we grab the latest from your chart repositories... ...Skip local chart repository ...Unable to get an update from the "stable" chart repository (https://kubernetes-charts.storage.googleapis.com): Get https://kubernetes-charts.storage.googleapis.com/index.yaml: dial tcp: lookup kubernetes-charts.storage.googleapis.com on [::1]:53: read udp [::1]:59458->[::1]:53: read: connection refused ...Successfully got an update from the "myrepo" chart repository Update Complete. ⎈ Happy Helming!⎈
  • 基於Minio的Repository進行Helm的部署

好了,一切就緒,先search一下

[[email protected]master helm]# helm search hello
WARNING: Repo "stable" is corrupt or missing. Try 'helm repo update'.NAME                VERSION    DESCRIPTION                                       
local/hello-svc     0.1.0      A Helm chart for Kubernetes                       
myrepo/hello-svc    0.1.0      Distributed object storage server built for clo...

[[email protected]
-master helm]# helm install myrepo/hello-svc NAME: quelling-hound LAST DEPLOYED: Sat Feb 24 17:14:23 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE tomcatjmxsvc 10.254.180.188 <nodes> 80:31790/TCP,35135:31132/TCP 2s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE tomcatjmx 1 1 1 0 2s NOTES: 1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods -l "app=hello-svc,release=quelling-hound" -o jsonpath="{.items[0].metadata.name}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl port-forward $POD_NAME 8080:80

 這裡search能搜尋到但是部署不上去的問題折騰了一下,最後原因是那個Index.yaml檔案寫得有問題。再度更新後成功部署。

相關推薦

Helm安裝專案使用

整體架構   1.為什麼要用? 首先在原來專案中都是基於yaml檔案來進行部署釋出的,而目前專案大部分微服務化或者模組化,會分成很多個元件來部署,每個元件可能對應一個deployment.yaml,一個service.yaml,一個Ingress.yaml還可能存在各種依賴關係,這樣一個專案如果有5個元件,很

vue的安裝專案構建

 第一種方法:   先安裝好note.js 第一步  :改淘寶映象  npm install -g cnpm --registry= https://registry.npm.ta

阿里雲伺服器的web專案釋出之路:(五)nodejs的安裝專案部署詳細步驟

Nodejs如何部署在雲服務上 第一步:下載nodejs安裝包,並解壓壓縮包[解壓後預設在root下面] wget命令下載Node.js安裝包,該安裝包是編譯好的檔案,解壓之後,無需重複編 命令列:wget https://nodejs.org/dist/v6.

Ionic3安裝專案建立

安裝前請注意各個版本的相容問題,以下版本親測可用。【安裝過程中注意網路必須暢通】   1. 請預先安裝好nodejs (官網:https://nodejs.org/en/) 【開啟命令列測試】   2. 安裝淘寶映象命令  npm install -g cnpm --r

kubernetes系列(十六) - Helm安裝入門

- [1. helm簡介](#head1) - [1.1 為什麼需要helm](#head2) - [1.2 helm中幾個概念](#head3) - [1.3 helm用途](#head4) - [2. helm安裝](#head5) - [3. helm的基本使用](#head6) - [3.1

Kubernetes使用helm安裝Harbor管理imagechart

net 參考 work http png director reat 定義 下載失敗 Kubernetes使用helm安裝Harbor管理image和chart [TOC] 1. 環境說明 可用的kubernetes集群 可用的helm服務端、客戶端 可用的kubeapp

wordpress(1) —— 安裝遷移原專案

一、環境安裝 二、如何遷移一個wordpress原專案 一、快速安裝wordpress 1 開始安裝WordPress之前你需要知道的東西 1.1 安裝WordPress你必須做的事情 2 著名的5分安裝 3&

CocoaPods -- ios專案安裝使用CocoaPods

CocoaPods是什麼? 當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,“子子孫孫無窮盡也”,這也許是比較特殊的情況。總之小編

nodejs解壓版安裝配置(帶有搭建前端專案腳手架)

nodejs 安裝  我先前用了nvm,覺得nvm挺厲害可以隨時更換nodejs版本,但是研究了下,可能自己功力不夠還是什麼,並不好用,中間還出現了錯誤;所以最後還是解除安裝了; 本文圖文並茂的一步一步的來,旨在好用簡潔: 1】第一步:下載nodejs 中文官網: https://nodej

前端Vue框架(搭配Node伺服器專案安裝指令)

Node參考下載地址:https://nodejs.org/zh-cn/download/ 參考安裝教程:https://www.runoob.com/nodejs/nodejs-install-setup.html開啟node指令面板後進行 安裝外掛: npm install -g vue-cli

MongoDB 的基本安裝使用以及在 Django 專案中的運用

myMongoDB MongoDB的安裝和基本使用 環境 Python 3.6 Django 2.0.7 mongoengine 0.15.3 Mac Github 地址 https://githu

Redis 的安裝基本使用以及在 Django 專案中的配置使用

myRedis Redis的安裝好基本使用 環境 Python 3.6 Django 2.0.7 django-redis 4.9.0 Mac GitHub https://github.com/C

Docker環境安裝在Tomcat中部署靜態專案web專案

Docker 使用記錄 準備工作 linux伺服器一臺 ssh工具一個(主要用登入linux) 獲取該伺服器root許可權 耐心 環境搭建 登入伺服器 1. ssh -p 22 [email protected]

nginx安裝簡單部署java web專案

1.Nginx (“engine x”) 是一個高效能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。 Nginx特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好。 Nginx由核心和模組組成,其中,核心的設

vue+django restful framework 電商專案(三) -- xadmin安裝 商品資料的匯入

         xadmin的安裝和配置詳見部落格:http://www.cnblogs.com/shhnwangjian/p/6372503.html   途中可能會遇到缺少什麼包, 用pip

React Native入門篇—第三步專案常用依賴包的安裝配置

本人學習React Native沒有看過任何教學視訊,都是按照官網一步步學習的。只研究了Android開發,所以下面的教程都是Android開發教程。 注意:未經允許不可私自轉載,違者必究 React Native官方文件:https://reactnative.cn/docs

VUE專案安裝使用vant元件

Vant 是有贊前端團隊基於有贊統一的規範實現的 Vue 元件庫,提供了一整套 UI 基礎元件和業務元件。 特性 50+ 個經過有贊線上業務檢驗的元件 單元測試覆蓋率超過 90% 完善的中英文文件和示例 支援 TypeScript 支援 SSR   元件中文

github~安裝IDEA同步專案使用

註冊與下載 安裝 一直點選下一步即可 cmd進到dos下 輸入git,出下下圖內容 安裝成功 IDEA配置git setting–》填寫安裝目錄的路徑,點選test,會顯示成功! GitHub填寫你在官網中註冊的使用者名稱和密碼。

Vant的安裝配合引入Vue.js專案

1.安裝vantnpm i vant -S:這是簡寫形式。npm install vant --save:這是完整寫法。如果你網路很慢的話,可以使用淘寶的源,但是不建議使用cnpm來進行安裝。npm install vant--save--registry=https://r

安卓專案的目錄結構專案安裝啟動過程描述

專案目錄說明: src:存放java程式的原始檔 gen:由開發工具自動生成的檔案。不是開發人員建立,工具自動建立。其中有一個R檔案,使用者等級各種資源的id,是由編譯器在編譯的時候指定的。R檔案會根據res下面各個資源的詳細情況進行一一描述,每一個資源都對應一個編號。R檔