目录
1 K8S中的基本资源概念
1.1 K8S基本资源概述
上面的案例中涉及到了一些基本的K8S资源,这里对它们进行简要的介绍,,本节的目的就是让我们对K8S中的资源有一个初步的认识,循序渐进。后续再分别进行详细介绍,比如:Deployment如何管理Pod?Service如何找到要代理的Pod?Label 标签的作用还有什么?等等内容。
- Pod:K8s最小部署单元,一组容器的集合
- Deployment:最常见的工作负载控制器,用于更高级别部署和管理Pod
- Service:为一组Pod提供负载均衡,对外提供统一访问入口
- Label :标签,附加到某个资源上,用于关联对象、查询和筛选
- Namespaces:命名空间,将对象逻辑上隔离,也利于权限控制
其中,Pod、Deployment、Service这三个资源主要适用于创建和访问容器的,第2节案例中也主要是通过这三个资源进行应用程序的部署访问。所以接下来对 Lable 和 Namespace 稍微进行展开介绍:
1.2 Lable
Lable用于标注不同的资源,对这些资源进行分类,因为单一的通过资源名称的方式来分类资源的维度是不够用的。相关指令如下:
#查看pod时也查看pods的标签
kubectl get pods --show-labels
#查询标签对应的资源(查看标签名为nginx的pod)
kubectl get pods -l app=nginx
1.3 Namespace
Namespace用于在Kubernetes中将资源对象进行逻辑上的隔离,从而形成多个虚拟集群。
(1)应用场景
- 根据不同团队划分命名空间
- 根据项目划分命名空间
(2)命名空间的分类
通过如下指令,获取当前K8S集群下的命名空间:
kubectl get namespace
- default:默认命名空间(部署应用时,如果不指定命名空间,该应用就会被指定到默认命名空间下)
- kube-system:K8s系统方面的命名空间(比如K8S集群的网络组件calico、监控组件等就可以部署在该命名空间下)
- kube-public:公开的命名空间,谁都可以访问
- kube-node-lease:K8s内部命名空间
(3)指定资源命名空间的2种方式
- 命令行加 -n
- yaml资源元数据里指定 namespace 字段
2 YAML 文件管理 K8S 资源对象
2.1 YAML 基本语法与字段介绍
(1)基本语法
YAML文用于在K8S中编排和部署应用,将配置信息和操作过程进行了集中化的封装,更加方便。YAML文件基本语法如下:
- 缩进表示层级关系,使用空格缩进(一般2个空格,字符后缩进1个空格),不支持Tab缩进
- “-” 表示数组元素
- “---” 表示YAML格式,一个文件的开始
- “#”注释
(2)字段介绍
字段名称 | 解释 |
apiVersion | K8S-apiserver中的API版本,一般都是apps/v1,可查看K8S官网示例 |
kind | 资源类型(kubectl api-resources 指令可查看所有K8S资源类型,资源类型有很多,但是常用的只有30%) |
metadata | 资源元数据(name:资源的具体名字,namespace:该资源放到哪个命名空间下) |
spec | 资源规格(包含:副本数量、标签选择器等) |
replicas | 副本数量 |
selector | 标签选择器 |
template | Pod模板 |
metadata | Pod元数据 |
spec | Pod规格 |
containers | 容器配置 |
2.2 YAML 部署应用
步骤如下:
#在Matser节点下进行如下操作
#1、在~目录下创建文件
vi deployment.yaml
#2、编辑deployment资源的yaml文件,文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx2
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web2
template:
metadata:
labels:
app: web2
spec:
containers:
- name: web2
image: nginx:1.17
#3、部署deployment资源(创建Pod)
kubectl apply -f deployment.yaml
#上述YAML文件等同于:kubectl create deployment nginx2 --image=nginx:1.17 -n default
#4、在~目录下创建文件
vi service.yaml
#5、编辑service资源的yaml文件,文件内容如下:
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
ports:
-port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort
#6、部署service资源(设置端口映射,让容器能被外部访问)
kubectl apply -f service.yaml
#上述YAML文件等同于:kubectl expose deployment web2 --port=80 --target-port=8080 --type=NodePort -n default
#7、查看刚创建好资源与服务
kubectl get pods
kubectl get svc
#8、访问
#http://192.168.200.211:32522/
资源部署好之后,查看资源如下图:
访问应用如下图:
2.3 注意事项
(1)注意 create 指令和 apply指令的区别
create 指令用于在命令行初次创建某个资源,如果使用yaml文件创建资源,最好不用create指令,如下指令虽然能创建资源,但是没法更新
kubectl create -f deployment.yaml
apply 指令用于通过yaml文件创建资源,也可用于资源的更新,如下
kubectl apply -f deployment.yaml
(2)yaml文件可以合并
上面 5.2 小节过程中分别创建了deployment.yaml、service.yaml两个配置文件,而这两个配置文件其实可以写到一个配置文件里面,两个文件之间用“---”隔开一行即可。这样只要执行一次apply指令就能把这两个资源同时部署到K8S集群之中。
3 YAML 文件自动生成
上面的yaml文件是手写的,然而yaml文件是可以自动生成的,有两种途径:
- 方式1:在命令行中用 kubectl create 命令生成yaml文件
- 方式2:用get命令将已有资源导出为yaml文件
(1)在命令行中用 kubectl create 命令生成yaml文件
#单纯的检查指令是否正确,不执行操作(--dry-run=client),并生成对应的yaml文件(-o yaml > deployment-export.yaml)
kubectl create deployment web --image=lizhenliang/java-demo -n default --dry-run=client -o yaml > deployment-export.yaml
#删除多余的字段(删除最开始的 creationTimestamp和文件结尾的status字段后保存)
vi deployment-export.yaml
#用这个自动生成的yaml文件创建pod
kubectl apply -f deployment-export.yaml
#同理根据指令生成service资源的yaml配置文件(删掉最开始的 creationTimestamp和文件结尾的status字段后保存)
kubectl expose deployment web --port=80 --target-port=8080 --type=NodePort -n default --dry-run=client -o yaml > service-export.yaml
(2)用get命令将已有资源导出为yaml文件
对所有资源都通用,便于观察K8S集群中部署了哪些资源,做了哪些事,但是yaml中的字段太多了
#先将yaml导出
kubectl get deployment nginx -o yaml > deployment-export2.yaml
#编辑yaml文件,删除managedFields、annotations、creationTimestamp、generation、resourceVersion、selfLink、uid、progressDeadlineSeconds、creationTimestamp、status整个字段(字段后的缩进内容也要删除)
vi deployment-export2.yaml
(3)yaml文件字段查询
如果你忘记了Pod容器的字段含义是什么,可以通过如下命令查询:
#查询pod资源下spec字段下containers字段下所有字段的含义
kubectl explain pods.spec.containers
#查询deployment资源下各字段的详细信息
kubectl explain deployment
(4)分析
kubectl命令行和yaml都能创建资源,如何决策?
- 命令行创建资源:快捷方便,适用于简单的、一次性的项目部署
- yaml创建资源:灵活性强,yaml文件能复用,适用于复杂项目部署