• K8S(四):通过yaml 文件编排一个web-MySQL小项目


    𝑰’𝒎 𝒉𝒉𝒈, 𝑰 𝒂𝒎 𝒂 𝒈𝒓𝒂𝒅𝒖𝒂𝒕𝒆 𝒔𝒕𝒖𝒅𝒆𝒏𝒕 𝒇𝒓𝒐𝒎 𝑵𝒂𝒏𝒋𝒊𝒏𝒈, 𝑪𝒉𝒊𝒏𝒂.

    • 🏫 𝑺𝒉𝒄𝒐𝒐𝒍: 𝑯𝒐𝒉𝒂𝒊 𝑼𝒏𝒊𝒗𝒆𝒓𝒔𝒊𝒕𝒚
    • 🌱 𝑳𝒆𝒂𝒓𝒏𝒊𝒏𝒈: 𝑰’𝒎 𝒄𝒖𝒓𝒓𝒆𝒏𝒕𝒍𝒚 𝒍𝒆𝒂𝒓𝒏𝒊𝒏𝒈 𝒅𝒆𝒔𝒊𝒈𝒏 𝒑𝒂𝒕𝒕𝒆𝒓𝒏, 𝑳𝒆𝒆𝒕𝒄𝒐𝒅𝒆, 𝒅𝒊𝒔𝒕𝒓𝒊𝒃𝒖𝒕𝒆𝒅 𝒔𝒚𝒔𝒕𝒆𝒎, 𝒎𝒊𝒅𝒅𝒍𝒆𝒘𝒂𝒓𝒆 𝒂𝒏𝒅 𝒔𝒐 𝒐𝒏.
    • 💓 𝑯𝒐𝒘 𝒕𝒐 𝒓𝒆𝒂𝒄𝒉 𝒎𝒆:𝑽𝑿
    • 📚 𝑴𝒚 𝒃𝒍𝒐𝒈: 𝒉𝒕𝒕𝒑𝒔://𝒉𝒉𝒈𝒚𝒚𝒅𝒔.𝒃𝒍𝒐𝒈.𝒄𝒔𝒅𝒏.𝒏𝒆𝒕/
    • 💼 𝑷𝒓𝒐𝒇𝒆𝒔𝒔𝒊𝒐𝒏𝒂𝒍 𝒔𝒌𝒊𝒍𝒍𝒔:𝒎𝒚 𝒅𝒓𝒆𝒂𝒎

    1-1:mysql-rc.yaml

    RC(ReplicationController)是Kubernetes系统中的核心概念之一,简单来说,它其实定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,所以RC的定义包括如下几个部分。
    ◎ Pod期待的副本数量。
    ◎ 用于筛选目标Pod的Label Selector。
    ◎ 当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板(template)。

    首先先编排一个关于mysql的RC(ReplicationController)yaml文件。

    apiVersion: v1
    kind: ReplicationController             # 类型是副本控制器
    metadata:                               
      name: mysql                           # RC的名称全局是唯一的,这里name是mysql
    spec:
      replicas: 1                           # 副本数量1
      selector:                             # RC管理 拥有label={app:mysql}这个标签的 pod
        app: mysql
      template:                             # template代表下面开始定义一个pod
        metadata:
          labels:
            app: mysql                      # 这个pod拥有{app:mysql}这样一个标签
        spec:                               
          containers:                       # pod中的容器定义部分
          - name: mysql 
            image: 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

    以上YAML定义文件中

    • kind属性用来表明此资源对象的类型,比如这里的值为ReplicationController,表示这是一个RC
    • spec一节中是RC的相关属性定义,比如spec.selector是RC的Pod标签选择器,即监控和管理拥有这些标签的Pod实例,确保在当前集群中始终有且仅有replicas个Pod实例在运行,这里设置replicas=1,表示只能运行一个MySQL Pod实例。
    • 当在集群中运行的Pod数量少于replicas时,RC会根据在spec.template一节中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,需要特别注意的是:这里的labels必须匹配之前的spec.selector,否则此RC每创建一个无法匹配Label的Pod,就会不停地尝试创建新的Pod,陷入恶性循环中。

    将RC发布到k8s集群里面去

    kubectl create -f myweb-rc.yaml
    
    [root@k8s-master ~]# kubectl get pod,rc
    NAME              READY   STATUS    RESTARTS   AGE
    pod/mysql-lbrf7   1/1     Running   0          3h58m
    pod/myweb-2ksdd   1/1     Running   0          4h17m
    pod/myweb-9h9k7   1/1     Running   0          4h17m
    pod/myweb-d25bx   1/1     Running   0          4h17m
    pod/myweb-fd9ts   1/1     Running   0          4h17m
    pod/myweb-mj2fg   1/1     Running   0          4h17m
    
    NAME                          DESIRED   CURRENT   READY   AGE
    replicationcontroller/mysql   1         1         1       4h26m
    replicationcontroller/myweb   5         5         5       4h17m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1-2:mysql-svc.yaml

    apiVersion: v1
    kind: Service              # 类型是service
    metadata:                  
      name: mysql              # 这个service的全局唯一名称
    spec:
      ports:
        - port: 3306           # service提供服务的端口号
      selector:
        app: mysql             # 把拥有{app:label}这个标签的pod应用到这个服务里面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    光有RC是不行的,RC不会提供服务的,需要一个Service。将它应用到集群里面去。

    kubectl create -f mysql-svc.yaml
    
    
    [root@k8s-master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          13d
    mysql        ClusterIP   10.106.208.18   <none>        3306/TCP         4h40m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    以发现,MySQL服务被分配了一个值为10.106.208.18的Cluster IP地址。随后,Kubernetes集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号3306来连接和访问它了。但是要注意,外部是无法去访问这个Mysql的,3306只是对其他pod开放的端口号。回忆一下,之前的pod,node架构图就知道了。

    通常,Cluster IP是在Service创建后由Kubernetes系统自动分配的,其他Pod无法预先知道某个Service的Cluster IP地址,因此需要一个服务发现机制来找到这个服务。为此,最初时,Kubernetes巧妙地使用了Linux环境变量(Environment Variable)来解决这个问题,后面会详细说明其机制。现在只需知道,根据Service的唯一名称,容器可以从环境变量中获取Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求。这个地方挺像Nacos里面一样的,只要应用名称就可以自动访问到。不用配置什么具体的ip什么的。

    1-3:启动一个tomcat

    这个tomcat是书里面特定的,所以说我们要先去拉取一下这个镜像,这个镜像是作者已经制定好了的。

    docker pull kubeguide/tomcat-app:v1
    
    • 1
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: myweb
    spec:
      replicas: 5
      selector:
        app: myweb
      template:
        metadata:
          labels:
            app: myweb
        spec:
          containers:
          - name: myweb
            image: kubeguide/tomcat-app:v1
            ports:
            - containerPort: 8080
            env:
            - name: MYSQL_SERVICE_HOST
              value: 'mysql'
            - 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
    apiVersion: v1
    kind: Service
    metadata:
      name: myweb
    spec:
      type: NodePort
      ports:
        - port: 8080
          nodePort: 30001  # 对外暴露端口,使得k8s之外的人可以访问到这个服务
      selector:
        app: myweb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    type=NodePort和nodePort=30001的两个属性表明此Service开启了NodePort方式的外网访问模式。在Kubernetes集群之外,比如在本机的浏览器里,可以通过30001这个端口访问myweb(对应到8080的虚端口上)。

    1-4:通过浏览器访问

    http://192.168.88.130:30001/demo/ ip填你的node的地址

    在这里插入图片描述

    1-5:参考文献

    K8S权威指南

  • 相关阅读:
    骨传导耳机有害处吗、骨传导耳机真的不好用吗?
    【综合评价分析】topsis评价 原理+完整MATLAB代码+详细注释+操作实列
    光伏并网逆变器低电压穿越技术研究(Simulink仿真)
    初识《时间复杂度和空间复杂度》
    前端Vue2项目搭建过程
    智能无人驿站系统小程序
    41.企业实战项目rsync + inotify + shell脚本 实现实时同步
    Docker没有vim如何安装,apt-get update报ERR404解决方案
    RK3399平台开发系列讲解(I/O篇)Linux最大文件数的限制机制
    什么是作业指导书sop?sop作业指导书是什么意思?
  • 原文地址:https://blog.csdn.net/qq_41376740/article/details/126177597