kubernetes helm部署集群环境实战

本文用到的所有文件,公众号“云计算平台技术”内回复“helm实战”即可获取
镜像准备
1:编写一个简单的 boot程序并打包(demo.jar),指定运行端口为8088
运行后即可通过浏览器访问:8088
2:制作镜像:编写文件
FROM hub.c.163.com/library/java:8-alpineADD target/*.jar demo.jarEXPOSE 8088ENTRYPOINT ["java", "-jar", "/demo.jar"]
3:打包镜像
sudo docker build -t image_wpp .
4:运行镜像
// -d指定后台运行并将 8088端口映射到8089端口sudo docker run -d -p 8089:8088 image_wpp
运行后即可通过浏览器访问:8089
5:构建云镜像
可以在本地搭建镜像仓库非常方便,也可以使用开源镜像仓库 。
此处使用的是阿里容器镜像服务(网址)
// 构建云仓库,域名为你在阿里云设置的地址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 helm部署集群环境实战

文章插图
资源对象 Pod
Pod是创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程 。
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项 。Pod代表部署的一个单位:中单个应用的实例,它可能由单个容器或多个容器共享组成的资源 。
可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力 。例如,如果一个Node故障,就能自动将该节点上的Pod调度到其他健康的Node上 。
为Pod和 Set(升级版的)提供声明式更新 。
你只需要在中描述您想要的目标状态是什么,就会帮您将 Pod 和 的实际状态改变到您的目标状态 。您可以定义一个全新的来创建或者删除已有的并创建一个新的来替换 。
Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口 。借助 Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级 。Service 通过标签来选取服务后端,一般配合 Replication Controller 或者 Deployment 来保证后端容器的正常运行 。这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上 。
有四种类型:
:默认类型,自动分配一个仅内部可以访问的虚拟 :在基础上为在每台机器上绑定一个端口,这样就可以通过 : 来访问该服务 。如果 kube-proxy 设置了 –-=10.240.0.0/16(v1.10 支持),那么仅该仅对设置在范围内的 IP 有效 。:在的基础上,借助 cloud创建一个外部的负载均衡器,并将请求转发到 ::将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec. 设定) 。需要 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 listNAMEURLstablehttps://kubernetes-charts.storage.googleapis.comlocalhttp://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 podNAMEREADYSTATUSRESTARTSAGEmynginx-demochart-6f6788f898-lfzlc1/1Running02m# 查看mynginx Pod 对应的 service kubectl get svcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP10.68.0.1443/TCP16hmynginx-demochartClusterIP10.68.66.19580/TCP2m# 访问mynginx 应用 (内部方法)curl10.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.0cd demochartvim Chart.yamlapiVersion: v1appVersion: "1.0"description: A Helm chart for Kubernetesname: demochartversion: 0.2.0# 打包应用helm package ./# 查询demochart版本helm search demochart -lNAMECHART VERSIONAPP VERSION DESCRIPTIONlocal/demochart 0.2.01.0A Helm chart for Kuberneteslocal/demochart 0.1.01.0A Helm chart for Kubernetes# 升级demochart 应用helm upgrade demochart local/demochart# 查看demochart 历史版本helm history demochartREVISIONUPDATEDSTATUSCHARTDESCRIPTION1Wed Dec 12 19:08:39 2018SUPERSEDEDdemochart-0.1.0 Install complete2Wed Dec 12 19:12:48 2018DEPLOYEDdemochart-0.2.0 Upgrade complethelm listNAMEREVISIONUPDATEDSTATUSCHARTAPP VERSION NAMESPACEdemochart2Wed Dec 12 19:12:48 2018DEPLOYEDdemochart-0.2.0 1.0default
kubernetes helm部署集群环境实战

文章插图
应用回滚
helm rollback [ReleaseName] [version]例如:helm rollback mynginx1上次我们的CHART 版本使用的是:0.2.0helm listNAMEREVISIONUPDATEDSTATUSCHARTAPP VERSION NAMESPACEdemochart3Wed Dec 12 19:20:45 2018DEPLOYEDdemochart-0.1.0 1.0default
应用删除
helm delete --purge [releaseName]例如:helm delete --purge mynginx
helm实战
前提:确保能够掌握基本编排文件编写 。
准备:
# 查看是否 添加了仓库地址[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]# lschartsChart.yamltemplatesvalues.yaml
修改 value.yaml
# Default values for wppchart.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 1image:# 修改处1:是不是很熟悉?这里修改为之前写的java系统打包后的镜像仓库地址repository: registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp# 修改处2:镜像标签tag: latestpullPolicy: IfNotPresentimagePullSecrets: []nameOverride: ""fullnameOverride: ""service:# 修改处3 service 访问方式采用NodePort的方式端口暴露(NodePort简单)type: NodePortport: 80# 修改处4 集群对外暴露的端口nodePort: 30001ingress:enabled: falseannotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true"hosts:- host: chart-example.localpaths: []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: 128MinodeSelector: {}tolerations: []affinity: {}
修改 .yaml 文件
apiVersion: apps/v1kind: Deploymentmetadata: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: httpcontainerPort: 8080protocol: TCPlivenessProbe:httpGet:path: /port: httpreadinessProbe:httpGet:path: /port: httpresources:{{- 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 }}
修改 .yaml
apiVersion: v1kind: Servicemetadata:name: {{ include "wppchart.fullname" . }}labels:{{ include "wppchart.labels" . | indent 4 }}spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: 8080nodePort: {{ .Values.service.nodePort }}protocol: TCPname: httpselector: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 ./
如果没有什么问题,则安装应用
helm install --name wppchart ./
查看应用是否启动完成
# 查看集群中的pod资源[root@k8s-master wppchart]# kubectl get podNAMEREADYSTATUSRESTARTSAGEwpp-chart-wppchart-7dfdbffcb7-nqwhb1/1Running020h# 查看应用详细信息kubectl describe pod demo-chart-demoappchart-86765866bc-wd6zh# 查看网络状态[root@k8s-master wppchart]# kubectl get svcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEkubernetesClusterIP10.96.0.1443/TCP25hwpp-chart-wppchartNodePort10.110.236.11380:30001/TCP20h
PORT(S) [80:30001/TCP]代表已经将内部服务映射到集群外部服务,此时,我们可以访问任意一台节点IP:30001端口号便可以查看集群部署的java程序 。
当然,你们是看不到这个结果的
【kubernetes helm部署集群环境实战】在刚刚编写编排文件时,细心的小伙伴肯会有疑惑:我们的镜像暴露的端口号为8088.而编排文件中从未出现此端口号,因此,我们回头检查修改的编排文件,只需把.yaml中的与.yaml中的改为8088重新执行"helm--name./"即可 。修改多处是不是很麻烦?这时.yaml的作用就发挥出来了,我们只需把这些变量定义在.yaml即可 。