利用 K8S 技术栈打造个人私有云(连载之: K8S 环境理解和练手) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hansonwang99
V2EX    程序员

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

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

    封面图片


    [利用 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 的servie

    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     Solana     930 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 19:57 PVG 03:57 LAX 12:57 JFK 15:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86