使用 kubectl 创建 Deployment 篇三

/ K8s / 没有评论 / 3654浏览

202016202759-k8s

使用 kubectl 创建 Deployment

更多kubectl命令用法

目标

Kubernetes Deployments

为了实现在 Kubernetes 集群上部署容器化应用程序。需要创建一个 Kubernetes Deployment,Deployment 负责创建和更新应用。创建 Deployment 后,Kubernetes master 会将 Deployment 创建好的应用实例调度到集群中的各个节点。

应用实例创建完成后,Kubernetes Deployment Controller会持续监视这些实例。如果管理实例的节点被关闭或删除,那么 Deployment Controller 将会替换它们,实现自我修复能力。

“在旧的世界中” ,一般通常安装脚本来启动应用,但是便不会在机器故障后自动恢复。通过在 Node 节点上运行创建好的应用实例,使 Kubernetes Deployment 对应用管理提供了截然不同的方法。

在Kubernetes上部署第一个应用程序

Kubernetes Cluster

使用 Kubernetes Kubectl(命令管理工具)创建和管理 Deployment。Kubectl使用Kubernetes API与集群进行交互。在本学习模块中,学会在Kubernetes集群上运行应用所需Deployment的Kubectl常见命令。

创建Deployment时,需要为应用程序指定容器镜像以及要运行的副本数,后续可以通过Deployment更新来更改该这些信息; bootcamp的第5和第6部分讨论了如何扩展和更新Deployment。

知道Deployment是什么,来看看在线教程并部署你的第一个应用

Hello Minikube

官方参考

目标

准备

创建一个 NodeJs 服务端代码

minikube/server.js 

var http = require('http');

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8980);

配置一个 Dockerfile ,用于构建 docker 镜像

FROM node:6.14.2
EXPOSE 8980
COPY server.js .
CMD node server.js

For more information on the docker build command, read the Docker documentation.

通过 Dockerfile 构建一个 docker 镜像

# 注意当前路径下需要有 Dockerfile 文件,注意后面的点
docker build -t node-app:v0.0.1 .
# 构建成功后输出如下
➜ docker build -t my-node-app:v0.0.1 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM node:6.14.2
 ---> 00165cd5d0c0
Step 2/4 : EXPOSE 8980
 ---> Using cache
 ---> a78665dc1c60
Step 3/4 : COPY server.js .
 ---> 8a7a68b5f3a6
Step 4/4 : CMD node server.js
 ---> Running in bae95f61e18e
Removing intermediate container bae95f61e18e
 ---> 3ad203eefe49
Successfully built 3ad203eefe49
Successfully tagged my-node-app:v0.0.1

Create a Deployment

使用 kubectl create 创建一个 DeploymentDeployment 管理一个 Pod,Pod 里面运行一个 Docker 镜像的容器

# 默认会去外网拉镜像,如果不加参数 --image-pull-policy=Never
kubectl create deployment hello-node --image=my-node-app:v0.0.1 --image-pull-policy=Never
# 返回值
# deployment.apps/hello-node created
# 查看 deployment
kubectl get deployments

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   0/1     1            0           62s
# 查看Pod,发现状态不对,没有拉到镜像,因为镜像在本地
kubectl get pods
NAME                         READY   STATUS         RESTARTS   AGE
hello-node-554b87dc5-5w6wt   0/1     ErrImagePull   0          2m11s

# 删除重建
kubectl delete deployment hello-node
# 重新运行一下
kubectl run hello-node --image=my-node-app:v0.0.1 --image-pull-policy=Never --port=8080 --expose=true
# 发现还是没有成功,就直接把镜像上传到 docker hub 了
kubectl create deployment hello-node --image=zealzhangz/my-node-app:v0.0.1
# 显示容器创建中
➜  ~ kubectl get pods
NAME                         READY   STATUS              RESTARTS   AGE
hello-node-66f488898-mhnfm   0/1     ContainerCreating   0          19s
# 过了一会就好了
➜  ~ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
hello-node-66f488898-mhnfm   1/1     Running   0          2m23s

重新查看一遍 deployment

# View the Deployment:
$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           4m6s
# View the Pod:
$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
hello-node-66f488898-mhnfm   1/1     Running   0          5m43s
# View cluster events:
kubectl get events
# View the kubectl configuration:
kubectl config view

结果:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/aozhang/.minikube/ca.crt
    server: https://192.168.39.14:8443
  name: test
contexts:
- context:
    cluster: test
    user: test
  name: test
current-context: test
kind: Config
preferences: {}
users:
- name: test
  user:
    client-certificate: /home/aozhang/.minikube/client.crt
    client-key: /home/aozhang/.minikube/client.key

Create a Service

Pod 启动起来后,并没有对外暴露服务,因为我们一 Kubenetes Service 的形式来对外暴露服务; service是一组相同逻辑的pods和一个访问它们的策略。一组pods通常由label选择器确定。可以在ServiceSpec 中指定类型以不同的方式暴露服务。

  1. 使用 kubectl expose 对外暴露服务
kubectl expose deployment hello-node --type=LoadBalancer --port=8980

--type=LoadBalancer 参数表明你想对外网暴露你的集群服务

  1. 查看当前暴露的服务:
kubectl get services

输出

NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.104.209.147   <pending>     8980:32740/TCP   3m1s
kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP          18h

这样就 expose 了一个服务,就可以外部访问了。可以通过一下指令得到 url

# 这里需要加上集群参数,-p zzz-cluster 否则会访问默认的集群 minikube,然后不存在该集群,一直报错
$ minikube service hello-node --url -p zzz-cluster

扩容和更新

根据线上需求,扩容和缩容是常会遇到的问题。Scaling 是通过更改 Deployment 中的副本数量实现的。一旦您有应用程序的多个实例,您将能够滚动更新,而不会停止服务。通过 kubectl scale 指令来扩容和缩容

kubectl get pods -L app --show-labels
# 输出如下
NAME                         READY   STATUS    RESTARTS   AGE     APP          LABELS
hello-node-66f488898-mbwmm   1/1     Running   2          3h22m   hello-node   app=hello-node,pod-template-hash=66f488898
# 调查可知,扩充pods数一般就扩充 deployment
kubectl scale --replicas=2 deployment/hello-node

再查看当前pods:

NAME                         READY   STATUS    RESTARTS   AGE
hello-node-66f488898-22nrh   1/1     Running   0          68s
hello-node-66f488898-mbwmm   1/1     Running   2          3h43m

官方扩展的资源示例如下:

# Scale a replicaset named 'foo' to 3.
kubectl scale --replicas=3 rs/foo

# Scale a resource identified by type and name specified in "foo.yaml" to 3.
kubectl scale --replicas=3 -f foo.yaml

# If the deployment named mysql's current size is 2, scale mysql to 3.
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

# Scale multiple replication controllers.
kubectl scale --replicas=5 rc/foo rc/bar rc/baz

# Scale job named 'cron' to 3.
kubectl scale --replicas=3 job/cron

我们都是期望应用 24/7 运行,但又需要频繁部署。这我们就需要 rolling update (滚动更新)。Rolling updates 允许通过使用新的 Pods 实例逐个更新来实现零停机的部署更新。新的 Pods 会被调度到可用资源的 Node 节点上。可以通过 set image 修改镜像。

$ kubectl set image deployments/<部署名> <部署名>=镜像名:tag

如我们的第二版镜像。

kubectl set image deployments/docker-demo docker-demo=dennisge/docker_demo:v2

重新设置镜像之后,就会执行滚动更新。 以上我们就成功部署了自己的应用。但是都是通过指令来进行的,下面我们将介绍一下部署 kubernetes dashboard,并通过 web ui的方式部署、删除和修改相关应用等。