1. 搭建集群

在掌握了Docker的知识后,来尝试下Kubernetes(以下简称k8s)

新手就老老实实看官网的Guide,一步步往下走。

官网推荐我们使用 Google Cloud Platform 来完成集群的搭建,免费使用2个月,送300刀使用券,很良心,而且实际使用发现从DockerHub上下镜像非常快,所以这次我们就用它了,虽然和搭在本地或者阿里云上有些区别,但使用上几乎一样的。

博客里不会跟着官方文档一模一样来,不然就变翻译了,调几个重点操作写写,英语不好的同学多找谷歌翻译吧~

三下五除二搞定了以后,简单建了一个3节点的集群(2核4G * 3)

目前Kubernetes的稳定版本_k8s


然后在本地安装 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 applykubectl create --save-config,可以更好的支持apply的使用,因为会保留下原始的配置数据。