侧边栏壁纸
  • 累计撰写 28 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

K8s 入门与配置2

zhanjie.me
2020-11-02 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

2.1 构建并启动 MySQL 服务

构建并启动 MySQL 服务

新建 mysql-rc.yaml 文件,并写入如下内容:

apiVersion: v1 # 这是稳定长期使用的 API 版本
kind: ReplicationController # 副本控制器 RC
metadata: # 元数据
  name: mysql # 定义这个 rc 的名称为 mysql,它具有全局唯一性
spec: # 规范
  replicas: 1 # pod 副本的期待数量,这里为 1,表示当环境中没有符合条件要求的 pod 数量时需要创建一个,如果符合要求的 pod 数量大于一个就要删除多余的 pod,始终要保持环境中只有一个 pod 符合要求。
  selector: # 标签选择器
    app: mysql # 符合要求的 pod 都必须要有这个标签 app:mysql
  template: # 创建 pod 副本的模板
    metadata: # 创建的 pod 副本拥有的元数据
      labels: # 创建的 pod 副本的标签
        app: mysql # 对应 RC 的标签选择器,保证创建的 pod 副本符合 RC 的选择器范围
    spec: # 定义 pod 副本中运行的容器的详细信息
      containers: # 容器信息
        - name: mysql # 容器的名字
          image: mysql:5.7 # 容器中运行的镜像
          ports: # 容器对外暴露的端口
            - containerPort: 3306 # 容器的端口 3306
          env: # 容器中的环境变量
            - name: MYSQL_ROOT_PASSWORD # 设置环境变量 MYSQL_ROOT_PASSWORD="123456"
              value: "123456"

上面展示了一个基本的 YAML 文件编写的格式以及必备的 4 个属性:apiVersion(API 版本)kind(资源类型)metadata(元数据)spec(规范)ReplicationController(简写为:rc) 资源对象的主要作用是可以创建或是删除 Pod 来保证运行中的 Pod 数量符合 YAML 文件中期待的要求。

在定义好 mysql-rc.yaml 文件之后,使用 Kubernetes 自带的客户端命令行工具 kubectl,可以直接操作 Kubernetes 集群,首先我们创建资源,在终端执行如下命令:

$ kubectl create -f mysql-rc.yaml

根据执行命令后的输出可以看到已经成功创建名为 mysql 的 replicationcontroller。

$ kubectl get rc
replicationcontroller/mysql created

创建好资源后,查看已经创建的 ReplicationController 资源对象,在命令中可以将其简写为 rc:

$ kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
mysql   1         1         1       5s

在输出中,DESIRED 表示这个名为 mysql 的 rc 需要创建一个 pod 副本,CURRENT 表示当前已经创建好的 pod 副本数量,READY 表示 pod 副本已经成功运行。

然后查看环境中的 pod,在终端执行如下命令:

$ kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-7v2f8   1/1     Running   0          6m50s

可以看到使用 rc 创建的 pod 副本的名字为:mysql-随机字符,这个名字是由两部分组成的,前面部分的 mysql 和创建它的 rc 名字相同,后面的是随机生成的字符串可以用来区分由同一个 rc 创建的不同的 pod,READY 为 1/1 表示已经创建好,STATUS 为 Running 表示这个 pod 正处于运行状态。

当然,我们还可以查看上面 mysql-随机字符 pod 的具体构建过程,如果以后运行不成功,也可以通过 Events 来查看具体是哪里出了问题:

$ kubectl describe pod mysql-7v2f8
Name:         mysql-7v2f8
Namespace:    user-test
Priority:     0
Node:         kubesphere03/192.168.0.33
...
Events:
  Type    Reason     Age    From                   Message
  ----    ------     ----   ----                   -------
  Normal  Scheduled  8m22s  default-scheduler      Successfully assigned user-test/mysql-7v2f8 to kubesphere03
  Normal  Pulled     8m22s  kubelet, kubesphere03  Container image "mysql:5.7" already present on machine
  Normal  Created    8m21s  kubelet, kubesphere03  Created container mysql
  Normal  Started    8m21s  kubelet, kubesphere03  Started container mysql

在创建成功运行着 MySQL 的 pod 之后,还需要创建一个与之外应的 Service,这样才能让其它的 pod 可以访问 MySQL 应用提供的服务。Service 被创建之后,Kubernetes 会给它分配一个虚拟的 Cluster IP,并且在 Service 的整个生命周期中,这个 Cluster IP 都不会改变。

这样的好处就是,pod 可能会随时发生变化(由于某些意外情况被销毁然后重建),但是我们的 Service 始终是确定不变的,在 Kubernetes 集群内部通过服务名和暴露出来的端口就可以稳定的访问某一个服务而不需要管隐藏在服务背后的 pod 的变化。

新建 mysql-svc.yaml 文件,并向其中写入如下内容:

apiVersion: v1 # API 版本号,使用稳定版:v1
kind: Service # 资源对象类型
metadata: # 元数据
  name: mysql # Service 的名称为:mysql,这个名称具有全局唯一性
spec: # 规范
  ports: # 对外暴露出的端口
    - port: 3306 # 这里指定为 3306 端口
  selector: # 标签选择器
    app: mysql # 服务对应的 pod 是具有 app=mysql 标签的这些

和上面一样,我们在新建服务的 mysql-rc.yaml 文件之后需要执行创建:

$ kubectl create -f mysql-svc.yaml
service/mysql created

获得上面的输出就说明名为 mysql 的服务已经创建成功了。

来查看一下创建好的服务,在终端执行如下命令,其中 svc 是 services 的简写:

$ kubectl get svc
NAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
mysql   ClusterIP   10.96.78.12   <none>        3306/TCP   69s

可以看到名为 mysql 的服务是我们刚刚创建的,集群自动为它分配了一个 ClusterIP,它的 3306 端口也是前面在 mysql-rc.yaml 文件中已经定义好了的。

还可以执行如下命令查看 mysql 服务更加详细的信息:

$ kubectl describe svc mysql
Name:              mysql
Namespace:         user-test
Labels:            <none>
Annotations:       <none>
Selector:          app=mysql
Type:              ClusterIP
IP:                10.96.78.12
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         10.20.177.100:3306
Session Affinity:  None
Events:            <none>

2.2 构建并启动 Tomcat 服务

新建 myweb-rc.yaml 文件并向其中写入如下内容:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb # rc 的名称为 myweb
spec:
  replicas: 1 # 只需要创建一个 pod 副本
  selector:
    app: myweb # 选择那些具有 app=myweb 标签的 pod
  template:
    metadata:
      labels:
        app: myweb # 创建的 pod 副本拥有的标签为 app=myweb
    spec:
      containers:
        - name: myweb # 容器名为 myweb
          image: kubeguide/tomcat-app:v1
          ports:
            - containerPort: 8080 # 容器暴露出来的端口为 8080 端口
          env: # 环境变量
            - name: MYSQL_SERVICE_HOST # 在容器中使用环境变量的值 MYSQL_SERVICE_HOST=mysql 来连接服务
              value: "mysql"
            - name: MYSQL_SERVICE_PORT # 通过环境变量指定服务的端口
              value: "3306"

然后使用 kubectl create 命令执行创建 rc:

$ kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created

看到上面的输出就表明已经成功创建 rc。现在来看看对应的 pod 是否创建成功:

$ kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
mysql-7v2f8   1/1     Running   0          18m
myweb-xwgcc   1/1     Running   0          80s

如果上述输出的 STATUS 的状态为:ContainerCreating 表示正在创建中,可以稍等一会儿再执行命令查看就会变为 Running。
同样的方式,也可以查看 pod 具体的创建过程,当我们遇到 pod 创建不成功的时候可以从 Events 中找到一些信息:

$ kubectl describe pod myweb-xwgcc
Name:         myweb-xwgcc
Namespace:    user-test
Priority:     0
Node:         kubesphere03/192.168.0.33
...
Events:
  Type    Reason     Age   From                   Message
  ----    ------     ----  ----                   -------
  Normal  Scheduled  2m7s  default-scheduler      Successfully assigned user-test/myweb-xwgcc to kubesphere03
  Normal  Pulled     2m6s  kubelet, kubesphere03  Container image "kubeguide/tomcat-app:v1" already present on machine
  Normal  Created    2m6s  kubelet, kubesphere03  Created container myweb
  Normal  Started    2m6s  kubelet, kubesphere03  Started container myweb

现在来创建 myweb 对应的 Service。需要注意的是,一方面 myweb 服务需要和 MySQL 服务进行通信,这里我们可以通过服务指定开放 8080 端口进行通信。另一方面,通过外部的网络也需要能够访问 myweb 服务才可以,而创建的 service 对应的 ClusterIP 是虚拟的只能用于集群内部,外部网络是无法使用的。在这里,可以考虑使用节点的 IP 地址作为固定 IP 进行-访问,因为节点的 IP 地址是固定不会变化且真实存在的。

新建 myweb-svc.yaml 文件并写入如下内容:

apiVersion: v1
kind: Service
metadata:
  name: myweb # 服务的名称为 myweb
spec:
  type: NodePort # 这里使用 NodePort 开启外网访问模式
  ports:
    - port: 8080 # myweb 服务在集群内部开放了 8080 端口用于连接
      nodePort: 30001 # 对于外网连接,开放了节点的 30001 端口
  selector:
    app: myweb # myweb 服务包含的是具有 app=myweb 标签的 pod

执行创建服务:

$ kubectl create -f myweb-svc.yaml
service/myweb created

获取集群中现在所拥有的全部服务:

$ kubectl get svc
NAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
mysql   ClusterIP   10.96.78.12   <none>        3306/TCP         9m34s
myweb   NodePort    10.96.95.32   <none>        8080:30001/TCP   24s

根据输出可以发现,myweb 服务的类型是 NodePort,它在集群内部的虚拟 IP 为:10.107.104.225,在集群内部暴露的是 8080 端口,而对于外网访问是暴露的各个节点的 30001 端口。

查看 myweb 服务的详细信息:

$ kubectl describe svc myweb
Name:                     myweb
Namespace:                user-test
Labels:                   <none>
Annotations:              <none>
Selector:                 app=myweb
Type:                     NodePort
IP:                       10.96.95.32
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30001/TCP
Endpoints:                10.20.177.101:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

执行到这里,我们就已经成功的构建了 MySQL 服务和 myweb 服务。

在我的集群环境中,一个master节点和两个node节点对应的IP如下:

192.168.0.31    kubesphere01
192.168.0.32    kubesphere02
192.168.0.33    kubesphere03

通过任一节点IP皆可访问

image-xprgmwwo.png

点击 Add 按钮进行添加:

image-yelmsjhs.png

image-nhcajhey.png

可以看到我们添加的数据已经成功更新到表单中了:

image-bjwyigvz.png

2.3 清除环境

在运行了服务之后,如果我们想要清除服务应该怎么办呢?前面我们已经知道使用 ReplicationController 可以保证集群中一直有稳定数量的 pod 在运行,所以肯定不能直接手动删除 pod,否则删除之后 ReplicationController 检测到 pod 数量减少又会自动创建 pod。所以,清除服务就应该是删除掉对应的 ReplicationController 和 Service,这样对应的 pod 也会自动被删除掉。

首先查看集群中有哪些 ReplicationController 和 Service:

$ kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
mysql   1         1         1       36m
myweb   1         1         1       19m
$ kubectl get svc
NAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
mysql   ClusterIP   10.96.78.12   <none>        3306/TCP         23m
myweb   NodePort    10.96.95.32   <none>        8080:30001/TCP   14m

找到对应的名称以后,执行删除操作:

$ kubectl delete rc mysql myweb
replicationcontroller "mysql" deleted
replicationcontroller "myweb" deleted
$ kubectl delete svc mysql myweb
service "mysql" deleted
service "myweb" deleted

最后验证集群中是否还存在对应的 pod:

$ kubectl get pods
No resources found.

如果显示为 No resource found.,即代表所有的 pod 都已经被删除掉了。

0

评论区