• 【云原生】Kubernetes操作精讲


    一. Kubernetes操作

    首先我们要了解Kubernetes在运行我们的资源时,关联到了哪些内容:

    资源的构建方式:

    • 采用kubectl的命令方式
    • yaml文件方式

    1.1 Namespace

    命名空间:主要是为了对Kubernetes中运行的资源进行过隔离, 但是网络是互通的,类似Docker的容器,可以将多个资源配置到一个NameSpace中。而NameSpace可以对不同环境进行资源隔离,默认情况下Kubernetes提供了default命名空间,在构建资源时,如果不指定资源,默认采用default资源。

    命令方式:

    # 查看现有的全部命名空间
    kubectl get ns
    
    # 构建命名空间
    kubectl create ns 命名空间名称
    
    # 删除现有命名空间, 并且会删除空间下的全部资源
    kubectl delete ns 命名空间名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    yaml文件方式:(构建资源时,设置命名空间)

    apiVersion: v1
    kind: Namespace
    metadata:
    name: test
    
    • 1
    • 2
    • 3
    • 4

    1.2 Pod

    PodKubernetes运行的一组容器,Pod是Kubernetes的最小单位,但是对于Docker而然,Pod中会运行多个Docker容器:

    命令方式:

    # 查看所有运行的pod
    kubectl get pods -A
    
    # 查看指定Namespace下的Pod
    kubectl get pod [-n 命名空间]  #(默认default)
    
    # 创建Pod
    kubectl run pod名称 --image=镜像名称
    
    # 查看Pod详细信息
    kubectl describe pod pod名称
    
    # 删除pod
    kubectl delete pod pod名称 [-n 命名空间]  #(默认default)
    
    # 查看pod输出的日志
    kubectl logs -f pod名称
    
    # 进去pod容器内部
    kubectl exec -it pod名称 -- bash
    
    # 查看kubernetes给Pod分配的ip信息,并且通过ip和容器的端口,可以直接访问
    kubectl get pod -owide
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    yaml方式:(推荐)

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: 运行的pod名称
      name: pod名称
      namespace: 命名空间
    spec:
      containers:
      - image: 镜像名称
        name: 容器名称
    
    # 启动Pod:kubectl apply -f yaml文件名称
    # 删除Pod:kubectl delete -f yaml文件名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Pod中运行多个容器:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: 运行的pod名称
      name: pod名称
      namespace: 命名空间
    spec:
      containers:
      - image: 镜像名称
        name: 容器名称
      - image: 镜像名称
        name: 容器名称
    …………    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动后可以查看到:

    图形化页面修改
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-accKe5I1-1660626781502)(Pictures/image-20220104210823057.png)]

    1.3 Deployment

    部署时,可以通过Deployment管理和编排Pod

    Deployment部署实现:

    命令方式:

    # 基于Deployment启动容器
    kubectl create deployment deployment名称 --image=镜像名称
    # 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果
    # 需要使用deploy的方式删除deploy
    # 查看现在的deployment
    kubectl get deployment
    
    # 删除deployment
    kubectl delete deployment deployment名称
    
    # 基于Deployment启动容器并设置Pod集群数
    kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    配置文件方式:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
           image: nginx
           ports:
           - containerPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    正常使用kubectl运行yaml即可。

    弹性伸缩功能:

    # 基于scale实现弹性伸缩
    kubectl scale deploy/Deployment名称 --replicas 集群个数
    # 或者修改yaml文件
    kubectl edit deploy Deployment名称
    
    • 1
    • 2
    • 3
    • 4
    图形化页面修改
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-accKe5I1-1660626781502)(Pictures/image-20220104210823057.png)]

    灰度发布:

    Deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本的Pod

    kubectl set image deployment/Deployment名称 容器名=镜像:版本
    
    • 1

    1.4 Service

    可以将多个Pod对外暴露一个Service,让客户端可以通过Service访问到这一组Pod,并且可以实现负载均衡。

    ClusterIP方式:

    ClusterIP是集群内部Pod之间的访问方式

    命令实现效果:

    # 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
    kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口
    
    • 1
    • 2

    之后通过kubectl get service查看Service提供的ip,即可访问:

    kubectl get service
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEMWVi85-1660626781503)(Pictures/image-20220104214659229.png)]

    也可以通过Deployment名称.namespace名称.svc作为域名访问:

    在服务容器内执行
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1oIOLEWD-1660626781504)(Pictures/image-20220104215030265.png)]

    NodePort方式:

    ClusterIP的方式只能在Pod内部实现访问,但是一般需要对外暴露网关,所以需要NodePort的方式Pod外暴露访问。

    命令实现方式:

    # 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
    kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 --type=NodePort
    
    • 1
    • 2
    查看Service效果
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnuLcS8n-1660626781505)(Pictures/image-20220104222750733.png)]

    Service也可以通过yaml文件实现:

    apiVersion: v1
    kind: Service
    metadata:
      labels
        app: nginx
      name: nginx
      spec:
        selector:
          app: nginx
        ports:
        - port: 8888
         protocol: TCP
         targetPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    通过apply启动就也可以创建Service。

    测试效果-Deployment部署,通过Service暴露:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-deployment
      template:
        metadata:
          labels:
            app: nginx-deployment
        spec:
          containers:
          - name: nginx-deployment
            image: nginx
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: nginx-service
      name: nginx-service
    spec:
      selector:
        app: nginx-deployment
      ports:
      - port: 8888
        protocol: TCP
        targetPort: 80
      type: NodePort
    
    • 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

    可以查看到暴露的信息:

    Service信息
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uISN7NEJ-1660626781506)(Pictures/image-20220105205334996.png)]

    1.5 Ingress

    Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。

    Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装:

    Kuboard安装
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knigd0U0-1660626781507)(Pictures/image-20220105153343642.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzRKK6F1-1660626781507)(Pictures/image-20220105153416367.png)]

    因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功。

    安装成功
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJX0fXEJ-1660626781508)(Pictures/image-20220105153502619.png)]

    可以将Ingress接收到的请求转发到不同的Service中。

    推荐使用yaml文件方式

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
    spec:
      ingressClassName: ingress
      rules:
      - host: nginx.mashibing.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 8888
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    启动时问题
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RByYpMlD-1660626781509)(Pictures/image-20220105203819715.png)]

    Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动。

    找到指定的ingress的校验信息,删除即可:

    删除信息
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ovG8ttZH-1660626781509)(Pictures/image-20220105204434044.png)]
    # 查看校验webhook的配置
    kubectl get -A ValidatingWebhookConfiguration
    
    # 删除指定的校验
    kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置本地hosts文件

    配置hosts
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfmEOz7r-1660626781510)(Pictures/image-20220105204921272.png)]

    记下来既可以访问在Service中暴露的Nginx信息:

    服通过Ingress访问
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcFGrcI0-1660626781511)(Pictures/image-20220105205407393.png)]
  • 相关阅读:
    前端vue,js实现编码解码base64,实现对字符串进行编码解码
    全网售罄!南卡护眼台灯L1为何能这么受欢迎?
    JCMSuite应用-高功率半导体激光器
    hadoop namenode -format报错显示:命令未找到
    Java基础——final关键字
    java计算机毕业设计律师事务所网站源码+系统+mysql数据库+lw文档
    程序汪5万接的公交车板打车小程序,开发周期40天(发布版
    springboot大学生拼车管理系统毕业设计源码201507
    Java学习笔记3.6.3 final关键字 - final修饰变量
    Python操作Jenkins API
  • 原文地址:https://blog.csdn.net/zhangxia_/article/details/126364161