zoukankan      html  css  js  c++  java
  • 用实例理解k8s群集(干货)

     一些概念:

    1、 pods是一组容器的集合,以pods为单位来管理,共享PID,网络IP和CUTS命名空间;

    2、 容器共享存储卷;用yml文件来定义容器,是k8s里的最小单位。

    3、本实验要先准备好一个master,至少一个node,搭建过程略(请看本博客其它发布)。

    一、实例:

    示例1,一般的pods:

    [root@master ~]# cat pod.yaml

    apiVersion: v1

    kind: Pod

    metadata:

      name: nginx

    spec:

      containers:

      - name: nginx

        image: nginx

        ports:

        - containerPort: 80

    kubectl create -f pod.yaml  ##创建

    kubectl delete pods nginx  ##删除名为nginx的pods

     

     示例2,带自定义存储的pods:

    [root@master ~]# cat vol.yaml

    apiVersion: v1

    kind: Pod

    metadata:

      name: redis

    spec:

      containers:

      - name: redis

        image: redis

        volumeMounts:

        - name: redis-persistent-storage

          mountPath: /data/redis

      volumes:

      - name: redis-persistent-storage

    emptyDir: {}

    [root@master ~]# kubectl create -f vol.yaml

    [root@master ~]# kubectl get pods redis -o yaml    ##查看在那个node创建了pods

    示例3,带Labels的pods:

    用于标示对象(如Pod)的key/value对,组织并选择对象子集;

    [root@master ~]# cat labels.yaml

    apiVersion: v1

    kind: Pod

    metadata:

      name: nginx-labels

      labels:

        app: nginx-labels

    spec:

      containers:

      - name: nginx-labels

        image: nginx

        ports:

    - containerPort: 80

     

     示例4,Replication Controllers:

    确保在任一时刻运行指定数目的pod,容器重新调度;规模调整;在线升级,多发布版本跟踪。

    [root@master ~]#  cat rc.yaml

    apiVersion: v1

    kind: ReplicationController

    metadata:

      name: nginx-controller         ##与app和labels保持一致为好,不然应用service时可能指定错。

    spec:

      replicas: 2

      selector:

        app: nginx-rc                ##依据nginx-rc来判断容器是否正常,如down掉则重新自动跑

      template:

        metadata:

          labels:

            app: nginx-rc                 ##labels为nginx-rc

        spec:

          containers:

          - name: nginx-rc                      #容器名为nginx-rc

            image: nginx

            ports:

            - containerPort: 80

     

     

     删除后再查看:

     

     删除整个rc后,rc就停止了:

     [root@master ~]# kubectl delete rc nginx-controller

     

     示例5,services:

    Pods为另一个pods提供服务时如何找到这些pods?

    Services:1、可抽象一系列pod并定义其访问规则;2、固定ip地址和DNS域名;3、通过环境变量和DNS发现服务;4、负载均衡;

    5、外部服务-ClusterIP(master或nodes主机上访问) NodePort (提供给外部访问) LoadBalancer(外部访问)

    [root@master ~]#  cat service.yaml     ##注意大小写

    apiVersion: v1

    kind: Service

    metadata:

      name: nginx-service

    spec:

      ports:

      - port: 8000      ##外部访问的端口,最好要加上外部能访问的网卡ip,不然只能在node访问

        targetPort: 80      # 要访问的pods端口

        protocol: TCP

      selector:

    app: nginx-labels       #标记要访问那个 pods

    创建、查看并访问:

     

     

     

     示例6--1,rc +service (这样,能在群集以外的机器上访问NodePort类型的端口映射:且ip可以是群集的任何一个物理主机ip),本实验在示例4的基础上进行:

    [root@master ~]# cat service-rc.yaml

    apiVersion: v1

    kind: Service

    metadata:

      name: nginx-service-rc

      labels:

        app: nginx-service-rc

    spec:

      type: NodePort

      selector:

        app: nginx-rc         ##是rc里选择器的名,不是rc实例里metadata指定的name哦

      ports:

      - name: http

        nodePort: 30000

        port: 80

    protocol: TCP

      访问效果:

     

     

     示例6--2,rc +service 2(这样,只能在任何一台的群集机器上访问),本实验在示例4的基础上进行,与上一个实验共存,不冲突:

       [root@master ~]# cat service-rc2.yaml

    apiVersion: v1

    kind: Service

    metadata:

      name: nginx-service-rc2

      labels:

        app: nginx-service-rc2

    spec:

      selector:

        app: nginx-rc                ##不可以是rc文档里metadata的命名。

      ports:

        - port: 8033

          targetPort: 80

          protocol: TCP

    用命令创建一个service:

    kubectl create -f  service-rc2.yaml

     示例7,secret:

    [root@master ~]# cat secret.yaml

    apiVersion: v1

    kind: Secret

    metadata:

      name: mysecret

    type: Opaque                                  ##表示随机的用户数据。

    data:  

      API_KEY: bWVnYV9zZWNyZXRfa2V5

      API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTE=

     

     或(注意大小写):

    [root@master ~]# cat secret2.yaml

    apiVersion: v1

    kind: Secret

    metadata:

      name: mysecret2

    type: Opaque

    data:

      USERNAME: root

      PASSWORD: cmVhbGx5X3NlY3JldF92YWx1ZTE=

    资源管理-resources ;健康检测—liveness/ readiness probes ,钩子函数:组织资源配置:

    Kubectl 批量处理:在线应用升级及回退:

    Track表示稳定的版本 ; replicas表示动态地调整pods的数目。

    kubectl scale rc nginx-controller --replicas=5

    kubectl describe pod    ##查看pod

    kubectl logs pod         #查看logs

     

     kubectl get pods -o wide       ##查所有容器的名字、ip等基本情况

    docker network inspect bridge   ##查bridge的信息;

    kubectl describe pods nginx-rc-9hhmb   ##查某个pods的详细信息;

    kubectl port-forward nginx 8080:80   #映射某个端口到容器,以便外部机器访问(重启容器后消失)。

    示例8,deployment(方便更新镜像):

    [root@master ~]# cat deployment.yaml

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      name: nginx-deployment

      labels:

        app: nginx-dep

    spec:

      replicas: 3

      selector:

        matchLabels:

          app: nginx-dep

      template:

        metadata:

          labels:

            app: nginx-dep

        spec:

          containers:

          - name: nginx-dep

            image: nginx:1.12.2

            ports:

            - containerPort: 80

    ############一些常用命令#################

    kubectl get pods

    kubectl get deployment

    kubectl get rs

    kubectl get deployment -o wide

     

     

     ##更新镜像版本,并检查升级结果

    kubectl set image deployment nginx-deployment nginx-dep=nginx:1.13

     

     

    ##回滚镜像并检查(版本3是最新的,覆盖了版本1):

    kubectl rollout history deployment nginx-deployment

    kubectl rollout undo deployment nginx-deployment

    kubectl get deployment -o wide

     

    ##映射容器里的服务给外部访问:

    kubectl expose deployment nginx-deployment --type=NodePort  

    ##不需要删除原有名为nginx-deployment的 deployment

     

    ##二、网络实现(现实中,LoadbaLance使用多些):

     

     

    不要直接使用管理pods,因为我们希望更新image和扩张容器时ip和port等不变,

    这就要用到service:

     ClusterIP: 只有master和node节点可以访问;

    NodePort :外部与节点相通的网络也可以访问到。

    LoadBalancer :云服务商可以提供。

    Service 示例1:直接用命令映射pod给外界访问(必须要有label,容器不可以直接使用service)

    kubectl expose pods nginx-labels (命令后面带 --type=NodePort 则创建的svc网络类型是NodePort,默认为ClusterIP,仅节点可访问),以下创建了一个service(pods 就是容器名为nginx-labels 的kind类型,kind类型要对,若是deployment,就要用deployment),并访问:

     

     

     以下测试中,删除名为nginx-labels的pods后,service创建的ip没有变,但访问不了:

     

     

     重新创建同一个配置文档下的pod, pod的ip变了,但service的ip没有变,仍可正常访问:

     

     

     

     ###另:在线用命令修改deployment文件(对应的nginx-deployment在跑),热更新:

    kubectl edit deployment nginx-deployment       ##修改后保存退出后,立即生效,旧的容器会被消毁,新的容器会起来。

    ##其它常用命令:

    kubectl get node -o wide        ##查node的情况;

    kubectl describe node node1     ##查节点node1的情况;

    ###################         end         #########################

  • 相关阅读:
    19. 各种提权姿势总结
    18. 各种数据库查询基础
    Kafka——分布式消息系统
    跳表
    Linux的io机制
    Make命令
    ElasticSearch之二——集群
    ElasticSearch之一——索引
    Scribe日志收集工具
    Thrift 的原理和使用
  • 原文地址:https://www.cnblogs.com/liulvzhong/p/11764035.html
Copyright © 2011-2022 走看看