通过简单使用深入Kubernetes
集群描述
假如现在有一个由三台机器搭建而成的Kubernetes集群。三台机器等同于三个节点。在Kubernetes中有着两种角色master节点(即我们通常所认为的主节点)和node节点(从节点)
# 在任一一个节点上检查集群信息
kubectl get nodes
# 输出如下
NAME STATUS ROLES AGE VERSION
master Ready master 10m v1.14.0
node01
node02
YAML文件
在Kubernetes中,各种资源都是通过yaml文件来进行创建。比如,pod、rs、replicaset和deployment等。yaml的编写区分大小写。支持map/list的文件进行编写。
一个普通的yaml文件
apiVersion: v1 # 版本信息
kind: Pod # 当前要创建的资源类型, Pod
metadata: # 元数据
name: nginx # pod的名字
labels: # pod拥有的label -> app: nginx
app: nginx
spec: # 与pod容器相关的详情定义
containers: # pod里面拥有一个container,也可配置多个
- name: nginx # container name===nginx
image: nginx # 所用到的镜像 nginx
ports:
- containerPort: 80 # 配置container的端口为80
yaml文件解释说明
编写yaml文件的时候要使用空格不要使用tab键。yaml中存在层级关系,左边对齐表示同一层级。
# - “空格” name这种形式的写法表示数组。以上为例,container属性下有一个数组,数组中有 name image 和 ports
- name
深入了解Pod
如果说操作docker的最小单元是容器,那么和kubernetes打交道涉及到最多的就是pod
创建一个pod
在集群所在的服务器中(任意一个节点),创建一个yaml文件。名字可以自定义,不过一般遵循见名知意的原则。创建一个yaml文件,名字命名为 ngxin_pod.yaml,内容如下。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
根据 nginx_pod.yaml 文件去创建 pod。以及相关操作。
kubectl apply/create -f nginx_pod.yaml
# 查看pod信息
kubectl get pods
# pod详情信息
kubectl get pods -o wide
# pod创建描述信息,例如可查看pod具体运行在那个节点上等详细信息。在对应节点上可查看pod所对应的正在运行的容器
kubectl describe pod podName
# 删除pod
kubectl delete -f nginx_pod.yaml
# 并且在集群内部任意一个节点上访问创建的pod,网络都是互通的。
ReplicationController(RC)
RC用来维护pod的数量,保证其在任意时刻都符合我们设定的预期值
通过RC实现了集群中pod的高可用,减少了手工运维工作。
have a try
一个示例yaml文件
apiVersion: v1
kind: ReplicationController # kind类型选择为 ReplicationController
metadata:
name: nginx
spec:
replicas: 3 # 指定副本数为 3
selector: # 表示需要管理的pod的label,对应上面命名的 nginx
app: nginx
template: # template表示创建 Pod的模板,用来定义Pod的相关信息
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
使用该yaml文件,将会创建三个pod。并且每一个pod都拥有一个app:nginx的label,同时每个Pod中都运行了一个nginx容器。当其中一个pod无法正常运行,Controller Manager能够及时发现并根据RC的定义,去创建一个新的Pod。
也可以在Pod正在运行的时候对Pod进行扩缩容
kubectl scale rc nginx --replicas=7
# 查看 rc
kubectl get rc
# 删除一个pod,验证rc功能
kubectl delete pods podName
ReplicationSet(RS)
随着版本的更替,RC升级为另外一个概念:Replica Set。RS和RC的区别在于,RS支持基于集合的Label Selector。功能更为强大。
简单示例
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
matchLabels:
tier: frontend
matchExpressions:
- {key:tier,operator: In,values: [frontend]}
template:
...
值得注意的是,一般不单独使用ES。而是使用更高的资源对象Deployment,从而形成一整套Pod的操作流程和编排机制。无需担心各种机制间的兼容问题。
Deployment
Deployment相对RS和RC来说是更高等级的资源类型。我们可以随时知道当前Pod的“部署”进度。
yaml示例
apiVersion: apps/v1
kind: Deployment # 资源类型 Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 指定副本集数量
selector:
matchLabels:
app: nginx
template: # 创建pod模版
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
# 查看 deployment
kubectl get deployment -o wide
# 更新镜像版本
kubectl set image deployment nginx-deployment nginx=nginx:1.9.1
Namespace
在kubernetes中,Pod属于不同的Namespace。Namespace是一个逻辑上的概念。在创建Pod的时候可以给Pod指定Namespace
Kubernetes中有着默认的Namespace,名字为default。
# 获取 default 下的pods
kubectl get pods
# 获取指定Namespace下的 pods
kubectl get pods -n NamespaceName
# 获取所有的 Namespace
kubectl get ns
创建Namespace
apiVersion: v1
kind: Namespace
metadata:
name: mns
创建一个资源,指定在 mns 下
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: mns
......