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

k8s实战-3

k8s实战-3

  • 一、Ingress
    • 1.安装
    • 2.测试
  • 二、存储抽象
    • 1.环境准备
    • 2.PV和PVC
    • 3.ConfigMap
    • 4.Secret
  • 总结


一、Ingress

Ingress 类似于一个“网关”,它负责将外部 HTTP 请求路由到集群内的服务。你可以把它想象成一个“交通警察”,根据请求的 URL 和路径,决定将请求发送到哪个服务。

Ingress 的主要功能

路由规则:定义 URL 路径到服务的映射关系。
负载均衡:将请求分发到集群内的多个服务实例。
TLS 终止:支持 TLS/SSL 加密,可以终止 TLS 连接并将明文请求转发到后端服务。
名称空间隔离:可以在不同的名称空间中定义 Ingress 规则,实现服务隔离。

在这里插入图片描述

1.安装

先从远程拉取yaml配置文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

然后,在apply该配置文件,即可安装ingress

kubectl apply -f deploy.yaml

然后使用下面命令查看ingress是否安装成功

 kubectl get pod,svc -n ingress-nginx

在这里插入图片描述
这下面是关于ingress的端口,未来所有的请求流量都是通过下面的端口进行访问的:

http://IP:31xxx
https://IP:30xxx

在这里插入图片描述

2.测试

测试案例:

创建两个Deployment副本均为2:hello-server、nginx-demo
创建两个Servce,为hello-server、nginx-demo,分别绑定对应的deployment

现在目的是:外部请求流量来到之后,通过请求hello.atguigu.com:31405把请求转接给hello-server进行处理,demo.atguigu.com:31405转接给nginx-demo进行处理。
在这里插入图片描述首先编写yaml配置文件:

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000

应用配置文件:

kubectl apply -f xx.yaml

可以看到servicedeployment均已创建完成:
在这里插入图片描述
接下来,需要设置主机域名。这里需要在本机的hosts文件中添加如下域名对应关系:

公网IP hello.atguigu.com
公网IP demo.atguigu.com

设置完域名对应关系后,可以在浏览器中进行访问:

http://hello.atguigu.com:ingress端口
https://demo.atguigu.com:ingress端口

二、存储抽象

k8s中,存储对象主要用于管理和调度持久存储资源。这些存储对象帮助你在集群中管理和访问持久数据。

在这里插入图片描述

在这里插入图片描述

1.环境准备

#所有机器安装
yum install -y nfs-utils

主节点:

#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
#创建对应文件夹
mkdir -p /nfs/data
#开机自动rpc绑定
systemctl enable rpcbind --now
#开机自启动nfs
systemctl enable nfs-server --now
#配置生效
exportfs -r

子节点:


#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data

mount -t nfs 主节点私网IP:/nfs/data /nfs/data

# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt

然后可以在其他节点查看并修改文件内容,实现每个结点的数据同步

原生方式数据挂载

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 172.31.0.4
            path: /nfs/data/nginx-pv

2.PV和PVC

在这里插入图片描述

PersistentVolume (PV)k8s 集群中的一个存储资源对象,它代表了一个持久化的存储空间,可以由集群中的 Pod 使用。

简单理解:

PV 类似于一块“硬盘”:这块硬盘可以被集群中的 Pod 使用。
PV 由集群管理员创建:可以是静态创建的存储资源,也可以是动态创建的存储资源。
PV 一旦创建,就会一直存在:除非被手动删除。

主要特点:

存储类型:PV 支持多种存储类型,如 NFS、iSCSI、AWS EBS、Azure Disk 等。
访问模式:PV 支持不同的访问模式,如 ReadWriteOnce(RWO)、ReadOnlyMany(ROX)、ReadWriteMany(RWX)等。
回收策略:PV 支持不同的回收策略,如 Retain(保留)、Recycle(循环利用)、Delete(删除)等。

案例:

首先,先创建一个PV池:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 172.31.0.4

这里的01-02-03目录要在nfs/data目录下创建好

然后,应用配置文件

kubectl apply -f pv.yaml

可以查看到PV池:
在这里插入图片描述

PersistentVolumeClaim (PVC) 是对存储资源的一个请求,用于声明所需的存储容量和访问模式。Pod 可以通过 PVC 来请求存储资源。

简单理解:

PVC 类似于一份“存储订单”:这份订单指定了所需存储的空间大小和访问模式。
PVC 会自动与符合条件的 PV 绑定:从而获得实际的存储空间。

主要特点:

存储请求:PVC 指定所需存储的容量和访问模式。
动态供应:如果集群中有 StorageClass 配置,PVC 可以触发动态供应流程来创建新的 PV。
绑定 PV:PVC 会自动与符合条件的 PV 绑定。

在上面创建的PV池的基础上,创建一个PVC:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

它会选在最接近的储存空间的PV,如下:
在这里插入图片描述
当然,一般情况下,我们会在创建pod的时候创建PVC并绑定,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc

3.ConfigMap

ConfigMap 是一种用于存储非机密配置信息的对象。ConfigMap 可以用来存储应用程序的配置数据,如环境变量、命令行参数等,从而使配置与部署代码分离,便于管理和更新。

ConfigMap 的作用

存储配置数据:ConfigMap 可以用来存储各种配置信息,如数据库连接字符串、环境变量等。
环境隔离:通过使用 ConfigMap,可以轻松地在不同的环境(如开发、测试、生产)之间共享相同的代码基础,同时使用不同的配置。
简化部署:ConfigMap 使得你可以独立于应用代码更新配置,无需重新部署整个应用。

ConfigMap 的使用场景

环境变量:将配置作为环境变量传递给容器。
命令行参数:将配置作为命令行参数传递给容器。
配置文件:将配置作为文件挂载到容器内。

在这里插入图片描述
这段配置文件就是上面图示的内容

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  #指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf

可以修改ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-redis-config
data:
  redis-config: |
    maxmemory 2mb
    maxmemory-policy allkeys-lru 

检查配置是否更新:

kubectl exec -it redis -- redis-cli

127.0.0.1:6379> CONFIG GET maxmemory
127.0.0.1:6379> CONFIG GET maxmemory-policy

配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。
原因:我们的Pod部署的中间件自己本身没有热更新能力

4.Secret

Secret 是一种用于存储敏感信息的对象,如密码、密钥、令牌等。Secret 旨在保护敏感数据,防止它们直接出现在 Pod 的配置或镜像中,从而提高安全性。

Secret的作用

存储敏感数据:Secret 可以用来存储密码、API 密钥、证书等敏感信息。
安全传输:Secret 数据在传输过程中会被加密,防止数据泄露。
环境隔离:可以为不同的环境(如开发、测试、生产)创建不同的 Secret。
生命周期管理:Secret 可以随着 Pod 的生命周期一起管理,当 Pod 不再需要时,可以安全地销毁 Secret。

Secret 的类型

Kubernetes 支持几种类型的 Secret

Opaque:用于存储不透明的二进制数据,如密码、证书等。
kubernetes.io/dockerconfigjson:用于存储 Docker 配置 JSON 文件,通常包含 Docker 登录凭证。
kubernetes.io/service-account-token:用于存储服务账户 Token。
kubernetes.io/tls:用于存储 TLS 证书和密钥。

创建secret:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: cGFzc3dvcmQ=
  password: cGFzc3dvcmQ=
kubectl apply -f secret.yaml

使用:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

总结

本篇主要介绍了k8s中的ingress和存储抽象,并没有涉及到很深的解释,只是从使用的角度上介绍如何去用这些内容,想要更深一步的理解还需进一步学习。


http://www.kler.cn/news/335630.html

相关文章:

  • 分布式数据库
  • [Linux]:线程(三)
  • 如何创建免费版本的ABP分离模块?
  • git(1) -- 环境配置
  • Web技术简史、前后端分离、游戏
  • EEPROM读写实验——FPGA学习笔记18
  • 【Conda】Conda命令详解:高效更新与环境管理指南
  • 安装jdk安装开发环境与maven
  • 【postman】本地接口文件
  • State of ChatGPT ---- ChatGPT的技术综述
  • 二叉树基本概念讲解
  • uniapp超全user-agent判断 包括微信开发工具 hbuilder mac windows 安卓ios端及本地识别
  • Task与 async 和await关键字使用和探讨
  • 【Unity】Luban学习笔记
  • 【Kubernetes】常见面试题汇总(四十九)
  • Tomcat监控与调优:比Tomcat Manager更加强大的Psi-Probe
  • AI学习记录 - L2正则化详细解释(权重衰减)
  • MySQL基础之函数
  • 【PCL】Ubuntu22.04 安装 PCL 库
  • 时序逻辑-延一拍/打一拍?