• Kubenertes 实战入门


    实战入门

    Namespace

    Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离

    默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。

    可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

    image-20220115162545768

    kubernetes在集群启动之后,会默认创建几个namespace。

    $ kubectl get ns #等价于 kubectl get namespace
    NAME              STATUS   AGE
    default           Active   15h     #  所有未指定Namespace的对象都会被分配在default命名空间
    kube-node-lease   Active   15h     #  集群节点之间的心跳维护,v1.13开始引入
    kube-public       Active   15h     #  此命名空间下的资源可以被所有人访问(包括未认证用户)
    kube-system       Active   15h     #  所有由Kubernetes系统创建的资源都处于这个命名空间
    

    namespace资源的具体操作:

    命令方式

    • 查看namespace资源操作
    # 查看所有的ns  
    #命令:kubectl get ns
    $ kubectl get ns
    NAME              STATUS   AGE
    default           Active   15h     #  所有未指定Namespace的对象都会被分配在default命名空间
    kube-node-lease   Active   15h     #  集群节点之间的心跳维护,v1.13开始引入
    kube-public       Active   15h     #  此命名空间下的资源可以被所有人访问(包括未认证用户)
    kube-system       Active   15h     #  所有由Kubernetes系统创建的资源都处于这个命名空间 
    
    # 查看指定的ns   
    #命令:kubectl get ns ns名称
    $ kubectl get ns default
    NAME      STATUS   AGE
    default   Active   15h
    
    # 指定输出格式  
    #命令:kubectl get ns ns名称  -o 格式参数
    #kubernetes支持的格式有很多,比较常见的是wide、json、yaml
    $ kubectl get ns default -o yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      creationTimestamp: "2022-01-14T18:14:05Z"
      name: default
      resourceVersion: "146"
      selfLink: /api/v1/namespaces/default
      uid: 4d21aa19-3172-4f4c-b03f-c2ac400fe505
    spec:
      finalizers:
      - kubernetes
    status:
      phase: Active
    
    # 查看ns详情  
    #命令:kubectl describe ns ns名称
    $ kubectl describe ns kube-system
    Name:         kube-system
    Labels:       <none>
    Annotations:  <none>
    Status:       Active
    
    No resource quota. # ResourceQuota 针对namespace做的资源限制
    
    No LimitRange resource. # LimitRange针对namespace中的每个组件做的资源限制
    
    
    • 创建namespace资源操作
    $ kubectl create ns dev
    namespace/dev created
    
    • 删除namespace资源操作
    $ kubectl delete ns dev
    namespace "dev" deleted
    

    配置方式

    准备一个yaml文件,ns-dev.yaml

    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev
    
    • 创建namespace资源操作
    $ kubectl create -f ns-dev.yaml
    或
    $ kubectl apply -f ns-dev.yaml
    
    • 删除namespace资源操作
    $ kubectl delete -f ns-dev.yaml
    

    Pod

    Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。

    Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。

    image-20220115164124221

    kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:

    $ kubectl get pod -n kube-system
    NAME                                 READY   STATUS    RESTARTS   AGE
    coredns-6955765f44-dg8jn             1/1     Running   0          14h
    coredns-6955765f44-vcc9k             1/1     Running   0          14h
    etcd-k8s-master                      1/1     Running   0          14h #Master节点的etcd
    kube-apiserver-k8s-master            1/1     Running   0          14h #Master节点的controller-manager
    kube-controller-manager-k8s-master   1/1     Running   0          14h #Master节点的flannel网络
    kube-flannel-ds-7f5ws                1/1     Running   0          13h
    kube-flannel-ds-bkpjt                1/1     Running   0          13h
    kube-flannel-ds-mhgv8                1/1     Running   0          13h
    kube-flannel-ds-vtqbs                1/1     Running   0          13h
    kube-proxy-6zdg2                     1/1     Running   0          14h
    kube-proxy-cc9kp                     1/1     Running   0          14h
    kube-proxy-jx5wg                     1/1     Running   0          14h
    kube-proxy-kcl28                     1/1     Running   0          14h
    kube-scheduler-k8s-master            1/1     Running   0          14h #Master节点的scheduler
    

    Pod资源的具体操作:

    命令方式

    • 创建Pod资源操作
    # 命令格式: kubectl run (pod控制器名称) [参数] 
    # --image  指定Pod的镜像
    # --port   指定端口
    # --namespace  指定namespace
    $ kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/nginx created
    
    • 查看Pod资源操作
    # 查看Pod基本信息
    $ kubectl get pods -n dev
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-64777cd554-7jvxs   1/1     Running   0          116s
    
    # 查看Pod的详细信息
    # kubectl describe pods 和 kubectl describe pod都可以查看
    # pods和pod两者的区别有待测试
    $ kubectl describe pods nginx-64777cd554-7jvxs -n dev
    Name:         nginx-64777cd554-7jvxs
    Namespace:    dev
    Priority:     0
    Node:         k8s-node1/192.168.188.129
    Start Time:   Sat, 15 Jan 2022 16:47:45 +0800
    Labels:       pod-template-hash=64777cd554
                  run=nginx
    Annotations:  <none>
    Status:       Running
    IP:           10.244.2.4
    IPs:
      IP:           10.244.2.4
    Controlled By:  ReplicaSet/nginx-64777cd554
    Containers:
      nginx:
        Container ID:   docker://2eb807285ea16c331ea2bdb9aacd8c79706fbece45d7148e7c8724303f7073f6
        Image:          nginx:1.17.1
        Image ID:       docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbb
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Sat, 15 Jan 2022 16:47:46 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-k2kgw (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-k2kgw:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-k2kgw
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason     Age    From                Message
      ----    ------     ----   ----                -------
      Normal  Scheduled  3m25s  default-scheduler   Successfully assigned dev/nginx-64777cd554-7jvxs to k8s-node1
      Normal  Pulled     3m25s  kubelet, k8s-node1  Container image "nginx:1.17.1" already present on machine
      Normal  Created    3m24s  kubelet, k8s-node1  Created container nginx
      Normal  Started    3m24s  kubelet, k8s-node1  Started container nginx
    
    
    • 访问Pod资源操作
    # 获取PodIP
    $ kubectl get pods -n dev -o wide
    NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
    nginx-64777cd554-7jvxs   1/1     Running   0          5m22s   10.244.2.4   k8s-node1   <none>           <none>
    
    # 访问Pod
    $ curl http://10.244.2.4
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...
    
    
    • 删除Pod资源操作
    # 删除指定Pod
    $ kubectl delete pod nginx-64777cd554-7jvxs -n dev
    pod "nginx-64777cd554-7jvxs" deleted
    
    # 此时,显示删除Pod成功,但是再查询,发现又新产生了一个 
    $ kubectl get pods -n dev
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-5ff7956ff6-jj4ng   1/1     Running   0  
    
    # 这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
    # 此时要想删除Pod,必须删除Pod控制器
    # 高版本的kubectl 已经允许直接通过pod删除
    
    #先来查询一下当前namespace下的Pod控制器
    $ kubectl get deploy -n dev
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nginx   1/1     1            1           18m
    
    #删除此PodPod控制器
    $ kubectl delete deploy nginx -n dev
    deployment.apps "nginx" deleted
    # 稍等片刻,再查询Pod,发现Pod被删除了
    $ kubectl get pods -n dev
    No resources found in dev namespace.
    

    配置方式

    准备一个yaml文件,pod-nginx.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: dev
    spec:
      containers:
      - image: nginx:1.17.1
        name: pod
        ports:
        - name: nginx-port
          containerPort: 80
          protocol: TCP
    
    • 创建pod资源操作
    $ kubectl create -f pod-nginx.yaml
    或
    $ kubectl apply -f pod-nginx.yaml
    
    • 删除pod资源操作
    $ kubectl delete -f pod-nginx.yaml
    

    Label

    Label它的作用就是在资源上添加标识,用来对它们进行区分和选择。

    Label的特点:

    • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
    • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
    • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

    可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

    一些常用的Label 示例如下:

    • 版本标签:"version":"release", "version":"stable"......
    • 环境标签:"environment":"dev","environment":"test","environment":"pro"
    • 架构标签:"tier":"frontend","tier":"backend"

    标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:

    • Label用于给某个资源对象定义标识
    • Label Selector用于查询和筛选拥有某些标签的资源对象

    当前有两种Label Selector:

    • 基于等式的Label Selector
      • name = slave: 选择所有包含Label中key="name"且value="slave"的对象
      • env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象
    • 基于集合的Label Selector
      • name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象
      • name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象

    标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:

    • name=slave,env!=production
    • name not in (frontend),env!=production

    命令方式

    • 查看Label操作
    # 查看标签
    $ kubectl get pod nginx -n dev --show-labels
    NAME    READY   STATUS    RESTARTS   AGE     LABELS
    nginx   1/1     Running   0          7m41s   <none>
    
    • 创建Label操作
    # 为pod资源打标签
    $ kubectl label pod nginx version=1.0 -n dev
    pod/nginx labeled
    
    • 删除Label操作
    # 删除标签
    $ kubectl label pod nginx version- -n dev
    pod/nginx labeled
    
    • 更新Label操作
    # 为pod资源更新标签
    $ kubectl label pod nginx version=2.0 -n dev --overwrite
    pod/nginx labeled
    
    • 选择Label操作
    #筛选标签
    $  kubectl get pod -n dev -l version=2.0  --show-labels
    NAME        READY   STATUS    RESTARTS   AGE   LABELS
    nginx   1/1     Running   0          17m   version=2.0
    $  kubectl get pod -n dev -l version!=2.0 --show-labels
    No resources found in dev namespace.
    

    配置方式

    准备一个yaml文件,pod-nginx.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: dev
      labels:
        version: "3.0" 
        env: "test"
    spec:
      containers:
      - image: nginx:1.17.1
        name: pod
        ports:
        - name: nginx-port
          containerPort: 80
          protocol: TCP
    
    • 创建Label资源操作
    $ kubectl create  -f  pod-nginx.yaml
    或
    $ kubectl apply -f pod-nginx.yaml
    
    • 删除Label资源操作
    $ kubectl delete  -f  pod-nginx.yaml
    

    Deployment

    在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

    在kubernetes中Pod控制器的种类有很多,这里只介绍一种:Deployment。

    image-20220115172443939

    命令方式

    • 创建deployment资源操作
    # 命令格式: kubectl run deployment名称  [参数] 
    # --image  指定pod的镜像
    # --port   指定端口
    # --replicas  指定创建pod数量
    # --namespace  指定namespace
    $ kubectl run nginx1 --image=nginx:1.17.1 --port=80 --replicas=3 -n dev
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/nginx1 created
    
    # 查看创建的Pod
    $ kubectl get pods -n dev
    NAME                      READY   STATUS    RESTARTS   AGE
    nginx1-79d7bd676b-5fbgc   1/1     Running   0          74s
    nginx1-79d7bd676b-962vw   1/1     Running   0          74s
    nginx1-79d7bd676b-vf8jv   1/1     Running   0          74s
    
    • 查看deployment资源操作
    # 查看deployment的信息
    $ kubectl get deploy -n dev
    NAME     READY   UP-TO-DATE   AVAILABLE   AGE
    nginx1   3/3     3            3           2m15s
    
    # UP-TO-DATE:成功升级的副本数量
    # AVAILABLE:可用副本的数量
    $ kubectl get deploy -n dev -o wide
    NAME     READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
    nginx1   3/3     3            3           11m   nginx1       nginx:1.17.1   run=nginx1
    
    # 查看deployment的详细信息
    $ kubectl describe deploy nginx1 -n dev
    Name:                   nginx1
    Namespace:              dev
    CreationTimestamp:      Sat, 15 Jan 2022 17:27:31 +0800
    Labels:                 run=nginx1
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               run=nginx1
    Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  run=nginx1
      Containers:
       nginx1:
        Image:        nginx:1.17.1
        Port:         80/TCP
        Host Port:    0/TCP
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   nginx1-79d7bd676b (3/3 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  12m   deployment-controller  Scaled up replica set nginx1-79d7bd676b to 3
    
    • 删除deployment资源操作
    # 删除 
    $ kubectl delete deploy nginx1 -n dev
    deployment.apps "nginx" deleted
    

    配置方式

    准备一个yaml文件,deploy-nginx.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: dev
    spec:
      replicas: 3
      selector:
        matchLabels:
          run: nginx
      template:
        metadata:
          labels:
            run: nginx
        spec:
          containers:
          - image: nginx:1.17.1
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
    
    • 创建deployment资源操作
    $ kubectl create -f deploy-nginx.yaml
    或
    $ kubectl apply -f deploy-nginx.yaml
    
    • 删除deployment资源操作
    $ kubectl delete -f deploy-nginx.yaml
    

    Service

    能够利用Deployment来创建一组Pod来提供具有高可用性的服务。

    虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

    • Pod IP 会随着Pod的重建产生变化
    • Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问

    这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。

    Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。

    image-20220115175905292

    命令方式

    • 创建集群内部可访问的Service
    #暴露Service
    $ kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
    service/svc-nginx1 exposed
    
    #查看service
    $ kubectl get svc svc-nginx -n dev -o wide
    NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
    svc-nginx   ClusterIP   10.106.205.41   <none>        80/TCP    2s    run=nginx
    
    # 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
    # 可以通过这个IP访问当前service对应的Pod
    $ curl 10.106.205.41:80
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    .......
    </body>
    </html>
    
    • 创建集群外部也可访问的Service
    # 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
    # 如果需要创建外部也可以访问的Service,需要修改type为NodePort
    $ kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
    service/svc-nginx2 exposed
    
    # 此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)
    $ kubectl get svc  svc-nginx2  -n dev -o wide
    NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
    svc-nginx2   NodePort   10.102.19.90   <none>        80:31636/TCP   34s   run=nginx
    
    # 接下来就可以通过集群外的主机访问 节点IP:31928访问服务了
    # 例如在的电脑主机上通过浏览器访问下面的地址
    http://192.168.188.128:31636/
    

    image-20220115181334962

    • 删除Service
    $ kubectl delete svc svc-nginx-1 -n dev    
    

    配置方式

    创建一个svc-nginx.yaml,内容如下:

    apiVersion: v1
    kind: Service
    metadata:
      name: svc-nginx
      namespace: dev
    spec:
      clusterIP: 10.109.179.231 
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: ClusterIP
    
    • 创建service资源操作
    $ kubectl create -f deploy-nginx.yaml
    或
    $ kubectl apply -f deploy-nginx.yaml
    
    • 删除service资源操作
    $ kubectl delete -f deploy-nginx.yaml
    

    总结

    已经掌握了Namespace、Pod、Deployment、Service资源的基本操作,有了这些操作,就可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,就需要深入学习这几种资源的细节和原理。

  • 相关阅读:
    Python之路Day12--mysql介绍及操作
    Python之路第一课Day11--随堂笔记(异步IO数据库队列缓存之二)
    Python之路第一课Day10--随堂笔记(异步IO数据库队列缓存)
    Python之路第一课Day9--随堂笔记之二(进程、线程、协程篇)
    Python之路第一课Day9--随堂笔记之一(堡垒机实例以及数据库操作)未完待续....
    Python之路第一课Day8--随堂笔记(socket 承接上节---网络编程)
    Python之路第一课Day7--随堂笔记(面向对象编程进阶...未完待续 )
    Python之路第一课Day6--随堂笔记(面向对象 )
    Python之路第一课Day5--随堂笔记(模块)
    Python之路第一课Day4--随堂笔记(迭代生成装饰器)
  • 原文地址:https://www.cnblogs.com/HOsystem/p/15948245.html
Copyright © 2020-2023  润新知