A具有以下广告连播规范:
apiVersion: v1
kind: Pod
metadata:
name: wp
spec:
containers:
- image: wordpress:4.9-apache
name: wordpress
env:
- name: WORDPRESS_DB_PASSWORD
value: mysqlpwd
- name: WORDPRESS_DB_HOST
value: 127.0.0.1
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: mysqlpwd
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
emptyDir: {}
我使用
部署了它kubectl创建-f wordpress-pod.yaml
现在它已正确部署:
kubectl获得豆荚 wp 2/2跑步3 35小时
然后,当我这样做时:
kubectl描述po / wp
Name: wp
Namespace: default
Priority: 0
Node: node3/192.168.50.12
Start Time: Mon, 13 Jan 2020 23:27:16 +0100
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.233.92.7
IPs:
IP: 10.233.92.7
Containers:
我的问题是我无法访问该应用程序:
wget http://192.168.50.12:8080/wp-admin/install.php
Connecting to 192.168.50.12:8080... failed: Connection refused.
两个都没有http://10.233.92.7:8080/wp-admin/install.php 可以
广告连播说明或部署过程中是否存在任何问题?
谢谢
答案 0 :(得分:2)
在当前设置下,您需要在群集内使用wget http://10.233.92.7:8080/wp-admin/install.php
,即,对另一个容器执行kubectl exec
,因为10.233.92.7
IP仅在群集内有效。
您应该创建一个service来暴露您的广告连播。创建一个群集IP类型服务(默认)以从群集内部进行访问。如果要从群集外部(即从桌面)访问,请创建NodePort或LoadBalancer类型的服务。
从桌面访问应用程序的其他方法是port forwarding。在这种情况下,您无需创建服务。
这里是accessing pods using NodePort service的教程。在这种情况下,您的节点需要有公共IP。
答案 1 :(得分:0)
您的配置存在问题,因为缺少服务,因此无法从外部访问您的WordPress
。
有很多材料说明了哪些选择以及它们如何与Kubernetes所使用的基础架构严格连接。
让我详细说明其中的三个:
WordPress
配置的基础在每种情况下都是相同的。
Kubernetes网站上有一个很好的教程:HERE!
作为Kubernetes的官方文档:
Kubernetes
secret
对象使您可以存储和管理敏感信息,例如密码,OAuth令牌和ssh密钥。将该信息放入Pod定义或container image中,比逐字放置在secret
中更为安全和灵活。
下面的示例是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
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
窗格:
- 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
窗格。
它将创建一个DNS条目,其名称为wordpress-mysql
和容器的IP地址。
由于不需要,它不会暴露给外部流量。
通过命令$ kubectl apply -f FILE_NAME
应用它。
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
的{{1}}定义,如下所示:
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
暴露给外部流量:
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
IP地址以及相应的Web浏览器端口。
可以使用以下命令找到此端口:
minikube
以上命令的输出:
$ kubectl get svc wordpress-nodeport
在这种情况下为wordpress-nodeport NodePort 10.76.9.15 <none> 80:30173/TCP 8s
。
In this case it will create NodePort also!
30173
请参考以下链接:Minikube: create-an-ingress-resource
您也可以参考此Stack Overflow post
apiVersion: v1
kind: Service
metadata:
name: wordpress-loadbalancer
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
提供的Kubernetes集群有:
配置过程与kubeadm
中的相同。唯一的不同是,它将在集群中的每个节点上的每个节点上创建minikube
。之后,您可以输入具有适当端口的任何节点的IP地址。请注意,您将需要处于同一网络中,而防火墙不会阻止您的访问。
您可以使用与NodePort
中相同的LoadBalancer
定义来创建YAML
对象。问题在于,在裸机群集上配置minikube
时,kubeadm
将无法获得IP地址。选项之一是:MetalLB
入口资源与LoadBalancer
设置的基础架构中的LoadBalancer
存在相同的问题。如上所述,其中一个选项是:MetalLB。
Kubernetes可以使用许多与云严格相关的选项。以下是在GKE上使用NGINX控制器配置kubeadm
资源的示例:
同时应用两个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
中的NodePort
定义
创建Ingress资源:
minikube
通过命令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
的{{1}}个供应群集。