美文网首页
在 K8S 中部署一个应用 上

在 K8S 中部署一个应用 上

作者: 阿兵云原生 | 来源:发表于2023-06-18 22:47 被阅读0次

    [图片上传失败...(image-b936d9-1687186002049)]

    本身在 K8S 中部署一个应用是需要写 yaml 文件的,我们这次简单部署,通过拉取网络上的镜像来部署应用,会用图解的方式来分享一下,过程中都发生了什么

    简单部署一个程序

    我们可以通过 kubectl run 的方式来简单部署一个应用,现在我们先不关心里面的 yaml 结构和具体的配置,先运行起来,看看效果

    kubectl run mykubia --image=luksa/kubia --port=9999 --generator=run/v1,执行该命令,就可以创建一个容器,并运行起来

    $ kubectl get pods
    NAME      READY   STATUS    RESTARTS   AGE
    mykubia   1/1     Running   0          63s
    

    可以看到 我们的 mykubia 应用已经运行起来的,我们可以通过命令 kubectl logs -f mykubia查看日志

    [图片上传失败...(image-509771-1687186002049)]

    在上命令中,解释一下:

    • --image=luksa/kubia

    指定一个要运行的容器镜像

    • --port=9999

    指的是我们指定服务运行的端口号是 9999

    • --generator=run/v1

    加上这个标志指的是 让 k8s 集群创建一个 ReplicationController ,而不是一个 Deployment

    pod 是什么

    在 K8S 中,一个 pod 是一组紧密相关的容器,它们总是运行在同一个工作节点上面,他们有着同样的 Linux 命名空间

    [图片上传失败...(image-80e8e8-1687186002049)]

    每一个 pod 就像是一个独立的逻辑机器,他有这些资源:

    • 自己的 IP
    • 主机名
    • 进程
    • 能够运行一个独立的应用程序

    这里面运行的应用程序可以是单进程的,运行在单个容器中,每一个进程都会在自己的容器运行

    如上图,每一个 pod 都会有自己的 IP,一个 pod 会包含 1 个或者多个 容器,多个 pod 也会分布在不同的工作节点上面

    从执行命令到容器运行背后都发生了哪些动作?

    [图片上传失败...(image-fc6a2c-1687186002049)]

    从程序员敲入命令到实际服务运行可以简单的分成 8 个步骤,如上图:

    • 1

    构建镜像,必须先要把 镜像推送到 Docker Hub 上面,这一步是 执行 docker push luksa/kubia

    • 2

    docker 服务器将镜像推送到 docker hub 中

    • 3

    kubectl 收到指令,kubectl run mykubia --image=lukia/kubia --port=9999

    • 4

    kubectl 想 REST API 服务器发送请求,请求调度

    • 5

    主节点收到请求后,创建 Pod ,并调度到工作节点

    • 6

    工作节点收到主节点的调度通知

    • 7

    工作节点 使用 kubelet 指令告诉自己环境中 docker 要运行镜像了

    • 8

    工作节点的 docker 于是就向 Docker Hub 拉取镜像,运行

    最终,呈现出来的就是,我们通过指令 kubectl get pods 的时候,就可以看到我们的 pod 在运行了

    外部如何访问 pod 中的服务?

    我们如何在外部访问在 pod 运行中的服务呢?

    我们可以通过指令:kubectl get pods -o wide 查看更多详细信息

    [图片上传失败...(image-9ede2b-1687186002049)]

    虽然说每一个 pod 都有一个自己的 IP,但是这个 IP 只有在集群内部才可以访问的,在外部是没有办法访问的

    我们在内部访问内部肯定是没有问题的

    [图片上传失败...(image-a2f6c7-1687186002049)]

    curl 一下 这个 ip 例如,curl 172.18.0.6:8080

    要从外部访问内部的 pod 中的服务,我们可以创建一个特殊的 LoadBalancer 类型的服务(service)

    创建一个服务对象

    我们创建的这个服务对象,外部就可以访问到内部 pod 中的服务了

    我们必须是要创建 LoadBalancer 类型的服务才可以,如果我们创建 ClusterIP 类型的服务也是不行的,

    ClusterIP 类型的服务 是 K8S 内部默认的类型,默认只能在内部互相访问,外部是无法访问的

    我们可以执行如下指令:

    kubectl expose rc mykubia --type=LoadBalancer --name kubia-http

    • rc mykubia

    指的是要告诉 k8s 我们之前创建的 ReplicationController

    此处的 rc 是 ReplicationController 的缩写

    • --type=LoadBalancer

    执行类型为 LoadBalancer ,指定为 LoadBalancer 类型后,将会创建一个外部的负载均衡服务,外部可以通过这个服务的 ip 来访问到内部的 pod

    查看服务

    我们可以通过 kubectl get services 来查看服务列表

    [图片上传失败...(image-4fab14-1687186002049)]

    查看服务列表的时候,我们可以看到 EXTERNAL-IP 部分,刚开始是显示 <pending> ,不过不要着急,我们稍微等 1 分钟的样子, K8S 就会给我们分配好这个服务的 外部 IP 了

    当有了明确的外部 IP, 那么外部就可以通过该 IP 来访问我们的内部服务了

    当然,如果你现在在使用的还是 minikube ,也是可以这样来玩的

    因为 minikube 上面是单节点集群的,我们可以敲入指令:minikube service kubia-http

    [图片上传失败...(image-e61226-1687186002049)]

    就可以看到如上信息,我们就可以通过这个 ip 来访问这个服务了

    今天就到这里,学习所得,若有偏差,还请斧正

    欢迎点赞,关注,收藏

    朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

    [图片上传失败...(image-686a05-1687186002049)]

    好了,本次就到这里

    技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

    我是阿兵云原生,欢迎点赞关注收藏,下次见~

    相关文章

      网友评论

          本文标题:在 K8S 中部署一个应用 上

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