首页 >> 大全

kubernetes helm部署集群环境实战

2023-12-14 大全 38 作者:考证青年

本文用到的所有文件,公众号“云计算平台技术”内回复“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专辑内进行学习"。

资源对象在架构所处的位置

集群部署模式__集群部署需要哪些技术

资源对象 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 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 podNAME                                 READY     STATUS    RESTARTS   AGE
mynginx-demochart-6f6788f898-lfzlc   1/1       Running   0          2m
# 查看mynginx Pod 对应的 service 
kubectl get svcNAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes          ClusterIP   10.68.0.1              443/TCP   16h
mynginx-demochart   ClusterIP   10.68.66.195           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.0cd demochart
vim Chart.yamlapiVersion: v1appVersion: "1.0"description: A Helm chart for Kubernetesname: demochartversion: 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 complethelm 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 listNAME        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实战

前提:确保能够掌握基本编排文件编写。

准备:

# 查看是否 添加了仓库地址
[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: 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/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: 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: 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: 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 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                443/TCP        25h
wpp-chart-wppchart   NodePort    10.110.236.113           80:30001/TCP   20h

PORT(S) [80:30001/TCP]代表已经将内部服务映射到集群外部服务,此时,我们可以访问任意一台节点IP:30001端口号便可以查看集群部署的java程序。

当然,你们是看不到这个结果的

在刚刚编写编排文件时,细心的小伙伴肯会有疑惑:我们的镜像暴露的端口号为8088.而编排文件中从未出现此端口号,因此,我们回头检查修改的编排文件,只需把.yaml中的与.yaml中的改为8088重新执行"helm --name ./"即可。修改多处是不是很麻烦?这时.yaml的作用就发挥出来了,我们只需把这些变量定义在.yaml即可。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了