kubernetes基础概念入门
Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.k8s是一个开源的云操作系统,能够用来自动化部署,扩缩容和管理我们的容器应用,简单来说,就是提供了容器编排和管理功能的系统架构图Master:ApiSer
Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.
k8s是一个开源的云操作系统,能够用来自动化部署,扩缩容和管理我们的容器应用,简单来说,就是提供了容器编排和管理功能的系统
架构图
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功能
基本概念
-
容器:一种轻量级、可移植、自包含的软件打包技术
-
Master:为用户可和服暴露API,以最优方式调度工作负载,编排其他组件
-
Pod: k8s最小调度单位,封装了一个或者多个容器的资源对象,Pod内所有容器共享命名空间和存储资源,类比豌豆荚
-
资源标签:一个键值型(key/value)数据,辨别pod的属性,或者帮助Scheduler来进行调度
-
标签选择器: Lable Selector,根据标签过滤符合条件的资源对象
-
namespace:资源对象的隔离,Service、Deployment、Pod
-
Volume:存储卷,独立于容器文件系统的存储空间,为容器提供持久存储能力
-
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 | 运行完成后可终止的应用,如批处理作业任务 |
- 命名空间
作用:资源配额的隔离: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机制直接和所有容器进行通信
分类:
-
各主机自身的网络,地址配置于主机网络接口,配置于k8s集群构建之前,不能由k8s管理
-
k8s集群专用于pod资源对象的虚拟网络,配置在Pod的容器接口上,为Pod设定IP和网络,借助于CNI插件实现,可部署k8s集群之外或者托管在集群上,需要在构建集群有管理员定义
-
专用于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 |
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"}}'
更多推荐
所有评论(0)