您的位置:首页 > 其它

【一点一滴,成材之基!】kubernetes应用快速入门

2021-02-21 00:25 141 查看

(1)kubectl客户端程序
(1.1)kubectl是API Server的客户端程序,这个客户端程序是通过连接Master节点上的API Server这一个对应的应用程序,这也是整个K8S集群的唯一管理入口,而kubectl就是这个管理入口的管理工具,它能够连接至API Server上实现各种K8S相关资源的增删改查等基本操作。在K8S之上所可以被管理的对象有很多个,例如pod、service、replicaset、deployment、StatefulSet、daemonset、job、cronjob、node等对象。我们可以在命令行输入kubectl查看到该命令的所有用法。

taint:给节点增加污点,增加污点的主要作用是能容忍这个污点的Pod就可以调度上来,否则就不能调度上来,其实我们的master上就有很多污点,默认创建的所有Pod都无法容忍master的所有污点,这样就确保了master只运行API Server,Scheduler,Controller-Manager和etcd等几个重要的系统级资源。
describe:用于描述一个资源的详细信息,我们可以查看一个节点的标签、注解、创建时间、污点等信息,以及查看CPU使用多少,内存占用率多少等。
# kubectl describe node node01.example.com

annotate:注解,给一个资源添加其他的键值数据,与label不同的地方在于,annotate比较简单,长度不受限制可打上任何的键值数据,但是label有长度限制
(1.2)如果我们想查看版本以及集群信息可以使用如下的查看方式
# kubectl cluster-info
查看整个集群的信息
# kubectl version
查看kubectl和API Server各自使用的版本

(1.3)K8S上最小调度的原子单元是Pod,首先我们在K8S集群上创建一个nginx服务。
# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
运行一个名为nginx-deploy,使用的镜像是nginx:1.14-alpine,使用80端口暴露,创建1个Pod并设置为干跑模式

# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
运行一个名为nginx-deploy,使用的镜像是nginx:1.14-alpine,使用80端口暴露,创建1个Pod并真实的运行
# kubectl get pods -o wide
查询节点Pod详细的运行信息

此时我们在node01节点上访问创建的nginx的服务地址10.244.3.4,发现是可以正常的访问的。但是这个地址是集群的节点地址,只能在K8S的节点内部上使用,跳过K8S之外是无法访问的。
# curl 10.244.3.4

# kubectl delete pods nginx-deploy
如果不需要了可以把创建的Pod删除掉
(1.4)然后我们再创建一个由deployment生成的Pod资源
# vim nginx-deployment.yaml
创建一个nginx-deployment.yaml的文件

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: nginx
spec:
# 创建2个nginx容器
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14-alpine
ports:
- containerPort: 80
kubectl apply -f nginx-deployment.yaml
使用kubectl apply将创建的yaml文件进行生效应用,我们发现系统已经生成了2个随机的Pod了

# kubectl get deployment
查看当前的系统上创建的deployment的信息
# kubectl get pods
显示更多节点的信息
# kubectl get pods -o wide
显示更多节点的详细信息

此时我们如果将系统中其中一个Pod删除掉,由于系统发现自己定义了2个Pod,现在少了一个,所以它会自动创建一个新的Pod出来。
# kubectl delete pods nginx-deploy-6b75f4cbdd-5thvm
将其中的一个Pod删除掉

(1.5.1)我们应该给Pod一个固定端点,这样我们客户端访问的时候只需要访问它的固定端点即可,而固定端点是由service提供,创建service则需要使用kubectl expose命令,Pod的端口port和service的端口Port默认应该是一样的,当然也可以不一样,expose暴露的端口是service的端口,而target指的是Pod的端口。

# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
我们设置nginx-deploy的Pod创建成名为nginx,service的端口为80,pod端口为80,服务使用TCP,然后暴露出去

# kubectl get svc
此时我们创建了一个service并且使用的IP地址为10.107.86.212,且一般是被Pod客户端所访问的,如果我们在Pod节点上执行curl 10.107.86.212也是可以访问的

# kubectl get svc -n kube-system
我们一般不会直接访问coredns的IP地址,因为coredns自身也有服务名,用此查询到service的IP地址
# dig -t A nginx @10.96.0.10
查询10.96.0.10此IP地址的解析记录

(1.5.2)我们创建一个Pod客户端来尝试访问一下
# kubectl run client --image=busybox --replicas=1 -it --restart=Never
创建一个客户端Pod,其中镜像使用busybox,replicas的个数为1,使用交互式的方式连入,不需要重启

# kubectl get pods
此时我们发现一个client客户端已经创建完毕了

# cat /etc/resolv.conf
我们在master服务器上创建的client的pod里执行查看配置的DNS信息,使用的域名具体信息
# wget nginx
我们在master服务器上创建的client的pod里执行连接nginx页面可以获取到解析的IP地址信息为10.107.86.212
# wget -O - -q http://nginx:80/
我们在master服务器上创建的client的pod里执行这个命令时,其实是自动调度到了nginx-deploy-6b75f4cbdd-sqmsj这个pod上去了

# dig -t A default.svc.cluster.local @10.96.0.10
正常情况我们使用这个命令是可以解析出来的IP地址和wget nginx解析的地址一致10.107.86.212

(1.5.3)实验:由于现在我们在master服务器上创建的client的pod里执行这个命令时,其实是自动调度到了nginx-deploy-6b75f4cbdd-sqmsj这个pod上去了,我们现在把这个nginx删除掉,然后我们验证client是否还可以继续访问nginx。
# kubectl get pods -o wide
查询当前运行的Pod的信息
# kubectl scale --replicas=1 deployment nginx-deploy
设置nginx-deploy的数量为1个

# kubectl delete pods nginx-deploy-6b75f4cbdd-sqmsj
将nginx的Pod删除掉,我们发现系统又自动创建了一个nginx

并且在master服务器上创建的client的pod里执行这个命令时,仍然可以自动调度到了nginx-deploy-6b75f4cbdd-crzd5这个pod上去,可以正常的显示nginx网页。这就是通过标签和标签选择器关联Pod资源,而不用基于地址来选择,所以后面无论怎么变化,它只要属于那个deployment,就一律纳入到服务的后端中来,这里我们就体验到service是能够给pod提供固定访问端点的效果。

# kubectl describe svc nginx
显示service为nginx的详细描述信息
# kubectl get pods --show-labels
显示pods的时候顺便把标签一起显示出来

(2)kubernetes平台发布、回滚、扩容、缩容实战
(2.1)我们知道在访问nginx这个名称的时候,一定要解析正确对应到service的IP(10.107.86.212)上,才能够被正确的service的IP映射到正确的Pod的IP(10.244.3.15)上,而我们是可以随时改变这个service的IP地址的(待定)。
# kubectl edit svc nginx
编辑修改nginx的信息
# kubectl get svc
获取到svc的信息
# kubectl delete svc nginx
将service为nginx的资源删除掉

# kubectl expose deployment nginx-deploy --name=nginx
重新创建一个svc的资源且名为nginx
# kubectl get svc
此时我们发现CLUSTER-IP的值已经从10.107.86.212变成了10.104.211.207了

我们发现仍然可以通过svc为10.104.211.207的新IP地址访问到nginx服务

(2.2)不光是service,我们知道控制器也是通过标签选择器来关联到Pod资源上的。
# kubectl describe deployment nginx-deploy
我们查看deployment控制器的描述信息

# sudo docker login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com
登录镜像仓库
# sudo docker pull registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
拉取我们创建的一个镜像

# kubectl run myapp --image=registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1 --replicas=2
使用kubectl创建一个名为myapp的镜像从阿里云的镜像仓库拉取下来(方法1)
# vim myapp-deployment.yaml
编辑一个myapp-deployment.yaml文件然后创建对应的Pod资源(方法2)
# kubectl apply -f myapp-deployment.yaml
使用kubectl apply命令应用并创建Pod资源

# kubectl get deployment
查看deployment控制器创建的情况
# kubectl delete deployment nginx-deployment
如果有多余的控制器我们可以把删除掉
# kubectl get pods -o wide
查看pods资源的详细信息

# kubectl run client --image=busybox --replicas=1 -it --restart=Never
创建一个client交互式的客户端进行访问测试
# wget -O - -q 10.244.2.20
我们在client的pod中访问是可以正常的访问到busybox的页面的

而pod一旦被我们删除了,少了或者多了访问的IP都会发生变化,所以我们应该给它提供一个固定访问端点,我们给myapp创建一个service。
# kubectl expose deployment myapp --name=myapp --port=80
给myapp创建一个service,暴露80端口,提供固定的访问端点
# kubectl get svc
查看service的创建信息

我们在client上使用myapp的域名也可以正常的访问了,并且是对这生成的2个Pod随机调度的。

# kubectl scale --replicas=5 deployment myapp
如果我们需要将Pod扩展到5个或者缩减到3个,可以使用kubectl scale命令

# kubectl get svc
查询系统中的service的信息
# kubectl delete svc myapp
将myapp的service删除掉
# kubectl expose deployment myapp --name=myapp --port=80
重建一个myapp的service
(2.3)如果我们需要对版本进行更新,则可以使用如下的方式升级我们的软件版本。
# sudo docker login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com
登录镜像仓库
# sudo docker pull registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-2
拉取我们创建的一个v0.2-2版本的镜像
# kubectl set image deployment myapp myapp=registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-2
将myapp升级到v0.2-2版本(发布)
# kubectl get pods
查询Pods的信息

# while true; do wget -O - -q myapp; sleep 1 ;done
我们在client的pod中进行循环访问发现版本由v0.2-1升级到v0.2-2版本后出现了变化

# kubectl rollout status deployment myapp
使用kubectl rollout可以显示版本更新的过程,此时我们就可以实现灰度版本发布的目标

# kubectl describe pods myapp-64ff7b487b-5b5mp
可以查询当前镜像的版本信息

如果镜像的版本有问题我们还可以做回滚操作,K8S未来进行扩容或者缩容不需要再手动添加服务器的操作了,只需要执行简单的命令即可完成。
# kubectl rollout undo deployment myapp
将镜像回退到上一个版本(回滚)

注意:删除运行容器的步骤:
# docker container ls
首先查询运行容器的ID值
# docker stop bf7ee1a97d03
然后用容器的ID值停止容器运行
# docker container rm bf7ee1a97d03
最后用容器的ID值删除容器

# iptables -vnL -t nat
使用此命令可以查看K8S系统创建的所有iptables规则
(2.4)如果我们想在集群外访问我们创建的myapp,可以用kubectl edit修改myapp的service类型。
# kubectl edit svc myapp
编辑myapp的svc信息

# kubectl get svc
重新查看svc信息

大功告成!此时我们终于可以在集群外部访问到myapp的信息了。

—————— 本文至此结束,感谢阅读 ——————

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: