Kubernetes 搭建好第一个简单实例

本人搭建环境初期使用的是该地址:
可点击此处
安装k8s集群环境

后续再讲安装步骤

  1. 启动MySQL服务
    首先为MySQL服务创建一个Deployment 定义文件mysql-deploy.yaml,下面给出该文件的对象:
apiVersion: apps/v1  # api版本
kind: Deployment     # 副本控制器Deployment
metadata: 
  labels:            # 标签
     app: mysql
  name: mysql     # 对象名称,全局唯一
spec:
  replicas: 1      #  预期的副本数量
  selector:
     matchLabels:
        app: mysql
  template:        # Pod模版
      metadata:
        labels:
            app: mysql
      spec:
        containers:    #定义容器
        - image: mysql:5.7
          name: mysql
          ports:
          - containerPort: 3306       #容器应用监听的端口号
          env:                        #注入容器内的环境变量
          - name: MYSQL_ROOT_PASSWORD
            value: "123456"

以上yaml 定义文件中的kind 属性用来表明此资源对象的类型,比如这里的属性值表示这是一个Deploment, spec 部分是Deployment的相关属性定义,比如spec.selector 是Deployment 的Pod选择器,符合条件的Pod实例受到该Deployment 的管理,确保在当前集群中始终有且仅有replicas 个 Pod实例在运行【这里设置replicas = 1 ,表示只能运行一个MySQL Pod 实例】,当在集群中运行的Pod 数量少于replicas 时,Deployment控制器会根据在spec.template 部分定义的Pod 模版生成一个新的Pod 实例,spec.template.metadata.labels 指定了该Pod 的标签,labels 必须匹配之前的spec.selector,

创建好mysql-deployment.yaml 文件后,为了将它发布到Kubernetes 集群中,我们在master上运行如下命令:

[root@k8s-master ~]# kubectl apply -f mysql-deploy.yaml 
deployment.apps/mysql created

接下来,运行kubectl命令查看刚刚创建的Deployment:

[root@k8s-master ~]# kubectl get pods
NAME                                READY   STATUS              RESTARTS      AGE
mysql-9b877f47-hgnkt                0/1     ContainerCreating   0             8s

查看Pod的创建情况时,可以运行下面的命令:

[root@k8s-master ~]# kubectl get pods
NAME                                READY   STATUS    RESTARTS      AGE
mysql-9b877f47-hgnkt                1/1     Running   0             60s

可以看到一个名称为mysql-9b877f47-hgnkt 的Pod实例,这是Kubernetes 根据mysql 这个Deployment 的定义自动创建的Pod,由于的调度和创建需要花费一定的时间,比如需要确定调度到哪个节点上,而且下载Pod所需的容器镜像也需要一段时间,所有一开始Pod的状态为Pending,在Pod成功创建启动完成后,其状态最终会更新为Running.

我们可以在Kubernetes 节点的服务器上通过docker ps 指定查看正在运行的容器,发现提供MySQL服务的Pod容器已创建且正常运行,并且MySQL Pod 对应的容器多创建了一个Pause容器,该容器就是Pod的根容器
可以使用 describe 命令查看该pod 在哪个节点上

[root@k8s-master ~]# kubectl  describe pod mysql-9b877f47-hgnkt
Name:         mysql-9b877f47-hgnkt
Namespace:    default
Priority:     0
Node:         xxxxxxxx. 【此处就是该节点服务区】
...

到指定的节点服务器上运行

[root@k8s-node-2 ~]# docker ps | grep mysql
7b2899ac442f   mysql                                               "docker-entrypoint.s…"   About a minute ago   Up About a minute             k8s_mysql_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
20f23ff1f28a   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 minutes ago        Up 2 minutes                  k8s_POD_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0

最后,创建一个与之关联的Kubernetes Service-----MySQL 的定义文件【文件名为mysql-svc.yaml】 ,完整的对象:

apiVersion: v1
kind: Service。     #表明是Kubernetes Service
metadata:
  name: mysql       #Service 的全局唯一名称
spec:
  ports:
    - port: 3306     # Service 提供服务的端口号
  selector:          # Service 对应的Pod 拥有这里定义的标签
     app: mysql

其中,metadata.name 是Service 的服务名【serviceName】 ,spec.ports 属性定义了Service的虚端口,spec.selector 确定了哪些Pod 副本【实例】对应本服务,类似地,我们通过kubectl create命令创建Service对象:

[root@k8s-master ~]# kubectl create -f mysql-svc.yaml 
service/mysql created

运行kubectl get 命令,查看刚刚创建的Service 对象:

[root@k8s-master ~]# kubectl get svc mysql
NAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
mysql   ClusterIP   10.1.214.99   <none>        3306/TCP   12s

可以发现,MySQL 服务被分配了一个值为10.1.214.99 的ClusterIP 地址【在不同环境中分配的IP地址可能不同】,随后,在Kuberetes 集群中新创建的其他Pod就可以通过Service 的ClusterIP+端口3306 来连接和访问它了。

通常,CLusterIP 地址是在Service 创建后由Kubernetes系统自动分配的,其他Pod 无法预先知道某个Service 的ClusterIP 地址,因此需要一个服务发现机制来找到这个服务。为此Kubernetes 最初巧妙地使用了Linux 环境变量来解决这个问题,根据Service 的唯一名称,容器可以从环境变量中获取Service 对应的ClusterIP 地址和端口号,从而发起TCP/IP连接请求。

2.启动Toncat 应用
创建对应的myweb-deploy.yaml,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
   labels:
      app: myweb
   name: myweb
spec:
   replicas: 2
   selector:
       matchLabels:
          app: myweb
   template:
      metadata:
        labels:
          app: myweb
      spec:
        containers:
        - image: kubeguide/tomcat-app:v1
          name: myweb
          ports:
          - containerPort: 8080
          env:
          - name: MYSQL_SERVICE_HOST
            value: 10.1.214.99

注意:tomcat 容器内,应用将使用环境变量MYSQL_SERVICE_HOST 的值连接MySQL服务,但是这里为什么没有注册该环境变量呢? 这是因为kubernetes 会自动将已存在的Service对象以环境变量的形式展现在新生成的Pod中,其更安全,可靠的方法是使用服务的名称mysql,这就要求集群内的DNS服务【kube-dns】正常运行,运行如下命令:

[root@k8s-master ~]# kubectl apply -f myweb-deploy.yaml 
deployment.apps/myweb created
[root@k8s-master ~]# kubectl get pods
NAME                                READY   STATUS    RESTARTS      AGE
mysql-9b877f47-hgnkt                1/1     Running   0             85m
myweb-6c96767c98-l94zd              1/1     Running   0             14m
myweb-6c96767c98-pq5jn              1/1     Running   0             14m

最后,创建对应的Service ,以下是【myweb-svc.yaml】

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

“type:NodePort” 和 “nodePort:30001” 表明此Service 开启了NodePort 格式的外网访问模式,比如,在Kubernetes集群外,客户端的浏览器可以通过30001 端口访问myweb【对应8080的虚端口】,运行kubectl create 命令进行创建:

[root@k8s-master ~]# kubectl create -f myweb-svc.yaml 
service/myweb created
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP          20d
mysql        ClusterIP   10.1.214.99    <none>        3306/TCP         68m
myweb        NodePort    10.1.204.189   <none>        8080:30001/TCP   8s

至此第一个案例已完成

  1. 浏览器访问网页
    点击案例
    可访问如下网页,点击添加可加入数据到mysql 中
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

进入到mysql pod 对象的node 服务器上 可查看mysql数据信息;

[root@k8s-node-2 ~]# docker ps | grep mysql
7b2899ac442f   mysql                                               "docker-entrypoint.s…"   2 hours ago      Up 2 hours                k8s_mysql_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
20f23ff1f28a   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 2 hours ago      Up 2 hours                k8s_POD_mysql-9b877f47-hgnkt_default_84079152-b9c5-482c-929f-ccdf32bd1799_0
#通过此命令进入到mysql容器中 7b2899ac442f为mysql运行id
[root@k8s-node-2 ~]# docker exec -it 7b2899ac442f /bin/bash
#进入容器后 登陆mysql 命令行
 root@mysql-9b877f47-hgnkt:/# mysql -uroot -p
#此处不做说明

这个地方编码不对【不做修改】
在这里插入图片描述
至此第一个案例演示完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝颜~岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值