【云原生 | 从零开始学Kubernetes】二十一、kubernetes持久化存储

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
.cn 域名,1个 12个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 持久化存储

持久化存储


上篇文章补充


Service 服务发现:coredns 组件详解


DNS 是什么?


CoreDNS?


Kubernetes持久化存储


快速了解


k8s 持久化存储详解


在 k8s 中为什么要做持久化存储?


k8s 持久化存储:emptyDir


上篇文章补充


Service 服务发现:coredns 组件详解


DNS 是什么?


DNS 全称是 Domain Name System(域名系统),是整个互联网的电话簿,它能够将可被人理解的域名翻译成可被机器理解 IP 地址,使得互联网的使用者不再需要直接接触很难阅读和理解的 IP 地址。域名系统在现在的互联网中非常重要,因为服务器的 IP 地址可能会经常变动,如果没有了 DNS,那么可能 IP 地址一旦发生了更改,当前服务器的客户端就没有办法连接到目标的服务器了,如果我们为 IP 地址提供一个『别名』并在其发生变动时修改别名和 IP 地址的关系,那么我们就可以保证集群对外提供的服务能够相对稳定地被其他客户端访问。DNS 其实就是一个分布式的树状命名系统,它就像一个去中心化的分布式数据库,存储着从域名到 IP 地址的映射。


CoreDNS?


CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师都会使用 CoreDNS 为集群提供服务发现的功能,Kubernetes 就在集群中使用 CoreDNS 解决服务发现的问题。 作为一个加入 CNCF(Cloud Native Computing Foundation)的服务, CoreDNS 的实现非常简单。


验证 coredns 
#把 dig.tar.gz 上传到 xianchaonode2 和 xianchaonode1 机器上,手动解压: 
[root@k8snode2 ~]# docker load -i dig.tar.gz 
[root@k8snode1 ~]# docker load -i dig.tar.gz 
[root@xianchaomaster1 ~]# vim dig.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dig
  namespace: default
spec:
  containers:
  - name: dig
    image: xianchao/dig:latest
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
#更新资源清单文件 
[root@k8smaster node]# kubectl apply -f dig.yaml 
pod/dig created
#查看默认名称空间的 kubernetes 服务 
[root@k8smaster node]# kubectl get svc | grep kubernetes 
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        16d
#解析 dns,如有以下返回说明 dns 安装成功 
[root@k8smaster node]# kubectl exec -it dig -- nslookup kubernetes 
Server:   10.96.0.10
Address:  10.96.0.10#53
Name: kubernetes.default.svc.cluster.local
Address: 10.96.0.1
kubernetes.default.svc.cluster.local 
服务名.名称空间.默认后缀 不屑也会搜索到,因为默认/etc/resolv里面dns服务中会搜索default svc cluster.local这些后缀
在 k8s 中创建 service 之后,service 默认的 FQDN 是<service name>.<namespace>.svc.cluster.local,那么 k8s 集群内部的服务就可以通过 FQDN 访问


Kubernetes持久化存储


快速了解


之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对数据持久化存储


对于数据持久化存储【pod重启,数据还存在】,有两种方式


·nfs:网络存储【通过一台服务器来存储】


k8s 持久化存储详解


在 k8s 中为什么要做持久化存储?


在 k8s 中部署的应用都是以 pod 容器的形式运行的,假如我们部署 MySQL、Redis 等数据库,需要对这些数据库产生的数据做备份。因为 Pod 是有生命周期的,如果 pod 不挂载数据卷,那 pod 被删除或 重启后这些数据会随之消失,如果想要长久的保留这些数据就要用到 pod 数据持久化存储。


k8s 持久化存储:emptyDir


#查看 k8s 支持哪些存储 
[root@k8smaster node]# kubectl explain pods.spec.volumes 
KIND:     Pod
VERSION:  v1
RESOURCE: volumes <[]Object>
DESCRIPTION:
     List of volumes that can be mounted by containers belonging to the pod.
     More info: https://kubernetes.io/docs/concepts/storage/volumes
     Volume represents a named volume in a pod that may be accessed by any
     container in the pod.
FIELDS: 
 awsElasticBlockStore <Object> 
 azureDisk <Object> 
 azureFile <Object> 
 cephfs <Object> 
 cinder <Object> 
 configMap <Object> 
 csi <Object> 
 downwardAPI <Object> 
 emptyDir <Object> 
 ephemeral <Object> 
 fc <Object> 
 flexVolume <Object> 
 flocker <Object> 
 gcePersistentDisk <Object> 
 gitRepo <Object> 
 glusterfs <Object> 
 hostPath <Object> 
 iscsi <Object> 
 name <string> -required- 
 nfs <Object> 
 persistentVolumeClaim <Object> 
 photonPersistentDisk <Object> 
 portworxVolume <Object> 
 projected <Object> 
 quobyte <Object> 
 rbd <Object> 
 scaleIO <Object> 
 secret <Object> 
 storageos <Object> 
 vsphereVolume <Object>
常用的如下: 
emptyDir 
hostPath 
nfs 
persistentVolumeClaim 
glusterfs 
cephfs 
configMap 
secret 
我们想要使用存储卷,需要经历如下步骤 
1、定义 pod 的 volume,这个 volume 指明它要关联到哪个存储上的 
2、在容器中要使用 volumemounts 挂载对应的存储 
经过以上两步才能正确的使用存储卷 
emptyDir 类型的 Volume 是在 Pod 分配到 Node 上时被创建,Kubernetes 会在 Node 上自动分配一个目录,因此无需指定宿主机 Node 上对应的目录文件。这个目录的初始内容为空,当 Pod 从 Node 上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。 
#创建一个 pod,挂载临时目录 emptyDir 
Emptydir 的官方网址: https://kubernetes.io/docs/concepts/storage/volumes#emptydir 
[root@k8smaster ~]# mkdir cjh
[root@k8smaster ~]# cd cjh
[root@k8smaster cjh]# vim emptydir.yaml 
apiVersion: v1
kind: Pod 
metadata: 
  name: pod-empty
spec: 
  containers:
  - name: container-empty
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts: 
    - mountPath: /cache     #把cache-volume这个挂载到容器里的根cache目录下
      name: cache-volume
  volumes:
  - emptyDir:
     {}
    name: cache-volume
#- emptyDir: {} 也可以这么写 表示是临时的
#更新资源清单文件 
[root@k8smaster cjh]# kubectl apply -f emptydir.yaml 
pod/pod-empty created 
查看本机临时目录存在的位置
#查看 pod 调度到哪个节点 
[root@k8smaster cjh]# kubectl get pods -o wide | grep empty 
pod-empty               1/1     Running   0          1s    10.244.2.7   k8snode    <none>           <none>
#查看 pod 的 uid 
[root@k8smaster cjh]# kubectl get pods pod-empty -o yaml | grep uid     #pod以yaml文件格式输出找到uid
  uid: c2b30d56-73b2-4d8d-9011-c39abd51b065
#登录到 xianchaonode1 上 
[root@k8snode ~]# tree /var/lib/kubelet/pods/c2b30d56-73b2-4d8d-9011-c39abd51b065
/var/lib/kubelet/pods/c2b30d56-73b2-4d8d-9011-c39abd51b065
├── containers
│   └── container-empty
│       └── 20e34c53
├── etc-hosts
├── plugins
│   └── kubernetes.io~empty-dir
│       ├── cache-volume
│       │   └── ready
│       └── wrapped_default-token-788ff
│           └── ready
└── volumes
    ├── kubernetes.io~empty-dir
    │   └── cache-volume
    └── kubernetes.io~secret
        └── default-token-788ff
            ├── ca.crt -> ..data/ca.crt
            ├── namespace -> ..data/namespace
            └── token -> ..data/token
11 directories, 7 files
由上可知,临时目录在本地的
/var/lib/kubelet/pods/c2b30d56-73b2-4d8d-9011-c39abd51b065/volumes/kubernetes.io~empty-dir/cache-volume/
#测试
[root@k8smaster cjh]# kubectl exec -it pod-empty -- /bin/sh
# cd cache  
# ls
[root@k8snode cache-volume]# echo "wowowowowow" > test.txt
# ls
test.txt
[root@k8smaster cjh]# kubectl delete pods pod-empty
pod "pod-empty" deleted


持久化存储还有三种,我们下篇文章再细细讲解!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes 安全 Serverless
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
33 5
|
5天前
|
Kubernetes Cloud Native 安全
Kubernetes云原生问题之GKE Autopilot 与现有 Kubernetes 生态的兼容度如何解决
Kubernetes云原生问题之GKE Autopilot 与现有 Kubernetes 生态的兼容度如何解决
23 4
|
12天前
|
Kubernetes 监控 Cloud Native
eBPF技术大揭秘:一张全景图彻底改变Kubernetes问题排查,助你成为云原生时代的超级英雄!
【8月更文挑战第8天】在云原生时代,Kubernetes作为容器编排的标准,其问题排查变得日益复杂。eBPF技术无需改动内核即可编写高效、安全的内核程序,实现系统细粒度观测与控制。近期发布的基于eBPF的Kubernetes问题排查全景图,展示了如何利用eBPF监控资源使用、网络性能及调度策略等,例如通过eBPF程序监控CPU使用率。此全景图有助于快速定位如高CPU使用率等问题所在Pod,进而优化配置或调整调度。
38 8
|
5天前
|
Kubernetes Cloud Native API
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
20 1
|
5天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生问题之GKE Autopilot 进行扩容和缩容如何解决
Kubernetes云原生问题之GKE Autopilot 进行扩容和缩容如何解决
25 0
|
5天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生问题之在托管Kubernetes服务中云服务商和用户的运维责任划分如何解决
Kubernetes云原生问题之在托管Kubernetes服务中云服务商和用户的运维责任划分如何解决
20 0
|
6天前
|
存储 Kubernetes 调度
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)
19 0
|
6天前
|
存储 Kubernetes API
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)
13 0
|
23小时前
|
Kubernetes 网络安全 Docker
在k8S中,Worker节点加入集群的过程是什么?
在k8S中,Worker节点加入集群的过程是什么?
|
23小时前
|
Kubernetes 安全 数据安全/隐私保护
在k8S中,如何保证集群的安全性?
在k8S中,如何保证集群的安全性?

推荐镜像

更多