您现在的位置是:首页 >技术交流 >研发工程师玩转Kubernetes——部署应用网站首页技术交流

研发工程师玩转Kubernetes——部署应用

breaksoftware 2024-06-17 10:43:23
简介研发工程师玩转Kubernetes——部署应用

Kubernetes是容器的管理编排工具,而容器则是程序的载体。我们先在Docker上部署应用,然后再在kubernetes上部署,并对它们进行对比学习。

Docker部署应用

查看运行中的容器

docker ps

可以看到下面的表头,此时没有一个运行中的容器。

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

部署应用

docker run --name nginx-container -p 80:80 -d nginx

–name nginx-container表示启动的容器名称是nginx-container。
-p 80:80表示将容器中的80端口和本机的80端口映射,这儿的-p 对应于–publish,而不是port。
-d 表示detach,即在后台运行该容器。
最后一个nginx参数是镜像名称。

Unable to find image ‘nginx:latest’ locally
latest: Pulling from library/nginx
9e3ea8720c6d: Pull complete
bf36b6466679: Pull complete
15a97cf85bb8: Pull complete
9c2d6be5a61d: Pull complete
6b7e4a5c7c7a: Pull complete
8db4caa19df8: Pull complete
Digest: sha256:480868e8c8c797794257e2abd88d0f9a8809b2fe956cbfbc05dcc0bca1f7cd43
Status: Downloaded newer image for nginx:latest
deae7732c6856ccb9aab86ef8d5254180354726de9f2afea451224051e1b9e90

由于本地没有nginx镜像,docker就会从服务器上拉取。最后一行输出的容器ID。

查看容器

我们再使用docker ps来查看容器,可以看到

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
deae7732c685nginx“/docker-entrypoint.…”4 minutes agoUp 4 minutes0.0.0.0:80->80/tcp, :::80->80/tcpnginx-container

我们在ubuntu desktop上访问本机IP,可以看到nginx被启动了。
在这里插入图片描述

停止/删除容器

在上一步我们可以得到容器的ID是deae7732c685。通过这个ID我们便可以先停止容器,然后再删除它。

docker stop deae7732c685
docker rm deae7732c685

Kubernetes部署应用

Kubernetes虽然是容器管理工具,但是它最小可创建、管理和部署的计算单元叫Pod。一个Pod里可以有多个容器,一个Pod只能在一个Node里(后面会介绍,可以理解为一台虚拟机或者物理机)。
Pod
在这里插入图片描述

创建Pod

运行下面的指令可以创建一个名字是nginx的Pod,这个Pod下有一个容器,名字也是nginx。这些都是由kubectl run后的名字决定的。

kubectl run nginx --image=nginx --port=80

–image=nginx表示我们使用名字叫nginx镜像来创建容器。
–port=80表示容器对外暴露80端口,即可以通过Pod的IP+该端口访问服务。
Pod

查看Pod

下面指令可以查看所有pod信息

kubectl describe pods
Name:             nginx
Namespace:        default
Priority:         0
Service Account:  default
Node:             fangliang-virtual-machine/172.30.45.36
Start Time:       Thu, 18 May 2023 14:05:47 +0800
Labels:           run=nginx
Annotations:      cni.projectcalico.org/containerID: 43082ecdeaa830f47c46d84230c2c15f4fc80eb3c023f2e8f58aeed65386f92e
                  cni.projectcalico.org/podIP: 10.1.62.159/32
                  cni.projectcalico.org/podIPs: 10.1.62.159/32
Status:           Running
IP:               10.1.62.159
IPs:
  IP:  10.1.62.159
Containers:
  nginx:
    Container ID:   containerd://acf18704cd51e293363dbbed13b0f2a2066c5f5ab10e7ee153fcfbc92082b3e9
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:480868e8c8c797794257e2abd88d0f9a8809b2fe956cbfbc05dcc0bca1f7cd43
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 18 May 2023 14:05:51 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qtp6d (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-qtp6d:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  6s    default-scheduler  Successfully assigned default/nginx to fangliang-virtual-machine
  Normal  Pulling    6s    kubelet            Pulling image "nginx"
  Normal  Pulled     2s    kubelet            Successfully pulled image "nginx" in 3.616958719s (3.616963519s including waiting)
  Normal  Created    2s    kubelet            Created container nginx
  Normal  Started    2s    kubelet            Started container nginx

此时我们只能使用Pod的IP(10.1.62.159)访问nginx服务,而不能使用Node的IP(172.30.45.36)。
在这里插入图片描述

部署Service

为了能通过本机的IP访问服务,我们需要创建kubernetes的另外一个核心功能——Service。

 kubectl expose pod nginx --target-port=80 --type=NodePort --name=nginx-service

kubectl expose用于将资源暴露为新的Kubernetes Service。这儿我们直接暴露名字是nginx的pod,并通过–target-port=80参数让流向Kubernetes Service的流量流向上述pod的80端口。其中–type=NodePort表示,Kubernetes Service是NodePort类型,这样我们就可以通过本机IP访问容器里的nginx了。–name=nginx-service用于指定新创建的Kubernetes Service的名称。

查看Node对外提供服务的端口

kubectl describe service nginx-service
Name:                     nginx-service
Namespace:                default
Labels:                   run=nginx
Annotations:              <none>
Selector:                 run=nginx
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.152.183.121
IPs:                      10.152.183.121
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31976/TCP
Endpoints:                10.1.62.161:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

在NodePort处,我们看到开放的端口是31976。我们必须使用这个端口去访问Service,它会把流量转向nginx所在Pod的80端口。
在这里插入图片描述

删除Service

kubectl delete service nginx-service 

fangliang@fangliang-Virtual-Machine:~/Documents/k8s_py_code$ kubectl delete service nginx-service
service “nginx-service” deleted
fangliang@fangliang-Virtual-Machine:~/Documents/k8s_py_code$ kubectl describe service nginx-service
Error from server (NotFound): services “nginx-service” not found

删除Pod

 kubectl delete pod nginx 

fangliang@fangliang-Virtual-Machine:~/Documents/k8s_py_code$ kubectl delete pod nginx
pod “nginx” deleted
fangliang@fangliang-Virtual-Machine:~/Documents/k8s_py_code$ kubectl describe pod
No resources found in default namespace.

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。