运维开发网

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

运维开发网 https://www.qedev.com 2021-02-22 09:16 出处:51CTO 作者:Tom王
(1)kubectl客户端程序(1.1)kubectl是APIServer的客户端程序,这个客户端程序是通过连接Master节点上的APIServer这一个对应的应用程序,这也是整个K8S集群的唯一管理入口,而kubectl就是这个管理入口的管理工具,它能够连接至APIServer上实现各种K8S相关资源的增删改查等基本操作。在K8S之上所可以被管理的对象有很多个,例如pod、service、re

(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查看到该命令的所有用法。

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

taint:给节点增加污点,增加污点的主要作用是能容忍这个污点的Pod就可以调度上来,否则就不能调度上来,其实我们的master上就有很多污点,默认创建的所有Pod都无法容忍master的所有污点,这样就确保了master只运行API Server,Scheduler,Controller-Manager和etcd等几个重要的系统级资源。

describe:用于描述一个资源的详细信息,我们可以查看一个节点的标签、注解、创建时间、污点等信息,以及查看CPU使用多少,内存占用率多少等。

# kubectl describe node node01.example.com

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

annotate:注解,给一个资源添加其他的键值数据,与label不同的地方在于,annotate比较简单,长度不受限制可打上任何的键值数据,但是label有长度限制

(1.2)如果我们想查看版本以及集群信息可以使用如下的查看方式

# kubectl cluster-info

查看整个集群的信息

# kubectl version

查看kubectl和API Server各自使用的版本

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

(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并设置为干跑模式

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

# 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详细的运行信息

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

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

# curl 10.244.3.4

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

# kubectl delete pods nginx-deploy

如果不需要了可以把创建的Pod删除掉

(1.4)然后我们再创建一个由deployment生成的Pod资源

# vim nginx-deployment.yaml

创建一个nginx-deployment.yaml的文件

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

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了

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

# kubectl get deployment

查看当前的系统上创建的deployment的信息

# kubectl get pods

显示更多节点的信息

# kubectl get pods -o wide

显示更多节点的详细信息

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

此时我们如果将系统中其中一个Pod删除掉,由于系统发现自己定义了2个Pod,现在少了一个,所以它会自动创建一个新的Pod出来。

# kubectl delete pods nginx-deploy-6b75f4cbdd-5thvm

将其中的一个Pod删除掉

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

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

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

# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP

我们设置nginx-deploy的Pod创建成名为nginx,service的端口为80,pod端口为80,服务使用TCP,然后暴露出去

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

# kubectl get svc

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

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

# kubectl get svc -n kube-system

我们一般不会直接访问coredns的IP地址,因为coredns自身也有服务名,用此查询到service的IP地址

# dig -t A nginx @10.96.0.10

查询10.96.0.10此IP地址的解析记录

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

(1.5.2)我们创建一个Pod客户端来尝试访问一下

# kubectl run client --image=busybox --replicas=1 -it --restart=Never

创建一个客户端Pod,其中镜像使用busybox,replicas的个数为1,使用交互式的方式连入,不需要重启

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

# kubectl get pods

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

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

# 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上去了

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

# dig -t A default.svc.cluster.local @10.96.0.10

正常情况我们使用这个命令是可以解析出来的IP地址和wget nginx解析的地址一致10.107.86.212

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

(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个

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

# kubectl delete pods nginx-deploy-6b75f4cbdd-sqmsj

将nginx的Pod删除掉,我们发现系统又自动创建了一个nginx

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

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

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

# kubectl describe svc nginx

显示service为nginx的详细描述信息

# kubectl get pods --show-labels

显示pods的时候顺便把标签一起显示出来

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

(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的资源删除掉

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

# kubectl expose deployment nginx-deploy --name=nginx

重新创建一个svc的资源且名为nginx

# kubectl get svc

此时我们发现CLUSTER-IP的值已经从10.107.86.212变成了10.104.211.207了

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

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

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

(2.2)不光是service,我们知道控制器也是通过标签选择器来关联到Pod资源上的。

# kubectl describe deployment nginx-deploy

我们查看deployment控制器的描述信息

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

# sudo docker login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com

登录镜像仓库

# sudo docker pull registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1

拉取我们创建的一个镜像

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

# 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资源

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

# kubectl get deployment

查看deployment控制器创建的情况

# kubectl delete deployment nginx-deployment

如果有多余的控制器我们可以把删除掉

# kubectl get pods -o wide

查看pods资源的详细信息

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

# kubectl run client --image=busybox --replicas=1 -it --restart=Never

创建一个client交互式的客户端进行访问测试

# wget -O - -q 10.244.2.20

我们在client的pod中访问是可以正常的访问到busybox的页面的

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

而pod一旦被我们删除了,少了或者多了访问的IP都会发生变化,所以我们应该给它提供一个固定访问端点,我们给myapp创建一个service。

# kubectl expose deployment myapp --name=myapp --port=80

给myapp创建一个service,暴露80端口,提供固定的访问端点

# kubectl get svc

查看service的创建信息

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

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

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

# kubectl scale --replicas=5 deployment myapp

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

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

# 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的信息

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

# while true; do wget -O - -q myapp; sleep 1 ;done

我们在client的pod中进行循环访问发现版本由v0.2-1升级到v0.2-2版本后出现了变化

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

# kubectl rollout status deployment myapp

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

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

# kubectl describe pods myapp-64ff7b487b-5b5mp

可以查询当前镜像的版本信息

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

如果镜像的版本有问题我们还可以做回滚操作,K8S未来进行扩容或者缩容不需要再手动添加服务器的操作了,只需要执行简单的命令即可完成。

# kubectl rollout undo deployment myapp

将镜像回退到上一个版本(回滚)

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

注意:删除运行容器的步骤:

# docker container ls

首先查询运行容器的ID值

# docker stop bf7ee1a97d03

然后用容器的ID值停止容器运行

# docker container rm bf7ee1a97d03

最后用容器的ID值删除容器

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

# iptables -vnL -t nat

使用此命令可以查看K8S系统创建的所有iptables规则

(2.4)如果我们想在集群外访问我们创建的myapp,可以用kubectl edit修改myapp的service类型。

# kubectl edit svc myapp

编辑myapp的svc信息

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

# kubectl get svc

重新查看svc信息

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

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

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

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

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号