3.k8s常用的资源

3.1 创建pod资源

k8s yaml的主要组成

apiVersion: v1  api版本
kind: pod   资源类型
metadata:   属性
spec:       详细
  • 1.
  • 2.
  • 3.
  • 4.

上传nginx镜像文件,并且上传私有仓库里面
03.k8s常用的资源_k8s

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

指定文件创建pod

#指定文件创建pod
kubectl create -f k8s_pod.yaml
#查看pod类型的nginx服务运行状态
kubectl get pod nginx -o wide
#pod类型的nginx服务的详细信息
kubectl describe pod nginx
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

可以看到nodeIP地址和一个容器IP地址,从本地私有仓库pull的镜像文件
03.k8s常用的资源_Nginx_02

nginx详细信息
03.k8s常用的资源_k8s_03

下图可以看到容器ID与上图nginx服务信息显示一致,创建并启动容器
注释:启动一个pod下图会起两个容器,
03.k8s常用的资源_yaml实例_04

下图可以看到pod容器有IP地址,nginx容器没有IP地址

docker inspect 8405c6ebc78a |tail -20
  • 1.

03.k8s常用的资源_Nginx_05

nginx容器详细信息

docker inspect 731c1535d85e |tail -20
  • 1.

03.k8s常用的资源_yaml实例_06

nginx没有IP地址,是因为网络类型为Container:一个容器与另一个运行中的容器共享网络,也就是nginx容器共享pod容器网络;
注释:使用pod也就是为了实现k8s的核心功能,单单考简单的容器无法实现k8s核心功能。
03.k8s常用的资源_Nginx_07

一个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"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

创建一个pod两个业务容器
03.k8s常用的资源_k8s_08

在192.168.111.13的宿主机上可以看到3个容器,两个业务容器公用pod容器网络,也就是3个容器使用一个IP地址;
业务容器端口分配方式:端口谁先占谁先得。
03.k8s常用的资源_k8s_09

pod是k8s最小的资源单位

3.2 ReplicationController资源

rc:保证指定数量的pod始终存活,rc通过标签选择器(selector)来关联pod
rc即:ReplicationController:副本控制器:功能就是起多个相同的pod,而且保证pod数量,多了就删除,少了就增加
03.k8s常用的资源_k8s_10

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

创建一个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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

查看同一瞬间起一个rc和5个pod,并且分配宿主机均衡,
rc的名字为nginx,5个pod都是根据rc的名字后面接随机组成的名字
03.k8s常用的资源_Nginx_11

测试删除一个pod,rc会自动有创建出一个pod
03.k8s常用的资源_Nginx_12

测试删除一个node192.168.111.13节点,rc会将pod转移到12上自动创建pod,始终保持5个pod,就是这么倔
03.k8s常用的资源_yaml实例_13

将删除的node节点添加回来,在支节点node13上重启服务

systemctl restart kubelet.service
  • 1.

master节点11会自动纳管node13
03.k8s常用的资源_k8s_14

标签选择器作用测试,始终保持5个pod
注释:rc创建5个pod的标签是myweb;则单独一个pod:nginx的标签为web
03.k8s常用的资源_yaml实例_15

手动编辑nginx的标签,与rc标签一致
03.k8s常用的资源_yaml实例_16

上下对比查看,rc保持5个pod,优先删除年龄小的3s的pod,删除一个资历浅的
03.k8s常用的资源_k8s_17

rc的滚动升级
查看当前nginx版本为nginx.1.13
03.k8s常用的资源_Nginx_18

拷贝rc配置文件
03.k8s常用的资源_Nginx_19

新建一个k8s_rc2.yaml并且编辑内容,进行与之前的进行对比
03.k8s常用的资源_k8s_20

升级

#rolling-update:滚动升级
#nginx:表示rc的名字为nginx
#--update-period:表示更新周期,我这里设置了10s升级一次
kubectl rolling-update nginx -f k8s_rc2.yaml --update-period=10s
  • 1.
  • 2.
  • 3.
  • 4.

如下图所示:首先会创建一个nginx2的rc升级pod从0到5,降级nginx的rc从5到0,最后nginx2升级成功,删除旧得rc的nginx
03.k8s常用的资源_Nginx_21

同时查看pod之间间隔时间为10s,并且每个pod的名字为nginx2****
03.k8s常用的资源_yaml实例_22

在查看nginx的版本为nginx1.15,升级成功
03.k8s常用的资源_k8s_23

回滚,就是将升级的步骤反过就可以,指定旧版本的yaml文件即可

kubectl rolling-update nginx2 -f k8s_rc.yaml --update-period=1s
  • 1.

回滚完成
03.k8s常用的资源_k8s_24

回滚时间
03.k8s常用的资源_Nginx_25

查看nginx版本为1.13,回滚成功

3.3 service资源

service帮助pod暴露端口
cluster实现负载均衡的功能(轮询,rr策略),如果pod存活,cluster会自动将pod加入到vip里面;
每个nodeip端口都会映射到VIP上面
03.k8s常用的资源_k8s_26

创建一个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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

创建svc

kubectl create -f nginx_svc.yaml
  • 1.

可以看到标签、端口映射、VIP
03.k8s常用的资源_Nginx_27

关联的pod
03.k8s常用的资源_Nginx_28

浏览器访问node节点IP地址加30000端口即可,出现nginx
03.k8s常用的资源_Nginx_29

修改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(四层负载均衡)
  • 1.
  • 2.
  • 3.
  • 4.

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

创建deploy.yaml文件,rs的标签:app=nginx,pod-template-hash=642398064与rc的标签不一样
deployment,先启动一个rs资源,rs控制pod的数量;
rs 90%的功能和rc一样,甚至比rc更强;

03.k8s常用的资源_yaml实例_30

在根据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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

创建svc与rs一致的标签,node端口3000,curl node的IP:3000请求信息为200状态码
03.k8s常用的资源_Nginx_31

deployment升级和回滚
编辑修改deployment配置文件,进行升级NG

kubectl edit deployment
  • 1.

由原来的nginx:1.13改为nginx:1.15,保存即可
03.k8s常用的资源_yaml实例_32

会重新启一个rs,nginx版本为15,又新启动3个pod,访问NG服务版本为15
03.k8s常用的资源_yaml实例_33

回滚历史版本
查看历史版本

kubectl rollout history deployment
  • 1.

03.k8s常用的资源_yaml实例_34

回滚上一个版本,可以看到NG版本回到了13版本

kubectl rollout undo deployment
  • 1.

03.k8s常用的资源_yaml实例_35

由原来的1版本变成了3版本
03.k8s常用的资源_yaml实例_36

回滚到指定的版本

kubectl rollout undo deployment --to-revision=2
  • 1.

03.k8s常用的资源_yaml实例_37

历史版本查看,有一点不好的地方就是change一直为空,不美观
03.k8s常用的资源_yaml实例_38

命令行创建deployment

#--record:表示记录历史变化
kubectl run nginx  --image=192.168.111.11:5000/nginx:1.13 --replicas=3 --record
  • 1.
  • 2.

03.k8s常用的资源_yaml实例_39

历史变化会记录
03.k8s常用的资源_yaml实例_40

命令行升级到指定的版本

kubectl set image deploy nginx nginx=192.168.111.11:5000/nginx:1.15
  • 1.

03.k8s常用的资源_yaml实例_41

上面的nginx=192.168.111.11:5000/nginx:1.15;就是指定容器的名字nginx
因为一个pod里面可能存在多个业务的容器,每个容器的业务版本也不一致,使用的镜像也不一致,所以要指定容器
03.k8s常用的资源_yaml实例_42

举例子说明
03.k8s常用的资源_yaml实例_43

常用操作命令如下:

#命令行升级版本
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

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'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

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

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:        #详细下面没有指定类型,默认就是clusterIP类型
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

创建mysql-svc.yaml之后过去clusterIP,然后将该IP地址添加到tomcat-rc.yaml配置文件中,让pod通过VIP地址找mysql数据库
03.k8s常用的资源_yaml实例_44

创建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'
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

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

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30008
  selector:
    app: myweb
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

创建完成,查看状态
03.k8s常用的资源_Nginx_45

浏览器访问nodeip地址http://192.168.111.12:30008/
03.k8s常用的资源_yaml实例_46

在访问一下http://192.168.111.12:30008/demo/
这是要连接数据库的,也可以提交数据
03.k8s常用的资源_Nginx_47

点击啊上图的Add,添加名字和等级,随意添加然后提交即可
03.k8s常用的资源_yaml实例_48

信息添加到数据库成功
03.k8s常用的资源_Nginx_49

去系统数据库中查看提交的数据,进数据库中的操作命令和docker命令几乎一样
03.k8s常用的资源_Nginx_50

可以看到数据库中的数据和提交的一样
03.k8s常用的资源_yaml实例_51