kubernetes资源与对象入门-1

39 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

1.kubernetes资源介绍

1.1.Pod

容器都是由镜像启动的,但在容器外面会通过Pod将容器包裹起来,这个是k8s的概念,在这个Pod里面可以有一个或多个容器

Pod都有哪些特征?
    Pod里的所有容器都会调度在同一个节点上运行
    Pod中的所有容器都会共享同一网络,它们有一个唯一的IP,就叫PodIP
    Pod中还有一个特殊的容器叫Pause,它会优先启动然后进行IP分配,而后将其他容器都link到该容器上,实现网络共享

图片.png

1.2.Deployment

在Pod的上一层就是ReplicaSet控制器,它主要负责管理Pod的副本数,但通常我们并不直接使用ReplicaSet
而是使用比ReplicaSet更高一级的Deployment.由Deployment管理ReplicaSet,它2会自动帮我们创建和销毁
RS,有了Deployment就可以实现应用的滚动更新

图片.png

1.3.Service

service是kubernetes用来实现Pod负载均衡的一个服务;要想实现Pod的负载均衡,首先需要通过labels
为Pod打上特定的标签,而后创建service时使用selector选择对应的标签,最终通过节点的kube-proxy来
完成负载均衡的规则创建

label:打标签
selector:标签选择器

图片.png

1.5.Namespace

在kubernetes中,名字空间(namespace)提供了一种机制,将同一集群中的资源划分为相互隔离的组
同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求

可以对资源对象进行隔离:比如:Pod、Deployent、service将其划分为相互隔离的组
可以对资源配额进行隔离:CPU、Memory限制某个NS的可以使用CPU和内存

图片.png

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

图片.png

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

图片.png

图片.png

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都需要哪些对象

图片.png

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>

图片.png