Практический опыт работы с k8s-ConfigMap и постоянным хранилищем

Kubernetes

предисловие

Существует множество методов хранения для k8s, в этой статье основное внимание уделяется ConfigMap и постоянному хранилищу-nfs. Это также распространенный метод хранения для k8s. Говорить сухими словами непросто, поэтому возьму в качестве примера nginx, потому что nginx как раз и нуждается в двух вышеуказанных способах хранения одновременно. Вот простой рисунок.

В этой серии руководств используется всего три сервера, один из которых может быть подключен к Интернету, а два из них не подключены к Интернету. Кластер k8s не может быть объединен в сеть.

анализ типа хранилища nginx

При использовании nginx больше всего беспокоят следующие два каталога:

/etc/nginx/conf.dи/usr/share/nginx/html

Один из них — каталог файла конфигурации, а другой — каталог статических ресурсов. Как правило, ConfigMap используется для хранения файлов конфигурации в рабочей среде, а постоянное хранилище nfs — для статических ресурсов.

конфигурационный файл

├── /etc/nginx/conf.d
	├── default.conf
	├── a.conf
	├── b.conf
	└── c.conf

статические ресурсы

├── /usr/share/nginx/html
	├── index.html
	├── a.html
	├── b.html
	└── c.html

ConfigMap

Создать рабочий каталог

mkdir -p /mldong/k8s/nginx

войти в рабочий каталог

cd /mldong/k8s/nginx

Используйте yaml, чтобы определить способ

определить один

cat <<EOF > /mldong/k8s/nginx/nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-cm
  namespace: mldong-test
data:
  a.conf: |-
    server {
      listen       80;
      server_name  a.mldong.com;
      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
EOF

определить несколько

cat <<EOF > /mldong/k8s/nginx/nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-cm
  namespace: mldong-test
data:
  a.conf: |-
    server {
      listen       80;
      server_name  a.mldong.com;
      location / {
        root   /usr/share/nginx/html/a;
        index  index.html index.htm;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
  b.conf: |-
    server {
      listen       80;
      server_name  b.mldong.com;
      location / {
        root   /usr/share/nginx/html/b;
        index  index.html index.htm;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
EOF

создать команду

kubectl apply -f nginx_cm.yaml 

Просмотреть все карты ConfigMaps в пространстве имен

kubectl get configmap -n mldong-test

Просмотр сведений об указанном ConfigMap

kubectl describe configmap nginx-cm -n mldong-test

ConfigMap===>kind

nginx-cm===>metadata.name

mldong-test===>metadata.namespace

Удалить определенный ConfigMap

kubectl delete -f nginx_cm.yaml 

Определяется с помощью внешнего файла

Создайте a.conf и b.conf в текущем каталоге

a.conf

cat <<EOF > /mldong/k8s/nginx/a.conf
server {
    listen       80;
    server_name  a.mldong.com;
    location / {
        root   /usr/share/nginx/html/a;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   /usr/share/nginx/html;
    }
}
EOF

b.conf

cat <<EOF > /mldong/k8s/nginx/b.conf
server {
    listen       80;
    server_name  b.mldong.com;
    location / {
        root   /usr/share/nginx/html/b;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   /usr/share/nginx/html;
    }
}
EOF

создать команду

создать единый

kubectl create configmap nginx-cm --from-file=a.conf -n mldong-test

создать несколько

kubectl create configmap nginx-cm --from-file=a.conf --from-file=b.conf -n mldong-test

По умолчанию имя файла является ключом, если вы хотите изменить его, например:

kubectl create configmap nginx-cm --from-file=xxxx=a.conf -n mldong-test

Удалить созданный ConfigMap

kubectl delete configmap nginx-cm -n mldong-test

Просмотреть все карты ConfigMaps в пространстве имен

kubectl get configmap -n mldong-test

Просмотр сведений об указанном ConfigMap

kubectl describe configmap nginx-cm -n mldong-test

ConfigMap===>kind

nginx-cm===>metadata.name

mldong-test===>metadata.namespace

постоянное хранение

Постоянное хранилище здесь использует nfs, которое в Alibaba Cloud называется nas. Если у вас его нет, сначала активируйте его — есть бесплатная версия.

открытый нас

искать нас

Процесс создания опущен

На что следует обратить внимание, так это на правильный выбор региона.

Просмотр сведений о конфигурации

устанавливать

Скопируйте команду mount и выполните ее на маленьком сервере A.

sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 9fdd94bf87-wkf12.cn-zhangjiakou.nas.aliyuncs.com:/ /mnt

/mnt — это локальный каталог для монтирования, если нет, вам нужно создать его самостоятельно. Вы также можете перейти в другой каталог.

Проверить статус монтирования

df -h | grep aliyun

размонтировать

umount /mnt

плагин для хранения

Подключаемый модуль кластерного хранилища Alibaba Cloud имеет два Flexvolume и CSI. Официальная рекомендация — использовать CSI. После выбора кластер установит подключаемый модуль по умолчанию.

··

Перед началом рекомендуется полностью прочитать документацию.

Плагины хранилища устанавливаются по умолчанию

Проверить установку

  • Выполните следующую команду, чтобы вывести несколько (количество узлов) списков подов в состоянии «Работает».
kubectl get pod -n kube-system | grep csi-plugin
  • Выполните следующую команду, чтобы вывести список модулей в состоянии «Работает».
kubectl get pod -n kube-system | grep csi-provisioner

начать использовать

В этой статье сначала используется метод статического хранилища NAS для реального боя, главным образом потому, что я боюсь, что это будет немного грязно, если я сделаю слишком много сразу. Сам пробовал, в ямле этого документа есть ямка. Если вы не можете создать его, вы можете использовать консоль для его создания, а затем изучить его yaml.

Создайте том статического хранилища NAS

nginx-pv.yaml

cat <<EOF > /mldong/k8s/nginx/nginx-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
  labels:
    alicloud-pvname: nginx-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  csi:
    driver: nasplugin.csi.alibabacloud.com
    volumeHandle: nginx-pv
    volumeAttributes:
      server: "9fdd94bf87-wfq72.cn-zhangjiakou.nas.aliyuncs.com"
      path: "/"
      vers: "3"
  storageClassName: nas
EOF

иллюстрировать

  • driver: Тип вождения. В этом примере значение равноnasplugin.csi.alibabacloud.com, что указывает на то, что используется подключаемый модуль Alibaba Cloud NAS CSI.
  • volumeHandle: Настройте имя PV.
  • server: точка подключения NAS.
  • path: монтировать подкаталоги.
  • vers: номер версии протокола NFS, используемого для подключения тома данных NAS, рекомендуется v3; сверхбыстрый NAS поддерживает только v3.

Примечание: pv совместно используется всеми пространствами имен, поэтому нет необходимости добавлять пространство имен.

Создать PV
kubectl apply -f nginx-pv.yaml
Просмотр PV
kubectl get pv

Доступно->успешно, Выпущено->не удалось

Просмотр сведений о PV
kubectl describe pv
удалить PV
kubectl delete -f nginx-pv.yaml

nginx-pvc.yaml

Примечание: pvc имеет пространство имен, поэтому добавьте пространство имен

cat <<EOF > /mldong/k8s/nginx/nginx-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: 'yes'
    pv.kubernetes.io/bound-by-controller: 'yes'
  finalizers:
    - kubernetes.io/pvc-protection
  name: nginx-pvc
  namespace: mldong-test
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      alicloud-pvname: nginx-pv
  storageClassName: nas
  volumeMode: Filesystem
  volumeName: nginx-pv
EOF

Основное alicloud-pvname здесь — это metadata.name pv.

Создание PVC
kubectl apply -f nginx-pvc.yaml
Посмотреть ПВХ
kubectl get pvc -n mldong-test

Привязано-> успех, Ожидание-> неудача

Посмотреть детали ПВХ
kubectl describe pvc -n mldong-test
Удалить PVC
kubectl delete -f nginx-pvc.yaml

начать монтировать

Сначала необходимо определить том хранилища k8s, а затем смонтировать.Мы только что определили два типа купонов хранилища, configmap и pvc.

cat <<EOF > /mldong/k8s/nginx/nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-pod
  namespace: mldong-test
spec:
  selector:
    matchLabels:
      app: nginx-pod
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: registry-vpc.cn-zhangjiakou.aliyuncs.com/mldong/java/nginx:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: port
              protocol: TCP
          volumeMounts:
            - name: nginx-pvc
              mountPath: "/usr/share/nginx/html"
            - name: nginx-cm
              mountPath: "/etc/nginx/conf.d"
      volumes:
        - name: nginx-pvc
          persistentVolumeClaim: 
            claimName: nginx-pvc
        - name: nginx-cm
          configMap:
            name: nginx-cm
EOF

проиллюстрировать:

  • volumeMount.name ==>volumes.name
  • volumeMount.mountPath==> каталог контейнера
  • persistentVolumeClaim.claimName==> имя определенного пвх
  • configMap.name==> имя определенной карты конфигурации
  • ---Для сегментации файлов поможет k8s

создать модуль

kubectl apply -f nginx-deployment.yaml

Просмотр модулей

kubectl get pods -n mldong-test

Маленький сервер создает файлы

├── /mnt
	├── a
		└── index.html
	└── b
		└── index.html

в контейнер

kubectl exec -it pod-name -n mldong-test --  bash

Проверьте, существует ли файл конфигурации

ls /etc/nginx/conf.d/

Проверьте, существуют ли статические ресурсы

ls /usr/share/nginx/html

Создать сервис

документ

cat <<EOF > /mldong/k8s/nginx/nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
  namespace: mldong-test
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32180 
  selector:
    app: nginx-pod
EOF

издать приказ

kubectl apply -f nginx-service.yaml

Посмотреть сервис

kubectl get Service -n mldong-test

служба доступа

узел доступа 1
curl worker1:32180
узел доступа 2
curl worker2:32180
домен доступа а
curl -H 'Host: a.mldong.com' worker1:32180
посетить домен b
curl -H 'Host: b.mldong.com' worker1:32180

резюме

В этой статье nginx используется в качестве примера, чтобы объяснить, как использовать ConfigMap и постоянное хранилище.Хотя он основан на облачной платформе, основные процессы аналогичны.

  • Сначала определите тип хранилища службы, которую нужно развернуть.

  • Если это ConfigMap

    • определить конфигурацию
  • если это пв

    • определить PV
    • определить пвх
  • Определение креплений pod

  • Определить службу публикации службы

Статьи по Теме

Практика с вами, чтобы играть в создание кластера k8s и Hello World