
[利用 K8S 技术栈打造个人私有云系列文章目录]
- 利用 K8S 技术栈打造个人私有云(连载之:初章)
- 利用 K8S 技术栈打造个人私有云(连载之:K8S 集群搭建)
- 利用 K8S 技术栈打造个人私有云(连载之:K8S 环境理解和练手)
- 利用 K8S 技术栈打造个人私有云(连载之:基础镜像制作与实验)
- 利用 K8S 技术栈打造个人私有云(连载之:资源控制研究)
- 利用 K8S 技术栈打造个人私有云(连载之:私有云客户端打造)( Coming Soon...)
- 利用 K8S 技术栈打造个人私有云(连载之:总结与升华)( Coming Soon...)
在前文中我们已经搭建好了 K8S 集群,接下来就来讲述一下 K8S 的一些重要的概念和知识,并搞两个例子在集群中来实际练手感受一把!
K8S 环境理解
kubernetes 的概念非常多,组件也不少,本文主要阐述一下几个最主要、平时用得最频繁的概念,最详细的学习文档是官网教程!
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 pods,kubectl 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/

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