【利用 K8S 技术栈打造个人私有云系列文章目录】
在前文中我们已经搭建好了 K8S 集群,接下来就来讲述一下 K8S 的一些重要的概念和知识,并搞两个例子在集群中来实际练手感受一把!
kubernetes 的概念非常多,组件也不少,本文主要阐述一下几个最主要、平时用得最频繁的概念,最详细的学习文档是官网教程!
该图描述的设计架构是一个典型的 M-S 架构,一主两从,这和我搭建的集群基本是一致的,主节点和从节点上运行哪些 kube 组件,其实在我搭建集群那篇文章也已经讲过了,下面来阐述一下 kubernetes 集群里的重要概念和操作命令。
Pod 是 Kubernetes 中最小的管理元素,Pod 是一组容器的集合,且一个 Pod 只能运行在一个 Node 上,Pod 是 kubernetes 调度、部署、扩展的基本单位
kubectl run pod-example --image=nginx
kubectl create -f create_pod.yaml
kubectl delete po pod名
kubectl get pods
, kubectl get pods -o wide
kubectl discrible po pod名
Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
kubectl create namespace namespace名
kubectl delete namespaces namespace名
kubectl get namespaces
Replication Controller 保证了在所有时间内,都有特定数量的 Pod 副本正在运行,如果太多了,Replication Controller 就杀死几个,如果太少了,Replication Controller 会新建几个,和直接创建的 pod 不同的是,Replication Controller 会替换掉那些删除的或者被终止的 pod,而不管删除的原因是什么。
其实其 CURD 的命令和上面都差不多,这里不一一列出了
kubectl create -f create_rc.json
kubectl get rc
Service 是一个定义了一组 Pod 的策略的抽象,可以理解为抽象到用户层的一个宏观服务。其实这个概念在Swarm 集群里也有,可以参照理解。
Service 的这样一层抽象最起码可以抵御两个方面的问题:
其 CURD 的命令和上面都差不多,这里依然不一一列出
kubectr create -f redis-master-service.json
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,并在容器之间完成文件交换
restartPolicy: Never
volumes:
containers:
name: nginx-container
image: nginx
volumeMounts:
name: debian-container
image: debian
volumeMounts:
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 来做一件事很简单吧!
本示例演示的是:部署一个包含 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
http://your-host:30001/
简单的留言板系统就生成了!