容器編排系統K8s之包管理器helm基礎使用(二)

itread01 2021-01-21 23:21:30
管理 容器 k8s 管理器 包管


前文我們介紹了helm的相關術語和使用helm安裝和解除安裝應用,回顧請參考:https://www.cnblogs.com/qiuhom-1874/p/14305902.html;今天我們來介紹下自定義chart以及打包chart,helm其他命令使用和私有helm倉庫搭建相關話題;

繼上一篇部落格,我們瞭解了使用helm在k8s上安裝應用,解除安裝應用,以及倉庫的新增刪除更新等等操作;對於helm chart來說,它就是一個打包檔案,把我們需要用到的配置清單,以模板的形式釋出出來,使用者使用時,可以根據values.yaml檔案來自行定義對應的屬性的值,當然也可以使用--set選項來指定個別配置清單的屬性的值;那麼我們使用helm命令從倉庫中安裝應用,它對應的打包檔案放在那裡的呢?預設情況我們使用helm命令安裝應用,它會把對應應用的chart 打包檔案存放在當前使用者的家目錄中的.cache/helm/repository/目錄下,以.tgz結尾的一個壓縮包;如下

提示:上述目錄只要我們使用過helm install命令安裝應用,對應的chart 打包檔案都會下載到此處;

檢視對應打包目錄結構

[[email protected] ~]# ll .cache/helm/repository/total 6520-rw-r--r-- 1 root root 865 Jan 21 02:23 bitnami-charts.txt-rw-r--r-- 1 root root 6555926 Jan 21 02:23 bitnami-index.yaml-rw-r--r-- 1 root root 4381 Jan 20 23:19 redis-rw-r--r-- 1 root root 31909 Jan 20 22:54 redis-10.5.7.tgz-rw-r--r-- 1 root root 72791 Jan 21 02:26 redis-12.6.2.tgz[[email protected] ~]# cp .cache/helm/repository/redis-12.6.2.tgz .[[email protected] ~]# lsredis-12.6.2.tgz[[email protected] ~]# tar xf redis-12.6.2.tgz [[email protected] ~]# lsredis redis-12.6.2.tgz[[email protected] ~]# tree redisredis├── Chart.lock├── charts│   └── common│   ├── Chart.yaml│   ├── README.md│   ├── templates│   │   ├── _affinities.tpl│   │   ├── _capabilities.tpl│   │   ├── _errors.tpl│   │   ├── _images.tpl│   │   ├── _ingress.tpl│   │   ├── _labels.tpl│   │   ├── _names.tpl│   │   ├── _secrets.tpl│   │   ├── _storage.tpl│   │   ├── _tplvalues.tpl│   │   ├── _utils.tpl│   │   ├── validations│   │   │   ├── _cassandra.tpl│   │   │   ├── _mariadb.tpl│   │   │   ├── _mongodb.tpl│   │   │   ├── _postgresql.tpl│   │   │   ├── _redis.tpl│   │   │   └── _validations.tpl│   │   └── _warnings.tpl│   └── values.yaml├── Chart.yaml├── ci│   ├── default-values.yaml│   ├── extra-flags-values.yaml│   └── production-sentinel-values.yaml├── img│   ├── redis-cluster-topology.png│   └── redis-topology.png├── README.md├── templates│   ├── configmap-scripts.yaml│   ├── configmap.yaml│   ├── headless-svc.yaml│   ├── health-configmap.yaml│   ├── _helpers.tpl│   ├── metrics-prometheus.yaml│   ├── metrics-svc.yaml│   ├── networkpolicy.yaml│   ├── NOTES.txt│   ├── pdb.yaml│   ├── prometheusrule.yaml│   ├── psp.yaml│   ├── redis-master-statefulset.yaml│   ├── redis-master-svc.yaml│   ├── redis-node-statefulset.yaml│   ├── redis-rolebinding.yaml│   ├── redis-role.yaml│   ├── redis-serviceaccount.yaml│   ├── redis-slave-statefulset.yaml│   ├── redis-slave-svc.yaml│   ├── redis-with-sentinel-svc.yaml│   └── secret.yaml├── values.schema.json└── values.yaml7 directories, 53 files[[email protected] ~]# 

提示:charts目錄主要用來存放對應chart所依賴的其他chart檔案;chart.yaml檔案主要用來描述對應chart的元資料資訊,比如chart 的版本,名字,簡介資訊等等;ci目錄用於存放各種環境的values.yaml檔案,預設情況不指定values檔案,對應生效的是values.yaml檔案;img目錄主要用於存放對應chart在倉庫中對應的圖示;README.md檔案用於描述該chart的使用方式,部署手冊等等資訊;template目錄主要用來存放該chart部署為release所需的所有資源清單檔案,該目錄下的資源清單檔案不是我們前邊使用的資源清單檔案,它裡面的格式是通過go模板語言寫的資源清單,在使用時,我們必須結合values.yaml中定義的值,通過模板引擎將其渲染以後才能正常使用;values.yaml檔案主要用來描述對應資源模板清單中對應屬性的預設值,一般不指定values檔案,chart應用的值都來自於values.yaml檔案,當然使用者可以通過--set 來指定對應屬性的值,也可以手動編輯values檔案,用--values或者-f選項指定對應的值檔案也行;

建立自定義chart命令幫助

[[email protected] ~]# helm create -hThis command creates a chart directory along with the common files anddirectories used in a chart.For example, 'helm create foo' will create a directory structure that lookssomething like this: foo/ ├── .helmignore # Contains patterns to ignore when packaging Helm charts. ├── Chart.yaml # Information about your chart ├── values.yaml # The default values for your templates ├── charts/ # Charts that this chart depends on └── templates/ # The template files └── tests/ # The test files'helm create' takes a path for an argument. If directories in the given pathdo not exist, Helm will attempt to create them as it goes. If the givendestination exists and there are files in that directory, conflicting fileswill be overwritten, but other files will be left alone.Usage: helm create NAME [flags]Flags: -h, --help help for create -p, --starter string the name or absolute path to Helm starter scaffoldGlobal Flags: --debug enable verbose output --kube-apiserver string the address and the port for the Kubernetes API server --kube-as-group stringArray group to impersonate for the operation, this flag can be repeated to specify multiple groups. --kube-as-user string username to impersonate for the operation --kube-ca-file string the certificate authority file for the Kubernetes API server connection --kube-context string name of the kubeconfig context to use --kube-token string bearer token used for authentication --kubeconfig string path to the kubeconfig file -n, --namespace string namespace scope for this request --registry-config string path to the registry config file (default "/root/.config/helm/registry.json") --repository-cache string path to the file containing cached repository indexes (default "/root/.cache/helm/repository") --repository-config string path to the file containing repository names and URLs (default "/root/.config/helm/repositories.yaml")[[email protected] ~]# 

示例:建立一個myapp的chart

[[email protected] ~]# helm create myappCreating myapp[[email protected] ~]# lsmyapp redis redis-12.6.2.tgz[[email protected] ~]# tree myapp/myapp/├── charts├── Chart.yaml├── templates│   ├── deployment.yaml│   ├── _helpers.tpl│   ├── hpa.yaml│   ├── ingress.yaml│   ├── NOTES.txt│   ├── serviceaccount.yaml│   ├── service.yaml│   └── tests│   └── test-connection.yaml└── values.yaml3 directories, 10 files[[email protected] ~]# 

檢視chart.yaml檔案內容

[[email protected] ~]# cat myapp/Chart.yaml apiVersion: v2name: myappdescription: A Helm chart for Kubernetes# A chart can be either an 'application' or a 'library' chart.## Application charts are a collection of templates that can be packaged into versioned archives# to be deployed.## Library charts provide useful utilities or functions for the chart developer. They're included as# a dependency of application charts to inject those utilities and functions into the rendering# pipeline. Library charts do not define any templates and therefore cannot be deployed.type: application# This is the chart version. This version number should be incremented each time you make changes# to the chart and its templates, including the app version.# Versions are expected to follow Semantic Versioning (https://semver.org/)version: 0.1.0# This is the version number of the application being deployed. This version number should be# incremented each time you make changes to the application. Versions are not expected to# follow Semantic Versioning. They should reflect the version the application is using.# It is recommended to use it with quotes.appVersion: "1.16.0"[[email protected] ~]# 

提示:Chart.yaml檔案主要用來描述對應chart的相關屬性資訊,其中apiVersion欄位用於描述對應chart使用的api版本,預設是v2版本;name欄位用於描述對應chart的名稱;description欄位用於描述對應chart的說明簡介;type欄位使用者描述對應chart是應用程式還是庫檔案,應用程式型別的chart,它可以執行為一個release,但庫型別的chart不能執行為release,它只能作為依賴被application型別的chart所使用;version欄位用於描述對應chart版本;appVersion欄位用於描述對應chart內部程式的版本資訊;

檢視模板檔案

[[email protected] ~]# ll myapp/templates/total 28-rw-r--r-- 1 root root 1826 Jan 21 14:44 deployment.yaml-rw-r--r-- 1 root root 1762 Jan 21 14:44 _helpers.tpl-rw-r--r-- 1 root root 910 Jan 21 14:44 hpa.yaml-rw-r--r-- 1 root root 1052 Jan 21 14:44 ingress.yaml-rw-r--r-- 1 root root 1739 Jan 21 14:44 NOTES.txt-rw-r--r-- 1 root root 316 Jan 21 14:44 serviceaccount.yaml-rw-r--r-- 1 root root 355 Jan 21 14:44 service.yamldrwxr-xr-x 2 root root 34 Jan 21 14:44 tests[[email protected] ~]# cat myapp/templates/deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: {{ include "myapp.fullname" . }} labels: {{- include "myapp.labels" . | nindent 4 }}spec: {{- if not .Values.autoscaling.enabled }} replicas: {{ .Values.replicaCount }} {{- end }} selector: matchLabels: {{- include "myapp.selectorLabels" . | nindent 6 }} template: metadata: {{- with .Values.podAnnotations }} annotations: {{- toYaml . | nindent 8 }} {{- end }} labels: {{- include "myapp.selectorLabels" . | nindent 8 }} spec: {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} serviceAccountName: {{ include "myapp.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} containers: - name: {{ .Chart.Name }} securityContext: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: 80 protocol: TCP livenessProbe: httpGet: path: / port: http readinessProbe: httpGet: path: / port: http resources: {{- toYaml .Values.resources | nindent 12 }} {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.affinity }} affinity: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{- toYaml . | nindent 8 }} {{- end }}[[email protected] ~]# 

提示:該部署清單模板檔案,主要用go模板語言來寫的,其中{{ include "myapp.fullname" . }}就表示取myapp的全名;{{ .Values.image.repository }}這段程式碼表示讀取當前目錄下的values檔案中的image.repository欄位的值;{{ .Values.image.tag | default .Chart.AppVersion }}表示對於values檔案中image.tag的值或者讀取default.chart檔案中的AppVersion欄位的值;簡單講go模板就是應用對應go模板語法來定義關屬性的的值;一般都是從values.yaml檔案中載入對應欄位的值作為模板檔案相關屬性的值;

values檔案中的值引用

[[email protected] ~]# cat myapp/values.yaml # Default values for myapp.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 1image: repository: nginx pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: ""imagePullSecrets: []nameOverride: ""fullnameOverride: ""serviceAccount: # Specifies whether a service account should be created create: true # Annotations to add to the service account annotations: {} # The name of the service account to use. # If not set and create is true, a name is generated using the fullname template name: ""podAnnotations: {}podSecurityContext: {} # fsGroup: 2000securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000service: type: ClusterIP port: 80ingress: enabled: false annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - host: chart-example.local paths: [] tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.localresources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. # limits: # cpu: 100m # memory: 128Mi # requests: # cpu: 100m # memory: 128Miautoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}[[email protected] ~]# 

提示:比如我們要引用values.yaml檔案中的image欄位下的tag欄位的值,我們可以在模板檔案中寫成{{ .Values.image.tag }};如果在命令列使用--set選項來應用我們可以寫成 image.tag;修改對應的值可以直接編輯對應values.yaml檔案中對應欄位的值,也可以直接使用--set 指定對應欄位的對應值即可;預設情況在命令列使用--set選項給出的值,都會直接被替換,沒有給定的值,預設還是使用values.yaml檔案中給定的預設值;

示例:修改values.yaml檔案中的值

[[email protected] ~]# cat myapp/values.yaml# Default values for myapp.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 1image: repository: ikubernetes/myapp pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: "v1"imagePullSecrets: []nameOverride: ""fullnameOverride: ""serviceAccount: # Specifies whether a service account should be created create: true # Annotations to add to the service account annotations: {} # The name of the service account to use. # If not set and create is true, a name is generated using the fullname template name: ""podAnnotations: {}podSecurityContext: {} # fsGroup: 2000securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000service: type: ClusterIP port: 80ingress: enabled: false annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - host: chart-example.local paths: [] tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.localresources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Miautoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}[[email protected] ~]# 

提示:上述values.yaml檔案,我們修改了image.repository的值為ikubernetes/myapp和image.tag為v1;這表示對應chart使用程式的映象倉庫為ikubernetes/myapp倉庫;版本為v1;然後修改了resources欄位;添加了對應的資源限制配置;

檢查對應values檔案的語法是否正確?

[[email protected] ~]# helm lint ./myapp/==> Linting ./myapp/[INFO] Chart.yaml: icon is recommended[ERROR] values.yaml: unable to parse YAML: error converting YAML to JSON: yaml: line 60: did not find expected key[ERROR] templates/: cannot load values.yaml: error converting YAML to JSON: yaml: line 60: did not find expected key[ERROR] : unable to load chart cannot load values.yaml: error converting YAML to JSON: yaml: line 60: did not find expected keyError: 1 chart(s) linted, 1 chart(s) failed[[email protected] ~]# 

提示:檢查values檔案的配置語法,可以使用helm lint命令指定對應chart的目錄即可;上述檢查結果告訴我們所values.yaml的60配置有問題;

提示:上述values檔案中,resource欄位後面給定了對應的配置,對應{}就不能再使用,使用{}表示把resource欄位留空;所以我們只需把對應的大括號刪除即可;

刪除resource欄位的大括號,再次檢查values的語法

[[email protected] ~]# helm lint ./myapp/ ==> Linting ./myapp/[INFO] Chart.yaml: icon is recommended1 chart(s) linted, 0 chart(s) failed[[email protected] ~]# 

提示:只要上述檢查過程中沒有出現錯誤的類資訊,表示values語法正確;到此我們就可以使用我們手動建立的chart來部署為一個release了;

修改Chart.yaml中的資訊,將myapp chart 部署為一個release

[[email protected] ~]# cat ./myapp/Chart.yamlapiVersion: v2name: myappdescription: web server# A chart can be either an 'application' or a 'library' chart.## Application charts are a collection of templates that can be packaged into versioned archives# to be deployed.## Library charts provide useful utilities or functions for the chart developer. They're included as# a dependency of application charts to inject those utilities and functions into the rendering# pipeline. Library charts do not define any templates and therefore cannot be deployed.type: application# This is the chart version. This version number should be incremented each time you make changes# to the chart and its templates, including the app version.# Versions are expected to follow Semantic Versioning (https://semver.org/)version: 0.1.0# This is the version number of the application being deployed. This version number should be# incremented each time you make changes to the application. Versions are not expected to# follow Semantic Versioning. They should reflect the version the application is using.# It is recommended to use it with quotes.appVersion: "v1"[[email protected] ~]# 

應用myapp chart

[[email protected] ~]# helm install myapp-v1 ./myapp/ NAME: myapp-v1LAST DEPLOYED: Thu Jan 21 15:15:52 2021NAMESPACE: defaultSTATUS: deployedREVISION: 1NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp-v1" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT[[email protected] ~]#

提示:部署自定義chart 使用helm install 指定對應release名稱,以及chart所在目錄即可;

檢視release

[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 1 2021-01-21 15:15:52.57286036 +0800 CST deployed myapp-0.1.0 v1 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# 

檢視對應pod是否正常執行?對應service是否正常建立?

提示:可以看到對應pod和svc都正常建立;

升級release

更改Chart.yaml檔案中的內容

[[email protected] ~]# cat myapp/Chart.yamlapiVersion: v2name: myappdescription: web server# A chart can be either an 'application' or a 'library' chart.## Application charts are a collection of templates that can be packaged into versioned archives# to be deployed.## Library charts provide useful utilities or functions for the chart developer. They're included as# a dependency of application charts to inject those utilities and functions into the rendering# pipeline. Library charts do not define any templates and therefore cannot be deployed.type: application# This is the chart version. This version number should be incremented each time you make changes# to the chart and its templates, including the app version.# Versions are expected to follow Semantic Versioning (https://semver.org/)version: 0.2.0# This is the version number of the application being deployed. This version number should be# incremented each time you make changes to the application. Versions are not expected to# follow Semantic Versioning. They should reflect the version the application is using.# It is recommended to use it with quotes.appVersion: "v2"[[email protected] ~]# 

更改values.yaml檔案中對應映象的版本

[[email protected] ~]# cat myapp/values.yaml# Default values for myapp.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 1image: repository: ikubernetes/myapp pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: "v2"imagePullSecrets: []nameOverride: ""fullnameOverride: ""serviceAccount: # Specifies whether a service account should be created create: true # Annotations to add to the service account annotations: {} # The name of the service account to use. # If not set and create is true, a name is generated using the fullname template name: ""podAnnotations: {}podSecurityContext: {} # fsGroup: 2000securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000service: type: ClusterIP port: 80ingress: enabled: false annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - host: chart-example.local paths: [] tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.localresources: # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Miautoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}[[email protected] ~]# 

使用upgrade命令升級release

[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 1 2021-01-21 15:15:52.57286036 +0800 CST deployed myapp-0.1.0 v1 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# helm upgrade --set service.type="NodePort" myapp-v1 ./myapp/ Release "myapp-v1" has been upgraded. Happy Helming!NAME: myapp-v1LAST DEPLOYED: Thu Jan 21 15:24:22 2021NAMESPACE: defaultSTATUS: deployedREVISION: 2NOTES:1. Get the application URL by running these commands: export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services myapp-v1) export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 2 2021-01-21 15:24:22.882236621 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyapp-v1-7c9d7c999f-8k6rm 0/1 Terminating 0 8m47smyapp-v1-866b6d4cc6-nx87c 1/1 Running 0 16sredis-demo-master-0 1/1 Running 1 13hredis-demo-slave-0 1/1 Running 2 13hredis-demo-slave-1 1/1 Running 7 13hredis-master-0 1/1 Running 1 12hredis-slave-0 1/1 Running 1 12hredis-slave-1 1/1 Running 1 12h[[email protected] ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15hmyapp-v1 NodePort 10.110.153.241 <none> 80:32434/TCP 8m53sredis-demo-headless ClusterIP None <none> 6379/TCP 13hredis-demo-master ClusterIP 10.109.45.70 <none> 6379/TCP 13hredis-demo-slave ClusterIP 10.111.222.218 <none> 6379/TCP 13hredis-headless ClusterIP None <none> 6379/TCP 12hredis-master ClusterIP 10.108.35.165 <none> 6379/TCP 12hredis-slave ClusterIP 10.99.96.166 <none> 6379/TCP 12h[[email protected] ~]# 

提示:可以看到對應myapp-v1pod和svc都發生了變化;

驗證:檢視對應pod的版本資訊

[[email protected] ~]# kubectl describe pods myapp-v1-866b6d4cc6-nx87c |grep Image Image: ikubernetes/myapp:v2 Image ID: docker-pullable://ikubernetes/[email protected]:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358[[email protected] ~]# 

當然如果更新操作改動的資訊較少,我們也可以直接在命令使用--set選項來指定對應的屬性的值進行更新也行,如下

[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 2 2021-01-21 15:24:22.882236621 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# helm upgrade --set image.tag="v3" myapp-v1 ./myapp/Release "myapp-v1" has been upgraded. Happy Helming!NAME: myapp-v1LAST DEPLOYED: Thu Jan 21 15:29:46 2021NAMESPACE: defaultSTATUS: deployedREVISION: 3NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp-v1" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 3 2021-01-21 15:29:46.491467084 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# 

提示:手動使用命令列選項--set更新,對應我們需要把對應的Chart中的資訊要提前修改了,否則像上面我們沒有修改對應檔案中的資訊,它保留的還是原來的資訊;

驗證:檢視對應pod是否更新了版本?

[[email protected] ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyapp-v1-675d685ddf-nn2zd 1/1 Running 0 106sredis-demo-master-0 1/1 Running 1 13hredis-demo-slave-0 1/1 Running 2 13hredis-demo-slave-1 1/1 Running 7 13hredis-master-0 1/1 Running 1 13hredis-slave-0 1/1 Running 1 13hredis-slave-1 1/1 Running 1 13h[[email protected] ~]# kubectl describe pods/myapp-v1-675d685ddf-nn2zd |grep Image Image: ikubernetes/myapp:v3 Image ID: docker-pullable://ikubernetes/[email protected]:b8d74db2515d3c1391c78c5768272b9344428035ef6d72158fd9f6c4239b2c69[[email protected] ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15hmyapp-v1 ClusterIP 10.110.153.241 <none> 80/TCP 16mredis-demo-headless ClusterIP None <none> 6379/TCP 13hredis-demo-master ClusterIP 10.109.45.70 <none> 6379/TCP 13hredis-demo-slave ClusterIP 10.111.222.218 <none> 6379/TCP 13hredis-headless ClusterIP None <none> 6379/TCP 13hredis-master ClusterIP 10.108.35.165 <none> 6379/TCP 13hredis-slave ClusterIP 10.99.96.166 <none> 6379/TCP 13h[[email protected] ~]# 

提示:上面用命令列選項指定對應映象的版本更新是成功的;對應svc沒有指定其型別,也是使用的預設型別;

回滾release

[[email protected] ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 3 2021-01-21 15:29:46.491467084 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# helm rollback myapp-v1 2Rollback was a success! Happy Helming![[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 4 2021-01-21 15:33:58.389015959 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# helm rollback myapp-v1 2Rollback was a success! Happy Helming![[email protected] ~]# helm rollback myapp-v1 1Rollback was a success! Happy Helming![[email protected] ~]# helm history myapp-v1REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Jan 21 15:15:52 2021 superseded myapp-0.1.0 v1 Install complete2 Thu Jan 21 15:24:22 2021 superseded myapp-0.2.0 v2 Upgrade complete3 Thu Jan 21 15:29:46 2021 superseded myapp-0.2.0 v2 Upgrade complete4 Thu Jan 21 15:33:58 2021 superseded myapp-0.2.0 v2 Rollback to 2 5 Thu Jan 21 15:36:08 2021 superseded myapp-0.2.0 v2 Rollback to 2 6 Thu Jan 21 15:36:26 2021 deployed myapp-0.1.0 v1 Rollback to 1 [[email protected] ~]# helm rollback myapp-v1 1Rollback was a success! Happy Helming![[email protected] ~]# helm history myapp-v1 REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Jan 21 15:15:52 2021 superseded myapp-0.1.0 v1 Install complete2 Thu Jan 21 15:24:22 2021 superseded myapp-0.2.0 v2 Upgrade complete3 Thu Jan 21 15:29:46 2021 superseded myapp-0.2.0 v2 Upgrade complete4 Thu Jan 21 15:33:58 2021 superseded myapp-0.2.0 v2 Rollback to 2 5 Thu Jan 21 15:36:08 2021 superseded myapp-0.2.0 v2 Rollback to 2 6 Thu Jan 21 15:36:26 2021 superseded myapp-0.1.0 v1 Rollback to 1 7 Thu Jan 21 15:38:21 2021 deployed myapp-0.1.0 v1 Rollback to 1 [[email protected] ~]# helm rollback myapp-v1 3Rollback was a success! Happy Helming![[email protected] ~]# helm history myapp-v1 REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Jan 21 15:15:52 2021 superseded myapp-0.1.0 v1 Install complete2 Thu Jan 21 15:24:22 2021 superseded myapp-0.2.0 v2 Upgrade complete3 Thu Jan 21 15:29:46 2021 superseded myapp-0.2.0 v2 Upgrade complete4 Thu Jan 21 15:33:58 2021 superseded myapp-0.2.0 v2 Rollback to 2 5 Thu Jan 21 15:36:08 2021 superseded myapp-0.2.0 v2 Rollback to 2 6 Thu Jan 21 15:36:26 2021 superseded myapp-0.1.0 v1 Rollback to 1 7 Thu Jan 21 15:38:21 2021 superseded myapp-0.1.0 v1 Rollback to 1 8 Thu Jan 21 15:40:38 2021 deployed myapp-0.2.0 v2 Rollback to 3 [[email protected] ~]# 

提示:回滾操作我們需要指定對應回滾的位置,這個位置用一個數字表示,這個數字就是對應的歷史版本的序號;比如回滾到序號為2的版本上,就使用helm rollback myapp-v1 2;如果回滾到版本序號為3的版本上,就把對應後面的版本序號更改為3即可;依此邏輯進行回滾;檢視對應release的版本歷史,可以使用helm history RELEASE_NAME來檢視;上述命令最後我們會滾到序號為3的版本上,該版本對應應用程式的版本為v3;

驗證:檢視對應pod程式版本是否v3?

[[email protected] ~]# kubectl get podsNAME READY STATUS RESTARTS AGEmyapp-v1-675d685ddf-7c8zd 1/1 Running 0 11mredis-demo-master-0 1/1 Running 1 13hredis-demo-slave-0 1/1 Running 2 13hredis-demo-slave-1 1/1 Running 7 13hredis-master-0 1/1 Running 1 13hredis-slave-0 1/1 Running 1 13hredis-slave-1 1/1 Running 1 13h[[email protected] ~]# kubectl describe pods/myapp-v1-675d685ddf-7c8zd |grep Image Image: ikubernetes/myapp:v3 Image ID: docker-pullable://ikubernetes/[email protected]:b8d74db2515d3c1391c78c5768272b9344428035ef6d72158fd9f6c4239b2c69[[email protected] ~]# 

提示:可以看到對應pod使用的映象版本是v3;

檢視myapp-v1的狀態

[[email protected] ~]# helm status myapp-v1NAME: myapp-v1LAST DEPLOYED: Thu Jan 21 15:40:38 2021NAMESPACE: defaultSTATUS: deployedREVISION: 8NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp-v1" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT[[email protected] ~]# 

提示:helm status命令就相當於是把對應chart中的template目錄下NOTES.txt檔案進行渲染以後,輸出給使用者;這個內容主要告訴使用者對應chart怎麼連線使用,對應chart的狀態資訊等等;

使用命令檢視readme檔案內容,chart.yaml檔案內容和values檔案內容

[[email protected] ~]# helm show readme [[email protected] ~]# helm show readme myapp/[[email protected] ~]# helm show chart myapp/ apiVersion: v2appVersion: v2description: web servername: myapptype: applicationversion: 0.2.0[[email protected] ~]# helm show values myapp/# Default values for myapp.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 1image: repository: ikubernetes/myapp pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: "v2"imagePullSecrets: []nameOverride: ""fullnameOverride: ""serviceAccount: # Specifies whether a service account should be created create: true # Annotations to add to the service account annotations: {} # The name of the service account to use. # If not set and create is true, a name is generated using the fullname template name: ""podAnnotations: {}podSecurityContext: {} # fsGroup: 2000securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000service: type: ClusterIP port: 80ingress: enabled: false annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - host: chart-example.local paths: [] tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.localresources: # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little # resources, such as Minikube. If you do want to specify resources, uncomment the following # lines, adjust them as necessary, and remove the curly braces after 'resources:'. limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Miautoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}[[email protected] ~]# 

提示:對應chart中沒有README.md檔案,對應使用helm show readme命令也是無法獲取到對應內容;

檢視template目錄下的模板檔案內容

[[email protected] ~]# helm template myapp/---# Source: myapp/templates/serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata: name: RELEASE-NAME-myapp labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helm---# Source: myapp/templates/service.yamlapiVersion: v1kind: Servicemetadata: name: RELEASE-NAME-myapp labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helmspec: type: ClusterIP ports: - port: 80 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME---# Source: myapp/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: RELEASE-NAME-myapp labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helmspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME template: metadata: labels: app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME spec: serviceAccountName: RELEASE-NAME-myapp securityContext: {} containers: - name: myapp securityContext: {} image: "ikubernetes/myapp:v2" imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 protocol: TCP livenessProbe: httpGet: path: / port: http readinessProbe: httpGet: path: / port: http resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi---# Source: myapp/templates/tests/test-connection.yamlapiVersion: v1kind: Podmetadata: name: "RELEASE-NAME-myapp-test-connection" labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helm annotations: "helm.sh/hook": testspec: containers: - name: wget image: busybox command: ['wget'] args: ['RELEASE-NAME-myapp:80'] restartPolicy: Never[[email protected] ~]# 

提示:上述清單是通過模板引擎結合values檔案中定義的值進行渲染以後的結果;

從倉庫中下載chart檔案到本地

提示:如果要下載對應chart檔案,我們可以使用pull命令,該命令會到對應倉庫把對應chart的打包檔案下載到本地;你的伺服器不能正常連線倉庫,請使用代理;如上;

獲取已經安裝的release的擴充套件資訊

[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-v1 default 8 2021-01-21 15:40:38.060295891 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# helm get values myapp-v1USER-SUPPLIED VALUES:image: tag: v3[[email protected] ~]# helm get notes myapp-v1 NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp-v1" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT[[email protected] ~]# helm get hooks myapp-v1---# Source: myapp/templates/tests/test-connection.yamlapiVersion: v1kind: Podmetadata: name: "myapp-v1-test-connection" labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1 app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helm annotations: "helm.sh/hook": testspec: containers: - name: wget image: busybox command: ['wget'] args: ['myapp-v1:80'] restartPolicy: Never[[email protected] ~]# helm get manifest myapp-v1---# Source: myapp/templates/serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata: name: myapp-v1 labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1 app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helm---# Source: myapp/templates/service.yamlapiVersion: v1kind: Servicemetadata: name: myapp-v1 labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1 app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helmspec: type: ClusterIP ports: - port: 80 targetPort: http protocol: TCP name: http selector: app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1---# Source: myapp/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: myapp-v1 labels: helm.sh/chart: myapp-0.2.0 app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1 app.kubernetes.io/version: "v2" app.kubernetes.io/managed-by: Helmspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1 template: metadata: labels: app.kubernetes.io/name: myapp app.kubernetes.io/instance: myapp-v1 spec: serviceAccountName: myapp-v1 securityContext: {} containers: - name: myapp securityContext: {} image: "ikubernetes/myapp:v3" imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 protocol: TCP livenessProbe: httpGet: path: / port: http readinessProbe: httpGet: path: / port: http resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi[[email protected] ~]# 

提示:如果要一次獲取上述所有內容,可以使用helm get all 命令進行獲取;

打包自定義chart

[[email protected] ~]# lslogstash-3.0.2.tgz myapp redis redis-12.6.2.tgz[[email protected] ~]# helm package ./myapp/Successfully packaged chart and saved it to: /root/myapp-0.2.0.tgz[[email protected] ~]# lslogstash-3.0.2.tgz myapp myapp-0.2.0.tgz redis redis-12.6.2.tgz[[email protected] ~]# 

提示:打包好chart檔案以後,我們就可以把對應檔案放到對應的倉庫中共享給別人使用;

helm私有倉庫搭建

helm私有倉庫本質上就是一個http檔案伺服器,我們只需要將對應的chart打包檔案,以及對應倉庫的元資料資訊放到對應目錄即可

找一臺伺服器安裝nginx作為helm 私有倉庫

[[email protected]_registry ~]# yum install -y nginx

生成倉庫元資料資訊

[[email protected] ~]# mkdir repo-test[[email protected] ~]# mv *.tgz repo-test/[[email protected] ~]# lsmyapp redis repo-test[[email protected] ~]# cd repo-test/[[email protected] repo-test]# helm repo index . --url http://192.168.0.99/repo-test[[email protected] repo-test]# lsindex.yaml logstash-3.0.2.tgz myapp-0.2.0.tgz redis-12.6.2.tgz[[email protected] repo-test]# cat index.yaml apiVersion: v1entries: logstash: - annotations: category: LogManagement apiVersion: v2 appVersion: 7.10.2 created: "2021-01-21T16:43:51.585642435+08:00" dependencies: - name: common repository: https://charts.bitnami.com/bitnami tags: - bitnami-common version: 1.x.x description: Logstash is an open source, server-side data processing pipeline that ingests data from a multitude of sources simultaneously, transforms it, and then sends it to your favorite "stash". digest: b60ccc7d48acfbfafd6a226b32316fff173f7e17112cee8367c5680012bc37a1 home: https://github.com/bitnami/charts/tree/master/bitnami/logstash icon: https://bitnami.com/assets/stacks/logstash/img/logstash-stack-220x234.png keywords: - logstash - logging - elk maintainers: - email: [email protected] name: Bitnami name: logstash sources: - https://github.com/bitnami/bitnami-docker-logstash - https://www.elastic.co/products/logstash urls: - http://192.168.0.99/repo-test/logstash-3.0.2.tgz version: 3.0.2 myapp: - apiVersion: v2 appVersion: v2 created: "2021-01-21T16:43:51.586100842+08:00" description: web server digest: 55710394a8f2a8b0770c7212aaa92477adefebfbe72640d8c84e42c7999dd1d9 name: myapp type: application urls: - http://192.168.0.99/repo-test/myapp-0.2.0.tgz version: 0.2.0 redis: - annotations: category: Database apiVersion: v2 appVersion: 6.0.10 created: "2021-01-21T16:43:51.589712477+08:00" dependencies: - name: common repository: https://charts.bitnami.com/bitnami tags: - bitnami-common version: 1.x.x description: Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. digest: 4208a6eae05c9486dbecc55db3bc6e04960708e0b389adfa1f7e309d3937a451 home: https://github.com/bitnami/charts/tree/master/bitnami/redis icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png keywords: - redis - keyvalue - database maintainers: - email: [email protected] name: Bitnami - email: [email protected] name: desaintmartin name: redis sources: - https://github.com/bitnami/bitnami-docker-redis - http://redis.io/ urls: - http://192.168.0.99/repo-test/redis-12.6.2.tgz version: 12.6.2generated: "2021-01-21T16:43:51.568008766+08:00"[[email protected] repo-test]# 

複製repo-test目錄到web伺服器nginx的網頁根目錄

[[email protected] repo-test]# cd ..[[email protected] ~]# scp -r repo-test 192.168.0.99:/usr/share/nginx/html/[email protected]'s password: logstash-3.0.2.tgz 100% 26KB 8.8MB/s 00:00 myapp-0.2.0.tgz 100% 3584 406.3KB/s 00:00 redis-12.6.2.tgz 100% 71KB 10.5MB/s 00:00 index.yaml 100% 2548 348.1KB/s 00:00 [[email protected] ~]# ssh 192.168.0.99[email protected]'s password: Last login: Thu Jan 21 16:35:28 2021 from 192.168.0.232[[email protected]_registry ~]# ll /usr/share/nginx/html/total 12-rw-r--r-- 1 root root 3650 Nov 1 10:01 404.html-rw-r--r-- 1 root root 3693 Nov 1 10:01 50x.htmllrwxrwxrwx 1 root root 20 Jan 21 16:36 en-US -> ../../doc/HTML/en-USdrwxr-xr-x 2 root root 27 Jan 21 16:36 iconslrwxrwxrwx 1 root root 18 Jan 21 16:36 img -> ../../doc/HTML/imglrwxrwxrwx 1 root root 25 Jan 21 16:36 index.html -> ../../doc/HTML/index.html-rw-r--r-- 1 root root 368 Nov 1 10:01 nginx-logo.pnglrwxrwxrwx 1 root root 14 Jan 21 16:36 poweredby.png -> nginx-logo.pngdrwxr-xr-x 2 root root 97 Jan 21 16:45 repo-test[[email protected]_registry ~]# 

啟動nginx服務

[[email protected]_registry ~]# systemctl start nginx[[email protected]_registry ~]# ss -tnlState Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:20048 *:* LISTEN 0 5 192.168.122.1:53 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 192.168.0.99:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 64 *:45725 *:* LISTEN 0 128 *:36254 *:* LISTEN 0 64 *:2049 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::20048 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 :::52761 :::* LISTEN 0 64 :::2049 :::* LISTEN 0 64 :::43907 :::* [[email protected]_registry ~]# 

驗證:使用helm新增私有倉庫

[[email protected] ~]# helm repo add repo-test http://192.168.0.99/repo-test"repo-test" has been added to your repositories[[email protected] ~]# helm repo listNAME URL bitnami https://charts.bitnami.com/bitnamirepo-test http://192.168.0.99/repo-test [[email protected] ~]# helm search repo repo-testNAME CHART VERSION APP VERSION DESCRIPTION repo-test/logstash 3.0.2 7.10.2 Logstash is an open source, server-side data pr...repo-test/myapp 0.2.0 v2 web server repo-test/redis 12.6.2 6.0.10 Open source, advanced key-value store. It is of...[[email protected] ~]# 

提示:可以看到對應倉庫中的chart都可以正常列出來;

安裝私有倉庫中的chart

[[email protected] ~]# helm install myapp-test repo-test/myappNAME: myapp-testLAST DEPLOYED: Thu Jan 21 16:54:06 2021NAMESPACE: defaultSTATUS: deployedREVISION: 1NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=myapp,app.kubernetes.io/instance=myapp-test" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT[[email protected] ~]# helm listNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmyapp-test default 1 2021-01-21 16:54:06.041883984 +0800 CST deployed myapp-0.2.0 v2 myapp-v1 default 8 2021-01-21 15:40:38.060295891 +0800 CST deployed myapp-0.2.0 v2 redis default 1 2021-01-21 02:26:26.13324987 +0800 CST deployed redis-12.6.2 6.0.10 redis-demo default 1 2021-01-21 01:58:18.20798703 +0800 CST deployed redis-12.6.2 6.0.10 [[email protected] ~]# kubectl get pods NAME READY STATUS RESTARTS AGEmyapp-test-58c57d75fc-s22cn 1/1 Running 0 31smyapp-v1-675d685ddf-7c8zd 1/1 Running 0 73mredis-demo-master-0 1/1 Running 1 14hredis-demo-slave-0 1/1 Running 2 14hredis-demo-slave-1 1/1 Running 7 14hredis-master-0 1/1 Running 1 14hredis-slave-0 1/1 Running 1 14hredis-slave-1 1/1 Running 1 14h[[email protected] ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17hmyapp-test ClusterIP 10.108.7.220 <none> 80/TCP 39smyapp-v1 ClusterIP 10.110.153.241 <none> 80/TCP 98mredis-demo-headless ClusterIP None <none> 6379/TCP 14hredis-demo-master ClusterIP 10.109.45.70 <none> 6379/TCP 14hredis-demo-slave ClusterIP 10.111.222.218 <none> 6379/TCP 14hredis-headless ClusterIP None <none> 6379/TCP 14hredis-master ClusterIP 10.108.35.165 <none> 6379/TCP 14hredis-slave ClusterIP 10.99.96.166 <none> 6379/TCP 14h[[email protected] ~]# curl 10.108.7.220Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>[[email protected] ~]# 

提示:可以看到使用私有倉庫中的chart能夠正常執行為一個release,對應生成的svc也能正常訪問;

使用阿里云云效私有helm倉庫

1、進入:https://repomanage.rdc.aliyun.com/my/repo?spm=a2c4g.11186623.2.7.7b646b06Zv1cAd,登入阿里雲賬號,並註冊開通雲效服務,建立一個企業;

2、建立名稱空間

 

3、新增倉庫

版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1611234242.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云