0
点赞
收藏
分享

微信扫一扫

k8s 搭建好第一个简单实例

guanguans 2022-02-12 阅读 62

本人搭建环境初期使用的是该地址:
可点击此处
安装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连接请求。

待续…

举报

相关推荐

0 条评论