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
可以看到service
和deployment
均已创建完成:
接下来,需要设置主机域名。这里需要在本机的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和存储抽象,并没有涉及到很深的解释,只是从使用的角度上介绍如何去用这些内容,想要更深一步的理解还需进一步学习。