【利用K8S技术栈打造我的私有云系列文章目录】php
在前文中咱们已经搭建好了K8S集群,接下来就来说述一下K8S的一些重要的概念和知识,并搞两个例子在集群中来实际练手感觉一把!html
注: 本文首发于 My 公众号 CodeSheep ,可 长按 或 扫描 下面的 当心心 来订阅 ↓ ↓ ↓node
kubernetes的概念很是多,组件也很多,本文主要阐述一下几个最主要、平时用得最频繁的概念,最详细的学习文档是官网教程!nginx
该图描述的设计架构是一个典型的M-S架构,一主两从,这和我搭建的集群基本是一致的,主节点和从节点上运行哪些kube组件,其实在我搭建集群那篇文章也已经讲过了,下面来阐述一下kubernetes集群里的重要概念和操做命令。redis
Pod是Kubernetes中最小的管理元素,Pod是一组容器的集合,且一个Pod只能运行在一个Node上,Pod是kubernetes调度、部署、扩展的基本单位docker
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,而无论删除的缘由是什么。json
其实其CURD的命令和上面都差很少,这里不一一列出了c#
kubectl create -f create_rc.json
kubectl get rc
Service 是一个定义了一组Pod的策略的抽象,能够理解为抽象到用户层的一个宏观服务。其实这个概念在Swarm集群里也有,能够参照理解。api
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,并在容器之间完成文件交换
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来作一件事很简单吧!
本示例演示的是:部署一个包含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/
简单的留言板系统就生成了!
做者更多的SpringBt实践文章在此:
若是有兴趣,也能够抽点时间看看做者一些关于容器化、微服务化方面的文章: