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

本文介绍了Kubernetes集群的安全机制,重点讨论了RBAC授权模型,解释了Ingress如何解决服务对外暴露的问题。此外,还详细阐述了Helm在K8s应用部署中的作用,包括其功能、重要概念以及如何实现yaml复用。最后,探讨了两种持久化存储方法:NFS网络存储和PV/PVC机制,确保数据在pod重启后仍然存在。
摘要由CSDN通过智能技术生成

一、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.yaml

kubectl 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 mychart

kubectl 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: 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

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

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

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小bā吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值