【云原生】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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7天前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
1月前
|
消息中间件 存储 Cloud Native
云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
2024 年 12 月 24 日,由中国信息通信研究院(以下简称“中国信通院”)主办的“2025 中国信通院深度观察报告会:算力互联网分论坛”,在北京隆重召开。本次论坛以“算力互联网 新质生产力”为主题,全面展示中国信通院在算力互联网产业领域的研究、实践与业界共识,与产业先行者共同探索算力互联网产业未来发展的方向。会议公布了“2024 年度云原生与应用现代化标杆案例”评选结果,“云消息队列 Kafka 版 V3 系列”荣获“云原生技术创新标杆案例”。
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
2月前
|
运维 Cloud Native Serverless
Serverless Argo Workflows大规模计算工作流平台荣获信通院“云原生技术创新标杆案例”
2024年12月24日,阿里云Serverless Argo Workflows大规模计算工作流平台荣获由中国信息通信研究院颁发的「云原生技术创新案例」奖。
|
2月前
|
人工智能 Cloud Native 大数据
DataWorks深度技术解读:构建开放的云原生数据开发平台
Dateworks是一款阿里云推出的云原生数据处理产品,旨在解决数据治理和数仓管理中的挑战。它强调数据的准确性与一致性,确保商业决策的有效性。然而,严格的治理模式限制了开发者的灵活性,尤其是在面对多模态数据和AI应用时。为应对这些挑战,Dateworks进行了重大革新,包括云原生化、开放性增强及面向开发者的改进。通过Kubernetes作为资源底座,Dateworks实现了更灵活的任务调度和容器化支持,连接更多云产品,并提供开源Flowspec和Open API,提升用户体验。
|
2月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
148 12
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
87 2
|
2月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
2月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
72 0

热门文章

最新文章