Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.

k8s是一个开源的云操作系统,能够用来自动化部署,扩缩容和管理我们的容器应用,简单来说,就是提供了容器编排和管理功能的系统

架构图

u_325710987,885711381_fm_26_gp_0.jpg

Master:

  • ApiServer:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  • Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  • Controller-Manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • ETCD:保存了整个集群的所有信息;

node:

  • Kubelet :负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  • docker:负责镜像管理以及Pod和容器的真正运行(CRI);
  • kubeproxy:负责为Service提供cluster内部的服务发现和负载均衡;

核心附件:

  • CoreDNS:负责为整个集群提供DNS服务
  • Dashboard:提供一个简单的GUI界面来查看集群信息和操作集群
  • Ingress:为服务提供外网入口,提供域名访问服务功能
  • Flannel:为集群之间提供网络连接服务,分配pod和serviceIP功能

基本概念

  1. 容器:一种轻量级、可移植、自包含的软件打包技术

  2. Master:为用户可和服暴露API,以最优方式调度工作负载,编排其他组件

  3. Pod: k8s最小调度单位,封装了一个或者多个容器的资源对象,Pod内所有容器共享命名空间和存储资源,类比豌豆荚

  4. 资源标签:一个键值型(key/value)数据,辨别pod的属性,或者帮助Scheduler来进行调度

  5. 标签选择器: Lable Selector,根据标签过滤符合条件的资源对象

  6. namespace:资源对象的隔离,Service、Deployment、Pod

  7. Volume:存储卷,独立于容器文件系统的存储空间,为容器提供持久存储能力

  8. Pod控制器:用户不会直接部署管理pod,借助另一个抽象的工具【控制器(control) 】进行管理,保证副本数量达到预期

以下是Control的类型和功能列表

类型功能备注
ReplicationController保证Pod的副本数达到预期几乎废弃
ReplicaSet新一代RC,支持基于集合的标签选择器新一代控制器
Deployment是最常用的管理无状态的pod,构建于RS之上支持基于集合( set-based )的标签选择器,以及它的滚动更新( Rolling-Update )机制,区别于RS的地方
StatefulSet有状态的持久化应用,如database,为每个Pod创建独特标识,确保Pod间顺序性
DaemonSet用于确保每个节点都运行某Pod的一个副本,新增节点也会被添加此类Pod,用于运行集群存储守护进程,如ceph和glusterd,日志收集进程fluentd、logstash以及监控进程,prometheus的Node Exporter等
Job运行完成后可终止的应用,如批处理作业任务
  1. 命名空间

作用:资源配额的隔离:CPU、Memory

kubectl get namespace
NAME              STATUS   AGE
default           Active   28d
kube-public       Active   28d
kube-system       Active   28d

创建一个命名空间

$ cat namesapce-dev.yaml 
apiVersion: v1 
kind: Namespace 
metadata:  
  name: dev 

$ kubectl create -f namesapce-dev.yaml

简单命令创建

kubectl create ns dev

kubectl get all -n kube-system    #查看一个命名空间下所有的内容

注意:不同命名空间下SvcIP、PodIP是可以访问的,是对名字的隔离

k8s服务、网络、存储概念

Service概念

​ Service 是建立在一组Pod 对象之上的资源抽象,它通过标签选择器选定一组Pod 对象,并为这组Pod 对象定义一个统一的固定访问入口(通常是一个IP 地址),若K8s 集群存在DNS 附件,它就会在Service 创建时为其自动配置一个DNS 名称以便客户端进行服务发现。到达Service IP 的请求将被负载均衡至其后的端点一一各个Pod 对象之上,Service从本质上来讲是一个四层代理服务。另外,Service 还可以将集群外部流量引入到集群中来。

Service类型

  • 第一种是仅用于集群内部通信的ClusterIP类型;

  • 第二种是接入集群外部请求的NodePort 类型它工作于每个节点的主机IP 之上;

  • 第三种是LoadBalancer 类型,可以把外部请求负载均衡至多个Node 的主机IP 的NodePort 之上

    此三种类型中,每一种都以其前一种为基础才能实现,而且第三种类型中的LoadBalancer 需要协同集群外部的组件才能实现,此外部组件并不接受Kubemetes的管理。

  • 第四种是ExternalName,通过将Service映射由ExternalName字段的内容指定的主机名来暴露服务

Service IP 是一种虚拟IP ,也称为Cluster IP ,它专用于集群内通信,通常使用专用的地址段,如“ 10.96.0.0/12 ”网络 PodIP常用: 10.244.0.0/16

Ingress:Pod和service都只能在集群内部通信,Ingress可以实现HTTPS(七层)负载均衡,实现和集群外部通信,本身是一组路由规则的集合,其控制器主要使用Nginx,或者haproxy

HostPort和NodePort的区别:NodetPort是通过所有节点暴露容器服务,而HostPort由Pod对象所在的节点IP地址来暴露

k8s集群的网络

目的:

所有Pod之间不需要经过NAT直接通信,都在一个扁平的网络空间内

所有集群内节点可不经过NAT机制直接和所有容器进行通信

分类:

  1. 各主机自身的网络,地址配置于主机网络接口,配置于k8s集群构建之前,不能由k8s管理

  2. k8s集群专用于pod资源对象的虚拟网络,配置在Pod的容器接口上,为Pod设定IP和网络,借助于CNI插件实现,可部署k8s集群之外或者托管在集群上,需要在构建集群有管理员定义

  3. 专用于service资源对象的虚拟网络,不配置在任何主机或者容器的网络接口,通过node的kube-proxy配置为iptables或者ipvs规则,网络在集群创建时指定

Kubernetes 资源对象

类型说明
工作负载( Workload )通常称为pod 控制器,主要分为有状态、无状态
发现和负载均衡( Discovery & LB )Ingress(七层负载均衡)
配置和存储( Config & Storage )挂载外部存储卷
集群( Cluster )资源Node、Role、ClusterRole、RoleBinding、 ClusterRoleBinding
元数据( Metadata )具有kind 、apiVersion 、metadata 、spec 和status 五个一级宇段

资源类型( resource type )是指在URL 中使用的名称,如Pod 、Namespace 和Service等,其URL 格式为“ GROUPNERSION度ESOURCE ”,如apps/v1/deployment 。

  • apiVersion 版本号,例如 v1

  • kind 代表着资源对象所属的类 Pod/Deployment/Service/Namespace

  • metadata 字段为资源提供元数据信息,如名称、隶属的名称空间和标签等;

  • spec 则用于定义用户期望的状态,不同的资源类型,其状态的意义也各有不同

  • status 则记录着活动对象的当前状态信息,它由Kubemetes 系统自行维护,对用户来说为只读字段

如果是YAML 格式的清单文件,多个资源彼此之间要使用—

单独的一行进行资源分割,这样,多个资源就将以清单文件中定义的次序被create 、apply等子命令调用

kubectl api-versions 查看现有api的版本

kubectl常用命令

kubectl 的命令分类:

类型命令
陈述式命令( imperative command )run , expose 、delete 和get 等命令
陈述式对象配置( imperative object configuration )create 、delete 、get 、describe和replace
声明式对象配置( declarative object config uration )apply

kubectl命令1.png

kubectl命令2.png

kubectl命令3.png

1、创建一个nginx的deployment
$ kubectl run nginx-deploy --image=nginx:1.12 --port=80 --replicas=2

2、对nginx-deploy进行扩缩容
$ kubectl scale deploy/nginx-deploy --replicas=3

3、对nginx-deploy进行服务端口暴露,通过Service的8080端口转发至容器的80端口上
$ kubectl expose deployment nginx-deploy --port=8080 --target-port=80

4、将nginx-deploy暴露为NortPort
$ kubectl expose deployment nginx-deploy --type="NodePort" --port=80 --name=my_nginx_web

5、打印容器日志
$ kubectl logs coredns-7b47bbb54c-q6dkr -n kube-system -f
.:53
[INFO] plugin/reload: Running configuration MD5 = 1588bb3af386f386c40674040e2b3399
   ______                ____  _   _______
  / ____/___  ________  / __ \/ | / / ___/      ~ CoreDNS-1.6.3
 / /   / __ \/ ___/ _ \/ / / /  |/ /\__ \       ~ linux/amd64, go1.12.9, 37b9550
/ /___/ /_/ / /  /  __/ /_/ / /|  /___/ /
\____/\____/_/   \___/_____/_/ |_//____/

-f 用于持续监控指定容器中的日志输出,类似于tail -f

6、进入容器执行命令
格式: kubectl exec -it <Pod-name> /bin/bash  
#进入容器,如果一个pod里面有多个容器加 -c <container name> 指定容器
$ kubectl exec -it nginx-deploy-64c7978669-2x5xz -n kube-system /bin/bash

7、删除某个命名空间所有pod
$ kubectl delete pods --all -n kube-public

8、查看版本
$ kubectl version --short       #查看版本,也可以使用kubectl get node查看

Client Version: v1.15.0 
Server Version: v1.15.0

9、运行一个测试容器
$ kubectl run client --image=busybox --restart=Never -it -- /bin/sh

10、命令的测试运行,选项--dry-run
$ kubectl run nginx-deploy --image=nginx:1.12 --port=80 --replicas=2 --dry-run

11、给指定节点打标签
$ kubectl label nodes master disktype=ssd

12、删除某个标签
$ kubectl label nodes master disktype-

13、查看集群所有支持的api
kubectl api-versions 

14、修改已经部署服务的服务类型
kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐