尝试使用Persistent Volumes教程

尝试以下教程时的笔记。

部署使用持久卷的WordPress和MySQL。

自然氛圍

    • クラスター作成済み(minikube ではない)

 

    kubectl コマンド設定済み
# バージョン情報
$kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-28T20:03:09Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-28T20:13:43Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

# ノードもクラスターに参加済み
$kubectl get nodes
NAME                                           STATUS    ROLES     AGE       VERSION
ip-192-168-111-32.us-west-2.compute.internal   Ready     <none>    40d       v1.10.3
ip-192-168-150-4.us-west-2.compute.internal    Ready     <none>    40d       v1.10.3
ip-192-168-194-26.us-west-2.compute.internal   Ready     <none>    40d       v1.10.3

试一试

开始之前

由于本章的主要内容是要求创建一个集群,请略过本次任务,因为已经提前准备好了。

创建持久化卷声明和持久化卷

许多群集环境都预装有默认的StorageClass。当PersistentVolumeClaim中没有指定StorageClass时,将使用群集的默认StorageClass代替。

如果在PersistentVolumeClaim中没有提及StorageClass,就会使用默认的StorageClass来进行资源供应。请检查默认的StorageClass。

# StorageClass が2つ定義されており、「gp2」がデフォルトとなっている
$kubectl get storageclass
NAME            PROVISIONER             AGE
gp2 (default)   kubernetes.io/aws-ebs   6d
gp2-2           kubernetes.io/aws-ebs   4d

我已确认在我的环境中已经设置了默认的 StorageClass,所以可以继续进行下去。

创建一个MySQL密码的秘密

创建用于MySQL密码的Secrets。
以下是Secret的详细信息。

# secret を作成する
$kubectl create secret generic mysql-pass --from-literal=password=YOUR_PASSWORD
secret "mysql-pass" created

# mysql-pass という secret が作成されている点を確認
$kubectl get secrets
NAME                  TYPE                                  DATA      AGE
default-token-9jhrf   kubernetes.io/service-account-token   3         41d
mysql-pass            Opaque                                1         21s

部署MySQL

部署MySQL

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

    • Service, PersistentVolumeClaim, Deploymentを kind で定義

 

    • 環境変数で先ほど作成した secret の「MYSQL_ROOT_PASSWORD」を利用

 

    PersistentVolumeClaim を定義し、20GB のストレージを要求。また、MySQL では PersistentVolume を「/var/lib/mysql」にマウントする

那么就开始部署吧。

# Service, PersistentVolumeClaim, Deploymentを作成
$kubectl create -f https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
service "wordpress-mysql" created
persistentvolumeclaim "mysql-pv-claim" created
deployment.apps "wordpress-mysql" created

# PersistentVolumeClaim の作成を確認
$ kubectl get pvc
NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound     pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c   20Gi       RWO            gp2            17s

# PersistentVolume の作成も確認。CLAIM 列が「mysql-pv-claim」となっている
$kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                    STORAGECLASS   REASON    AGE
pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c   20Gi       RWO            Retain           Bound     default/mysql-pv-claim   gp2                      1m

# デプロイしたので MySQL の Pod の起動も確認
$kubectl get pods
NAME                              READY     STATUS    RESTARTS   AGE
wordpress-mysql-bcc89f687-bjb6g   1/1       Running   0          2m

# descibe コマンドで詳細を見るとボリュームがアタッチされたことが確認出来る。
$kubectl describe pods wordpress-mysql-bcc89f687-bjb6g |less

(一部省略)
Events:
  Type     Reason                  Age              From                                                   Message
  ----     ------                  ----             ----                                                   -------
  Warning  FailedScheduling        6m (x5 over 6m)  default-scheduler                                      pod has unbound PersistentVolumeClaims (repeated 3 times)
  Normal   Scheduled               6m               default-scheduler                                      Successfully assigned wordpress-mysql-bcc89f687-bjb6g to ip-192-168-194-26.us-west-2.compute.internal
  Normal   SuccessfulMountVolume   6m               kubelet, ip-192-168-194-26.us-west-2.compute.internal  MountVolume.SetUp succeeded for volume "default-token-9jhrf"
  Normal   SuccessfulAttachVolume  6m               attachdetach-controller                                AttachVolume.Attach succeeded for volume "pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c"
  Normal   SuccessfulMountVolume   6m               kubelet, ip-192-168-194-26.us-west-2.compute.internal  MountVolume.SetUp succeeded for volume "pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c"
  Normal   Pulled                  6m               kubelet, ip-192-168-194-26.us-west-2.compute.internal  Container image "mysql:5.6" already present on machine
  Normal   Created                 6m               kubelet, ip-192-168-194-26.us-west-2.compute.internal  Created container
  Normal   Started                 6m               kubelet, ip-192-168-194-26.us-west-2.compute.internal  Started container

# インスタンスにログインして確認。xvdf が見える
$ lsblk
NAME    MAJ:MIN   RM SIZE RO TYPE MOUNTPOINT
xvda    202:0      0  20G  0 disk
└─xvda1 202:1      0  20G  0 part /
xvdbf   202:14592  0  20G  0 disk /var/lib/kubelet/pods/cfebfda3-897d-11e8-a565-

# dokcer inspect で見ると /varlib/mysql として xvdf がマウントされているのが分かる
$docker inspect 1a25629da4ca |less
(一部省略)
            "Mounts": [
            {
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/cfebfda3-897d-11e8-a565-06fc7dc53c2c/volumes/kubernetes.io~aws-ebs/pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },


看起来不错,我决定继续下一步。

部署WordPress

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
    • Service, PersistentVolumeClaim, Deploymentを kind で定義

 

    PersistentVolumeClaim を定義し、20GB のストレージを要求。また、WordPress では PersistentVolume を「/var/www/html」にマウントする

部署。

# Service, PersistentVolumeClaim, Deploymentを作成
$kubectl create -f https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
service "wordpress" created
persistentvolumeclaim "wp-pv-claim" created
deployment.apps "wordpress" created

# wp-pv-claim が増えている
$ kubectl get pvc
NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound     pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c   20Gi       RWO            gp2            26m
wp-pv-claim      Bound     pvc-6ad87529-8981-11e8-971c-022ca775d168   20Gi       RWO            gp2            29s

# pv も増えている
$kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                    STORAGECLASS   REASON    AGE
pvc-6ad87529-8981-11e8-971c-022ca775d168   20Gi       RWO            Retain           Bound     default/wp-pv-claim      gp2                      4m
pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c   20Gi       RWO            Retain           Bound     default/mysql-pv-claim   gp2                      30m


# service の URL を取得
$ kubectl describe services wordpress
Name:                     wordpress
Namespace:                default
Labels:                   app=wordpress
Annotations:              <none>
Selector:                 app=wordpress,tier=frontend
Type:                     LoadBalancer
IP:                       10.100.124.11
LoadBalancer Ingress:     a6ac6da84898111e8971c022ca775d16-182335252.us-west-2.elb.amazonaws.com
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30000/TCP
Endpoints:                192.168.191.64:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  2m    service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   2m    service-controller  Ensured load balancer

确认在浏览器中访问”http://a6ac6da84898111e8971c022ca775d16-182335252.us-west-2.elb.amazonaws.com/”时,会显示WordPress界面。

清理干净

檢証完成後,請刪除。

# secret を削除する
$kubectl delete secret mysql-pass
secret "mysql-pass" deleted

# deploymnet と service を削除する -l は Selector (label query)。どちらにも app=wordpress のラベル付がされているので削除できる
$kubectl delete deployment -l app=wordpress
deployment.extensions "wordpress" deleted
deployment.extensions "wordpress-mysql" deleted
$kubectl delete service -l app=wordpress
service "wordpress" deleted
service "wordpress-mysql" deleted

# ラベル付けされた PersistentVolumeClaims も削除
$kubectl delete pvc -l app=wordpress
persistentvolumeclaim "mysql-pv-claim" deleted
persistentvolumeclaim "wp-pv-claim" deleted

# pvc は削除された
$kubectl get pvc
No resources found.

然而,在设置为默认的 StorageClass 中,如果策略是“保留”,即使删除了pvc,pv仍然存在。
这可以通过更改pv的策略来解决。

修改持久卷的回收策略

# POLICY が Retain なので pvc がなくても残っている
$kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                    STORAGECLASS   REASON    AGE
pvc-6ad87529-8981-11e8-971c-022ca775d168   20Gi       RWO            Retain           Released   default/wp-pv-claim      gp2                      11m
pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c   20Gi       RWO            Retain           Released   default/mysql-pv-claim   gp2                      37m

# patch で poilicy を変える
$kubectl patch pv pvc-6ad87529-8981-11e8-971c-022ca775d168 -p '{"spec": {"persistentVolumeReclaimPolicy":"Delete"}}'

persistentvolume "pvc-6ad87529-8981-11e8-971c-022ca775d168" patched


# 既に pvc がないので削除される
$kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                    STORAGECLASS   REASON    AGE
pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c   20Gi       RWO            Retain           Released   default/mysql-pv-claim   gp2                      41m

# 同じように対応
$ kubectl patch pv pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c -p '{"spec": {"persistentVolumeReclaimPolicy":"Delete"}}'

persistentvolume "pvc-cfd92d33-897d-11e8-a565-06fc7dc53c2c" patched

$kubectl get pv
No resources found.

结束了。

广告
将在 10 秒后关闭
bannerAds