image.png

kubernetes 集群命令行工具 kubectl

1、kubectl 概述

kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。

2、kubectl 命令的语法

image.png
(1)comand:指定要对资源执行的操作,例如 create、get、describe 和 delete
(2)TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的 形式。例如:
image.png

(3)NAME:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源, 例如:
image.png

(2)flags:指定可选的参数。例如,可用-s 或者–server 参数指定 Kubernetes API
server 的地址和端口。

案例截图:
image.png

3、kubectl help 获取更多信息

image.png
image.png
image.png
image.png

4、kubectl 子命令使用分类

(1)基础命令
image.png
(2)部署和集群管理命令
image.png
(3)故障和调试命令
image.png
(4)其他命令
image.png

kubernetes 集群 YAML 文件详解

1、YAML 文件概述

k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。

2、YAML 文件书写格式

(1)YAML 介绍
YAML :仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。
YAML 是一个可读性高,用来表达数据序列的格式。
(2)YAML 基本语法
使用空格做为缩进
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
低版本缩进时不允许使用 Tab 键,只允许使用空格
使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
总结:
image.png
image.png
image.png
image.png
查看API版本
image.png
3、快速生成yaml

  • 第一种 使用kubectl create 命令生成yaml文件
  • 第二种 使用kubectl get命令导出yaml文件

案例:
针对没有部署的生成yaml

  1. kubectl create deployment web --image=nginx -o yaml --dry-run
  2. kubectl create deployment web --image=nginx -o yaml --dry-run > demo1.yaml

针对已经部署的生成yaml

kubectl get deploy
kubectl get deploy web -o yaml  > my-deploy.yml

新版本的—export已经删除
image.png

kubernetes 核心技术-Pod

1、Pod 概述
Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod 提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成
Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause 容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个紧密相关的用户业务容器。
image.png
image.png
image.png

Pod 特性

(1)资源共享
一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如
namespace,cgroups 或者其他的隔离资源。
多个容器共享同一 networknamespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之间通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod 的 IP 进行通信。
一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可以挂载到该 Pod 里的所有容器的文件系统上。
image.png
image.png
image.png
image.png
(2)拉取策略
image.png
image.png
(3)pod资源的限制
image.png
image.png
(4)pod重启机制
image.png
image.png
(5)健康检查
image.png

pod流程

image.png

节点的选择器

image.png

节点的亲和性

image.png

污点和污点容忍

image.png
案例:
查看污点

kubectl describe node s201 | grep Taint

image.png
删除所有的pod

kubectl delete deployment nginx
#污点
kubectl taint node s202 env_role=yes:NoSchedule

image.png
创建pod

kubectl create deployment web --image=nginx
kubectl get pods -o wide

image.png
扩展pod

kubectl scale deployment web --replicas=5
kubectl get pods -o wide

image.png
删除污点

kubectl taint node s202 env_role=yes:NoSchedule-
kubectl describe node s202 | grep Taint

image.png

K8S核心组件之Controller

1、什么是controller
2、Pod和Controller关系
3、Deployment控制器应用场景
4、yaml文件字段说明
5、Deployment控制器部署应用
6、升级回滚
7、弹性伸缩

什么是controller

  • 在集群上管理和运行容器的对象

    Pod和Controller的关系

    Pod是通过Controller实现应用的运维比如伸缩,滚动升级等等。
    pod和controller之间是通过label标签建立关系。
    2K8S三大核心(Pod Controller Service) - 图43

    Deployment控制器应用场景

    部署无状态应用
    管理Pod和ReplicaSet
    部署,滚动升级等功能
    应用场景:web服务,微服务

    yaml文件字段说明

    # 如果删除不了强制删除
    kubectl delete pod  xxxx  --grace-period=0 --force
    kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
    
    ```yaml [root@s201 ~]# cat web.yml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: web name: web spec: replicas: 1 selector: matchLabels: app: web strategy: {} template: metadata: creationTimestamp: null labels: app: web spec: containers:
  • image: nginx name: nginx resources: {} status: {}
![image.png](https://cdn.nlark.com/yuque/0/2022/png/2492220/1651418238148-b5eee3d2-9cbf-43ba-9d3b-be245b3248b0.png#clientId=u72f21323-c3e9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=365&id=udbecec4b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=502&originWidth=657&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24764&status=done&style=none&taskId=u98e33ae0-d6d5-49be-a883-267e2d4a110&title=&width=477.8181818181818)
<a name="XTQfb"></a>
## Deployment控制器部署应用
```yaml
kubectl apply -f web.yaml 
kubectl get pods
#对外暴露端口
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --dry-run --name=web1 -o yaml> web1.yaml
kubectl apply -f web1.yaml
kubectl get pods,svc
# 删除svc
 kubectl delete service/web1

image.png

应用的升级回滚和弹性伸缩

前提是nginx 定义1.14版本,为2个副本

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        resources: {}
status: {}
kubectl apply -f web.yaml
crictl images
# 升级
kubectl set image deployment web nginx=nginx:1.15
crictl images
# 查看是否升级成功
kubectl rollout status deployment web
# 回滚
#1、查看升级的版本
kubectl rollout history  deployment web
#2、还原操作
kubectl rollout undo  deployment web # 还原上一个版本
kubectl rollout undo deployment web --to-revision=2 # 指定版本

#3、伸缩版本
kubectl scale deployment web --replicas=10

#4、删除deployment
kubectl delete deployment web

运行yaml

kubectl apply -f web.yaml
image.png
kubectl get pod
image.png
crictl images
image.png
升级
kubectl set image deployment web nginx=nginx:1.15
image.png
升级的原理先更新新的 启动之后才会删除老的。
查看是否升级成功
kubectl rollout status deployment web
查看历史记录
kubectl rollout history deployment web
image.png
还原操作(指定上一个版本)
image.png
还原操作(指定版本)
kubectl rollout undo deployment web —to-revision=2
image.png
伸缩
kubectl scale deployment web —replicas=10
image.png
image.png

service

Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地 址,并且将请求负载分发到后端的各个容器应用上。
image.png
image.png
实战:

kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --dry-run --name=web1 -o yaml> service.yaml

image.png

StatefulSet 的使用

使用statefulset的场景通常有以下特点:

  • 有状态服务。
  • 集群(多节点)部署。
  • 节点有主从(备)之分。 集群通常是主节点先运行,从节点后续运行并加入集群,这里就用statefulset资源的有序部署的特性。
  • 节点之间数据分片存储,这里使用到了statefulSet资源的存储隔离的特性,以及保证pod重新调度后还是能访问到相同的持久化数据。

image.png
image.png
image.png
kubectl api-resources |grep statefulsets
image.png
sts.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80

image.png
image.png
验证网络

kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh

image.png
删除pod

kubectl delete statefulset --all
kubectl delete svc nginx
kubectl delete svc web

DaemonSet

DaemonSet确保集群中每个(部分)node运行一份pod副本,当node加入集群时创建pod,当node离开集群时回收pod。如果删除DaemonSet,其创建的所有pod也被删除,DaemonSet中的pod覆盖整个集群。
当需要在集群内每个node运行同一个pod,使用DaemonSet是有价值的,以下是典型使用场景:
运行集群存储守护进程,如glusterd、ceph。
运行集群日志收集守护进程,如fluentd、logstash。
运行节点监控守护进程,如Prometheus Node Exporter, collectd, Datadog agent, New Relic agent, or Ganglia gmond。
日志收集
案例:vi ds.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-test 
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: logs
        image: nginx:1.14
        ports:
        - containerPort: 80
        volumeMounts:
        - name: varlog
          mountPath: /tmp/log
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

image.png
进入容器执行:

kubectl exec -it pod名称  bash

一次性任务和定时任务

job

apiVersion: batch/v1
kind: Job
metadata:
  name: job-example
spec:
  template:
    spec:
      containers:
      - name: myjob
        image: alpine
        command: ["/bin/sh", "-c", "sleep 10"]
      restartPolicy: Never
crictl pull alpine
kubectl create -f job.yaml

image.png
删除jobs

kubectl delete -f job.yaml

定时任务

cronjob.yaml

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
kubectl apply -f cronjob.yaml

image.png

kubectl get cronjobs

image.png

kubectl delete -f cronjob.yaml
kubectl delete pod  名称 --grace-period=0 --force

image.png