【问题标题】:kubectl cannot acces pod applicationkubectl 无法访问 pod 应用程序
【发布时间】:2020-01-28 18:44:02
【问题描述】:

A 有这个 pod 规格:

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 create -f wordpress-pod.yaml

现在它已正确部署:

kubectl 获取 pod wp 2/2 运行 3 35h

然后当我这样做时:

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.

wget http://10.233.92.7:8080/wp-admin/install.php 都不行 作品

pod 描述或部署过程中是否有任何问题?

谢谢

【问题讨论】:

  • 这个集群云有提供吗?是 minikube 环境吗?

标签: mysql wordpress kubernetes


【解决方案1】:

根据您当前的设置,您需要在集群内使用 wget http://10.233.92.7:8080/wp-admin/install.php,即通过在另一个 pod 中执行 kubectl exec,因为 10.233.92.7 IP 仅在集群内有效。

您应该创建一个 service 来公开您的 pod。创建集群 IP 类型服务(默认),以便从集群内部访问。如果您想从集群外部(即从您的桌面)访问,请创建 NodePort 或 LoadBalancer 类型的服务。

从桌面访问应用程序的其他方式是port forwarding。在这种情况下,您不需要创建服务。

这是accessing pods using NodePort service 的教程。在这种情况下,您的节点需要有公共 ip。

【讨论】:

    【解决方案2】:

    您的配置存在的问题是缺少允许外部访问您的WordPress 的服务。

    有很多材料解释了哪些选项以及它们如何与 Kubernetes 工作的基础设施严格连接。

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

    • minikube
    • kubeadm
    • 云配置(GKE、EKS、AKS)

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

    目录:

    • 运行 MySQL
      • 秘密
      • PersistentVolumeClaim
      • 部署
      • 服务
    • 运行 WordPress
      • PersistentVolumeClaim
      • 部署
    • 允许外部访问
      • 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

    部署

    创建YAMLWordPress 定义,如下例所示:

    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

    入口

    入口资源与LoadBalancerkubeadm 配置的基础架构中存在相同的问题。如上一个选项是: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 地址后,你应该得到:

    云配置示例可用于配置MetalLBkubeadm 配置集群。

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 2022-01-06
      • 2021-01-03
      • 2018-05-15
      • 2017-08-30
      • 2020-07-06
      • 1970-01-01
      • 2022-06-16
      • 2021-09-07
      相关资源
      最近更新 更多