美文网首页
在K8S上跑一个helloworld

在K8S上跑一个helloworld

作者: 中v中 | 来源:发表于2020-08-20 11:18 被阅读0次

    简单介绍

    今天使用Docker+Kubernetes搭建一个简单的Hello World Node.js应用程序。

    实际操作

    1、按照教程安装Docker+Kubernetes for Mac


    图片.png

    docker version


    图片.png

    k8s verison

    图片.png

    Kubernetes版本

    由此Docker+Kubernetes安装成功,属于mac的单机master node。

    2、编写node.js应用程序

    将此代码保存在以文件名命名hellonode 的文件夹中server.js:

        var http = require('http');
        var handleRequest = function(request, response) {
            console.log('Received request for URL: ' + request.url);
            response.writeHead(200);
            response.end('Hello World!');
        };
            var www = http.createServer(handleRequest);
            www.listen(8080);
    

    这可以先试用node server.js来运行一下,应该能够在http:// localhost:8080 /上看到“Hello World!”消息。按Ctrl-C停止正在运行的Node.js服务器。

    3、将应用程序打包到Docker容器中

    这里需要使用Dockerfile文件来创建容器,在server.js文件夹内创建Dockerfile文件,如下:

        FROM node:6.9.2
        EXPOSE 8080
        COPY server.js .
        CMD node server.js
    

    Docker镜像的这个配置从Docker注册表中的官方Node.js LTS镜像开始,公开端口8080,将server.js文件复制到镜像并启动Node.js服务器。

    4、使用build指令根据Dockerfile文件创建镜像

    使用Docker守护进程构建Docker镜像(注意最后的相对目录点 .):

    docker build -t hello-node:v1 .

    5、创建部署

    Kubernetes Pod是一个由一个或多个容器组成的组合,用于管理和联网。本教程中的Pod只有一个Container。Kubernetes 部署会检查Pod的运行状况,并在Pod终止时重新启动Pod的容器。部署是管理Pod的创建和扩展的推荐方法。

    使用该kubectl run命令创建管理Pod的Deployment。Pod根据hello-node:v1Docker镜像运行Container 。将 --image-pull-policy标志设置Never为始终使用本地映像,而不是从Docker注册表中提取它(因为您还没有将它推到那里):

    kubectl run hello-node --image=hello-node:v1 --port=8080 --image-pull-policy=Never

    查看部署:

    kubectl get deployments

    输出:

    image

    查看Pod:

    kubectl get pods

    输出:

    image

    6、创建服务

    默认情况下,Pod只能通过Kubernetes集群中的内部IP地址访问。要从hello-node Kubernetes虚拟网络外部访问Container,须将Pod公开为Kubernetes 服务。可以使用以下kubectl expose命令将Pod公开到公共Internet :

    kubectl expose deployment hello-node --type=LoadBalancer

    查看刚刚创建的服务:

    kubectl get services

    输出:

    image

    --type=LoadBalancer标志表示在群集外部公开的服务。

    7、使用本地IP地址自动打开浏览器窗口,并显示“Hello World”消息。

    image

    8、更新应用

    编辑server.js文件以返回新消息,修改hello word那行:

    response.end('Hello World Again!');

    9、重新构建版本的镜像

    docker build -t hello-node:v2 .

    10、更新部署的镜像:

    kubectl set image deployment/hello-node hello-node=hello-node:v2

    image

    11、再次运行您的应用以查看新消息:

    image

    12、Kubernetes仪表盘

    image

    参考:https://www.cnblogs.com/April-Chou-HelloWorld/p/9425151.html

    ------------------ 跑一个nginx demo---------

    Nginx 示例

    跑一个 Nginx container 来看看整个过程:

    $ kubectl run hello-nginx --image=nginx --port=80
    deployment “hello-nginx” created
    这里会报一个kubectl run 命令即将废弃的错误,忽略,命令已经执行了
    

    这行命令创建了一个 deployment,该 deployment 会创建一个 pod,pod 负责运行 container:

    $ kubectl get pods
    NAME                          READY     STATUS              RESTARTS   AGE
    hello-nginx-556b7bf96-2xw8f   0/1       ContainerCreating   0          12s
    

    等几秒钟,再看 Dashboard 的 Deployments:

    图片.png

    当 Pods 由 0/1 变成 1/1 的时候, 刚才的命令结果也变成 Running 了

    $ kubectl get pods
    NAME                          READY     STATUS    RESTARTS   AGE
    hello-nginx-556b7bf96-2xw8f   1/1       Running   0          4m
    

    点侧边栏的 Pod,再点我们刚创建的 Pod “hello-nginx-556b7bf96-2xw8f”,能看到这个 pod 的细节:


    图片.png

    这里能看到给定的默认 labels,和分配的 IP (来此 docker-for-desktop Node)。

    右上角的这几个按钮也是我们经常用的功能,EXEC 打开一个浏览器中的 shell ssh 进入 pod,LOGS 查看日志。

    图片.png

    同样的,我们也可以通过 kubectl describe node/pod 命令来查看信息,如下:

    $ kubectl describe pod hello-nginx-556b7bf96-2xw8f
    Name:           hello-nginx-556b7bf96-2xw8f
    Namespace:      default
    Node:           docker-for-desktop/192.168.65.3
    Start Time:     Tue, 20 Feb 2018 22:34:19 -0800
    Labels:         pod-template-hash=112636952
     run=hello-nginx
    Annotations:    <none>
    Status:         Running
    IP:             10.1.0.54
    Controlled By:  ReplicaSet/hello-nginx-556b7bf96
    Containers:
     hello-nginx:
     Container ID:   docker://5c5f68348ed8a204dcce089a21d71e36cbfdb6c7955fd28a7f148d5f44662861
     Image:          nginx
     Image ID:       docker-pullable://nginx@sha256:65f0ed5362b39c16cad51f27217c12ac9dd0db4dc47b0197969885f05198d4d8
     Port:           80/TCP
     State:          Running
     Started:      Tue, 20 Feb 2018 22:34:37 -0800
     Ready:          True
     Restart Count:  0
     Environment:    <none>
     Mounts:
     /var/run/secrets/kubernetes.io/serviceaccount from default-token-m99ws (ro)
    Conditions:
     Type           Status
     Initialized    True
     Ready          True
     PodScheduled   True
    Volumes:
     default-token-m99ws:
     Type:        Secret (a volume populated by a Secret)
     SecretName:  default-token-m99ws
     Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
     Type    Reason                 Age   From                         Message
     ----    ------                 ----  ----                         -------
     Normal  Scheduled              15m   default-scheduler            Successfully assigned hello-nginx-556b7bf96-2xw8f to docker-for-desktop
     Normal  SuccessfulMountVolume  15m   kubelet, docker-for-desktop  MountVolume.SetUp succeeded for volume "default-token-m99ws"
     Normal  Pulling                15m   kubelet, docker-for-desktop  pulling image "nginx"
     Normal  Pulled                 15m   kubelet, docker-for-desktop  Successfully pulled image "nginx"
     Normal  Created                15m   kubelet, docker-for-desktop  Created container
     Normal  Started                15m   kubelet, docker-for-desktop  Started container
    

    通过外部访问

    可以用 port-forward pod 来实现外部访问:

    $ kubectl get pods
    NAME                          READY     STATUS    RESTARTS   AGE
    hello-nginx-556b7bf96-2xw8f   1/1       Running   0          46m
    
    $ kubectl port-forward hello-nginx-556b7bf96-2xw8f 8080:8080
    Forwarding from 127.0.0.1:8080 -> 8080
    

    但这只暴露特定 pod 的端口,在实际中并不实用。

    所以我们换一个方法,把 deployment 暴露成一个服务,供外部访问:

    $ kubectl get deployment
    NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    hello-nginx   1         1         1            1           18m
    
    $ kubectl expose deployment hello-nginx --type=NodePort --name=hello-nginx-service
    service "hello-nginx-service" exposed
    
    $ kubectl get service
    NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                         AGE
    hello-nginx-service   NodePort    10.109.0.203   <none>        80:30351/TCP                                    30s
    kubernetes            ClusterIP   10.96.0.1      <none>        443/TCP                                         10d
    

    现在,浏览器里就能访问 localhost:30351 了。

    相关文章

      网友评论

          本文标题:在K8S上跑一个helloworld

          本文链接:https://www.haomeiwen.com/subject/jnwwdktx.html