当前位置: 首页 > news >正文

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

文章目录

    • 一、k8s集群安全机制
      • 1. 概述
      • 2. RBAC——基于角色的访问控制
    • 二、Ingress
    • 三、Helm
      • 1. 引入
      • 2. 使用功能Helm可以解决哪些问题
      • 3. 介绍
      • 4. 3个重要概念
      • 5. helm 版本变化
      • 6. helm安装及配置仓库
      • 7. 使用helm快速部署应用
      • 8. 自己创建chart
      • 9. 实现yaml高效复用
    • 四、持久化存储
      • 1.nfs—网络存储
      • 2. PV和PVC

一、k8s集群安全机制

1. 概述

(1)访问k8s集群的时候,需要经过三个步骤完成具体操作
第一步:认证
第二步:鉴权(授权)
第三步:准入控制
(2)进行访问的时候,过程中都需要经过apiserver,apiserver做统一协调,比如门卫。
访问过程中需要证书、token、或者用户名+密码
如果访问pod,需要serverAccount。
在这里插入图片描述

  • 第一步 认证 传输安全
    *传输安全:对外不暴露8080端口,只能内部访问,对外部使用端口6443
    *认证

客户端身份认证常用方式:

  • https证书认证,基于ca证书
  • http token认证,通过token识别用户
  • http基本认证,用户名+密码认证

第二步 鉴权(授权)

  • 基于RBAC进行鉴权操作
  • 基于角色访问控制

第三步 准入控制

  • 就是准入控制器的列表,如果列表有请求内容,通过,没有则拒绝

2. RBAC——基于角色的访问控制

  • 角色
    role:特定命名空间访问权限
    ClusterRole:所有命名空间访问权限
  • 角色绑定
    rolebinding:角色绑定到主体
    ClusterRoleBinding:集群角色绑定到主体
  • 主体
    user:用户
    group:用户组
    serviceAccount:服务账号
    在这里插入图片描述

例子:
在这里插入图片描述

二、Ingress

  1. 把端口号对外暴露,通过IP+端口号进行访问
    使用Service里面的NodePort实现

  2. NodePort缺陷

  • 在每个节点上都会启动一个端口,在访问的时候通过任何节点,通过节点IP+暴露端口号实现访问
  • 意味着每个端口只能使用一次,一个端口对应一个应用
  • 实际访问中都是用域名,根据不同域名跳转到不同端口服务中
  1. Ingerss和Pod关系
  • pod和ingress通过service关联的
  • ingress作为统一入口,由service关联一组pod
    在这里插入图片描述
  1. ingress工作流程
    在这里插入图片描述
    ingress不是k8s内置的,需要部署。

  2. 使用ingress——以nginx为例
    第一步 部署ingress Controller
    第二步 创建ingress规则

  3. 使用ingress对外暴露应用
    (1)创建nginx应用,对外暴露端口使用NodePort
    (2)部署ingress controller,详细yaml文件内容参考这篇文章
    在这里插入图片描述
    在这里插入图片描述
    (3)创建ingress规则
    在这里插入图片描述
    在这里插入图片描述

(4)在Windows系统hosts文件中添加域名访问规则
在这里插入图片描述

没看懂没关系,详细操作以及yaml文件参考文章通过域名访问服务

三、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 镜像仓库中
在这里插入图片描述

6. helm安装及配置仓库

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

  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
在这里插入图片描述

(2)更新仓库地址
helm repo update
在这里插入图片描述

(3)删除仓库
helm repo remove aliyun
在这里插入图片描述

7. 使用helm快速部署应用

第一步:使用命令搜索应用
helm search repo 名称 (weave)
在这里插入图片描述
第二步:根据搜索内容选择安装
helm install 安装之后的名称 搜索之后的应用名称
在这里插入图片描述

  • 查看安装之后状态
    helm listhelm status +安装之后名称
    在这里插入图片描述
    在这里插入图片描述
    从下图可以看到,目前ui-weave-scope并没有对外暴露端口,需要修改service类型为“NodePort”
    在这里插入图片描述

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

kubectl get svc
kubectl edit svc + 名称

在这里插入图片描述
再次查看,既可以看到对外暴露的端口号。
在这里插入图片描述

8. 自己创建chart

  1. 使用命令创建Chart
    helm create chart名称
    在这里插入图片描述
    在这里插入图片描述
  • 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.yamlkubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

9. 实现yaml高效复用

通过传递参数,动态渲染模板,yaml内容动态传入参数生成。
在chart里有一个values.yaml文件,定义yaml文件全局变量。

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

  • image
  • tag
  • label
  • port
  • replicas
  1. 在values.yaml定义变量和值
    在这里插入图片描述

  2. 在templates的yaml文件使用values.yaml定义变量的值
    通过表达式形式使用全局变量:{{ .Values.变量名称}}{{ .Release.Name}}
    在这里插入图片描述

四、持久化存储

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

1.nfs—网络存储

pod 重启,数据仍然存在

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

(1)安装nfs
yum install -y nfs-utils
(2)设置挂载路径
vim /etc/exports

/data/nfs *(rw,no_root_squash)

在这里插入图片描述
检查:
执行如下命令,如果报错会有提示,修改/etc/exports文件即可。

exportfs -r     # 不报错即可

在这里插入图片描述

(3)挂载路径需要创建出来,这里的挂在路径为:/data/nfs
在这里插入图片描述

  • 第二步:在k8s集群node节点安装nfs,所有节点都要装
    yum install -y nfs-utils

  • 第三步:在nfs服务器启动nfs服务
    systemctl start nfs
    ps -ef | grep nfs
    在这里插入图片描述

  • 第四步:在k8s集群部署应用使用nfs持久网络存储
    ①在pv目录下创建nfs-nginx.yaml文件,将下述代码复制进去:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-dep1
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwrootmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:- name: wwwrootnfs:server: 192.168.2.6  ## nfs服务器IPpath: /data/nfs   ## nfs服务器挂在路径

②运行yaml文件

kubevtl apply -f nfs-nginx.yaml

③查看

kubectl get pods

在这里插入图片描述
④在nfs服务器中,目录/data/nfs/下创建index.yaml文件,编辑内容
在这里插入图片描述
⑤进入master中创建的pod中,查看index.yaml文件存在,查看内容

kubectl exec -it [pod 名称] bash

在这里插入图片描述
⑥暴露端口号

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

⑦访问nginx显示编辑的内容
在这里插入图片描述

2. PV和PVC

  1. PV:持久化存储,对存储资源进行抽象,对外提供可以调用的地方(生产者)

  2. PVC:用于调用,不需要关心内部实现细节(消费者)

  3. 实现流程
    在这里插入图片描述
    pv相当于物理主机,pvc相当于电脑中的C盘D盘等存储磁盘,必须依赖于主机存在,类似于pvc必须要绑定pv

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

apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 5GiaccessModes:- ReadWriteManynfs:path: /data/nfs     ## nfs服务器中挂在路径server: 192.168.2.6   ## nfs服务器IP

pvc.yaml内容:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-dep1
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwrootmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:- name: wwwrootpersistentVolumeClaim:claimName: my-pvc---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 5Gi

②运行两个yaml文件

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

③查看

kubectl get pods
kubectl get pv,pvc

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

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

在这里插入图片描述
在这里插入图片描述

相关文章:

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

文章目录一、k8s集群安全机制1. 概述2. RBAC——基于角色的访问控制二、Ingress三、Helm1. 引入2. 使用功能Helm可以解决哪些问题3. 介绍4. 3个重要概念5. helm 版本变化6. helm安装及配置仓库7. 使用helm快速部署应用8. 自己创建chart9. 实现yaml高效复用四、持久化存储1.nfs—…...

【Linux】实现简易的Shell命令行解释器

大家好我是沐曦希💕 文章目录一、前言二、准备工作1.输出提示符2.输入和获取命令3.shell运行原理4.内建命令5.替换三、整体代码一、前言 前面学到了进程创建,进程终止,进程等待,进程替换,那么通过这些来制作一个简易的…...

再获认可!腾讯安全NDR获Forrester权威推荐

近日,国际权威研究机构Forrester发布最新研究报告《The Network Analysis And Visibility Landscape, Q1 2023》(以下简称“NAV报告”),从网络分析和可视化(NAV)厂商规模、产品功能、市场占有率及重点案例等…...

代码审计之旅之百家CMS

前言 之前审计的CMS大多是利用工具,即Seay昆仑镜联动扫描出漏洞点,而后进行审计。感觉自己的能力仍与零无异,因此本次审计CMS绝大多数使用手动探测,即通过搜索危险函数的方式进行漏洞寻找,以此来提升审计能力&#xf…...

ONLYOFFICE中利用chatGPT帮助我们策划一场生日派对

近日,人工智能chatGPT聊天机器人爆火,在去年年底发布后,仅仅两个月就吸引了全球近一亿的用户,成为史上最快的应用消费程序,chatGPT拥有强大的学习和交互能力 可以被学生,教师,上班族各种职业运…...

Java面试题-线程(一)

在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 Runnable 接口),…...

一篇普通的bug日志——bug的尽头是next吗?

文章目录[bug 1] TypeError: method object is not subscriptable[bug 2] TypeError: unsupported format string passed to numpy.ndarray.__format__[bug 3] ValueError:Hint: Expected dtype() paddle::experimental::CppTypeToDataType<T>::Type()[bug 4] CondaSSLE…...

Vue 3 第八章:Watch侦听器

文章目录Watch侦听器1. 基础概念1.1. Watch的基本用法例子1&#xff1a;监听单个ref的值&#xff0c;直接监听例子2&#xff1a;监听多个ref的值&#xff0c;采用数组形式例子3&#xff1a;深度监听例子4&#xff1a;监听reactive响应式对象单一属性&#xff0c;采用回调函数的…...

GlassFish的安装与使用

一、产品下载与安装glassfish下载地址&#xff1a;https://download.oracle.com/glassfish/5.0.1/release/index.html下载后解压即完成安装&#xff0c;主要目录说明&#xff1a;bin目录&#xff1a;为asadmin命令所在目录。glassfish为主目录&#xff1a;glassfish\bin目录为命…...

【java】Java 重写(Override)与重载(Overload)

文章目录重写(Override)方法的重写规则Super 关键字的使用重载(Overload)重载规则实例重写与重载之间的区别总结重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于…...

OpenCV-PyQT项目实战(12)项目案例08:多线程视频播放

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …...

面向对象设计模式:结构型模式之装饰器模式

文章目录一、引入二、装饰器模式2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 优缺点2.5 应用实例&#xff1a;Java IO 类2.6 应用实例&#xff1a;咖啡馆订购系统一、引入 咖啡馆订购系统 Initial 初始 4 种咖啡 House blend (混合咖啡)Dark Roast (深度烘培)Decaf (…...

Unity iOS 无服务器做一个排行榜 GameCenter

排行榜需求解决方案一(嗯目前只有一)UnityEngine.SocialPlatformsiOS GameCenterAppStoreConnect配置Unity 调用(如果使用GameCenter系统的面板&#xff0c;看到这里就可以了&#xff09;坑(需要获取数据做自定义面板的看这里)iOS代码Unity 代码吐槽需求 需求&#xff1a;接入…...

现在招个会自动化测试的人是真难呀~你会个锤子的自动化测试

现在招个会自动化测试的人是真难呀~ 前一段时间公司计划要招2个自动化测试到岗&#xff0c;同事面试了十几个来应聘的人&#xff0c;发现一个很奇怪的现象&#xff0c;在面试的时候&#xff0c;如果问的是框架API、脚本编写这些问题&#xff0c;基本上所有人都能对答如流&…...

OracleDatabase——数据库表空间dmp导出与导入

由于公司的程序一直部署在客户现场内网&#xff0c;内网调试难度高&#xff0c;一般是有备份还原数据库的需求&#xff0c;这里简记备份&#xff08;导出&#xff09;数据库dmp文件与恢复&#xff08;导入&#xff09;的步骤。 一、导出dmp文件 exp与expdp命令异同 相同点&a…...

20张图带你彻底了解ReentrantLock加锁解锁的原理

哈喽大家好&#xff0c;我是阿Q。 最近是上班忙项目&#xff0c;下班带娃&#xff0c;忙的不可开交&#xff0c;连摸鱼的时间都没有了。今天趁假期用图解的方式从源码角度给大家说一下ReentrantLock加锁解锁的全过程。系好安全带&#xff0c;发车了。 简单使用 在聊它的源码…...

Dockerfile构建Springboot镜像

Dockerfile构建Springboot镜像 文章目录 Dockerfile构建Springboot镜像 简介实例演示 前期准备 Docker环境Springboot项目Dockerfile文件 Windows 要求构建镜像启动测试 Linux 要求构建镜像启动测试 简介 容器技术大流行的时代&#xff0c;也是docker大流行的时代。 此文…...

从深分页查询到覆盖索引

最近看到一道面试题&#xff0c;如何优化深分页查询 最简单的例子是 select * from web_bill_main limit 30000,10;分页达到30000行&#xff0c;需要把前面29999行都过滤掉&#xff0c;才能找到这10条数据 所以整体时间花了80ms(工具显示时间) 我当时的第一反应是&#xff0…...

Go语言学习的第三天--下部分(Gin框架的基础了解)

每天都会分享Go的知识&#xff0c;喜欢的朋友关注一下。每天的学习分成两部分基础&#xff08;必要的&#xff0c;基础不牢地动山摇&#xff09;&#xff0c;另一部分是Go的一些框架知识&#xff08;会不定时发布&#xff0c;因为小Wei也是一名搬砖人&#xff09;。但是可以保证…...

JDK的动态代理(powernode 文档)(内含源代码)

JDK的动态代理&#xff08;powernode 文档&#xff09;&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87546086 一、动态代理 目录JDK的动态代理&#xff08;powernode 文档&#xff09;&#xff0…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

「Java基本语法」变量的使用

变量定义 变量是程序中存储数据的容器&#xff0c;用于保存可变的数据值。在Java中&#xff0c;变量必须先声明后使用&#xff0c;声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例&#xff1a;声明与初始化 public class VariableDemo {publi…...