什么是 Kubernetes 服務
服務使應用程序內外的各種組件之間能夠進行通信。Kubernetes 服務可以幫助我們將應用程序與其他應用程序或用戶連接在一起。它提供了一個穩定的虛擬 IP(VIP)地址。通過使用服務 IP,客戶端可以可靠地連接到 pods 內運行的容器。
例如,你的應用程序有多組 pod 運行在不同的部分,比如一組用于向用戶提供前端負載,另一組用于運行后端進程,第三組連接到外部數據源。
正是服務實現了這些 pod 組之間的連接,使得我們可以在集群中擁有所需數量的服務。
為什么要使用服務
Kubernetes Pods 是不可靠且非永久性的資源,因為它們是根據集群的狀態創建和銷毀的。當你創建一個 Kubernetes 部署來運行你的應用程序時,它可以動態地創建和銷毀 Pods。
每個 pod 都有自己的 IP 地址,并且有可能發生變化,因為這個 pod 有可能被注銷然后再出現一個新的。
這就導致了一個問題:如果某組 Pod(稱之為“后端”)為集群內的其他 Pod(也稱之為“前端”)提供功能,那么前端如何找到并跟蹤要連接的 IP 地址,以便前端可以使用工作負載的后端部分呢?
這就是 Kubernetes 設計者提出服務這一解決方案的原因。
刪除 Kubernetes 服務
要刪除服務,首先需要列出 kubernetes 集群中的可用服務列表。
如下命令可列出所有在命名空間內創建的所有服務:?
$ 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 的服務。
讓我們描述一下該服務,以便快速理解其功能。如下:?
$ 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>
正如我們前面提到的,服務是一組 pod,可以看到該服務有兩個與之相關聯的端(endpoints)。
服務 my-dep-svc 的虛擬 IP 地址為 10.100.159.167。
為了快速演示,讓我們嘗試使用服務IP(10.100.159.167)及其端口(8080)訪問在這兩個端點(pod)上運行的應用程序。如下:?
$ curl 10.100.159.167:8080
<html><body><h1>It works!</h1></body></html>
這樣大家對 Kubernetes 服務應該有了一個基本的了解。
刪除 Kubernetes 中的服務,大致有兩種方法。
方法1:使用 kubectl delete 命令刪除服務
根據服務資源的名稱,使用 kubectl 命令來刪除該服務。如下所示:?
$ kubectl delete svc --namespace=webapps my-dep-svc
service "my-dep-svc" deleted
現在再看一下服務列表:?
$ 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:通過引用創建該文件的相同 YAML 文件進行刪除
創建 my-dep-svc 服務的 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
現在,通過引用用于創建服務的 YAML 文件來刪除該服務。?
$ kubectl delete -f my-dep-svc.yml
service "my-dep-svc" deleted
再列出所有服務:?
$ 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