{"id":3117,"date":"2022-04-21T20:50:20","date_gmt":"2022-04-22T04:50:20","guid":{"rendered":"https:\/\/tungle.ca\/?p=3117"},"modified":"2022-12-04T19:08:47","modified_gmt":"2022-12-05T03:08:47","slug":"deploying-wordpress-and-mysql-with-kubernetes-on-aws","status":"publish","type":"post","link":"https:\/\/tungle.ca\/?p=3117","title":{"rendered":"Deploying WordPress and MySQL\u00a0with Kubernetes on AWS"},"content":{"rendered":"\n<p>This is a diagram that I have used for this lab.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"460\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-599.png\" alt=\"\" class=\"wp-image-3167\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-599.png 449w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-599-293x300.png 293w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-599-195x200.png 195w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><\/figure>\n\n\n\n<p>+ Create a Ubuntu Linux instance with 2GB RAM and 30GB storage for Kubernetes. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"587\" height=\"443\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-575.png\" alt=\"\" class=\"wp-image-3128\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-575.png 587w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-575-300x226.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-575-200x151.png 200w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><\/figure>\n\n\n\n<p>+ Create a MySQL deployment file.<\/p>\n\n\n\n<p>#mysql-deployment.yaml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: wordpress-mysql\n  labels:\n    app: wordpress\nspec:\n  ports:\n    - port: 3306\n  selector:\n    app: wordpress\n    tier: mysql\n  clusterIP: None\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: mysql-pv-claim\n  labels:\n    app: wordpress\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 20Gi\n---\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: wordpress-mysql\n  labels:\n    app: wordpress\nspec:\n  selector:\n    matchLabels:\n      app: wordpress\n      tier: mysql\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      labels:\n        app: wordpress\n        tier: mysql\n    spec:\n      containers:\n      - image: mysql:5.6\n        name: mysql\n        env:\n        - name: MYSQL_ROOT_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-pass\n              key: password\n        ports:\n        - containerPort: 3306\n          name: mysql\n        volumeMounts:\n        - name: mysql-persistent-storage\n          mountPath: \/var\/lib\/mysql\n      volumes:\n      - name: mysql-persistent-storage\n        persistentVolumeClaim:\n          claimName: mysql-pv-claim<\/code><\/pre>\n\n\n\n<p> + Create a WordPress deployment file<\/p>\n\n\n\n<p>#wordpress-deployment.yaml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: wordpress\n  labels:\n    app: wordpress\nspec:\n  ports:\n    - port: 80\n  selector:\n    app: wordpress\n    tier: frontend\n  type: LoadBalancer\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: wp-pv-claim\n  labels:\n    app: wordpress\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 20Gi\n---\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: wordpress\n  labels:\n    app: wordpress\nspec:\n  selector:\n    matchLabels:\n      app: wordpress\n      tier: frontend\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      labels:\n        app: wordpress\n        tier: frontend\n    spec:\n      containers:\n      - image: wordpress:4.8-apache\n        name: wordpress\n        env:\n        - name: WORDPRESS_DB_HOST\n          value: wordpress-mysql\n        - name: WORDPRESS_DB_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: mysql-pass\n              key: password\n        ports:\n        - containerPort: 80\n          name: wordpress\n        volumeMounts:\n        - name: wordpress-persistent-storage\n          mountPath: \/var\/www\/html\n      volumes:\n      - name: wordpress-persistent-storage\n        persistentVolumeClaim:\n          claimName: wp-pv-claim<\/code><\/pre>\n\n\n\n<p>+ Download the MySQL deployment configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo curl -LO https:\/\/k8s.io\/examples\/application\/wordpress\/mysql-deployment.yaml<\/code><\/pre>\n\n\n\n<p>+ Download the WordPress configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo curl -LO https:\/\/k8s.io\/examples\/application\/wordpress\/wordpress-deployment.yaml<\/code><\/pre>\n\n\n\n<p>+ Create a kustomization.yaml.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">secretGenerator:\n- name: mysql-pass\n  literals:\n  - password=YOUR_PASSWORD\nresources:\n  - mysql-deployment.yaml\n  - wordpress-deployment.yaml<\/code><\/pre>\n\n\n\n<p>+ Enable DNS dashboard storage.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">microk8s enable dns dashboard storage<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"712\" height=\"358\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-565.png\" alt=\"\" class=\"wp-image-3118\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-565.png 712w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-565-300x151.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-565-200x101.png 200w\" sizes=\"auto, (max-width: 712px) 100vw, 712px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"459\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-566.png\" alt=\"\" class=\"wp-image-3119\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-566.png 872w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-566-300x158.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-566-768x404.png 768w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-566-200x105.png 200w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/figure>\n\n\n\n<p>+ Apply and verify<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">microk8s kubectl apply -k .\/<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"713\" height=\"146\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-567.png\" alt=\"\" class=\"wp-image-3120\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-567.png 713w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-567-300x61.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-567-200x41.png 200w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/figure>\n\n\n\n<p>+ Verify a PersistentVolumeClaims (PVC) got dynamically provisioned.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">microk8s kubectl get pvc<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"867\" height=\"91\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-568.png\" alt=\"\" class=\"wp-image-3121\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-568.png 867w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-568-300x31.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-568-768x81.png 768w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-568-200x21.png 200w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><\/figure>\n\n\n\n<p>+ Verify the Pod is running.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">microk8s kubectl get pods<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"91\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-569.png\" alt=\"\" class=\"wp-image-3122\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-569.png 684w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-569-300x40.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-569-200x27.png 200w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/figure>\n\n\n\n<p>+ Check Kubernetes is running.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">microk8s kubectl get all --all-namespaces<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"873\" height=\"615\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-570.png\" alt=\"\" class=\"wp-image-3123\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-570.png 873w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-570-300x211.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-570-768x541.png 768w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-570-200x141.png 200w\" sizes=\"auto, (max-width: 873px) 100vw, 873px\" \/><\/figure>\n\n\n\n<p>+ Expose port 80 via External IP address (10.0.0.10) of Kubernetes instance on AWS. This allows accessing WordPress via the Internet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">microk8s kubectl patch svc wordpress -n default -p '{\"spec\": {\"type\": \"LoadBalancer\", \"externalIPs\":[\"10.0.0.10\"]}}'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"92\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-571.png\" alt=\"\" class=\"wp-image-3124\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-571.png 875w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-571-300x32.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-571-768x81.png 768w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-571-200x21.png 200w\" sizes=\"auto, (max-width: 875px) 100vw, 875px\" \/><\/figure>\n\n\n\n<p>Check the port 80 is listening on the Kubernetes host.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"196\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-572.png\" alt=\"\" class=\"wp-image-3125\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-572.png 872w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-572-300x67.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-572-768x173.png 768w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-572-200x45.png 200w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/figure>\n\n\n\n<p>+ Verify the WordPress service is running.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"87\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-574.png\" alt=\"\" class=\"wp-image-3127\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-574.png 668w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-574-300x39.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-574-200x26.png 200w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \/><\/figure>\n\n\n\n<p>Access the WordPress on Kubernetes. (http:\/\/54.165.173.81)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"592\" src=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-573-1024x592.png\" alt=\"\" class=\"wp-image-3126\" srcset=\"https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-573-1024x592.png 1024w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-573-300x173.png 300w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-573-768x444.png 768w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-573-200x116.png 200w, https:\/\/tungle.ca\/wp-content\/uploads\/2022\/04\/image-573.png 1213w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a diagram that I have used for this lab. + Create a Ubuntu Linux instance with 2GB RAM and 30GB storage for Kubernetes. + Create a MySQL deployment file. #mysql-deployment.yaml + Create a WordPress deployment file #wordpress-deployment.yaml + Download the MySQL deployment configuration file. + Download the WordPress configuration file. + Create a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,30,6],"tags":[20,24,8],"class_list":["post-3117","post","type-post","status-publish","format-standard","hentry","category-cloud","category-kubernetes","category-linux","tag-cloud","tag-kubernetes","tag-linux"],"_links":{"self":[{"href":"https:\/\/tungle.ca\/index.php?rest_route=\/wp\/v2\/posts\/3117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tungle.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tungle.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tungle.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tungle.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3117"}],"version-history":[{"count":5,"href":"https:\/\/tungle.ca\/index.php?rest_route=\/wp\/v2\/posts\/3117\/revisions"}],"predecessor-version":[{"id":4433,"href":"https:\/\/tungle.ca\/index.php?rest_route=\/wp\/v2\/posts\/3117\/revisions\/4433"}],"wp:attachment":[{"href":"https:\/\/tungle.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tungle.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tungle.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}