使用 kubectl 创建 Deployment
目标
- 了解
Deployments
请求。 - 使用
kubectl
在Kubernetes
上部署应用。
Kubernetes Deployments
为了实现在 Kubernetes
集群上部署容器化应用程序。需要创建一个 Kubernetes Deployment,Deployment
负责创建和更新应用。创建 Deployment
后,Kubernetes master
会将 Deployment
创建好的应用实例调度到集群中的各个节点。
应用实例创建完成后,Kubernetes Deployment Controller
会持续监视这些实例。如果管理实例的节点被关闭或删除,那么 Deployment Controller
将会替换它们,实现自我修复能力。
“在旧的世界中” ,一般通常安装脚本来启动应用,但是便不会在机器故障后自动恢复。通过在 Node 节点上运行创建好的应用实例,使 Kubernetes Deployment
对应用管理提供了截然不同的方法。
在Kubernetes上部署第一个应用程序
使用 Kubernetes Kubectl(命令管理工具)创建和管理 Deployment。Kubectl使用Kubernetes API与集群进行交互。在本学习模块中,学会在Kubernetes集群上运行应用所需Deployment的Kubectl常见命令。
创建Deployment时,需要为应用程序指定容器镜像以及要运行的副本数,后续可以通过Deployment更新来更改该这些信息; bootcamp的第5和第6部分讨论了如何扩展和更新Deployment。
知道Deployment是什么,来看看在线教程并部署你的第一个应用!
Hello Minikube
目标
- Deploy a hello world application to Minikube.
- Run the app
- View application logs.
准备
创建一个 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
创建一个 Deployment
,Deployment
管理一个 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 中指定类型以不同的方式暴露服务。
- Cluster IP(默认): 只有集群内部访问。
- NodePort: 使用NAT方式,在集群中每个选定的节点的同一端口上暴露服务。可以在集群外部访问服务。
- LoadBalancer:创建外部负载均衡。
- ExternalName:使用任意名称显示服务。
- 使用
kubectl expose
对外暴露服务
kubectl expose deployment hello-node --type=LoadBalancer --port=8980
--type=LoadBalancer
参数表明你想对外网暴露你的集群服务
- 查看当前暴露的服务:
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的方式部署、删除和修改相关应用等。
本文由 zealzhangz 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2020/01/06 20:37