2016-09-19 58 views
1

我有点困难搞清楚留言簿示例是否在Minikube工作。我的主要问题可能是示例说明here详细说明了所有步骤,但没有关于如何从默认YAML文件运行后如何连接到Web应用程序的指示。在minikube留言簿示例

我使用Minikube v 0.10.0在Mac OS X 10.9.5(小牛),这就是我最终结束了(这似乎还不错,根据我从示例文件读取):

PolePro:all-in-one poletti$ kubectl get svc 
NAME   CLUSTER-IP EXTERNAL-IP PORT(S) AGE 
frontend  10.0.0.140 <none>  80/TCP  8s 
kubernetes  10.0.0.1  <none>  443/TCP 2h 
redis-master 10.0.0.165 <none>  6379/TCP 53m 
redis-slave 10.0.0.220 <none>  6379/TCP 37m 

PolePro:all-in-one poletti$ kubectl get deployments 
NAME   DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
frontend  3   3   3   3   20s 
redis-master 1   1   1   1   42m 
redis-slave 2   2   2   2   37m 

PolePro:all-in-one poletti$ kubectl get pods 
NAME       READY  STATUS RESTARTS AGE 
frontend-708336848-0h2zj  1/1  Running 0   29s 
frontend-708336848-ds8pn  1/1  Running 0   29s 
frontend-708336848-v8wp9  1/1  Running 0   29s 
redis-master-2093957696-or5iu 1/1  Running 0   43m 
redis-slave-109403812-12k68  1/1  Running 0   37m 
redis-slave-109403812-c7zmo  1/1  Running 0   37m 

我想我可能会连接到http://10.0.0.140:80/(即frontend地址和端口用如上述kubectl get svc返回),并看到应用程序运行,但我得到一个Connection refused

PolePro:all-in-one poletti$ curl -v http://10.0.0.140:80 
* About to connect() to 10.0.0.140 port 80 (#0) 
* Trying 10.0.0.140... 
* Adding handle: conn: 0x7fb0f9803a00 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x7fb0f9803a00) send_pipe: 1, recv_pipe: 0 
* Failed connect to 10.0.0.140:80; Connection refused 
* Closing connection 0 
curl: (7) Failed connect to 10.0.0.140:80; Connection refused 

虽然这个例子的描述错过了这样一个重要的步骤,但有点怀疑。我错过了什么?

回答

1

嗯,看来我理解了它自己(我可能会发送一个PR太)

更主要的是,至少在Minikube设置中,kubectl命令在Mac OS X上运行,但所有很酷的东西都发生在虚拟机器中。在我的情况下,它是一个VirtualBox虚拟机(我仍然在小牛队)。

kubectl显示了服务的地址,像在这种情况下:

PolePro:all-in-one poletti$ kubectl get svc 
NAME   CLUSTER-IP EXTERNAL-IP PORT(S) AGE 
frontend  10.0.0.140 <none>  80/TCP  8s 
kubernetes  10.0.0.1  <none>  443/TCP 2h 
redis-master 10.0.0.165 <none>  6379/TCP 53m 
redis-slave 10.0.0.220 <none>  6379/TCP 37m 

这些地址是从节点中访问,不一定是从外面。在我的情况下,他们是而不是从外面访问。

那么你能做些什么呢?

首先,要核对一下它的实际运行,您可以登录到该节点,并从那里卷曲运行:

# get the list of nodes, to get the name of the node we're interested into 
PolePro:all-in-one poletti$ kubectl get nodes 
NAME  STATUS AGE 
minikube Ready  3h 

# that was easy. Now we can get the address of the node 
PolePro:all-in-one poletti$ kubectl describe node/minikube | grep '^Address' 
Addresses:  192.168.99.100,192.168.99.100 

# now we can log into the node. The username is "docker", the password is "tcuser" 
# by default (without quotes): 
PolePro:all-in-one poletti$ ssh [email protected] 
[email protected]'s password: 
         ##   . 
        ## ## ##  == 
       ## ## ## ## ## === 
      /"""""""""""""""""\___/ === 
     ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~/===- ~~~ 
      \______ o   __/ 
      \ \   __/ 
       \____\_______/ 
_     _ ____  _   _ 
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ 
| '_ \/_ \/_ \| __| __)/_` |/ _ \/__| |//_ \ '__| 
| |_) | (_) | (_) | |_/__/ (_| | (_) | (__| < __/ | 
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| 
Boot2Docker version 1.11.1, build master : 901340f - Fri Jul 1 22:52:19 UTC 2016 
Docker version 1.11.1, build 5604cbe 
[email protected]:~$ curl -v http://10.0.0.140/ 
* Trying 10.0.0.140... 
* Connected to 10.0.0.140 (10.0.0.140) port 80 (#0) 
> GET/HTTP/1.1 
> Host: 10.0.0.140 
> User-Agent: curl/7.49.1 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Date: Mon, 19 Sep 2016 13:37:56 GMT 
< Server: Apache/2.4.10 (Debian) PHP/5.6.20 
< Last-Modified: Wed, 09 Sep 2015 18:35:04 GMT 
< ETag: "399-51f54bdb4a600" 
< Accept-Ranges: bytes 
< Content-Length: 921 
< Vary: Accept-Encoding 
< Content-Type: text/html 
< 
<html ng-app="redis"> 
    <head> 
    <title>Guestbook</title> 
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script> 
    <script src="controllers.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.0/ui-bootstrap-tpls.js"></script> 
    </head> 
    <body ng-controller="RedisCtrl"> 
    <div style="width: 50%; margin-left: 20px"> 
     <h2>Guestbook</h2> 
    <form> 
    <fieldset> 
    <input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br> 
    <button type="button" class="btn btn-primary" ng-click="controller.onRedis()">Submit</button> 
    </fieldset> 
    </form> 
    <div> 
     <div ng-repeat="msg in messages track by $index"> 
     {{msg}} 
     </div> 
    </div> 
    </div> 
    </body> 
</html> 
* Connection #0 to host 10.0.0.140 left intact 

耶!实际上,有这个运行在端口80

反正东西,这仍然是一个有点麻烦,我们希望看到这个在Mac OS X在浏览器中做到这一点是使用NodePort使节点图的一种方法服务端口到节点的端口;这是通过添加在frontend服务定义如下行,成为:

apiVersion: v1 
kind: Service 
metadata: 
    name: frontend 
    labels: 
    app: guestbook 
    tier: frontend 
spec: 
    # if your cluster supports it, uncomment the following to automatically create 
    # an external load-balanced IP for the frontend service. 
    # type: LoadBalancer 
    type: NodePort 
    ports: 
    # the port that this service should serve on 
    - port: 80 
    selector: 
    app: guestbook 
    tier: frontend 

这种变化可能在任何frontend-service.yamlall-in-one/frontend.yamlall-in-one/guestbook-all-in-one.yaml请求,这取决于你的文件正在使用。

如果你重新创建整个留言(我不知道这是否是必要的,但我会留在安全的地方),你会得到一个有关端口和防火墙的消息,像这样:

# delete previous instance to start from "scratch" 
PolePro:all-in-one poletti$ kubectl delete deployments,svc -l 'app in (redis, guestbook)' 
deployment "frontend" deleted 
deployment "redis-master" deleted 
deployment "redis-slave" deleted 
service "frontend" deleted 
service "redis-master" deleted 
service "redis-slave" deleted 

# we'll use the all-in-one here to get quickly to the point 
PolePro:all-in-one poletti$ vi guestbook-all-in-one.yaml 

# with the new NodePort change in place, we're ready to start again 
PolePro:all-in-one poletti$ kubectl create -f guestbook-all-in-one.yaml 
service "redis-master" created 
deployment "redis-master" created 
service "redis-slave" created 
deployment "redis-slave" created 
You have exposed your service on an external port on all nodes in your 
cluster. If you want to expose this service to the external internet, you may 
need to set up firewall rules for the service port(s) (tcp:30559) to serve traffic. 

See http://releases.k8s.io/release-1.3/docs/user-guide/services-firewalls.md for more  details. 
service "frontend" created 
deployment "frontend" created 

现在,节点上的端口30559映射到前端端口80,所以我们可以打开浏览器的地址http://192.168.99.100:30559/(即http://<NODE-IP>:<EXTERNAL-PORT>/),我们可以使用留言簿!

+0

人们也可以使用'kubectl expose'命令以暴露端口,而不必修改服务YAML配置。通常情况下,我在集群中查看事物的方式是使用busybox容器,如[此处]所示(http://blog.kubernetes.io/2015/10/some-things-you-didnt-know-about -kubectl_28.html)。如果这个例子没有充分证明服务类型和使用各种效果的差异,请给我们一个PR。谢谢! –

1

快速和脏: kubectl port-forward frontend-708336848-0h2zj 80:80