在 MacOS 上使用 minikube 测试 Kubernetes

Testing Kubernetes using minikube on MacOS

我有一个简单的 REST 应用程序,我想将其部署到 kubernetes 中。 在我部署到云提供商环境之前,我想使用 minikube 在本地进行测试。这是我的设置:

---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: example
  spec:
    replicas: 3
    selector:
      matchLabels:
        name: example
    template:
      metadata:
        labels:
          name: example
      spec:
        containers:
        - name: application
          image: 1ijk/example
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000

---
  apiVersion: v1
  kind: Service
  metadata:
    name: example
  spec:
    type: NodePort
    ports:
    - name: http
      port: 80
      targetPort: 3000
    selector:
      name: example

以及我如何调用它

$ minikube start --driver=hyperkit
[ output omitted ]
$ kubectl apply -f deployment.yml
deployment.apps/example created
ingress.extensions/example-ingress created
$ kubectl get service example
NAME           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
example        NodePort   10.100.198.224   <none>        3000:32275/TCP   4s
minikube service example --url
http://192.168.64.2:32275
$ minikube service example
|-----------|---------|-------------|---------------------------|
| NAMESPACE |  NAME   | TARGET PORT |            URL            |
|-----------|---------|-------------|---------------------------|
| default   | example | http/80     | http://192.168.64.2:31726 |
|-----------|---------|-------------|---------------------------|
  Opening service default/example in default browser...

但是浏览器无法连接。我已验证应用程序二进制文件及其容器映像均正常运行。我似乎遗漏了 minikube 上的一部分 kubernetes 设置,我看到的所有教程都假设使用 LoadBalancer 服务类型进行云部署。

如何使用 minikube 在本地测试这个简单的 kubernetes 应用程序?


更新

这是服务说明

$ kubectl describe service example
Name:                     example
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"example","namespace":"default"},"spec":{"ports":[{"name":"http","...
Selector:                 name=example
Type:                     NodePort
IP:                       10.107.95.114
Port:                     http  80/TCP
TargetPort:               3000/TCP
NodePort:                 http  31726/TCP
Endpoints:
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

在绕过 yml 文件并使用 cli 像这样创建部署和服务之后

kubectl create deployment example --image=1ijk/example
kubectl expose deployment example --type=LoadBalancer --port=8080 --target-port=3000

我得到了这样的服务设置

$ kubectl describe service example
Name:                     example
Namespace:                default
Labels:                   app=example
Annotations:              <none>
Selector:                 app=example
Type:                     LoadBalancer
IP:                       10.100.117.7
Port:                     <unset>  8080/TCP
TargetPort:               3000/TCP
NodePort:                 <unset>  31683/TCP
Endpoints:                172.17.0.10:3000,172.17.0.5:3000,172.17.0.7:3000
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

结果相同

最终更新:请参阅下面答案中指导调试过程的评论

问题是 不是 与 kubernetes 的问题——这是我的应用程序的问题!我错误地将 go 服务器绑定到 "127.0.0.1:3000" 而不是 ":3000" :faceplam:。在不指定 IP 的情况下绑定到端口允许在所有容器网络接口上访问应用程序服务器:)

服务端点未显示 POD IPs.You 需要通过 LoadBalancer 类型服务公开 pods。不要使用服务 yaml,而是使用下面的命令。

kubectl expose deployment example --type=LoadBalancer --port=8080 --target-port=3000

然后您可以通过以下命令获取 url 并使用它浏览器访问应用程序。

minikube service example

编辑:

go 应用程序有一个绑定到 127.0.0.1 的地址的硬编码值。由于硬编码,它也无法从集群内部访问,这已由 curl 验证从 cluster.Removing 上的另一个 pod 10.100.117.7:3000 硬编码解决了问题。

https://kubernetes.io/docs/tutorials/hello-minikube/