Kubernetes—基础与命令(详解篇)

Pod控制器基本概念:

Kubernetes—基础与命令(详解篇)

Pod是kubernetes的最小单元,自主式创建的pod删除就没有了,但是通过资源控制器创建的pod如果删除还会重建。pod控制器就是用于实现代替我们去管理pod的中间层,并帮我们确保每一个pod资源处于我们所定义或者所期望的目标状态,pod资源出现故障首先要重启容器,如果一直重启有问题的话会基于某种策略重新编排。自动适应期望pod数量。

Kubernetes中内建了很多controller(控制器),这些相当于⼀个状态机,⽤来控制Pod的具体状态和⾏为。

Pod控制器有很多种类型,但是目前kubernetes中常用的控制器有:
Kubernetes—基础与命令(详解篇)

  • Replication Controller(RC):是Kubernetes系统中的核心概念,用于定义Pod副本的数量。在Master内,RC进程通过RC的定义来完成Pod的创建、监控、启停等操作。根据RC定义,Kubernetes能够确保在任意时刻都能运行用于指定的Pod"副本"(Replica)数量。随着kubernetes的迭代更新,RC即将被废弃,逐渐被ReplicaSet替代;
  • ReplicaSet(RS):它的核心作用是代用户创建指定数量的Pod副本,并确定Pod副本一直处于满足用户期望数量的状态,多退少补,同时支持扩缩容机制。主要有三个组件:用户期望的Pod副本数量;标签选择器,选择属于自己管理和控制的Pod;当前Pod数量不满足用户期望数量时,根据资源模板进行新建;
  • Deployment:工作在ReplicaSet之上,用于管理无状态应,除了ReplicaSet的机制,还增加了滚动更新和回滚功能,提供声明式配置;
  • DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务。要求:服务是无状态的;服务必须是守护进程;

※小知识:以有状态为尺,以无状态为容

  • 有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
  • 无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。

核心组件

HPA

Horizontal Pod Autoscaling(Pod 水平自动伸缩),简称HPA
RC还支持二级控制器
HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量,一般情况下我们可以确保一个node上面有两个pod在运行

Kubernetes—基础与命令(详解篇)

service

为了降低客户端与pod之间协调的复杂度,k8s为每一组提供同类服务的pod和其客户端之前添加了一个中间层,中间层就叫service(固定的)

不是一个程序,也不是一个组件,它是一个iptables的dnat规则(是一个流量,是无形的)

service作为K8S的对象,有自身的名称,而名称相当于服务的名称(可以被解析)访问只能用集群去访问,真机上不行

Kubernetes—基础与命令(详解篇)
如图,旁边还有一个service是单独的,这就是附件(除了附件还有插件)

AddOns附件

K8S自身需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,也可以称为集群附件

dns pod
  • 装完k8s后第一件事就是需要在集群上部署一个dns pod,以确保各service的名称可以被解析
  • 可以动态改变(比如创建、删除、修改)
  • 举个例子,假如把service的名称改掉,dns pod会自动触发,将dns解析记录中的名称也给改掉,如果改掉IP地址的话也会触发,dns服务中的解析记录也会改掉
  • 如此一来,客户端去访问opd资源时就可以直接访问service的名称,然后由集群中专用的dns服务来负责解析

Kubernetes网络模型

k8s的三种网络模型分别属于三个网段,分别是:

  • 节点网络
  • service集群网络
  • pod网络

由此延申出三个问题

问题一:

同一个pod内的多个容器间如何通信?

可以使用lo网卡

问题二:

各pod之前如何通信?

  1. 可以使用物理桥桥接的方式(规模大的情况下会产生广播风暴)
  2. Overlay Network (通过隧道的方式转发报文)

问题三:

pod与service之间如何通信?

Kubernetes—基础与命令(详解篇)

在不同节点上的Pod通信中,我们知道了Pod是以IP地址进行通信,但Kubernetes 的集群中, Pod 可能会频繁的销毁和创建,也就是说 Pod 的 IP 不是固定的。
为了解决这个问题,Service 提供了访问 Pod 的抽象层,即为一组功能相同的Pod提供单一不变的接入点资源。
无论后端的 Pod 如何变化,Service 都作为稳定的前端对外提供服务。
同时,Service 还提供了高可用和负载均衡功能,Service 负责将请求转发给正确的 Pod。

注意:上述情形仅在节点连接到相同网关,之间没有任何路由设备时有效。否则,路由设备会因为IP私有产生丢包现象,除非设置路由规则。但随着节点的增加,路由的配置会变得非常困难。因此我们使用SDN(软件定义网络)技术来简化此类问题,SDN可以忽略底层网络拓扑,使其就像连接到同一网关。

kubectl常用命令的使用

kubectl help

查看kubectl相关的命令

Basic Commands (Beginner):
  create         Create a resource from a file or from stdin.
  expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
Kubernetes Service
  run            在集群中运行一个指定的镜像
  set            为 objects 设置一个指定的特征
 
Basic Commands (Intermediate):
  explain        查看资源的文档
  get            显示一个或更多 resources
  edit           在服务器上编辑一个资源
  delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector
 
Deploy Commands:
  rollout        Manage the rollout of a resource
  scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
  autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
 
Cluster Management Commands:
  certificate    修改 certificate 资源.
  cluster-info   显示集群信息
  top            Display Resource (CPU/Memory/Storage) usage.
  cordon         标记 node 为 unschedulable
  uncordon       标记 node 为 schedulable
  drain          Drain node in preparation for maintenance
  taint          更新一个或者多个 node 上的 taints
 
Troubleshooting and Debugging Commands:
  describe       显示一个指定 resource 或者 group 的 resources 详情
  logs           输出容器在 pod 中的日志
  attach         Attach 到一个运行中的 container
  exec           在一个 container 中执行一个命令
  port-forward   Forward one or more local ports to a pod
  proxy          运行一个 proxy 到 Kubernetes API server
  cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
  auth           Inspect authorization
 
Advanced Commands:
  apply          通过文件名或标准输入流(stdin)对资源进行配置
  patch          使用 strategic merge patch 更新一个资源的 field(s)
  replace        通过 filename 或者 stdin替换一个资源
  wait           Experimental: Wait for one condition on one or many resources
  convert        在不同的 API versions 转换配置文件
 
Settings Commands:
  label          更新在这个资源上的 labels
  annotate       更新一个资源的注解
  completion     Output shell completion code for the specified shell (bash or zsh)
 
Other Commands:
  alpha          Commands for features in alpha
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 文件
  plugin         Runs a command-line plugin
  version        输出 client 和 server 的版本信息

更详细一点如下:

命令 说明
create 使用文件或者标准输入的方式创建一个资源
expose 将一个资源公开为为新的Kubernetes Service
run 创建并运行一个或多个容器镜像
set 配置应用资源
explain 显示资源文档信息
get 获取显示一个或多个资源
edit 编辑服务器上定义的资源
delete 按文件名、stdin、资源和名称或按资源和标签选择器删除资源

create

kubectl create可以通过配置文件名或stdin创建一个集群资源对象。支持JSON和YAML格式的文件

[root@master ~]# kubectl create deployment b1 --image busybox
deployment.apps/b1 created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS        RESTARTS   AGE
b1-68578fbb6c-lgchj      0/1     Pending       0          13s
nginx-6799fc88d8-bmwdr   0/1     Terminating   0          43h
nginx-6799fc88d8-zjgtj   0/1     Pending       0          42h

run

kubectl run创建并运行一个或多个容器镜像。

kubectl run和docker run一样,它能将一个镜像运行起来。下面使用kubectl run来将一个nginx的镜像启动起来。

[root@master ~]# kubectl run nginx --image=nginx --expose --port=80            #指定镜像,指定暴露端口
service/nginx created
deployment.apps/nginx created

使用kubectl run会自动创建deployment,加上--export会自动创建service。

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.68.0.1     <none>        443/TCP   10d
nginx        ClusterIP   10.68.56.89   <none>        80/TCP    1m

[root@master ~]# kubectl get deploy
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           16m
nginx     1         1         1            1           1m

[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-xg97j   1/1       Running   0          21m
nginx-6f858d4d45-dt44v   1/1       Running   0          6m

get

kubectl get获取列出一个或多个资源的信息。

例如,分别获取当前集群中pod、deployment和svc的信息。

[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-xg97j   1/1       Running   0          42m
nginx-566c464789-w7669   1/1       Running   0          15m

[root@master ~]# kubectl get deploy
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           43m
nginx     1         1         1            1           28m

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)     AGE
kubernetes   ClusterIP   10.68.0.1     <none>        443/TCP     10d
mysql        ClusterIP   10.68.86.66   <none>        33060/TCP   36m

delete

kubectl delete可以通过配置文件名、stdin、资源名称或label选择器来删除资源。支持JSON和YAML格式的文件。

下面删除nginx的pod。

[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-xg97j   1/1       Running   0          55m
nginx-566c464789-w7669   1/1       Running   0          27m

[root@master ~]# kubectl delete pod/nginx-566c464789-w7669
pod "nginx-566c464789-w7669" deleted

[root@master ~]# kubectl get pod
NAME                     READY     STATUS              RESTARTS   AGE
mysql-5fb6c74b86-xg97j   1/1       Running             0          55m
nginx-566c464789-8lr2x   0/1       ContainerCreating   0          1m

又生成了一个新的nginx的pod,为什么?这是因为对应的deployment还存在。

[root@master ~]# kubectl delete deploy/nginx
deployment.extensions "nginx" deleted

[root@master ~]# kubectl get deploy
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
mysql     1         1         1            1           1h

[root@master ~]# kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
mysql-5fb6c74b86-xg97j   1/1       Running   0          1h

删除掉deployment,其对应的pod也会被删除。
上一篇:Kubernetes数据存储-本地存储


下一篇:如何提升 Kubernetes 生产力?我有 5 个实用技巧分享给你