什么是 Kubernetes 服務(wù)
服務(wù)使應(yīng)用程序內(nèi)外的各種組件之間能夠進行通信。Kubernetes 服務(wù)可以幫助我們將應(yīng)用程序與其他應(yīng)用程序或用戶連接在一起。它提供了一個穩(wěn)定的虛擬 IP(VIP)地址。通過使用服務(wù) IP,客戶端可以可靠地連接到 pods 內(nèi)運行的容器。
例如,你的應(yīng)用程序有多組 pod 運行在不同的部分,比如一組用于向用戶提供前端負(fù)載,另一組用于運行后端進程,第三組連接到外部數(shù)據(jù)源。
正是服務(wù)實現(xiàn)了這些 pod 組之間的連接,使得我們可以在集群中擁有所需數(shù)量的服務(wù)。
為什么要使用服務(wù)
Kubernetes Pods 是不可靠且非永久性的資源,因為它們是根據(jù)集群的狀態(tài)創(chuàng)建和銷毀的。當(dāng)你創(chuàng)建一個 Kubernetes 部署來運行你的應(yīng)用程序時,它可以動態(tài)地創(chuàng)建和銷毀 Pods。
每個 pod 都有自己的 IP 地址,并且有可能發(fā)生變化,因為這個 pod 有可能被注銷然后再出現(xiàn)一個新的。
這就導(dǎo)致了一個問題:如果某組 Pod(稱之為“后端”)為集群內(nèi)的其他 Pod(也稱之為“前端”)提供功能,那么前端如何找到并跟蹤要連接的 IP 地址,以便前端可以使用工作負(fù)載的后端部分呢?
這就是 Kubernetes 設(shè)計者提出服務(wù)這一解決方案的原因。
刪除 Kubernetes 服務(wù)
要刪除服務(wù),首先需要列出 kubernetes 集群中的可用服務(wù)列表。
如下命令可列出所有在命名空間內(nèi)創(chuàng)建的所有服務(wù):?
$ kubectl get svc --all-namespaces -o wide
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24d <none>
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 64d k8s-app=kube-dns
webapps my-dep-svc ClusterIP 10.100.159.167 <none> 8080/TCP 2m45s tier=front-end
如上所示,在命名空間 webapps 中可以看到一個名為 my-dep-svc 的服務(wù)。
讓我們描述一下該服務(wù),以便快速理解其功能。如下:?
$ kubectl describe svc my-dep-svc --namespace=webapps
Name: my-dep-svc
Namespace: webapps
Labels: <none>
Annotations: Selector: tier=front-end
Type: ClusterIP
IP: 10.100.159.167
Port: <unset> 8080/TCP
TargetPort: 80/TCP
Endpoints: 172.16.213.223:80,172.16.213.5:80
Session Affinity: None
Events: <none>
正如我們前面提到的,服務(wù)是一組 pod,可以看到該服務(wù)有兩個與之相關(guān)聯(lián)的端(endpoints)。
服務(wù) my-dep-svc 的虛擬 IP 地址為 10.100.159.167。
為了快速演示,讓我們嘗試使用服務(wù)IP(10.100.159.167)及其端口(8080)訪問在這兩個端點(pod)上運行的應(yīng)用程序。如下:?
$ curl 10.100.159.167:8080
<html><body><h1>It works!</h1></body></html>
這樣大家對 Kubernetes 服務(wù)應(yīng)該有了一個基本的了解。
刪除 Kubernetes 中的服務(wù),大致有兩種方法。
方法1:使用 kubectl delete 命令刪除服務(wù)
根據(jù)服務(wù)資源的名稱,使用 kubectl 命令來刪除該服務(wù)。如下所示:?
$ kubectl delete svc --namespace=webapps my-dep-svc
service "my-dep-svc" deleted
現(xiàn)在再看一下服務(wù)列表:?
$ kubectl get svc --all-namespaces -o wide
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24d <none>
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 64d k8s-app=kube-dns
方法2:通過引用創(chuàng)建該文件的相同 YAML 文件進行刪除
創(chuàng)建 my-dep-svc 服務(wù)的 YAML 配置文件。?
$ cat my-dep-svc.yml
apiVersion: v1
kind: Service
metadata:
name: my-dep-svc
namespace: webapps
spec:
selector:
tier: front-end
ports:
- protocol: TCP
port: 8080
targetPort: 80
現(xiàn)在,通過引用用于創(chuàng)建服務(wù)的 YAML 文件來刪除該服務(wù)。?
$ kubectl delete -f my-dep-svc.yml
service "my-dep-svc" deleted
再列出所有服務(wù):?
$ kubectl get svc --all-namespaces -o wide
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24d <none>
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 64d k8s-app=kube-dns