本文用到的所有文件,公衆號“雲計算平臺技術”內回覆“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 有四種類型:
- ClusterIP:默認類型,自動分配一個僅 cluster 內部可以訪問的虛擬 IP
- NodePort:在 ClusterIP 基礎上爲 Service 在每臺機器上綁定一個端口,這樣就可以通過 NodeIP:NodePort 來訪問該服務。如果 kube-proxy 設置了 –nodeport-addresses=10.240.0.0/16(v1.10 支持),那麼僅該 NodePort 僅對設置在範圍內的 IP 有效。
- LoadBalancer:在 NodePort 的基礎上,藉助 cloud provider 創建一個外部的負載均衡器,並將請求轉發到 :NodePort
- 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即可。