[クラウド ネイティブ | Kubernetes をゼロから学ぶ] 21、kubernetes 永続ストレージ

この記事はコラム「k8sをゼロから学ぶ」に収録されてます

ここに画像の説明を挿入

前回記事の補足

サービス サービスの検出: coredns コンポーネントの詳細な説明

DNSとは?

DNS のフルネームはドメイン ネーム システム (Domain Name System) で、これはインターネット全体の電話帳であり、理解できるドメイン名を機械が理解できる IP アドレスに変換することができます。読みにくいと直接連絡し、IPアドレスを理解する必要があります。現在のインターネットでは、サーバーの IP アドレスが頻繁に変更される可能性があるため、ドメイン ネーム システムは非常に重要です. DNS がないと、IP アドレスが変更されると、現在のサーバーのクライアントは目的のサーバーに接続できなくなります. IPアドレスに「エイリアス」を提供し、エイリアスとIPアドレスの関係が変化した場合に修正することで、クラスタが提供するサービスに他のクライアントが比較的安定してアクセスできるようにします。DNS は、実際には分散ツリー状の命名システムであり、ドメイン名から IP アドレスへのマッピングを格納する分散データベースのようなものです。

コアDNS?

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、これはローカル ストレージです。ポッドが再起動した場合、データは存在せず、データを永続的に保存する必要があります。

データ永続ストレージ [ポッドの再起動、データがまだ存在する] の場合、2 つの方法があります。

  • nfs: ネットワーク ストレージ [サーバー経由で保存]

k8s 永続ストレージの詳細な説明

k8s で永続ストレージが必要なのはなぜですか?

k8s にデプロイされたアプリケーションはポッド コンテナーの形式で実行されます.MySQL や Redis などのデータベースをデプロイする場合は、これらのデータベースによって生成されたデータをバックアップする必要があります. 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

永続ストレージには3つのタイプがあります。次の記事で詳しく説明します!

最後に書く

作成するのは簡単ではありません。コンテンツが役立つと思われる場合は、3 つのリンクをフォローしてサポートしてください。間違いがあればコメントで指摘していただければ修正します!
現在更新中のシリーズ:ゼロからk8sを学ぶ ご覧
いただきありがとうございます 記事には個人的な理解が混在しています 誤りがある場合は、私に連絡して指摘してください〜

おすすめ

転載: blog.csdn.net/qq_45400861/article/details/126903668