committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 226 additions and 2 deletions
Split View
Diff Options
-
67docs/local-storage-provisioner.md
-
5inventory/group_vars/k8s-cluster.yml
-
6roles/kubernetes-apps/local_volume_provisioner/defaults/main.yml
-
42roles/kubernetes-apps/local_volume_provisioner/tasks/main.yml
-
34roles/kubernetes-apps/local_volume_provisioner/templates/provisioner-admin-account.yml.j2
-
42roles/kubernetes-apps/local_volume_provisioner/templates/provisioner-ds.yml.j2
-
12roles/kubernetes-apps/local_volume_provisioner/templates/volume-config.yml.j2
-
8roles/kubernetes-apps/meta/main.yml
-
1roles/kubernetes/node/templates/kubelet-container.j2
-
2roles/kubernetes/node/templates/kubelet.rkt.service.j2
-
8roles/kubespray-defaults/defaults/main.yaml
-
1tests/files/centos7-flannel-addons.yml
@ -0,0 +1,67 @@ |
|||
# Local Storage Provisioner |
|||
|
|||
The local storage provisioner is NOT a dynamic storage provisioner as you would |
|||
expect from a cloud provider. Instead, it simply creates PersistentVolumes for |
|||
all manually created volumes located in the directory `local_volume_base_dir`. |
|||
The default path is /mnt/disks and the rest of this doc will use that path as |
|||
an example. |
|||
|
|||
## Examples to create local storage volumes |
|||
|
|||
### tmpfs method: |
|||
|
|||
``` |
|||
for vol in vol1 vol2 vol3; do |
|||
mkdir /mnt/disks/$vol |
|||
mount -t tmpfs -o size=5G $vol /mnt/disks/$vol |
|||
done |
|||
``` |
|||
|
|||
The tmpfs method is not recommended for production because the mount is not |
|||
persistent and data will be deleted on reboot. |
|||
|
|||
### Mount physical disks |
|||
|
|||
``` |
|||
mkdir /mnt/disks/ssd1 |
|||
mount /dev/vdb1 /mnt/disks/ssd1 |
|||
``` |
|||
|
|||
Physical disks are recommended for production environments because it offers |
|||
complete isolation in terms of I/O and capacity. |
|||
|
|||
### File-backed sparsefile method |
|||
|
|||
``` |
|||
truncate /mnt/disks/disk5 --size 2G |
|||
mkfs.ext4 /mnt/disks/disk5 |
|||
mkdir /mnt/disks/vol5 |
|||
mount /mnt/disks/disk5 /mnt/disks/vol5 |
|||
``` |
|||
|
|||
If you have a development environment and only one disk, this is the best way |
|||
to limit the quota of persistent volumes. |
|||
|
|||
### Simple directories |
|||
``` |
|||
for vol in vol6 vol7 vol8; do |
|||
mkdir /mnt/disks/$vol |
|||
done |
|||
``` |
|||
|
|||
This is also acceptable in a development environment, but there is no capacity |
|||
management. |
|||
|
|||
## Usage notes |
|||
|
|||
The volume provisioner cannot calculate volume sizes correctly, so you should |
|||
delete the daemonset pod on the relevant host after creating volumes. The pod |
|||
will be recreated and read the size correctly. |
|||
|
|||
Make sure to make any mounts persist via /etc/fstab or with systemd mounts (for |
|||
CoreOS/Container Linux). Pods with persistent volume claims will not be |
|||
able to start if the mounts become unavailable. |
|||
|
|||
## Further reading |
|||
|
|||
Refer to the upstream docs here: https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume |
@ -0,0 +1,6 @@ |
|||
--- |
|||
local_volume_provisioner_bootstrap_image_repo: quay.io/external_storage/local-volume-provisioner-bootstrap |
|||
local_volume_provisioner_bootstrap_image_tag: v1.0.0 |
|||
|
|||
local_volume_provisioner_image_repo: quay.io/external_storage/local-volume-provisioner |
|||
local_volume_provisioner_image_tag: v1.0.0 |
@ -0,0 +1,42 @@ |
|||
--- |
|||
- name: Local Volume Provisioner | Ensure base dir is created on all hosts |
|||
file: |
|||
path: "{{ local_volume_base_dir }}" |
|||
ensure: directory |
|||
owner: root |
|||
group: root |
|||
mode: 0700 |
|||
delegate_to: "{{ item }}" |
|||
with_items: "{{ groups['k8s-cluster'] }}" |
|||
failed_when: false |
|||
|
|||
- name: Local Volume Provisioner | Create addon dir |
|||
file: |
|||
path: "{{ kube_config_dir }}/addons/local_volume_provisioner" |
|||
owner: root |
|||
group: root |
|||
mode: 0755 |
|||
recurse: true |
|||
|
|||
- name: Local Volume Provisioner | Create manifests |
|||
template: |
|||
src: "{{item.file}}.j2" |
|||
dest: "{{kube_config_dir}}/addons/local_volume_provisioner/{{item.file}}" |
|||
with_items: |
|||
- {name: local-storage-provisioner-pv-binding, file: provisioner-admin-account.yml, type: clusterrolebinding} |
|||
- {name: local-volume-config, file: volume-config.yml, type: configmap} |
|||
- {name: local-volume-provisioner, file: provisioner-ds.yml, type: daemonset} |
|||
register: local_volume_manifests |
|||
when: inventory_hostname == groups['kube-master'][0] |
|||
|
|||
|
|||
- name: Local Volume Provisioner | Apply manifests |
|||
kube: |
|||
name: "{{item.item.name}}" |
|||
namespace: "{{ system_namespace }}" |
|||
kubectl: "{{bin_dir}}/kubectl" |
|||
resource: "{{item.item.type}}" |
|||
filename: "{{kube_config_dir}}/addons/local_volume_provisioner/{{item.item.file}}" |
|||
state: "latest" |
|||
with_items: "{{ local_volume_manifests.results }}" |
|||
when: inventory_hostname == groups['kube-master'][0] |
@ -0,0 +1,34 @@ |
|||
--- |
|||
apiVersion: v1 |
|||
kind: ServiceAccount |
|||
metadata: |
|||
name: local-storage-admin |
|||
--- |
|||
apiVersion: rbac.authorization.k8s.io/v1beta1 |
|||
kind: ClusterRoleBinding |
|||
metadata: |
|||
name: local-storage-provisioner-pv-binding |
|||
namespace: default |
|||
subjects: |
|||
- kind: ServiceAccount |
|||
name: local-storage-admin |
|||
namespace: default |
|||
roleRef: |
|||
kind: ClusterRole |
|||
name: system:persistent-volume-provisioner |
|||
apiGroup: rbac.authorization.k8s.io |
|||
--- |
|||
apiVersion: rbac.authorization.k8s.io/v1beta1 |
|||
kind: ClusterRoleBinding |
|||
metadata: |
|||
name: local-storage-provisioner-node-binding |
|||
namespace: default |
|||
subjects: |
|||
- kind: ServiceAccount |
|||
name: local-storage-admin |
|||
namespace: default |
|||
roleRef: |
|||
kind: ClusterRole |
|||
name: system:node |
|||
apiGroup: rbac.authorization.k8s.io |
|||
|
@ -0,0 +1,42 @@ |
|||
apiVersion: extensions/v1beta1 |
|||
kind: DaemonSet |
|||
metadata: |
|||
name: local-volume-provisioner |
|||
namespace: "{{ system_namespace }}" |
|||
spec: |
|||
template: |
|||
metadata: |
|||
labels: |
|||
app: local-volume-provisioner |
|||
spec: |
|||
containers: |
|||
- name: provisioner |
|||
image: {{ local_volume_provisioner_image_repo }}:{{ local_volume_provisioner_image_tag }} |
|||
imagePullPolicy: {{ k8s_image_pull_policy }} |
|||
securityContext: |
|||
privileged: true |
|||
volumeMounts: |
|||
- name: discovery-vol |
|||
mountPath: "/local-disks" |
|||
- name: local-volume-config |
|||
mountPath: /etc/provisioner/config/ |
|||
env: |
|||
- name: MY_NODE_NAME |
|||
valueFrom: |
|||
fieldRef: |
|||
apiVersion: v1 |
|||
fieldPath: spec.nodeName |
|||
- name: MY_NAMESPACE |
|||
valueFrom: |
|||
fieldRef: |
|||
apiVersion: v1 |
|||
fieldPath: metadata.namespace |
|||
volumes: |
|||
- name: discovery-vol |
|||
hostPath: |
|||
path: "{{ local_volume_base_dir }}" |
|||
- configMap: |
|||
defaultMode: 420 |
|||
name: local-volume-config |
|||
name: local-volume-config |
|||
serviceAccount: local-storage-admin |
@ -0,0 +1,12 @@ |
|||
# The config map is used to configure local volume discovery for Local SSDs on GCE and GKE. |
|||
# It is a map from storage class to its mount configuration. |
|||
apiVersion: v1 |
|||
kind: ConfigMap |
|||
metadata: |
|||
name: local-volume-config |
|||
namespace: {{ system_namespace }} |
|||
data: |
|||
storageClassMap: | |
|||
local-storage: |
|||
hostDir: "{{ local_volume_base_dir }}" |
|||
mountDir: "/mnt/local-storage/" |
xxxxxxxxxx