kubectl无法访问Pod应用程序

时间:2020-01-15 10:19:22

标签: mysql wordpress kubernetes

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 可以

广告连播说明或部署过程中是否存在任何问题?

谢谢

2 个答案:

答案 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所使用的基础架构严格连接。

让我详细说明其中的三个:

  • minikube
  • kubeadm
  • 已配置云(GKE,EKS,AKS)

WordPress配置的基础在每种情况下都是相同的。

目录:

  • 运行MySQL
    • 秘密
    • PersistentVolumeClaim
    • 部署
    • 服务
  • 运行WordPress
    • PersistentVolumeClaim
    • 部署
  • 允许外部访问
    • minikube
    • kubeadm
    • 已配置云(GKE)

Kubernetes网站上有一个很好的教程:HERE!

运行MySQL

秘密

作为Kubernetes的官方文档:

Kubernetes secret对象使您可以存储和管理敏感信息,例如密码,OAuth令牌和ssh密钥。将该信息放入Pod定义或container image中,比逐字放置在secret中更为安全和灵活。

-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窗格:

        - 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应用它。

运行WordPress

持久体积声明

MySQLWordPress都需要专用的空间来存储数据。使用以下示例创建它:

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 应用它。

允许外部访问

有许多不同的方法可以配置对应用程序的外部访问。

Minikube

不同的管理程序之间的配置可能有所不同。

例如$ kubectl apply -f FILE_NAME可以通过以下方式将Minikube暴露给外部流量:

NodePort

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

LoadBalancer

In this case it will create NodePort also!

30173

入口资源

请参考以下链接:Minikube: create-an-ingress-resource

您也可以参考此Stack Overflow post

Kubeadm

apiVersion: v1 kind: Service metadata: name: wordpress-loadbalancer labels: app: wordpress spec: ports: - port: 80 selector: app: wordpress tier: frontend type: LoadBalancer 提供的Kubernetes集群有:

NodePort

配置过程与kubeadm中的相同。唯一的不同是,它将在集群中的每个节点上的每个节点上创建minikube。之后,您可以输入具有适当端口的任何节点的IP地址。请注意,您将需要处于同一网络中,而防火墙不会阻止您的访问。

LoadBalancer

您可以使用与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

从上述命令输入IP地址后,您应该获得: WordPress web browser first use

云供应示例可用于配置了NAME HOSTS ADDRESS PORTS AGE ingress * XXX.XXX.XXX.X 80 26m 的{​​{1}}个供应群集。