• Kubernetes Demo


    学习研究,使用minikube模拟。做下记录,方便回顾,加深理解。

    通过Kubernetes的命令行工具kubectl远程管理集群

    术语

    Cluster

    Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用

    Master

    Master是Cluster的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master运行Linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个Master。

    Node

    Node的职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。Node运行在Linux操作系统上,可以是物理机或者是虚拟机。

    Deployment

    是Kubernetes的术语,可以理解为应用

    Pod

    Pod是容器的集合,通常会将紧密相关的一组容器放到一个Pod中,同一个Pod中的所有容器共享IP地址和Port空间,也就是说它们在一个network namespace中。

    Pod是Kubernetes调度的最小单位,同一Pod中的容器始终被一起调度。

    Pod中的容器会作为一个整体被Master调度到一个Node上运行。

    Controller

    Kubernetes通常不会直接创建Pod,而是通过Controller来管理Pod的。Controller中定义了Pod的部署特性,比如有几个副本、在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。

    • Deployment是最常用的Controller。Deployment可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
    • ReplicaSet实现了Pod的多副本管理。使用Deployment时会自动创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本的,我们通常不需要直接使用ReplicaSet。
    • DaemonSet用于每个Node最多只运行一个Pod副本的场景。正如其名称所揭示的,DaemonSet通常用于运行daemon。
    • StatefuleSet能够保证Pod的每个副本在整个生命周期中名称是不变的,而其他Controller不提供这个功能。当某个Pod发生故障需要删除并重新启动时,Pod的名称会发生变化,同时StatefuleSet会保证副本按照固定的顺序启动、更新或者删除。
    • Job用于运行结束就删除的应用,而其他Controller中的Pod通常是长期持续运行。

    Service

    Deployment可以部署多个副本,每个Pod都有自己的IP,外界如何访问这些副本呢?通过Pod的IP吗?

    要知道Pod很可能会被频繁地销毁和重启,它们的IP会发生变化,用IP来访问不太现实。

    Kubernetes Service定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。

    Kubernetes运行容器(Pod)与访问容器(Pod)这两项任务分别由Controller和Service执行。

    Namespace

    如果有多个用户或项目组使用同一个Kubernetes Cluster,如何将他们创建的Controller、Pod等资源分开呢?

    Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。

    $ kubectl get namespace
    NAME              STATUS   AGE
    default           Active   2d20h
    kube-node-lease   Active   2d20h
    kube-public       Active   2d20h
    kube-system       Active   2d20h
    

    default:创建资源时如果不指定,将被放到这个Namespace中。

    kube-system:Kubernetes自己创建的系统资源将放到这个Namespace中。

    跑个demo

    创建应用

    kubectl run部署了一个应用,命名为kubernetes-bootcamp

    kubectl run kubernetes-bootcamp 
     --image=docker.io/jocatalin/kubernetes-bootcamp:v1 
     --port=8080
    

    https://blog.csdn.net/textdemo123/article/details/100519187

    --image-pull-progress-deadline=3h

    查看应用信息

    kubectl describe deploy kubernetes-bootcamp

    查看当前Pod

    kubectl get pods

    NAME                                 READY   STATUS    RESTARTS   AGE
    kubernetes-bootcamp-dd9784f6-fgf84   1/1     Running   0          4m36s
    

    查看pod详细信息

    kubectl describe pods kubernetes-bootcamp-dd9784f6-fgf84

    访问应用

    默认情况下,所有Pod只能在集群内部访问。

    为了能够从外部访问应用,我们需要将容器的8080端口映射到节点的端口。

    kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
    

    结果

    service/kubernetes-bootcamp exposed
    

    查看服务

    $ kubectl get services
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          47h
    kubernetes-bootcamp   NodePort    10.97.210.182   <none>        8080:31356/TCP   56s
    

    暴露服务,查看url

    $ minikube service kubernetes-bootcamp --url
    http://192.168.99.102:32093
    

    访问内容:

    Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-gz8nr | v=1
    

    scale应用

    $ kubectl get deployments
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   1/1     1            1           18h
    

    副本增加到3个

    $ kubectl scale deployments/kubernetes-bootcamp --replicas=3
    deployment.extensions/kubernetes-bootcamp scaled
    

    查看应用、pod数量

    $ kubectl get deployments
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   3/3     3            3           18h
    
    $ kubectl get pods
    NAME                                   READY   STATUS    RESTARTS   AGE
    kubernetes-bootcamp-7dc9765bf6-dtsr9   1/1     Running   0          52s
    kubernetes-bootcamp-7dc9765bf6-gz8nr   1/1     Running   0          18h
    kubernetes-bootcamp-7dc9765bf6-jn88c   1/1     Running   0          52s
    

    curl访问

    $ curl http://192.168.99.102:32093/
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    84    0    84    0     0    413      0 --:--:-- --:--:-- --:--:--   413Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-dtsr9 | v=1
    
    
    $ curl http://192.168.99.102:32093/
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    84    0    84    0     0    413      0 --:--:-- --:--:-- --:--:--   413Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-jn88c | v=1
    
    
    $ curl http://192.168.99.102:32093/
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100    84    0    84    0     0    415      0 --:--:-- --:--:-- --:--:--   415Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7dc9765bf6-gz8nr | v=1
    

    可以看到每次请求发送到不同的Pod,3个副本轮询处理,这样就实现了负载均衡

    scale down 来删除副本

    kubectl scale deployments/kubernetes-bootcamp --replicas=2
    

    滚动更新

    当前应用使用的image版本为v1,执行如下命令将其升级到v2

     kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
    

    kubectl get pods可以观察滚动更新的过程:v1的Pod被逐个删除,同时启动了新的v2Pod。

    $ kubectl get pods
    NAME                                   READY   STATUS        RESTARTS   AGE
    kubernetes-bootcamp-7dc9765bf6-dtsr9   1/1     Terminating   0          15m
    kubernetes-bootcamp-7dc9765bf6-gz8nr   1/1     Terminating   0          19h
    kubernetes-bootcamp-cfc74666-8tpqz     1/1     Running       0          13s
    kubernetes-bootcamp-cfc74666-gz9l2     1/1     Running       0          2s
    
    $ kubectl get pods
    NAME                                 READY   STATUS    RESTARTS   AGE
    kubernetes-bootcamp-cfc74666-8tpqz   1/1     Running   0          58s
    kubernetes-bootcamp-cfc74666-gz9l2   1/1     Running   0          47s
    

    回退到v1版本,kubectl rollout undo

    $ kubectl rollout undo deployments/kubernetes-bootcamp
    deployment.extensions/kubernetes-bootcamp rolled back
    

    查看节点

    kubectl get nodes

    查看集群信息

    kubectl cluster-info

    Kubernetes master is running at https://172.17.0.37:8443
    KubeDNS is running at https://172.17.0.37:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    

    检查pod是否启动并运行

    kubectl get pod

    ContainerCreating 正在创建

    Running 运行中

    获取暴露 Service 的 URL 以查看 Service 的详细信息

    minikube service hello-minikube --url

    删除 Service:

    kubectl delete services hello-minikube

    删除deployment

    kubectl delete deployment hello-minikube

    停止本地 Minikube 集群:

    minikube stop

    删除本地 Minikube 集群:

    minikube delete

    # 删除pod
     kubectl delete pod  hello-minikube-856979d68c-s4sb2
    
  • 相关阅读:
    Thymeleaf
    JdbcTemplate
    submit提交判断
    C++经典排序算法的理解:冒泡排序和选择排序
    求二进制中1的个数
    记录一次读取hdfs文件时出现的问题java.net.ConnectException: Connection refused
    linux服务器间配置ssh免密连接
    psycopg2模块安装问题
    sklearn.tree.DecisionTreeClassifier 详细说明
    sklearn.neighbors.NNeighborsClassifier 详细说明
  • 原文地址:https://www.cnblogs.com/followyou/p/12498989.html
Copyright © 2020-2023  润新知