Kubernetes基礎:查看狀態、管理服務


目標

  • 了解Kubernetes Pod
  • 了解Kubernetes Node
  • 學習如何調試部署問題
  • 了解如何通過Service暴露應用

Kubernetes Pods

在Kubernetes中創建一個Deployment 部署就會在Node上創建一個Pod,Pod是Kubernetes中對於一組容器以及與容器相關的資源的集合。Pod中的容器會共享IP和端口資源。

A Pod is a group of one or more application containers (such as Docker or rkt) and includes shared storage (volumes), IP address and information about how to run them.

Kubernetes Nodes

Pod總是運行在Node上,Node可以是物理機也可以是虛擬機。在之前的Kubernetes基礎的文章中,一個Node包含的組件有Kubelet、容器環境以及kube-proxy。結構如下圖所示:

kubectl - Kubernetes的CLI管理工具

kubectl是kubernetes的命令行管理工具。這里主要介紹在獲取信息方面的一些功能。kubectl運行的時候,默認會在default的命名空間下查找資源,如果我們需要在自己的命名空間下查找資源,需要指定--namespace=xxx參數。

kubectl get

獲取命名空間

$ kubectl get namespaces
NAME          STATUS    AGE
default       Active    2m
kube-public   Active    2m
kube-system   Active    2m

獲取Pods

$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5dbf48f7d4-4k8zz   1/1       Running   0          3m

獲取Pods詳細信息

$ kubectl describe pods
Name:           kubernetes-bootcamp-5dbf48f7d4-4k8zz
Namespace:      default
Node:           host01/172.17.0.45
Start Time:     Tue, 17 Jul 2018 03:02:04 +0000
Labels:         pod-template-hash=1869049380
                run=kubernetes-bootcamp

kubectl log

查看日志

$ kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2018-07-17T03:02:05.794Z | Running On:kubernetes-bootcamp-5dbf48f7d4-4k8zz

Running On: kubernetes-bootcamp-5dbf48f7d4-4k8zz | Total Requests: 1 | App Uptime: 527.706 seconds | Log Time: 2018-07-17T03:10:53.500Z

kubectl exec

在Pod中執行命令

$ kubectl exec $POD_NAME env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-5dbf48f7d4-4k8zz
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root

啟動容器中的bash

$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-5dbf48f7d4-4k8zz:/# cat server.js

Kubernetes Service

在K8S集群中,Pod有用獨立的IP,也具有獨立的生命周期。一旦某個Node節點發生故障,ReplicationController會將該節點上的Pod遷移到集群中其他Node節點上。對於有多個Pod,為前端應用提供相同的服務,這時前端其實不關心調用的后台具體哪個Pod,這時就要用到Service。

A Service in Kubernetes is an abstraction which defines a logical set of Pods and a policy by which to access them.

Kubernetes中的Service是集群中一組Pod以及訪問策略的抽象。可以通過YAML、JSON定義,目標Pods通常通過LabelSelector定義。通過type字段,服務定義了應用暴露的幾種方式:

  • ClusterIP,默認的方式,通過集群IP來對外提供服務,這種方式只能在集群內部訪問。
  • NodePort,利用NAT技術在Node的指定端口上提供對外服務。外部應用通過 : 的方式訪問。
  • LoadBalancer,利用外部的負載均衡設施進行服務的訪問。
  • ExternalName,這是1.7版本之后 kube-dns 提供的功能。

服務提供了在一組Pods之間分配流量的功能,同時也是因為服務這個抽象層的存在,Kubernetes才能夠在不影響應用的情況下進行擴縮容。通常Service通過label和selector來確定可操作的對象。label可以在對象創建時指定,也可以在運行時修改。


查看服務狀態

$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   44s

對外部暴露服務

$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service "kubernetes-bootcamp" exposed
$ kubectl get servicesNAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP     2m
kubernetes-bootcamp   NodePort    10.99.175.225   <none>        8080:32172/TCP   5s

查看服務詳細信息

$ kubectl describe service/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.99.175.225
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32172/TCP
Endpoints:                172.18.0.2:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

這個例子中Node沒有外部IP,所以顯示為空。利用內部IP測試。

$ curl 172.17.0.11:32172
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-hmc69 | v=1

通過標簽查詢Pod和Service

$ kubectl get pods -l run=kubernetes-bootcamp
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-hmc69   1/1       Running   0          8m
$ kubectl get services -l = run=kubernetes-bootcamp
error: name cannot be provided when a selector is specified
$ kubectl get services -l run=kubernetes-bootcamp
NAME                  TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes-bootcamp   NodePort   10.99.175.225   <none>        8080:32172/TCP   6m

新增標簽

$ kubectl label pod $POD_NAME app=v1
pod "kubernetes-bootcamp-5c69669756-hmc69" labeled
$ kubectl describe pods $POD_NAME
Name:           kubernetes-bootcamp-5c69669756-hmc69
Namespace:      default
Node:           minikube/172.17.0.11
Start Time:     Tue, 17 Jul 2018 05:20:35 +0000
Labels:         app=v1
                pod-template-hash=1725225312
                run=kubernetes-bootcamp
$ kubectl get pods -l app=v1
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-hmc69   1/1       Running   0          11m

刪除服務

$ kubectl get services
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP     12m
kubernetes-bootcamp   NodePort    10.99.175.225   <none>        8080:32172/TCP   10m
$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   12m

參考資料:

  1. Viewing Pods and Nodes
  2. Kubernetes基礎
  3. Using a Service to Expose Your App


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM