【云原生】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搭建和管理企业级网站应用
相关文章
|
3天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
18 2
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
146 17
|
2月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
255 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
2月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
93 3
|
3月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
221 9
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
391 0
|
2月前
|
Kubernetes Cloud Native Ubuntu
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第65天】本文将带你进入云原生的世界,通过一步步指导如何在本地环境中搭建Kubernetes集群,并部署一个简单的应用。我们将使用Minikube和Docker作为工具,探索云原生技术的魅力所在。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和实践技巧。
|
2月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
3月前
|
Kubernetes 监控 Cloud Native
Cluster Optimizer:一款云原生集群优化平台
**Cluster Optimizer** 是一款云原生集群优化平台,旨在通过自动化和智能化工具帮助企业降低云成本,解决云原生架构中的成本管理难题。面对资源闲置、配置不当和缺乏自动化优化机制等挑战,Cluster Optimizer能够深入分析云资源、应用和用户行为,精准识别优化机会,并给出具体建议,涵盖节点组、节点、GPU 节点、磁盘、持久卷和应用等多个维度。通过优化实例类型、自动扩缩容和资源分配,帮助企业降低成本、提升性能和效率。[点击此处](https://www.wiseinf.com.cn/docs/setup/) 免费安装和试用 **Cluster Optimizer 社区版**。
111 9
|
1天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。