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         #########################

  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/liulvzhong/p/11764035.html
Copyright © 2011-2022 走看看