k8s --- 资源分类和常用命令
1. k8s 中的核心资源
1.0 资源的创建方式
- 命令行
 - 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
缺点
- 文件夹必须自己手动创建
 - 如果这次部署的Pod不用了,删了这个Pod,其挂载的数据卷目录的内容不会自动清理
 - 没有限制容量
 
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

                
            
        
浙公网安备 33010602011771号