How To Deploy Kubernetes With NetApp Trident Persistent Storage

As folks adopt DevOps principals they are using common applications to help them get there. One of those is Docker and usually in the same sentence Kubernetes is mentioned next. To review, Docker is essentially a wrapper for Linux containers (LXC), which similar to FreeBSD jails or Solaris Zones, provides a method for applications (and their dependencies) to be isolated in separate namespaces all while sharing the host system’s kernel. Docker containers are extremely portable as they just need the host server to have a LXC-compatible kernel and the Docker application installed. Kubernetes takes this concept to the next level by automating deployment, scaling, and management of containerized applications. It groups containers that make up an application into logical units for easy management and discovery. For a more detailed intro on what Kubernetes is check out the “Sources” section below. Now to the meat of the post, what is NetApp Trident and where does it fit in to the Docker/Kubernetes equation? Well according to NetApp Trident’s GitHub page, “Trident provides storage orchestration for Kubernetes, integrating with its Persistent Volume framework to act as an external provisioner for NetApp ONTAP, SolidFire, and E-Series systems. Additionally, through its REST interface, Trident can also provide storage orchestration for non-Kubernetes deployments.” In other words, Trident allows one to attach persistent storage from NetApp FAS, E-Series, or SolidFire system(s) to containers allowing applications such as databases to easily operate in a containerized environment. Below are the steps I compiled needed to not only stand up a small 3-node Kubernetes cluster but also to deploy the NetApp Trident plugin: ...

August 13, 2017 · 7 min · dburkland

How To Setup NetApp Harvest Using Docker

2017-07-13: Updated for version 1.3 of my container image which includes some updated dashboards 2017-05-21: Updated for version 1.2 of my container image which includes NetApp SDK 5.7 2016-11-15: Updated for version 1.1 of my container image which includes Grafana 3.1 and NetApp Harvest 1.3 2018-03-18: Updated for version 1.4.1 of my container image which includes bug fixes, Grafana 4.5.2 and NetApp Harvest 1.4 2020-01-18: Updated for version 1.6 of my container image which includes NetApp Harvest 1.6 (and is now hosted at hub.docker.com) This post is based on the original “How To Setup NetApp Harvest Using Docker” blog post however it has been tweaked to reflect the more simplistic deployment method which relies on a pre-built container image (vs building one from source). ...

April 5, 2016 · 5 min · dburkland

How To Setup Grafana with Graphite And Create Basic Dashboards

Before I dive into Grafana I wanted to make a quick note that last week marked my 1 year anniversary at NetApp. This year has honestly flown by and it is hard to believe as it feels like just yesterday I started this new adventure with various unknowns. It has been a year full of change along with many new experiences which I feel have made me stronger, both as an individual and professional. I am thankful for the opportunity at NetApp and for the ability to work with so many great customers that have turned to us to solve their most critical of IT issues. I look forward to the challenges that lay ahead and for many more years with this great team at NetApp. ...

March 10, 2015 · 5 min · dburkland

How To Setup Graphite To Visualize OnCommand Performance Manager Data

As you may well know OnCommand Performance Manager 1.1RC1 was recently released which added the ability to send data to an external system such as Graphite. I have created the following tutorial which explains how to setup a CentOS server and install the Graphite application on it. If you run into any issues with the tutorial please let me know in the comment section below. Provision a CentOS 6+ VM with the “Base” package group installed Install the “EPEL” mirror on the system rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm Install the appropriate RPM packages yum install graphite-web graphite-web-selinux mysql mysql-server MySQL-python python-carbon -y Start MySQL and enable the service to start at boot /etc/init.d/mysqld start chkconfig mysqld on Execute the “mysql_secure_installation” script and accept the defaults mysql_secure_installation Add the following lines underneath the “Database Configuration” section of the “/etc/graphite-web/local_settings.py” config file DATABASES = { 'default': { 'NAME': 'graphite', 'ENGINE': 'django.db.backends.mysql', 'USER': 'graphite', 'PASSWORD': 'netapp1-', 'HOST': 'localhost', 'PORT': '3306' } } Create the “graphite” MySQL user along with the appropriate permission entries mysql -e "CREATE USER 'graphite'@'localhost' IDENTIFIED BY 'netapp1-';" -u root -p mysql -e "GRANT ALL PRIVILEGES ON graphite.* TO 'graphite'@'localhost';" -u root -p mysql -e "CREATE DATABASE graphite;" -u root -p mysql -e 'FLUSH PRIVILEGES;' -u root -p Create the appropriate MySQL database and tables which will be used by graphite /usr/lib/python2.6/site-packages/graphite/manage.py syncdb Change the value for the “MAX_CREATES_PER_MINUTE” setting in the “/etc/carbon/carbon.conf” configuration file MAX_CREATES_PER_MINUTE = 200 Add the following lines to the “/etc/carbon/storage-schemas.conf” config file [OPM] pattern = ^netapp-performance\..* retentions = 5m:100d Create the “/etc/carbon/storage-aggregation.conf” file with the following content # Aggregation methods for whisper files. Entries are scanned in order, # and first match wins. This file is scanned for changes every 60 seconds # # [name] # pattern = <regex> # xFilesFactor = <float between 0 and 1> # aggregationMethod = <average|sum|last|max|min> # # name: Arbitrary unique name for the rule # pattern: Regex pattern to match against the metric name # xFilesFactor: Ratio of valid data points required for aggregation to the next retention to occur # aggregationMethod: function to apply to data points for aggregation # [min] pattern = \.min$ xFilesFactor = 0.1 aggregationMethod = min [max] pattern = \.max$ xFilesFactor = 0.1 aggregationMethod = max [sum] pattern = \.count$ xFilesFactor = 0 aggregationMethod = sum [default_average] pattern = .* xFilesFactor = 0.5 aggregationMethod = average Add the following line to the “/etc/httpd/conf.d/graphite-web.conf” configuration file underneath “Alias /media/” Alias /content/ "/usr/share/graphite/webapp/content/" Fix the following filesystem permission issues chmod 775 /var/log/graphite-web/ chmod 775 /var/lib/graphite-web/ Start the “carbon-cache” & “httpd" services and enable them to start at boot /etc/init.d/carbon-cache start chkconfig carbon-cache on /etc/init.d/carbon-aggregator start chkconfig carbon-aggregator on /etc/init.d/httpd start chkconfig httpd on Complete the “Configuring a connection from a Performance Manager server to an external data provider” steps outlined in the “OnCommand Performance Manager 1.1 Installation and Administration Guide For VMware Virtual Appliances” document found here. This will enable performance data to be sent from the OPM server to the new graphite server After waiting 5 or so minutes you should now see all of the appropriate OPM data points within Graphite under the “netapp-performance” folder

January 12, 2015 · 3 min · dburkland

How To Restore From A LVM-based RHEL6 VMDK

As a customer I ran into a few scenarios where I needed to restore directories or files from a restored LVM-based RHEL 6 VMDK. You cannot simply attach the restored VMDK, mount the filesystem, and copy the directories or files due to the way LVM utilizes UUIDs for logical volumes. In order to restore directories or files from a LVM-based RHEL 6 VMDK, please perform the following steps: Restore the VMDK either using the backup product of choice Attach the restored VMDK to the target VM Login to the VM as the root user Rescan the virtual SCSI bus to see the newly added disk echo "- - -" > /sys/class/scsi_host/host0/scan Import the restored LVM volume group without trashing the existing one using vgimportclone vgimportclone -n <VolGroupName>_clone /dev/<Disk Partition name ie. sdc1> Verify you can now see the logical volumes on the restored VMDK lvdisplay Make the logical volume(s) available lvchange -ay /dev/<VolGroupName>_clone/<LogicalVolumeName> Mount the restored logical volume to a temporary mount point mount /dev/<VolGroupName>_clone/<LogicalVolumeNumber> /mnt Copy the target directories/files using whatever *nix tool that you prefer Unmount the restored logical volume unmount /mnt Removed the restored volume group and physical volume vgremove <VolGroupName>_clone Unattach the restored VMDK from the VM Delete the restored VMDK as it is no longer needed ...

May 1, 2014 · 2 min · dburkland