Pod
在Docker中我们可以通过docker run去运行一个container,但是在Kubernetes的环境中,Pod使最小维护单元,container是运行在Pod中的。我们可以通过YAML文件定义一个Pod:
- 创建一个pod的yaml文件,名称为nginx_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 -f nginx_pod.yaml
3. 查看pod
01. kubectl get pods
02. kubectl get pods -o wide
03. kubectl describe pod nginx-pod
4. 访问nginx容器
5. 删除Pod
kubectl delete -f nginx_pod.yaml # 只能通过yaml文件删除
kubectl get pods
Controller
Pod是Kubertenes体系中最小运行单元,如果我们想把Pod由一个变成两个,两个变成三个,并且我的服务想一直保持在三个Pod的话,该怎样保持、如果维护这个Pod呢?
Kubertenes中是通过Controller来进行维护Pod的。官网
:https://kubernetes.io/docs/concepts/workloads/controllers/
Kubertenes中Controller有几种,比较常用的ReplicationController、ReplicaSet和deployment都可以用来维护Pod。DaemonSet和StatefulSet也可以维护Pod,但并不常用。
ReplicationController
官网
:https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/
ReplicationController定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,所以ReplicationController的定义包含以下几个部分:
- Pod期待的副本数(replicas)
- 用于筛选目标Pod的Label Selector
- 当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板(template)
也就是说通过Replication Controller实现了集群中Pod的高可用,减少了传统IT环境中手工运维的工作。
- 创建nginx_replication.yaml文件
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kind:表示要新建对象的类型
spec.selector:表示需要管理的Pod的label,这里表示包含app: nginx的label的Pod都会被该RC管理
spec.replicas:表示受此RC管理的Pod需要运行的副本数
spec.template:表示用于定义Pod的模板,比如Pod名称、拥有的label以及Pod中运行的应用等。
通过改变RC里Pod模板中的镜像版本,可以实现Pod的升级功能
- 根据nginx_replication.yaml创建pod
- 查看pod
我们可以看到一共3个pod,一个运行在worker01节点上,两个运行在worker02节点上。 - 删除worker02节点上的nginx-tj88k这个pod
- 然后再次查看pod
我们可以看到worker02节点上的nginx-tj88k已经被删除,但是Kubernetes在worker01节点上又重新创建了一个新的pod。 - 对pod进行扩缩容
kubectl scale rc nginx --replicas=5
再次查看pod的时候,我们发现已经变成了5个pod。
7. 删除pod
ReplicaSet(RS)
官网
:https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
在Kubernetes v1.2时,RC就升级成了另外一个概念:Replica Set,官方解释为“下一代RC”
ReplicaSet和RC没有本质的区别,kubectl中绝大部分作用于RC的命令同样适用于RS
RS与RC唯一的区别是:RS支持基于集合的Label Selector(Set-based selector),而RC只支持基于等式的Label Selector(equality-based selector),这使得Replica Set的功能更强
ReplicaSet的yaml模板:
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
matchLabels:
tier: frontend
matchExpressions:
- {key:tier,operator: In,values: [frontend]}
template:
...
注意
:一般情况下,我们很少单独使用Replica Set,它主要是被Deployment这个更高的资源对象所使用,从而形成一整套Pod创建、删除、更新的编排机制。当我们使用Deployment时,无须关心它是如何创建和维护Replica Set的,这一切都是自动发生的。同时,无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。
Deployment
官网
:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
Deployment相对RC最大的一个升级就是我们可以随时知道当前Pod“部署”的进度。
创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程
检查Deploymnet的状态来看部署动作是否完成(Pod副本的数量是否达到预期的值)
- 创建nginx_deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
- 根据nginx_deployment.yaml文件创建pod
- 查看Pods、deployment以及replicaset
- 当前nginx的版本是1.7.9, 我们要更新nginx 的镜像版本到1.9.1
kubectl set image deployment nginx-deployment nginx=nginx:1.9.1
Namespace
查看当前系统中的namespace:
kubectl get namespaces
我们也可以创建一个自己的namespace去做资源的隔离,比如隔离pod、service等
myns-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: myns
在指定namespace下创建资源:
- 创建pod的yaml文件
nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: myns
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
- 通过kubectl创建pod
- 查看默认namespace下的pod,发现找不到我们刚刚创建的pod
- 查看myns命名空间下的Pod和资源
kubectl get pods --all-namespaces #查找所有命名空间下的pod