kubernetes helm部署集羣環境實戰

本文用到的所有文件,公衆號“雲計算平臺技術”內回覆“helm實戰”即可獲取

鏡像準備

1:編寫一個簡單的spring boot程序並打包(demo.jar),指定運行端口爲8088
運行後即可通過瀏覽器訪問http://localhost:8088

2:製作鏡像:編寫Dockerfile文件

FROM hub.c.163.com/library/java:8-alpine

ADD target/*.jar demo.jar

EXPOSE 8088

ENTRYPOINT ["java", "-jar", "/demo.jar"]

3:打包鏡像

sudo docker build -t image_wpp .

4:運行鏡像

// -d指定後臺運行並將 8088端口映射到8089端口
sudo docker run -d -p 8089:8088 image_wpp

運行後即可通過瀏覽器訪問http://localhost:8089

5:構建雲鏡像

可以在本地搭建harbor鏡像倉庫非常方便,也可以使用開源鏡像倉庫。

此處使用的是阿里容器鏡像服務(網址)

// 構建雲倉庫,域名爲你在阿里雲設置的地址
sudo docker build -t registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp .
// 爲鏡像添加標籤
sudo docker push registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp:latest
// 登錄 密碼:Aaa081215.(供大家學習使用)
sudo docker login --username=a_17864308253 registry.cn-shanghai.aliyuncs.com
// 推送雲鏡像 
sudo docker push registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp:latest

此時已經構建完成

// 獲取鏡像
sudo docker pull registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp:latest

k8s基本知識準備

安裝

網上安裝文章雜亂無章,而且大部分教程需要國外的網絡環境。因此大部分初學者安裝k8s環境要浪費大量時間。
最近開發了一款引擎系統只需登錄網站,輸入要安裝的主機IP,用戶名密碼以及屬性等信息即可完成自動化集羣安裝。由於服務器性能與帶寬因素,不得不停止服務,後續如果開放服務將會在公衆號內通知,大家可以關注本公衆號獲取關注動態。

不過在這裏爲大家準備了即使不用翻牆也能安裝k8s的教程,大家可以點擊鏈接嘗試安裝。

全網最簡潔k8s安裝方式傳送門:

資源對象

由於k8s系統比較複雜,在這裏僅僅介紹helm安裝所用到的最小資源對象。
大家可以有個大致理解,想深入學習可以公衆號回覆"k8s學習"獲取系統性的學習資料,也可在"k8s專輯內進行學習"。

資源對象在Kubernetes架構所處的位置

在這裏插入圖片描述

資源對象

Pod

Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod代表集羣上正在運行的一個進程。
一個Pod封裝一個應用容器(也可以有多個容器),存儲資源、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。Pod代表部署的一個單位:Kubernetes中單個應用的實例,它可能由單個容器或多個容器共享組成的資源。

Replication Controller

Controller 可以創建和管理多個Pod,提供副本管理、滾動升級和集羣級別的自愈能力。例如,如果一個Node故障,Controller就能自動將該節點上的Pod調度到其他健康的Node上。

Deployment

Deployment爲Pod和Replica Set(升級版的 Replication Controller)提供聲明式更新。

你只需要在 Deployment 中描述您想要的目標狀態是什麼,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態改變到您的目標狀態。您可以定義一個全新的 Deployment 來創建 ReplicaSet 或者刪除已有的 Deployment 並創建一個新的來替換。

Service

    Service 是對一組提供相同功能的 Pods 的抽象,併爲它們提供一個統一的入口。藉助 Service,應用可以方便的實現服務發現與負載均衡,並實現應用的零宕機升級。Service 通過標籤來選取服務後端,一般配合 Replication Controller 或者 Deployment 來保證後端容器的正常運行。這些匹配標籤的 Pod IP 和端口列表組成 endpoints,由 kube-proxy 負責將服務 IP 負載均衡到這些 endpoints 上。

Service 有四種類型:

  1. ClusterIP:默認類型,自動分配一個僅 cluster 內部可以訪問的虛擬 IP
  2. NodePort:在 ClusterIP 基礎上爲 Service 在每臺機器上綁定一個端口,這樣就可以通過 NodeIP:NodePort 來訪問該服務。如果 kube-proxy 設置了 –nodeport-addresses=10.240.0.0/16(v1.10 支持),那麼僅該 NodePort 僅對設置在範圍內的 IP 有效。
  3. LoadBalancer:在 NodePort 的基礎上,藉助 cloud provider 創建一個外部的負載均衡器,並將請求轉發到 :NodePort
  4. ExternalName:將服務通過 DNS CNAME 記錄方式轉發到指定的域名(通過 spec.externlName 設定)。需要 kube-dns 版本在 1.7 以上。

Helm學習

helm 目錄結構

tree demochart

├── charts                       #  該目錄中放置當前Chart依賴的其它Chart

├── Chart.yaml                   #  用於描述Chart的基本信息,包括名稱版本等

├── templates                    #  部署文件模版目錄,模版使用的值來自values.yaml和由Tiller提供的值

│   ├── deployment.yaml         #   kubernetes Deployment object

│   ├── _helpers.tpl

│   ├── ingress.yaml

│   ├── NOTES.txt

│   └── service.yaml            #   kubernetes Serivce

└── values.yaml                  #  Chart的默認配置文件

helm 常用指令

添加倉庫

helm repo add [name] [url]
例如:helm repo add k2 http://lib.paastest.nebulogy.com/charts

查看所有倉庫

helm repo list
NAME    URL
stable  https://kubernetes-charts.storage.googleapis.com
local   http://127.0.0.1:8879/charts

更新倉庫,如果向倉庫中添加了chart 應用,必須更新 倉庫

helm repo update

創建chart 應用

#  創建一個 demochart 應用, 默認從docker官方倉庫 拉取nginx鏡像,可以查看 values.yaml文件

helm create demochart

安裝應用

cd demochart    # 切換到創建應用目錄

helm install --name mynginx ./

# 查看應用是否運行
kubectl get pod

NAME                                 READY     STATUS    RESTARTS   AGE
mynginx-demochart-6f6788f898-lfzlc   1/1       Running   0          2m
# 查看mynginx Pod 對應的 service 
kubectl get svc

NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes          ClusterIP   10.68.0.1      <none>        443/TCP   16h
mynginx-demochart   ClusterIP   10.68.66.195   <none>        80/TCP    2m

# 訪問mynginx 應用 (內部方法)
curl  10.68.66.195:80

打包應用

cd demochart

# 打包應用
helm package ./
Successfully packaged chart and saved it to: /root/appchart/demochart/demochart-0.1.0.tgz

應用升級

修改 chart.yaml 文件 ,將version版本從 0.1.0 ----》 0.2.0

cd demochart
vim Chart.yaml
    apiVersion: v1
    appVersion: "1.0"
    description: A Helm chart for Kubernetes
    name: demochart
    version: 0.2.0

# 打包應用
helm package ./

# 查詢demochart版本
helm search demochart -l
NAME            CHART VERSION   APP VERSION DESCRIPTION               
local/demochart 0.2.0           1.0         A Helm chart for Kubernetes
local/demochart 0.1.0           1.0         A Helm chart for Kubernetes

# 升級demochart 應用
helm upgrade demochart local/demochart

# 查看demochart 歷史版本
helm history demochart
REVISION    UPDATED                     STATUS      CHART           DESCRIPTION    

1           Wed Dec 12 19:08:39 2018    SUPERSEDED  demochart-0.1.0 Install complete
2           Wed Dec 12 19:12:48 2018    DEPLOYED    demochart-0.2.0 Upgrade complet

helm list
NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
demochart   2           Wed Dec 12 19:12:48 2018    DEPLOYED    demochart-0.2.0 1.0         default

應用回滾

helm rollback [ReleaseName] [version]

例如:
      helm rollback mynginx  1

上次我們的CHART 版本使用的是:0.2.0
helm list

NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
demochart   3           Wed Dec 12 19:20:45 2018    DEPLOYED    demochart-0.1.0 1.0         default 

應用刪除

helm delete --purge [releaseName]

例如:
    helm delete --purge mynginx

helm實戰

前提:確保能夠掌握kubernetes基本編排文件編寫。

準備:

# 查看是否 添加了倉庫地址
[root@k8s-master /]#  cat /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": { "max-size" :"100m","max-file":"3" },
    "registry-mirrors": ["https://pqbap4ya.mirror.aliyuncs.com","https://registry.docker-cn.com"]
}

創建一個chart應用:

[root@k8s-master /]# helm create wppchart
[root@k8s-master /]# cd wppchart
[root@k8s-master wppchart]# ls
charts  Chart.yaml  templates  values.yaml

修改 value.yaml

# Default values for wppchart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  # 修改處1:是不是很熟悉?這裏修改爲之前寫的java系統打包後的鏡像倉庫地址
  repository: registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp
  # 修改處2:鏡像標籤
  tag: latest
  pullPolicy: IfNotPresent

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

service:
  # 修改處3 service 訪問方式  採用NodePort的方式端口暴露(NodePort簡單)
  type: NodePort
  port: 80
  # 修改處4 集羣對外暴露的端口
  nodePort: 30001

ingress:
  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.local

resources: {}
  # 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: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

修改 deployment.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "wppchart.fullname" . }}
  labels:
{{ include "wppchart.labels" . | indent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "wppchart.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "wppchart.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              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 }}

修改 service.yaml


apiVersion: v1
kind: Service
metadata:
  name: {{ include "wppchart.fullname" . }}
  labels:
{{ include "wppchart.labels" . | indent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: 8080
      nodePort: {{ .Values.service.nodePort }}
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: {{ include "wppchart.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}

安裝應用

現在要進行安裝了,小白是不是很慌,怎麼確保寫的就是正確的
只需只需下面的指令檢測是否有問題

[root@k8s-master templates]# helm lint
==> Skipping .
No chart found for linting (missing Chart.yaml)

Error: 0 chart(s) linted, 1 chart(s) failed

檢測修改的chart yaml 文件是否正確

helm install --debug --dry-run --name wppchart ./

如果沒有什麼問題,則install安裝應用

helm install --name wppchart ./

查看應用是否啓動完成

# 查看集羣中的pod資源
[root@k8s-master wppchart]# kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
wpp-chart-wppchart-7dfdbffcb7-nqwhb   1/1     Running   0          20h

# 查看應用詳細信息
kubectl describe pod demo-chart-demoappchart-86765866bc-wd6zh

# 查看網絡狀態
[root@k8s-master wppchart]# kubectl get svc
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes           ClusterIP   10.96.0.1        <none>        443/TCP        25h
wpp-chart-wppchart   NodePort    10.110.236.113   <none>        80:30001/TCP   20h

PORT(S) [80:30001/TCP]代表已經將內部服務映射到集羣外部服務,此時,我們可以訪問任意一臺節點IP:30001端口號便可以查看集羣部署的java程序。

當然,你們是看不到這個結果的

在剛剛編寫編排文件時,細心的小夥伴肯會有疑惑:我們的docker鏡像暴露的端口號爲8088.而kubernetes編排文件中從未出現此端口號,因此,我們回頭檢查修改的編排文件,只需把deployment.yaml中的containerPort與service.yaml中的targetPort改爲8088重新執行"helm install --name wppchart ./"即可。修改多處是不是很麻煩?這時values.yaml的作用就發揮出來了,我們只需把這些變量定義在values.yaml即可。

發佈了56 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章