Kubernetes基础:查看状态、管理服务

摘要:
在前面的Kubernetes Basic文章中,节点包含Kubelet、容器环境和kube代理等组件。结构如下图所示:kubectl-Kubernetes的CLI管理工具kubectl是Kubernete的命令行管理工具。Kubernetes中的服务是一种抽象,它定义了对对象的抽象和访问它们的非对称性。Kubernetes中的服务是集群中一组pod和访问策略的抽象。该服务提供在一组pod之间分配流量的功能。同时,由于抽象服务层的存在,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。结构如下图所示:
Kubernetes基础:查看状态、管理服务第1张

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可以在对象创建时指定,也可以在运行时修改。

Kubernetes基础:查看状态、管理服务第2张
Kubernetes基础:查看状态、管理服务第3张

查看服务状态

$ 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

Kubernetes基础:查看状态、管理服务第4张

参考资料:

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

免责声明:文章转载自《Kubernetes基础:查看状态、管理服务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Base64和urlencodeWindows注册表内容详解(转载)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis集群,添加删除槽

//集群(cluster)   CLUSTER INFO 打印集群的信息   CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。       //节点(node)   CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子...

node的安装和配置

一 . 直接安装node 1. http://nodejs.cn/download/ 根据自己的电脑选择适合的安装包 2.安装 , 无脑下一步 , 可以选择安装路径 , 但是一定要记住 . 3.命令行窗口输入 ' node ' 就进入node编辑界面 , 可以输入node命令了. 4.因为现在的node里集成了npm , 所以npm也一并安装好了 , 可...

巅峰对决之Swarm、Kubernetes、Mesos

  另外一篇 https://www.sohu.com/a/157185937_287582 Docker Docker是一个主流容器管理工具,它是第一个基于Linux容器(LXC)的[2],但是现在被runC[46]所取代了(runC是是一个由Open Containers Initiative开发的CLI工具,它能够创建和运行容器[36])。Docke...

Java同步数据结构之LinkedBlockingDeque

前言 前面介绍完了队列Queue/BlockingQueue的实现类,接下来介绍双端队列Deque/BlockingDeque的实现类之一LinkedBlockingDeque,它是一种基于链表的可选容量的同时支持FIFO、LIFO的阻塞双端队列。 比起前面介绍的队列实现中的节点都有一个指向下一个节点的next字段引用,双端队列为了能够实现能够从尾部添加元...

webpack4系列之 【2. 踩坑--webpack 2.x升级至4.x】

一.安装webpack-cli,webpack@4.26.1 1.npm install webpack-cli -D 2.npm install webpack@4.26.1 -D 二.踩坑 执行npm run dev报错 1./Users/lily/ForWork/forBMSys/bm-fe/node_modules/html-webpack-plu...

nodejs安装、配置及开发工具

学了node一段时间,但是node的安装还是有一点迷糊。今天新换电脑,所以,需要从头开始,发现node的安装还是不顺畅,这篇随笔是之前学的时候写,但是今天再打开看的时候,发现其他好像没有什么内容,于是我就补补吧,希望能帮到新学习nodejs的你~ 我们都知道,既然是学习,那肯定得先把环境啊都配置好,好吧,不多说了,先看看nodejs的安装吧。 一、下载安装...