• k8s-核心实战


    一、资源创建方式

    • 使用命令行
    • 使用yum

    二、NameSpace

    名称空间,用来对集群资源进行隔离划分。默认只隔离资源,不隔离网络。例如创建开发、测试、生产等命令空间,可以保证一个应用引用配置只能读取自己名称空间内的资源,但是可以访问不同名称空间的网络。所有资源在没指定的时候都是默认在default下。
    在这里插入图片描述
    可以使用命令行操作名称空间,也可以使用配置文件或者dashboard可视化平台操作。

    • 命令行方式:
    #查看名称空间
    kubectl get ns
    #创建名称空间
    kubectl create ns ***
    #删除名称空间
    kubectl delete ns ***
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 配置文件方式:
    #创建配置文件
    vi create_namespace.yaml
    #复制内容
    apiVersion: v1
    kind: Namespace
    metadata:
      name: hello #名称空间名称
    #应用文件
    kubectl apply -f create_namespace.yaml
    #删除
    kubectl delete -f create_namespace.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三、Pod

    docker中运行的应用称为容器,在k8s中称为Pod。Pod是k8s中应用的最小单位,运行中的一组容器,虽然是封装了容器,但仍然是k8s中最小的基本单位。
    在这里插入图片描述

    • 命令行方式使用:
    #根据镜像创建pod并运行
    kubectl run mynginx --image=nginx
    #查看pod状态
    kubectl describe pod mynginx
    #查看default名称空间的Pod
    kubectl get pod
    #删除
    kubectl delete pod ***
    #删除指定命令空间的pod
    kubectl delete pod -n 命名空间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 配置文件方式:
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: mynginx
      name: mynginx
    #  namespace: default
    spec:
      containers:
     - image: nginx
        name: mynginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 可视化方式

    ge

    • 每个pod都有一个ip,可以根据ip+端口访问容器
    #获取ip
    kubectl get pod -owide
    #使用Pod的ip+pod里面运行容器的端口
    curl ip:端口
    #进入容器
    kubectl exec -it *** -- /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1、一个pod内运行多个容器

    • 创建配置文件
    #创建配置文件
    vi testmorecontains.yaml
    #复制文件内容
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: myapp
      name: myapp
    spec:
      containers:
      - image: nginx
        name: nginx
      - image: tomcat:8.5.68
        name: tomcat
    #应用配置文件
    kubectl apply -f testmorecontains.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    容器启动成功后,k8s会给该pod分配一个ip地址,nginx默认端口为80,Tomcat默认端口为8080,所以通过curl访问可以访问到。

    #获取pod的ip
    kubectl get pod -owide
    #访问nginx
    curl 10.244.1.5:80
    #访问Tomcat[root@k8s-master ~]# curl 10.244.1.5:8080
    <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}

    HTTP Status 404 – Not Found


    Type Status Report

    Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.


    Apache Tomcat/8.5.68

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果想让nginx访问tomcat,因为他俩本身已经在同一个pod内,所以不需要使用ip,只用127.0.0.0ip加端口号就可以访问。
    在这里插入图片描述

    在这里插入图片描述
    同一个pod共享内存和同一个网络空间,所以同一个pod内端口不能重复!

    四、Deployment

    控制pod,使pod有多个副本,自愈、扩缩容能力。

    1、自愈&故障修复

    • 自愈能力:运行过程中pod突然挂机,k8s会尝试重启该pod
    #如果一个pod被删除,k8s会重新生成一个pod
    [root@k8s-master ~]# kubectl get pod
    No resources found in default namespace.
    
    #新建一个普通pod
    [root@k8s-master ~]# kubectl run mynginx --image=nginx
    pod/mynginx created
    
    #使用deployment创建一个pod
    [root@k8s-master ~]# kubectl create deployment mytomcat --image=tomcat:8.5.68
    deployment.apps/mytomcat created
    
    [root@k8s-master ~]# kubectl get pod
    NAME                        READY   STATUS    RESTARTS   AGE
    mynginx                     1/1     Running   0          29s
    mytomcat-6f5f895f4f-p9khg   1/1     Running   0          4s
    
    #将普通pod手动删除
    [root@k8s-master ~]# kubectl delete pod mynginx
    pod "mynginx" deleted
    #该pod已删除
    [root@k8s-master ~]# kubectl get pod 
    NAME                        READY   STATUS    RESTARTS   AGE
    mytomcat-6f5f895f4f-p9khg   1/1     Running   0          45s
    
    #将deployment创建的pod删除
    [root@k8s-master ~]# kubectl delete pod mytomcat-6f5f895f4f-p9khg
    pod "mytomcat-6f5f895f4f-p9khg" deleted
    
    #发现又重新生成一个新的pod
    [root@k8s-master ~]# kubectl get pod 
    NAME                        READY   STATUS    RESTARTS   AGE
    mytomcat-6f5f895f4f-qv4p6   1/1     Running   0          10s
    #如果一个pod被停掉,k8s会将它重启
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 故障修复能力:
      如果一个pod所在的机器突然挂机或者无法提供服务,这时k8s感知会将该pod转移到其他机器上运行。在这里插入图片描述

    • 如果一个pod挂掉或者删除,k8s每次都会分配不同ip给它们

    #查看此pod的ip
    [root@k8s-master ~]# kubectl get pod -owide
    NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
    mytomcat-6f5f895f4f-qv4p6   1/1     Running   0          18s   10.244.1.8   k8s-node1   <none>           <none>
    
    #删除此pod
    [root@k8s-master ~]# kubectl delete pod mytomcat-6f5f895f4f-qv4p6
    pod "mytomcat-6f5f895f4f-qv4p6" deleted
    
    #查看新生成的pod的ip
    [root@k8s-master ~]# kubectl get pod -owide
    NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
    mytomcat-6f5f895f4f-77w4f   1/1     Running   0          6s    10.244.1.9   k8s-node1   <none>           <none>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 真正删除deployment创建的pod
    #获取deployment创建的所有pod
    [root@k8s-master ~]# kubectl get deploy
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    mytomcat   1/1     1            1           8m21s
    
    #真正删除该pod
    [root@k8s-master ~]# kubectl delete deploy mytomcat
    deployment.apps "mytomcat" deleted
    [root@k8s-master ~]# kubectl get pod 
    No resources found in default namespace.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、多副本

    • 使用命令行方式创建
    #使用deploy创建指定的个数的pod副本 --replicas=创建个数
    [root@k8s-master ~]# kubectl create deploy my-deploy-nginx --image=nginx --replicas=3
    deployment.apps/my-deploy-nginx created
    
    #查看所有的deploy创建的pod
    [root@k8s-master ~]# kubectl get deploy
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    my-deploy-nginx   2/3     3            2           11s
    
    #获取pod,此时已经创建了三个不同ip的nginx
    [root@k8s-master ~]# kubectl get pod  -owide
    NAME                               READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
    my-deploy-nginx-67cfd466f7-9g5bf   1/1     Running   0          2m58s   10.244.1.11   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-svkkp   1/1     Running   0          2m58s   10.244.1.12   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-z9czl   1/1     Running   0          2m58s   10.244.1.10   k8s-node1   <none>           <none>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 使用可视化创建指定个数的pod

    在这里插入图片描述

    • 使用配置文件方式创建
    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: nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3、扩缩容能力 kubectl scale

    • 使用命令行形式
    #查看当前pod数为3个
    [root@k8s-master ~]# kubectl get pod -owide
    NAME                               READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
    my-deploy-nginx-67cfd466f7-64z25   1/1     Running   0          51s   10.244.1.14   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-7zf4k   1/1     Running   0          51s   10.244.1.15   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-s576x   1/1     Running   0          51s   10.244.1.13   k8s-node1   <none>           <none>
    
    #使用kubectl scale deploy/depoly名字 --replicas=扩容后的总pod数实现扩容
    [root@k8s-master ~]# kubectl scale deploy/my-deploy-nginx --replicas=5
    deployment.apps/my-deploy-nginx scaled
    #此时pod总数从3个变为5个
    [root@k8s-master ~]# kubectl get pod -owide
    NAME                               READY   STATUS              RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
    my-deploy-nginx-67cfd466f7-5lpzm   0/1     ContainerCreating   0          9s    <none>        k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-64z25   1/1     Running             0          97s   10.244.1.14   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-7zf4k   1/1     Running             0          97s   10.244.1.15   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-ntk8v   0/1     ContainerCreating   0          9s    <none>        k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-s576x   1/1     Running             0          97s   10.244.1.13   k8s-node1   <none>           <none>
    
    #将--replicas设置为2则会缩容
    [root@k8s-master ~]# kubectl scale deploy/my-deploy-nginx --replicas=2
    deployment.apps/my-deploy-nginx scaled
    #此时pod个数从5个又变回了2个
    [root@k8s-master ~]# kubectl get pod -owide
    NAME                               READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
    my-deploy-nginx-67cfd466f7-64z25   1/1     Running   0          5m4s   10.244.1.14   k8s-node1   <none>           <none>
    my-deploy-nginx-67cfd466f7-s576x   1/1     Running   0          5m4s   10.244.1.13   k8s-node1   <none>           <none>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 使用配置文件形式:直接修改配置文件中的–replicas后面的个数,然后:wq保存,k8s会自动按照个数进行扩缩容操作。
    • 使用可视化界面方式:在这里插入图片描述

    4、滚动更新能力

    当容器的版本想要更新到一个新的版本时,但是此时仍然有流量不断进行请求,如何在不间断流量请求的情况下更新到新的版本?
    先启动v2版本的pod,然后停掉一个v1版本的pod,此时v1和v2版本是共存的,直到所有v2版本替换成v1版本则更新成功。如果当一个新版本有问题时,只会一个pod有问题,不会导致所有pod都存在问题。

    • 版本更新
    #kubectl set image deployment/deploy名字 上一个版本镜像名=镜像名:准备更新的版本号 --record
    #--record#记录此次更新的日志信息
    kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
    #查看所有pod运行和替换的过程
    kubectl get pod -w
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 版本回退
    #历史记录
    kubectl rollout history deployment/my-dep
    
    
    #查看某个历史详情
    kubectl rollout history deployment/my-dep --revision=2
    
    #回滚(回到上次)
    kubectl rollout undo deployment/my-dep
    
    #回滚(回到指定版本)
    kubectl rollout undo deployment/my-dep --to-revision=2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    5、工作负载总结

    在这里插入图片描述

    • Deployment:更新无状态应用部署,比如微服务,提供多副本等功能;
    • StatefulSet:更新有状态应用部署,例如redis,使得每次部署使用挂载技术保证数据一致,提供稳定的网络和内存,ip不会改变,在KubeSphere中提供可视化部署方式;
    • DaemonSet:守护型应用部署,例如日志收集组件,保证个机器中有且只有一个;
    • Job/CronJob:定时任务部署,比如定时清理垃圾,可以在指定时间内部署。
    • 官网文档关于除了Deployment工作负载外其他负载使用的具体规则:https://kubernetes.io/zh/docs/concepts/workloads/controllers/

    五、Service

    1、ClusterIP方式访问

    只有集群内可以访问。
    在这里插入图片描述

    • 服务发现

    假设前端项目想要访问后台管理服务,需要一个ip地址,但是k8s会给每个pod分配不同的ip,如果在前端写死一个ip,当这个pod挂掉之后,无法去访问其它pod,就无法实现负载均衡,所以,k8s使用service管理pod,并将所有pod暴露统一的ip地址,提供给其他服务进行调用。当有pod挂掉时它会进行重启。

    • 负载均衡
      service会根据流量的请求分配不同的pod进行流量的处理。
    • 使用命令行方式设置service端口号:
    #修改两个pod的Nginx访问页面,一个是111,一个是2222,用于区分两个pod
    root@my-deploy-nginx-67cfd466f7-s576x:/# cd /usr/share/nginx/html/ 
    root@my-deploy-nginx-67cfd466f7-s576x:/usr/share/nginx/html# ls
    50x.html  index.html
    root@my-deploy-nginx-67cfd466f7-s576x:/usr/share/nginx/html# echo 2222 > index.html
    #设置service暴露的公共端口号 
    #my-deploy-nginx:deploy名称
    #--port:对外暴露的端口号,设置为service端口,通过此端口号可以访问deploy的所有pod(此端口号是设置的)
    # --target-port:指定访问服务内部的pod端口号(此端口号是真实的)
    [root@k8s-master ~]# kubectl expose deploy my-deploy-nginx --port 8000 --target-port=80
    service/my-deploy-nginx exposed
    
    #获取所有service的端口号和ip地址
    [root@k8s-master ~]# kubectl get service -owide
    NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE     SELECTOR
    kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP    2d23h   <none>
    my-deploy-nginx   ClusterIP   10.96.139.241   <none>        8000/TCP   3m19s   app=my-deploy-nginx
    [root@k8s-master ~]# curl 10.96.139.241:8000
    111
    [root@k8s-master ~]# curl 10.96.139.241:8000
    111
    [root@k8s-master ~]# curl 10.96.139.241:8000
    111
    [root@k8s-master ~]# curl 10.96.139.241:8000
    2222
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 使用配置文件方式:
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: my-dep
      name: my-dep
    spec:
      selector:
        app: my-dep
      ports:
     - port: 8000
        protocol: TCP
        targetPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 注意:service的地址也只是在集群内有效, 同一个集群下的服务不仅可以使用ip访问,同时也可以访问域名(默认service名)service域名.命名空间.svc:service端口号。

    2、NodePort

    集群外也可以访问。

    [root@k8s-master ~]# kubectl expose deploy my-deploy-nginx --port=8000  --target-port=80 --type=NodePort
    service/my-deploy-nginx exposed
    [root@k8s-master ~]# kubectl get svc -owide
    NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE    SELECTOR
    kubernetes        ClusterIP   10.96.0.1      <none>        443/TCP          3d4h   <none>
    my-deploy-nginx   NodePort    10.98.68.170   <none>        8000:31860/TCP   17s    app=my-deploy-nginx
    [root@k8s-master ~]# curl 10.98.68.170:8000
    2222
    [root@k8s-master ~]# curl 10.98.68.170:8000
    2222
    [root@k8s-master ~]# curl 10.98.68.170:8000
    2222
    [root@k8s-master ~]# curl 10.98.68.170:8000
    111
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    k8s会分配两个端口,一个是8000,自己在创建的时候指定的端口,还有一个是随机指定的(30000-32767)之间,将每个pod都分配一个这个端口,可以根据pod的公网ip加该端口号进行外网访问。
    在这里插入图片描述

    3、Ingress

    Service的统一网关入口。
    相当于集群的网关,流量进来之后可以通过负载均衡处理LB进行服务的分发,将流量进入该机器的Ingress里,然后Ingress进行域名解析,然后通过Ingress进行service的分发,service再次通过负载均衡进行相应的pod匹配,ingress底层原理就是nginx,拥有域名解析和负载均衡的能力。k8s网络分为两层,pod层和service层,当我们安装k8s进行初始化时就已经指定了两个网络层的ip范围。
    在这里插入图片描述

    1、安装

    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
    
    #修改镜像
    vi deploy.yaml
    #将image的值改为如下值:
    registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0
    #应用配置文件 
    kubectl apply -f deploy.yaml
    # 检查安装的结果
    kubectl get pod,svc -n ingress-nginx
    
    # 最后别忘记把svc暴露的端口要放行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    2、实战

    在这里插入图片描述
    如何根据域名访问使Ingress进行流量分发给不同的service?

    • 构建基础配置,创建一个hello-server和nginx-demo
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-server
    spec:
      replicas: 2
      selector:
        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:
        matchLabels:
          app: nginx-demo
      template:
        metadata:
          labels:
            app: nginx-demo
        spec:
          containers:
          - image: nginx
            name: 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 应用该配置文件
    kubectl apply -f ***.yaml
    
    • 1
    • 设置访问使域名的解析规则
    apiVersion: networking.k8s.io/v1
    kind: Ingress  
    metadata:
      name: ingress-host-bar
    spec:
      ingressClassName: nginx
      rules:
     - host: "hello.kanlina.com" #请求拦截的域名
        http:
          paths:
          - pathType: Prefix
            path: "/" #该域名下的所有请求
            backend:
              service:
                name: hello-server #分发到的service
                port:
                  number: 8000 #service暴露的端口号
     - host: "demo.kanlina.com"
        http:
          paths:
          - pathType: Prefix
            path: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
            backend:
              service:
                name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
                port:
                  number: 8000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 设置hosts文件映射规则
      在这里插入图片描述
      这里的ip一定得是ingress部署节点的ip地址!
    • 修改Ingress匹配规则在这里插入代码片
    [root@k8s-master ~]# kubectl get ing
    NAME               CLASS   HOSTS                                ADDRESS         PORTS   AGE
    ingress-host-bar   nginx   hello.kanlina.com,demo.kanlina.com   182.92.128.93   80      41m
    [root@k8s-master ~]# kubectl edit ing ingress-host-bar
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、路径重写

    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: "/"
            backend:
              service:
                name: hello-server
                port:
                  number: 8000
      - host: "demo.atguigu.com"
        http:
          paths:
          - pathType: Prefix
            path: "/nginx(/|$)(.*)"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
            backend:
              service:
                name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
                port:
                  number: 8000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4、流量限制

     apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-limit-rate
      annotations:
        nginx.ingress.kubernetes.io/limit-rps: "1" #添加注解
    spec:
      ingressClassName: nginx
      rules:
      - host: "haha.atguigu.com"
        http:
          paths:
          - pathType: Exact #精确匹配
            path: "/"
            backend:
              service:
                name: nginx-demo
                port:
                  number: 8000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    当你访问过快的时候会返回503状态码。

    4、总结

    k8s内的网络通信有三种方式,一种是通过Pod的ip地址,但是该种方式只能在集群内部访问,外部无法直接使用Pod的ip地址访问到集群内部服务,pod之间的服务可以互相通信;第二种方式是service方式进行访问,但是也仅局限于集群内部访问,service可以对流量进行负载均衡分发pod,而且pod可以和service层进行通信;第三种方式是Ingress,服务请求的总入口,相当于整个service的网关,可以对请求进行路径重写、流量限制、根据域名匹配服务等高级功能,底层原理是使用Nginx实现的。

    六、存储抽象

    1、基本概念

    k8s挂载存在的问题:原pod在3号机器上运行,想要将文件挂载到本地一个目录,但是由于该pod出现故障,k8s故障转移策略将其转移到2号机器上,原挂载文件不会携带,导致原数据丢失。
    在这里插入图片描述
    k8s将整个数据挂载层统一管理生成存储层,可以使用的技术有很多,例如Glusterfs,NFS,CephFS。

    2、NFS 网络文件系统

    1. NFS:网络文件系统,相当于共享文件,使用一个机器上的文件作为主要的挂载文件,其他机器上的文件作为备份文件,只要有改变的就会更新到该主文件目录上。在这里插入图片描述

    2.1 NFS环境部署:

    1. 所有节点:
    #所有机器安装
    yum install -y nfs-utils
    
    • 1
    • 2
    1. 主节点
    #nfs主节点 
    # *:所有人都可以读到此文件
    # insecure:非安全模式
    # rw:读写方式
    echo "/nfs/data/ *(insecure,rw,sy nc,no_root_squash)" > /etc/exports
    
    #创建挂载目录 
    mkdir -p /nfs/data
    systemctl enable rpcbind --now
    # 开机启动
    systemctl enable nfs-server --now
    #配置生效
    exportfs -r
    #查看是否挂载成功
    exportfs 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 从节点
    #查看主节点暴露的挂载目录
    showmount -e master内网ip
    
    #执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
    mkdir -p /nfs/data
    
    # 使用nfs共享文件
    mount -t nfs master内网ip:/nfs/data /nfs/data
    # 写入一个测试文件
    echo "hello nfs server" > /nfs/data/test.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 原生配置文件方式挂载
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx-pv-demo
      name: nginx-pv-demo
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-pv-demo
      template:
        metadata:
          labels:
            app: nginx-pv-demo
        spec:
          containers:
          - image: nginx
            name: nginx
            #卷挂载
            volumeMounts:
            - name: html
              mountPath: /usr/share/nginx/html #pod内部文件
          volumes:
            - name: html
              nfs:
                server: 172.31.0.4
                path: /nfs/data/nginx-pv #挂载到的文件,需要先保证有这个文件夹!!!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    #应用配置文件部署
    kubectl apply -f depoly.yaml
    
    • 1
    • 2

    在这里插入图片描述

    2.2 NFS问题

    1. 挂载的目录需要实现创建;
    2. 系统量大的时候,pod删除时文件不会删除;
    3. 对于Pod默认使用的空间是没有限制的,对内存造成压力。

    2.3 PV与PVC的使用

    1. 基本概念
      PV:持久卷,需要挂载保存的数据,指定的位置;
      PVC:持久卷声明,规定持久卷的容量大小,类似申请,在pod想要挂载的时候需要进行申请,PVC去创建空间,pod如果想要删除,PVC也会将空间一起删除。
    2. 创建PV池
    #nfs主节点
    mkdir -p /nfs/data/01
    mkdir -p /nfs/data/02
    mkdir -p /nfs/data/03
    
    • 1
    • 2
    • 3
    • 4
    1. 创建PV service统一更改为自己的内网ip
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv01-10m
    spec:
      capacity:
        storage: 10M # 存储空间
      accessModes:
        - ReadWriteMany
      storageClassName: nfs
      nfs:
        path: /nfs/data/01
        server: 172.31.0.4
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv02-1gi
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      storageClassName: nfs
      nfs:
        path: /nfs/data/02
        server: 172.31.0.4
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv03-3gi
    spec:
      capacity:
        storage: 3Gi
      accessModes:
        - ReadWriteMany
      storageClassName: nfs
      nfs:
        path: /nfs/data/03
        server: 172.31.0.4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

    1. PVC创建与绑定
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nginx-pvc
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 200Mi
      storageClassName: nfs 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    apiVersion: apps/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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    #获取所有pv
    kubectl get pv
    #删除pv
    kubectl delete -f ***.yaml
    #获取pvc
    kubectl get pvc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    1. 创建Pod绑定PVC
    apiVersion: apps/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 #申请书名称空间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述
    在这里插入图片描述

    3、ConfigMap

    配置集合,挂载所有配置集。

    1. redis实例:
      把之前的配置文件创建为配置集:
    # 创建配置,redis保存到k8s的etcd;
    kubectl create cm redis-conf --from-file=redis.conf
    
    • 1
    • 2
    apiVersion: v1
    data:    #data是所有真正的数据,key:默认是文件名   value:配置文件的内容
      redis.conf: |
        appendonly yes
    kind: ConfigMap
    metadata:
      name: redis-conf
      namespace: default
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: redis
    spec:
      containers:
      - name: redis
        image: redis
        command:
          - redis-server
          - "/redis-master/redis.conf"  #指的是redis容器内部的位置
        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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    检查默认配置

    kubectl exec -it redis -- redis-cli
    
    127.0.0.1:6379> CONFIG GET appendonly
    127.0.0.1:6379> CONFIG GET requirepass
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    以后需要更改容器配置,直接更改ConfigMap就可以,k8s有热更新功能。
    配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。
    原因:我们的Pod部署的中间件自己本身没有热更新能力

    4、Secret

    Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod
    的定义或者 容器镜像 中来说更加安全和灵活

    kubectl create secret docker-registry leifengyang-docker \
    --docker-username=leifengyang \
    --docker-password=Lfy123456 \
    --docker-email=534096094@qq.com
    
    ##命令格式
    kubectl create secret docker-registry regcred \
      --docker-server=<你的镜像仓库服务器> \
      --docker-username=<你的用户名> \
      --docker-password=<你的密码> \
      --docker-email=<你的邮箱地址>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    apiVersion: v1
    kind: Pod
    metadata:
      name: private-nginx
    spec:
      containers:
      - name: private-nginx
        image: leifengyang/guignginx:v1.0
      imagePullSecrets:
      - name: leifengyang-docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Linux常用命令、tomcat常用命令
    聊下认证协议
    Go项目使用自定义的公共单元
    svg图标填充渐变色及CSS鼠标悬停纯色渐变色转换
    LLM应用实战:当KBQA集成LLM(二)
    Kubeadm部署k8s集群 && kuboard
    基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)
    DFS 模板:843. n-皇后问题
    Kaggle 知识点:物体检测赛题步骤
    刷题记录:牛客NC19115选择颜色
  • 原文地址:https://blog.csdn.net/kk_lina/article/details/125917945