V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX  ›  程序员

利用 K8S 技术栈打造个人私有云(连载之: K8S 环境理解和练手)

  •  2
     
  •   hansonwang99 ·
    hansonwang99 · 2018-03-14 09:27:28 +08:00 · 3575 次点击
    这是一个创建于 2445 天前的主题,其中的信息可能已经有所发展或是发生改变。

    封面图片


    [利用 K8S 技术栈打造个人私有云系列文章目录]

    在前文中我们已经搭建好了 K8S 集群,接下来就来讲述一下 K8S 的一些重要的概念和知识,并搞两个例子在集群中来实际练手感受一把!


    K8S 环境理解

    kubernetes 的概念非常多,组件也不少,本文主要阐述一下几个最主要、平时用得最频繁的概念,最详细的学习文档是官网教程!

    K8S 设计架构

    K8S 架构

    该图描述的设计架构是一个典型的 M-S 架构,一主两从,这和我搭建的集群基本是一致的,主节点和从节点上运行哪些 kube 组件,其实在我搭建集群那篇文章也已经讲过了,下面来阐述一下 kubernetes 集群里的重要概念和操作命令。

    Pod

    Pod 是 Kubernetes 中最小的管理元素,Pod 是一组容器的集合,且一个 Pod 只能运行在一个 Node 上,Pod 是 kubernetes 调度、部署、扩展的基本单位

    • kubectl run 命令创建一个 pod:kubectl run pod-example --image=nginx
    • kubectl create 命令创建 pod:kubectl create -f create_pod.yaml
    • 删除 pod:kubectl delete po pod 名
    • 查看 pod 启动情况:kubectl get podskubectl get pods -o wide
    • 查看 pod 的详细信息:kubectl discrible po pod 名

    Namespace

    Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default ),而 node, persistentVolumes 等则不属于任何 namespace。

    • 创建 kubectl create namespace namespace 名
    • 删除 kubectl delete namespaces namespace 名
    • 查询 kubectl get namespaces

    Replication Controller ( RC )

    Replication Controller 保证了在所有时间内,都有特定数量的 Pod 副本正在运行,如果太多了,Replication Controller 就杀死几个,如果太少了,Replication Controller 会新建几个,和直接创建的 pod 不同的是,Replication Controller 会替换掉那些删除的或者被终止的 pod,而不管删除的原因是什么。

    其实其 CURD 的命令和上面都差不多,这里不一一列出了

    • 创建:kubectl create -f create_rc.json
    • 查看 rc 启动情况:kubectl get rc

    Service

    Service 是一个定义了一组 Pod 的策略的抽象,可以理解为抽象到用户层的一个宏观服务。其实这个概念在Swarm 集群里也有,可以参照理解。

    Service 的这样一层抽象最起码可以抵御两个方面的问题:

    • Pod 重启后 IP 地址的变化(保持用我们系统的客户其 IP 不变)
    • 提供负载均衡能力

    其 CURD 的命令和上面都差不多,这里依然不一一列出

    • 创建 service:kubectr create -f redis-master-service.json
    • 查看 service 的启动情况:kubectl get svc

    这里给一个 Service 的示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nginx-svc
      labels:
        app: nginx
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:  
        app: nginx
    

    好了,理论的东西看多了可能有点蒙,只能多找点不同的材料阅读并理解了。下面开始做几个练手示例,这几个例子都源自于K8S 官网,对于理解理论概念非常有好处,下面开始动手吧!


    关于 Pod 的实例练手

    本例子创建一个包含两个容器的 POD,并在容器之间完成文件交换

    • yaml 配置文件如下:
    apiVersion: v1
    kind: Pod
    metadata:
      name: two-containers
    spec:
    
      restartPolicy: Never
    
      volumes:
      - name: shared-data
        emptyDir: {}
    
      containers:
    
      - name: nginx-container
        image: nginx
        volumeMounts:
        - name: shared-data
          mountPath: /usr/share/nginx/html
    
      - name: debian-container
        image: debian
        volumeMounts:
        - name: shared-data
          mountPath: /pod-data
        command: ["/bin/sh"]
        args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
    
    • 创建 pod

    kubectl create -f two-container-pod.yaml

    • 查看 pod 和容器的信息

    kubectl get pod two-containers --output=yaml

    执行完成输出内容大致如下(经过缩减):

    apiVersion: v1
    kind: Pod
    metadata:
      ...
      name: two-containers
      namespace: default
      ...
    spec:
      ...
      containerStatuses:
    
      - containerID: docker://c1d8abd1 ...
        image: debian
        ...
        lastState:
          terminated:  // debian 容器已停止
            ...
        name: debian-container
        ...
    
      - containerID: docker://96c1ff2c5bb ...
        image: nginx
        ...
        name: nginx-container
        ...
        state:
          running:  // nginx 容器已运行
        ...
    

    可以看到 debian 容器已经停止了,nginx 容器依然运行

    • 我们进入 nginx 容器的 /bin/bash 并验证 nginx 服务器

    kubectl exec -it two-containers -c nginx-container -- /bin/bash

    执行如下命令来安装 curl:

    root@two-containers:/# apt-get update
    root@two-containers:/# apt-get install curl procps
    root@two-containers:/# ps aux
    

    然后执行curl localhost,可以获得输出:

    Hello from the debian container

    可见 debian 容器中写入的东西在 nginx 容器中获得了,因此文件交换也完成了

    用 Pod 来做一件事很简单吧!


    关于 RC 和 Service 的实例练手

    本示例演示的是:部署一个包含 Redis 集群、基于 PHP 的留言板系统

    • 创建 redis-master 的RC

    redis-master-controller.yaml 内容:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: redis-master
    spec:
      replicas: 1
      selector:
        name: redis-master
      template:
        metadata:
          name: redis-master
          labels:
            name: redis-master
        spec:
          containers:
          - name: redis-master
            image: kubeguide/redis-master
            ports:
            - containerPort: 6379
    

    创建该 RC 并查看创建结果:

    kubectl create -f redis-master-controller.yaml
    kubectl get rc
    kubectl get pods
    
    • 创建 redis-master 的service

    redis-master-service.yaml 内容:

    apiVersion: v1
    kind: Service
    metadata:
      name: redis-master
      labels:
        name: redis-master
    spec:
      ports:
      - port: 6379
        targetPort: 6379
      selector:
        name: redis-master
    

    创建该 Service 并查看:

    kubectl create -f redis-master-service.yaml
    kubectl get services
    
    • 创建 redis-slave 的RC

    redis-slave-controller.yaml 文件内容:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: redis-slave
    spec:
      replicas: 2
      selector: # RC 通过 spec.selector 来筛选要控制的 Pod
        name: redis-slave
      template:
        metadata:
          name: redis-slave
          labels: # Pod 的 label,可以看到这个 label 与 spec.selector 相同
            name: redis-slave
        spec:
          containers:
          - name: redis-slave
            image: kubeguide/guestbook-redis-slave
            env:
            - name: GET_HOSTS_FROM
              value: env
            ports:
            - containerPort: 6379
    

    创建该 RC 并查看:

    kubectl create -f redis-slave-controller.yaml
    kubectl get rc
    kubectl get pods
    
    • 创建 redis-slave 的service

    redis-slave-service.yaml 文件内容:

    apiVersion: v1
    kind: Service
    metadata:
      name: redis-slave
      labels:
        name: redis-slave
    spec:
      ports:
      - port: 6379  
      selector:
        name: redis-slave
    

    创建该 Service 并查看:

    kubectl create -f redis-slave-service.yaml
    kubectl get services
    
    • 创建 frontend 的RC

    frontend-controller.yaml 内容如下:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: frontend
      labels:
        name: frontend
    spec:
      replicas: 3
      selector:
        name: frontend
      template:
        metadata:
          labels:
            name: frontend
        spec:
          containers:
          - name: frontend
            image: kubeguide/guestbook-php-frontend
            env:
            - name: GET_HOSTS_FROM
              value: env
            ports:
            - containerPort: 80
    

    创建该 RC 并查看

    kubectl create -f frontend-controller.yaml
    kubectl get rc
    kubectl get pods
    
    • 创建 frontend 的Service

    frontend-service.yaml 文件内容如下:

    apiVersion: v1
    kind: Service
    metadata:
      name: frontend
      labels:
        name: frontend
    spec:
      type: NodePort
      ports:
      - port: 80
        nodePort: 30001
      selector:
        name: frontend
    

    创建该 Service 并查看

    kubectl create -f frontend-service.yaml
    kubectl get services
    
    • 访问http://your-host:30001/

    浏览器访问结果

    简单的留言板系统就生成了!


    后记

    作者更多的原创文章在此


    8 条回复    2018-03-14 13:35:57 +08:00
    sun5244725
        2
    sun5244725  
       2018-03-14 09:56:51 +08:00
    make
    awhane
        3
    awhane  
       2018-03-14 11:33:14 +08:00
    RC 可换成 Deployment。Deployment 资源也是走 RC 代码逻辑
    xiaoyu9527
        4
    xiaoyu9527  
       2018-03-14 11:37:12 +08:00
    收藏了。 但是吐槽一下 明明讲的是云。 为啥都用手机当首图呢?
    hansonwang99
        5
    hansonwang99  
    OP
       2018-03-14 12:52:22 +08:00 via iPhone
    @xiaoyu9527 原因是本人酷爱电子数码产品
    gleymonkey
        6
    gleymonkey  
       2018-03-14 13:06:26 +08:00
    正好在学习 k8s,感谢
    jyf007
        7
    jyf007  
       2018-03-14 13:30:04 +08:00
    @hansonwang99 你根本不算酷爱电子数码产品,我才是传说级爱好者
    hansonwang99
        8
    hansonwang99  
    OP
       2018-03-14 13:35:57 +08:00 via iPhone
    @jyf007 向大佬致敬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4868 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 05:41 · PVG 13:41 · LAX 21:41 · JFK 00:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.