开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
1.kubernetes资源介绍
1.1.Pod
容器都是由镜像启动的,但在容器外面会通过Pod将容器包裹起来,这个是k8s的概念,在这个Pod里面可以有一个或多个容器
Pod都有哪些特征?
Pod里的所有容器都会调度在同一个节点上运行
Pod中的所有容器都会共享同一网络,它们有一个唯一的IP,就叫PodIP
Pod中还有一个特殊的容器叫Pause,它会优先启动然后进行IP分配,而后将其他容器都link到该容器上,实现网络共享
1.2.Deployment
在Pod的上一层就是ReplicaSet控制器,它主要负责管理Pod的副本数,但通常我们并不直接使用ReplicaSet
而是使用比ReplicaSet更高一级的Deployment.由Deployment管理ReplicaSet,它2会自动帮我们创建和销毁
RS,有了Deployment就可以实现应用的滚动更新
1.3.Service
service是kubernetes用来实现Pod负载均衡的一个服务;要想实现Pod的负载均衡,首先需要通过labels
为Pod打上特定的标签,而后创建service时使用selector选择对应的标签,最终通过节点的kube-proxy来
完成负载均衡的规则创建
label:打标签
selector:标签选择器
1.5.Namespace
在kubernetes中,名字空间(namespace)提供了一种机制,将同一集群中的资源划分为相互隔离的组
同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求
可以对资源对象进行隔离:比如:Pod、Deployent、service将其划分为相互隔离的组
可以对资源配额进行隔离:CPU、Memory限制某个NS的可以使用CPU和内存
namespace仅能隔离带有名称空间的资源,而不带名称空间的资源不支持隔离,可以通过kubectl api-resources查看哪些资源属于名称空间级别,哪些不属于名称空间级别
1.查看命名空间
[root@k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 3d
kube-flannel Active 2d23h
kube-node-lease Active 3d
kube-public Active 3d
kube-system Active 3d
2.创建命名空间
[root@k8s-master ~]# kubectl create namespace dev
namespace/dev created
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx --replicas=3 --namespace=dev
deployment.apps/nginx created
[root@k8s-master ~]# kubectl get namespace -n dev
NAME STATUS AGE
default Active 3d
dev Active 64s #刚刚我们创建的
kube-flannel Active 2d23h
kube-node-lease Active 3d
kube-public Active 3d
kube-system Active 3d
[root@k8s-master ~]# kubectl get pod -n dev
3.测试命名空间隔离性
测试不同名称空间的ServiceIP隔离;
测试不同名称空间的PodIP网络的隔离;
测试不同名称空间的DNS隔离;
总结:
Namespace隔离其实就是名称的隔离,并不是物理的隔离,所以重点在于资源隔离
4.命名空间划分
-
按业务划分
-
按环境划分
-
按团队划分
2.kubernetes对象
2.1.什么是对象
在kubernetes系统中,我们所操作的资源就是对象,而对象是一个持久化的实体,也就是说将我们对资源的操作记录下来
kubernetes需要使用这些实体来表示整个集群的状态。
它们描述了如下信息:
哪些容器化应用在运行,以及这些应用运行在哪些节点上
应用程序可以使用资源
应用程序运行时的策略,比如重启策略,升级策略,以及容错策略
kubernetes对象是目标性记录,也就是说一旦创建对象,kubernetes系统将持续工作以确保该对象存在,并达到用户所
期望的状态。一旦我们想要操作kubernetes对象,无论是创建、修改、或者删除,都需要使用到kubernetes API接口
2.2.对象规范与状态
kubernetes几乎每个对象都包含两个嵌套的对象字段,对象spec(规范)和对象status(状态)
spec:是在创建该对象是设定其内容,通过spec来描述你希望对象所具有的特征(也就是期望状态)
status:描述了对象的当前状态(current statue),它是由kubernetes系统和组件设置并更新的
任何时刻,kubernetes控制平面都一直积极地管理着对象的实际状态,以便于它期望状态相匹配
例如kubernetes中的Deployment对象能够表示运行在集群中的应用。当创建Deployment时,可能需要设置
Deployment的spec,用于指定该应用需要有3个副本运行,kubernetes系统读取Deployment规范,并启动我们
所期望的应用3个副本,更新当前状态以与规范中期望状态相匹配。如果这些实例中有的失败了(也是一种状态
变更),kubernetes系统通过执行修正操作来响应spec与status状态间出现的不一致,可能会启动一个新的
(实例)副本来替换失败的
2.3.理解对象
创建kubernetes对象时,必须提供对象的spec(规范),用来描述该对象的期望状态,以及对象的一些基本信息(例如名称)。使用kubectl创建资源对象时,请求kubernetes API必须在请求体中包含JSON格式的信息,但大多数情况下我们都是使用的YAML格式来创建资源,所以只需要在YAML格式文件中描述对应的spec规范。在kubectl发起API请求时,会将这些信息转换成JSON格式
yaml文件示例
cat pod-base.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: dev #命名空间
labels: #标签
app: base
spec:
replicas: 2 #2个副本
containers:
- name: nginx #容器名称
image: nginx:1.15 #容器的镜像
- name: busybox #容器名称
image: busybox:1.30 #容器的镜像
接下来通过kubectl应用该文件,然后kubectl会将该文件转为json提交给kubernetes API
2.4.对象必须字段
在想要创建的kubernetes对象对应的.yaml文件中,需要配置如下的字段:
-
apiversion---创建该对象所使用的kubernetes API的版本
-
kind---想要创建的对象的类别:pod、deployment、service
-
metadata---标识对象唯一性的一些数据,包括一个name字符串,UID和可选的namespace
-
spec---所期望该对象的状态
2.5.如何创建对象
kubectl create deploy nginx2 --image=nginx
kubectl get pod nginx2-5fc4444698-m4hhz -o yaml
3.kubernetes资源实践
通过部署应用来理解kubernetes中的资源
3.1.部署应用
[root@k8s-master ~]# mkdir -p /k8s/deploy
[root@k8s-master /k8s/deploy]# vim first-pod-deploy.yaml
apiVersion: apps/v1
kind: Deployment #类型为Deployment
metadata:
name: first-deploy #pod的名称
namespace: dev #命名空间为dev
spec:
replicas: 3 #pod的数量
selector:
matchLabels:
first: deploy #选择那个pod的标签,那个pod定义了first=deploy,则选择它
template:
metadata:
labels: #定义标签
first: deploy #pod的标签
spec:
containers:
- name: first-deploy-pod #容器的名称
image: nginx #容器所需要的镜像
ports: #定义端口
- containerPort: 80 #容器提供的端口
创建namespace
[root@k8s-master /k8s/deploy]# kubectl create ns dev
应用配置文件
[root@k8s-master /k8s/deploy]# kubectl apply -f first-pod-deploy.yaml
deployment.apps/first-deploy created
查看pod
[root@k8s-master /k8s/deploy]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
first-deploy-598c44c757-6dft9 1/1 Running 0 115s
first-deploy-598c44c757-6zf8c 1/1 Running 0 115s
first-deploy-598c44c757-lvgbx 1/1 Running 0 115s
[root@k8s-master /k8s/deploy]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
first-deploy 3/3 3 3 2m14s
可以使用kubectl explain 命令来查看创建deployment都需要哪些对象
3.2.访问应用
[root@k8s-master /k8s/deploy]# vim first-pod-deploy-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: first-svc #这个名称会被CoreDns解析为对应的域名
namespace: dev
spec:
selector: #service的后端都有哪些pod;通过selector选择对应的pod
first: deploy
ports:
- name: first-http
port: 80 #负载均衡的端口
targetPort: 80 #容器对外的端口
应用service配置文件
[root@k8s-master /k8s/deploy]# kubectl apply -f first-pod-deploy-svc.yaml
service/first-svc created
查看service资源
[root@k8s-master /k8s/deploy]# kubectl get service -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
first-svc ClusterIP 10.96.52.125 <none> 80/TCP 77s
[root@k8s-master /k8s/deploy]# kubectl describe svc -n dev
Name: first-svc
Namespace: dev
Labels: <none>
Annotations: <none>
Selector: first=deploy
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.96.52.125
IPs: 10.96.52.125
Port: first-http 80/TCP
TargetPort: 80/TCP
Endpoints: 10.19.3.10:80,10.19.3.8:80,10.19.3.9:80
Session Affinity: None
Events: <none>