linux操作文档-k8s资源

Deployment、Service、Pod是k8s最核心的三个资源对象。
Deployment:最常见的无状态应用的控制器,支持应用的扩缩容、滚动更新等操作。
Service:为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接口,用于服务发现和服务访问。
Pod:是运行容器以及调度的最小单位。同一个Pod可以同时运行多个容器,这些容器共享NET、UTS、IPC。除此之外还有USER、PID、MOUNT。

一、创建资源

创建Pod控制器,deployment。可以用来控制多个容器。

创建Service,可以为Pod提供一个统一的访问接口,保证内外网能够访问。默认的type为ClusterIP,集群内任意节点都可访问;type改为NodePort则外网可访问。

1.用命令行的方式创建

1.创建Deployment

创建deployment,名称为web,镜像为nginx,容器数量5

master ~]# kubectl run web --image=nginx --replicas=5
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/web created

查看控制器情况

master ~]# kubectl get deployments.
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    5/5     5            5           2m9s

查看资源详细信息

master ~]# kubectl get deployments. -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
web    5/5     5            5           3m35s   web          nginx    run=web

PS:加上-n选项可以查看指定的控制器情况

2.创建Service

如果想要外网能够访问服务,可以暴露deployment资源,得到service
资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)

master ~]# kubectl expose deployment web --name=web-svc --port=80 --type=NodePort
service/web-svc exposed

查看service情况

master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        20d
web-svc      NodePort    10.111.135.250   <none>        80:32282/TCP   3m59s
3.服务的扩容与缩容
master ~]# kubectl scale deployment web --replicas=7
deployment.extensions/web scaled
master ~]# kubectl get deployments.
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    7/7     7            7           13m
master ~]# kubectl edit deployments. web 
...
spec:
  progressDeadlineSeconds: 600
  replicas: 7           //数量
  revisionHistoryLimit: 10
  selector:
    matchLabels:
...
4.常用命令集合
命令作用
kubectl run创建一个deployment管理创建的容器
kubectl get显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose将一个资源暴露为一个新的kubernetes的service资源(连接外网)
kubectl describe显示特定资源或资源组的详细信息
kubectl scale可以对Deployment, ReplicaSet, Replication,Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set更改现有的应用程序资源
kubectl roollout资源回滚管理

2.使用配置清单创建

一级字段的名称及作用

名称作用
apiVersionapi版本信息
kind资源对象的类别
metadata元数据 名称字段必写
spec用户期望的状态
status资源现在处于什么样的状态(非必须)
1.创建Deployment

可以使用kubectl explain 命令查看我们要写的资源对象的yaml文件怎么
写。比如查看deployment资源的话就可以写成:

master ~]# kubectl explain deploy
KIND:     Deployment
VERSION:  extensions/v1beta1      //版本信息

DESCRIPTION:
     DEPRECATED - This group version of Deployment is deprecated by
     apps/v1beta2/Deployment. See the release notes for more information.
     Deployment enables declarative updates for Pods and ReplicaSets.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object metadata.

   spec	<Object>
     Specification of the desired behavior of the Deployment.

   status	<Object>
     Most recently observed status of the Deployment.

使用yaml配置文件创建deployment

master ~]# mkdir yaml
master ~]# cd yaml/
master yaml]# vim web2.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: web2
spec:
  replicas: 4
  template:
    metadata:
      labels:
        app: web2
    spec:
      containers:
      - name: web2
        image: nginx
master yaml]# kubectl apply -f web2.yaml    //执行命令
deployment.extensions/web2 created

查看执行结果

master yaml]# kubectl get deployments. -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES   SELECTOR
web    7/7     7            7           45m    web          nginx    run=web
web2   4/4     4            4           5m1s   web2         nginx    app=web2
2.创建Service(外网可访问)
master yaml]# vim web2-svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: web-svc
spec:
  type: NodePort      // 指定类型,让外网可访问
  selector:
    app: web2       //使用相同的标签和标签选择器内容,使两个资源对象相互关联
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30033      //指定集群映射端口,范围是30000-32767
master yaml]# kubectl apply -f web2-svc.yaml    //执行命令
service/web-svc created

查看执行结果

master yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        20d
web-svc      NodePort    10.104.94.122   <none>        80:30033/TCP   4s
3.回滚到指定版本

运行一个服务,并记录一个版本信息

master yaml]# kubectl apply -f bdqn.yaml --record 
deployment.extensions/bdqn1 created

查看有哪些版本信息

master yaml]# kubectl rollout history deployment 
deployment.extensions/bdqn1 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=bdqn.yaml --record=true

运行并升级资源,做好记录。
回滚到指定版本

master yaml]# kubectl rollout undo deployment bdqn1 --to-revision=1
deployment.extensions/bdqn1 skipped rollback (current template already matches revision 1)
4.用label控制Pod的位置

添加节点标签

master yaml]# kubectl label nodes node01 disk=ssd
node/node01 labeled

查看节点的label

master yaml]# kubectl get  nodes --show-labels 
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   25d   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01   Ready    <none>   25d   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02   Ready    <none>   25d   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

删除节点标签

master yaml]# kubectl label nodes node01 disk-
node/node01 labeled
master yaml]# kubectl get  nodes --show-labels 
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   25d   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01   Ready    <none>   25d   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02   Ready    <none>   25d   v1.15.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux

编辑yaml文件

     nodeSelector:    //添加节点选择器
       disk: ssd     //和标签内容一致

二、ReplicaSet(RS)资源

1.RS资源架构

在这里插入图片描述
RS资源是Deployment(高级Pod控制器)创建的直接管理Pod的工具,通过RS实现对Pod的控制。
RS资源并不支持滚动更新策略。

2.RS资源特点

  • 确保Pod资源的对象的数量精准
  • 确保Pod健康运行
  • 弹性伸缩
  • 不仅支持基于等值的标签选择器,还支持基于集合的标签选择器。

3.Labesl与selector的关系:

selector拥有选择权,而labels只能被动的被选择。即labels必须全部满足selector的要求,才能被匹配。
常用标签:

标签分类标签名称
release(版本)stable(稳定版)、canary(金丝雀版)、beta(测试版)
environment(环境变量)dev(开发)、qa(测试)、production(生产)
application(应用)ui、as、ps、sc
tier(架构层级)frontend(前端)、backend(后端)、cache(缓存)
partition(分区)customerA(客户A)、custonerB(客户B)
track(品控级别)daily(每天)、weekly(每周)

4.架构实操展示

创建一个Deployment以后测试

master yaml]# kubectl describe deployments. bdqn1
...
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  93s   deployment-controller  Scaled up replica set bdqn1-5d4fcb99f8 to 5

PS:Events:事件提示。描述了整个资源从开始到现在都做了哪些工作。
由此看出Deployment并没有直接控制Pod,而是创建了一个ReplicaSet资源。

master yaml]# kubectl describe rs bdqn1-5d4fcb99f8
...
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  9m25s  replicaset-controller  Created pod: bdqn1-5d4fcb99f8-w6zkh
  Normal  SuccessfulCreate  9m25s  replicaset-controller  Created pod: bdqn1-5d4fcb99f8-7rxjc
  Normal  SuccessfulCreate  9m25s  replicaset-controller  Created pod: bdqn1-5d4fcb99f8-kkctr
  Normal  SuccessfulCreate  9m25s  replicaset-controller  Created pod: bdqn1-5d4fcb99f8-zm5w4
  Normal  SuccessfulCreate  9m25s  replicaset-controller  Created pod: bdqn1-5d4fcb99f8-tx8gr

由此看出RS资源对各个Pod进行控制。

三、Service资源

1.Service网络类型

默认情况下Service的网络类型为ClusterIP,yaml文件中的spec.ports.port字段描述的是ClusterIP的端口,供k8s集群内的Pod使用。
想要让外网能够访问到Pod,需要改为NodePort.

2.Service的负载均衡原理

默认使用的是iptables规则。
SNAT:Source NAT(源地址转换)
DNAT: Destination NAT (目标地址转换)
MASQ:动态的源地址转换
查看各个Pod

master yaml]# kubectl get  po -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
bdqn1-5d4fcb99f8-7rxjc   1/1     Running   0          42m   10.244.2.2   node02   <none>           <none>
bdqn1-5d4fcb99f8-kkctr   1/1     Running   0          42m   10.244.1.4   node01   <none>           <none>
bdqn1-5d4fcb99f8-tx8gr   1/1     Running   0          42m   10.244.2.3   node02   <none>           <none>
bdqn1-5d4fcb99f8-w6zkh   1/1     Running   0          42m   10.244.1.3   node01   <none>           <none>
bdqn1-5d4fcb99f8-zm5w4   1/1     Running   0          42m   10.244.1.2   node01   <none>           <none>

通过iptables规则验证负载均衡

master yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
bdqn-svc     NodePort    10.99.118.33   <none>        1000:32034/TCP   7s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          25d
master yaml]# iptables-save |grep 10.99.118.33
...
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.99.118.33/32 -p tcp -m comment --comment "default/bdqn-svc: cluster IP" -m tcp --dport 1000 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.99.118.33/32 -p tcp -m comment --comment "default/bdqn-svc: cluster IP" -m tcp --dport 1000 -j KUBE-SVC-JJGYWDY4HBOKLHP2
master yaml]# iptables-save |grep KUBE-SVC-JJGYWDY4HBOKLHP2
...
-A KUBE-SEP-NFBERJ5UU7MLBDZW -s 10.244.2.3/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-NFBERJ5UU7MLBDZW -p tcp -m tcp -j DNAT --to-destination 10.244.2.3:80
-A KUBE-SVC-JJGYWDY4HBOKLHP2 -j KUBE-SEP-NFBERJ5UU7MLBDZW

验证得流量从10.99.118.33跳转到了10.244.2.3,实现了负载均衡。

四、Pod资源

一个Pod中可以运行多个Container,但是一般都只运行一个。
在这里插入图片描述
例:一个Pod中创建多个容器的方法:

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name:test-app
    image: httpd
  
  - name: test-web
    image: busybox

一个Pod内的多个容器共用NET(网络栈)、UTS(主机名\域名)、IPC(共享内存\消息队列)。
一旦一个容器坏掉,则整个Pod都无法正常工作。故而一般一个Pod内只有一个容器。
在这里插入图片描述

1.名称空间(Namespace)

namespace资源对象仅用于资源对象的隔离,并不能隔绝不同名称空间的Pod之间的通信,那是网络策略资源的功能。

查看名称空间

master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   32d
kube-node-lease   Active   32d
kube-public       Active   32d
kube-system       Active   32d

查看名称空间详细信息

master ~]# kubectl describe ns default 
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.

No resource limits.

创建名称空间

master ~]# kubectl create ns bdqn
namespace/bdqn created

删除名称空间

master ~]# kubectl delete ns bdqn 
namespace "bdqn" deleted

2.镜像获取策略

kind: Pod
apiVersion: v1
metadata:
  name: pod1
spec:
  containers:
  - name: pod1
    image: httpd
    imagePullPolicy: IfNotPresent

k8s默认根据镜像的TAG不同,有三种不同的策略。
Always:镜像标签为“latest”或镜像标签不存在时,总是从指定的仓库(默认的官方仓库、或者私有仓库)中获取最新镜像。
IfNotPresent:仅当本地镜像不存在时才从目标仓库中下载。也意味着,如果本地存在,直接使用本地镜像,无需再联网下载。
Never:禁止从仓库中下载镜像,只能使用本地镜像。
PS:对于标签为“latest”或者这标签不存在,其默认镜像下载策略为"Always",而对于其他标签的镜像,默认使用了“IfNotPresent”。

3.容器的重启策略

kind: Pod
apiVersion: v1
metadata:
  name: pod1
spec:
  restartPolicy: OnFailure
  containers:
  - name: pod1
    image: httpd
    imagePullPolicy: IfNotPresent

三种容器重启策略
Always:但凡Pod对象终止就想起重启,此为默认设定。
OnFailure:仅在Pod对象出现错误时才将其重启。
Never:从不重启。

4.Pod的默认健康检查

根据重启策略进行健康检查

kind: Pod
apiVersion: v1
metadata:
  name: bdqn
spec:
  restartPolicy: OnFailure
  containers:
  - name: bdqn
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 10 ; exit 1
aster yaml]# kubectl get po -w
NAME   READY   STATUS    RESTARTS   AGE
bdqn   1/1     Running   0          7s
pod1   1/1     Running   0          13m
bdqn   0/1     Error     0          14s
bdqn   1/1     Running   1          16s
bdqn   0/1     Error     1          26s
1.LivenessProbe(活跃度、存活性)

Liveness活跃度探测,根据探测某个文件是否存在,来确认某个服务是否正常进行,如果存在则正常,否则它会根据你设置的Pod的重启策略操作Pod。

kind: Pod
apiVersion: v1
metadata:
  name: liveness
  labels:
    test: liveness
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/test; sleep 10 ; rm -rf /tmp/test; sleep 30
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/test
      initialDelaySeconds: 5   //Pod运行5秒后开始探测
      periodSeconds: 2    //每2秒探测一次
master yaml]# kubectl get pod liveness  -w
NAME       READY   STATUS    RESTARTS   AGE
liveness   1/1     Running   0          14s
liveness   1/1     Running   1          46s
liveness   1/1     Running   2          88s
liveness   1/1     Running   3          2m12s
2.Readiness(敏捷探测、就绪性探测)
kind: Pod
apiVersion: v1
metadata:
  name: readiness
  labels:
    test: readiness
spec:
  restartPolicy: OnFailure
  containers:
  - name: readiness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/test; sleep 10 ; rm -rf /tmp/test; sleep 30
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/test
      initialDelaySeconds: 5
      periodSeconds: 2
@master yaml]# kubectl get pod readiness -w
NAME        READY   STATUS    RESTARTS   AGE
readiness   1/1     Running   0          13s
readiness   0/1     Running   0          18s
readiness   0/1     Completed   0          43s

总结:liveness和readiness探测

  • liveness和readiness是两种健康检查机制,如果不特意配置,k8s将两种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零,来判断探测是否成功。
  • 两种探测配置方法完全一样,不同之处在于探测失败后的行为:liveness探测是根据Pod重启策略操作容器,大多数是重启容器。readiness则是将容器设置为不可用,不接收Service转发的请求。
  • 两种探测方法可以独立存在,也可以同时使用。用liveness判断容器是否需要重启实现自愈;用readiness判断容器是否已经准备好对外提供服务。

五、DaemonSet资源

1.特点及使用场景

特点:
它会在每一个Node节点上都会生成并且只能生产一个Pod资源。
使用场景:
如果必须将Pod运行在固定的某个或某几个接地那,且要优先于其他的Pod启动。通常情况下,默认每一个节点都会运行,并且只能运行一个Pod。这种情况下推荐使用DS资源对象。

2例:

运行一个web服务,在每一个节点都运行一个Pod。

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: test-ds
spec:
  template:
    metadata:
      labels:
        name: test-ds
    spec:
      containers:
      - name: test-ds
        image: httpd

六、Job资源对象

服务类的Pod容器:RC、RS、DS、Deployment。(Pod内运行的服务,要持续运行)
工作类的Pod容器:Job。执行一次,或者批量执行处理程序,完成后退出容器。

1.提高Job的执行效率

parallelism:表示同时运行多少个Pod执行任务。
completions:表示总共需要完成Pod的数量。

kiind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  parallelism: 2
  completions: 8
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: Never

2.定时执行Job

kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello cronjob!"]
          restartPolicy: OnFailure

每一分钟执行一次

3.添加apiVersion库

master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 

在yaml文件中的command指令下添加

...
  - command:
    - --runtime-config=batch/v2alpha1=true
...

然后重启kubelet服务
查看api版本库

@master ~]#kubectl api-versions
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐