【云原生】k8s核心技术—集群安全机制 & Ingress & Helm & 持久化存储-20230222(下)

简介: 【云原生】k8s核心技术—集群安全机制 & Ingress & Helm & 持久化存储-20230222(下)

三、Helm


1. 引入

K8S上的应用对象,都是由特定的资源描述组成,包括 deployment、service 等。都保存各自文件中或者集中写到一个配置文件。然后 kubectl apply –f 部署。如果应用只由一个或几个这样的服务组成,上面部署方式足够了。而对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心了。且由于缺少对发布过的应用版本管理和控制,使Kubernetes 上的应用维护和更新等面临诸多的挑战,主要面临以下问题:(1)如何将这些服务作为一个整体管理 (2)这些资源文件如何高效复用 (3)不支持应用级别的版本管理。

  • 之前方式部署应用基本过程
  1. 编写yaml文件
    1.1 deployment
    1.2 service
    1.3 ingress


缺陷:

  • 如果使用之前方式部署单一应用,少数服务的应用,比较合适
  • 比如部署微服务项目,可能有几十个服务,每个服务都有一套yaml文件,需要维护大量yaml文件,版本管理特别不方便


2. 使用功能Helm可以解决哪些问题

(1)使用helm可以把这些yaml作为一个整体管理

(2)实现yaml高效复用

(3)使用helm实现应用级别的版本管理


3. 介绍

Helm 是一个 Kubernetes 的包管理工具,就像 Linux 下的包管理器,如 yum / apt 等,可以很方便的将之前打包好的 yaml 文件部署到 kubernetes 上。


4. 3个重要概念

(1)helm:一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、打包、发布和管理。

(2)Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。(把yaml打包,是yaml的集合)

(3)Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release;将在 k8s 中创建出真实运行的资源对象。(基于chart 部署实体,应用级别的版本管理)


5. helm 版本变化

2019年11月13 日,Helm 团队发布 Helm v3 的第一个稳定版本。

本主要变化如下:

(1)V3版本删除Tiller

(2)Release 名称可以在不同命名空间重用

(3)支持将 Chart 推送至 Docker 镜像仓库中

f329e36cc8e84dd18c1a7defe3dc828b.png

6. helm安装及配置仓库

  1. helm安装
    第一步:下载helm安装压缩文件,上传到Linux系统中
    第二步:解压helm压缩文件,把解压后的linux-amd64/helm目录移动到/usr/bin/ 目录下

64d9949019334f0da47e9622beba3181.png

34ce23cde56744279c8ef4a3c3d31a76.png

2、配置helm仓库

微软仓库(http://mirror.azure.cn/kubernetes/charts)这个仓库推荐,基本上官网有的 chart 这里都有。

阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )

官方仓库(https://hub.kubeapps.com/charts/incubator)官方 chart 仓库,国内有点不好使。


(1)添加仓库

helm repo add 仓库名称 仓库地址

helm repo add stable http://mirror.azure.cn/kubernetes/charts

helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

43a9bffebc0b437aab0d1fb985435668.png

(2)更新仓库地址

helm repo update

c9978cce007449d0b1237deaa53c348a.png

(3)删除仓库

helm repo remove aliyun

a25edbab4ba048b283014dc303fcfcf8.png

7. 使用helm快速部署应用

第一步:使用命令搜索应用

helm search repo 名称 (weave)

bd23b40a6f0a446e850de989b28ddbe4.png

第二步:根据搜索内容选择安装

helm install 安装之后的名称 搜索之后的应用名称

a01f750a7509417c9316c1d89d6344f5.png

查看安装之后状态

helm listhelm status +安装之后名称

5fad574056ee4b74a1ebc9f405a78296.png

643bebe49ba2494c9f0906a526af6edf.png

从下图可以看到,目前ui-weave-scope并没有对外暴露端口,需要修改service类型为“NodePort”

e7d33fb17d2d4e79807d630391fa2407.png

** 修改service的yaml文件,type改为NodePort

kubectl get svc
kubectl edit svc + 名称


554a2104889849e7868f6212d4c275a2.png

再次查看,既可以看到对外暴露的端口号。

1992cb3b1eeb4fc1ac66fce2e39d84c4.png

8. 自己创建chart

  1. 使用命令创建Chart
    helm create chart名称

96bb6f6686014462a33f5b43078a084d.png

fd53d34519be4662a3b1e551f332c936.png

  • Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
  • values.yaml :用于存储 templates 目录中模板文件中用到变量的值(全局变量)。
  • Templates: 目录里面存放所有 yaml 模板文件。
  • charts:目录里存放这个 chart


  1. 在 templates 文件夹创建2个yaml文件
  • deployment.yaml
  • service.yaml
kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml
kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml

4c9ee4f2441c469bb0d02f5739414799.png

  1. 安装mychart
    安装前删除已存在的nginx:kubectl delete deployment pod名称
kubectl install web1 mychart
kubectl get svc

5aff6c34e6f64484b9cc576a2d5487d7.png

  1. 应用升级
    helm upgrade chart名称 目录
helm upgrade web1 mychart/

832504768d7945f1a2d5434fb6b08c18.png

9. 实现yaml高效复用

通过传递参数,动态渲染模板,yaml内容动态传入参数生成。

在chart里有一个values.yaml文件,定义yaml文件全局变量。


yaml 文件大体有几个地方不同

  • image
  • tag
  • label
  • port
  • replicas


1、在values.yaml定义变量和值

bacf2f14f4364feba4606b482bedfda5.png

2、在templates的yaml文件使用values.yaml定义变量的值

通过表达式形式使用全局变量:{{ .Values.变量名称}}{{ .Release.Name}}

5489ec2bfd9e48b69f25f87f3743f886.png


四、持久化存储


数据卷 emptydir,是本地存储,pod重启,数据不存在了,需要对数据持久化存储。

1.nfs—网络存储

pod 重启,数据仍然存在

  • 第一步:找一台服务器nfs服务端

(1)安装nfs

yum install -y nfs-utils

(2)设置挂载路径

vim /etc/exports

/data/nfs *(rw,no_root_squash)

0837a6a6331641f49183ab0df550ce72.png

检查:

执行如下命令,如果报错会有提示,修改/etc/exports文件即可。

exportfs -r     # 不报错即可


8499c132eb9f4aa589c97bb58db0097e.png

(3)挂载路径需要创建出来,这里的挂在路径为:/data/nfs

f2b8c2991fd144c694d9fb45fde02e94.png


  • 第二步:在k8s集群node节点安装nfs,所有节点都要装
    yum install -y nfs-utils
  • 第三步:在nfs服务器启动nfs服务
    systemctl start nfs
    ps -ef | grep nfs

1caebe5588be453d82c45e0702acd3ec.png

  • 第四步:在k8s集群部署应用使用nfs持久网络存储
    ①在pv目录下创建nfs-nginx.yaml文件,将下述代码复制进去:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dep1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
        - name: wwwroot
          nfs:
            server: 192.168.2.6  ## nfs服务器IP
            path: /data/nfs   ## nfs服务器挂在路径


②运行yaml文件

kubevtl apply -f nfs-nginx.yaml


③查看

kubectl get pods

331da6dcb5ea44f5bf037e35592104e7.png

④在nfs服务器中,目录/data/nfs/下创建index.yaml文件,编辑内容

1469aa78694c4b7b887aae6d6b06ac66.png

⑤进入master中创建的pod中,查看index.yaml文件存在,查看内容

kubectl exec -it [pod 名称] bash

96db7444462c416bbf983ee24af7d329.png

⑥暴露端口号

kubectl expose deployment nginx-dep1 --port=80 --target-port=80 --type=NodePort


⑦访问nginx显示编辑的内容

0f866d7d16d84df09da645ff8954e7f6.png

2. PV和PVC

  1. PV:持久化存储,对存储资源进行抽象,对外提供可以调用的地方(生产者)
  2. PVC:用于调用,不需要关心内部实现细节(消费者)
  3. 实现流程

c6aa9be91d9f452a9550184658608566.png

pv相当于物理主机,pvc相当于电脑中的C盘D盘等存储磁盘,必须依赖于主机存在,类似于pvc必须要绑定pv

4、步骤
①在pv目录下创建两个yaml文件,pv.yamlpvc.yaml,分别将下述内容复制到对应yaml文件中:

  1. pv.yaml内容:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs     ## nfs服务器中挂在路径
    server: 192.168.2.6   ## nfs服务器IP


pvc.yaml内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dep1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
      - name: wwwroot
        persistentVolumeClaim:
          claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi


②运行两个yaml文件

kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml


③查看

kubectl get pods
kubectl get pv,pvc


75fdb07c8f7b499780903f2492f6bf41.png


④进入任意一个创建的pod中,由于副本数为3,所以我们随便进一个,就会有和nfs服务器一样的index.html文件

kubectl exec -it nginx-dep1-58b7bf955f-7s8hp  bash

28660faaceeb40b1917b0e2edda86b01.png

718a2300b69c4997adc2a04c8199d1cc.png

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
503 44
|
3月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
343 1
|
3月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
269 89
|
3月前
|
Kubernetes Cloud Native 云计算
云计算与云原生技术探索
🌟蒋星熠Jaxonic,云原生探索者!以代码为舟,遨游技术星河。专注容器化、微服务、K8s与DevOps,践行GitOps理念,拥抱多云未来。用架构编织星辰,让创新照亮极客征途!
云计算与云原生技术探索
|
3月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
403 2
|
6月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
333 0
|
存储 运维 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)
|
运维 Kubernetes Cloud Native
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(3)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(3)
|
存储 弹性计算 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(2)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(2)
|
弹性计算 运维 Kubernetes
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(1)
  阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(1)

推荐镜像

更多