3.k8s常用的资源
3.1 创建pod资源
k8s yaml的主要组成
apiVersion: v1 api版本
kind: pod 资源类型
metadata: 属性
spec: 详细
上传nginx镜像文件,并且上传私有仓库里面
k8s_pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: web
spec:containers:- name: nginximage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80
指定文件创建pod
#指定文件创建pod
kubectl create -f k8s_pod.yaml
#查看pod类型的nginx服务运行状态
kubectl get pod nginx -o wide
#pod类型的nginx服务的详细信息
kubectl describe pod nginx
可以看到nodeIP地址和一个容器IP地址,从本地私有仓库pull的镜像文件
nginx详细信息
下图可以看到容器ID与上图nginx服务信息显示一致,创建并启动容器
注释:启动一个pod下图会起两个容器,
下图可以看到pod容器有IP地址,nginx容器没有IP地址
docker inspect 8405c6ebc78a |tail -20
nginx容器详细信息
docker inspect 731c1535d85e |tail -20
nginx没有IP地址,是因为网络类型为Container:一个容器与另一个运行中的容器共享网络,也就是nginx容器共享pod容器网络;
注释:使用pod也就是为了实现k8s的核心功能,单单考简单的容器无法实现k8s核心功能。
一个pod资源:至少由两个容器组成,pod基础容器和业务容器组成
举例子:pod配置文件2,一个pod资源多个业务容器:
apiVersion: v1
kind: Pod
metadata:name: testlabels:app: web
spec:containers:- name: nginximage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80- name: busyboximage: 192.168.111.11:5000/busybox:latestcommand: ["sleep","10000"]
创建一个pod两个业务容器
在192.168.111.13的宿主机上可以看到3个容器,两个业务容器公用pod容器网络,也就是3个容器使用一个IP地址;
业务容器端口分配方式:端口谁先占谁先得。
pod是k8s最小的资源单位
3.2 ReplicationController资源
rc:保证指定数量的pod始终存活,rc通过标签选择器(selector)来关联pod
rc即:ReplicationController:副本控制器:功能就是起多个相同的pod,而且保证pod数量,多了就删除,少了就增加
k8s资源的常见操作:
#指定文件创建yaml
kubectl create -f xxx.yaml
#查看pod和rc资源列表
kubectl get pod|rc
#查看pod类型nginx服务的详情信息
kubectl describe pod nginx
#删除pod资源nginx服务
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml
#编辑修改资源配置文件
kubectl edit pod nginx
创建一个rc
apiVersion: v1
kind: ReplicationController
metadata:name: nginx
spec:replicas: 5 #自动创建pod,为5个podselector: #标签选择器,根据pod标签识别,哪些pod是我的,如果多了,我就要干掉年轻的app: mywebtemplate: #给pod定义模板,便于创建podmetadata: #从改行以下就是pod配置文件一致的,多个pod不能设置一样的name,随机生产labels: #标签,与rc标签选择器一致,否侧该pod不属于rcapp: mywebspec:containers:- name: mywebimage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80
查看同一瞬间起一个rc和5个pod,并且分配宿主机均衡,
rc的名字为nginx,5个pod都是根据rc的名字后面接随机组成的名字
测试删除一个pod,rc会自动有创建出一个pod
测试删除一个node192.168.111.13节点,rc会将pod转移到12上自动创建pod,始终保持5个pod,就是这么倔
将删除的node节点添加回来,在支节点node13上重启服务
systemctl restart kubelet.service
master节点11会自动纳管node13
标签选择器作用测试,始终保持5个pod
注释:rc创建5个pod的标签是myweb;则单独一个pod:nginx的标签为web
手动编辑nginx的标签,与rc标签一致
上下对比查看,rc保持5个pod,优先删除年龄小的3s的pod,删除一个资历浅的
rc的滚动升级
查看当前nginx版本为nginx.1.13
拷贝rc配置文件
新建一个k8s_rc2.yaml并且编辑内容,进行与之前的进行对比
升级
#rolling-update:滚动升级
#nginx:表示rc的名字为nginx
#--update-period:表示更新周期,我这里设置了10s升级一次
kubectl rolling-update nginx -f k8s_rc2.yaml --update-period=10s
如下图所示:首先会创建一个nginx2的rc升级pod从0到5,降级nginx的rc从5到0,最后nginx2升级成功,删除旧得rc的nginx
同时查看pod之间间隔时间为10s,并且每个pod的名字为nginx2****
在查看nginx的版本为nginx1.15,升级成功
回滚,就是将升级的步骤反过就可以,指定旧版本的yaml文件即可
kubectl rolling-update nginx2 -f k8s_rc.yaml --update-period=1s
回滚完成
回滚时间
查看nginx版本为1.13,回滚成功
3.3 service资源
service帮助pod暴露端口
cluster实现负载均衡的功能(轮询,rr策略),如果pod存活,cluster会自动将pod加入到vip里面;
每个nodeip端口都会映射到VIP上面
创建一个service
apiVersion: v1
kind: Service
metadata:name: myweb
spec:type: NodePort #端口映射类型ports:- port: 80 #clusterIP端口nodePort: 30000 #node port,如果删除该行定义,则会起随机端口targetPort: 80 #pod portselector: #标签选择器:关联podapp: myweb
创建svc
kubectl create -f nginx_svc.yaml
可以看到标签、端口映射、VIP
关联的pod
浏览器访问node节点IP地址加30000端口即可,出现nginx
修改nodePort范围扩大
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-50000"
systemctl restart kube-apiserver.service
service默认使用iptables来实现负载均衡, k8s 1.8新版本中推荐使用lvs(四层负载均衡)
3.4 deployment资源
有rc在滚动升级之后,会造成服务访问中断(就是标签不一致导致的),于是k8s引入了deployment资源
创建deployment
apiVersion: extensions/v1beta1 #扩展的
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: 192.168.111.11:5000/nginx:1.13ports:- containerPort: 80resources: #资源,该配置可加可不加limits: #最多能使用多少cpu: 100mrequests: #这个pod需要多少资源cpu: 100m
创建deploy.yaml文件,rs的标签:app=nginx,pod-template-hash=642398064与rc的标签不一样
deployment,先启动一个rs资源,rs控制pod的数量;
rs 90%的功能和rc一样,甚至比rc更强;
在根据deploy.yaml文件创建一个svc;
注意:nodePort不能和其他的svc端口发生冲突;selector标签选择器要和上面的deploy中pod的nginx一致;
apiVersion: v1
kind: Service
metadata:name: mynginx
spec:type: NodePort ports:- port: 80 nodePort: 3000targetPort: 80selector:app: nginx
创建svc与rs一致的标签,node端口3000,curl node的IP:3000请求信息为200状态码
deployment升级和回滚
编辑修改deployment配置文件,进行升级NG
kubectl edit deployment
由原来的nginx:1.13改为nginx:1.15,保存即可
会重新启一个rs,nginx版本为15,又新启动3个pod,访问NG服务版本为15
回滚历史版本
查看历史版本
kubectl rollout history deployment
回滚上一个版本,可以看到NG版本回到了13版本
kubectl rollout undo deployment
由原来的1版本变成了3版本
回滚到指定的版本
kubectl rollout undo deployment --to-revision=2
历史版本查看,有一点不好的地方就是change一直为空,不美观
命令行创建deployment
#--record:表示记录历史变化
kubectl run nginx --image=192.168.111.11:5000/nginx:1.13 --replicas=3 --record
历史变化会记录
命令行升级到指定的版本
kubectl set image deploy nginx nginx=192.168.111.11:5000/nginx:1.15
上面的nginx=192.168.111.11:5000/nginx:1.15;就是指定容器的名字nginx
因为一个pod里面可能存在多个业务的容器,每个容器的业务版本也不一致,使用的镜像也不一致,所以要指定容器
举例子说明
常用操作命令如下:
#命令行升级版本
kubectl set image deploy nginx nginx=192.168.111.11:5000/nginx:1.15
#查看deployment所有历史版本
kubectl rollout history deployment nginx
#deployment回滚到上一个版本
kubectl rollout undo deployment nginx
#deployment回滚到指定版本
kubectl rollout undo deployment nginx --to-revision=2
3.5 tomcat+mysql测试
在k8s中容器之间相互访问,通过VIP地址!保证不管pod或者node死掉了,都可以互相通信
先创建mysql-rc.yaml文件,启动pod
apiVersion: v1
kind: ReplicationController
metadata:name: mysql
spec:replicas: 1selector:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: 192.168.111.11:5000/mysql:5.7ports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: '123456'
在创建mysql-svc.yaml文件,为pod添加一个clusterIP关联pod
apiVersion: v1
kind: Service
metadata:name: mysql
spec: #详细下面没有指定类型,默认就是clusterIP类型ports:- port: 3306targetPort: 3306selector:app: mysql
创建mysql-svc.yaml之后过去clusterIP,然后将该IP地址添加到tomcat-rc.yaml配置文件中,让pod通过VIP地址找mysql数据库
创建tomcat-rc.yaml文件,启动pod
apiVersion: v1
kind: ReplicationController
metadata:name: myweb
spec:replicas: 1selector:app: mywebtemplate:metadata:labels:app: mywebspec:containers:- name: mywebimage: 192.168.111.11:5000/tomcat-app:v2ports:- containerPort: 8080env:- name: MYSQL_SERVICE_HOSTvalue: 'mysql' #该值要添加mysql的svc的clusterIP地址,可以查看,在添加- name: MYSQL_SERVICE_PORTvalue: '3306'
创建tomcat-svc.yaml文件,为pod添加一个clusterIP关联pod
apiVersion: v1
kind: Service
metadata:name: myweb
spec:type: NodePortports:- port: 8080nodePort: 30008selector:app: myweb
创建完成,查看状态
浏览器访问nodeip地址http://192.168.111.12:30008/
在访问一下http://192.168.111.12:30008/demo/
这是要连接数据库的,也可以提交数据
点击啊上图的Add,添加名字和等级,随意添加然后提交即可
信息添加到数据库成功
去系统数据库中查看提交的数据,进数据库中的操作命令和docker命令几乎一样
可以看到数据库中的数据和提交的一样