3.k8s常用的资源

3.1 创建pod资源

k8s yaml的主要组成

apiVersion: v1  api版本
kind: pod   资源类型
metadata:   属性
spec:       详细

上传nginx镜像文件,并且上传私有仓库里面
在这里插入图片描述

k8s_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 192.168.111.11:5000/nginx:1.13
      ports:
        - 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: test
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 192.168.111.11:5000/nginx:1.13
      ports:
        - containerPort: 80
    - name: busybox
      image: 192.168.111.11:5000/busybox:latest
      command: ["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个pod
  selector:    #标签选择器,根据pod标签识别,哪些pod是我的,如果多了,我就要干掉年轻的
    app: myweb
  template:    #给pod定义模板,便于创建pod
    metadata:    #从改行以下就是pod配置文件一致的,多个pod不能设置一样的name,随机生产
      labels:    #标签,与rc标签选择器一致,否侧该pod不属于rc
        app: myweb
    spec:
      containers:
      - name: myweb
        image: 192.168.111.11:5000/nginx:1.13
        ports:
        - 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 port
  selector:             #标签选择器:关联pod
    app: 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: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 192.168.111.11:5000/nginx:1.13
        ports:
        - containerPort: 80
        resources:    #资源,该配置可加可不加
          limits:        #最多能使用多少
            cpu: 100m
          requests:        #这个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: 3000
      targetPort: 80
  selector:
    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: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: 192.168.111.11:5000/mysql:5.7
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: '123456'

在创建mysql-svc.yaml文件,为pod添加一个clusterIP关联pod

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:        #详细下面没有指定类型,默认就是clusterIP类型
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    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: 1
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
        - name: myweb
          image: 192.168.111.11:5000/tomcat-app:v2
          ports:
          - containerPort: 8080
          env:
          - name: MYSQL_SERVICE_HOST
            value: 'mysql'            #该值要添加mysql的svc的clusterIP地址,可以查看,在添加
          - name: MYSQL_SERVICE_PORT
            value: '3306'

创建tomcat-svc.yaml文件,为pod添加一个clusterIP关联pod

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30008
  selector:
    app: myweb

创建完成,查看状态
在这里插入图片描述

浏览器访问nodeip地址http://192.168.111.12:30008/
在这里插入图片描述

在访问一下http://192.168.111.12:30008/demo/
这是要连接数据库的,也可以提交数据
在这里插入图片描述

点击啊上图的Add,添加名字和等级,随意添加然后提交即可
在这里插入图片描述

信息添加到数据库成功
在这里插入图片描述

去系统数据库中查看提交的数据,进数据库中的操作命令和docker命令几乎一样
在这里插入图片描述

可以看到数据库中的数据和提交的一样
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐