云原生(十三) | Kubernetes 篇之深入 Kubernetes(k8s)概念
深入 Kubernetes(k8s)概念
一、基础概念理解
集群
master
worker
Node
Pod
应用最终以 Pod 为一个基本单位部署
Label
很多资源都可以打标签
Deployment
应用部署用它,deployment 最终会产生 Pod
Service
负载均衡机制
二、kubernetes Objects(k8s 对象)
1、什么是 k8s 对象
官方文档地址: 理解 Kubernetes 对象 | Kubernetes
k8s 里面操作的资源实体,就是 k8s 的对象,可以使用 yaml 来声明对象。然后让 k8s 根据 yaml 的声明创建出这个对象;
操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 Kubernetes API 。比如,当使用
kubectl
命令行接口时,CLI 会执行必要的 Kubernetes API 调用Kubernetes 对象指的是 Kubernetes 系统的持久化实体,所有这些对象合起来,代表了你集群的实际情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes 将其数据以 Kubernetes 对象的形式通过 api server 存储在 etcd 中。具体来说,这些数据(Kubernetes 对象)描述了:
集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
集群中对应用程序可用的资源(网络,存储等)
应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
其他 Kubernetes 管理应用程序时所需要的信息 scheduler 先计算应该去哪个节点部署
对象的 spec 和 status
每一个 Kubernetes 对象都包含了两个重要的字段:
spec
必须由您来提供,描述了您对该对象所期望的 目标状态
status
只能由 Kubernetes 系统来修改,描述了该对象在 Kubernetes 系统中的 实际状态Kubernetes 通过对应的 控制器,不断地使实际状态趋向于您期望的目标状态
2、描述 k8s 对象
自己编写任意资源的 yaml 都可以创建出他
如何会写任意资源的 yaml,比如 Pod
编写 yaml 的黑科技 kubectl run my-nginx666 --image=nginx #启动一个 Pod1、kubectl get pod my-nginx666 -oyaml 集群中挑一个同类资源,获取出他的 yaml。2、kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍
当你在 Kubernetes 中创建一个对象时,必须提供
该对象的 spec 字段,通过该字段描述您期望的 目标状态
该对象的一些基本信息,例如名字
可以使用 kubectl 命令行创建对象,也可以编写 .yaml
格式的文件进行创建
apiVersion: apps/v1kind: Deployment metadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 # 运行 2 个容器化应用程序副本 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
3、k8s 对象 yaml 的结构
必填字段
在上述的 .yaml
文件中,如下字段是必须填写的:
apiVersion 用来创建对象时所使用的 Kubernetes API 版本
kind 被创建对象的类型
metadata 用于唯一确定该对象的元数据:包括
name
和namespace
,如果namespace
为空,则默认值为default
spec 描述您对该对象的期望状态
不同类型的 Kubernetes,其
spec
对象的格式不同(含有不同的内嵌字段),通过 API 手册可以查看 Kubernetes 对象的字段和描述。例如,假设您想了解 Pod 的spec
定义,可以在这里找到,Deployment 的spec
定义可以在这里找到
Kubernetes API Reference Docs 这就是我们以后要完全参照的文档。
4、管理 k8s 对象
同一个 Kubernetes 对象应该只使用一种方式管理,否则可能会出现不可预期的结果
5、对象名称
Kubernetes REST API 中,所有的对象都是通过 name
和 UID
唯一性确定
可以通过 namespace
+ name
唯一性地确定一个 RESTFUL 对象,例如:
Names
同一个名称空间下,同一个类型的对象,可以通过 name
唯一性确定。如果删除该对象之后,可以再重新创建一个同名对象。
依据命名规则,Kubernetes 对象的名字应该:
最长不超过 253 个字符
必须由小写字母、数字、减号
-
、小数点.
组成某些资源类型有更具体的要求
例如,下面的配置文件定义了一个 name 为 nginx-demo
的 Pod,该 Pod 包含一个 name 为 nginx
的容器:
apiVersion: v1kind: Podmetadata: name: nginx-demo ##pod 的名字 spec: containers: - name: nginx ##容器的名字 image: nginx:1.7.9 ports: - containerPort: 80 UIDs
UID
UID 是由 Kubernetes 系统生成的,唯一标识某个 Kubernetes 对象的字符串。
Kubernetes 集群中,每创建一个对象,都有一个唯一的 UID。用于区分多次创建的同名对象(如前所述,按照名字删除对象后,重新再创建同名对象时,两次创建的对象 name 相同,但是 UID 不同。)
6、名称空间
Kubernetes 安装成功后,默认有初始化了三个名称空间:
default 默认名称空间,如果 Kubernetes 对象中不定义
metadata.namespace
字段,该对象将放在此名称空间下kube-system Kubernetes 系统创建的对象放在此名称空间下
kube-public 此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些未登录的用户)。主要是为集群预留的,例如,某些情况下,某些 Kubernetes 对象应该被所有集群用户看到。
名称空间未来如何隔离
1)、基于环境隔离(prod,test)
prod:部署的所有应用
test:部署的所有应用
2)、基于产品线的名称空间(商城,android,ios,backend);
3)、基于团队隔
访问其他名称空间的东西?(名称空间资源隔离,网络不隔离)
1)、配置直接拿来用。不行
2)、网络访问,可以。
Pod-Pod;
serviceName 来访问,找本名称空间的 Service 负载均衡
serviceName.名称空间,可以访问别的名称空间的
创建名称空间
apiVersion: v1kind: Namespacemetadata:name: <名称空间的名字>
apiVersion: v1kind: Namespacemetadata:creationTimestamp: nullname: k8s-03spec: {}status: {}
#直接用命令 kubectl create namespace <名称空间的名字>
#删除 kubectl delete namespaces <名称空间的名字>
名称空间的名字必须与 DNS 兼容:
不能带小数点
.
不能带下划线
_
使用数字、小写字母和减号
-
组成的字符串
默认情况下,安装 Kubernetes 集群时,会初始化一个 default
名称空间,用来将承载那些未指定名称空间的 Pod、Service、Deployment 等对象
为请求设置命名空间
#在对象 yaml 中使用命名空间 apiVersion: v1kind: Podmetadata: name: nginx-demo ##pod 的名字 namespace: default #不写就是 defaultspec: containers: - name: nginx ##容器的名字 image: nginx:1.7.9 ports: - containerPort: 80
当您创建一个 Service 时,Kubernetes 会创建一个相应的 DNS 条目。
该条目的形式是 <service-name>.<namespace-name>.svc.cluster.local ,这意味着如果容器只使用 ``,它将被解析到本地命名空间的服务。这对于跨多个命名空间(如开发、分级和生产)使用相同的配置非常有用。如果您希望跨命名空间访问,则需要使用完全限定域名(FQDN)。
# 创建 Pod kind:Podk8s 底层最小的部署单元是 Pod。Service,Deploy,ReplicaSet# Deploy:直接指定 Pod 模板() kind: Deploy
并非所有对象都在命名空间中
大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些命名空间中。但是命名空间资源本身并不在命名空间中。而且底层资源,例如 nodes 和持久化卷不属于任何命名空间。
查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中:
7、标签和选择器
标签(Label)是附加在 Kubernetes 对象上的一组名值对,其意图是按照对用户有意义的方式来标识 Kubernetes 对象,同时,又不对 Kubernetes 的核心逻辑产生影响。标签可以用来组织和选择一组 Kubernetes 对象。您可以在创建 Kubernetes 对象时为其添加标签,也可以在创建以后再为其添加标签。每个 Kubernetes 对象可以有多个标签,同一个对象的标签的 Key 必须唯一,例如:
metadata: labels: key1: value1 key2: value2
使用标签(Label)可以高效地查询和监听 Kubernetes 对象,在 Kubernetes 界面工具(如 Kubenetes Dashboard 或 Kuboard)和 kubectl 中,标签的使用非常普遍。那些非标识性的信息应该记录在 注解(annotation)
为什么要使用标签
使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。
应用程序的部署或者批处理程序的部署通常都是多维度的(例如,多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象时,很多时候要针对某一个维度的条件做整体操作,例如,将某个版本的程序整体删除,这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就会非常地便捷。
标签的例子有:
release: stable
、release: canary
environment: dev
、environment: qa
、environment: production
tier: frontend
、tier: backend
、tier: cache
partition: customerA
、partition: customerB
track: daily
、track: weekly
上面只是一些使用比较普遍的标签,您可以根据您自己的情况建立合适的使用标签的约定。
句法和字符集
标签是一组名值对(key/value pair)。标签的 key 可以有两个部分:可选的前缀和标签名,通过 /
分隔。
标签名:
标签名部分是必须的
不能多于 63 个字符
必须由字母、数字开始和结尾
可以包含字母、数字、减号
-
、下划线_
、小数点.
标签前缀:
标签前缀部分是可选的
如果指定,必须是一个 DNS 的子域名,例如:k8s.eip.work
不能多于 253 个字符
使用
/
和标签名分隔
如果省略标签前缀,则标签的 key 将被认为是专属于用户的。Kubernetes 的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的 Kubernetes 对象添加标签时,必须指定一个前缀。kubernetes.io/
和 k8s.io/
这两个前缀是 Kubernetes 核心组件预留的。
标签的 value 必须:
不能多于 63 个字符
可以为空字符串
如果不为空,则
必须由字母、数字开始和结尾
可以包含字母、数字、减号
-
、下划线_
、小数点.
apiVersion: v1kind: Podmetadata: name: label-demo labels: environment: production app: nginxspec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
标签选择器
通常来讲,会有多个 Kubernetes 对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器(label selector)是 Kubernetes 中最主要的分类和筛选手段。
Kubernetes api server 支持两种形式的标签选择器,equality-based 基于等式的
和 set-based 基于集合的
。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的 Kubernetes 对象才会被选中
使用基于等式的选择方式,可以使用三种操作符 =、==、!=。前两个操作符含义是一样的,都代表相等,后一个操作符代表不相等
使用基于集合的选择方式
8、注解 annotation
注解(annotation)可以用来向 Kubernetes 对象的 metadata.annotations
字段添加任意的信息。Kubernetes 的客户端或者自动化工具可以存取这些信息以实现其自定义的逻辑。
metadata: annotations: key1: value1 key2: value2
9、字段选择器
字段选择器(Field selectors)允许您根据一个或多个资源字段的值筛选 Kubernetes 资源。 下面是一些使用字段选择器查询的例子:
metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
三个命令玩转所有的 yaml 写法‘
kubectl get xxx -oyaml
kubectl create deploy xxxxx --dry-run-client -oyaml
kubectl explain pod.spec.xx
写完 yaml kubectl apply -f 即可
10、给 vscode 安装插件
搜索 kubernetes ,安装 yaml
和kubernetes template
插件即可
idea 也有 kubernetes 插件
11、认识 kubectl 和 kubelet
kubeadm 安装的集群。二进制后来就是 yum install etcd api-server
认识核心文件夹 /etc/kubernetes . 以 Pod 方式安装的核心组件。
etcd,api-server,scheduler。(安装 k8s 的时候,yum kubeadm kubelet kubectl)
回顾集群安装的时候,为什么只有master节点的kubectl可以操作集群
kubelet 额外参数配置 /etc/sysconfig/kubelet;kubelet 配置位置 /var/lib/kubelet/config.yaml
kubectl 的所有命令参考:
12、自动补全
官方文档地址:
Linux 系统中的 bash 自动补全功能 | Kubernetes
版权声明: 本文为 InfoQ 作者【Lansonli】的原创文章。
原文链接:【http://xie.infoq.cn/article/10b33bd811afa9a08c8ba4355】。文章转载请联系作者。
评论