本文我们将对Kubernetes的常用运维操作扩容与升级做简单说明。
1.Node的扩容
Node的扩容简单言之就是增加新的Node节点。在节点上安装Kubelet,Kube-proxy及Docker, 并修改参数使其指向Master地址。基于Kuberlet的自动注册机制,新的Node将会自动加入现有的Kubernetes集群中。
2.Pod的动态扩容和缩放
在实际运维过程中,我们常常需要对某个服务动态扩容以满足突增的流量,或者动态减少服务实例节约服务器资源。
下面我们将动态增加redis-slave的pod副本由2个增加为3个。
#kubectl scale rc redis-slave –replicas=3
[[email protected] python]# kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-02x2s 1/1 Running 1 1d
frontend-8xtuj 1/1 Running 1 1d
frontend-ko8b2 1/1 Running 1 1d
redis-master-2v6pp 1/1 Running 1 1d
redis-slave-5k126 1/1 Running 1 1d
redis-slave-9dqti 1/1 Running 1 1d
[[email protected] python]# kubectl scale rc redis-slave --replicas=3 scaled
[[email protected] python]# kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-02x2s 1/1 Running 1 1d
frontend-8xtuj 1/1 Running 1 1d
frontend-ko8b2 1/1 Running 1 1d
redis-master-2v6pp 1/1 Running 1 1d
redis-slave-0d33n 1/1 Running 0 59s
redis-slave-5k126 1/1 Running 1 1d
redis-slave-9dqti 1/1 Running 1 1d
同样的我们也可以减少pod的副本,以下我们将redis-slave由3个副本减为1个。
[[email protected] python]# kubectl scale rc redis-slave --replicas=1 scaled
[[email protected] python]# kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-02x2s 1/1 Running 1 1d
frontend-8xtuj 1/1 Running 1 1d
frontend-ko8b2 1/1 Running 1 1d
redis-master-2v6pp 1/1 Running 1 1d
redis-slave-0d33n 1/1 Running 0 2m
3.应用的滚动升级
在实际运维过程中,如何不停止服务而进行升级将变得越来越常见,Kubernetes提供了Rolling-update的功能来解决上述场景。
我们假设PHP的image有一个新的v2版本,我们需要将现有PHP服务滚动升级为v2。
3.1制作新镜像
简单起见,我们通过docker commit来制作一个新镜像,首先用原镜像启动一个新容器,你可以在容器里修改,然后退出。
[[email protected] python]# docker run -it docker.io/kubeguide/guestbook-php-frontend /bin/bash
[email protected]:/var/www/html# exit
exit
好,现在我们用docker commit来保存刚才我们编辑过的容器,我们把它命名为guestbook-php-frontend:v2
[[email protected] python]# docker commit 68b765a2b8db guestbook-php-frontend:v2
afa8c93501405642879a30d14ddeb087e48d8fb7a7a04dd2ab8f5556fd9db99b
[[email protected] python]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
guestbook-php-frontend v2 afa8c9350140 About a minute ago 509.6 MB
daocloud.io/daocloud/daocloud-toolset latest 01869b5aa54e 3 weeks ago 150.2 MB
docker.io/mysql latest 4b95c7a7999d 4 weeks ago 374 MB
registry.access.redhat.com/rhel7/pod-infrastructure latest 2b96d2bcbc46 6 weeks ago 428 MB
docker.io/kubeguide/guestbook-php-frontend latest 38658844a359 8 months ago 509.6 MB
docker.io/kubeguide/redis-master latest 423e126c2ad4 8 months ago 419.1 MB
docker.io/kubeguide/guestbook-redis-slave latest 00206e07dd92 9 months ago 109.5 MB
我们看到新增加了一个镜像guestbook-php-frontend,tag为v2,接下来我们将通过两种方法来演示滚动升级。
3.2通过配置文件
创建 frontend-controller-v2.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend-v2
labels:
name: frontend
spec:
replicas: 3
selector:
name: frontend-v2
template:
metadata:
labels:
name: frontend-v2
spec:
containers:
- name: php-redis
image: guestbook-php-frontend:v2
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 80
Kubectl的执行过程如下:
[[email protected] kube-guestbook]#kubectl rolling-update frontend -f frontend-controller-v2.yaml
查看pods创建过程, 我们看到新的POD副本从1开始增加,旧的POD副本从3逐步减少,最终旧的POD副本被删除。这样就完成了应用的升级。
3.3通过新版镜像
另一种方法是不使用配置文件,直接用kubectl rolling-update 加上–image参数指定新版镜像名称来滚动升级
kubectl rolling-update frontend –image=guestbook-php-frontend:v2
更新完成,查看RC,我们看到与配置文件不同,Kubectl给rc增加了一个key为”deployment”的label,当然这个名字可以通过–deployment-label-key参数修改。
[[email protected] ~]# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
frontend php-redis guestbook-php-frontend:v2 deployment=cdb7f26e49a90eae43e257284310b1cf,name=frontend 3
如果在更新过程中发现配置错误,可以通过执行kubectl rolling-update –rollback完成回滚
kubectl rolling-update frontend –image=guestbook-php-frontend:v2 –rollback