1. 搭建集群
在掌握了Docker的知识后,来尝试下Kubernetes(以下简称k8s)
新手就老老实实看官网的Guide,一步步往下走。
请自备梯子科学上网。
官网推荐我们使用 Google Cloud Platform 来完成集群的搭建,免费使用2个月,送300刀使用券,很良心,而且实际使用发现从DockerHub上下镜像非常快,所以这次我们就用它了,虽然和搭在本地或者阿里云上有些区别,但使用上几乎一样的。
博客里不会跟着官方文档一模一样来,不然就变翻译了,调几个重点操作写写,英语不好的同学多找谷歌翻译吧~
三下五除二搞定了以后,简单建了一个3节点的集群(2核4G * 3)
然后在本地安装 Google Cloud SDK ,这样就可以在本地使用kubectl来操作节点了,按提示登录后,完成和集群的连接。另外 Google Cloud Platform 会自动帮你安装好dashboard, 但是我们还是会以命令行的形式完成各种操作。
2. 创建和管理应用
使用命令行直接创建
使用kubectl run
创建应用,用nginx镜像,创建名为my-nginx的应用,pod数量为2,service类型为LoadBalancer
kubectl run my-nginx --image=nginx --replicas=2 --port=80 --expose --service-overrides='{ "spec": { "type": "LoadBalancer" } }'
service "my-nginx" created
deployment "my-nginx" created
可以看到,此处新建的有2种东西,一种是deployment,一种是service
deployment就是我们的nginx应用,由pod为单位管理,service是管理这些pods的服务,用于暴露地址等等
使用kubectl get po
查看pod实例
NAME READY STATUS RESTARTS AGE
my-nginx-3800858182-htu37 0/1 ContainerCreating 0 8s
my-nginx-3800858182-uh43b 0/1 ContainerCreating 0 8s
一开始在进行镜像的下载、启动,显示容器创建中
AME READY STATUS RESTARTS AGE
my-nginx-3800858182-htu37 1/1 Running 0 30s
my-nginx-3800858182-uh43b 1/1 Running 0 30s
一会儿就能看到容器都跑起来了
使用kubectl get service/my-nginx
查看服务信息
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx 10.115.247.159 104.199.156.246 80/TCP 5m
通过这个暴露出来的EXTERNAL-IP就能访问到nginx了
通过kubectl delete deployment,service my-nginx
删除名为nginx的deployment和service。
使用yaml配置文件创建
建一个run-my-nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
kind为Deployment指定类型,replicas是副本数量,template就是创建的模板了,容器都会以下面的定义来创建,具体有哪些东西可以看Deployment API object.
运行kubectl create -f ./run-my-nginx.yaml
,看到
deployment "my-nginx" created
service呢?,很明显,还要写一个kind为services的yams去创建它,官网把这部分内容放在了后面,这里讲的是label的作用
看到配置文件中的labels的值是run: my-nginx
$ kubectl get pods -L run
NAME READY STATUS RESTARTS AGE RUN
my-nginx-3800858182-1v53o 1/1 Running 0 46s my-nginx
my-nginx-3800858182-2ds1q 1/1 Running 0 46s my-nginx
-L指定了标签run,那么labels不是run:xxx的,就不会显示了。可以使用selector来筛选不同的development,services,筛选都是根据定义的labels来的,所在定义labels的时候,要尽量完善
关于Deployment和Replication Controller
现在国内买到的书讲的一般都是写个yaml,通过Replication Controller去创建应用。Development是一个新的概念,和Replication Controller有什么区别?官网文档的Replication Controller部分也没讲,我感觉好像差不多,于是google了一下,在StackOverFlow上我找到了这么一段回答:
Deployments are a newer and higher level concept than Replication Controllers. They manage the deployment of Replica Sets (also a newer concept, but pretty much equivalent to Replication Controllers), and allow for easy updating of a Replica Set as well as the ability to roll back to a previous deployment.
总而言之就是Development更加牛逼功能更加强大了,用它就是了
创建service
写一个nginx-services的yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
然后同样的,使用kubectl create -f
来使用就行了,创建出service,这里service的type是LoadBalancer,负载均衡器。
可以把Service和Development写在同一个yams中(并且官方也推荐这么做),这样可以把Service和Development一起创建出来。
要删除时,可以用delete development/service +name来删除,也可以delete -f +filename删除,还可以后面跟selector,根据labels来删除,十分灵活。
调节应用规模
development的说明中写道它能根据replicas的设定自动管理容器的数量,少了就加,多了就删。replicas在初始设定完后,通过下面的方式修改:
$ kubectl scale deployment/my-nginx --replicas=1
deployment "my-nginx" scaled
这样就调节成1个了
通过autoscale,可以设定自动的调节,比如最小1个最大3个
$ kubectl autoscale deployment/my-nginx --min=1 --max=3
deployment "my-nginx" autoscaled
我一敲,再看pod,就只剩1个了,因为根本没有流量在访问,所以砍成一个是很自然的事情,关于自动调节的细节,还是看官网文档吧
更新应用
前面写yaml的时候,apiVersion写的是v1表示第1个版本,如果现在v2出来了,要用v2,是不是要把vi删掉建v2呢?如果是话k8s也太不智能了。
使用kubectl apply -f
选择新版本的文件,k8s会自动对比运行中版本、老版本、新版本之间的区别,自动更新应用。
$ kubectl apply -f nginx-app-v2.yaml
deployment "my-nginx" configured
官网文档建议,一开始新建的时候使用kubectl apply
或kubectl create --save-config
,可以更好的支持apply的使用,因为会保留下原始的配置数据。