Docker & K8s学习记录

Docker & K8s学习记录

下载学习代码:

https://github.com/kubeguide/K8sDefinitiveGuide-V4-Sourcecode

启动mysql RC服务

创建RC定义文件 mysql-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql   #RC名称,全局唯一
spec:
  replicas: 1   #pod副本期待数量
  selector: 
    app: mysql  # 符合目标的pod拥有此标签
  template:     # 根据此模板创建pod副本
    metadata:
      labels:
        app: mysql  #pod 副本拥有的标签,对应RC的Selector
    spec:
      containers:   #pod 内容器的定义部分
      - name: mysql  #容器的名称
        image: mysql #容器对应的Docker Image
        ports:     
        - containerPort: 3306   #容器内应用监听的端口号
        env:										#注入容器内的环境变量
        - name: MYSQL_ROOT_PASSWORD  
          value: "123456"

解析:

  • kind 属性用来表明此资源的类型。如ReplicationController 表明这是一个RC

  • spec 一节中是RC 的相关属性定义

“当在集群中运行的Pod数量少于replicas时,RC会根据在spec.template一节中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,需要特别注意的是:这里的labels必须匹配之前的spec.selector,否则此RC每创建一个无法匹配Label的Pod,就会不停地尝试创建新的Pod,陷入恶性循环中。”

摘录来自: 龚正 等. “Kubernetes权威指南:从Docker到Kubernetes实践全接触。”

roverliang@roverliangdeMac-mini study % kubectl create -f mysql-rc.yaml
replicationcontroller/mysql created

查看刚刚创建的RC

roverliang@roverliangdeMac-mini study % kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
mysql   1         1         1       2m26s

查看Pod的占用情况

roverliang@roverliangdeMac-mini study % kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-64b64df8c9-x6gzz   1/1     Running   0          17h
mysql-frrfx                       1/1     Running   0          3m35s

启动 Mysql SVC 服务

创建一个与之关联的Kubernetes Service-MySQL 的定义文件(文件名为mysql-svc.yaml)。完整的内容和解释如下:

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

运行kubectl 命令,创建 Service

roverliang@roverliangdeMac-mini study % kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.107.208.178   <none>        8080:30011/TCP   17h
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          17h
mysql            ClusterIP   10.109.89.147    <none>        3306/TCP         5m15s

MySQL服务被分配了一个值为10.109.89.147的Cluster IP地址。随后,Kubernetes集群中其他新创建的Pod就可以通过ServiceCluster IP+端口号3306来连接和访问它了。”

通常,Cluster IP是在Service创建后由Kubernetes系统自动分配的,其他Pod无法预先知道某个ServiceCluster IP地址,因此需要一个服务发现机制来找到这个服务。

为此,最初时,Kubernetes巧妙地使用了Linux环境变量(Environment Variable)来解决这个问题,后面会详细说明其机制。现在只需知道,根据Service的唯一名称,容器可以从环境变量中获取Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求。

启动Tomcat 应用

  1. 创建 myweb-rc.yaml配置文件

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. 创建 myweb-rc
roverliang@roverliangdeMac-mini study % kubectl create -f myweb-rc.yaml
replicationcontroller/myweb created
  1. 获取创建的myweb pod
# 创建中
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME                              READY   STATUS              RESTARTS   AGE
hello-minikube-64b64df8c9-x6gzz   1/1     Running             0          17h
mysql-frrfx                       1/1     Running             0          19m
myweb-49scc                       0/1     ContainerCreating   0          26s
myweb-54brv                       0/1     ContainerCreating   0          26s
myweb-9jv2z                       0/1     ContainerCreating   0          26s
myweb-jcjpz                       0/1     ContainerCreating   0          26s
myweb-t5hc6                       0/1     ContainerCreating   0          26s

# 创建完成
roverliang@roverliangdeMac-mini study % kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
hello-minikube-64b64df8c9-x6gzz   1/1     Running   0          18h
mysql-frrfx                       1/1     Running   0          25m
myweb-49scc                       1/1     Running   0          6m5s
myweb-54brv                       1/1     Running   0          6m5s
myweb-9jv2z                       1/1     Running   0          6m5s
myweb-jcjpz                       1/1     Running   0          6m5s
myweb-t5hc6                       1/1     Running   0          6m5s
  1. 创建myweb-svc 服务

创建myweb-svc.yaml

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

创建svc 服务

roverliang@roverliangdeMac-mini study % kubectl create -f myweb-svc.yaml
service/myweb created

查看Service

roverliang@roverliangdeMac-mini study % kubectl get services
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.107.208.178   <none>        8080:30011/TCP   18h
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          18h
mysql            ClusterIP   10.109.89.147    <none>        3306/TCP         43m
myweb            NodePort    10.100.49.129    <none>        8080:30001/TCP   63s

经过上面的几个步骤,我们终于成功实现了Kubernetes上第1个例子的部署搭建工作。现在一起来见证成果吧!在你的笔记本上打开浏览器,输入

http://127.0.0.1:30001/demo/

比如虚拟机IP为192.168.18.131(可以通过#ip a命令进行查询),在浏览器里输入地址http://127.0.0.1:30001/demo/后,可以看到如图1.2所示的网页界面。

posted @ 2020-08-04 17:25  roverliang  阅读(206)  评论(0编辑  收藏  举报