hydd的Linux笔记Day73

本文是关于Kubernetes管理的笔记,重点介绍了kubectl命令,包括介绍、run、get、exec、describe、console和delete等子命令。此外,还详细讲解了Kubernetes的系统服务,如命名空间、POD、Deployment、资源文件和控制器,以及集群调度策略,如DaemonSet、污点和节点选择器等。
摘要由CSDN通过智能技术生成

Day73

Kubernetes管理

kubectl命令

kubectl介绍

kubectl是用于控制Kubernetes集群的命令行工具

语法格式:

kubectl [子命令] [资源类型] [资源名称] [指定可选标志]

kubectl run

kubectl run 创建容器

语法格式:kubectl run 资源名称 -i -t --image=私有仓库镜像名称:标签

kubectl get

kubectl get 查询资源

​ get node 查询节点状态

​ get deployment 查询资源名称

​ get pod 查询pod容器资源

​ get pod -o wide 查询主机信息

​ get pod -o yaml 显示资源文件Yaml格式

kubectl exec

启动新命令,进入一个正在运行的容器

语法格式: kubuctl exec -it 容器id 执行的命令

kubectl describe

查看资源详细信息(经常用于排错)

kubctl describe 资源类型 资源名称

kubectl describe deployment 资源名称 #查看资源详细信息

kubectl console 管理

查看consloe终端的输出信息

​ logs和attach命令

kubectl delete

删除资源

kubelctl delete 资源类型 资源名称

kubectl delete pod id

删除后会自动重建

kubectl delete deployment 资源名称

执行完上面的命令容器彻底消失

系统服务

命名空间

系统命名空间,

default 默认的命名空间,不声明命名空间的POD都在这里

kube-node-lease 为高可用提供心跳监视的命名空间

kube-public 公共数据,所用户都可以读取它。

kube-system 系统服务队形所使用的命名空间

查看命名空间

kubectl get namespace

查看命名空间中的资源对象

kubectl -n kube-system get pod

POD概述

POD是Kubernetes中最小的管理元素

一个Pod包含1个或者多个容器

​ 例如共享网络、共享存储等

理解POD对掌握kubectl非常的重要

Pod支持横向扩展和复制

POD的生命周期

​ Pod对象自从其创建开始至其中终止退出的时间范畴成为其声明命周期。在这段时间中,pod会处于多种不同的状态,并执行一些操作;其中、创建主容器(main container)为必需的操作,其他可选的操作还包括运行初始化容器(init conntainer)、容器启动后钩子(post start hook)、容器的存活性探测(liveness probe)、就绪性探测(readiness probe)。以及容器终止前钩子(per stop hook)等,这些操作是否执行则取决于Pod的定义。

img

Pod phase

​ Pod的starus字段是一个PosStartus的对象,Pod对象总是应该处于其声明进程中以下几个相位之一。

​ Pending 容器创建过程中,但它尚未调度完成

​ Running 所有容器都已经被kubelet创建完成

​ Succeeded 所有容器都已经成功终止了并不会被重启

​ Failed Pod 中所有容器中至少有一个容器退出非0状态

​ Unknown 无法正常获取到Pod对象的状态信息

img

img

Pod特点

Pod的生命周期是短暂的,用后即焚的实体。

​ 注意:重启Pod中的容器和重启Pod不同,Pod中提供容器的运行环境并保持容器的运行状态,重启容器不会造成Pod重启。

Pod不会自愈。如果Pod运行的Node故障或是整个调度器故障,这个Pod就会被删除。

控制器可以自动创建和管理多个Pod,提供副本管理,滚动升级和集群级别的自愈能力。

Deployment

Deployment/RC/RS都是资源控制器

Deployment为Pod和replicaSet提供了一个声明式定义的方法,用来替代以前的replicationController来方便的管理应用。典型的应用场景包括:

定义Deployment来创建Pod和ReolicaSet

滚动升级和回滚应用

扩容和缩容

暂停和继续Deployment

资源文件

资源对象文件

kubernetes通过RC/RS管理POD,在RC中定义了如何启动Pod,如和运行,启动几个副本等功能,如果我们创建文件,在其中使用Yaml、的语法格式描述了上面的信息,这个文件就是我们的资源对象文件。

资源对象文件可以创建、删除、管理资源对象

RC/RS/Deployment

​ kubernetes通过Replication Controll(简称RC)

​ 管理PoD在RC中定义了如何启动POD,如何运行,启动几个副本等功能,如果我们创建文件在其中使用了Yaml的语法格式,描述了上面的信息,这个文件就是我们的资源对象文件。

​ ReplicaSet是RC的升级版

​ Deployment 为Posd和RS提供描述性的更新方式

资源对象文件一般由用户根据需求进行编写

我们也可以查询一个资源对象文件

格式包括 json、yaml

​ kubectl get 资源对象 资源名称 -o 格式

POD资源文件举例
---				#资源定义起始标志
apiVersion: v1	#定义当前格式的版本
kind: Pod		#当前创建的资源的类型
metadata:		#当前资源的元数据
  name: pod-example	#当前资源的名称
  labels:			#当前资源的卷标
    app: myapp		#卷标,可被引用
spec:				#当前资源的详细定义
  containers:		#容器定义
  - name: myos		#容器名称,多容器在一个POD中名称不能重复
    image: 192.168.1.100:5000/myos:v1804	#启动容器镜像的地址
    stdin: true		#交互式,相当于-i后台服务不需要
    tty: true		#分配终端,相当于-t后台服务不需要
  restartPolicy: Always	#资源重启策略[Always,Onfailure,Never]
  						#Alwas是默认策略

img

标签和选择器

为了建立控制器和pod间的关联,kubernetes先给每个pod打上一个标签,然后再给相应的位置定义标签选择器,引用这些标签。

……
selector:		#声明标签选择器
  app:nginx		#为服务的后端选择标签
……
metadata:	
 labels:		#声明标签
   app:nginx	#定义标签名字(上下标签必须一致)

如何使用资源文件

使用资源文件管理对象

​ create创建资源对象

​ apply 声明更新资源对象

​ delete删除资源对象

​ kubectl (apply|create|delete) -f 资源文件

控制器与集群调度

控制器

Deployment控制器

Deployment 通用控制器,为POD和ReplicaSet提供声明方式的定义方式,典型应用场景

​ 定义Deployment来创建ReolicaSet和Pod

​ 维护POD副本数量

​ 滚动升级和回滚应用

​ 暂停和继续Deployment

集群扩容

replicas决定了集群pod的数量

​ 创建一个单节点的web容器

​ 例子 web-example.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-example
spec:
  selector:
    matchLabels:
      app: myapp-web
  replicas: 3
  #revisionHistoryLimit: 10
  #strategy:
  #  rollingUpdate:
  #    maxSurge: 25%
  #    maxUnavailable: 25%
  #  type: RollingUpdate
  template:
    metadata:
      labels:
        app: myapp-web
    spec:
      #nodeName: node-0001
      #nodeSelector:
      #  disktype: ssd
      #affinity:
      #  podAffinity:
      #    requiredDuringSchedulingIgnoredDuringExecution:
      #    - labelSelector:
      #        matchExpressions:
      #        - key: app
      #          operator: In
      #          values:
      #          - myapp-php
      #      topologyKey: kubernetes.io/hostname
      #  podAntiAffinity:
      #    preferredDuringSchedulingIgnoredDuringExecution:
      #    - weight: 1
      #      podAffinityTerm:
      #        labelSelector:
      #          matchExpressions:
      #          - key: app
      #            operator: In
      #            values:
      #            - myapp-apache
      #        topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: 192.168.1.100:5000/myos:nginx
        ports:
        - protocol: TCP
          containerPort: 80
      restartPolicy: Always

在集群运行的过程中我们可以动态调整集群pod的数量

可以使用如下两种方式更改

​ 修改服务配置,即时生效kubectl edit deployments.apps httpd-example

scale 命令

kubectl scale deployment.apps httpd-example --replicas=3

Deployment更新

如果想更新apche到nginx怎么办?

deployment.spec.strategy支持两种策略;

​ Recreate 重建式更新,就是删一个建一个(很少使用)

​ rollingUpdate 滚动更新,可以指定更新几个POD

rollingUpdate有两个参数
maxSurge 指定超出副本数有几个(指定数量或者百分比)

​ maxUnavailable 最多有几个不可用

deploy.spec.revisionHistoryLimit 保留版本数量

img

更新与回滚

查看历史版本,回滚

​ kubectl rollout history deployment httpd-examlp

​ kubectl rollout undo deployment httpd-example --to-revision=1

集群调度

DaemonSet控制器

DaemonSet 每个机器都要启动运行的Pod,确保全部或一些Node上运行Pod副本

​ 当有Node加入集群时也会为他新增副本,当Node从集群移除式,这些POd也会被回收

​ 删除DeamonSet时将删除所有由他创建的Pod副本

​ 典型应用;ceph节点、监控节点、filebeat日志收集等

​ 系统服务 kube-proxy 和 flannel 就是这种类型

DaemonSet资源文件

deamonset与deployment非常相似,区别是不需要设置replicas,因为daemonset是每节点启动的。

示例:

---
apiVersion: apps/v1
kind: deamonSet			#声明dawmonSet资源类型
metadata: 
  name: daemonset-example  #DaemonSet资源名称
  namespace: default		#POD所在的命名空间
spec: 
  selector: 
    matchLabels: 
      app: myweb
    template: 
……						#以下配置与Deployment完全相同

创建daemondet资源

kubectl apply -f 资源文件名

Pod部署策略

deamonset会调度除了mater以外的所有节点,master除了一些系统服务外不会再有其他Pod。

污点

污点标签

​ NoSchedule 不会被调用

​ PreferNoSchedule 尽量不被调度

​ NoExecute 驱除节点

查看污点标签

kubectl describe node 节点名称

​ ……

​ Taints: node-role.kubernetes.io/master

​ ……

设置污点标签

​ kubectl taint node node-001 key=vlaue:污点类型

删除污点标签

​ kubectl taint node node-001 key-

注意:可以自定义添加修改标签,不要修改所有系统默认标签。

nodeSelector选择

nodeSelector是节点选择约束的最简单的推荐形式

查看标签

kubectl get node --show-labels

设置标签

kubectl label nodes =

删除标签

kubectl label nodes -

标签选择器

根据标签选择

​ 注意:如果添加了标签选择,但是无法找到对应的标签,POD将一直处于Pending状态,直到标签可用

nodeName标签也可以指定node节点名称,不推荐使用

可以给任意案例添加选择器

spec: 					#POD.SPEC 标签
  naodeSelector: 		#标签选择
    disktype: ssd		#node标签
    
serc: 					#POD.SPEC 标签
 nodeName: node-001		#直接指定node主机名称,简单粗暴
亲和与反亲和

亲和可理解成偏好或喜好

kubernetes中亲和两种方式

​ 硬策略:

​ requiredDuringSechedulinglgnoredDuringExecution

​ 软策略

​ preferredDuring SchedulinglgnoredDuringExecution

亲和性特质在 pod.spec.affinity.nodeAffinity 中设置

控制器类型

job单任务控制器,负责执行一次任务,保证任务在一个或多个Pod上执行成功

CronJob重复多次任务控制器

​ 基于时间管理的Job,是在特定的时间自动创建Job

​ 典型用法:周期性计划任务

img

cronjob任务的本质是多次创建job

​ 在job中会保留最后三次的状态、其他的也会被清除

控制器类型

StatefulSet有状态服务相关POD

​ 为解决有状态服务设计的一种控制器

​ 基于PVC的稳定持久化存储

​ 稳定的网络标志,基于Headless Service

​ 有序部署,有序扩展/收缩(基于init containers实现)

Horizontal Pod Autoscaling 控制器

​ 自动扩展,可以根据业务的高峰和低谷自动水平扩展Pod节点,提高资源利用率

kubernetes 基础管理

kubectl 命令
命令说明
命令格式命令说明
kubectl run 资源名称 -参数 --image=镜像名称:标签创建资源对象,常用参数-i交互,-t终端
kubectl get 查询资源 可选参数 -o wide 显示主机信息常用查询的资源 node|deployment|pod
kubectl exec -it 容器id 执行的命令同 docker exec 指令,进入容器内
kubectl describe 资源类型 资源名称查询资源的详细信息
kubectl attach同 docker attach 指令,连接容器
kubectl logs 容器id查看容器控制台的标准输出
kubectl delete 资源类型 资源名称删除指定的资源
kubectl create|apply -f 资源文件执行指定的资源文件
命令案例
# 执行指定的资源文件
[root@master flannel]# kubectl apply -f kube-flannel.yml

# get 查询信息
[root@master ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
master      Ready    master   19h   v1.17.6
node-0001   Ready    <none>   16h   v1.17.6
[root@master ~]# kubectl -n kube-system get pod
NAME                             READY   STATUS    RESTARTS   AGE
kube-flannel-ds-amd64-hf2jp      1/1     Running   0          41m
kube-flannel-ds-amd64-rtl4l      1/1     Running   0          41m
... ...

# describe 查询详细信息
[root@master ~]# kubectl -n kube-system describe pod kube-flannel-ds-amd64-rtl4l
Name:                 kube-proxy-4tbp6
Namespace:            kube-system
... ...

# 使用run启动容器
[root@master ~]# kubectl run testos -it --image=192.168.1.100:5000/myos:v1804 
[root@testos-79778b4895-s8mxl /]# 
# 启动服务
[root@master ~]# kubectl run web-test --image=192.168.1.100:5000/myos:httpd
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-test created
# 访问节点
[root@master ~]# kubectl get pod -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP
testos-79778b4895-s8mxl     1/1     Running   1          6m33s   10.244.3.2   ... ...
web-test-7bf98b9576-v566c   1/1     Running   0          4m24s   10.244.4.2   ... ...
[root@master ~]# curl http://10.244.4.2/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 10.244.0.0
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.29.0
    [REQUEST_URI] => /info.php
)
php_host: 	web-test-7bf98b9576-v566c
1229

# 进入容器
[root@master ~]# kubectl exec -it testos-79778b4895-s8mxl -- /bin/bash
[root@testos-79778b4895-s8mxl /]# 
[root@master ~]# kubectl attach -it testos-79778b4895-s8mxl 
[root@testos-79778b4895-s8mxl /]#

# 查看终端日志
[root@master ~]# kubectl logs web-test-7bf98b9576-v566c 
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.244.4.2. Set the 'ServerName' directive globally to suppress this message

# 删除资源,直接删除POD会自动重建
[root@master ~]# kubectl delete pod testos-79778b4895-s8mxl 
pod "testos-79778b4895-s8mxl" deleted
[root@master ~]# kubectl delete deployments testos
deployment.apps "testos" deleted
资源文件

在k8s集群中,latest标签是不会被缓存,如果想缓存可以使用其他标签

[root@master ~]# docker pull 192.168.1.100:5000/myos:latest
[root@master ~]# docker tag 192.168.1.100:5000/myos:latest 192.168.1.100:5000/myos:v1804
[root@master ~]# docker push 192.168.1.100:5000/myos:v1804
[root@master ~]# curl http://192.168.1.100:5000/v2/myos/tags/list
{"name":"myos","tags":["nginx","php-fpm","latest","v1804","httpd"]}
pod-example资源文件
[root@master config]# vim pod-example.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: myos
spec:
  containers:
  - name: myos
    image: 192.168.1.100:5000/myos:v1804
    stdin: true
    tty: true
  restartPolicy: Always
[root@master config]# kubectl apply -f pod-example.yaml 
pod/pod-example created
[root@master config]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
pod-example   1/1     Running   0          6s
[root@master config]# kubectl delete -f pod-example.yaml 
pod "pod-example" deleted
简单web集群案例
[root@master ~]# vim web-example.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-example
spec:
  selector:
    matchLabels:
      app: my-apache
  replicas: 3
  template:
    metadata:
      labels:
        app: my-apache
    spec:
      containers:
      - name: myos
        image: 192.168.1.100:5000/myos:httpd
        ports:
        - protocol: TCP
          containerPort: 80
      restartPolicy: Always
[root@master ~]# kubectl apply -f web-example.yaml 
deployment.apps/apache-example created
[root@master config]# kubectl get deployments.apps
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
apache-example   3/3     3            3           3s
[root@master config]# kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
apache-example-7765fb6c7b-67fqw   1/1     Running   0          12s
apache-example-7765fb6c7b-lhkc5   1/1     Running   0          12s
apache-example-7765fb6c7b-x2559   1/1     Running   0          12s
集群调度
扩容与缩减
[root@master ~]# kubectl get deployments.apps
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
apache-example   1/1     1            1           14m
[root@master ~]# kubectl scale deployment apache-example --replicas=3
deployment.apps/apache-example scaled
[root@master ~]# kubectl get deployments.apps
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
apache-example   3/3     3            3           15m
节点标签选择器

刚刚使用 web-example.yaml 创建的 apache,并指定运行在特定的 node 节点

[root@master ~]# vim web-example.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-example
spec:
  selector:
    matchLabels:
      app: my-apache
  replicas: 1
  template:
    metadata:
      labels:
        app: my-apache
    spec:
      # nodeName: node-0001
      nodeSelector:
        disktype: ssd
      containers:
      - name: myos
        image: 192.168.1.100:5000/myos:httpd
        ports:
        - protocol: TCP
          containerPort: 80
      restartPolicy: Always
[root@master ~]# kubectl label nodes node-0002 disktype=ssd
[root@master ~]# kubectl get nodes --show-labels
[root@master ~]# kubectl apply -f web-example.yaml
[root@master ~]# kubectl get pods -o wide
NAME                 READY   STATUS    RESTARTS   AGE     IP            NODE
apache-example-xxx   1/1     Running   0          3m49s   10.244.3.9    node-0002
apache-example-xxx   1/1     Running   0          3m      10.244.2.9    node-0003
# 删除标签
[root@master ~]# kubectl label nodes node-0002 disktype-
daemonset控制器
[root@master ~]# vim daemonset-expmple.yaml 
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  namespace: default
spec:
  selector:
    matchLabels:
      app: myapp1
  template:
    metadata:
      labels:
        app: myapp1
    spec:
      containers:
      - name: myos
        image: 192.168.1.100:5000/myos:v1804
        stdin: true
        tty: true
      restartPolicy: Always
[root@master ~]# kubectl apply -f daemonset-expmple.yaml 
污点标签
[root@master ~]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE     
httpd-679f76478-7x7rw   1/1     Running   0          72m   10.244.3.6   node-0003
httpd-679f76478-gk2rk   1/1     Running   0          72m   10.244.4.6   node-0002
httpd-679f76478-sqvvc   1/1     Running   0          72m   10.244.5.7   node-0001
[root@master ~]# kubectl taint node node-0003 k1=v1:NoExecute
node/node-0003 tainted
[root@master ~]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE     
httpd-679f76478-gk2rk   1/1     Running   0          73m   10.244.4.6   node-0002
httpd-679f76478-qbkst   1/1     Running   0          6s    10.244.4.8   node-0002
httpd-679f76478-sqvvc   1/1     Running   0          73m   10.244.5.7   node-0001
# 查看污点标签
[root@master ~]# kubectl describe nodes node-0003 |grep -P "^Taints:"
Taints:             k1=v1:NoExecute
# 删除污点标签
[root@master ~]# kubectl taint node node-0003 k1-
job/cronjob控制器
[root@master config]# vim job-example.yaml
---
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: 192.168.1.100:5000/myos:v1804
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(500)"]
      restartPolicy: OnFailure
[root@master config]# kubectl apply -f job-example.yaml 
job.batch/pi created
[root@master config]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           2s         7s
[root@master config]# kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
httpd-6bffbcb9d8-hgqvv   1/1     Running     0          12m
pi-gvfwj                 0/1     Completed   0          15s
# 查看终端结果
[root@master config]# kubectl logs pi-gvfwj
[root@master ~]# vim cronjob-example.yaml 
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-pi
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: pi
            image: 192.168.1.100:5000/myos:v1804
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(500)"]
          restartPolicy: OnFailure
[root@master ~]# kubectl apply -f cronjob-example.yaml 
cronjob.batch/cronjob-pi created
[root@master ~]# kubectl get cronjobs.batch 
NAME         SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-pi   */1 * * * *   False     0        <none>          10s
[root@master ~]# kubectl get pod
NAME                          READY   STATUS      RESTARTS   AGE
cronjob-pi-1595410620-vvztx   0/1     Completed   0          62s
 
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-pi
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: pi
            image: 192.168.1.100:5000/myos:v1804
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(500)"]
          restartPolicy: OnFailure
[root@master ~]# kubectl apply -f cronjob-example.yaml 
cronjob.batch/cronjob-pi created
[root@master ~]# kubectl get cronjobs.batch 
NAME         SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-pi   */1 * * * *   False     0        <none>          10s
[root@master ~]# kubectl get pod
NAME                          READY   STATUS      RESTARTS   AGE
cronjob-pi-1595410620-vvztx   0/1     Completed   0          62s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值