本文共 5566 字,大约阅读时间需要 18 分钟。
一、获取资源二、手动部署一个应用 2.1 手动创建一个控制器deployment 2.2 部署一个service 2.3 动态扩缩容Pod副本 2.4 滚动更新 2.5 动态回滚 2.6 配置从集群外部访问myapp
此篇接上一篇 《Kubernetes 学习笔记(一)--- 基本概念及利用kubeadm部署K8S》
命令kubectl
是API Server的客户端程序。 taints
:污点,用于描述节点的污点。Pod调度到某个节点,取决于能够容忍某个节点的污点的最大限度。
kubectl describe node k8s-master.fhw.com
可查看节点的污点(taints) 命令: kubectl get <资源名称>
kubectl get --help
使用 kubectl api-resources
获取支持的资源的完整列表。 以node资源为例:
kubectl get nodes
参数:
获取资源的详细信息:
kubectl describe node k8s-master.fhw.com
获取集群信息:
[root@k8s-master .kube]# kubectl cluster-infoKubernetes master is running at https://192.168.100.135:6443KubeDNS is running at https://192.168.100.135:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
创建一个控制器
[root@k8s-master .kube]# kubectl run nginx-deploy --image=nginx:1.14-alpine --replicas=1 --port=80deployment.apps/nginx-deploy created
参数:
--restart=[Always, OnFailure, Never]
,pod重启策略,Always是pod退出后总是立即重启,Never是pod退出后不再重启。默认是Always--command -- <cmd> <arg1> ... <argN>
,指定在容器中运行的命令;--schedule="0/5 * * * ?"
,创建一个Cron Job控制器。查看deployment列表:
[root@k8s-master .kube]# kubectl get deploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEnginx-deploy 1 1 1 1 11m
控制器创建后,会自动部署Pod:
[root@k8s-master .kube]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODEnginx-deploy-5b595999-54c56 1/1 Running 0 1h 10.244.2.3 k8s-node2.fhw.com
通过pod 的IP访问pod中运行的nginx服务:
curl 10.244.2.3
能够正常访问。
service为pod提供一个固定访问端点。
用法:
Usage: kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name][--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
部署service
[root@k8s-master .kube]# kubectl expose deployment nginx-deploy --port=80 --target-port=80 --protocol=TCP --type=ClusterIPservice/nginx-deploy exposed
deployment
:暴露的资源类型为控制器deployment;nginx-deploy
: deployment的名称--port=80
: service的端口--target-port=80
: Pod的端口--type=""
: service类型有ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'. --ClusterIP
:表示这个service只能在群集内部访问,不能在集群外部访问; --NodePort
:表示可以在集群外部访问到;
获取service列表:
[root@k8s-master .kube]# kubectl get svc -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORkubernetes ClusterIP 10.96.0.1443/TCP 20h nginx ClusterIP 10.106.125.69 80/TCP 8s
通过service IP 访问pod中的nginx服务:
curl 10.106.125.69
可以正常访问。
运行一个客户端Pod,在客户端Pod内部通过service的名称去访问nginx服务。
kubectl run client -it --image=busybox --replicas=1 --restart=Never
如下图,直接通过service的名称nginx,可以正常访问:
service通过label去关联pod:
这时你删除这个关联的pod,控制器会立即启动一个新pod,并且关联至名为nginx这个service。
先创建一个新应用,叫myapp:
[root@k8s-master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2deployment.apps/myapp created[root@k8s-master ~]# [root@k8s-master ~]# kubectl get deployment -wNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEmyapp 2 2 2 2 22snginx-deploy 1 1 1 1 3h[root@k8s-master ~]# [root@k8s-master ~]# [root@k8s-master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODEclient 1/1 Running 0 1h 10.244.2.4 k8s-node2.fhw.commyapp-848b5b879b-fqbkd 1/1 Running 0 42s 10.244.1.6 k8s-node1.fhw.com myapp-848b5b879b-j7lj5 1/1 Running 0 42s 10.244.2.5 k8s-node2.fhw.com nginx-deploy-5b595999-54c56 1/1 Running 0 2h 10.244.2.3 k8s-node2.fhw.com
在第2.2节创建的客户端Pod中通过ip访问新建的应用myapp:
两个Pod中的内容分别对应Pod名称。
为myapp创建一个service。
kubectl expose deployment myapp --name=myapp --port=80
再到客户端Pod中使用service名称myapp去访问:
如图,两个myapp Pod做负载均衡。
将myapp扩容至5个
kubectl scale deployment myapp --replicas=5
这时新增的Pod会立即加入到myapp service中接受请求。
再将myapp缩减至3个
升级myapp镜像的版本。
命令:[root@k8s-master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2deployment.extensions/myapp image updated
查看滚动更新状态
[root@k8s-master ~]# kubectl rollout status deployment myappdeployment "myapp" successfully rolled out
查看滚动更新后的结果
myapp更新过后,pod名称也更新了
查看pod内容器的镜像版本:
kubectl rollout undo deployment myapp
查看回滚结果:
自动扩缩容依赖于监控系统,去监控系统资源使用率,根据系统资源去判断是否需要扩容。这个问题后续再记录。
修改service myapp的类型为NodePort
命令:kubectl edit svc myapp
修改后:
查看service myapp
在集群中每个节点上都会开启一个31679端口(这个端口是随机生成的),映射到K8S集群的myapp service的80端口。可自行在其它节点验证。
提供给集群外部的访问端口为31679。
外部访问地址:http://192.168.100.135:31679 在192.168.100.200这台主机上验证,如图:三个节点均可正常访问。
如果想通过一个固定地址去访问这个myapp,可以利用nginx做反向代理:
此篇结尾:
这一篇笔记只是演示如何通过手动去创建、更新、回滚一个应用。这只是在使用K8S中,最简单但是无法实现其全部功能 、全部定制的一种使用方式。而在真正使用K8S时,基本不会这样去操作。我们使用K8S的常用方式,应该是基于YAML格式的配置文件来定义和创建资源。下一篇学习用YAML配置文件来创建资源。
转载地址:http://xvxkl.baihongyu.com/