WordPress na Kubernetes (kind + NGINX Ingress) – pełny tutorial krok po kroku w terminalu Linuxa

W związku z dużym zainteresowaniem tematem budowania klastrów kubernetes i DevOps, związanym z tym wpisem na moim blogu Tworzenie klastra kubernetes narzędziem kind – k8s w 2 minuty na Linux postanowiłem zaprezentować gotowe receptury i objaśnienia, jak postawić bloga WordPress na lokalnym klastrze kubernetes, przy pomocy narzędzia kind w Linux z terminala. To jest banalnie proste!

Najpierw musisz wykonać komendy z w/w wpisu z tego bloga, po czym dodajesz dodatkowe poniższe komendy, w celu postawienia systemu blogowania WordPress na localhost w Linux z narzędziem kind:

kubectl create namespace wordpress
cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: v1
kind: Secret
metadata:
  name: mariadb-secret
type: Opaque
stringData:
  root-password: rootpass
  database: wordpress
  user: wpuser
  password: wppass
EOF

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mariadb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
EOF

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb
spec:
  selector:
    matchLabels:
      app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - name: mariadb
        image: mariadb:11
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: root-password
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: database
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: password
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: mariadb-pvc
EOF

kubectl expose deployment mariadb -n wordpress --port=3306
cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress:6-apache
        env:
        - name: WORDPRESS_DB_HOST
          value: mariadb
        - name: WORDPRESS_DB_USER
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: user
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: password
        - name: WORDPRESS_DB_NAME
          valueFrom:
            secretKeyRef:
              name: mariadb-secret
              key: database
        ports:
        - containerPort: 80
EOF

kubectl expose deployment wordpress -n wordpress --port=80
cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wordpress
spec:
  ingressClassName: nginx
  rules:
  - host: wordpress.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wordpress
            port:
              number: 80
EOF

kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80

Dodaj do pliku hostów roboczą domenę wordpress.local

~$ cat /etc/hosts | head -n 1
127.0.0.1	localhost echo.local wordpress.local

Otwórz przeglądarkę i zacznij cieszyć się WordPresem na klastrze kubernetes 🙂

A TERAZ OPISZMY CO SIĘ ZDARZYŁO – KROK PO KROKU

WordPress na Kubernetes (kind + NGINX Ingress) – pełny tutorial krok po kroku

W tym wpisie rozszerzamy wcześniejszy setup Kubernetes na kind i zamiast prostego http-echo wdrażamy pełny WordPress + baza danych MariaDB, dostępny przez NGINX Ingress Controller.

1. Tworzenie klastra kind

kind create cluster

2. Weryfikacja klastra

kubectl cluster-info --context kind-kind
kubectl get nodes -o wide
kubectl get pods -A

3. Instalacja NGINX Ingress Controller

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/kind/deploy.yaml

⏳ 4. Sprawdzenie instalacji ingress

kubectl get pods -n ingress-nginx -w
kubectl get svc -n ingress-nginx

5. (opcjonalnie) fix dla kind node

Jeśli controller nie startuje:

kubectl label node kind-control-plane ingress-ready=true

🗄️ 6. Namespace dla WordPress

kubectl create namespace wordpress

7. Baza danych MariaDB

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: v1
kind: Secret
metadata:
name: mariadb-secret
type: Opaque
stringData:
root-password: rootpass
database: wordpress
user: wpuser
password: wppass
EOF

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
EOF

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb
spec:
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb
image: mariadb:11
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: root-password
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mariadb-secret
key: database
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mariadb-secret
key: user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: mariadb-pvc
EOF
kubectl expose deployment mariadb -n wordpress --port=3306

8. WordPress Deployment

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:6-apache
env:
- name: WORDPRESS_DB_HOST
value: mariadb
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mariadb-secret
key: user
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
- name: WORDPRESS_DB_NAME
valueFrom:
secretKeyRef:
name: mariadb-secret
key: database
ports:
- containerPort: 80
EOF

kubectl expose deployment wordpress -n wordpress --port=80

9. Ingress dla WordPress

cat <<EOF | kubectl apply -n wordpress -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress
spec:
ingressClassName: nginx
rules:
- host: wordpress.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
number: 80
EOF

🔌 10. Dostęp do klastra (kind)

kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80

11. Test WordPress

Dodaj do /etc/hosts:

127.0.0.1 wordpress.local

lub test bez DNS:

curl -H "Host: wordpress.local" http://localhost:8080

12. Sprawdzenie wszystkiego

kubectl get pods -n wordpress
kubectl get svc -n wordpress
kubectl get ingress -n wordpress

13. Czyszczenie środowiska

kind delete cluster

14. Jeśli chcesz dostać się do bazy MariaDB powiązanej z WordPress na klastrze kubernetesa, musisz zrobić tak!

W oknie jednego terminala Linux przekierowujemy port do bazy MariaDB z klastra k8s do localhost

~$ kubectl port-forward -n wordpress svc/mariadb 3306:3306
Forwarding from 127.0.0.1:3306 -> 3306
Forwarding from [::1]:3306 -> 3306
Handling connection for 3306

W innym oknie terminala łączymy się lokalnym klientem mysql zainstalowanym na naszej maszynie z bazą MariaDB na klastrze k8s

~$ mysql -h 127.0.0.1 -P 3306 -u wpuser -pwppass wordpress

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| wordpress          |
+--------------------+
2 rows in set (0,00 sec)

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_wordpress   |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
12 rows in set (0,00 sec)

mysql> SELECT COUNT(*) FROM wp_posts;
+----------+
| COUNT(*) |
+----------+
|        8 |
+----------+
1 row in set (0,01 sec)

Podsumowanie

W tym tutorialu:

  • wystawiliśmy go przez Ingress
  • postawiliśmy Kubernetes na kind
  • zainstalowaliśmy NGINX Ingress Controller
  • dodaliśmy storage (PVC)
  • uruchomiliśmy MariaDB
  • wdrożyliśmy WordPress

About the author

Autor "BIELI" to zapalony entuzjasta otwartego oprogramowania, który dzieli się swoją pasją na blogu poznajlinuxa.pl. Jego wpisy są skarbnicą wiedzy na temat Linuxa, programowania oraz najnowszych trendów w świecie technologii. Autor "BIELI" wierzy w siłę społeczności Open Source i zawsze stara się inspirować swoich czytelników do eksplorowania i eksperymentowania z kodem.