k8s --- 资源分类和常用命令

1. k8s 中的核心资源

1.0 资源的创建方式

  1. 命令行
  2. YAML 文件

1.1 Namespace(名称空间)

1. 概念

名称空间用来对集群资源进行隔离划分. 默认只隔离资源,不隔离网络

2. 名称空间创建

1. 命令行方式创建

# ns 是 Namespace 的简称
kubectl create ns hello
kubectl delete ns hello

2. yaml 文件方式创建

hello.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: hello

根据配置文件创建资源

kubectl apply -f hello.yaml

根据配置文件删除资源

kubectl delete -f hello.yaml

1.2 Pod(应用)

1. 概念

Pod 代表运行中的 一组 容器,是kubernetes中应用的最小单位

2. Pod 创建

1. 命令行方式创建

kubectl run mynginx --image=nginx

2. yaml 文件方式创建

1. 一个 Pod 中的单个容器

mynginx.yaml

apiVersion: v1
kind: Pod
metadata:
  labels: 
    run: mynginx
  name: mynginx   # pod 的名字
  namespace: default  # 指定名称空间
spec:  # 定义 pod 的配置信息
  containers:  # 一个容器一个 -
  - image: nginx   # 镜像名
    name: mynginx  # 容器名

根据配置文件创建资源

kubectl apply -f mynginx.yaml

根据配置文件删除资源

kubectl delete -f mynginx.yaml

2. 一个 Pod 中的多个容器

apiVersion: v1
kind: Pod
metadata:
  labels: 
    run: myapp
  name: myapp   # pod 的名字
  namespace: default  # 指定名称空间
spec:  # 定义 pod 的配置信息
  containers:  # 多个容器多个 -
  - image: nginx   # 镜像名
    name: mynginx  # 容器名
  - image: tomcat:8.5.68
    name: mytomcat

根据配置文件创建资源

kubectl apply -f mynginx.yaml

根据配置文件删除资源

kubectl delete -f mynginx.yaml

3. 内网 IP 分配

每一个Pod k8s都会为其分配一个IP地址,端口为容器的运行端口,集群中任意一个机器以及任意的应用都能通过 给Pod 分配的 IP 来访问这个 Pod,但是浏览器是无法访问到的

kubectl get pods -owide

4. 内网访问

在其他机器中访问

# http 默认访问的是 80 端口,而nginx的默认运行端口就是80,所以下面的ip访问到的是nginx
curl http://192.168.36.68

# 访问tomcat,tomcat 默认运行端口为8080
curl http://192.168.36.68:8080

# nginx 访问 tomcat 用 127.0.0.1 即可
kubectl exec -it mynginx -- /bin/bash
curl http://127.0.0.1:8080

5. 同一个Pod内不允许启动两个Nginx

会造成端口冲突的错误

apiVersion: v1
kind: Pod
metadata:
  labels: 
    run: myapp-2
  name: myapp-2   # pod 的名字
  namespace: default  # 指定名称空间
spec:  # 定义 pod 的配置信息
  containers:  # 多个容器多个 -
  - image: nginx   # 镜像名
    name: mynginx01  # 容器名
  - image: nginx   # 镜像名
    name: mynginx02  # 容器名

1.3 工作负载 -- Deployment(无状态应用部署)

1. 概念

无状态应用部署: 比如微服务,提供多副本等功能

创建一次Deployment,一定会创建一个或多个Pod

控制 Pod,使Pod 拥有多副本、自愈、扩缩容能力,机器宕机,机器重启后会自动拉取一个副本来启动Pod

2. 创建

1. 命令行方式创建

kubectl create deployment mytomcat --image=tomcat:8.5.68

2. yaml文件方式创建

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels: 
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: mynginx01 

3. 自愈能力&故障转移

1. 自愈能力

k8s 可以感知到其部署的Pod的状态,当Pod挂了以后,k8s会尝试重启原Pod,重启成功后,则为自愈能力

kubectl delete pod mytomcat--jfdlasdf-sadf

watch -n 1 kubectl get pods 

2. 故障转移

当原Pod 在默认5分钟内(可能会由于网络延迟导致1分钟2分钟内都无法联系到这个机器,如果频繁的部署,很浪费)都无法重启成功时,会在其他节点重新部署一份

4. 多副本

1. 命令行方式创建

# --replicas 启动多个副本 
# deploy 是 deployment的简写
kubectl create deploy my-dep --image=nginx --replicas=3

多节点容灾部署

2. yaml文件方式创建

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-dep
  template:
    metadata:
      labels: 
        app: my-dep
    spec:
      containers:
      - image: nginx
        name: mynginx01 

5. 扩缩容

# 总共部署5份,如果以前有2份,变成5分就是扩容
# 如果以前有10份,变成5份就是缩容
kubectl scale --replicas=5 deployment/my-dep

修改yaml文件进行扩缩容

kubectl edit deploy my-dep

# 修改其 replicas: 3 字段
# wq 保存后,开始扩缩容

6. 不停机更新(滚动更新)

先启动一个v2版的新Pod,启动成功后,停止v1中的一个Pod,如果流量不停的在访问,就会访问到其他两个Pod,保证服务不停机,然后依次启动v2的Pod,停止v1的Pod,等整个v2都启动完成后

# --record 记录当前版本的更新
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record 

kubectl rollout status deployment/my-dep

7. 版本回退

1. 版本历史记录

kubectl rollout history deployment/my-dep

2. 查看某个历史详情

kubectl rollout history deployment/my-dep --revision=2

3. 回滚

kubectl rollout undo deployment/my-dep

3. 回滚到指定版本

kubectl rollout undo deployment/my-dep --to-revision=2

1.4 工作负载 -- StatefulSet(有状态副本集)

1. 概述

有状态应用部署: 比如Redis,提供稳定的存储(数据卷挂载),网络(固定的IP,机器重启IP不会改变)等功能

1.5 工作负载 -- DaemonSet(守护进程集)

1. 概述

守护型应用部署: 比如日志收集组件,在每个机器都运行一份

1.6 工作负载 -- Job/CronJob(任务/定时任务)

1. 概述

定时任务部署: 比如垃圾清理组件,可以在指定时间运行,如每晚凌晨3点清理一次垃圾

1.7 网络模型 -- Service(服务-负载均衡网络)

1. 概述

将一组 Pods 公开为网络服务的抽象方法,是k8s中用来做服务发现,和负载均衡的

服务发现:其中一个Pod下线,不会再将流量打到这个下线的Pod里

2. 多 Pod 统一端口暴露

1. ClusterIp 模式

ClusterIp 模式,其他Pod内部可以访问,其他节点机器不可以,浏览器不可以

1. 命令行方式

# --port 对外暴露的端口
# --target-port 源端口
# 不传 --type 默认为 --type=ClusterIP 
kubectl expose deploy my-dep --port=8000 --target-port=80 --type=ClusterIP 

2. yaml文件方式

apiVsersion: v1
kind: Service
metadata:
  labels: # 根据labels 标签来确定 Pod 为同一组
    app: my-dep
  name: my-dep
spec:
  selector: # 选择名叫app,值是my-dep的 Pod
    app: my-dep   
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

2. NodePort模式

NodePort模式,集群内部可以访问的同时,集群内的每个节点都开通一个端口,用来对外提供访问,默认端口范围在30000-32767之间

1. 命令行方式

# --port 对外暴露的端口
# --target-port 源端口
kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort

3. 查询 Service 信息,包括IP等

kubectl get service

kubectl exec -it xxx -- /bin/bash

curl service的IP:端口

curl service的服务名.所在名称空间.svc:端口

4. 删除

kubectl delete service my-dep

1.8 网络模型 -- Ingress

0. 官方文档

官网地址:https://kubernetes.github.io/ingress-nginx/

1. 概述

Service的统一网关入口,底层就是nginx

2. 安装

1. 直接网络下载

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

2. 如果网络下载不了,就FQ,复制后,粘贴到服务器文件里

3. 修改镜像地址

vi deploy.yaml

# 将image的值改为以下值
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0

4. 开始下载

kubectl apply -f deploy.yaml

5. 检查安装的结果

kubectl get pod,svc -n ingress-nginx

6. ingress对外的暴露端口

kubectl get svc -A

3. 浏览器访问

http://139.198.163.211:31405
https://139.198.163.211:32401

4. 配置规则

1. 域名访问

test.yaml

apiVersion: v1
kind: Deployment
metadata:
  name: hello-server
spec:
  replicas: 2
  seletor:
    matchLabels:
      app: hello-server
  template:
    metadata:
      labels:
        app: hello-server
    spec:
      containers:
      - name: hello-server
      image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
      ports: 
      - containerPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  replicas: 2
  selector:
    matchLables:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - name: nginx
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-demo
  name: nginx-demo
spec:
  selector:
    app: nginx-demo
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello-server
  name: hello-server
spec:
  selector:
    app: hello-server
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 9000

生成服务

kubectl apply -f test.yaml

配置域名访问

vi ingress-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http: 
      paths:
      - pathType: Prefix   # 前缀模式
        path: "/"  # http://hello.atguigu.com/后的所有请求
        backend:  # 转交给后台的hello-server服务
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http: 
      paths:
      - pathType: Prefix   # 前缀模式
        path: "/"  # http://hello.atguigu.com/后的所有请求,当然也可以配置/foo 这种路径,即这个路径下的请求,才会转发到对应服务
        backend:  # 转交给后台的hello-server服务
          service:
            name: nginx-demo
            port:
              number: 8000

配置生效

kubectl apply -f ingress-rule.yaml

2. 路径重写

对于 /foo 的请求访问流程

1. 首先访问ingress,如果没有/foo的路由映射规则,则在ingress就报了404,如果有/foo的规则,则交给后台服务,后台服务必须也有/foo这个路径,否则就是,后台服务也报404,如果不想要转给后台服务时也带着这个/foo,就需要nginx的路径重写(rewrite)功能了

参考官方文档修改上面的yaml文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:  # 加上注解信息
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http: 
      paths:
      - pathType: Prefix   # 前缀模式
        path: "/"  # http://hello.atguigu.com/后的所有请求
        backend:  # 转交给后台的hello-server服务
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http: 
      paths:
      - pathType: Prefix   # 前缀模式
        path: "/foo(/|$)(.*)"
        backend:  # 转交给后台的hello-server服务
          service:
            name: nginx-demo
            port:
              number: 8000

3. 流量限制

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:  # 加上注解信息
    nginx.ingress.kubernetes.io/limit-rps: "1"  # 每秒的请求数
  name: ingress-limit-rate
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http: 
      paths:
      - pathType: Exact   # 精确模式
        path: "/"  # 只有 http://hello.atguigu.com/ 才可以访问
        backend:  # 转交给后台的hello-server服务
          service:
            name: hello-server
            port:
              number: 8000

5. 查找

kubectl get ingress

1.9 网络模型架构

1.10 存储抽象 -- PV &PVC

1. 概述

在之前docker容器通过数据卷挂载到物理机的磁盘空间下,作为数据的存储手段,但是k8s是集群部署,当发生故障转移时,其他的节点并没有容器所挂载物理机的路径,当新的Pod 启动后,数据并不会恢复,这样会有问题,所以,加入NFS 网络文件系统 来做存储层,每个节点都创建一个空间用来存储数据,同时这些节点之间是会相互备份的,k8s的Pod挂载在这个文件系统创建出来的空间即可,文件系统包括:Glusterfs、NFS、CephFS等

2. 搭建 NFS(网络文件系统)

1. 所有机器安装nfs

yum install -y nfs-utils

2. master 节点

# 暴露/nfs/data这个目录
# *()中的是参数,insecure:非安全方式,rw:读写方式,sync:异步
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

# 创建目录
mkdir -p /nfs/data

# 启动 rpcbind 服务
systemctl enable rpcbind --now

# 启动 nfs 服务器
systemctl enable nfs-server --now

# 配置生效
exportfs -r

3. 从节点

查看master节点的IP

ipconfig

替换成 主节点的IP

# 检查 10.149.122.4机器上 有哪些目录可以挂载
showmount -e 10.140.122.4

# 挂载 nfs 服务器上的共享目录到本机路径
mkdir -p /nfs/data

# 使用nfs服务器挂载主节点的 /nfs/data和本机的 /nfs/data同步
mount -t nfs 10.140.122.4:/nfs/data /nfs/data

4. 测试

主节点写入测试文件

echo "hello nfs server" > /nfs/data/test.txt

查看从节点的 /nfs/data/ 目录中是否有这个文件

cd /nfs/data
ls

3. 原生方式数据挂载

1. 创建文件夹

mkdir -p /nfs/data/nginx-pv

2. 部署

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv
  name: nginx-pv
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 10.140.122.4
            path: /nfs/data/nginx-pv

缺点

  1. 文件夹必须自己手动创建
  2. 如果这次部署的Pod不用了,删了这个Pod,其挂载的数据卷目录的内容不会自动清理
  3. 没有限制容量

4. PV&PVC 方式挂载

PV 持久卷(Persistent Volume): 将应用需要持久化的数据保存到指定位置

PVC 持久卷申明(Persistent Volume Claim): 申明需要使用的持久卷规格(容量)

1. 静态供应,提前创建好的空间

1. ,创建 PV 池

1. 在 master 节点,先创建目录

mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

2. 在 master 节点 创建PV

three_pvs.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:  # 限制空间容量
    storage: 10M
  accessModes:
    - RedWriteMany  # 可读可写,多节点
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 10.140.122.4
---
apiVsersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1gi
  accessModes:
    - ReadWriteMany
  storageClassNaem: nfs
  nfs:
    path: /nfs/data/02
    server: 10.140.122.4
---
apiVsersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3gi
  accessModes:
    - ReadWriteMany
  storageClassNaem: nfs
  nfs:
    path: /nfs/data/03
    server: 10.140.122.4

生成资源

kubectl apply -f three_pvs.yaml

2. 静态供应,PVC 创建及 绑定PV

1. 创建 PVC

100m_pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

创建资源

kubectl apply -f 100m_pvc.yaml

**2. 创建 Pod 并绑定 PVC **

apiVersion: v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
      - name: html
        persistentVolumeClaim:
          claimName: nginx-pvc

3. 动态供应

会根据 PVC 自动创建对应大小的 PV

5. 查看

kubectl get persistentvolume
kubectl get pv

kubectl get persistentvolumeclaim
kubectl get pvc

1.11 存储抽象 -- ConfigMap(配置集)

1.概述

用来挂载应用的配置文件,存储在 k8s系统中 的 etcd 中,修改后文件内容自动更新,并不会立即生效,redis需要配置热更新能力

2. 创建

1. 命令行方式

kubectl create cm redis-conf --from-file=redis.conf

2. yaml 文件方式

apiVersion: v1
data:
  redis.conf:  # redis.conf 是key; 配置文件的整个内容是值
    appendonly yes  # 配置项
kind: ConfigMap
metadata:
  name: redis-conf
  namespace: default

3. 创建Pod 并绑定配置集

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    iamge: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf

yaml文件定义的挂载关系示意图

3. 查看配置集

kubectl get cm

1.12 存储抽象 -- Secret

1. 概述

用来保存敏感信息,如密码,OAuth令牌和SSH秘钥,将这些信息放在 secret 中比放在 Pod 的定义或者容器镜像中更加安全灵活,就是将这些秘钥做了base64编码

如在私有仓库下载镜像,需要账号密码登录,可以保存在secret中

2. 创建

kubectl create secret docker-registry leifengyang-docker \
--docker-username=leifengyang \
--docker-password=Lfy123456 \
--docker-email=534096094@qq.com


# 
kubectl create secret docker-registry leifengyang-docker \
--docker-server=<镜像仓库服务器> \
--docker-username=<用户名> \
--docker-password=<密码> \
--docker-email=<邮箱地址>

3. 使用

apiVersion: v1
kind: Pod
metadata:
  name: private-nginx
spec:
  containers:
  - name: private-nginx
    image: leifengyang/guignginx:v1.0
  imagePullSecrets:
  - name: leifengyang-docker

2. 常用命令

2.1 系统命令

1. 查看集群中的所有节点

kubectl get nodes

2. 根据配置文件给集群创建资源

kubectl apply -f calico.yaml

3. 根据配置文件删除资源

kubectl delete -f hello.yaml

4. 查看集群部署的应用(pod)

# 只获取名为 default 名称空间的应用信息
kubectl get pods

# 运行中的应用在docker 中叫容器,而在k8s中叫pod,此命令指的是获取所有名称空间的应用信息
kubectl get pods -A

# 监控模式,阻塞后当有变化时会变化
kubectl get pods -A -W

# 每秒执行一次
watch -n 1 kubectl get pods -A

# 查看应用更多信息,有IP
kubectl get pods -owide

5. 查看应用的详细信息(pod)

kubectl describe pod mynginx

6. 查看应用的日志信息(pod)

kubectl logs mynginx

# 实时跟踪日志信息
kubectl logs -f mynginx

7.查看 IP 信息(pod)

kubectl get pods -owide

8. 进入Pod 内部

kubectl exec -it mynginx -- /bin/bash

2.2 名称空间命令

1. 命令方式创建名称空间

kubectl create ns hello

2. 获取所有的名称空间

# ns 为 Namespace 的简写
kubectl get ns

3. 删除名称空间

kubectl delete ns hello

4. 获取某名称空间下的应用

# 1. 只获取 default 名称空间下的应用
kubectl get pods

# 2. 获取所有名称空间下的应用
kubectl get pods -A

# 3. 获取指定名称空间下的应用
Kubectl get pod -n 名称空间名

2.3 Pod 命令

1. 命令方式创建 Pod

# 默认名称空间创建 Pod
kubectl run mynginx --image=nginx

# 指定名称空间创建 Pod
kubectl run mynginx --image=nginx -n 名称空间

2. 查看 Pod

# 查看 default 名称空间的 pod
kubectl get pod 

# 查看 所有名称空间的 Pod
kubectl get pods -A

# 查看 指定名称空间的 Pod
kubectl get pods -A -n 名称空间

3. 命令方式删除 Pod

# 删除默认名称空间中的 Pod
kubectl delete pod mynginx

# 指定名称空间删除
kubectl delete pod mynginx -n 名称空间

4. 获取 Pod 的标签

kubectl get pod --show-labels

2.4 Deployment 命令

1. 命令行方式创建

# 创建部署,默认为一份副本
kubectl create deployment mytomcat --image=tomcat:8.5.68

# 指定--replicas=3,来创建多个副本
kubectl create deployment mytomcat --image=tomcat:8.5.68 --replicas=3

2. 扩缩容

# 总共部署5份,如果以前有2份,变成5分就是扩容
# 如果以前有10份,变成5份就是缩容
kubectl scale --replicas=5 deployment/my-dep

3. 修改配置文件

修改yaml文件进行扩缩容

kubectl edit deploy my-dep

# 修改其 replicas: 3 字段
# wq 保存后,开始扩缩容

4. 命令行方式删除

kubectl delete deployment mytomcat

# deploy 是 deployment的简称
kubectl delete deploy mytomcat
posted @ 2024-02-27 17:42  河图s  阅读(74)  评论(0)    收藏  举报