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

2018-03-14 09:27:28 +08:00
 hansonwang99


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

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


K8S 环境理解

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

K8S 设计架构

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

Pod

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

Namespace

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

Replication Controller ( RC )

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

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

Service

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

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

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

这里给一个 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,并在容器之间完成文件交换

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"]

kubectl create -f two-container-pod.yaml

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 容器依然运行

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

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


后记

作者更多的原创文章在此


3583 次点击
所在节点    程序员
8 条回复
fengyuanjs
2018-03-14 09:31:56 +08:00
k8s 正在学习中
sun5244725
2018-03-14 09:56:51 +08:00
make
awhane
2018-03-14 11:33:14 +08:00
RC 可换成 Deployment。Deployment 资源也是走 RC 代码逻辑
xiaoyu9527
2018-03-14 11:37:12 +08:00
收藏了。 但是吐槽一下 明明讲的是云。 为啥都用手机当首图呢?
hansonwang99
2018-03-14 12:52:22 +08:00
@xiaoyu9527 原因是本人酷爱电子数码产品
gleymonkey
2018-03-14 13:06:26 +08:00
正好在学习 k8s,感谢
jyf007
2018-03-14 13:30:04 +08:00
@hansonwang99 你根本不算酷爱电子数码产品,我才是传说级爱好者
hansonwang99
2018-03-14 13:35:57 +08:00
@jyf007 向大佬致敬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/437815

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX