您的配置存在的问题是缺少允许外部访问您的WordPress 的服务。
有很多材料解释了哪些选项以及它们如何与 Kubernetes 工作的基础设施严格连接。
让我详细说明其中的 3 个:
- minikube
- kubeadm
- 云配置(GKE、EKS、AKS)
WordPress 配置的基础在每种情况下都是相同的。
目录:
- 运行 MySQL
- 秘密
- PersistentVolumeClaim
- 部署
- 服务
- 运行 WordPress
- 允许外部访问
- minikube
- kubeadm
- 云配置 (GKE)
Kubernetes 网站上有一个很好的教程:HERE!
运行 MySQL
秘密
作为 Kubernetes 官方文档:
Kubernetes secret 对象可让您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。将此信息放入 secret 比将其逐字放入 Pod 定义或 container image 中更安全、更灵活。
-- Kubernetes secrets
下面的示例是YAML 用于MySQL 密码的秘密定义:
apiVersion: v1
kind: Secret
metadata:
name: mysql-password
type: Opaque
data:
password: c3VwZXJoYXJkcGFzc3dvcmQK
具体看一下:
password: c3VwZXJoYXJkcGFzc3dvcmQK
此密码采用 base64 编码。
要从您的终端创建此密码调用命令:
$ echo "YOUR_PASSWORD" | base64
将输出粘贴到YAML 定义并应用它:
$ kubectl apply -f FILE_NAME.
您可以使用以下命令检查它是否正确创建:
$ kubectl get secret mysql-password -o yaml
PersistentVolumeClaim
MySQL 需要一个专用空间来存储数据。有官方文档解释:Persistent Volumes
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
YAML 以上将为MySQL 创建一个存储声明。用命令应用它:
$ kubectl apply -f FILE_NAME.
部署
从官方示例中创建一个部署的YAML 定义,如果对象名称有任何更改,请对其进行调整:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
具体看下面部分,将secret密码解析到MySQL pod:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
使用命令应用它:$ kubectl apply -f FILE_NAME。
服务
您的配置中缺少的是服务对象。此对象允许与其他 pod、外部流量等进行通信。请看下面的示例:
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
此定义将创建一个指向MySQL pod 的对象。
它将创建一个名称为wordpress-mysql 和 Pod 的 IP 地址的 DNS 条目。
它不会将其暴露给外部流量,因为它不需要。
使用命令应用它:$ kubectl apply -f FILE_NAME。
运行 WordPress
持久卷声明
与MySQL 一样,WordPress 需要专用空间来存储数据。使用以下示例创建它:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
使用命令应用它:$ kubectl apply -f FILE_NAME。
部署
创建YAML 的WordPress 定义,如下例所示:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
具体看一下:
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
这部分将解析秘密值到部署。
下面的定义将告诉WordPress MySQL 所在的位置:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
使用命令应用它:$ kubectl apply -f FILE_NAME。
允许外部访问
有许多不同的方法可用于配置对应用程序的外部访问。
Minikube
不同管理程序之间的配置可能不同。
例如Minikube 可以通过以下方式将WordPress 暴露给外部流量:
节点端口
apiVersion: v1
kind: Service
metadata:
name: wordpress-nodeport
spec:
type: NodePort
selector:
app: wordpress
tier: frontend
ports:
- name: wordpress-port
protocol: TCP
port: 80
targetPort: 80
应用此定义后,您需要在 Web 浏览器中输入带有适当端口的minikube IP 地址。
这个端口可以通过以下命令找到:
$ kubectl get svc wordpress-nodeport
上述命令的输出:
wordpress-nodeport NodePort 10.76.9.15 <none> 80:30173/TCP 8s
在本例中为30173。
负载平衡器
In this case it will create NodePort also!
apiVersion: v1
kind: Service
metadata:
name: wordpress-loadbalancer
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
入口资源
请参考此链接:Minikube: create-an-ingress-resource
也可以参考这个Stack Overflow post
Kubeadm
kubeadm提供的Kubernetes集群有:
节点端口
配置过程同minikube。唯一的区别是它将在集群中的每个节点上创建NodePort。之后,您可以输入任何具有适当端口的节点的 IP 地址。请注意,您需要在同一个网络中,并且没有防火墙阻止您的访问。
负载平衡器
您可以使用与minikube 中相同的YAML 定义创建LoadBalancer 对象。问题在于,在裸机集群上配置kubeadm 时,LoadBalancer 将无法获得 IP 地址。选项之一是:MetalLB
入口
入口资源与LoadBalancer 在kubeadm 配置的基础架构中存在相同的问题。如上一个选项是:MetalLB。
云配置
有许多与 Kubernetes 工作的云密切相关的选项。下面是在 GKE 上使用 NGINX 控制器配置 Ingress 资源的示例:
同时应用YAML 定义:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/cloud-generic.yaml
从minikube 应用NodePort 定义
创建 Ingress 资源:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: wordpress-nodeport
servicePort: wordpress-port
使用命令应用它:$ kubectl apply -f FILE_NAME。
检查Ingress 资源是否使用命令从云提供商那里获得地址:
$ kubectl get ingress
输出应该是这样的:
NAME HOSTS ADDRESS PORTS AGE
ingress * XXX.XXX.XXX.X 80 26m
从上面的命令输入 IP 地址后,你应该得到:
云配置示例可用于配置MetalLB 的kubeadm 配置集群。