Kubernetes是容器的管理编排工具,而容器则是程序的载体。我们先在Docker上部署应用,然后再在kubernetes上部署,并对它们进行对比学习。
Docker部署应用
查看运行中的容器
docker ps
可以看到下面的表头,此时没有一个运行中的容器。
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|
部署应用
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 ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
deae7732c685 | nginx | “/docker-entrypoint.…” | 4 minutes ago | Up 4 minutes | 0.0.0.0:80->80/tcp, :::80->80/tcp | nginx-container |
我们在ubuntu desktop上访问本机IP,可以看到nginx被启动了。
停止/删除容器
在上一步我们可以得到容器的ID是deae7732c685。通过这个ID我们便可以先停止容器,然后再删除它。
docker stop deae7732c685
docker rm deae7732c685
Kubernetes部署应用
Kubernetes虽然是容器管理工具,但是它最小可创建、管理和部署的计算单元叫Pod。一个Pod里可以有多个容器,一个Pod只能在一个Node里(后面会介绍,可以理解为一台虚拟机或者物理机)。
创建Pod
运行下面的指令可以创建一个名字是nginx的Pod,这个Pod下有一个容器,名字也是nginx。这些都是由kubectl run后的名字决定的。
kubectl run nginx --image=nginx --port=80
–image=nginx表示我们使用名字叫nginx镜像来创建容器。
–port=80表示容器对外暴露80端口,即可以通过Pod的IP+该端口访问服务。
查看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.